kankan-sdk.js 3.4 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963
  1. /**
  2. * Name: kankan-sdk.js
  3. * Date: 2024/7/19
  4. * Author: https://www.4dkankan.com
  5. * Copyright © 2024 4DAGE Co., Ltd. All rights reserved.
  6. * Licensed under the GLP license
  7. */
  8. (function (global, factory) {
  9. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('three')) :
  10. typeof define === 'function' && define.amd ? define(['three'], factory) :
  11. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.KanKan = factory(global.THREE));
  12. }(this, (function (THREE$1) { 'use strict';
  13. function _interopNamespace(e) {
  14. if (e && e.__esModule) return e;
  15. var n = Object.create(null);
  16. if (e) {
  17. Object.keys(e).forEach(function (k) {
  18. if (k !== 'default') {
  19. var d = Object.getOwnPropertyDescriptor(e, k);
  20. Object.defineProperty(n, k, d.get ? d : {
  21. enumerable: true,
  22. get: function () {
  23. return e[k];
  24. }
  25. });
  26. }
  27. });
  28. }
  29. n['default'] = e;
  30. return Object.freeze(n);
  31. }
  32. var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE$1);
  33. function _classCallCheck(instance, Constructor) {
  34. if (!(instance instanceof Constructor)) {
  35. throw new TypeError("Cannot call a class as a function");
  36. }
  37. }
  38. function _defineProperties(target, props) {
  39. for (var i = 0; i < props.length; i++) {
  40. var descriptor = props[i];
  41. descriptor.enumerable = descriptor.enumerable || false;
  42. descriptor.configurable = true;
  43. if ("value" in descriptor) descriptor.writable = true;
  44. Object.defineProperty(target, descriptor.key, descriptor);
  45. }
  46. }
  47. function _createClass(Constructor, protoProps, staticProps) {
  48. if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  49. if (staticProps) _defineProperties(Constructor, staticProps);
  50. return Constructor;
  51. }
  52. function _assertThisInitialized(self) {
  53. if (self === void 0) {
  54. throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  55. }
  56. return self;
  57. }
  58. function _setPrototypeOf(o, p) {
  59. _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
  60. o.__proto__ = p;
  61. return o;
  62. };
  63. return _setPrototypeOf(o, p);
  64. }
  65. function _inherits(subClass, superClass) {
  66. if (typeof superClass !== "function" && superClass !== null) {
  67. throw new TypeError("Super expression must either be null or a function");
  68. }
  69. subClass.prototype = Object.create(superClass && superClass.prototype, {
  70. constructor: {
  71. value: subClass,
  72. writable: true,
  73. configurable: true
  74. }
  75. });
  76. if (superClass) _setPrototypeOf(subClass, superClass);
  77. }
  78. function _typeof(obj) {
  79. "@babel/helpers - typeof";
  80. if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
  81. _typeof = function _typeof(obj) {
  82. return typeof obj;
  83. };
  84. } else {
  85. _typeof = function _typeof(obj) {
  86. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
  87. };
  88. }
  89. return _typeof(obj);
  90. }
  91. function _possibleConstructorReturn(self, call) {
  92. if (call && (_typeof(call) === "object" || typeof call === "function")) {
  93. return call;
  94. } else if (call !== void 0) {
  95. throw new TypeError("Derived constructors may only return object or undefined");
  96. }
  97. return _assertThisInitialized(self);
  98. }
  99. function _getPrototypeOf(o) {
  100. _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
  101. return o.__proto__ || Object.getPrototypeOf(o);
  102. };
  103. return _getPrototypeOf(o);
  104. }
  105. function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  106. try {
  107. var info = gen[key](arg);
  108. var value = info.value;
  109. } catch (error) {
  110. reject(error);
  111. return;
  112. }
  113. if (info.done) {
  114. resolve(value);
  115. } else {
  116. Promise.resolve(value).then(_next, _throw);
  117. }
  118. }
  119. function _asyncToGenerator(fn) {
  120. return function () {
  121. var self = this,
  122. args = arguments;
  123. return new Promise(function (resolve, reject) {
  124. var gen = fn.apply(self, args);
  125. function _next(value) {
  126. asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
  127. }
  128. function _throw(err) {
  129. asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
  130. }
  131. _next(undefined);
  132. });
  133. };
  134. }
  135. function createCommonjsModule(fn) {
  136. var module = { exports: {} };
  137. return fn(module, module.exports), module.exports;
  138. }
  139. /**
  140. * Copyright (c) 2014-present, Facebook, Inc.
  141. *
  142. * This source code is licensed under the MIT license found in the
  143. * LICENSE file in the root directory of this source tree.
  144. */
  145. var runtime_1 = createCommonjsModule(function (module) {
  146. var runtime = function (exports) {
  147. var Op = Object.prototype;
  148. var hasOwn = Op.hasOwnProperty;
  149. var undefined$1; // More compressible than void 0.
  150. var $Symbol = typeof Symbol === "function" ? Symbol : {};
  151. var iteratorSymbol = $Symbol.iterator || "@@iterator";
  152. var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  153. var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  154. function define(obj, key, value) {
  155. Object.defineProperty(obj, key, {
  156. value: value,
  157. enumerable: true,
  158. configurable: true,
  159. writable: true
  160. });
  161. return obj[key];
  162. }
  163. try {
  164. // IE 8 has a broken Object.defineProperty that only works on DOM objects.
  165. define({}, "");
  166. } catch (err) {
  167. define = function define(obj, key, value) {
  168. return obj[key] = value;
  169. };
  170. }
  171. function wrap(innerFn, outerFn, self, tryLocsList) {
  172. // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
  173. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
  174. var generator = Object.create(protoGenerator.prototype);
  175. var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,
  176. // .throw, and .return methods.
  177. generator._invoke = makeInvokeMethod(innerFn, self, context);
  178. return generator;
  179. }
  180. exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion
  181. // record like context.tryEntries[i].completion. This interface could
  182. // have been (and was previously) designed to take a closure to be
  183. // invoked without arguments, but in all the cases we care about we
  184. // already have an existing method we want to call, so there's no need
  185. // to create a new function object. We can even get away with assuming
  186. // the method takes exactly one argument, since that happens to be true
  187. // in every case, so we don't have to touch the arguments object. The
  188. // only additional allocation required is the completion record, which
  189. // has a stable shape and so hopefully should be cheap to allocate.
  190. function tryCatch(fn, obj, arg) {
  191. try {
  192. return {
  193. type: "normal",
  194. arg: fn.call(obj, arg)
  195. };
  196. } catch (err) {
  197. return {
  198. type: "throw",
  199. arg: err
  200. };
  201. }
  202. }
  203. var GenStateSuspendedStart = "suspendedStart";
  204. var GenStateSuspendedYield = "suspendedYield";
  205. var GenStateExecuting = "executing";
  206. var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as
  207. // breaking out of the dispatch switch statement.
  208. var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and
  209. // .constructor.prototype properties for functions that return Generator
  210. // objects. For full spec compliance, you may wish to configure your
  211. // minifier not to mangle the names of these two functions.
  212. function Generator() {}
  213. function GeneratorFunction() {}
  214. function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that
  215. // don't natively support it.
  216. var IteratorPrototype = {};
  217. define(IteratorPrototype, iteratorSymbol, function () {
  218. return this;
  219. });
  220. var getProto = Object.getPrototypeOf;
  221. var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  222. if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
  223. // This environment has a native %IteratorPrototype%; use it instead
  224. // of the polyfill.
  225. IteratorPrototype = NativeIteratorPrototype;
  226. }
  227. var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  228. GeneratorFunction.prototype = GeneratorFunctionPrototype;
  229. define(Gp, "constructor", GeneratorFunctionPrototype);
  230. define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);
  231. GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the
  232. // Iterator interface in terms of a single ._invoke method.
  233. function defineIteratorMethods(prototype) {
  234. ["next", "throw", "return"].forEach(function (method) {
  235. define(prototype, method, function (arg) {
  236. return this._invoke(method, arg);
  237. });
  238. });
  239. }
  240. exports.isGeneratorFunction = function (genFun) {
  241. var ctor = typeof genFun === "function" && genFun.constructor;
  242. return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can
  243. // do is to check its .name property.
  244. (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
  245. };
  246. exports.mark = function (genFun) {
  247. if (Object.setPrototypeOf) {
  248. Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
  249. } else {
  250. genFun.__proto__ = GeneratorFunctionPrototype;
  251. define(genFun, toStringTagSymbol, "GeneratorFunction");
  252. }
  253. genFun.prototype = Object.create(Gp);
  254. return genFun;
  255. }; // Within the body of any async function, `await x` is transformed to
  256. // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  257. // `hasOwn.call(value, "__await")` to determine if the yielded value is
  258. // meant to be awaited.
  259. exports.awrap = function (arg) {
  260. return {
  261. __await: arg
  262. };
  263. };
  264. function AsyncIterator(generator, PromiseImpl) {
  265. function invoke(method, arg, resolve, reject) {
  266. var record = tryCatch(generator[method], generator, arg);
  267. if (record.type === "throw") {
  268. reject(record.arg);
  269. } else {
  270. var result = record.arg;
  271. var value = result.value;
  272. if (value && typeof value === "object" && hasOwn.call(value, "__await")) {
  273. return PromiseImpl.resolve(value.__await).then(function (value) {
  274. invoke("next", value, resolve, reject);
  275. }, function (err) {
  276. invoke("throw", err, resolve, reject);
  277. });
  278. }
  279. return PromiseImpl.resolve(value).then(function (unwrapped) {
  280. // When a yielded Promise is resolved, its final value becomes
  281. // the .value of the Promise<{value,done}> result for the
  282. // current iteration.
  283. result.value = unwrapped;
  284. resolve(result);
  285. }, function (error) {
  286. // If a rejected Promise was yielded, throw the rejection back
  287. // into the async generator function so it can be handled there.
  288. return invoke("throw", error, resolve, reject);
  289. });
  290. }
  291. }
  292. var previousPromise;
  293. function enqueue(method, arg) {
  294. function callInvokeWithMethodAndArg() {
  295. return new PromiseImpl(function (resolve, reject) {
  296. invoke(method, arg, resolve, reject);
  297. });
  298. }
  299. return previousPromise = // If enqueue has been called before, then we want to wait until
  300. // all previous Promises have been resolved before calling invoke,
  301. // so that results are always delivered in the correct order. If
  302. // enqueue has not been called before, then it is important to
  303. // call invoke immediately, without waiting on a callback to fire,
  304. // so that the async generator function has the opportunity to do
  305. // any necessary setup in a predictable way. This predictability
  306. // is why the Promise constructor synchronously invokes its
  307. // executor callback, and why async functions synchronously
  308. // execute code before the first await. Since we implement simple
  309. // async functions in terms of async generators, it is especially
  310. // important to get this right, even though it requires care.
  311. previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later
  312. // invocations of the iterator.
  313. callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
  314. } // Define the unified helper method that is used to implement .next,
  315. // .throw, and .return (see defineIteratorMethods).
  316. this._invoke = enqueue;
  317. }
  318. defineIteratorMethods(AsyncIterator.prototype);
  319. define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
  320. return this;
  321. });
  322. exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
  323. // AsyncIterator objects; they just return a Promise for the value of
  324. // the final result produced by the iterator.
  325. exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
  326. if (PromiseImpl === void 0) PromiseImpl = Promise;
  327. var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
  328. return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
  329. : iter.next().then(function (result) {
  330. return result.done ? result.value : iter.next();
  331. });
  332. };
  333. function makeInvokeMethod(innerFn, self, context) {
  334. var state = GenStateSuspendedStart;
  335. return function invoke(method, arg) {
  336. if (state === GenStateExecuting) {
  337. throw new Error("Generator is already running");
  338. }
  339. if (state === GenStateCompleted) {
  340. if (method === "throw") {
  341. throw arg;
  342. } // Be forgiving, per 25.3.3.3.3 of the spec:
  343. // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
  344. return doneResult();
  345. }
  346. context.method = method;
  347. context.arg = arg;
  348. while (true) {
  349. var delegate = context.delegate;
  350. if (delegate) {
  351. var delegateResult = maybeInvokeDelegate(delegate, context);
  352. if (delegateResult) {
  353. if (delegateResult === ContinueSentinel) continue;
  354. return delegateResult;
  355. }
  356. }
  357. if (context.method === "next") {
  358. // Setting context._sent for legacy support of Babel's
  359. // function.sent implementation.
  360. context.sent = context._sent = context.arg;
  361. } else if (context.method === "throw") {
  362. if (state === GenStateSuspendedStart) {
  363. state = GenStateCompleted;
  364. throw context.arg;
  365. }
  366. context.dispatchException(context.arg);
  367. } else if (context.method === "return") {
  368. context.abrupt("return", context.arg);
  369. }
  370. state = GenStateExecuting;
  371. var record = tryCatch(innerFn, self, context);
  372. if (record.type === "normal") {
  373. // If an exception is thrown from innerFn, we leave state ===
  374. // GenStateExecuting and loop back for another invocation.
  375. state = context.done ? GenStateCompleted : GenStateSuspendedYield;
  376. if (record.arg === ContinueSentinel) {
  377. continue;
  378. }
  379. return {
  380. value: record.arg,
  381. done: context.done
  382. };
  383. } else if (record.type === "throw") {
  384. state = GenStateCompleted; // Dispatch the exception by looping back around to the
  385. // context.dispatchException(context.arg) call above.
  386. context.method = "throw";
  387. context.arg = record.arg;
  388. }
  389. }
  390. };
  391. } // Call delegate.iterator[context.method](context.arg) and handle the
  392. // result, either by returning a { value, done } result from the
  393. // delegate iterator, or by modifying context.method and context.arg,
  394. // setting context.delegate to null, and returning the ContinueSentinel.
  395. function maybeInvokeDelegate(delegate, context) {
  396. var method = delegate.iterator[context.method];
  397. if (method === undefined$1) {
  398. // A .throw or .return when the delegate iterator has no .throw
  399. // method always terminates the yield* loop.
  400. context.delegate = null;
  401. if (context.method === "throw") {
  402. // Note: ["return"] must be used for ES3 parsing compatibility.
  403. if (delegate.iterator["return"]) {
  404. // If the delegate iterator has a return method, give it a
  405. // chance to clean up.
  406. context.method = "return";
  407. context.arg = undefined$1;
  408. maybeInvokeDelegate(delegate, context);
  409. if (context.method === "throw") {
  410. // If maybeInvokeDelegate(context) changed context.method from
  411. // "return" to "throw", let that override the TypeError below.
  412. return ContinueSentinel;
  413. }
  414. }
  415. context.method = "throw";
  416. context.arg = new TypeError("The iterator does not provide a 'throw' method");
  417. }
  418. return ContinueSentinel;
  419. }
  420. var record = tryCatch(method, delegate.iterator, context.arg);
  421. if (record.type === "throw") {
  422. context.method = "throw";
  423. context.arg = record.arg;
  424. context.delegate = null;
  425. return ContinueSentinel;
  426. }
  427. var info = record.arg;
  428. if (!info) {
  429. context.method = "throw";
  430. context.arg = new TypeError("iterator result is not an object");
  431. context.delegate = null;
  432. return ContinueSentinel;
  433. }
  434. if (info.done) {
  435. // Assign the result of the finished delegate to the temporary
  436. // variable specified by delegate.resultName (see delegateYield).
  437. context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).
  438. context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the
  439. // exception, let the outer generator proceed normally. If
  440. // context.method was "next", forget context.arg since it has been
  441. // "consumed" by the delegate iterator. If context.method was
  442. // "return", allow the original .return call to continue in the
  443. // outer generator.
  444. if (context.method !== "return") {
  445. context.method = "next";
  446. context.arg = undefined$1;
  447. }
  448. } else {
  449. // Re-yield the result returned by the delegate method.
  450. return info;
  451. } // The delegate iterator is finished, so forget it and continue with
  452. // the outer generator.
  453. context.delegate = null;
  454. return ContinueSentinel;
  455. } // Define Generator.prototype.{next,throw,return} in terms of the
  456. // unified ._invoke helper method.
  457. defineIteratorMethods(Gp);
  458. define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the
  459. // @@iterator function is called on it. Some browsers' implementations of the
  460. // iterator prototype chain incorrectly implement this, causing the Generator
  461. // object to not be returned from this call. This ensures that doesn't happen.
  462. // See https://github.com/facebook/regenerator/issues/274 for more details.
  463. define(Gp, iteratorSymbol, function () {
  464. return this;
  465. });
  466. define(Gp, "toString", function () {
  467. return "[object Generator]";
  468. });
  469. function pushTryEntry(locs) {
  470. var entry = {
  471. tryLoc: locs[0]
  472. };
  473. if (1 in locs) {
  474. entry.catchLoc = locs[1];
  475. }
  476. if (2 in locs) {
  477. entry.finallyLoc = locs[2];
  478. entry.afterLoc = locs[3];
  479. }
  480. this.tryEntries.push(entry);
  481. }
  482. function resetTryEntry(entry) {
  483. var record = entry.completion || {};
  484. record.type = "normal";
  485. delete record.arg;
  486. entry.completion = record;
  487. }
  488. function Context(tryLocsList) {
  489. // The root entry object (effectively a try statement without a catch
  490. // or a finally block) gives us a place to store values thrown from
  491. // locations where there is no enclosing try statement.
  492. this.tryEntries = [{
  493. tryLoc: "root"
  494. }];
  495. tryLocsList.forEach(pushTryEntry, this);
  496. this.reset(true);
  497. }
  498. exports.keys = function (object) {
  499. var keys = [];
  500. for (var key in object) {
  501. keys.push(key);
  502. }
  503. keys.reverse(); // Rather than returning an object with a next method, we keep
  504. // things simple and return the next function itself.
  505. return function next() {
  506. while (keys.length) {
  507. var key = keys.pop();
  508. if (key in object) {
  509. next.value = key;
  510. next.done = false;
  511. return next;
  512. }
  513. } // To avoid creating an additional object, we just hang the .value
  514. // and .done properties off the next function object itself. This
  515. // also ensures that the minifier will not anonymize the function.
  516. next.done = true;
  517. return next;
  518. };
  519. };
  520. function values(iterable) {
  521. if (iterable) {
  522. var iteratorMethod = iterable[iteratorSymbol];
  523. if (iteratorMethod) {
  524. return iteratorMethod.call(iterable);
  525. }
  526. if (typeof iterable.next === "function") {
  527. return iterable;
  528. }
  529. if (!isNaN(iterable.length)) {
  530. var i = -1,
  531. next = function next() {
  532. while (++i < iterable.length) {
  533. if (hasOwn.call(iterable, i)) {
  534. next.value = iterable[i];
  535. next.done = false;
  536. return next;
  537. }
  538. }
  539. next.value = undefined$1;
  540. next.done = true;
  541. return next;
  542. };
  543. return next.next = next;
  544. }
  545. } // Return an iterator with no values.
  546. return {
  547. next: doneResult
  548. };
  549. }
  550. exports.values = values;
  551. function doneResult() {
  552. return {
  553. value: undefined$1,
  554. done: true
  555. };
  556. }
  557. Context.prototype = {
  558. constructor: Context,
  559. reset: function reset(skipTempReset) {
  560. this.prev = 0;
  561. this.next = 0; // Resetting context._sent for legacy support of Babel's
  562. // function.sent implementation.
  563. this.sent = this._sent = undefined$1;
  564. this.done = false;
  565. this.delegate = null;
  566. this.method = "next";
  567. this.arg = undefined$1;
  568. this.tryEntries.forEach(resetTryEntry);
  569. if (!skipTempReset) {
  570. for (var name in this) {
  571. // Not sure about the optimal order of these conditions:
  572. if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
  573. this[name] = undefined$1;
  574. }
  575. }
  576. }
  577. },
  578. stop: function stop() {
  579. this.done = true;
  580. var rootEntry = this.tryEntries[0];
  581. var rootRecord = rootEntry.completion;
  582. if (rootRecord.type === "throw") {
  583. throw rootRecord.arg;
  584. }
  585. return this.rval;
  586. },
  587. dispatchException: function dispatchException(exception) {
  588. if (this.done) {
  589. throw exception;
  590. }
  591. var context = this;
  592. function handle(loc, caught) {
  593. record.type = "throw";
  594. record.arg = exception;
  595. context.next = loc;
  596. if (caught) {
  597. // If the dispatched exception was caught by a catch block,
  598. // then let that catch block handle the exception normally.
  599. context.method = "next";
  600. context.arg = undefined$1;
  601. }
  602. return !!caught;
  603. }
  604. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  605. var entry = this.tryEntries[i];
  606. var record = entry.completion;
  607. if (entry.tryLoc === "root") {
  608. // Exception thrown outside of any try block that could handle
  609. // it, so set the completion value of the entire function to
  610. // throw the exception.
  611. return handle("end");
  612. }
  613. if (entry.tryLoc <= this.prev) {
  614. var hasCatch = hasOwn.call(entry, "catchLoc");
  615. var hasFinally = hasOwn.call(entry, "finallyLoc");
  616. if (hasCatch && hasFinally) {
  617. if (this.prev < entry.catchLoc) {
  618. return handle(entry.catchLoc, true);
  619. } else if (this.prev < entry.finallyLoc) {
  620. return handle(entry.finallyLoc);
  621. }
  622. } else if (hasCatch) {
  623. if (this.prev < entry.catchLoc) {
  624. return handle(entry.catchLoc, true);
  625. }
  626. } else if (hasFinally) {
  627. if (this.prev < entry.finallyLoc) {
  628. return handle(entry.finallyLoc);
  629. }
  630. } else {
  631. throw new Error("try statement without catch or finally");
  632. }
  633. }
  634. }
  635. },
  636. abrupt: function abrupt(type, arg) {
  637. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  638. var entry = this.tryEntries[i];
  639. if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
  640. var finallyEntry = entry;
  641. break;
  642. }
  643. }
  644. if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
  645. // Ignore the finally entry if control is not jumping to a
  646. // location outside the try/catch block.
  647. finallyEntry = null;
  648. }
  649. var record = finallyEntry ? finallyEntry.completion : {};
  650. record.type = type;
  651. record.arg = arg;
  652. if (finallyEntry) {
  653. this.method = "next";
  654. this.next = finallyEntry.finallyLoc;
  655. return ContinueSentinel;
  656. }
  657. return this.complete(record);
  658. },
  659. complete: function complete(record, afterLoc) {
  660. if (record.type === "throw") {
  661. throw record.arg;
  662. }
  663. if (record.type === "break" || record.type === "continue") {
  664. this.next = record.arg;
  665. } else if (record.type === "return") {
  666. this.rval = this.arg = record.arg;
  667. this.method = "return";
  668. this.next = "end";
  669. } else if (record.type === "normal" && afterLoc) {
  670. this.next = afterLoc;
  671. }
  672. return ContinueSentinel;
  673. },
  674. finish: function finish(finallyLoc) {
  675. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  676. var entry = this.tryEntries[i];
  677. if (entry.finallyLoc === finallyLoc) {
  678. this.complete(entry.completion, entry.afterLoc);
  679. resetTryEntry(entry);
  680. return ContinueSentinel;
  681. }
  682. }
  683. },
  684. "catch": function _catch(tryLoc) {
  685. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  686. var entry = this.tryEntries[i];
  687. if (entry.tryLoc === tryLoc) {
  688. var record = entry.completion;
  689. if (record.type === "throw") {
  690. var thrown = record.arg;
  691. resetTryEntry(entry);
  692. }
  693. return thrown;
  694. }
  695. } // The context.catch method must only be called with a location
  696. // argument that corresponds to a known catch block.
  697. throw new Error("illegal catch attempt");
  698. },
  699. delegateYield: function delegateYield(iterable, resultName, nextLoc) {
  700. this.delegate = {
  701. iterator: values(iterable),
  702. resultName: resultName,
  703. nextLoc: nextLoc
  704. };
  705. if (this.method === "next") {
  706. // Deliberately forget the last sent value so that we don't
  707. // accidentally pass it on to the delegate.
  708. this.arg = undefined$1;
  709. }
  710. return ContinueSentinel;
  711. }
  712. }; // Regardless of whether this script is executing as a CommonJS module
  713. // or not, return the runtime object so that we can declare the variable
  714. // regeneratorRuntime in the outer scope, which allows this module to be
  715. // injected easily by `bin/regenerator --include-runtime script.js`.
  716. return exports;
  717. }( // If this script is executing as a CommonJS module, use module.exports
  718. // as the regeneratorRuntime namespace. Otherwise create a new empty
  719. // object. Either way, the resulting object will be used to initialize
  720. // the regeneratorRuntime variable at the top of this file.
  721. module.exports );
  722. try {
  723. regeneratorRuntime = runtime;
  724. } catch (accidentalStrictMode) {
  725. // This module should not be running in strict mode, so the above
  726. // assignment should always work unless something is misconfigured. Just
  727. // in case runtime.js accidentally runs in strict mode, in modern engines
  728. // we can explicitly access globalThis. In older engines we can escape
  729. // strict mode using a global Function call. This could conceivably fail
  730. // if a Content Security Policy forbids using Function, but in that case
  731. // the proper solution is to fix the accidental strict mode problem. If
  732. // you've misconfigured your bundler to force strict mode and applied a
  733. // CSP to forbid Function, and you're not willing to fix either of those
  734. // problems, please detail your unique predicament in a GitHub issue.
  735. if (typeof globalThis === "object") {
  736. globalThis.regeneratorRuntime = runtime;
  737. } else {
  738. Function("r", "regeneratorRuntime = r")(runtime);
  739. }
  740. }
  741. });
  742. var regenerator = runtime_1;
  743. function _arrayLikeToArray$9(arr, len) {
  744. if (len == null || len > arr.length) len = arr.length;
  745. for (var i = 0, arr2 = new Array(len); i < len; i++) {
  746. arr2[i] = arr[i];
  747. }
  748. return arr2;
  749. }
  750. function _arrayWithoutHoles(arr) {
  751. if (Array.isArray(arr)) return _arrayLikeToArray$9(arr);
  752. }
  753. function _iterableToArray(iter) {
  754. if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
  755. }
  756. function _unsupportedIterableToArray$9(o, minLen) {
  757. if (!o) return;
  758. if (typeof o === "string") return _arrayLikeToArray$9(o, minLen);
  759. var n = Object.prototype.toString.call(o).slice(8, -1);
  760. if (n === "Object" && o.constructor) n = o.constructor.name;
  761. if (n === "Map" || n === "Set") return Array.from(o);
  762. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$9(o, minLen);
  763. }
  764. function _nonIterableSpread() {
  765. throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  766. }
  767. function _toConsumableArray(arr) {
  768. return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray$9(arr) || _nonIterableSpread();
  769. }
  770. function _isNativeReflectConstruct$1A() {
  771. if (typeof Reflect === "undefined" || !Reflect.construct) return false;
  772. if (Reflect.construct.sham) return false;
  773. if (typeof Proxy === "function") return true;
  774. try {
  775. Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
  776. return true;
  777. } catch (e) {
  778. return false;
  779. }
  780. }
  781. function _construct(Parent, args, Class) {
  782. if (_isNativeReflectConstruct$1A()) {
  783. _construct = Reflect.construct;
  784. } else {
  785. _construct = function _construct(Parent, args, Class) {
  786. var a = [null];
  787. a.push.apply(a, args);
  788. var Constructor = Function.bind.apply(Parent, a);
  789. var instance = new Constructor();
  790. if (Class) _setPrototypeOf(instance, Class.prototype);
  791. return instance;
  792. };
  793. }
  794. return _construct.apply(null, arguments);
  795. }
  796. var e = [],
  797. t$1 = [];
  798. function n$4(n, r) {
  799. if (n && "undefined" != typeof document) {
  800. var a,
  801. s = !0 === r.prepend ? "prepend" : "append",
  802. d = !0 === r.singleTag,
  803. i = "string" == typeof r.container ? document.querySelector(r.container) : document.getElementsByTagName("head")[0];
  804. if (d) {
  805. var u = e.indexOf(i);
  806. -1 === u && (u = e.push(i) - 1, t$1[u] = {}), a = t$1[u] && t$1[u][s] ? t$1[u][s] : t$1[u][s] = c();
  807. } else a = c();
  808. 65279 === n.charCodeAt(0) && (n = n.substring(1)), a.styleSheet ? a.styleSheet.cssText += n : a.appendChild(document.createTextNode(n));
  809. }
  810. function c() {
  811. var e = document.createElement("style");
  812. if (e.setAttribute("type", "text/css"), r.attributes) for (var t = Object.keys(r.attributes), n = 0; n < t.length; n++) {
  813. e.setAttribute(t[n], r.attributes[t[n]]);
  814. }
  815. var a = "prepend" === s ? "afterbegin" : "beforeend";
  816. return i.insertAdjacentElement(a, e), e;
  817. }
  818. }
  819. var css$3 = ":root {\n --main-color: #00c8af;\n --font-color: #999;\n}\n\n[x-cloak] {\n display: none !important;\n}\n\n*,\n::before,\n::after {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\n text-rendering: optimizeLegibility !important;\n -webkit-font-smoothing: antialiased !important;\n}\n\n.kankan-app {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n background-color: #292929;\n}\n\n.kankan-app .player {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 1;\n overflow: hidden;\n outline: none;\n border: none;\n}\n\n.kankan-app .player[name='copy'] {\n display: none;\n}\n\n.kankan-app .player-mark {\n display: none;\n cursor: grab;\n position: absolute;\n left: calc(50% - 56px);\n top: calc(50% - 56px);\n z-index: 999;\n width: 102px;\n height: 102px;\n}\n\n.kankan-app__split .player {\n cursor: crosshair;\n}\n\n.kankan-app__split .player[name='main'] {\n width: calc(50% - 1px);\n}\n\n.kankan-app__split .player[name='copy'] {\n width: calc(50% - 1px);\n display: block;\n left: auto;\n right: 0;\n}\n\n.kankan-app__split .player-mark {\n display: block;\n}\n\n.kankan-app__split [xui_tags] div {\n display: none !important;\n}\n\n.ui-view-layout[is-mobile='true'] .kankan-app__split .player[name='main'] {\n width: 100%;\n height: calc(50% - 1px);\n}\n\n.ui-view-layout[is-mobile='true'] .kankan-app__split .player[name='copy'] {\n width: 100%;\n height: calc(50% - 1px);\n display: block;\n top: 50%;\n left: auto;\n right: 0;\n}\n\n.kankan-app__slide-right {\n will-change: transform;\n transition: all 0.2s ease-in-out;\n}\n\n.kankan-app__slide-right-enter {\n opacity: 1;\n transform: translate3d(0, 0, 0);\n}\n\n.kankan-app__slide-right-leave {\n opacity: 0;\n transform: translate3d(100%, 0, 0);\n}\n\n/* plugins */\n.kankan-plugins input {\n padding: 0 5px;\n width: 100%;\n height: 34px;\n background: rgba(255, 255, 255, 0.1);\n border-radius: 4px;\n border: 1px solid rgba(255, 255, 255, 0.2);\n outline: none;\n color: #fff;\n}\n\n.kankan-plugins input:focus {\n border: 1px solid var(--main-color);\n}\n\n.kankan-plugins button {\n cursor: pointer;\n width: 100%;\n height: 34px;\n outline: none;\n border-radius: 4px;\n font-size: 14px;\n background: none !important;\n transition: all 0.3s ease;\n color: var(--main-color);\n border: 1px solid var(--main-color);\n}\n\n/* xui */\n.kankan-app_combox {\n cursor: pointer;\n position: relative;\n background: #323233;\n border-radius: 4px;\n border: 1px solid rgba(255, 255, 255, 0.2);\n outline: none;\n color: #fff;\n height: 34px;\n width: 100%;\n}\n\n.kankan-app_combox .inner-icon {\n cursor: pointer;\n font-size: 12px;\n position: absolute;\n right: 5px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--font-color);\n}\n\n.kankan-app_combox .inner-text {\n display: flex;\n align-items: center;\n padding: 0 5px;\n height: 100%;\n}\n\n.kankan-app_combox .inner-list {\n position: absolute;\n left: 0px;\n right: 0px;\n top: 100%;\n border: 1px solid rgba(255, 255, 255, 0.2);\n background: #323233;\n z-index: 1000;\n}\n\n.kankan-app_combox .inner-list>div {\n height: 34px;\n display: flex;\n align-items: center;\n padding: 0 5px;\n}\n\n.kankan-app_combox .inner-list>div:hover {\n color: var(--main-color);\n}";
  820. n$4(css$3,{});
  821. /*
  822. * @Author: Rindy
  823. * @Date: 2021-04-25 16:49:05
  824. * @LastEditors: Rindy
  825. * @LastEditTime: 2021-09-15 11:31:00
  826. * @Description: 注释
  827. */
  828. /**
  829. * 配置对象
  830. */
  831. var lang_zh = {
  832. 'common.about': '约',
  833. 'common.meter': '米',
  834. 'cad.input': '请输入名称',
  835. 'model.enter': '入户门'
  836. };
  837. var config$4 = {
  838. num: null,
  839. dom: null,
  840. /**
  841. * 运行环境
  842. */
  843. env: "development",
  844. /**
  845. * SDK版本号
  846. */
  847. version: "4.12.0-alpha.26",
  848. /**
  849. * 源码版本号
  850. */
  851. edition: null,
  852. lang: 'zh',
  853. langs: {},
  854. /**
  855. * SDK展示模式
  856. */
  857. view: true,
  858. /**
  859. * 移动端模式
  860. */
  861. mobile: false,
  862. /**
  863. * 部署方式,本地版为local
  864. */
  865. deploy: '',
  866. /**
  867. * 区域
  868. */
  869. region: '',
  870. /**
  871. * 服务器地址
  872. */
  873. server: '',
  874. //'https://www.4dkankan.com/',
  875. /**
  876. * 场景资源地址
  877. */
  878. resource: 'https://4dkk.4dage.com/',
  879. /**
  880. * 显示SDK信息
  881. */
  882. showSDKInfo: true,
  883. /**
  884. * 是否使用场景控制快捷键
  885. */
  886. useShortcutKeys: false,
  887. /**
  888. * statistics
  889. */
  890. useStatistics: true,
  891. /**
  892. * 是否需要用户鉴权
  893. */
  894. useAuth: false,
  895. /**
  896. * 抗锯齿
  897. */
  898. antialias: true,
  899. /**
  900. * 全景关联设置
  901. */
  902. link: {
  903. onAction: null,
  904. target: 'self'
  905. },
  906. /**
  907. * 模型设置
  908. */
  909. model: {
  910. /**
  911. * 模型名称
  912. */
  913. name: '' // 铁塔
  914. //name: 'tieta.dam',
  915. },
  916. /**
  917. * 场景设置
  918. */
  919. scene: {
  920. /**
  921. * 图片质量
  922. */
  923. quality: null,
  924. /**
  925. * 自定义marker图片地址
  926. */
  927. markerURL: null,
  928. /**
  929. * 自定义marker透明的
  930. */
  931. markerOpacity: null,
  932. /**
  933. * 自定义当前点位颜色
  934. */
  935. pathEndColor: null,
  936. /**
  937. * 自定义地面logoId
  938. */
  939. floorlogoId: null // 铁塔
  940. //floorlogoId: 2,
  941. },
  942. camera: {
  943. lookLimitUp: null,
  944. lookLimitDown: null // // 铁塔
  945. // lookLimitUp: 89.9,
  946. // lookLimitDown: -89.9,
  947. },
  948. vr: {
  949. markerHeight: null
  950. },
  951. tag: {
  952. showIn: null
  953. },
  954. /**
  955. * 获取服务器资源
  956. */
  957. getServerURL(path) {
  958. return this.server + path;
  959. },
  960. /**
  961. * 获取场景资源地址
  962. * @param {String} path 资源路径
  963. */
  964. getResourceURL(path) {
  965. return this.resource + path;
  966. },
  967. /**
  968. * 获取场景图片地址
  969. * @param {*} path 图片路径
  970. */
  971. getResourceImageURL(path) {
  972. return this.getResourceURL("scene_view_data/".concat(this.num, "/images/").concat(path));
  973. },
  974. /**
  975. * 获取场景数据地址
  976. * @param {*} path 数据路径
  977. */
  978. getResourceDataURL(path) {
  979. return this.getResourceURL("scene_view_data/".concat(this.num, "/data/").concat(path));
  980. },
  981. i18n(key) {
  982. if (this.langs[this.lang] && this.langs[this.lang][key]) {
  983. return this.langs[this.lang][key];
  984. }
  985. if (!this.langs['zh']) {
  986. this.langs['zh'] = lang_zh;
  987. }
  988. return this.langs['zh'][key] || '';
  989. },
  990. /**
  991. * 是否加载热点
  992. */
  993. isLoadTags: true
  994. };
  995. if (config$4.showSDKInfo) {
  996. if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
  997. var log$1 = ['\n %c %c 4DKanKan SDK ' + config$4.version + ' - https://www.4dkankan.com/ \n', 'background: #1fe4dc; padding:5px 0;', 'color: #000; background: #1fe4dc; padding:5px 0;'];
  998. console.log.apply(console, log$1);
  999. } else console && console.log('4DKanKan SDK ' + config$4.version + ' - https://www.4dkankan.com/');
  1000. }
  1001. /*
  1002. * @Author: Rindy
  1003. * @Date: 2021-09-14 20:02:23
  1004. * @LastEditors: Rindy
  1005. * @LastEditTime: 2021-09-14 20:03:48
  1006. * @Description:
  1007. */
  1008. /**
  1009. * Merges two arrays and returns the new one.
  1010. * @param a
  1011. * @param b
  1012. * @param fn
  1013. */
  1014. function mergeArrays(a, b, fn) {
  1015. var result = [];
  1016. for (var i = 0; i < a.length; i += 1) {
  1017. if (typeof a !== 'undefined') {
  1018. if (a[i] !== null && typeof a[i] === 'object') {
  1019. result[i] = fn({}, a[i]);
  1020. } else {
  1021. result[i] = a[i];
  1022. }
  1023. }
  1024. }
  1025. for (var _i = 0; _i < b.length; _i += 1) {
  1026. if (typeof b[_i] !== 'undefined') {
  1027. if (b[_i] !== null && typeof b[_i] === 'object') {
  1028. result[_i] = fn(a[_i], b[_i]);
  1029. } else {
  1030. result[_i] = b[_i];
  1031. }
  1032. }
  1033. }
  1034. return result;
  1035. }
  1036. /**
  1037. * Merge deep objects
  1038. * @param args
  1039. */
  1040. function deepExtend() {
  1041. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  1042. args[_key] = arguments[_key];
  1043. }
  1044. var a = args.shift();
  1045. for (var i = 0; i < args.length; i += 1) {
  1046. var b = args[i];
  1047. if (a !== null && b !== null && typeof a !== 'undefined' && typeof b !== 'undefined') {
  1048. // Merge objects
  1049. if (typeof a === 'object' && typeof b === 'object') {
  1050. // Merge arrays
  1051. if (a instanceof Array && b instanceof Array) {
  1052. a = mergeArrays(a, b, deepExtend);
  1053. } else {
  1054. var keys = Object.keys(b);
  1055. for (var j = 0; j < keys.length; j += 1) {
  1056. var key = keys[j]; // Avoid prototype pollution.
  1057. if (key !== '__proto__') {
  1058. if (typeof b[key] === 'object' && b[key] !== null) {
  1059. a[key] = deepExtend(a[key], b[key]);
  1060. } else if (typeof b[key] !== 'undefined') {
  1061. a[key] = b[key];
  1062. }
  1063. }
  1064. }
  1065. }
  1066. }
  1067. } else if (b !== null && typeof b !== 'undefined') {
  1068. if (b instanceof Array) {
  1069. a = mergeArrays([], b, deepExtend);
  1070. } else {
  1071. a = b;
  1072. }
  1073. }
  1074. }
  1075. return a;
  1076. }
  1077. function _classPrivateFieldBase(receiver, privateKey) {
  1078. if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
  1079. throw new TypeError("attempted to use private field on non-instance");
  1080. }
  1081. return receiver;
  1082. }
  1083. var id = 0;
  1084. function _classPrivateFieldKey(name) {
  1085. return "__private_" + id++ + "_" + name;
  1086. }
  1087. function isArray$4(arr) {
  1088. return Object.prototype.toString.call(arr) === '[object Array]';
  1089. }
  1090. function foreach(arr, handler) {
  1091. if (isArray$4(arr)) {
  1092. for (var i = 0; i < arr.length; i++) {
  1093. handler(arr[i]);
  1094. }
  1095. } else handler(arr);
  1096. }
  1097. function D(fn) {
  1098. var status = 'pending',
  1099. doneFuncs = [],
  1100. failFuncs = [],
  1101. progressFuncs = [],
  1102. resultArgs = null,
  1103. _promise = {
  1104. done: function done() {
  1105. for (var i = 0; i < arguments.length; i++) {
  1106. // skip any undefined or null arguments
  1107. if (!arguments[i]) {
  1108. continue;
  1109. }
  1110. if (isArray$4(arguments[i])) {
  1111. var arr = arguments[i];
  1112. for (var j = 0; j < arr.length; j++) {
  1113. // immediately call the function if the deferred has been resolved
  1114. if (status === 'resolved') {
  1115. arr[j].apply(this, resultArgs);
  1116. }
  1117. doneFuncs.push(arr[j]);
  1118. }
  1119. } else {
  1120. // immediately call the function if the deferred has been resolved
  1121. if (status === 'resolved') {
  1122. arguments[i].apply(this, resultArgs);
  1123. }
  1124. doneFuncs.push(arguments[i]);
  1125. }
  1126. }
  1127. return this;
  1128. },
  1129. fail: function fail() {
  1130. for (var i = 0; i < arguments.length; i++) {
  1131. // skip any undefined or null arguments
  1132. if (!arguments[i]) {
  1133. continue;
  1134. }
  1135. if (isArray$4(arguments[i])) {
  1136. var arr = arguments[i];
  1137. for (var j = 0; j < arr.length; j++) {
  1138. // immediately call the function if the deferred has been resolved
  1139. if (status === 'rejected') {
  1140. arr[j].apply(this, resultArgs);
  1141. }
  1142. failFuncs.push(arr[j]);
  1143. }
  1144. } else {
  1145. // immediately call the function if the deferred has been resolved
  1146. if (status === 'rejected') {
  1147. arguments[i].apply(this, resultArgs);
  1148. }
  1149. failFuncs.push(arguments[i]);
  1150. }
  1151. }
  1152. return this;
  1153. },
  1154. always: function always() {
  1155. return this.done.apply(this, arguments).fail.apply(this, arguments);
  1156. },
  1157. progress: function progress() {
  1158. for (var i = 0; i < arguments.length; i++) {
  1159. // skip any undefined or null arguments
  1160. if (!arguments[i]) {
  1161. continue;
  1162. }
  1163. if (isArray$4(arguments[i])) {
  1164. var arr = arguments[i];
  1165. for (var j = 0; j < arr.length; j++) {
  1166. // immediately call the function if the deferred has been resolved
  1167. if (status === 'pending') {
  1168. progressFuncs.push(arr[j]);
  1169. }
  1170. }
  1171. } else {
  1172. // immediately call the function if the deferred has been resolved
  1173. if (status === 'pending') {
  1174. progressFuncs.push(arguments[i]);
  1175. }
  1176. }
  1177. }
  1178. return this;
  1179. },
  1180. then: function then(done, fail, progress) {
  1181. /*
  1182. // fail callbacks
  1183. if (arguments.length > 1 && arguments[1]) {
  1184. this.fail(arguments[1])
  1185. }
  1186. // done callbacks
  1187. if (arguments.length > 0 && arguments[0]) {
  1188. this.done(arguments[0])
  1189. }
  1190. // notify callbacks
  1191. if (arguments.length > 2 && arguments[2]) {
  1192. this.progress(arguments[2])
  1193. }
  1194. return this
  1195. */
  1196. return D(function (def) {
  1197. foreach(done, function (func) {
  1198. // filter function
  1199. if (typeof func === 'function') {
  1200. deferred.done(function () {
  1201. var returnval = func.apply(this, arguments); // if a new deferred/promise is returned, its state is passed to the current deferred/promise
  1202. if (returnval && typeof returnval === 'function') {
  1203. returnval.promise().then(def.resolve, def.reject, def.notify);
  1204. } else {
  1205. // if new return val is passed, it is passed to the piped done
  1206. def.resolve(returnval);
  1207. }
  1208. });
  1209. } else {
  1210. deferred.done(def.resolve);
  1211. }
  1212. });
  1213. foreach(fail, function (func) {
  1214. if (typeof func === 'function') {
  1215. deferred.fail(function () {
  1216. var returnval = func.apply(this, arguments);
  1217. if (returnval && typeof returnval === 'function') {
  1218. returnval.promise().then(def.resolve, def.reject, def.notify);
  1219. } else {
  1220. def.reject(returnval);
  1221. }
  1222. });
  1223. } else {
  1224. deferred.fail(def.reject);
  1225. }
  1226. });
  1227. }).promise();
  1228. },
  1229. catch: function _catch() {
  1230. for (var i = 0; i < arguments.length; i++) {
  1231. // skip any undefined or null arguments
  1232. if (!arguments[i]) {
  1233. continue;
  1234. }
  1235. if (isArray$4(arguments[i])) {
  1236. var arr = arguments[i];
  1237. for (var j = 0; j < arr.length; j++) {
  1238. // immediately call the function if the deferred has been resolved
  1239. if (status === 'rejected') {
  1240. arr[j].apply(this, resultArgs);
  1241. }
  1242. failFuncs.push(arr[j]);
  1243. }
  1244. } else {
  1245. // immediately call the function if the deferred has been resolved
  1246. if (status === 'rejected') {
  1247. arguments[i].apply(this, resultArgs);
  1248. }
  1249. failFuncs.push(arguments[i]);
  1250. }
  1251. }
  1252. return this;
  1253. },
  1254. promise: function promise(obj) {
  1255. if (obj == null) {
  1256. return _promise;
  1257. } else {
  1258. for (var i in _promise) {
  1259. obj[i] = _promise[i];
  1260. }
  1261. return obj;
  1262. }
  1263. },
  1264. state: function state() {
  1265. return status;
  1266. },
  1267. debug: function debug() {
  1268. console.log('[debug]', doneFuncs, failFuncs, status);
  1269. },
  1270. isRejected: function isRejected() {
  1271. return status === 'rejected';
  1272. },
  1273. isResolved: function isResolved() {
  1274. return status === 'resolved';
  1275. },
  1276. pipe: function pipe(done, fail, progress) {
  1277. return D(function (def) {
  1278. foreach(done, function (func) {
  1279. // filter function
  1280. if (typeof func === 'function') {
  1281. deferred.done(function () {
  1282. var returnval = func.apply(this, arguments); // if a new deferred/promise is returned, its state is passed to the current deferred/promise
  1283. if (returnval && typeof returnval === 'function') {
  1284. returnval.promise().then(def.resolve, def.reject, def.notify);
  1285. } else {
  1286. // if new return val is passed, it is passed to the piped done
  1287. def.resolve(returnval);
  1288. }
  1289. });
  1290. } else {
  1291. deferred.done(def.resolve);
  1292. }
  1293. });
  1294. foreach(fail, function (func) {
  1295. if (typeof func === 'function') {
  1296. deferred.fail(function () {
  1297. var returnval = func.apply(this, arguments);
  1298. if (returnval && typeof returnval === 'function') {
  1299. returnval.promise().then(def.resolve, def.reject, def.notify);
  1300. } else {
  1301. def.reject(returnval);
  1302. }
  1303. });
  1304. } else {
  1305. deferred.fail(def.reject);
  1306. }
  1307. });
  1308. }).promise();
  1309. }
  1310. },
  1311. deferred = {
  1312. resolveWith: function resolveWith(context) {
  1313. if (status === 'pending') {
  1314. status = 'resolved';
  1315. var args = resultArgs = arguments.length > 1 ? arguments[1] : [];
  1316. for (var i = 0; i < doneFuncs.length; i++) {
  1317. doneFuncs[i].apply(context, args);
  1318. }
  1319. }
  1320. return this;
  1321. },
  1322. rejectWith: function rejectWith(context) {
  1323. if (status === 'pending') {
  1324. status = 'rejected';
  1325. var args = resultArgs = arguments.length > 1 ? arguments[1] : [];
  1326. for (var i = 0; i < failFuncs.length; i++) {
  1327. failFuncs[i].apply(context, args);
  1328. }
  1329. }
  1330. return this;
  1331. },
  1332. notifyWith: function notifyWith(context) {
  1333. if (status === 'pending') {
  1334. var args = resultArgs = arguments.length > 1 ? arguments[1] : [];
  1335. for (var i = 0; i < progressFuncs.length; i++) {
  1336. progressFuncs[i].apply(context, args);
  1337. }
  1338. }
  1339. return this;
  1340. },
  1341. resolve: function resolve() {
  1342. return this.resolveWith(this, arguments);
  1343. },
  1344. reject: function reject() {
  1345. return this.rejectWith(this, arguments);
  1346. },
  1347. notify: function notify() {
  1348. return this.notifyWith(this, arguments);
  1349. }
  1350. };
  1351. var obj = _promise.promise(deferred);
  1352. if (fn) {
  1353. fn.apply(obj, [obj]);
  1354. }
  1355. return obj;
  1356. }
  1357. D.when = function () {
  1358. if (arguments.length < 2) {
  1359. var obj = arguments.length ? arguments[0] : undefined;
  1360. if (obj && typeof obj.isResolved === 'function' && typeof obj.isRejected === 'function') {
  1361. return obj.promise();
  1362. } else {
  1363. return D().resolve(obj).promise();
  1364. }
  1365. } else {
  1366. return function (args) {
  1367. var df = D(),
  1368. size = args.length,
  1369. done = 0,
  1370. rp = new Array(size); // resolve params: params of each resolve, we need to track down them to be able to pass them in the correct order if the master needs to be resolved
  1371. for (var i = 0; i < args.length; i++) {
  1372. (function (j) {
  1373. var obj = null;
  1374. if (args[j].done) {
  1375. args[j].done(function () {
  1376. rp[j] = arguments.length < 2 ? arguments[0] : arguments;
  1377. if (++done == size) {
  1378. df.resolve.apply(df, rp);
  1379. }
  1380. }).fail(function () {
  1381. df.reject(arguments);
  1382. });
  1383. } else {
  1384. obj = args[j];
  1385. args[j] = new Deferred();
  1386. args[j].done(function () {
  1387. rp[j] = arguments.length < 2 ? arguments[0] : arguments;
  1388. if (++done == size) {
  1389. df.resolve.apply(df, rp);
  1390. }
  1391. }).fail(function () {
  1392. df.reject(arguments);
  1393. }).resolve(obj);
  1394. }
  1395. })(i);
  1396. }
  1397. return df.promise();
  1398. }(arguments);
  1399. }
  1400. };
  1401. var Defer = D;
  1402. function Deferred$1 () {
  1403. return new D();
  1404. }
  1405. var _deferrals = /*#__PURE__*/_classPrivateFieldKey("deferrals");
  1406. var Plugins = /*#__PURE__*/function () {
  1407. function Plugins(app) {
  1408. _classCallCheck(this, Plugins);
  1409. Object.defineProperty(this, _deferrals, {
  1410. writable: true,
  1411. value: {}
  1412. });
  1413. this.app = app;
  1414. }
  1415. _createClass(Plugins, [{
  1416. key: "add",
  1417. value: function () {
  1418. var _add = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(Plugin, config) {
  1419. var _this = this;
  1420. var plugin;
  1421. return regenerator.wrap(function _callee$(_context) {
  1422. while (1) {
  1423. switch (_context.prev = _context.next) {
  1424. case 0:
  1425. plugin = Plugin(this.app, config);
  1426. return _context.abrupt("return", new Promise(function (resolve, reject) {
  1427. if (plugin.then) {
  1428. plugin.then(function (instance) {
  1429. if (!instance.$name) {
  1430. return reject('require a plugin name');
  1431. }
  1432. if (_this[instance.$name]) {
  1433. return resolve(_this[instance.$name]);
  1434. }
  1435. if (instance.$html) {
  1436. if (instance.$scope) {
  1437. instance.$scope.insertAdjacentHTML('beforeend', instance.$html);
  1438. } else {
  1439. _this.app.$plugins.insertAdjacentHTML('beforeend', instance.$html);
  1440. }
  1441. delete instance.$html;
  1442. }
  1443. _this[instance.$name] = instance;
  1444. if (instance.$load) {
  1445. instance.$load();
  1446. delete instance.$load;
  1447. }
  1448. if (_classPrivateFieldBase(_this, _deferrals)[_deferrals][instance.$name]) {
  1449. _classPrivateFieldBase(_this, _deferrals)[_deferrals][instance.$name].resolve(instance);
  1450. }
  1451. resolve(instance);
  1452. });
  1453. }
  1454. }));
  1455. case 2:
  1456. case "end":
  1457. return _context.stop();
  1458. }
  1459. }
  1460. }, _callee, this);
  1461. }));
  1462. function add(_x, _x2) {
  1463. return _add.apply(this, arguments);
  1464. }
  1465. return add;
  1466. }()
  1467. }, {
  1468. key: "get",
  1469. value: function get(name) {
  1470. if (_classPrivateFieldBase(this, _deferrals)[_deferrals][name] == void 0) {
  1471. _classPrivateFieldBase(this, _deferrals)[_deferrals][name] = Deferred$1();
  1472. }
  1473. return _classPrivateFieldBase(this, _deferrals)[_deferrals][name];
  1474. }
  1475. }]);
  1476. return Plugins;
  1477. }();
  1478. var _components = /*#__PURE__*/_classPrivateFieldKey("components");
  1479. /*
  1480. * @Author: Rindy
  1481. * @Date: 2021-09-15 09:31:50
  1482. * @LastEditors: Rindy
  1483. * @LastEditTime: 2021-11-01 10:40:09
  1484. * @Description: Core Component
  1485. */
  1486. var Component = /*#__PURE__*/function () {
  1487. function Component(app) {
  1488. _classCallCheck(this, Component);
  1489. Object.defineProperty(this, _components, {
  1490. writable: true,
  1491. value: void 0
  1492. });
  1493. this.app = app;
  1494. _classPrivateFieldBase(this, _components)[_components] = {};
  1495. }
  1496. _createClass(Component, [{
  1497. key: "add",
  1498. value: function add(name, component) {
  1499. if (['store', 'resource'].indexOf(name) == -1) {
  1500. _classPrivateFieldBase(this, _components)[_components][name] = component;
  1501. } else {
  1502. this.app[name] = component;
  1503. }
  1504. }
  1505. }, {
  1506. key: "get",
  1507. value: function get(name) {
  1508. return _classPrivateFieldBase(this, _components)[_components][name];
  1509. }
  1510. }]);
  1511. return Component;
  1512. }();
  1513. /*
  1514. * @Author: Rindy
  1515. * @Date: 2021-04-26 14:18:55
  1516. * @LastEditors: Rindy
  1517. * @LastEditTime: 2021-09-13 12:28:00
  1518. * @Description: 注释
  1519. */
  1520. var baseOrigin = location.origin;
  1521. var currentScript = (document.currentScript || {}).src;
  1522. /**
  1523. * 获取当前脚本路径
  1524. */
  1525. var getScriptURL = function () {
  1526. if (!currentScript) {
  1527. var a = {};
  1528. try {
  1529. a.b();
  1530. } catch (e) {
  1531. var stack = e.stack || e.sourceURL || e.stacktrace;
  1532. var match = /(?:http|https|file):\/\/.*?\/.+?.js/.exec(stack);
  1533. if (match) {
  1534. currentScript = match[0];
  1535. }
  1536. }
  1537. }
  1538. var filepathPart = currentScript.split('/');
  1539. filepathPart.pop();
  1540. currentScript = filepathPart.join('/') + '/';
  1541. return function () {
  1542. return currentScript;
  1543. };
  1544. }();
  1545. window.addEventListener('error', function (evt) {
  1546. });
  1547. function createScript(url) {
  1548. var script = document.createElement('script');
  1549. script.async = true; // Only add cross origin for actual cross origin
  1550. // this is because Safari triggers for all
  1551. // - https://bugs.webkit.org/show_bug.cgi?id=171566
  1552. if (url.indexOf(baseOrigin + '/')) {
  1553. script.crossOrigin = 'anonymous';
  1554. }
  1555. script.src = url;
  1556. return script;
  1557. }
  1558. function loadScript(url, name, version) {
  1559. return new Promise(function (resolve, reject) {
  1560. var script = createScript(url + (version ? "?v=".concat(version) : ''));
  1561. script.addEventListener('error', function () {
  1562. console.error('load:' + url + ' error');
  1563. reject();
  1564. });
  1565. script.addEventListener('load', function () {
  1566. document.head.removeChild(script);
  1567. resolve(name);
  1568. });
  1569. document.head.appendChild(script);
  1570. });
  1571. }
  1572. function usePlugin(name, version) {
  1573. return loadScript(getScriptURL() + 'plugins/' + name + '.js', name, version);
  1574. }
  1575. var GUI = /*#__PURE__*/function () {
  1576. function GUI(app) {
  1577. _classCallCheck(this, GUI);
  1578. this.app = app;
  1579. } // data可直接传String,默认为content
  1580. /**
  1581. * @param data
  1582. * {
  1583. type: String,
  1584. delay: Number,
  1585. content: String,
  1586. showClose: Boolean
  1587. }
  1588. */
  1589. _createClass(GUI, [{
  1590. key: "toast",
  1591. value: function toast(data) {
  1592. // alert(data.content)
  1593. this.app.emit('gui.toast', data);
  1594. }
  1595. /**
  1596. * @param data
  1597. * {
  1598. title: { type: String, default: '提示' },
  1599. okText: { type: String, default: '确定' },
  1600. func: Function,
  1601. content: String
  1602. }
  1603. */
  1604. }, {
  1605. key: "alert",
  1606. value: function alert(data) {
  1607. // alert(data)
  1608. this.app.emit('gui.alert', data);
  1609. }
  1610. /**
  1611. * @param data
  1612. * {
  1613. title: { type: String, default: '提示' },
  1614. okText: { type: String, default: '确定' },
  1615. noText: { type: String, default: '取消' },
  1616. single: { type: Boolean, default: true },
  1617. func: Function,
  1618. content: String
  1619. }
  1620. */
  1621. }, {
  1622. key: "confirm",
  1623. value: function confirm(data) {
  1624. // alert(data)
  1625. this.app.emit('gui.confirm', data);
  1626. }
  1627. }]);
  1628. return GUI;
  1629. }();
  1630. function _arrayWithHoles(arr) {
  1631. if (Array.isArray(arr)) return arr;
  1632. }
  1633. function _iterableToArrayLimit(arr, i) {
  1634. var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
  1635. if (_i == null) return;
  1636. var _arr = [];
  1637. var _n = true;
  1638. var _d = false;
  1639. var _s, _e;
  1640. try {
  1641. for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
  1642. _arr.push(_s.value);
  1643. if (i && _arr.length === i) break;
  1644. }
  1645. } catch (err) {
  1646. _d = true;
  1647. _e = err;
  1648. } finally {
  1649. try {
  1650. if (!_n && _i["return"] != null) _i["return"]();
  1651. } finally {
  1652. if (_d) throw _e;
  1653. }
  1654. }
  1655. return _arr;
  1656. }
  1657. function _nonIterableRest() {
  1658. throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  1659. }
  1660. function _slicedToArray(arr, i) {
  1661. return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray$9(arr, i) || _nonIterableRest();
  1662. }
  1663. var math$1 = {
  1664. getBaseLog(x, y) {
  1665. //返回以 x 为底 y 的对数(即 logx y) . Math.log 返回一个数的自然对数
  1666. return Math.log(y) / Math.log(x);
  1667. },
  1668. convertVisionVector: function convertVisionVector(e) {
  1669. return new THREE.Vector3(e.x, e.z, -e.y);
  1670. },
  1671. invertVisionVector: function invertVisionVector(e) {
  1672. //反转给算法部
  1673. return new THREE.Vector3(e.x, -e.z, e.y);
  1674. },
  1675. convertVisionQuaternion: function convertVisionQuaternion(e) {
  1676. return new THREE.Quaternion(e.x, e.z, -e.y, e.w).multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(90)));
  1677. },
  1678. invertVisionQuaternion: function invertVisionQuaternion(e) {
  1679. //反转给算法部
  1680. var a = e.clone().multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(-90)));
  1681. return new THREE.Quaternion(a.x, -a.z, a.y, a.w);
  1682. },
  1683. convertWorkshopVector: function convertWorkshopVector(e) {
  1684. return new THREE.Vector3(-e.x, e.y, e.z);
  1685. },
  1686. convertWorkshopQuaternion: function convertWorkshopQuaternion(e) {
  1687. return new THREE.Quaternion(-e.x, e.y, e.z, -e.w).multiply(new THREE.Quaternion(Math.sqrt(2) / 2, Math.sqrt(2) / 2, 0, 0));
  1688. },
  1689. convertWorkshopPanoramaQuaternion: function convertWorkshopPanoramaQuaternion(e) {
  1690. return new THREE.Quaternion(e.x, -e.y, -e.z, e.w).normalize().multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(270)));
  1691. },
  1692. convertWorkshopOrthoZoom: function convertWorkshopOrthoZoom(e, dom) {
  1693. //xzw
  1694. return e === -1 ? -1 : e * (dom.clientHeight / dom.clientHeight);
  1695. },
  1696. getVec2Angle: function getVec2Angle(dir1, dir2) {
  1697. return Math.acos(THREE.MathUtils.clamp(this.getVec2Cos(dir1, dir2), -1, 1));
  1698. },
  1699. getVec2Cos: function getVec2Cos(dir1, dir2) {
  1700. return dir1.dot(dir2) / dir1.length() / dir2.length();
  1701. },
  1702. closeTo: function closeTo(a, b, num) {
  1703. if (num != void 0) return Math.abs(a - b) < num;
  1704. return Math.abs(a - b) < 1e-6;
  1705. },
  1706. toPrecision: function toPrecision(e, t) {
  1707. //xzw change 保留小数
  1708. var f = function f(e, t) {
  1709. var i = Math.pow(10, t);
  1710. return Math.round(e * i) / i;
  1711. };
  1712. if (e instanceof Array) {
  1713. for (var s = 0; s < e.length; s++) {
  1714. e[s] = f(e[s], t);
  1715. }
  1716. return e;
  1717. } else if (e instanceof Object) {
  1718. for (var s in e) {
  1719. e[s] = f(e[s], t);
  1720. }
  1721. return e;
  1722. } else return f(e, t);
  1723. },
  1724. isEmptyQuaternion: function isEmptyQuaternion(e) {
  1725. return 0 === Math.abs(e.x) && 0 === Math.abs(e.y) && 0 === Math.abs(e.z) && 0 === Math.abs(e.w);
  1726. },
  1727. projectPositionToCanvas: function projectPositionToCanvas(e, t, i, domE) {
  1728. i = i || new THREE.Vector3(), i.copy(e);
  1729. var r = 0.5 * domE.clientWidth,
  1730. o = 0.5 * domE.clientHeight;
  1731. return i.project(t), i.x = i.x * r + r, i.y = -(i.y * o) + o, i;
  1732. },
  1733. convertScreenPositionToNDC: function convertScreenPositionToNDC(e, t, i, domE) {
  1734. /* return i = i || new THREE.Vector2,
  1735. i.x = e / window.innerWidth * 2 - 1,
  1736. i.y = 2 * -(t / window.innerHeight) + 1,
  1737. i
  1738. */
  1739. return i = i || new n.Vector2(), i.x = e / domE.clientWidth * 2 - 1, i.y = 2 * -(t / domE.clientHeight) + 1, i;
  1740. },
  1741. handelPadding: function () {
  1742. //去除player左边和上面的宽高,因为pc的player左上有其他element 许钟文
  1743. var pads = new Map(); //记录下来避免反复计算
  1744. return function (x, y, domE) {
  1745. var pad;
  1746. var padInfo = pads.get(domE);
  1747. if (padInfo) {
  1748. if (domE.clientWidth == padInfo.width && domE.clientHeight == padInfo.height) {
  1749. //resize
  1750. pad = padInfo.pad;
  1751. }
  1752. }
  1753. if (!pad) {
  1754. pad = domE.getBoundingClientRect();
  1755. pads.set(domE, {
  1756. width: domE.clientWidth,
  1757. height: domE.clientHeight,
  1758. pad
  1759. });
  1760. }
  1761. return {
  1762. x: x - pad.x,
  1763. y: y - pad.y
  1764. };
  1765. };
  1766. }(),
  1767. /* getOffset: function (type, element, parent) { //弃用,因body上的offset得不到
  1768. //获取元素的边距 许钟文
  1769. var offset = type == 'left' ? element.offsetLeft : element.offsetTop
  1770. if (!parent) parent = document.body
  1771. while ((element = element.offsetParent)) {
  1772. if (element == parent) break
  1773. offset += type == 'left' ? element.offsetLeft : element.offsetTop
  1774. }
  1775. return offset
  1776. }, */
  1777. constrainedTurn: function constrainedTurn(e) {
  1778. var t = e % (2 * Math.PI);
  1779. return t = t > Math.PI ? t -= 2 * Math.PI : t < -Math.PI ? t += 2 * Math.PI : t;
  1780. },
  1781. getFOVDotThreshold: function getFOVDotThreshold(e) {
  1782. return Math.cos(THREE.MathUtils.degToRad(e / 2));
  1783. },
  1784. transform2DForwardVectorByCubeFace: function transform2DForwardVectorByCubeFace(e, t, i, n) {
  1785. switch (e) {
  1786. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
  1787. i.set(1, t.y, t.x);
  1788. break;
  1789. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
  1790. i.set(-1, t.y, -t.x);
  1791. break;
  1792. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
  1793. i.set(-t.x, 1, -t.y);
  1794. break;
  1795. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
  1796. i.set(-t.x, -1, t.y);
  1797. break;
  1798. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
  1799. i.set(-t.x, t.y, 1);
  1800. break;
  1801. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
  1802. i.set(t.x, t.y, -1);
  1803. }
  1804. n && i.normalize();
  1805. },
  1806. getFootPoint: function getFootPoint(oldPos, p1, p2, restricInline) {
  1807. //找oldPos在线段p1, p2上的垂足
  1808. /* if(isWorld){//输出全局坐标 需要考虑meshGroup.position
  1809. p1 = p1.clone();
  1810. p2 = p2.clone();
  1811. p1.y += mainDesign.meshGroup.position.y;
  1812. p2.y += mainDesign.meshGroup.position.y;
  1813. } */
  1814. var op1 = oldPos.clone().sub(p1);
  1815. var p1p2 = p1.clone().sub(p2);
  1816. var p1p2Len = p1p2.length();
  1817. var leftLen = op1.dot(p1p2) / p1p2Len;
  1818. var pos = p1.clone().add(p1p2.multiplyScalar(leftLen / p1p2Len));
  1819. if (restricInline && pos.clone().sub(p1).dot(pos.clone().sub(p2)) > 0) {
  1820. //foot不在线段上
  1821. if (pos.distanceTo(p1) < pos.distanceTo(p2)) pos = p1.clone();else pos = p2.clone();
  1822. }
  1823. return pos;
  1824. },
  1825. /**
  1826. * 计算多边形的重心
  1827. * @param {*} points
  1828. */
  1829. getCenterOfGravityPoint: function getCenterOfGravityPoint(mPoints) {
  1830. var area = 0.0; //多边形面积
  1831. var Gx = 0.0,
  1832. Gy = 0.0; // 重心的x、y
  1833. for (var i = 1; i <= mPoints.length; i++) {
  1834. var ix = mPoints[i % mPoints.length].x;
  1835. var iy = mPoints[i % mPoints.length].y;
  1836. var nx = mPoints[i - 1].x;
  1837. var ny = mPoints[i - 1].y;
  1838. var temp = (ix * ny - iy * nx) / 2.0;
  1839. area += temp;
  1840. Gx += temp * (ix + nx) / 3.0;
  1841. Gy += temp * (iy + ny) / 3.0;
  1842. }
  1843. Gx = Gx / area;
  1844. Gy = Gy / area;
  1845. return {
  1846. x: Gx,
  1847. y: Gy
  1848. };
  1849. },
  1850. getBound: function getBound(ring) {
  1851. var bound = new THREE.Box2();
  1852. for (var j = 0, len = ring.length; j < len; j++) {
  1853. bound.expandByPoint(ring[j]);
  1854. }
  1855. return bound;
  1856. },
  1857. isPointInArea: function isPointInArea(ring, point, ifAtLine) {
  1858. //判断点是否在某个环内
  1859. var bound = this.getBound(ring);
  1860. if (point.x < bound.min.x || point.x > bound.max.x || point.y < bound.min.y || point.y > bound.max.y) return false;
  1861. var inside = false;
  1862. var x = point.x,
  1863. y = point.y;
  1864. for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {
  1865. var xi = ring[i].x,
  1866. yi = ring[i].y;
  1867. var xj = ring[j].x,
  1868. yj = ring[j].y;
  1869. if ((xi - x) * (yj - y) == (xi - x) * (yi - y) && x >= Math.min(xi, xj) && x <= Math.max(xi, xj) && //xzw add
  1870. y >= Math.min(yi, yj) && y <= Math.max(yi, yj)) {
  1871. return !!ifAtLine; //在线段上,则判断为…… (默认在外)
  1872. }
  1873. if (yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi) {
  1874. inside = !inside;
  1875. }
  1876. }
  1877. return inside;
  1878. },
  1879. getArea: function getArea(ring) {
  1880. //求面积 顺时针为正 来自three shape
  1881. for (var t = ring.length, i = 0, n = t - 1, r = 0; r < t; n = r++) {
  1882. i += ring[n].x * ring[r].y - ring[r].x * ring[n].y;
  1883. }
  1884. return -0.5 * i;
  1885. },
  1886. isInBetween: function isInBetween(a, b, c, precision) {
  1887. // 如果b几乎等于a或c,返回false.为了避免浮点运行时两值几乎相等,但存在相差0.00000...0001的这种情况出现使用下面方式进行避免
  1888. /* if (Math.abs(a - b) < 0.000001 || Math.abs(b - c) < 0.000001) {
  1889. return false;
  1890. }
  1891. return (a <= b && b <= c) || (c <= b && b <= a);*/
  1892. //更改:如果b和a或c中一个接近 就算在a和c之间
  1893. return a <= b && b <= c || c <= b && b <= a || this.closeTo(a, b, precision) || this.closeTo(b, c, precision);
  1894. },
  1895. ifPointAtLineBound: function ifPointAtLineBound(point, linePoints, precision) {
  1896. //待验证 横线和竖线比较特殊
  1897. return math$1.isInBetween(linePoints[0].x, point.x, linePoints[1].x, precision) && math$1.isInBetween(linePoints[0].y, point.y, linePoints[1].y, precision);
  1898. },
  1899. isLineIntersect: function isLineIntersect(line1, line2, notSegment) {
  1900. //线段和线段是否有交点. notSegment代表是直线而不是线段
  1901. var a1 = line1[1].y - line1[0].y;
  1902. var b1 = line1[0].x - line1[1].x;
  1903. var c1 = a1 * line1[0].x + b1 * line1[0].y; //转换成一般式: Ax+By = C
  1904. var a2 = line2[1].y - line2[0].y;
  1905. var b2 = line2[0].x - line2[1].x;
  1906. var c2 = a2 * line2[0].x + b2 * line2[0].y; // 计算交点
  1907. var d = a1 * b2 - a2 * b1; // 当d==0时,两线平行
  1908. if (d == 0) {
  1909. return false;
  1910. } else {
  1911. var x = (b2 * c1 - b1 * c2) / d;
  1912. var y = (a1 * c2 - a2 * c1) / d; // 检测交点是否在两条线段上
  1913. /* if (notSegment || (isInBetween(line1[0].x, x, line1[1].x) || isInBetween(line1[0].y, y, line1[1].y)) &&
  1914. (isInBetween(line2[0].x, x, line2[1].x) || isInBetween(line2[0].y, y, line2[1].y))) {
  1915. return {x,y};
  1916. } */
  1917. if (notSegment || math$1.ifPointAtLineBound({
  1918. x,
  1919. y
  1920. }, line1) && math$1.ifPointAtLineBound({
  1921. x,
  1922. y
  1923. }, line2)) {
  1924. return {
  1925. x,
  1926. y
  1927. };
  1928. }
  1929. }
  1930. },
  1931. getNormal: function getNormal(line2d) {
  1932. //获取二维法向量 方向向内
  1933. var x, y; //要求的向量
  1934. //line2d的向量
  1935. var x1 = line2d.points[1].x - line2d.points[0].x;
  1936. var y1 = line2d.points[1].y - line2d.points[0].y; //假设法向量的x或y固定为1或-1
  1937. if (y1 != 0) {
  1938. x = 1;
  1939. y = -(x1 * x) / y1;
  1940. } else if (x1 != 0) {
  1941. //y如果为0,正常情况x不会是0
  1942. y = 1;
  1943. x = -(y1 * y) / x1;
  1944. } else {
  1945. console.log('两个点一样');
  1946. return null;
  1947. } //判断方向里或者外:
  1948. var vNormal = new THREE.Vector3(x, 0, y);
  1949. var vLine = new THREE.Vector3(x1, 0, y1);
  1950. var vDir = vNormal.cross(vLine);
  1951. if (vDir.y > 0) {
  1952. x *= -1;
  1953. y *= -1;
  1954. }
  1955. return new THREE.Vector2(x, y).normalize();
  1956. },
  1957. getQuaBetween2Vector: function getQuaBetween2Vector(oriVec, newVec, upVec) {
  1958. //获取从oriVec旋转到newVec可以应用的quaternion
  1959. var angle = oriVec.angleTo(newVec);
  1960. var axis = oriVec.clone().cross(newVec).normalize(); //两个up之间
  1961. if (axis.length() == 0) {
  1962. //当夹角为180 或 0 度时,得到的axis为(0,0,0),故使用备用的指定upVec
  1963. return new THREE.Quaternion().setFromAxisAngle(upVec, angle);
  1964. }
  1965. return new THREE.Quaternion().setFromAxisAngle(axis, angle);
  1966. },
  1967. getScaleForConstantSize: function () {
  1968. //获得规定二维大小的mesh的scale值。可以避免因camera的projection造成的mesh视觉大小改变。 来源:tag.updateDisc
  1969. var w;
  1970. var i = new THREE.Vector3(),
  1971. o = new THREE.Vector3(),
  1972. l = new THREE.Vector3(),
  1973. c = new THREE.Vector3(),
  1974. h = new THREE.Vector3();
  1975. return function () {
  1976. var op = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  1977. if (op.width2d) w = op.width2d; //如果恒定二维宽度
  1978. else {
  1979. var currentDis;
  1980. if (op.camera.type == 'OrthographicCamera') {
  1981. //floorplan要直接使用activeControl.camera,主要用到projectionMatrix
  1982. currentDis = (op.camera.right - op.camera.left) / op.camera.zoom / 3;
  1983. } else {
  1984. currentDis = op.position.distanceTo(op.camera.position); //dollhouse要直接使用player.camera, 因为activeControl.camera没有更新matrixWorld
  1985. }
  1986. if (op.nearBound == void 0 && op.farBound != void 0 || op.nearBound != void 0 && op.farBound == void 0) {
  1987. //仅限制最大或最小的话,不判断像素大小,直接限制mesh的scale
  1988. //这个判断也可以写到getScaleForConstantSize里,可以更严谨控制像素宽度,这里只简单计算大小
  1989. var scale;
  1990. if (op.farBound == void 0 && currentDis < op.nearBound) {
  1991. scale = op.scale * currentDis / op.nearBound;
  1992. } else if (op.nearBound == void 0 && currentDis > op.farBound) {
  1993. scale = op.scale * currentDis / op.farBound;
  1994. } else {
  1995. scale = op.scale;
  1996. }
  1997. return scale;
  1998. }
  1999. w = op.maxSize - (op.maxSize - op.minSize) * THREE.MathUtils.smoothstep(currentDis, op.nearBound, op.farBound); //maxSize : mesh要表现的最大像素宽度; nearBound: 最近距离,若比nearBound近,则使用maxSize
  2000. }
  2001. i.copy(op.position).project(op.camera), //tag中心在屏幕上的二维坐标
  2002. o.set(op.dom.clientWidth / 2, op.dom.clientHeight / 2, 1).multiply(i), //转化成px -w/2 到 w/2的范围
  2003. l.set(w / 2, 0, 0).add(o), //加上tag宽度的一半
  2004. c.set(2 / op.dom.clientWidth, 2 / op.dom.clientHeight, 1).multiply(l), //再转回 -1 到 1的范围
  2005. h.copy(c).unproject(op.camera); //再转成三维坐标,求得tag边缘的位置
  2006. var g = h.distanceTo(op.position); //就能得到tag的三维半径
  2007. return g;
  2008. };
  2009. }(),
  2010. //W , H, left, top分别是rect的宽、高、左、上
  2011. getCrossPointAtRect: function getCrossPointAtRect(p1, aim, W, H, left, top) {
  2012. //求射线p1-aim在rect边界上的交点,其中aim在rect范围内,p1则不一定(交点在aim这边的延长线上)
  2013. var x, y, borderX;
  2014. var r = (aim.x - p1.x) / (aim.y - p1.y); //根据相似三角形原理先求出这个比值
  2015. var getX = function getX(y) {
  2016. return r * (y - p1.y) + p1.x;
  2017. };
  2018. var getY = function getY(x) {
  2019. return 1 / r * (x - p1.x) + p1.y;
  2020. };
  2021. if (aim.x >= p1.x) {
  2022. borderX = W + left;
  2023. } else {
  2024. borderX = left;
  2025. }
  2026. x = borderX;
  2027. y = getY(x);
  2028. if (y < top || y > top + H) {
  2029. if (y < top) {
  2030. y = top;
  2031. } else {
  2032. y = top + H;
  2033. }
  2034. x = getX(y);
  2035. }
  2036. return new THREE.Vector2(x, y);
  2037. },
  2038. getDirFromUV: function getDirFromUV(uv) {
  2039. //获取dir 反向计算 - - 二维转三维比较麻烦
  2040. var dirB; //所求 单位向量
  2041. uv.x %= 1;
  2042. if (uv.x < 0) uv.x += 1; //调整为0-1
  2043. var y = Math.cos(uv.y * Math.PI); //uv中纵向可以直接确定y, 根据上面getUVfromDir的反向计算
  2044. var angle = 2 * Math.PI * uv.x - Math.PI; //x/z代表的是角度
  2045. var axisZ; //axis为1代表是正,-1是负数
  2046. if (-Math.PI / 2 <= angle && angle < Math.PI / 2) {
  2047. axisZ = 1; //右半圆
  2048. } else {
  2049. axisZ = -1; //左半圆
  2050. }
  2051. var XDivideZ = Math.tan(angle);
  2052. var z = Math.sqrt((1 - y * y) / (1 + XDivideZ * XDivideZ));
  2053. var x = XDivideZ * z;
  2054. if (z * axisZ < 0) {
  2055. //异号
  2056. z *= -1;
  2057. x *= -1;
  2058. }
  2059. x *= -1; //计算完成后这里不能漏掉 *= -1
  2060. dirB = new THREE.Vector3(x, y, z); //理想状态下x和z和anotherDir相同
  2061. return dirB;
  2062. },
  2063. getUVfromDir: function getUVfromDir(dir) {
  2064. //获取UV 同shader里的计算
  2065. var dir = dir.clone();
  2066. dir.x *= -1; //计算前这里不能漏掉 *= -1 见shader
  2067. var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5; //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
  2068. var ty = Math.acos(dir.y) / Math.PI;
  2069. return {
  2070. x: tx,
  2071. y: ty
  2072. }; //理想状态下tx相同
  2073. },
  2074. crossRight: function crossRight(vec3, matrix) {
  2075. //向量右乘矩阵,不能用向量的applyMatrix4(左乘)
  2076. var e = matrix.elements;
  2077. var v = new THREE.Vector3();
  2078. v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3];
  2079. v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7];
  2080. v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]; //v.w不要
  2081. return v;
  2082. },
  2083. getNormalDir: function getNormalDir(point, supportsTiles, currentPano) {
  2084. //获取A单位法线
  2085. /* console.log("lookVector:")
  2086. console.log(objects.player.cameraControls.activeControl.lookVector) */
  2087. var dir = point.clone().sub(currentPano.position); //OA
  2088. /* console.log("A的dir(无matrix转化):")
  2089. console.log(dir.clone().normalize()); */
  2090. if (supportsTiles) {
  2091. var matrixWorld = currentPano.rot90Matrix.clone(); //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
  2092. } else {
  2093. var matrixWorld = currentPano.matrixWorld.clone();
  2094. }
  2095. dir = this.crossRight(dir, matrixWorld); //右乘matrixWorld 得matrix转化的向量
  2096. dir.normalize();
  2097. /* var b = player.currentPano.skyboxMesh.matrixWorld.clone().getInverse(player.currentPano.skyboxMesh.matrixWorld)
  2098. console.log(crossRight(dir,b).normalize()) */
  2099. return dir;
  2100. },
  2101. getDirByLonLat: function getDirByLonLat(lon, lat) {
  2102. var dir = new THREE.Vector3();
  2103. var phi = THREE.MathUtils.degToRad(90 - lat);
  2104. var theta = THREE.MathUtils.degToRad(lon);
  2105. dir.x = Math.sin(phi) * Math.cos(theta);
  2106. dir.y = Math.cos(phi);
  2107. dir.z = Math.sin(phi) * Math.sin(theta);
  2108. return dir;
  2109. },
  2110. //0,0 => (1,0,0) 270=>(0,0,-1)
  2111. getLineIntersect2() {
  2112. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  2113. //得两条直线在其向量构成的面的法线方向的交点,投影在线上点的中点。
  2114. if (o.A != void 0) {
  2115. // Ap1为一条线,Bp2为一条线
  2116. var A = o.A;
  2117. var B = o.B;
  2118. var p1 = o.p1 || new THREE.Vector3().addVctors(A, o.dir0);
  2119. var p2 = o.p2 || new THREE.Vector3().addVctors(B, o.dir1);
  2120. var dir0 = o.dir0 || new THREE.Vector3().subVectors(p1, A);
  2121. var dir1 = o.dir1 || new THREE.Vector3().subVectors(p2, B);
  2122. }
  2123. if (A.equals(B)) return {
  2124. pos3d: p1.clone()
  2125. }; //寻找两个向量所在的面
  2126. var normal = dir0.clone().cross(dir1); //面的法线
  2127. //先把整体旋转到使在xz平面上,求完交点再转回来
  2128. var qua = math$1.getQuaBetween2Vector(normal, new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, 1, 0));
  2129. var newPoints = [A, B, p1, p2].map(function (e) {
  2130. return e.clone().applyQuaternion(qua);
  2131. });
  2132. var pos2d = math$1.isLineIntersect([{
  2133. x: newPoints[0].x,
  2134. y: newPoints[0].z
  2135. }, {
  2136. x: newPoints[2].x,
  2137. y: newPoints[2].z
  2138. }], [{
  2139. x: newPoints[1].x,
  2140. y: newPoints[1].z
  2141. }, {
  2142. x: newPoints[3].x,
  2143. y: newPoints[3].z
  2144. }], true);
  2145. var quaInverse = qua.clone().invert();
  2146. var pos3d = new THREE.Vector3(pos2d.x, 0, pos2d.y);
  2147. var pos3d1 = pos3d.clone().setY(newPoints[0].y);
  2148. var pos3d2 = pos3d.clone().setY(newPoints[1].y);
  2149. pos3d1.applyQuaternion(quaInverse);
  2150. pos3d2.applyQuaternion(quaInverse);
  2151. pos3d = new THREE.Vector3().addVectors(pos3d1, pos3d2).multiplyScalar(0.5);
  2152. return {
  2153. pos3d,
  2154. mid1: pos3d1,
  2155. mid2: pos3d2
  2156. };
  2157. },
  2158. getLineIntersect(o) {
  2159. //两条三维直线相交 //取两线最短线段中心点 并且不能超出起点
  2160. o = o || {};
  2161. if (o.A != void 0) {
  2162. // Ap1为一条线,Bp2为一条线
  2163. var A = o.A;
  2164. var B = o.B;
  2165. var p1 = o.p1;
  2166. var p2 = o.p2;
  2167. }
  2168. if (A.equals(B)) return {
  2169. pos3d: p1.clone()
  2170. };
  2171. /* console.log("v1:")
  2172. console.log(A.clone().sub(p1).normalize())
  2173. console.log("v2:")
  2174. console.log(B.clone().sub(p2).normalize())
  2175. */
  2176. //调试热点夹角
  2177. var line1 = p1.clone().sub(A).normalize();
  2178. var line2 = p2.clone().sub(B).normalize();
  2179. line1.angleTo(line2); //var pano = player.model.panos.index[player.posGets.list[1]]
  2180. //console.log('真实两线夹角: ', THREE.MathUtils.radToDeg(angle)) /*+ "旧夹角min: "+getAngle(pano.recentAngleScore)+"("+pano.recentAngleScore+")" */
  2181. //----------
  2182. var compute = function compute() {
  2183. var pos3d;
  2184. var ux = p1.x - A.x;
  2185. var uy = p1.y - A.y;
  2186. var uz = p1.z - A.z;
  2187. var vx = p2.x - B.x;
  2188. var vy = p2.y - B.y;
  2189. var vz = p2.z - B.z;
  2190. var wx = A.x - B.x;
  2191. var wy = A.y - B.y;
  2192. var wz = A.z - B.z;
  2193. var a = ux * ux + uy * uy + uz * uz; //u*u
  2194. var b = ux * vx + uy * vy + uz * vz; //u*v
  2195. var c = vx * vx + vy * vy + vz * vz; //v*v
  2196. var d = ux * wx + uy * wy + uz * wz; //u*w
  2197. var e = vx * wx + vy * wy + vz * wz; //v*w
  2198. var dt = a * c - b * b;
  2199. var sd = dt;
  2200. var td = dt;
  2201. var sn = 0.0; //sn = be-cd
  2202. var tn = 0.0; //tn = ae-bd
  2203. var behind = function (index) {
  2204. //在后方交点的话,直接其中一个点 不用两posget点中心点是因为可能从不同方位 距离很大
  2205. pos3d = (index == 1 ? p1 : p2).clone(); //console.log(pos3d , ' 在后方交点,使用点' + index)
  2206. }.bind(this);
  2207. if (math$1.closeTo(dt, 0.0)) {
  2208. //两直线平行
  2209. sn = 0.0; //在s上指定取s0
  2210. sd = 1.0; //防止计算时除0错误
  2211. tn = e; //按(公式3)求tc
  2212. td = c;
  2213. } else {
  2214. sn = b * e - c * d;
  2215. tn = a * e - b * d;
  2216. if (sn < 0.0) {
  2217. //最近点在s起点以外,同平行条件
  2218. behind(1);
  2219. return {
  2220. pos3d,
  2221. behind: true
  2222. };
  2223. }
  2224. }
  2225. if (tn < 0.0) {
  2226. //最近点在t起点以外
  2227. behind(2);
  2228. return {
  2229. pos3d,
  2230. behind: true
  2231. };
  2232. }
  2233. /* else if (tn > td){ //超出终点不限制
  2234. tn = td;
  2235. if ((-d + b) < 0.0)
  2236. sn = 0.0;
  2237. else if ((-d + b) > a)
  2238. sn = sd;
  2239. else
  2240. {
  2241. sn = (-d + b);
  2242. sd = a;
  2243. }
  2244. } */
  2245. var sc = 0.0;
  2246. var tc = 0.0;
  2247. if (math$1.closeTo(sn, 0.0)) sc = 0.0;else sc = sn / sd;
  2248. if (math$1.closeTo(tn, 0.0)) tc = 0.0;else tc = tn / td; //两个最近点
  2249. var mid1 = new THREE.Vector3(A.x + sc * ux, A.y + sc * uy, A.z + sc * uz);
  2250. var mid2 = new THREE.Vector3(B.x + tc * vx, B.y + tc * vy, B.z + tc * vz);
  2251. /* console.log("v11:")
  2252. console.log(A.clone().sub(mid1).normalize())
  2253. console.log("v22:")
  2254. console.log(B.clone().sub(mid2).normalize()) */
  2255. //console.log('另一个结果', math.getLineIntersect2(o)) //结果一样的,只是没有限制后方交点
  2256. var r = {
  2257. pos3d: mid1.clone().add(mid2).multiplyScalar(0.5),
  2258. mid1,
  2259. mid2
  2260. };
  2261. return r;
  2262. };
  2263. return compute(); //https://blog.csdn.net/u011511587/article/details/52063663 三维空间两直线/线段最短距离、线段计算算法
  2264. },
  2265. getShapeGeo: function getShapeGeo(points, holes) {
  2266. //获取任意形状(多边形或弧形)的形状面 //quadraticCurveTo() 这是弧形的含函数
  2267. var shape = new THREE.Shape();
  2268. shape.moveTo(points[0].x, points[0].y);
  2269. for (var i = 1, len = points.length; i < len; i++) {
  2270. shape.lineTo(points[i].x, points[i].y);
  2271. }
  2272. /* var holePath = new THREE.Path()
  2273. .moveTo( 20, 10 )
  2274. .absarc( 10, 10, 10, 0, Math.PI * 2, true )
  2275. arcShape.holes.push( holePath );
  2276. */
  2277. if (holes) {
  2278. //挖空
  2279. holes.forEach(function (points) {
  2280. var holePath = new THREE.Path();
  2281. holePath.moveTo(points[0].x, points[0].y);
  2282. for (var i = 1, len = points.length; i < len; i++) {
  2283. holePath.lineTo(points[i].x, points[i].y);
  2284. }
  2285. shape.holes.push(holePath);
  2286. });
  2287. }
  2288. var geometry = new THREE.ShapeBufferGeometry(shape); //ShapeGeometry
  2289. return geometry;
  2290. },
  2291. getUnPosPlaneGeo: function () {
  2292. //获取还没有赋值位置的plane geometry
  2293. var e = new Uint16Array([0, 1, 2, 0, 2, 3]),
  2294. // , t = new Float32Array([-.5, -.5, 0, .5, -.5, 0, .5, .5, 0, -.5, .5, 0])
  2295. i = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),
  2296. g = new THREE.BufferGeometry();
  2297. g.setIndex(new THREE.BufferAttribute(e, 1)), //g.setAttribute("position", new n.BufferAttribute(t, 3)),
  2298. g.setAttribute('uv', new THREE.BufferAttribute(i, 2));
  2299. return function () {
  2300. return g;
  2301. };
  2302. }(),
  2303. getPlaneGeo: function getPlaneGeo(A, B, C, D) {
  2304. var geo = this.getUnPosPlaneGeo().clone();
  2305. var pos = new Float32Array([A.x, A.y, A.z, B.x, B.y, B.z, C.x, C.y, C.z, D.x, D.y, D.z]);
  2306. geo.setAttribute('position', new THREE.BufferAttribute(pos, 3));
  2307. geo.computeVertexNormals();
  2308. geo.computeBoundingSphere(); //for raycaster
  2309. return geo;
  2310. },
  2311. drawPlane: function drawPlane(A, B, C, D, material) {
  2312. var wall = new THREE.Mesh(this.getPlaneGeo(A, B, C, D), material);
  2313. return wall;
  2314. },
  2315. movePlane: function movePlane(mesh, A, B, C, D) {
  2316. var pos = new Float32Array([A.x, A.y, A.z, B.x, B.y, B.z, C.x, C.y, C.z, D.x, D.y, D.z]);
  2317. mesh.geometry.setAttribute('position', new THREE.BufferAttribute(pos, 3));
  2318. mesh.geometry.computeBoundingSphere(); //for checkIntersect
  2319. },
  2320. getAngle(vec1, vec2, axis) {
  2321. var angle = vec1.angleTo(vec2);
  2322. var axis_ = vec1.clone().cross(vec2);
  2323. if (axis_[axis] < 0) {
  2324. angle *= -1;
  2325. }
  2326. return angle;
  2327. },
  2328. linearClamp(value, xArr, yArr) {
  2329. if (arguments.length == 5) {
  2330. xArr = [arguments[1], arguments[2]];
  2331. yArr = [arguments[3], arguments[4]];
  2332. }
  2333. var len = xArr.length;
  2334. if (value <= xArr[0]) return yArr[0];
  2335. if (value >= xArr[len - 1]) return yArr[len - 1];
  2336. var i = 0;
  2337. while (++i < len) {
  2338. if (value < xArr[i]) {
  2339. var x1 = xArr[i - 1],
  2340. x2 = xArr[i],
  2341. y1 = yArr[i - 1],
  2342. y2 = yArr[i];
  2343. value = y1 + (y2 - y1) * (value - x1) / (x2 - x1);
  2344. break;
  2345. }
  2346. }
  2347. return value;
  2348. },
  2349. isInsideFrustum(bounding, camera) {
  2350. // bounding是否在视野范围内有可见部分(视野就是一个锥状box)
  2351. var frustumMatrix = new THREE.Matrix4();
  2352. frustumMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
  2353. var frustum = new THREE.Frustum();
  2354. frustum.setFromProjectionMatrix(frustumMatrix);
  2355. if (bounding instanceof THREE.Sphere) {
  2356. return frustum.intersectsSphere(bounding);
  2357. } else {
  2358. return frustum.intersectsBox(bounding);
  2359. }
  2360. },
  2361. getStandardYaw(yaw1, yaw2) {
  2362. //使yaw1过渡到yaw2时朝角度差小的那边走。如果差距大于半个圆,就要反个方向转(把大的那个数字减去360度)
  2363. if (Math.abs(yaw1 - yaw2) > Math.PI) {
  2364. yaw1 > yaw2 ? yaw1 -= Math.PI * 2 : yaw2 -= Math.PI * 2;
  2365. }
  2366. return [yaw1, yaw2];
  2367. }
  2368. };
  2369. var easing = {}; //渐变曲线函数,反应加速度的变化
  2370. //currentTime:x轴当前时间(从0-到duration), startY:起始点, duration:总时长, wholeY:路程 (即endY-startY)
  2371. //参数基本是 x, 0, 1, 1
  2372. /*
  2373. easeOut 基本是y= m * (x-dur)^k + n, 若k为偶数,m<0, 若k为奇数,m>0; (因为偶数的话必须开口向下才能获得斜率递减的递增的那段,而奇数是对称的,单调递增. )
  2374. 根据x=0时y=0, x=dur时y=S , 得 n = S,m = -S/(-dur)^k
  2375. */
  2376. easing.getEaseOut = function (k) {
  2377. // k 是>=2的整数. 越大变化率越大, 相同初始速度所需要时间越久
  2378. var easeFun;
  2379. k = Math.round(k);
  2380. if (k < 2) {
  2381. k = Math.PI / 2;
  2382. easeFun = easing.easeOutSine;
  2383. } else {
  2384. easeFun = function easeFun(currentTime, startY, wholeY, duration) {
  2385. if (k > 2) {
  2386. console.log(k);
  2387. }
  2388. return -wholeY / Math.pow(-duration, k) * Math.pow(currentTime - duration, k) + wholeY;
  2389. };
  2390. }
  2391. return {
  2392. k,
  2393. easeFun
  2394. };
  2395. };
  2396. easing.linearTween = function (currentTime, startY, wholeY, duration) {
  2397. return wholeY * currentTime / duration + startY;
  2398. }, easing.easeInQuad = function (currentTime, startY, wholeY, duration) {
  2399. return currentTime /= duration, wholeY * currentTime * currentTime + startY;
  2400. }, easing.easeOutQuad = function (currentTime, startY, wholeY, duration) {
  2401. // 如套上实际的距离S和时长dur, y = - S / dur *(x^2-2x) 当s为1,dur为1时,是 y = -(x-1)^2 + 1 , 在0-1中是斜率递减的递增函数. 导数- S / dur *(2x-2 ) 可求出实时速度 故在0这一时刻,速度为 2S/dur
  2402. return currentTime /= duration, -wholeY * currentTime * (currentTime - 2) + startY;
  2403. }, easing.easeInOutQuad = function (currentTime, startY, wholeY, duration) {
  2404. return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime + startY : (currentTime--, -wholeY / 2 * (currentTime * (currentTime - 2) - 1) + startY);
  2405. }, easing.easeInCubic = function (currentTime, startY, wholeY, duration) {
  2406. return currentTime /= duration, wholeY * currentTime * currentTime * currentTime + startY;
  2407. }, easing.easeOutCubic = function (currentTime, startY, wholeY, duration) {
  2408. // y = S / dur^3 *(x-dur)^3 + S,对称中心是(dur,S),从0-dur是 斜率递减的递增函数,导数为3S/dur^3 * (x-dur)^2, 0时速度为3S/dur
  2409. return currentTime /= duration, currentTime--, wholeY * (currentTime * currentTime * currentTime + 1) + startY;
  2410. }, easing.easeInOutCubic = function (currentTime, startY, wholeY, duration) {
  2411. return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime * currentTime + startY : (currentTime -= 2, wholeY / 2 * (currentTime * currentTime * currentTime + 2) + startY);
  2412. }, easing.easeInQuart = function (currentTime, startY, wholeY, duration) {
  2413. return currentTime /= duration, wholeY * currentTime * currentTime * currentTime * currentTime + startY;
  2414. }, easing.easeOutQuart = function (currentTime, startY, wholeY, duration) {
  2415. //根据上面的计算,估计0时速度应该是4S/dur吧……
  2416. return currentTime /= duration, currentTime--, -wholeY * (currentTime * currentTime * currentTime * currentTime - 1) + startY;
  2417. }, easing.easeInOutQuart = function (currentTime, startY, wholeY, duration) {
  2418. return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime * currentTime * currentTime + startY : (currentTime -= 2, -wholeY / 2 * (currentTime * currentTime * currentTime * currentTime - 2) + startY);
  2419. }, easing.easeInQuint = function (currentTime, startY, wholeY, duration) {
  2420. return currentTime /= duration, wholeY * currentTime * currentTime * currentTime * currentTime * currentTime + startY;
  2421. }, easing.easeOutQuint = function (currentTime, startY, wholeY, duration) {
  2422. return currentTime /= duration, currentTime--, wholeY * (currentTime * currentTime * currentTime * currentTime * currentTime + 1) + startY;
  2423. }, easing.easeInOutQuint = function (currentTime, startY, wholeY, duration) {
  2424. return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime * currentTime * currentTime * currentTime + startY : (currentTime -= 2, wholeY / 2 * (currentTime * currentTime * currentTime * currentTime * currentTime + 2) + startY);
  2425. }, easing.easeInSine = function (currentTime, startY, wholeY, duration) {
  2426. return -wholeY * Math.cos(currentTime / duration * (Math.PI / 2)) + wholeY + startY;
  2427. }, easing.easeOutSine = function (currentTime, startY, wholeY, duration) {
  2428. // y' = S * PI / 2 / dur * cos(PI/2/dur * x)
  2429. return wholeY * Math.sin(currentTime / duration * (Math.PI / 2)) + startY;
  2430. }, easing.easeInOutSine = function (currentTime, startY, wholeY, duration) {
  2431. return -wholeY / 2 * (Math.cos(Math.PI * currentTime / duration) - 1) + startY;
  2432. }, easing.easeInExpo = function (currentTime, startY, wholeY, duration) {
  2433. return wholeY * Math.pow(2, 10 * (currentTime / duration - 1)) + startY;
  2434. }, easing.easeOutExpo = function (currentTime, startY, wholeY, duration) {
  2435. return wholeY * (-Math.pow(2, -10 * currentTime / duration) + 1) + startY;
  2436. }, easing.easeInOutExpo = function (currentTime, startY, wholeY, duration) {
  2437. return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * Math.pow(2, 10 * (currentTime - 1)) + startY : (currentTime--, wholeY / 2 * (-Math.pow(2, -10 * currentTime) + 2) + startY);
  2438. }, easing.easeInCirc = function (currentTime, startY, wholeY, duration) {
  2439. return currentTime /= duration, -wholeY * (Math.sqrt(1 - currentTime * currentTime) - 1) + startY;
  2440. }, easing.easeOutCirc = function (currentTime, startY, wholeY, duration) {
  2441. return currentTime /= duration, currentTime--, wholeY * Math.sqrt(1 - currentTime * currentTime) + startY;
  2442. }, easing.easeInOutCirc = function (currentTime, startY, wholeY, duration) {
  2443. return currentTime /= duration / 2, currentTime < 1 ? -wholeY / 2 * (Math.sqrt(1 - currentTime * currentTime) - 1) + startY : (currentTime -= 2, wholeY / 2 * (Math.sqrt(1 - currentTime * currentTime) + 1) + startY);
  2444. }, easing.easeInElastic = function (currentTime, startY, wholeY, duration) {
  2445. var r = 1.70158,
  2446. o = 0,
  2447. a = wholeY;
  2448. return 0 === currentTime ? startY : 1 === (currentTime /= duration) ? startY + wholeY : (o || (o = 0.3 * duration), a < Math.abs(wholeY) ? (a = wholeY, r = o / 4) : r = o / (2 * Math.PI) * Math.asin(wholeY / a), -(a * Math.pow(2, 10 * (currentTime -= 1)) * Math.sin((currentTime * duration - r) * (2 * Math.PI) / o)) + startY);
  2449. }, easing.easeOutElastic = function (currentTime, startY, wholeY, duration) {
  2450. var r = 1.70158,
  2451. o = 0,
  2452. a = wholeY;
  2453. return 0 === currentTime ? startY : 1 === (currentTime /= duration) ? startY + wholeY : (o || (o = 0.3 * duration), a < Math.abs(wholeY) ? (a = wholeY, r = o / 4) : r = o / (2 * Math.PI) * Math.asin(wholeY / a), a * Math.pow(2, -10 * currentTime) * Math.sin((currentTime * duration - r) * (2 * Math.PI) / o) + wholeY + startY);
  2454. }, easing.easeInOutElastic = function (currentTime, startY, wholeY, duration) {
  2455. var r = 1.70158,
  2456. o = 0,
  2457. a = wholeY;
  2458. return 0 === currentTime ? startY : 2 === (currentTime /= duration / 2) ? startY + wholeY : (o || (o = duration * (0.3 * 1.5)), a < Math.abs(wholeY) ? (a = wholeY, r = o / 4) : r = o / (2 * Math.PI) * Math.asin(wholeY / a), currentTime < 1 ? -0.5 * (a * Math.pow(2, 10 * (currentTime -= 1)) * Math.sin((currentTime * duration - r) * (2 * Math.PI) / o)) + startY : a * Math.pow(2, -10 * (currentTime -= 1)) * Math.sin((currentTime * duration - r) * (2 * Math.PI) / o) * 0.5 + wholeY + startY);
  2459. }, easing.easeInBack = function (currentTime, startY, wholeY, duration, r) {
  2460. return void 0 === r && (r = 1.70158), wholeY * (currentTime /= duration) * currentTime * ((r + 1) * currentTime - r) + startY;
  2461. }, easing.easeOutBack = function (currentTime, startY, wholeY, duration, r) {
  2462. return void 0 === r && (r = 1.70158), wholeY * ((currentTime = currentTime / duration - 1) * currentTime * ((r + 1) * currentTime + r) + 1) + startY;
  2463. }, easing.easeInOutBack = function (currentTime, startY, wholeY, duration, r) {
  2464. return void 0 === r && (r = 1.70158), (currentTime /= duration / 2) < 1 ? wholeY / 2 * (currentTime * currentTime * (((r *= 1.525) + 1) * currentTime - r)) + startY : wholeY / 2 * ((currentTime -= 2) * currentTime * (((r *= 1.525) + 1) * currentTime + r) + 2) + startY;
  2465. }, easing.easeOutBounce = function (currentTime, startY, wholeY, duration) {
  2466. return (currentTime /= duration) < 1 / 2.75 ? wholeY * (7.5625 * currentTime * currentTime) + startY : currentTime < 2 / 2.75 ? wholeY * (7.5625 * (currentTime -= 1.5 / 2.75) * currentTime + 0.75) + startY : currentTime < 2.5 / 2.75 ? wholeY * (7.5625 * (currentTime -= 2.25 / 2.75) * currentTime + 0.9375) + startY : wholeY * (7.5625 * (currentTime -= 2.625 / 2.75) * currentTime + 0.984375) + startY;
  2467. }, easing.easeInBounce = function (currentTime, startY, wholeY, r) {
  2468. return wholeY - easing.easeOutBounce(r - currentTime, 0, wholeY, r) + startY;
  2469. }, easing.easeInOutBounce = function (currentTime, startY, wholeY, r) {
  2470. return currentTime < r / 2 ? 0.5 * easing.easeInBounce(2 * currentTime, 0, wholeY, r) + startY : 0.5 * easing.easeOutBounce(x, 2 * currentTime - r, 0, wholeY, r) + 0.5 * wholeY + startY;
  2471. };
  2472. var transitions$1 = {
  2473. globalDone: null,
  2474. funcs: [],
  2475. counter: 0,
  2476. uniqueID: 0,
  2477. start(e, t, i) {
  2478. var r = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  2479. var o = arguments.length > 4 ? arguments[4] : undefined;
  2480. var a = arguments.length > 5 ? arguments[5] : undefined;
  2481. var s = arguments.length > 6 ? arguments[6] : undefined;
  2482. var cancelFun = arguments.length > 7 ? arguments[7] : undefined;
  2483. var ignoreFirstFrame = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : true;
  2484. var object = {
  2485. func: e,
  2486. current: -r * Math.abs(t),
  2487. duration: (1 - Math.max(r, 0)) * Math.abs(t),
  2488. done: i,
  2489. easing: o || easing.linearTween,
  2490. cycling: t < 0,
  2491. running: !0,
  2492. debug: r < 0,
  2493. name: a || 'T' + this.counter,
  2494. id: void 0 === s ? this.counter : s,
  2495. paused: !1,
  2496. cancelFun: cancelFun,
  2497. //取消时执行的函数
  2498. updateCount: 0,
  2499. //add
  2500. ignoreFirstFrame //add
  2501. };
  2502. this.funcs.push(object);
  2503. e(0, 16);
  2504. this.counter += 1;
  2505. return e;
  2506. },
  2507. trigger(e) {
  2508. var t = void 0 === e.delayRatio ? 0 : e.delayRatio,
  2509. i = e.func || function () {},
  2510. r = void 0 === e.duration ? 0 : e.duration;
  2511. void 0 !== e.cycling && e.cycling && (r = -Math.abs(r));
  2512. var o = e.done || null,
  2513. a = e.easing || easing.linearTween,
  2514. s = e.name || 'R' + this.counter,
  2515. l = void 0 === e.id ? this.counter : e.id;
  2516. return this.start(i, r, o, t, a, s, l);
  2517. },
  2518. setTimeout(e, t, i) {
  2519. var n = void 0 === i ? this.counter : i;
  2520. return this.trigger({
  2521. done: e,
  2522. duration: void 0 === t ? 0 : t,
  2523. name: 'O' + this.counter,
  2524. id: n
  2525. });
  2526. },
  2527. pause() {
  2528. this.paused = !0;
  2529. },
  2530. resume() {
  2531. this.paused = !1;
  2532. },
  2533. update(e) {
  2534. this.funcs.forEach(function (t) {
  2535. if (t.updateCount++ == 0 && t.ignoreFirstFrame) return; //add start可能发生在一帧中任意时刻,而每次update的是在一帧中的固定时刻,所以从start到第一次update的时间并不是所传入的delta,该delta 是上一帧的update到这一帧的update的耗时。 故去掉了第一次的update,相当于延迟一帧再update.
  2536. if (!(t.paused || (t.current += 1e3 * e, t.current < 0))) if (t.current >= t.duration && !t.cycling) {
  2537. var i = t.easing(1, 0, 1, 1);
  2538. t.func(i, 1e3 * e), t.done && t.done(), t.running = !1;
  2539. } else {
  2540. var n = t.easing(t.current % t.duration / t.duration, 0, 1, 1),
  2541. r = t.func(n, 1e3 * e) || !1;
  2542. r && (t.done && t.done(), t.running = !1);
  2543. }
  2544. });
  2545. var t = this.funcs.length;
  2546. this.funcs = this.funcs.filter(function (e) {
  2547. return e.running;
  2548. });
  2549. var i = this.funcs.length;
  2550. if (t > 0 && 0 === i && this.globalDone) {
  2551. var n = this.globalDone;
  2552. this.globalDone = null, n();
  2553. }
  2554. },
  2555. adjustSpeed(e, t) {
  2556. for (var i = this.getById(e), n = 0; n < i.length; n++) {
  2557. var r = i[n];
  2558. r.duration /= t, r.current /= t;
  2559. }
  2560. },
  2561. getById(e) {
  2562. return this.funcs.filter(function (t) {
  2563. return e === t.id;
  2564. });
  2565. },
  2566. get(e) {
  2567. for (var t = 0; t < this.funcs.length; t += 1) {
  2568. if (this.funcs[t].func === e) return this.funcs[t];
  2569. }
  2570. return null;
  2571. },
  2572. isRunning(e) {
  2573. var t = this.get(e);
  2574. return null !== t && t.running;
  2575. },
  2576. countActive() {
  2577. for (var e = 0, t = 0; t < this.funcs.length; t += 1) {
  2578. e += this.funcs[t].running;
  2579. }
  2580. return e;
  2581. },
  2582. listActive() {
  2583. for (var e = [], t = 0; t < this.funcs.length; t += 1) {
  2584. this.funcs[t].running && e.push(this.funcs[t].name);
  2585. }
  2586. return e;
  2587. },
  2588. done(e) {
  2589. this.globalDone = e;
  2590. },
  2591. cancelById: function cancelById(e, dealCancelFun) {
  2592. //xzw add dealDone
  2593. var t = void 0 === e ? 0 : e;
  2594. this.funcs = this.funcs.filter(function (e) {
  2595. var is = e.id == t;
  2596. if (is && dealCancelFun) {
  2597. e.cancelFun && e.cancelFun();
  2598. }
  2599. return !is;
  2600. });
  2601. },
  2602. cancel(e) {
  2603. this.funcs = this.funcs.filter(function (t) {
  2604. return t.func !== e;
  2605. });
  2606. },
  2607. getUniqueId() {
  2608. return this.uniqueID -= 1, this.uniqueID;
  2609. }
  2610. };
  2611. function _createForOfIteratorHelper$8(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$8(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  2612. function _unsupportedIterableToArray$8(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$8(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$8(o, minLen); }
  2613. function _arrayLikeToArray$8(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  2614. var lastCallTime = 0;
  2615. var common = {
  2616. delayOneFrame(e) {
  2617. window.setTimeout(e, 1);
  2618. },
  2619. normalizeUrl(e) {
  2620. return e.replace('https://', 'http://');
  2621. },
  2622. domainFromUrl(e) {
  2623. var t = /^([^:]*:\/\/)?(www\.)?([^\/]+)/.exec(e);
  2624. return t ? t[3] : e;
  2625. },
  2626. average(e, t) {
  2627. if (0 === e.length) return null;
  2628. for (var i = 0, n = 0, r = 0; r < e.length; r++) {
  2629. var o = t ? e[r][t] : e[r];
  2630. i += o, n++;
  2631. }
  2632. return i / n;
  2633. },
  2634. countUnique(e) {
  2635. for (var t = {}, i = 0; i < e.length; i++) {
  2636. t[e[i]] = 1 + (t[e[i]] || 0);
  2637. }
  2638. return Object.keys(t).length;
  2639. },
  2640. averageVectors(e, t) {
  2641. var i = new THREE.Vector3();
  2642. if (0 === e.length) return i;
  2643. for (var r = 0, o = 0; o < e.length; o++) {
  2644. var a = t ? e[o][t] : e[o];
  2645. i.add(a), r++;
  2646. }
  2647. return i.divideScalar(r);
  2648. },
  2649. equalLists(e, t) {
  2650. if (e.length !== t.length) return !1;
  2651. for (var i = 0; i < e.length; i++) {
  2652. if (e[i] !== t[i]) return !1;
  2653. }
  2654. return !0;
  2655. },
  2656. lowerMedian(e, t) {
  2657. if (0 === e.length) return null;
  2658. t = t || 2, e.sort(function (e, t) {
  2659. return e - t;
  2660. });
  2661. var i = Math.floor(e.length / t);
  2662. return e[i];
  2663. },
  2664. stableSort(e, t) {
  2665. return e.map(function (e, t) {
  2666. return {
  2667. value: e,
  2668. index: t
  2669. };
  2670. }).sort(function (e, i) {
  2671. var n = t(e.value, i.value);
  2672. return 0 !== n ? n : e.index - i.index;
  2673. }).map(function (e) {
  2674. return e.value;
  2675. });
  2676. },
  2677. sortByScore: function sortByScore(list, request, rank) {
  2678. var i = request ? common.filterAll(list, request) : list;
  2679. return 0 === i.length ? [] : i = i.map(function (e) {
  2680. var scores = rank.map(function (f) {
  2681. return f(e);
  2682. }); //add
  2683. return {
  2684. item: e,
  2685. scores,
  2686. score: scores.reduce(function (t, i) {
  2687. return t + i;
  2688. }, 0)
  2689. };
  2690. }).sort(function (e, t) {
  2691. return t.score - e.score;
  2692. });
  2693. },
  2694. filterAll(e, t) {
  2695. return e.filter(function (e) {
  2696. return t.every(function (t) {
  2697. return t(e);
  2698. });
  2699. });
  2700. },
  2701. formatDate(e) {
  2702. return [e.getFullYear(), e.getMonth() + 1, e.getDate()].join('-');
  2703. },
  2704. formatDatetime(e) {
  2705. return [e.getFullYear(), e.getMonth() + 1, e.getDate(), e.getHours(), e.getMinutes()].join('-');
  2706. },
  2707. randomString(e) {
  2708. for (var t = '', i = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', n = 0; n < e; n++) {
  2709. t += i.charAt(Math.floor(Math.random() * i.length));
  2710. }
  2711. return t;
  2712. },
  2713. uint8ToBase64(e, t) {
  2714. t && 'number' == typeof t || (t = 8192);
  2715. for (var i = [], n = 0; n < e.length; n += t) {
  2716. i.push(String.fromCharCode.apply(null, e.subarray(n, n + t)));
  2717. }
  2718. return btoa(i.join(''));
  2719. },
  2720. uuid4: function e(t) {
  2721. return t ? (t ^ 16 * Math.random() >> t / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, e);
  2722. },
  2723. nth(e) {
  2724. return e %= 10, 1 === e ? e + 'st' : 2 === e ? e + 'nd' : 3 === e ? e + 'rd' : e + 'th';
  2725. },
  2726. extendObject(e, t) {
  2727. return Object.keys(t).forEach(function (i) {
  2728. e[i] = t[i];
  2729. }), e;
  2730. },
  2731. deepExtend: function e(t) {
  2732. t = t || {};
  2733. for (var i = 1; i < arguments.length; i++) {
  2734. var n = arguments[i];
  2735. if (n) for (var r in n) {
  2736. n.hasOwnProperty(r) && ('object' == typeof n[r] ? t[r] = e(t[r], n[r]) : t[r] = n[r]);
  2737. }
  2738. }
  2739. return t;
  2740. },
  2741. inherit(e, t) {
  2742. e.prototype = Object.create(t.prototype), e.prototype.constructor = e;
  2743. },
  2744. extend(e, t) {
  2745. for (var i in t.prototype) {
  2746. e.prototype[i] = t.prototype[i];
  2747. }
  2748. },
  2749. //额外添加的
  2750. extendObject(e, t) {
  2751. if (!(t instanceof Object)) return; //许钟文 加 ie有遇到非object的数据
  2752. return Object.keys(t).forEach(function (i) {
  2753. e[i] = t[i];
  2754. }), e;
  2755. },
  2756. _textureCache: {},
  2757. loadTextureFromCache(c) {
  2758. return this._textureCache[c] || (this._textureCache[c] = getTexture(c)), this._textureCache[c];
  2759. },
  2760. extend(c, d) {
  2761. for (var f in d.prototype) {
  2762. c.prototype[f] = d.prototype[f];
  2763. }
  2764. },
  2765. valueFromHash(e, t) {
  2766. var i = new RegExp('[#&?]' + e + '=([^#&?]*)'),
  2767. n = i.exec(window.location.href);
  2768. if (!n) return t;
  2769. var r = n[1];
  2770. return 'boolean' == typeof t ? 'true' === r || '1' === r : 'number' == typeof t ? parseFloat(r) : window.decodeURIComponent(r);
  2771. },
  2772. deepFreeze(o) {
  2773. var _this = this;
  2774. Object.freeze(o);
  2775. Object.getOwnPropertyNames(o).forEach(function (prop) {
  2776. if (o.hasOwnProperty(prop) && o[prop] !== null && (typeof o[prop] === 'object' || typeof o[prop] === 'function') && !Object.isFrozen(o[prop])) {
  2777. _this.deepFreeze(o[prop]);
  2778. }
  2779. });
  2780. return o;
  2781. },
  2782. defaultValue(value) {
  2783. if (value != void 0 && typeof value === 'object') {
  2784. return Array.isArray(value) ? [] : {};
  2785. }
  2786. },
  2787. randomUnique() {
  2788. return crypto.getRandomValues(new Uint32Array(1))[0];
  2789. },
  2790. debounce(fn, delay) {
  2791. var isImmediateCall = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  2792. var timer = null; // 上次调用的时刻
  2793. if (isImmediateCall) {
  2794. return function () {
  2795. var context = this;
  2796. var currentTime = Date.now();
  2797. if (currentTime - lastCallTime >= delay) {
  2798. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  2799. args[_key] = arguments[_key];
  2800. }
  2801. fn.apply(context, args);
  2802. lastCallTime = currentTime;
  2803. }
  2804. };
  2805. } else {
  2806. return function () {
  2807. for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  2808. args[_key2] = arguments[_key2];
  2809. }
  2810. if (timer) {
  2811. clearTimeout(timer);
  2812. }
  2813. var context = this;
  2814. timer = setTimeout(function () {
  2815. fn.apply(context, args);
  2816. }, delay);
  2817. };
  2818. }
  2819. },
  2820. getMixedSet: function getMixedSet(arr1, arr2) {
  2821. //交集
  2822. return arr1.filter(function (item) {
  2823. return arr2.includes(item);
  2824. });
  2825. },
  2826. getUnionSet: function getUnionSet(arr1, arr2) {
  2827. //并集
  2828. return arr1.concat(arr2.filter(function (item) {
  2829. return !arr1.includes(item);
  2830. }));
  2831. },
  2832. getDifferenceSet: function getDifferenceSet(arr1, arr2) {
  2833. //差集 不能识别重复的,如getDifferenceSet([1,2,2],[1,1,2]) 为空
  2834. var arr11 = arr1.filter(function (item) {
  2835. return !arr2.includes(item);
  2836. });
  2837. var arr22 = arr2.filter(function (item) {
  2838. return !arr1.includes(item);
  2839. });
  2840. return arr11.concat(arr22);
  2841. },
  2842. getDifferenceSetMuti: function getDifferenceSetMuti(arr) {
  2843. //收集绝对没有重复的元素,也就是判断出现次数=1的
  2844. var set = [];
  2845. arr.forEach(function (arr1) {
  2846. arr1.forEach(function (item) {
  2847. var index = set.indexOf(item);
  2848. if (index > -1) {
  2849. set.splice(index, 1);
  2850. } else {
  2851. set.push(item);
  2852. }
  2853. });
  2854. });
  2855. return set;
  2856. },
  2857. pushToGroupAuto: function pushToGroupAuto(items, groups, recognizeFunction, judgeRelationFun) {
  2858. //自动分组。 items是将分到一起的组合。items.length = 1 or 2.
  2859. var isSame = function isSame(a, b) {
  2860. return a == b || recognizeFunction && recognizeFunction(a, b);
  2861. };
  2862. var atGroups = groups.filter(function (group) {
  2863. return group.find(function (item) {
  2864. return (isSame(item, items[0]) || isSame(item, items[1])) && (!judgeRelationFun || judgeRelationFun(group));
  2865. } //根据关系进一步判断是否应该一组
  2866. );
  2867. });
  2868. if (atGroups.length) {
  2869. //在不同组
  2870. //因为items是一组的,所以先都放入组1
  2871. items.forEach(function (item) {
  2872. if (!atGroups[0].includes(item)) atGroups[0].push(item);
  2873. });
  2874. if (atGroups.length > 1) {
  2875. //如果在不同组,说明这两个组需要合并
  2876. var combineGroup = [];
  2877. combineGroup.relationships = [items.slice()];
  2878. atGroups.forEach(function (group) {
  2879. var relationships = common.getUnionSet(combineGroup.relationships, group.relationships);
  2880. combineGroup = common.getUnionSet(combineGroup, group);
  2881. combineGroup.relationships = relationships;
  2882. groups.splice(groups.indexOf(group), 1);
  2883. });
  2884. groups.push(combineGroup);
  2885. } else {
  2886. atGroups[0].relationships.push(items.slice());
  2887. }
  2888. } else {
  2889. //直接加入为一组
  2890. items.relationships = [items.slice()];
  2891. groups.push(items);
  2892. }
  2893. },
  2894. disconnectGroup: function disconnectGroup(pairs, groups, recognizeFunction) {
  2895. //将atGroup中的pairs关系解除,然后重新分组
  2896. var isSame = function isSame(a, b) {
  2897. return a == b || recognizeFunction && recognizeFunction(a, b);
  2898. };
  2899. var oldGroups = groups.slice();
  2900. pairs.forEach(function (items) {
  2901. var relationship;
  2902. var atGroup = groups.find(function (group) {
  2903. var r = group.relationships.find(function (arr) {
  2904. return items.every(function (e) {
  2905. return arr.some(function (a) {
  2906. return isSame(a, e);
  2907. });
  2908. });
  2909. });
  2910. if (r) {
  2911. relationship = r;
  2912. return true;
  2913. }
  2914. }); //能找到relationships 有包含items的, 代表它们有绑定关系
  2915. if (!atGroup) return; //断开连接时,因为组内没有其他成员的连接信息,所以需要清除整组,并将剩余的一个个重新连接
  2916. groups.splice(groups.indexOf(atGroup), 1); //删除
  2917. atGroup.relationships.splice(atGroup.relationships.indexOf(relationship), 1);
  2918. var newGroups_ = []; //为了防止裂解的该组(因之前有judgeRelationFun但现在没传)混入其他组,先放一个空组合里
  2919. atGroup.relationships.forEach(function (pair) {
  2920. //然后再重新生成这两个和组的关系,各自分组
  2921. common.pushToGroupAuto(pair, newGroups_, recognizeFunction);
  2922. });
  2923. groups.push.apply(groups, newGroups_);
  2924. });
  2925. var newGroups = groups.filter(function (e) {
  2926. return !oldGroups.includes(e);
  2927. });
  2928. return {
  2929. newGroups
  2930. };
  2931. },
  2932. removeFromGroup: function removeFromGroup(items, atGroup, groups, recognizeFunction) {
  2933. //将该组移除items中的所有元素,以及包含它的关系
  2934. var isSame = function isSame(a, b) {
  2935. return a == b || recognizeFunction && recognizeFunction(a, b);
  2936. };
  2937. var newRelations = atGroup.relationships.filter(function (arr) {
  2938. return !arr.some(function (e) {
  2939. return items.some(function (item) {
  2940. return isSame(e, item);
  2941. });
  2942. });
  2943. });
  2944. if (newRelations.length == atGroup.relationships) return; //断开连接时,因为组内没有其他成员的连接信息,所以需要清除整组,并将剩余的一个个重新连接
  2945. groups.splice(groups.indexOf(atGroup), 1); //删除
  2946. var newGroups = []; //为了防止裂解的该组(因之前有judgeRelationFun但现在没传)混入其他组,先放一个空组合里
  2947. atGroup.relationships.forEach(function (pair) {
  2948. //然后再重新生成这两个和组的关系,各自分组
  2949. common.pushToGroupAuto(pair, newGroups, recognizeFunction);
  2950. });
  2951. groups.push.apply(groups, newGroups);
  2952. return {
  2953. newGroups
  2954. };
  2955. }
  2956. };
  2957. common.getMAXCUBETEXTURESIZE = function () {
  2958. try {
  2959. var e = document.createElement('canvas'),
  2960. t = e.getContext('webgl');
  2961. t || (t = e.getContext('experimental-webgl'));
  2962. var i = t.getParameter(t.MAX_CUBE_MAP_TEXTURE_SIZE);
  2963. return i;
  2964. } catch (e) {
  2965. return 0;
  2966. }
  2967. };
  2968. var getTexture = function () {
  2969. var textureLoader = new THREE.TextureLoader();
  2970. textureLoader.setCrossOrigin('Anonymous');
  2971. textureLoader.crossOrigin = true;
  2972. return function (url, onLoad, onProgress, onError) {
  2973. var map = textureLoader.load(url, onLoad, onProgress, onError);
  2974. map.magFilter = map.minFilter = THREE.LinearFilter;
  2975. map.needsUpadte = true;
  2976. return map;
  2977. };
  2978. }();
  2979. common.dataURLtoBlob = function (dataurl) {
  2980. //将base64转换blob
  2981. var arr = dataurl.split(','),
  2982. mime = arr[0].match(/:(.*?);/)[1],
  2983. bstr = atob(arr[1]),
  2984. n = bstr.length,
  2985. u8arr = new Uint8Array(n);
  2986. while (n--) {
  2987. u8arr[n] = bstr.charCodeAt(n);
  2988. }
  2989. return new Blob([u8arr], {
  2990. type: mime
  2991. });
  2992. };
  2993. common.dataURLtoFile = function (dataurl, filename) {
  2994. //将base64转换为文件
  2995. var arr = dataurl.split(','),
  2996. mime = arr[0].match(/:(.*?);/)[1],
  2997. bstr = atob(arr[1]),
  2998. n = bstr.length,
  2999. u8arr = new Uint8Array(n);
  3000. while (n--) {
  3001. u8arr[n] = bstr.charCodeAt(n);
  3002. }
  3003. return new File([u8arr], filename, {
  3004. type: mime
  3005. });
  3006. };
  3007. common.saveFile = function (data, filename, cb) {
  3008. var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
  3009. save_link.href = data;
  3010. save_link.download = filename;
  3011. var event = document.createEvent('MouseEvents');
  3012. event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  3013. save_link.dispatchEvent(event);
  3014. cb && cb();
  3015. };
  3016. common.PrefixPng = 'data:image/png;base64,';
  3017. common.getBlobSrc = function (base64, addPre) {
  3018. //base64 --> blobsrc
  3019. var blob = common.dataURLtoBlob((addPre ? common.PrefixPng : '') + base64);
  3020. return window.URL.createObjectURL(blob);
  3021. };
  3022. common.replaceAll = function (str, f, e) {
  3023. //f全部替换成e
  3024. var reg = new RegExp(f, 'g'); //创建正则RegExp对象
  3025. return str.replace(reg, e);
  3026. };
  3027. common.randomWord = function (randomFlag, min, max) {
  3028. //随机字符串
  3029. var str = '',
  3030. range = min,
  3031. arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
  3032. if (randomFlag) {
  3033. // 随机长度
  3034. range = Math.round(Math.random() * (max - min)) + min;
  3035. }
  3036. for (var i = 0; i < range; i++) {
  3037. var pos = Math.round(Math.random() * (arr.length - 1));
  3038. str += arr[pos];
  3039. }
  3040. return str;
  3041. };
  3042. common.getRandomSid = function () {
  3043. //5-7位随机字符串 + 6位时间 为热点准备
  3044. var pre = common.randomWord(true, 5, 7);
  3045. var post = new Date().getTime() + '';
  3046. var len = post.length;
  3047. post = post.substring(len - 8, len - 5) + post.substring(len - 3, len); //其实还是有可能重复的....
  3048. return pre + post;
  3049. };
  3050. common.getTime = function (second) {
  3051. //秒
  3052. var str = ''; //不支持大于60分钟的时间哟
  3053. var minute = Math.round(second / 60);
  3054. if (minute < 10) str += '0';
  3055. str += minute;
  3056. second = Math.round(second % 60) + '';
  3057. if (second.length == 1) second = '0' + second;
  3058. str = str + ':' + second;
  3059. return str;
  3060. };
  3061. common.CloneJson = function (data) {
  3062. var str = JSON.stringify(data);
  3063. return JSON.parse(str);
  3064. }, common.CloneObject = function (copyObj, isSimpleCopy) {
  3065. var _this2 = this;
  3066. var simpleCopyList = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
  3067. var judgeSimpleCopyFun = arguments.length > 3 ? arguments[3] : undefined;
  3068. //isSimpleCopy 只复制最外层
  3069. //复制json result的可能:普通数字或字符串、普通数组、复杂对象
  3070. simpleCopyList.includes(THREE.Object3D) || simpleCopyList.push(THREE.Object3D); //遇到simpleCopyList中的类直接使用不拷贝
  3071. judgeSimpleCopyFun || (judgeSimpleCopyFun = function judgeSimpleCopyFun() {});
  3072. if (!copyObj || typeof copyObj == 'number' || typeof copyObj == 'string' || copyObj instanceof Function || simpleCopyList.some(function (className) {
  3073. return copyObj instanceof className;
  3074. }) || judgeSimpleCopyFun(copyObj)) {
  3075. return copyObj;
  3076. }
  3077. if (copyObj instanceof Array) {
  3078. return copyObj.map(function (e) {
  3079. return _this2.CloneObject(e, isSimpleCopy, simpleCopyList, judgeSimpleCopyFun);
  3080. });
  3081. } else {
  3082. if (copyObj.clone instanceof Function) {
  3083. //解决一部分
  3084. return copyObj.clone();
  3085. }
  3086. }
  3087. var result = {};
  3088. for (var key in copyObj) {
  3089. if (copyObj[key] instanceof Object && !isSimpleCopy) result[key] = this.CloneObject(copyObj[key], isSimpleCopy, simpleCopyList, judgeSimpleCopyFun);else result[key] = copyObj[key]; //如果是函数类同基本数据,即复制引用
  3090. }
  3091. return result;
  3092. }, common.CloneClassObject = function (copyObj) {
  3093. var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  3094. _ref$ignoreList = _ref.ignoreList,
  3095. ignoreList = _ref$ignoreList === void 0 ? [] : _ref$ignoreList,
  3096. _ref$simpleCopyList = _ref.simpleCopyList,
  3097. simpleCopyList = _ref$simpleCopyList === void 0 ? [] : _ref$simpleCopyList;
  3098. //复杂类对象
  3099. var newobj = new copyObj.constructor();
  3100. this.CopyClassObject(newobj, copyObj, {
  3101. ignoreList,
  3102. simpleCopyList
  3103. });
  3104. return newobj;
  3105. }, common.CopyClassObject = function (targetObj, copyObj) {
  3106. var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  3107. _ref2$ignoreList = _ref2.ignoreList,
  3108. ignoreList = _ref2$ignoreList === void 0 ? [] : _ref2$ignoreList,
  3109. _ref2$simpleCopyList = _ref2.simpleCopyList,
  3110. simpleCopyList = _ref2$simpleCopyList === void 0 ? [] : _ref2$simpleCopyList;
  3111. //复杂类对象
  3112. for (var i in copyObj) {
  3113. if (i in copyObj.__proto__) break; //到函数了跳出
  3114. if (ignoreList.includes(i)) {
  3115. continue;
  3116. } else if (simpleCopyList.includes(i)) {
  3117. targetObj[i] = copyObj[i];
  3118. } else {
  3119. targetObj[i] = this.CloneObject(copyObj[i], false, simpleCopyList);
  3120. }
  3121. }
  3122. }, common.ifSame = function (object1, object2) {
  3123. if (object1 == object2) return true; // 0 != undefined , 0 == ''
  3124. else if (!object1 || !object2) return false;else if (object1.constructor != object2.constructor) {
  3125. return false;
  3126. } else if (object1 instanceof Array) {
  3127. if (object1.length != object2.length) return false;
  3128. var _object2 = object2.slice(0);
  3129. var _loop = function _loop(i) {
  3130. u = _object2.find(function (e) {
  3131. return ifSame(object1[i], e);
  3132. });
  3133. if (u == void 0 && !_object2.includes(u) && !object1.includes(u)) return {
  3134. v: false
  3135. };else {
  3136. var index = _object2.indexOf(u);
  3137. _object2.splice(index, 1);
  3138. }
  3139. };
  3140. for (var i = 0; i < object1.length; i++) {
  3141. var u;
  3142. var _ret = _loop(i);
  3143. if (typeof _ret === "object") return _ret.v;
  3144. }
  3145. return true;
  3146. } else if (object1.equals instanceof Function) {
  3147. //复杂数据仅支持这种,其他的可能卡住?
  3148. return object1.equals(object2);
  3149. } else if (typeof object1 == 'number' || typeof object1 == 'string') {
  3150. if (isNaN(object1) && isNaN(object2)) return true;else return object1 == object2;
  3151. } else if (typeof object1 == 'object') {
  3152. var keys1 = Object.keys(object1);
  3153. var keys2 = Object.keys(object2);
  3154. if (!ifSame(keys1, keys2)) return false;
  3155. for (var _i in object1) {
  3156. var same = ifSame(object1[_i], object2[_i]);
  3157. if (!same) return false;
  3158. }
  3159. return true;
  3160. } else {
  3161. console.log('isSame出现例外');
  3162. }
  3163. };
  3164. common.canvasToImg = function (canvas) {
  3165. var compressRatio = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  3166. var download = arguments.length > 2 ? arguments[2] : undefined;
  3167. var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'image/jpeg';
  3168. var filename = arguments.length > 4 ? arguments[4] : undefined;
  3169. // 图片导出为 png 格式
  3170. var imgData = canvas.toDataURL(type, compressRatio); // 加工image data,替换mime type
  3171. if (download) {
  3172. this.saveTex(imgData, type, filename);
  3173. }
  3174. return imgData;
  3175. };
  3176. var _fixType = function _fixType(type) {
  3177. type = type.toLowerCase().replace(/jpg/i, 'jpeg');
  3178. var r = type.match(/png|jpeg|bmp|gif/)[0];
  3179. return 'image/' + r;
  3180. };
  3181. common.saveTex = function (imgData) {
  3182. var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'image/jpeg';
  3183. var filename = arguments.length > 2 ? arguments[2] : undefined;
  3184. return function (filename) {
  3185. imgData = imgData.replace(_fixType(type), 'image/octet-stream'); // 下载后的图片名
  3186. var filename = filename || '4dage_' + new Date().getTime() + (type == 'png' ? '.png' : '.jpg'); // download
  3187. common.saveFile(imgData, filename);
  3188. }(filename);
  3189. };
  3190. common.imgAddLabel = function (img, labelImg) {
  3191. var labelInfo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  3192. //图上加另一张小图,用于添加水印
  3193. var canvas = document.createElement('canvas');
  3194. var context = canvas.getContext('2d');
  3195. context.canvas.width = img.width;
  3196. context.canvas.height = img.height;
  3197. context.drawImage(img, 0, 0, img.width, img.height);
  3198. var labelWidth = img.width * labelInfo.widthRatioToImg; //widthRatioToImg:label的width占img的width的比例
  3199. var labelHeight = labelWidth * labelImg.height / labelImg.width;
  3200. if (!labelInfo.leftRatioToImg && labelInfo.rightRatioToImg) {
  3201. labelInfo.leftRatioToImg = 1 - labelInfo.rightRatioToImg - labelInfo.widthRatioToImg;
  3202. }
  3203. if (!labelInfo.topRatioToImg && labelInfo.bottomRatioToImg) {
  3204. labelInfo.topRatioToImg = 1 - labelInfo.bottomRatioToImg - labelHeight / img.height;
  3205. }
  3206. var labelLeft = img.width * labelInfo.leftRatioToImg; //leftRatioToImg:label的left占img的width的比例
  3207. var labelTop = img.height * labelInfo.topRatioToImg; //topRatioToImg:label的top占img的height的比例
  3208. context.globalAlpha = labelInfo.opacity != void 0 ? labelInfo.opacity : 1;
  3209. context.drawImage(labelImg, labelLeft, labelTop, labelWidth, labelHeight);
  3210. return common.canvasToImg(canvas);
  3211. };
  3212. common.pixelsArrayToDataUrl = function (pixels, width, height) {
  3213. var compressRatio = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.7;
  3214. var dontFlipY = arguments.length > 4 ? arguments[4] : undefined;
  3215. var canvas = document.createElement('canvas');
  3216. canvas.width = width;
  3217. canvas.height = height;
  3218. var context = canvas.getContext('2d');
  3219. pixels = new pixels.constructor(pixels);
  3220. if (!dontFlipY) {
  3221. var bytesPerLine = width * 4;
  3222. for (var i = 0; i < parseInt(height / 2); i++) {
  3223. var j = height - i - 1;
  3224. var lineI = pixels.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine);
  3225. var lineJ = pixels.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine);
  3226. pixels.set(lineJ, i * bytesPerLine);
  3227. pixels.set(lineI, j * bytesPerLine);
  3228. }
  3229. }
  3230. var imageData = context.createImageData(width, height);
  3231. imageData.data.set(pixels);
  3232. context.putImageData(imageData, 0, 0);
  3233. var dataURL = canvas.toDataURL(compressRatio);
  3234. return dataURL;
  3235. };
  3236. common.renderTargetToDataUrl = function (renderTarget, width, height, renderer) {
  3237. var compressRatio = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.7;
  3238. var dontFlipY = arguments.length > 5 ? arguments[5] : undefined;
  3239. var pixelCount = width * height;
  3240. var buffer = new Uint8Array(4 * pixelCount);
  3241. renderer.readRenderTargetPixels(renderTarget, 0, 0, width, height, buffer); //耗时
  3242. var dataUrl = this.pixelsArrayToDataUrl(buffer, width, height, compressRatio, dontFlipY);
  3243. return dataUrl;
  3244. };
  3245. common.screenPass = new function () {
  3246. this.screenScene = new THREE.Scene();
  3247. this.screenQuad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2, 1));
  3248. this.screenQuad.material.depthTest = true;
  3249. this.screenQuad.material.depthWrite = true;
  3250. this.screenQuad.material.transparent = true;
  3251. this.screenScene.add(this.screenQuad);
  3252. this.camera = new THREE.Camera();
  3253. this.render = function (renderer, material, target) {
  3254. this.screenQuad.material = material; //material.premultipliedAlpha = true //每次都要吗
  3255. var alpha = renderer.getClearAlpha();
  3256. renderer.setClearAlpha(0);
  3257. if (typeof target === 'undefined') {
  3258. renderer.render(this.screenScene, this.camera);
  3259. } else {
  3260. var oldTarget = renderer.getRenderTarget();
  3261. renderer.setRenderTarget(target);
  3262. renderer.clear();
  3263. renderer.render(this.screenScene, this.camera);
  3264. renderer.setRenderTarget(oldTarget);
  3265. /* let data = common.renderTargetToDataUrl(target, target.width, target.height, renderer)
  3266. common.saveTex(data) */
  3267. }
  3268. renderer.setClearAlpha(alpha);
  3269. };
  3270. }();
  3271. common.renderTex = function (material, renderer, size) {
  3272. var rt = new THREE.WebGLRenderTarget(size.x, size.y, {
  3273. minFilter: THREE.LinearMipmapLinearFilter,
  3274. generateMipmaps: true,
  3275. format: THREE.RGBAFormat
  3276. });
  3277. this.screenPass.render(renderer, material, rt);
  3278. return rt.texture;
  3279. }; //根据原因更新显示,便于将每种显示操作打上标签,管理优先级
  3280. common.updateVisible = function (object, reason, ifShow) {
  3281. var level = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  3282. var type = arguments.length > 4 ? arguments[4] : undefined;
  3283. //当所有加入的条件都不为false时才显示. reason='force'一般是强制、临时的
  3284. if (!object.unvisibleReasons) object.unvisibleReasons = []; //如果length>0代表不可见
  3285. if (!object.visibleReasons) object.visibleReasons = []; //在同级时,优先可见
  3286. var update = function update() {
  3287. //先按从高到低的level排列
  3288. object.unvisibleReasons = object.unvisibleReasons.sort(function (a, b) {
  3289. return b.level - a.level;
  3290. });
  3291. object.visibleReasons = object.visibleReasons.sort(function (a, b) {
  3292. return b.level - a.level;
  3293. });
  3294. var maxVisiLevel = object.visibleReasons[0] ? object.visibleReasons[0].level : -1;
  3295. var maxunVisiLevel = object.unvisibleReasons[0] ? object.unvisibleReasons[0].level : -1;
  3296. var shouldVisi = maxVisiLevel >= maxunVisiLevel;
  3297. var visiBefore = object.visible;
  3298. if (visiBefore != shouldVisi) {
  3299. object.visible = shouldVisi;
  3300. object.dispatchEvent({
  3301. type: 'isVisible',
  3302. visible: shouldVisi,
  3303. reason
  3304. });
  3305. }
  3306. };
  3307. if (ifShow) {
  3308. var index = object.unvisibleReasons.findIndex(function (e) {
  3309. return e.reason == reason;
  3310. });
  3311. if (index > -1) {
  3312. type = 'cancel';
  3313. object.unvisibleReasons.splice(index, 1);
  3314. }
  3315. if (type == 'add') {
  3316. if (!object.visibleReasons.some(function (e) {
  3317. return e.reason == reason;
  3318. })) {
  3319. object.visibleReasons.push({
  3320. reason,
  3321. level
  3322. });
  3323. }
  3324. }
  3325. } else {
  3326. var index = object.visibleReasons.findIndex(function (e) {
  3327. return e.reason == reason;
  3328. });
  3329. if (index > -1) {
  3330. type = 'cancel';
  3331. object.visibleReasons.splice(index, 1);
  3332. }
  3333. if (type != 'cancel') {
  3334. if (!object.unvisibleReasons.some(function (e) {
  3335. return e.reason == reason;
  3336. })) {
  3337. object.unvisibleReasons.push({
  3338. reason,
  3339. level
  3340. });
  3341. }
  3342. }
  3343. }
  3344. update();
  3345. };
  3346. common.getObjVisiByReason = function (object, reason) {
  3347. //获取在某条件下是否可见. 注: 用户在数据集选择可不可见为"datasetSelection"
  3348. if (object.visible) return true;else {
  3349. return !object.unvisibleReasons || !object.unvisibleReasons.some(function (e) {
  3350. return e.reason == reason;
  3351. });
  3352. }
  3353. };
  3354. common.setCameraLayers = function (camera, enableLayers) {
  3355. var extraEnableLayers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
  3356. //设置相机或raycaster的layers
  3357. camera.layers.disableAll();
  3358. enableLayers.concat(extraEnableLayers).forEach(function (e) {
  3359. var layer = Potree.config.renderLayers[e];
  3360. if (layer == void 0) {
  3361. console.error('setCameraLayer没找到layer!');
  3362. return;
  3363. }
  3364. camera.layers.enable(layer);
  3365. });
  3366. };
  3367. common.setObjectLayers = function (object, layerName) {
  3368. //设置物体的layers
  3369. var layer = Potree.config.renderLayers[layerName];
  3370. if (layer == void 0) {
  3371. console.error('setCameraLayer没找到layer!');
  3372. return;
  3373. }
  3374. object.traverse(function (e) {
  3375. e.layers.set(layer);
  3376. });
  3377. };
  3378. common.intervalTool = {
  3379. //延时update,防止卡顿
  3380. list: [],
  3381. isWaiting: function isWaiting(name, func, delayTime) {
  3382. var _this3 = this;
  3383. var item = this.list.find(function (e) {
  3384. return e.name == name;
  3385. });
  3386. if (!item) {
  3387. //如果没有该项, 则加入循环
  3388. var ifContinue = func();
  3389. item = {
  3390. name
  3391. };
  3392. this.list.push(item);
  3393. setTimeout(function () {
  3394. var a = _this3.list.indexOf(item);
  3395. _this3.list.splice(a, 1);
  3396. if (item.requestUpdate || ifContinue) _this3.isWaiting(name, func, delayTime); //循环
  3397. }, delayTime);
  3398. } else {
  3399. //如果有该项,说明现在请求下一次继续更新
  3400. /* if(delayTime == 0){//想立刻更新一次
  3401. func()
  3402. }else{ */
  3403. item.requestUpdate = true; //}
  3404. }
  3405. }
  3406. };
  3407. common.batchHandling = {
  3408. //分批处理
  3409. lists: [],
  3410. getSlice: function getSlice(name, items, _ref3) {
  3411. var stopWhenAllUsed = _ref3.stopWhenAllUsed,
  3412. _ref3$minCount = _ref3.minCount,
  3413. minCount = _ref3$minCount === void 0 ? 5 : _ref3$minCount,
  3414. _ref3$maxCount = _ref3.maxCount,
  3415. maxCount = _ref3$maxCount === void 0 ? 100 : _ref3$maxCount,
  3416. durBound1 = _ref3.durBound1,
  3417. durBound2 = _ref3.durBound2,
  3418. maxUseCount = _ref3.maxUseCount;
  3419. if (items.length == 0 || (maxUseCount = maxUseCount == void 0 ? common.getBestCount({
  3420. name,
  3421. minCount,
  3422. maxCount,
  3423. durBound1,
  3424. durBound2,
  3425. ifLog: false
  3426. }) : maxUseCount, !maxUseCount) //本次最多可以使用的个数
  3427. ) {
  3428. return {
  3429. list: []
  3430. };
  3431. }
  3432. if (!this.lists[name]) this.lists[name] = {
  3433. list: []
  3434. }; //更新列表项目,但不变原来的顺序
  3435. var list = this.lists[name].list.filter(function (a) {
  3436. return items.some(function (item) {
  3437. return a.item == item;
  3438. });
  3439. }); //去掉已经不在items里的项目
  3440. this.lists[name].list = list;
  3441. items.forEach(function (item) {
  3442. //增加新的项目。
  3443. if (!list.some(function (a) {
  3444. return a.item == item;
  3445. })) {
  3446. list.push({
  3447. item,
  3448. count: 0
  3449. });
  3450. }
  3451. }); //至此,在后排的都是未使用的
  3452. var unUsed = list.filter(function (e) {
  3453. return e.count == 0;
  3454. }); //未使用的项目(count为0)优先
  3455. var result = [];
  3456. unUsed.slice(0, maxUseCount).forEach(function (e) {
  3457. result.push(e.item);
  3458. e.count++;
  3459. });
  3460. if (unUsed.length > maxUseCount) ; else {
  3461. //所有项目都能使用一次
  3462. if (!stopWhenAllUsed) {
  3463. //若不是全部使用就停止
  3464. var wholeCount = Math.min(items.length, maxUseCount);
  3465. var restCount = wholeCount - result.length; //补齐
  3466. list.slice(0, restCount).forEach(function (e) {
  3467. result.push(e.item);
  3468. e.count++;
  3469. });
  3470. }
  3471. list.forEach(function (e) {
  3472. return e.count--;
  3473. }); //复原,等待新的循环
  3474. }
  3475. return {
  3476. list: result
  3477. };
  3478. },
  3479. addSliceListen(_ref4) {
  3480. var getList = _ref4.getList,
  3481. callback = _ref4.callback,
  3482. minCount = _ref4.minCount,
  3483. maxCount = _ref4.maxCount;
  3484. _ref4.durBound1;
  3485. _ref4.durBound2;
  3486. _ref4.maxHistory;
  3487. var player = _ref4.player;
  3488. var unUpdate, lastUpdate;
  3489. player.on('update', function (e) {
  3490. if (player.flying) return;
  3491. var waitForUpdate = getList();
  3492. var stopWhenAllUsed = !player.lastFrameChanged;
  3493. var standardUpdate = player.lastFrameChanged || !lastUpdate; //相机变化或第一次
  3494. var list;
  3495. if (standardUpdate) {
  3496. list = waitForUpdate;
  3497. unUpdate = null;
  3498. } else {
  3499. if (!unUpdate) {
  3500. unUpdate = common.getDifferenceSet(waitForUpdate, lastUpdate); //unUpdate = unUpdate.filter(e => e.visible) //如飞出后最后一次更新之后,都隐藏了,隐藏的就不用更新了
  3501. }
  3502. list = unUpdate;
  3503. }
  3504. var result = common.batchHandling.getSlice('ifVideoInsight', list, {
  3505. stopWhenAllUsed,
  3506. minCount,
  3507. maxCount,
  3508. durBound1: 3,
  3509. durBound2: 13,
  3510. maxHistory: 3
  3511. }); //iphonex稳定后大概在7-10。
  3512. var updateList = result.list; //updateList.length && console.log(updateList.map(e=>e.sid))
  3513. updateList.forEach(callback);
  3514. if (!standardUpdate) {
  3515. //相机停止变化后只更新还未更新的
  3516. unUpdate = common.getDifferenceSet(unUpdate, updateList);
  3517. }
  3518. lastUpdate = updateList;
  3519. });
  3520. }
  3521. };
  3522. common.getBestCount = function () {
  3523. var lastCount = {};
  3524. return function (_ref5) {
  3525. var name = _ref5.name,
  3526. _ref5$minCount = _ref5.minCount,
  3527. minCount = _ref5$minCount === void 0 ? 1 : _ref5$minCount,
  3528. _ref5$maxCount = _ref5.maxCount,
  3529. maxCount = _ref5$maxCount === void 0 ? 6 : _ref5$maxCount,
  3530. _ref5$durBound = _ref5.durBound1,
  3531. durBound1 = _ref5$durBound === void 0 ? 1 : _ref5$durBound,
  3532. _ref5$durBound2 = _ref5.durBound2,
  3533. durBound2 = _ref5$durBound2 === void 0 ? 4 : _ref5$durBound2,
  3534. ifLog = _ref5.ifLog,
  3535. maxHistory = _ref5.maxHistory;
  3536. var timeStamp = performance.getEntriesByName('loop-start');
  3537. var count;
  3538. if (timeStamp.length) {
  3539. var dur = performance.now() - timeStamp[timeStamp.length - 1].startTime;
  3540. /*let k = -(maxCount - minCount) / (durBound2 - durBound1)
  3541. let m = maxCount - durBound1 * k
  3542. count = THREE.MathUtils.clamp(Math.round(k * dur + m), minCount, maxCount) //dur在iphoneX中静止有7,pc是2
  3543. */
  3544. count = Math.round(math$1.linearClamp(dur, durBound1, durBound2, maxCount, minCount));
  3545. if (maxHistory) {
  3546. if (!lastCount[name]) lastCount[name] = [];
  3547. if (count == 0 && lastCount[name].length > maxHistory - 1 && !lastCount[name].some(function (e) {
  3548. return e > 0;
  3549. })) {
  3550. count = 1;
  3551. }
  3552. lastCount[name].push(count);
  3553. if (lastCount[name].length > maxHistory) lastCount[name].splice(0, 1);
  3554. }
  3555. ifLog && console.log(name, count, ' ,dur:', dur.toFixed(3));
  3556. } else {
  3557. count = maxCount; // ?
  3558. } //主要在手机端有效果。
  3559. return count;
  3560. };
  3561. }();
  3562. common.timeMeasuring = {
  3563. reportTimings: false,
  3564. collection: {},
  3565. registerCollect(name, o) {
  3566. this.collection[name] = o;
  3567. o.measures = [];
  3568. o.sum = 0;
  3569. },
  3570. addTimeMark: function addTimeMark(name, type, ifLog) {
  3571. var record = this.collection[name];
  3572. var now = performance.now();
  3573. var needRecord = record && (record.measures.length < record.minCount || now - record.lastAddTime > record.refreshTime); //间隔时间超过refreshTime重新收集
  3574. if (needRecord || this.reportTimings) {
  3575. if (type == 'end' && performance.getEntriesByName(name + '-start').length == 0) return;
  3576. performance.mark(name + '-' + type);
  3577. if (type == 'end') {
  3578. var measure = performance.measure(name, name + '-start', name + '-end');
  3579. if (!measure) {
  3580. //console.error('没找到measure',name) //可能是其他地方报错了没进行下去所以找不到
  3581. return;
  3582. }
  3583. if (ifLog) console.log(name, '耗时', measure.duration.toFixed(3));
  3584. if (needRecord) {
  3585. if (record.measures.length >= record.minCount) {
  3586. //先清空上一轮的
  3587. record.measures = [];
  3588. record.sum = 0;
  3589. }
  3590. record.measures.push(measure.duration);
  3591. record.sum += measure.duration;
  3592. record.mean = record.sum / record.measures.length;
  3593. record.measures.sort(function (a, b) {
  3594. return a - b;
  3595. });
  3596. record.median = record.measures[parseInt(record.measures.length / 2)];
  3597. record.lastAddTime = now;
  3598. if (record.measures.length == record.minCount) ;
  3599. }
  3600. }
  3601. }
  3602. },
  3603. report: function report(timestamp) {
  3604. //原resolveTimings
  3605. //打印用时。 注:performance手机的精度只到整数位
  3606. if (!this.toggle) {
  3607. this.toggle = timestamp;
  3608. }
  3609. var duration = timestamp - this.toggle;
  3610. if (duration > 1000.0) {
  3611. if (this.reportTimings) {
  3612. var measures = performance.getEntriesByType('measure');
  3613. var names = new Set();
  3614. var _iterator = _createForOfIteratorHelper$8(measures),
  3615. _step;
  3616. try {
  3617. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  3618. var measure = _step.value;
  3619. names.add(measure.name);
  3620. }
  3621. } catch (err) {
  3622. _iterator.e(err);
  3623. } finally {
  3624. _iterator.f();
  3625. }
  3626. var groups = new Map();
  3627. var _iterator2 = _createForOfIteratorHelper$8(names),
  3628. _step2;
  3629. try {
  3630. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  3631. var name = _step2.value;
  3632. groups.set(name, {
  3633. measures: [],
  3634. sum: 0,
  3635. n: 0,
  3636. min: Infinity,
  3637. max: -Infinity
  3638. });
  3639. }
  3640. } catch (err) {
  3641. _iterator2.e(err);
  3642. } finally {
  3643. _iterator2.f();
  3644. }
  3645. var _iterator3 = _createForOfIteratorHelper$8(measures),
  3646. _step3;
  3647. try {
  3648. for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
  3649. var _measure = _step3.value;
  3650. var group = groups.get(_measure.name);
  3651. group.measures.push(_measure);
  3652. group.sum += _measure.duration;
  3653. group.n++;
  3654. group.min = Math.min(group.min, _measure.duration);
  3655. group.max = Math.max(group.max, _measure.duration);
  3656. }
  3657. } catch (err) {
  3658. _iterator3.e(err);
  3659. } finally {
  3660. _iterator3.f();
  3661. }
  3662. var _iterator4 = _createForOfIteratorHelper$8(groups),
  3663. _step4;
  3664. try {
  3665. for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
  3666. var _step4$value = _slicedToArray(_step4.value, 2),
  3667. _name = _step4$value[0],
  3668. _group = _step4$value[1];
  3669. _group.mean = _group.sum / _group.n;
  3670. _group.measures.sort(function (a, b) {
  3671. return a.duration - b.duration;
  3672. });
  3673. if (_group.n === 1) {
  3674. _group.median = _group.measures[0].duration;
  3675. } else if (_group.n > 1) {
  3676. _group.median = _group.measures[parseInt(_group.n / 2)].duration;
  3677. }
  3678. }
  3679. } catch (err) {
  3680. _iterator4.e(err);
  3681. } finally {
  3682. _iterator4.f();
  3683. }
  3684. var cn = Array.from(names).reduce(function (a, i) {
  3685. return Math.max(a, i.length);
  3686. }, 0) + 5;
  3687. var cmin = 5;
  3688. var cmed = 5;
  3689. var cmax = 5;
  3690. var csam = 4;
  3691. var message = " ".concat('NAME'.padEnd(cn), " |") + " ".concat('MIN'.padStart(cmin), " |") + " ".concat('MEDIAN'.padStart(cmed), " |") + " ".concat('MAX'.padStart(cmax), " |") + " ".concat('AVE'.padStart(cmax), " |") + " ".concat('SAMPLES'.padStart(csam), " \n");
  3692. message += " ".concat('-'.repeat(message.length), "\n");
  3693. names = Array.from(names).sort();
  3694. var _iterator5 = _createForOfIteratorHelper$8(names),
  3695. _step5;
  3696. try {
  3697. for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
  3698. var _name2 = _step5.value;
  3699. var _group2 = groups.get(_name2);
  3700. var min = _group2.min.toFixed(2);
  3701. var median = _group2.median.toFixed(2);
  3702. var max = _group2.max.toFixed(2);
  3703. var n = _group2.n;
  3704. var ave = _group2.mean.toFixed(2); //add
  3705. message += " ".concat(_name2.padEnd(cn), " |") + " ".concat(min.padStart(cmin), " |") + " ".concat(median.padStart(cmed), " |") + " ".concat(max.padStart(cmax), " |") + " ".concat(ave.padStart(cmax), " |") + " ".concat(n.toString().padStart(csam), "\n");
  3706. }
  3707. } catch (err) {
  3708. _iterator5.e(err);
  3709. } finally {
  3710. _iterator5.f();
  3711. }
  3712. message += "\n";
  3713. console.log(message);
  3714. }
  3715. performance.clearMarks();
  3716. performance.clearMeasures();
  3717. this.toggle = timestamp;
  3718. }
  3719. }
  3720. };
  3721. common.isVideoPlayed = function (video) {
  3722. return !video.paused && !isNaN(video.duration); //注意,有的手机首次play时会立即paused为false,但其实没加载好, duration为NAN
  3723. };
  3724. common.GifTexDeal = {
  3725. animateObjects: [],
  3726. animateTexs: [],
  3727. addAnimation: function addAnimation(texture, owner) {
  3728. var info = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
  3729. delay: 0
  3730. };
  3731. var id = arguments.length > 3 ? arguments[3] : undefined;
  3732. /* if(this.animateObjects.find(e=>
  3733. e.texture == texture && !ifSame(info, e.info)
  3734. )) */
  3735. var animation;
  3736. var tex = this.animateTexs.find(function (e) {
  3737. return e.texture == texture;
  3738. });
  3739. if (tex) {
  3740. animation = tex;
  3741. } else {
  3742. animation = {
  3743. texture,
  3744. info
  3745. };
  3746. this.animateTexs.push(animation);
  3747. this.setRepeart(animation);
  3748. }
  3749. var object = {
  3750. animation,
  3751. //默认相同的texture对应的info是一样的, 对应一个animation
  3752. owner,
  3753. id
  3754. };
  3755. this.animateObjects.push(object);
  3756. return object;
  3757. },
  3758. remove: function remove(object) {
  3759. var index = this.animateObjects.indexOf(object);
  3760. if (index > -1) {
  3761. this.animateObjects.splice(index, 1);
  3762. if (!this.animateObjects.find(function (e) {
  3763. return e.animation == object.animation;
  3764. })) {
  3765. var i = this.animateTexs.indexOf(object.animation);
  3766. this.animateTexs.splice(i, 1);
  3767. object.animation.texture.repeat.set(1, 1);
  3768. }
  3769. this.stop(object);
  3770. }
  3771. },
  3772. setRepeart: function setRepeart(animation) {
  3773. animation.texture.repeat.set(1 / animation.info.cellXcount, 1 / animation.info.cellYcount);
  3774. },
  3775. start: function start(object) {
  3776. var _this4 = this;
  3777. if (!object || object.started) return;
  3778. object.started = true;
  3779. if (object.animation.started) return;
  3780. object.animation.started = true;
  3781. var info = object.animation.info;
  3782. var count = info.cellXcount * info.cellYcount - (info.voidCount || 0);
  3783. if (count <= 1) return;
  3784. if (object.startCallback) object.startCallback();
  3785. var duration = info.duration + info.delay;
  3786. var delay = info.delay / duration;
  3787. transitions$1.start(function (progress) {
  3788. var index = Math.floor((count - 1) * progress);
  3789. var indexX = index % info.cellXcount;
  3790. var indexY = info.cellYcount - Math.floor(index / info.cellXcount) - 1; //uv.offset.y是从下到上的
  3791. object.animation.texture.offset.x = indexX / info.cellXcount;
  3792. object.animation.texture.offset.y = indexY / info.cellYcount; //console.log(object.id + " : "+ index, indexX, indexY /* object.texture.offset.toArray() */)
  3793. }, duration
  3794. /* * -1 */
  3795. , function () {
  3796. //done (-1):循环
  3797. //先停在最后一帧
  3798. object.started = false;
  3799. object.animation.started = false;
  3800. info.waitNextLoop = setTimeout(function () {
  3801. //从头开始
  3802. /* object.animation.texture.offset.x = 0;
  3803. object.animation.texture.offset.y = 0; */
  3804. _this4.start(object);
  3805. }, info.waitNextTime || 0);
  3806. }, delay, null, object.id, 'gif_' + object.animation.texture.id);
  3807. },
  3808. stop: function stop(object) {
  3809. if (!object || !object.started) return;
  3810. object.started = false; //只有该object对应的texture对应的所有object都停止了,才能真的停止动画:
  3811. if (this.animateObjects.find(function (e) {
  3812. return e.animation == object.animation && e.started;
  3813. })) return;
  3814. transitions$1.cancelById('gif_' + object.animation.texture.id);
  3815. object.animation.texture.offset.set(0, 0);
  3816. object.animation.started = false;
  3817. clearTimeout(object.animation.info.waitNextLoop);
  3818. }
  3819. };
  3820. common.getNestedValue = function (obj, path) {
  3821. // Split the path string into an array of keys.
  3822. var keys = path.split('.'); // Iterate over the keys and access the nested values.
  3823. var current = obj;
  3824. var _iterator6 = _createForOfIteratorHelper$8(keys),
  3825. _step6;
  3826. try {
  3827. for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
  3828. var key = _step6.value;
  3829. // If the current value is an array and the key is an index, access the array element.
  3830. if (Array.isArray(current) && !isNaN(parseInt(key))) {
  3831. current = current[parseInt(key)];
  3832. } else {
  3833. // If the current value is an object, access the property.
  3834. current = current[key];
  3835. } // If the current value is undefined, return undefined.
  3836. if (current === undefined) {
  3837. return undefined;
  3838. }
  3839. }
  3840. } catch (err) {
  3841. _iterator6.e(err);
  3842. } finally {
  3843. _iterator6.f();
  3844. }
  3845. return current;
  3846. };
  3847. common.watch = function (object, propName, initialValue) {
  3848. //监听某个属性的变化
  3849. var v = initialValue;
  3850. Object.defineProperty(object, propName, {
  3851. get: function get() {
  3852. return v;
  3853. },
  3854. set: function set(e) {
  3855. console.warn('watch:', propName, e);
  3856. v = e;
  3857. }
  3858. });
  3859. };
  3860. common.realVisible = function (object) {
  3861. var v = true;
  3862. var parent = object;
  3863. var lastParent;
  3864. while (parent) {
  3865. if (parent.visible === false) {
  3866. v = false;
  3867. break;
  3868. }
  3869. lastParent = parent;
  3870. parent = parent.parent;
  3871. }
  3872. if (v && !(lastParent instanceof THREE.Scene)) {
  3873. //已被删除
  3874. v = false;
  3875. }
  3876. return v;
  3877. };
  3878. common.isChildOf = function (child, parent) {
  3879. var curParent;
  3880. while (curParent && curParent != parent) {
  3881. curParent = curParent.curParent;
  3882. }
  3883. if (curParent) {
  3884. return true;
  3885. }
  3886. };
  3887. /*
  3888. * @Author: Rindy
  3889. * @Date: 2021-05-12 12:05:29
  3890. * @LastEditors: Rindy
  3891. * @LastEditTime: 2021-10-20 11:09:29
  3892. * @Description: decorators
  3893. */
  3894. /**
  3895. * 集成EventEmitter
  3896. * @param {*} target
  3897. */
  3898. var Emitter = function Emitter(target) {
  3899. common.extend(target, EventEmitter);
  3900. };
  3901. var browser$1 = {
  3902. mobileVersion(e, t) {
  3903. var i = window.navigator.userAgent,
  3904. n = i.match(e);
  3905. return n = n ? n[1].split(t) : [], {
  3906. major: parseInt(n[0]) || 0,
  3907. minor: parseInt(n[1]) || 0,
  3908. patch: parseInt(n[2]) || 0
  3909. };
  3910. },
  3911. isFullscreen() {
  3912. return document.fullscreenElement || document.mozFullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
  3913. },
  3914. supportsFullscreen() {
  3915. return document.fullscreenEnabled || document.mozFullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled;
  3916. },
  3917. isPointerLocked() {
  3918. return document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement;
  3919. },
  3920. requestFullscreen(dom, t) {
  3921. dom.requestFullscreen ? dom.requestFullscreen() : dom.mozRequestFullScreen ? dom.mozRequestFullScreen() : dom.webkitRequestFullscreen ? dom.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT) : dom.msRequestFullscreen && dom.msRequestFullscreen(), t && $(document).on('fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange', browser$1.requestPointerLock);
  3922. },
  3923. requestPointerLock() {
  3924. var e;
  3925. if (document.fullscreenElement) e = document.fullscreenElement();else if (document.mozFullscreenElement) e = document.mozFullscreenElement();else if (document.mozFullScreenElement) e = document.mozFullScreenElement();else {
  3926. if (!document.webkitFullscreenElement) return;
  3927. e = document.webkitFullscreenElement();
  3928. }
  3929. e.requestPointerLock = e.requestPointerLock || e.mozRequestPointerLock || e.webkitRequestPointerLock, e.requestPointerLock(), $(document).off('fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange', this);
  3930. },
  3931. exitPointerLock() {
  3932. document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock, document.exitPointerLock();
  3933. },
  3934. exitFullscreen() {
  3935. document.exitFullscreen ? document.exitFullscreen() : document.msExitFullscreen ? document.msExitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.webkitExitFullscreen && document.webkitExitFullscreen();
  3936. },
  3937. details() {
  3938. var e = navigator.userAgent.match('(Firefox|Chrome|Safari)/([\\d]+)');
  3939. return e ? {
  3940. name: e[1],
  3941. version: parseInt(e[2]),
  3942. platform: navigator.platform
  3943. } : {};
  3944. },
  3945. is(e) {
  3946. return this.details() && this.details().name === e;
  3947. },
  3948. inIframe() {
  3949. return window.parent !== window;
  3950. },
  3951. aspectRatio() {
  3952. var e = window.innerWidth / window.innerHeight;
  3953. return isFinite(e) ? e : 0;
  3954. },
  3955. userAgent() {
  3956. return window.navigator.userAgent;
  3957. },
  3958. isMobile() {
  3959. var e = navigator.userAgent || navigator.vendor || window.opera;
  3960. return /(android|bb\d+|meego).+mobile|android|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0, 4));
  3961. },
  3962. isLandscape() {
  3963. return this.isMobile && this.aspectRatio() > 1;
  3964. },
  3965. isSmallScreen() {
  3966. var e = screen.width / window.devicePixelRatio;
  3967. return e < 240;
  3968. },
  3969. detectWeixin: function detectWeixin() {
  3970. //微信 包括PC的微信
  3971. return window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger';
  3972. },
  3973. detectWeixinMiniProgram: function detectWeixinMiniProgram() {
  3974. return window.navigator.userAgent.match('miniProgram');
  3975. },
  3976. detectIE() {
  3977. var e = window.navigator.userAgent,
  3978. t = e.indexOf('MSIE ');
  3979. return t !== -1 || !!navigator.userAgent.match(/Trident.*rv\:11\./);
  3980. },
  3981. detectSafari() {
  3982. var e = window.navigator.userAgent,
  3983. t = e.indexOf('Safari');
  3984. return t !== -1 && !this.detectChrome();
  3985. },
  3986. detectFirefox() {
  3987. var e = window.navigator.userAgent;
  3988. return e.indexOf('Firefox') !== -1;
  3989. },
  3990. detectChrome() {
  3991. var e = window.navigator.userAgent;
  3992. return e.indexOf('Chrome') !== -1 && !this.detectOpera();
  3993. },
  3994. detectOpera() {
  3995. var e = window.navigator.userAgent;
  3996. return e.indexOf('OPR') !== -1;
  3997. },
  3998. detectIOS() {
  3999. return this.detectIPhone() || this.detectIPad() || this.detectIPod();
  4000. },
  4001. detectIPad() {
  4002. var e = window.navigator.userAgent,
  4003. t = /iPad/;
  4004. return t.test(e);
  4005. },
  4006. detectIPod() {
  4007. var e = window.navigator.userAgent,
  4008. t = /iPod/;
  4009. return t.test(e);
  4010. },
  4011. detectIPhone() {
  4012. var e = window.navigator.userAgent,
  4013. t = /iPhone/;
  4014. return t.test(e);
  4015. },
  4016. detectAndroid() {
  4017. var e = window.navigator.userAgent;
  4018. return e.indexOf('Android') !== -1;
  4019. },
  4020. detectAndroidMobile() {
  4021. var e = window.navigator.userAgent;
  4022. return this.detectAndroid() && e.indexOf('Mobile') !== -1;
  4023. },
  4024. detectSamsungNative() {
  4025. var e = window.navigator.userAgent;
  4026. return e.indexOf('SM-G900H') !== -1 || e.indexOf('GT-I9500') !== -1 || e.indexOf('SM-N900') !== -1;
  4027. },
  4028. detectSamsungS6() {
  4029. var e = window.navigator.userAgent;
  4030. return e.indexOf('SM-G92') !== -1;
  4031. },
  4032. /************************************************************徐世廷*************************************************************/
  4033. detectHUAWEI5X() {
  4034. return -1 !== window.navigator.userAgent.indexOf('KIW-TL00H');
  4035. },
  4036. /*******************************************************************************************************************************/
  4037. detectWebVR() {
  4038. return !(!window.navigator.getVRDisplays || !window.VRDisplay);
  4039. },
  4040. getVRDisplay() {
  4041. var _this = this;
  4042. // var e = $.Deferred()
  4043. // return this.detectWebVR()
  4044. // ? (navigator.getVRDisplays().then(function (t) {
  4045. // t.length >= 1 && e.resolve(t[0]), e.reject(null)
  4046. // }),
  4047. // e)
  4048. // : e.reject(null)
  4049. return new Promise(function (resolve, reject) {
  4050. if (_this.detectWebVR()) {
  4051. navigator.getVRDisplays().then(function (t) {
  4052. if (t.length >= 1) {
  4053. resolve(t[0]);
  4054. } else {
  4055. reject(null);
  4056. }
  4057. }).catch(function () {
  4058. return reject(null);
  4059. });
  4060. } else {
  4061. reject(null);
  4062. }
  4063. });
  4064. },
  4065. iosVersion() {
  4066. if (!this.detectIOS()) throw new DeviceMismatchException('Did not detect an iDevice');
  4067. var e = /((?:\d+\_?){1,3}) like Mac OS/,
  4068. t = '_';
  4069. return this.mobileVersion(e, t);
  4070. },
  4071. androidVersion() {
  4072. if (!this.detectAndroid()) throw new DeviceMismatchException('Did not detect an Android based device');
  4073. var e = /Android ((?:\d+\.?){1,3})/,
  4074. t = '.';
  4075. return this.mobileVersion(e, t);
  4076. },
  4077. valueFromCookie(e, t) {
  4078. var i = new RegExp(e + '=([0-9a-f]+)(; ?|$)').exec(document.cookie);
  4079. if (!i) return t;
  4080. var n = i[1];
  4081. return 'boolean' == typeof t ? 'true' === n || '1' === n : 'number' == typeof t ? parseFloat(n) : n;
  4082. },
  4083. valueFromHash(e, t) {
  4084. var i = new RegExp('[#&?]' + e + '=([^#&?]*)'),
  4085. n = i.exec(window.location.href);
  4086. if (!n) return t;
  4087. var r = n[1];
  4088. return 'boolean' == typeof t ? 'true' === r || '1' === r : 'number' == typeof t ? parseFloat(r) : window.decodeURIComponent(r);
  4089. },
  4090. valueFromUrl(key) {
  4091. return this.urlHasValue(key, true);
  4092. },
  4093. urlHasValue: function urlHasValue(key, isGetValue) {
  4094. var querys = window.location.search.substr(1).split('&');
  4095. if (isGetValue) {
  4096. for (var i = 0; i < querys.length; i++) {
  4097. var keypair = querys[i].split('=');
  4098. if (keypair.length === 2 && keypair[0] === key) {
  4099. return keypair[1];
  4100. }
  4101. }
  4102. return '';
  4103. } else {
  4104. //return window.location.search.match("&" + key + "|\\?" + key) != null 有bug
  4105. for (var _i = 0; _i < querys.length; _i++) {
  4106. var _keypair = querys[_i].split('=');
  4107. if (_keypair[0] == key) {
  4108. return true;
  4109. }
  4110. }
  4111. return false;
  4112. }
  4113. }
  4114. };
  4115. var Colors = {
  4116. //加个4dkk经典原谅绿----许钟文
  4117. //green: new THREE.Color('#00c8aF'),
  4118. green: new THREE.Color('#15FFE2'),
  4119. yellow: new THREE.Color('#F6FE14'),
  4120. lightGreen: new THREE.Color('#09e1c0'),
  4121. newBlue: new THREE.Color('#00c8ae'),
  4122. //new THREE.Color(4967932),
  4123. altBlue: new THREE.Color(47355),
  4124. tagDefault: new THREE.Color(223357),
  4125. classicBlue: new THREE.Color(53759),
  4126. mpYellow: new THREE.Color(16502016),
  4127. mpOrange: new THREE.Color(16428055),
  4128. mpBlue: new THREE.Color(12096),
  4129. mpLtGrey: new THREE.Color(13751252),
  4130. mpDkGrey: new THREE.Color(10000019),
  4131. mpRed: new THREE.Color(12525854),
  4132. mpOrangeDesat: new THREE.Color(16764529),
  4133. mpBlueDesat: new THREE.Color(4034734),
  4134. mpRedDesat: new THREE.Color(14705505),
  4135. white: new THREE.Color(16777215),
  4136. black: new THREE.Color(0),
  4137. _desat(e, t) {
  4138. var i = t || 0.3,
  4139. r = new THREE.Color().copy(e).getHSL(e);
  4140. return new THREE.Color().setHSL(r.h, r.s * (1 - i), r.l);
  4141. },
  4142. _darken(e, t) {
  4143. var i = t || 0.2,
  4144. r = e.getHSL(e);
  4145. return new THREE.Color().setHSL(r.h, r.s, r.l * (1 - i));
  4146. }
  4147. };
  4148. var WarpStyle = {
  4149. BLACK: 'black',
  4150. STD: 'std',
  4151. WALK: 'walk'
  4152. };
  4153. Math.sign = function (e) {
  4154. return e < 0 ? -1 : 1;
  4155. };
  4156. var constants$4 = {
  4157. signedUrlDefaultExpireTime: 24e4,
  4158. signedUrlCheckInterval: 1e4,
  4159. signedUrlRefreshBuffer: 15e3,
  4160. dollhouseFOV: browser$1.isMobile() ? 90 : 70,
  4161. dollhouseNear: 1,
  4162. dollhouseFar: 5e3,
  4163. insideFOV: browser$1.isMobile() ? 90 : 70,
  4164. insideFOVMax: 120,
  4165. insideNear: 0.1,
  4166. insideFar: 5e3,
  4167. insideLookSpeed: 0.12,
  4168. insideLookLimitUp: browser$1.valueFromUrl('ai') == 'sds' ? 50 : browser$1.isMobile() ? 15 : 25,
  4169. insideLookLimitDown: browser$1.valueFromUrl('ai') == 'sds' ? -50 : browser$1.isMobile() ? -15 : -25,
  4170. orthoNear: 1,
  4171. orthoFar: 5e3,
  4172. orthoBase: 10,
  4173. planeHeightShift: 0.1,
  4174. narrowLandscapeHeight: 290,
  4175. reallyNarrowLandscapeHeight: 250,
  4176. visionTilingStartDate: new Date('8/26/2016'),
  4177. visionTilingStartVersion: '1.1.407.13667',
  4178. windowHeightHighQualityThreshold: 900,
  4179. tourStepDelayDefault: 3500,
  4180. tourStepDelaySlideShow: 5e3,
  4181. workshopApsect: 9 / 16,
  4182. highQualityMaxZoom: 2,
  4183. ultraHighQualityMaxZoom: 3
  4184. };
  4185. var RenderOrder = {
  4186. boundingSkybox: 1,
  4187. visibleFloor: 1,
  4188. highTileCube: 2,
  4189. panoMarker: 2,
  4190. //不能遮挡住overlay等物体
  4191. overlay: 5,
  4192. //panoLabel: 6,
  4193. footIcon: 6,
  4194. reticule: 7,
  4195. tagStem: 8,
  4196. tagDisc: 9,
  4197. ribbon: 9,
  4198. ghostFloor: 10,
  4199. //透明的不能在不透明(visibleFloor、videoTag)之前渲染否则会遮住
  4200. cad: 11,
  4201. //floorplan
  4202. view: 13,
  4203. measure: 14,
  4204. entryArrow: 14,
  4205. monitorPlane: 20
  4206. };
  4207. /*
  4208. renderOrder并非大的就一定能盖住小的, 透明的反而需要后渲染,否则会盖住先渲染的。
  4209. */
  4210. var settings$2 = {
  4211. visions: 2,
  4212. //2有下相机
  4213. debug: false,
  4214. version: '2.23.8-0-g24ec69e',
  4215. skyboxRadius: 2500,
  4216. job: 'dacf7dfa24ae47fab8fcebfe4dc41ab9',
  4217. preTexture: '_50k_texture_jpg_high1',
  4218. format: '_50k.dam',
  4219. skyboxRadius: 2500,
  4220. modelBoundsPadding: 5,
  4221. showNeighbors: !1,
  4222. useWheel: browser$1.valueFromHash('wh', !0),
  4223. crossOrigin: 'anonymous',
  4224. fancierTransition: !1,
  4225. wireframe: !1,
  4226. skyboxWireframe: !1,
  4227. modelAlpha: 1,
  4228. highlightPanoSelection: !1,
  4229. showSweeps: !0,
  4230. showSkyboxes: !1,
  4231. showMesh: !0,
  4232. showFloors: !1,
  4233. showFloorDuration: 300,
  4234. showFloorDelay: 300,
  4235. hideFloorDuration: 300,
  4236. hideFloorDelay: 0,
  4237. reticuleOpacityTransitionTime: 250,
  4238. reticuleColor: Colors.newBlue,
  4239. markerOpacityTransitionTime: 500,
  4240. guiAnimationSpeed: 250,
  4241. highlightAnimationDuration: 500,
  4242. modelComponentLoadSpinnerDelay: 150,
  4243. captureErrors: !1,
  4244. maxMobileTextures: 6,
  4245. minimalMemoryMode: browser$1.valueFromHash('m3', browser$1.isMobile()),
  4246. startupFlyinDelay: 3e3,
  4247. vrEnabled: false,
  4248. overlay: {
  4249. width: 1,
  4250. height: 0.5,
  4251. depth: 0.04
  4252. },
  4253. dollhouseDefault: {
  4254. minDistance: 15,
  4255. maxDistance: 50,
  4256. minPolarAngle: THREE.MathUtils.degToRad(10),
  4257. maxPolarAngle: THREE.MathUtils.degToRad(90)
  4258. },
  4259. hideReticuleTimeout: 1e3,
  4260. analytics: {
  4261. inactivityThreshold: 30,
  4262. sessionTrackingRate: 0.15,
  4263. maxTrackedErrors: 20,
  4264. sessionDurationPingFrequency: 10,
  4265. sessionDurationTimeout: 15
  4266. },
  4267. flydown: {
  4268. movementEasing: 'easeInOutQuad',
  4269. movementDelay: 0.001,
  4270. rotationEasing: 'easeInOutQuad',
  4271. rotationDelay: 0.5,
  4272. modelTextureDelay: 0.75,
  4273. skyboxDelay: 0.75
  4274. },
  4275. transition: {
  4276. /* flySpeed: 0.0037, //匀速行走的速度,稍微比正常过渡快一些 //0.01,
  4277. flyTime: 300, //750, 最小时间
  4278. flytimeMaxDistanceThreshold: 7, //5,
  4279. flytimeDistanceMultiplier: 300, //120,//150, */
  4280. flySpeed: 0.0043,
  4281. //匀速行走的速度,稍微比正常过渡快一些 //0.01,
  4282. flyTime: 650,
  4283. //750, 最小时间
  4284. flytimeMaxDistanceThreshold: 10,
  4285. //5,
  4286. flytimeDistanceMultiplier: 120,
  4287. //120,//150,
  4288. maxRotSpeed: 1.2,
  4289. //add
  4290. aimTime: 1500,
  4291. aimSlowFactor: 1.5,
  4292. blur: 0.8,
  4293. movementEasing: 'easeOutSine',
  4294. //'easeOutSine',//'easeInOutQuad',
  4295. blendEasing: 'easeInOutQuad',
  4296. fastForwardFactor: browser$1.valueFromHash('mfis', 3)
  4297. },
  4298. show360Views: {
  4299. enabled: !0,
  4300. transitionTime: 1e3
  4301. },
  4302. quickstart: {
  4303. enabled: 1,
  4304. //1 === browser.valueFromHash('qust', 0) || 1 === browser.valueFromHash('qs', 0),
  4305. animation: 1400,
  4306. showTextDelay: 500,
  4307. fadeOutDelay: 3e3,
  4308. fovChange: 10
  4309. },
  4310. appConfig: {
  4311. webvr_version: null,
  4312. segment_key: null,
  4313. embedly_key: null,
  4314. branch_key: null,
  4315. keen_write_key: null,
  4316. keen_project_id: null
  4317. },
  4318. input: {
  4319. longTapThreshold: 200,
  4320. moveToleranceNDC: 0.08,
  4321. touchMoveThreshold: 25
  4322. },
  4323. labels: {
  4324. enabled: !1,
  4325. hideUntilStart: !0,
  4326. fadeInDuration: 250,
  4327. fadeInDelay: 250,
  4328. fadeOutDuration: 250,
  4329. fadeOutDelay: 0,
  4330. zoomHideThreshhold: {
  4331. mobile: browser$1.isSmallScreen() ? 0.45 : 0.6,
  4332. desktop: 2
  4333. },
  4334. zoomTruncateThreshhold: {
  4335. mobile: browser$1.isSmallScreen() ? 0.35 : 0.45,
  4336. desktop: 0.85
  4337. },
  4338. minLengthForTruncate: 16,
  4339. truncateLength: 12,
  4340. truncateSuffix: '...'
  4341. },
  4342. tags: {
  4343. enabled: browser$1.valueFromHash('mt', 1),
  4344. startup: {
  4345. hideUntilStart: !0,
  4346. fadeInDuration: 500,
  4347. fadeInDelay: 100
  4348. },
  4349. visibility: {
  4350. anyDistance: !0,
  4351. visibleDistance: 8,
  4352. cameraClearance: 0.1,
  4353. alphaTestLevel: 0.05,
  4354. hideViaFloor: !0,
  4355. hideOffScreenDisc: !1,
  4356. hideOffScreenObject: !1
  4357. },
  4358. disc: {
  4359. opacity: 1,
  4360. disabledOpacity: 0.5,
  4361. scale: {
  4362. nearBound: 1.5,
  4363. farBound: 4.8,
  4364. linkFarBound: !1,
  4365. linkPercent: 40,
  4366. maxSize: 80,
  4367. minSize: 40,
  4368. baseViewportSize: 800,
  4369. responsiveness: 100
  4370. }
  4371. },
  4372. pole: {
  4373. enabled: !0,
  4374. height: 0.5,
  4375. width: 2,
  4376. opacity: 0.5,
  4377. color: 'white'
  4378. },
  4379. navigate: {
  4380. nearestPano: !0,
  4381. lineOfSight: !0,
  4382. reactivate: !0,
  4383. aimAt: 'disc',
  4384. tiltTolerance: 25,
  4385. rotateSpeedFactor: 0.6
  4386. }
  4387. },
  4388. view360: {
  4389. //xzw add
  4390. circleDisToCenter: 2.4,
  4391. visibleDisAtView: 15
  4392. },
  4393. boundExpandLength: 1.5,
  4394. path: {
  4395. color: Colors.newBlue,
  4396. colorUp: Colors._desat(Colors.newBlue, 0.5),
  4397. colorDown: Colors._darken(Colors.newBlue, 0.35),
  4398. opacity: 0.5,
  4399. style: 'ribbon',
  4400. height: 0.025,
  4401. ribbonWidth: 0.24,
  4402. outsideHeight: 0.5,
  4403. waypointRadius: 0.5,
  4404. waypointIndoorRadius: 0.24,
  4405. waypointPulse: 1e3,
  4406. typ: WarpStyle.BLACK,
  4407. meshFree: browser$1.valueFromHash('mf', 1),
  4408. mapGuides: browser$1.valueFromHash('guides', !0),
  4409. fadeInTime: 400,
  4410. fadeOutTime: 300
  4411. },
  4412. warp: {
  4413. nearPanoDist: 0.1,
  4414. matchCam: !1,
  4415. blur: 0.33,
  4416. fastTime: 1500,
  4417. teleportTime: 1500,
  4418. outsideTime: 2e3,
  4419. lookAheadMax: 0.3,
  4420. lookAheadDist: 2.5,
  4421. softPushDist: 0.37,
  4422. softPushEnd: 0.3,
  4423. softBendAngle: 8,
  4424. softBendTilt: 4,
  4425. softBendEnd: 0.3,
  4426. doBurns: browser$1.valueFromHash('kb', !0),
  4427. burnsAngle: 35,
  4428. minBurnsAngle: 35,
  4429. minDownAngle: -35,
  4430. maxTurnPerSec: 280,
  4431. maxAimPerSec: 35,
  4432. minRotation: 12,
  4433. maxAimRotation: 33.2,
  4434. turnFriction: 0.2,
  4435. flySpeed: 0.01,
  4436. minWarpTime: 1200,
  4437. warpInterruptionRedirectTime: 500,
  4438. tourStepDelay: browser$1.valueFromHash('st', 0),
  4439. walkDelay: 0,
  4440. walkMaxDist: 50,
  4441. walkMinDist: 0.8,
  4442. walkSlideShowThreshhold: 3e3,
  4443. walkExtraPanosDistance: 0.4,
  4444. timePerMeter: 800,
  4445. motionLeadTime: 500,
  4446. movementEasing: 'easeInOutQuad',
  4447. blendEasing: 'easeInOutQuad',
  4448. showBunny: !1,
  4449. loop: browser$1.valueFromHash('lp', !1),
  4450. auto: browser$1.valueFromHash('ts', -1),
  4451. eOrder: 'YXZ',
  4452. stepFactor: 0.25,
  4453. brakeStrength: 2,
  4454. minBrakeAngle: 0.1,
  4455. maxBrakeAngle: 1.8,
  4456. climbEffort: 4
  4457. },
  4458. rotationFriction: browser$1.isMobile() ? 0.08 : 0.05,
  4459. rotationAccelerationInside: 4.5,
  4460. rotationAccelerationOutside: 0.15,
  4461. rotationAfterMoveMultiplierX: browser$1.isMobile() ? 120 : 40,
  4462. rotationAfterMoveMultiplierY: 40,
  4463. rotationAfterMoveHistoryCount: 5,
  4464. panFriction: 0.09,
  4465. panAccelerationOutside: 60,
  4466. //onload: browser.valueFromHash('onload', Viewmode.PANORAMA),
  4467. zoomNearLimit: 0.1,
  4468. zoomFarLimit: 10,
  4469. navigation: {
  4470. panoScores: !1,
  4471. mouseDirection: !0,
  4472. filterStrictness: 0.75,
  4473. angleFactor: -30,
  4474. directionFactor: 10,
  4475. distanceFactor: -1,
  4476. optionalityFactor: 3
  4477. },
  4478. sdkInit: !1,
  4479. secretPanelWord: [38, 38, 40, 40, 37, 39, 37, 39, 66, 65],
  4480. console: browser$1.valueFromHash('console', !1),
  4481. noMeshFloorPositionOffset: new THREE.Vector3(0, -1.2, 0),
  4482. panoramaNeighbourMaxDistance: 5,
  4483. panoFloorClickRadius: 0.35,
  4484. showScreenshotLocations: !1,
  4485. showAxis: !1,
  4486. showNeighbourRaycasts: !1,
  4487. colorMarkerOnLoad: !1,
  4488. colorMarkerByFloor: !1,
  4489. tiling: {
  4490. panoPreRenderRepeatDelay: 2500,
  4491. panoPreRenderDelay: 500,
  4492. preRenderTourPanos: browser$1.valueFromHash('tileprerender', 0),
  4493. tilingFlagNames: ['usetiles', 'tiles'],
  4494. maxNavPanoQuality: browser$1.valueFromHash('maxtileq', null),
  4495. maxZoomPanoQuality: browser$1.valueFromHash('maxztileq', null),
  4496. overlayStyle: browser$1.valueFromHash('tileoverlay', 0),
  4497. uploadIntervalDelay: browser$1.valueFromHash('tileupdelay', 10),
  4498. initialIntervalDelay: browser$1.valueFromHash('itiledelay', 0),
  4499. maxNonBaseUploadsPerFrame: browser$1.valueFromHash('maxnbtpf', 2),
  4500. maxBaseUploadsPerFrame: browser$1.valueFromHash('maxbtpf', 6),
  4501. customCompression: browser$1.valueFromHash('tilecustcomp', 0),
  4502. mobileHighQualityOverride: !1,
  4503. allowUltraHighResolution: !0
  4504. },
  4505. zoom: {
  4506. enabled: !0,
  4507. forceOff: browser$1.valueFromHash('nozoom', 0),
  4508. overridemax: browser$1.valueFromHash('maxzoom', null),
  4509. overridemin: browser$1.valueFromHash('minzoom', null),
  4510. max: constants$4.highQualityMaxZoom,
  4511. min: 1,
  4512. transitionStyle: browser$1.valueFromHash('zoomtrans', 1),
  4513. activationThreshold: 1.1,
  4514. restoreTime: 500,
  4515. zoomToDefaultWhenToPano: true //add
  4516. },
  4517. profiling: {
  4518. enabled: browser$1.valueFromHash('mem', !1)
  4519. }
  4520. /*
  4521. insideFOV: browser.valueFromHash("fov", constants.insideFOV),
  4522. insideFOVMax: browser.valueFromHash("fovmax", constants.insideFOVMax),
  4523. panorama: {
  4524. transitionTime: 1e3,
  4525. modelAlpha: 0,
  4526. modelAlphaDelay: .75,
  4527. modelAlphaLength: 1,
  4528. skyboxOpacity: 1,
  4529. skyboxOpacityDelay: .75,
  4530. skyboxOpacityLength: .9,
  4531. fovLength: 1,
  4532. fovDelay: 0,
  4533. cameraMatrixDuration: .8,
  4534. cameraMatrixDelay: 0,
  4535. cameraMatrixEase: easing.easeInCubic,
  4536. reticuleOpacity: 1,
  4537. markerOpacity: .3,
  4538. markerOpacityOnHover: 1
  4539. },
  4540. dollhouse: {
  4541. transitionTime: 1e3,
  4542. modelAlpha: 1,
  4543. modelAlphaDelay: 0,
  4544. modelAlphaLength: 1 - .75,
  4545. skyboxOpacity: 0,
  4546. skyboxOpacityDelay: 0,
  4547. skyboxOpacityLength: 1 - .75,
  4548. fovLength: 1,
  4549. fovDelay: 0,
  4550. cameraMatrixDuration: .8,
  4551. cameraMatrixDelay: .3,
  4552. cameraMatrixEase: easing.easeInCubic,
  4553. reticuleOpacity: 1,
  4554. markerOpacity: 0,
  4555. markerOpacityOnHover: 0
  4556. },
  4557. floorplan: {
  4558. transitionTime: 1e3,
  4559. modelAlpha: 1,
  4560. modelAlphaDelay: 0,
  4561. modelAlphaLength: 1 - .75,
  4562. skyboxOpacity: 0,
  4563. skyboxOpacityDelay: 0,
  4564. skyboxOpacityLength: 1 - .75,
  4565. fovLength: 1,
  4566. fovDelay: 0,
  4567. cameraMatrixDuration: .5,
  4568. cameraMatrixDelay: 0,
  4569. cameraMatrixEase: easing.easeOutCubic,
  4570. reticuleOpacity: 1,
  4571. markerOpacity: 0,
  4572. markerOpacityOnHover: 0,
  4573. cameraHeight: 50
  4574. },
  4575. transitioning: {
  4576. reticuleOpacity: 0,
  4577. markerOpacity: .3,
  4578. markerOpacityOnHover: 1
  4579. },
  4580. "floorplan-dollhouse": {
  4581. rotationDelay: 0,
  4582. rotationDuration: 1
  4583. },
  4584. "floorplan-panorama": {
  4585. rotationDelay: .5,
  4586. rotationDuration: 1
  4587. },
  4588. "dollhouse-panorama": {
  4589. rotationDelay: .5,
  4590. rotationDuration: 1
  4591. },
  4592. "dollhouse-floorplan": {
  4593. rotationDelay: 0,
  4594. rotationDuration: 1,
  4595. cameraMatrixDuration: 1.05,
  4596. cameraMatrixDelay: .5
  4597. },
  4598. "panorama-dollhouse": {
  4599. rotationDelay: 0,
  4600. rotationDuration: .5
  4601. },
  4602. "panorama-floorplan": {
  4603. transitionTime: 1500,
  4604. rotationDelay: 0,
  4605. rotationDuration: .5
  4606. }
  4607. */
  4608. };
  4609. settings$2 = common.deepExtend(settings$2, constants$4, {
  4610. insideFOV: browser$1.valueFromHash('fov', constants$4.insideFOV),
  4611. insideFOVMax: browser$1.valueFromHash('fovmax', constants$4.insideFOVMax),
  4612. panorama: {
  4613. transitionTime: 1e3,
  4614. modelAlpha: 0,
  4615. modelAlphaDelay: settings$2.flydown.modelTextureDelay,
  4616. modelAlphaLength: 1,
  4617. skyboxOpacity: 1,
  4618. skyboxOpacityDelay: settings$2.flydown.skyboxDelay,
  4619. skyboxOpacityLength: 0.9,
  4620. fovLength: 1,
  4621. fovDelay: 0,
  4622. cameraMatrixDuration: 0.8,
  4623. cameraMatrixDelay: 0,
  4624. cameraMatrixEase: easing.easeInCubic,
  4625. reticuleOpacity: 1,
  4626. markerOpacity: 0.3,
  4627. markerOpacityOnHover: 1
  4628. },
  4629. dollhouse: {
  4630. transitionTime: 1e3,
  4631. modelAlpha: 1,
  4632. modelAlphaDelay: 0,
  4633. modelAlphaLength: 1 - settings$2.flydown.modelTextureDelay,
  4634. skyboxOpacity: 0,
  4635. skyboxOpacityDelay: 0,
  4636. skyboxOpacityLength: 1 - settings$2.flydown.skyboxDelay,
  4637. fovLength: 1,
  4638. fovDelay: 0,
  4639. cameraMatrixDuration: 0.8,
  4640. cameraMatrixDelay: 0.3,
  4641. cameraMatrixEase: easing.easeInQuint,
  4642. //原先的ease模型较大时效果不好
  4643. reticuleOpacity: 1,
  4644. markerOpacity: 0,
  4645. markerOpacityOnHover: 0
  4646. },
  4647. floorplan: {
  4648. transitionTime: 1e3,
  4649. modelAlpha: 1,
  4650. modelAlphaDelay: 0,
  4651. modelAlphaLength: 1 - settings$2.flydown.modelTextureDelay,
  4652. skyboxOpacity: 0,
  4653. skyboxOpacityDelay: 0,
  4654. skyboxOpacityLength: 1 - settings$2.flydown.skyboxDelay,
  4655. fovLength: 1,
  4656. fovDelay: 0,
  4657. cameraMatrixDuration: 0.5,
  4658. cameraMatrixDelay: 0,
  4659. cameraMatrixEase: easing.easeOutQuint,
  4660. //easing.easeOutCubic,
  4661. reticuleOpacity: 1,
  4662. markerOpacity: 0,
  4663. markerOpacityOnHover: 0,
  4664. cameraHeight: 50
  4665. },
  4666. transitioning: {
  4667. reticuleOpacity: 0,
  4668. markerOpacity: 0.3,
  4669. markerOpacityOnHover: 1
  4670. },
  4671. 'floorplan-dollhouse': {
  4672. rotationDelay: 0,
  4673. rotationDuration: 1,
  4674. cameraMatrixEase: easing.easeInQuint //原先的ease模型较大时效果不好
  4675. },
  4676. 'floorplan-panorama': {
  4677. rotationDelay: 0.5,
  4678. rotationDuration: 1
  4679. },
  4680. 'dollhouse-panorama': {
  4681. rotationDelay: 0.5,
  4682. rotationDuration: 1
  4683. },
  4684. 'dollhouse-floorplan': {
  4685. rotationDelay: 0,
  4686. rotationDuration: 1,
  4687. cameraMatrixDuration: 1.05,
  4688. cameraMatrixDelay: 0.5
  4689. },
  4690. 'panorama-dollhouse': {
  4691. rotationDelay: 0,
  4692. rotationDuration: 0.5,
  4693. cameraMatrixEase: easing.easeInOutQuad //fov渐变
  4694. },
  4695. 'panorama-floorplan': {
  4696. transitionTime: 1500,
  4697. rotationDelay: 0,
  4698. rotationDuration: 0.5
  4699. },
  4700. //底图版
  4701. /* floorMat: {
  4702. //楼层材质
  4703. 'stardard-hide': {
  4704. //没有plane时的隐藏楼层
  4705. opacity: 0.2,
  4706. brightness: 0.12,
  4707. mixRatio: 0.7,
  4708. depthTest: true,
  4709. //depthWrite: false,
  4710. renderOrder: RenderOrder.ghostFloor, //透明在上层
  4711. //transparent:true
  4712. },
  4713. 'stardard-show': {
  4714. //没有plane时的所有显示楼层
  4715. opacity: 1,
  4716. brightness: 0,
  4717. mixRatio: 0,
  4718. depthTest: true,
  4719. //depthWrite: false,
  4720. renderOrder: RenderOrder.visibleFloor,
  4721. //transparent:true
  4722. },
  4723. 'hasPlane-normal': {
  4724. //有plane时的其他楼层
  4725. opacity: 0.024,
  4726. brightness: 0.6,
  4727. mixRatio: 1,
  4728. depthTest: true,
  4729. //depthWrite: false,
  4730. renderOrder: RenderOrder.visibleFloor,
  4731. //transparent:true
  4732. },
  4733. 'hasPlane-curFloor': {
  4734. //有plane时的当前楼层
  4735. opacity: 1,
  4736. brightness: 0.3, //0.11,
  4737. mixRatio: 0.78, //0.94,
  4738. depthTest: false,
  4739. //depthWrite: false,
  4740. renderOrder: RenderOrder.ghostFloor, //当前楼在上层,所以和之前反一下
  4741. //transparent:true
  4742. },
  4743. }, */
  4744. //修改depthTest超黑版,但会引起其他物体遮挡混乱
  4745. /* 'stardard-hide': {
  4746. //没有plane时的隐藏楼层
  4747. opacity: 0.2,
  4748. brightness: 0.12,
  4749. mixRatio: 0.7,
  4750. depthTest: true,
  4751. //depthWrite: false,
  4752. renderOrder: RenderOrder.ghostFloor, //透明在上层
  4753. //transparent:true
  4754. },
  4755. 'stardard-show': {
  4756. //没有plane时的所有显示楼层
  4757. opacity: 1,
  4758. brightness: 0,
  4759. mixRatio: 0,
  4760. depthTest: true,
  4761. //depthWrite: false,
  4762. renderOrder: RenderOrder.visibleFloor,
  4763. //transparent:true
  4764. },
  4765. 'hasPlane-normal': {
  4766. //有plane时的其他楼层
  4767. opacity: 0.024,
  4768. brightness: 0.6,
  4769. mixRatio: 1,
  4770. depthTest: true,
  4771. //depthWrite: false,
  4772. renderOrder: RenderOrder.ghostFloor ,
  4773. //transparent:true
  4774. },
  4775. 'hasPlane-curFloor': {
  4776. //有plane时的当前楼层
  4777. opacity: 1,
  4778. brightness: 0.1, //0.11,
  4779. mixRatio: 0.98, //0.94,
  4780. depthTest: false,
  4781. //depthWrite: false,
  4782. renderOrder: RenderOrder.ghostFloor+1, //当前楼在上层,所以和之前反一下
  4783. //transparent:true
  4784. }, */
  4785. floorMat: {
  4786. //楼层材质
  4787. 'stardard-hide': {
  4788. //没有plane时的隐藏楼层
  4789. opacity: 0.2,
  4790. brightness: 0.12,
  4791. mixRatio: 0.7,
  4792. depthTest: true,
  4793. renderOrder: RenderOrder.ghostFloor //透明在上层
  4794. },
  4795. 'stardard-show': {
  4796. //没有plane时的所有显示楼层
  4797. opacity: 1,
  4798. brightness: 0,
  4799. mixRatio: 0,
  4800. depthTest: true,
  4801. renderOrder: RenderOrder.visibleFloor
  4802. },
  4803. 'hasPlane-normal': {
  4804. //有plane时的其他楼层
  4805. opacity: 0.024,
  4806. brightness: 0.6,
  4807. mixRatio: 1,
  4808. depthTest: true,
  4809. //depthWrite: false,
  4810. renderOrder: RenderOrder.ghostFloor
  4811. },
  4812. 'hasPlane-curFloor': {
  4813. //有plane时的当前楼层
  4814. opacity: 1,
  4815. brightness: 0.1,
  4816. //0.11,
  4817. mixRatio: 0.98,
  4818. //0.94,
  4819. depthTest: true,
  4820. renderOrder: RenderOrder.visibleFloor
  4821. }
  4822. }
  4823. });
  4824. settings$2.path.meshFree && (settings$2.path.typ = WarpStyle.WALK);
  4825. settings$2.zoom.max = settings$2.zoom.overridemax || settings$2.zoom.max;
  4826. settings$2.zoom.min = settings$2.zoom.overridemin || settings$2.zoom.min;
  4827. settings$2.HorizontalBlurShader = new THREE.ShaderPass(THREE.HorizontalBlurShader);
  4828. settings$2.VerticalBlurShader = new THREE.ShaderPass(THREE.VerticalBlurShader);
  4829. settings$2.VerticalBlurShader.renderToScreen;
  4830. settings$2.aspect = window.innerWidth / window.innerHeight;
  4831. isNaN(constants$4.aspect) && (constants$4.aspect = 1); //settings.sphereBufferGeometry = new THREE.SphereBufferGeometry(0.1)
  4832. settings$2.planeBufferGeometry = new THREE.PlaneBufferGeometry(0.4, 0.4, 1, 1);
  4833. settings$2.freeze = Object.freeze({
  4834. FlyToPano: transitions$1.getUniqueId(),
  4835. FlyToNewMode: transitions$1.getUniqueId(),
  4836. FlyToSameMode: transitions$1.getUniqueId(),
  4837. FlyToViewFloor: transitions$1.getUniqueId(),
  4838. LookTransition: transitions$1.getUniqueId(),
  4839. ZoomTransition: transitions$1.getUniqueId(),
  4840. LookRotationForPlay: transitions$1.getUniqueId(),
  4841. wallLineShine: transitions$1.getUniqueId(),
  4842. spotShine: transitions$1.getUniqueId(),
  4843. rulerShine: transitions$1.getUniqueId(),
  4844. outsideFocus: transitions$1.getUniqueId(),
  4845. shopCircle: transitions$1.getUniqueId()
  4846. });
  4847. var settings$3 = settings$2;
  4848. var _class$1, _class2, _temp;
  4849. var _root = getScriptURL();
  4850. var components = {};
  4851. function defineComponent(name, component) {
  4852. if (typeof components[name] !== 'undefined') {
  4853. console.warn("Identifier component.".concat(name, " has already been declared"));
  4854. }
  4855. if (typeof component !== 'function') {
  4856. throw TypeError("argument component not a function");
  4857. }
  4858. components[name] = component;
  4859. }
  4860. var KanKan = Emitter(_class$1 = (_temp = _class2 = /*#__PURE__*/function () {
  4861. function KanKan(options) {
  4862. _classCallCheck(this, KanKan);
  4863. this.uid = KanKan.uid++;
  4864. this.env = KanKan.env;
  4865. this.version = KanKan.version;
  4866. this.dom = null;
  4867. this.$plugins = null;
  4868. this.core = new Component(this);
  4869. this.config = KanKan.config(options, {});
  4870. this.Plugins = new Plugins(this);
  4871. this.gui = new GUI(this);
  4872. if (this.config.vr.markerHeight != null) {
  4873. settings$3.vrMarkerHeight = this.config.vr.markerHeight;
  4874. }
  4875. if (this.config.scene.markerOpacity != null) {
  4876. settings$3.panorama.markerOpacity = this.config.scene.markerOpacity;
  4877. }
  4878. if (this.config.scene.pathEndColor != null) {
  4879. settings$3.path.color = this.config.scene.pathEndColor;
  4880. }
  4881. }
  4882. _createClass(KanKan, [{
  4883. key: "withConfig",
  4884. value: function withConfig(options) {
  4885. this.config = deepExtend(this.config, options || {}); //deepMergeObject(this.config, options || {})
  4886. }
  4887. }, {
  4888. key: "withDom",
  4889. value: function withDom() {
  4890. if (this.dom) {
  4891. // 已经初始化好,不再创建dom
  4892. return;
  4893. }
  4894. var container = typeof this.config.dom === 'string' ? document.querySelector(this.config.dom) : this.config.dom;
  4895. if (!container) {
  4896. throw new Error('options.dom must be require');
  4897. }
  4898. var dom = document.createElement('div');
  4899. dom.className = 'kankan-app';
  4900. var plugins = document.createElement('div');
  4901. plugins.id = "kankan-plugins__".concat(this.uid);
  4902. plugins.className = 'kankan-plugins';
  4903. plugins.style.position = 'absolute';
  4904. plugins.style.top = 0;
  4905. plugins.style.left = 0;
  4906. plugins.style.width = '100%';
  4907. plugins.style.height = '100%';
  4908. plugins.style.pointerEvents = 'none';
  4909. plugins.style.zIndex = 10;
  4910. var player_a = document.createElement('div');
  4911. player_a.className = 'player';
  4912. player_a.setAttribute('name', 'main');
  4913. var player_b = document.createElement('div');
  4914. player_b.className = 'player';
  4915. player_b.setAttribute('name', 'copy');
  4916. var player_mark = document.createElement('div');
  4917. player_mark.className = 'player-mark';
  4918. player_mark.style.backgroundImage = "url(".concat(this.resource.base('images/tag_pointer.png'), ")");
  4919. player_a.appendChild(player_mark);
  4920. player_b.appendChild(player_mark.cloneNode());
  4921. dom.appendChild(plugins);
  4922. dom.appendChild(player_a);
  4923. dom.appendChild(player_b);
  4924. container.appendChild(dom);
  4925. this.dom = dom;
  4926. this.$plugins = plugins;
  4927. }
  4928. }, {
  4929. key: "withComponent",
  4930. value: function withComponent(name) {
  4931. var factory = components[name];
  4932. if (typeof factory === 'undefined') {
  4933. console.warn("component[".concat(name, "] not a function"));
  4934. return;
  4935. }
  4936. var Instance = factory();
  4937. Instance.prototype.$app = this;
  4938. for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
  4939. args[_key - 1] = arguments[_key];
  4940. }
  4941. this.core.add(name, _construct(Instance, args));
  4942. }
  4943. }, {
  4944. key: "withNewComponent",
  4945. value: function withNewComponent(name) {
  4946. var factory = components[name];
  4947. if (typeof factory === 'undefined') {
  4948. console.warn("component[".concat(name, "] not a function"));
  4949. return;
  4950. }
  4951. var Instance = factory();
  4952. Instance.prototype.$app = this;
  4953. for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
  4954. args[_key2 - 1] = arguments[_key2];
  4955. }
  4956. return _construct(Instance, args);
  4957. }
  4958. }], [{
  4959. key: "root",
  4960. value: function root(path) {
  4961. return _root + path;
  4962. }
  4963. }, {
  4964. key: "config",
  4965. value: function config(options, target) {
  4966. if (typeof options !== 'object') {
  4967. return config$4;
  4968. }
  4969. if (target) {
  4970. target = Object.assign(target, config$4);
  4971. }
  4972. for (var key in options) {
  4973. if (['env', 'version'].indexOf(key) != -1) {
  4974. continue;
  4975. }
  4976. if (typeof config$4[key] === 'undefined') {
  4977. continue;
  4978. }
  4979. if (target) {
  4980. target[key] = options[key];
  4981. }
  4982. config$4[key] = options[key];
  4983. }
  4984. return target || config$4;
  4985. }
  4986. }]);
  4987. return KanKan;
  4988. }(), _class2.uid = 1, _class2.env = config$4.env, _class2.version = config$4.version, _class2.Config = config$4, _temp)) || _class$1;
  4989. var MathLight = {};
  4990. MathLight.RADIANS_PER_DEGREE = Math.PI / 180;
  4991. MathLight.DEGREES_PER_RADIAN = 180 / Math.PI;
  4992. MathLight.Vector3 = function (e, t, i) {
  4993. this.x = e || 0, this.y = t || 0, this.z = i || 0;
  4994. };
  4995. MathLight.Matrix4 = function () {
  4996. this.elements = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]), arguments.length > 0 && console.error('MathLight.Matrix4: the constructor no longer reads arguments. use .set() instead.');
  4997. };
  4998. MathLight.Matrix4.prototype = {
  4999. identity: function identity() {
  5000. return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this;
  5001. },
  5002. copy: function copy(e) {
  5003. return this.elements.set(e.elements), this;
  5004. },
  5005. applyToVector3: function applyToVector3(e) {
  5006. var t = e.x,
  5007. i = e.y,
  5008. n = e.z,
  5009. r = this.elements;
  5010. return e.x = r[0] * t + r[4] * i + r[8] * n + r[12], e.y = r[1] * t + r[5] * i + r[9] * n + r[13], e.z = r[2] * t + r[6] * i + r[10] * n + r[14], this;
  5011. },
  5012. getInverse: function getInverse(e, t) {
  5013. var i = this.elements,
  5014. n = e.elements,
  5015. r = n[0],
  5016. o = n[1],
  5017. a = n[2],
  5018. s = n[3],
  5019. l = n[4],
  5020. c = n[5],
  5021. h = n[6],
  5022. u = n[7],
  5023. d = n[8],
  5024. p = n[9],
  5025. f = n[10],
  5026. g = n[11],
  5027. m = n[12],
  5028. v = n[13],
  5029. A = n[14],
  5030. y = n[15],
  5031. C = p * A * u - v * f * u + v * h * g - c * A * g - p * h * y + c * f * y,
  5032. I = m * f * u - d * A * u - m * h * g + l * A * g + d * h * y - l * f * y,
  5033. E = d * v * u - m * p * u + m * c * g - l * v * g - d * c * y + l * p * y,
  5034. b = m * p * h - d * v * h - m * c * f + l * v * f + d * c * A - l * p * A,
  5035. w = r * C + o * I + a * E + s * b;
  5036. if (0 === w) {
  5037. var _ = "MathLight.Matrix4.getInverse(): can't invert matrix, determinant is 0";
  5038. if (t) throw new Error(_);
  5039. return console.warn(_), this.identity();
  5040. }
  5041. var T = 1 / w;
  5042. return i[0] = C * T, i[1] = (v * f * s - p * A * s - v * a * g + o * A * g + p * a * y - o * f * y) * T, i[2] = (c * A * s - v * h * s + v * a * u - o * A * u - c * a * y + o * h * y) * T, i[3] = (p * h * s - c * f * s - p * a * u + o * f * u + c * a * g - o * h * g) * T, i[4] = I * T, i[5] = (d * A * s - m * f * s + m * a * g - r * A * g - d * a * y + r * f * y) * T, i[6] = (m * h * s - l * A * s - m * a * u + r * A * u + l * a * y - r * h * y) * T, i[7] = (l * f * s - d * h * s + d * a * u - r * f * u - l * a * g + r * h * g) * T, i[8] = E * T, i[9] = (m * p * s - d * v * s - m * o * g + r * v * g + d * o * y - r * p * y) * T, i[10] = (l * v * s - m * c * s + m * o * u - r * v * u - l * o * y + r * c * y) * T, i[11] = (d * c * s - l * p * s - d * o * u + r * p * u + l * o * g - r * c * g) * T, i[12] = b * T, i[13] = (d * v * a - m * p * a + m * o * f - r * v * f - d * o * A + r * p * A) * T, i[14] = (m * c * a - l * v * a - m * o * h + r * v * h + l * o * A - r * c * A) * T, i[15] = (l * p * a - d * c * a + d * o * h - r * p * h - l * o * f + r * c * f) * T, this;
  5043. },
  5044. makeRotationFromQuaternion: function makeRotationFromQuaternion(e) {
  5045. var t = this.elements,
  5046. i = e.x,
  5047. n = e.y,
  5048. r = e.z,
  5049. o = e.w,
  5050. a = i + i,
  5051. s = n + n,
  5052. l = r + r,
  5053. c = i * a,
  5054. h = i * s,
  5055. u = i * l,
  5056. d = n * s,
  5057. p = n * l,
  5058. f = r * l,
  5059. g = o * a,
  5060. m = o * s,
  5061. v = o * l;
  5062. return t[0] = 1 - (d + f), t[4] = h - v, t[8] = u + m, t[1] = h + v, t[5] = 1 - (c + f), t[9] = p - g, t[2] = u - m, t[6] = p + g, t[10] = 1 - (c + d), t[3] = 0, t[7] = 0, t[11] = 0, t[12] = 0, t[13] = 0, t[14] = 0, t[15] = 1, this;
  5063. }
  5064. };
  5065. MathLight.Quaternion = function (e, t, i, n) {
  5066. this._x = e || 0, this._y = t || 0, this._z = i || 0, this._w = void 0 !== n ? n : 1;
  5067. };
  5068. MathLight.Quaternion.prototype = {
  5069. get x() {
  5070. return this._x;
  5071. },
  5072. set x(e) {
  5073. this._x = e;
  5074. },
  5075. get y() {
  5076. return this._y;
  5077. },
  5078. set y(e) {
  5079. this._y = e;
  5080. },
  5081. get z() {
  5082. return this._z;
  5083. },
  5084. set z(e) {
  5085. this._z = e;
  5086. },
  5087. get w() {
  5088. return this._w;
  5089. },
  5090. set w(e) {
  5091. this._w = e;
  5092. },
  5093. copy: function copy(e) {
  5094. this._x = e.x, this._y = e.y, this._z = e.z, this._w = e.w;
  5095. },
  5096. inverse: function inverse() {
  5097. return this.conjugate().normalize();
  5098. },
  5099. conjugate: function conjugate() {
  5100. return this._x *= -1, this._y *= -1, this._z *= -1, this;
  5101. },
  5102. length: function length() {
  5103. return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
  5104. },
  5105. normalize: function normalize() {
  5106. var e = this.length();
  5107. return 0 === e ? (this._x = 0, this._y = 0, this._z = 0, this._w = 1) : (e = 1 / e, this._x = this._x * e, this._y = this._y * e, this._z = this._z * e, this._w = this._w * e), this;
  5108. },
  5109. setFromAxisAngle: function setFromAxisAngle(e, t) {
  5110. var i = t / 2,
  5111. n = Math.sin(i);
  5112. return this._x = e.x * n, this._y = e.y * n, this._z = e.z * n, this._w = Math.cos(i), this;
  5113. },
  5114. setFromUnitVectors: function () {
  5115. var e,
  5116. t,
  5117. i = 1e-6;
  5118. return function (n, o) {
  5119. return void 0 === e && (e = new MathLight.Vector3()), t = MathLight.dot(n, o) + 1, t < i ? (t = 0, Math.abs(n.x) > Math.abs(n.z) ? MathLight.setVector(e, -n.y, n.x, 0) : MathLight.setVector(e, 0, -n.z, n.y)) : MathLight.cross(n, o, e), this._x = e.x, this._y = e.y, this._z = e.z, this._w = t, this.normalize();
  5120. };
  5121. }(),
  5122. multiply: function multiply(e) {
  5123. return this.multiplyQuaternions(this, e);
  5124. },
  5125. premultiply: function premultiply(e) {
  5126. return this.multiplyQuaternions(e, this);
  5127. },
  5128. multiplyQuaternions: function multiplyQuaternions(e, t) {
  5129. var i = e._x,
  5130. n = e._y,
  5131. r = e._z,
  5132. o = e._w,
  5133. a = t._x,
  5134. s = t._y,
  5135. l = t._z,
  5136. c = t._w;
  5137. return this._x = i * c + o * a + n * l - r * s, this._y = n * c + o * s + r * a - i * l, this._z = r * c + o * l + i * s - n * a, this._w = o * c - i * a - n * s - r * l, this;
  5138. }
  5139. };
  5140. MathLight.convertWorkshopVector = function (e) {
  5141. return new MathLight.Vector3(-e.x, e.y, e.z);
  5142. };
  5143. MathLight.convertWorkshopQuaternion = function (e) {
  5144. return new MathLight.Quaternion(-e.x, e.y, e.z, -e.w).multiply(new MathLight.Quaternion(Math.sqrt(2) / 2, Math.sqrt(2) / 2, 0, 0));
  5145. };
  5146. MathLight.convertWorkshopOrthoZoom = function (e) {
  5147. return e === -1 ? -1 : e / 16 * (window.innerWidth / window.innerHeight) / constants$4.workshopApsect;
  5148. };
  5149. MathLight.convertWorkshopPanoramaQuaternion = function (e) {
  5150. return new MathLight.Quaternion(e.x, -e.y, -e.z, e.w).normalize().multiply(new MathLight.Quaternion().setFromAxisAngle(new MathLight.Vector3(0, 1, 0), 270 * MathLight.RADIANS_PER_DEGREE));
  5151. };
  5152. MathLight.normalize = function (e) {
  5153. var t = e.x * e.x + e.y * e.y + e.z * e.z,
  5154. i = Math.sqrt(t);
  5155. e.x /= i, e.y /= i, e.z /= i;
  5156. };
  5157. MathLight.dot = function (e, t) {
  5158. return e.x * t.x + e.y * t.y + e.z * t.z;
  5159. };
  5160. MathLight.cross = function (e, t, i) {
  5161. var n = e.x,
  5162. r = e.y,
  5163. o = e.z;
  5164. i.x = r * t.z - o * t.y, i.y = o * t.x - n * t.z, i.z = n * t.y - r * t.x;
  5165. };
  5166. MathLight.setVector = function (e, t, i, n) {
  5167. e.x = t, e.y = i, e.z = n;
  5168. };
  5169. MathLight.copyVector = function (e, t) {
  5170. t.x = e.x, t.y = e.y, t.z = e.z;
  5171. };
  5172. MathLight.addVector = function (e, t) {
  5173. e.x += t.x, e.y += t.y, e.z += t.z;
  5174. };
  5175. MathLight.subVector = function (e, t) {
  5176. e.x -= t.x, e.y -= t.y, e.z -= t.z;
  5177. };
  5178. MathLight.applyQuaternionToVector = function (e, t) {
  5179. var i = t.x,
  5180. n = t.y,
  5181. r = t.z,
  5182. o = e.x,
  5183. a = e.y,
  5184. s = e.z,
  5185. l = e.w,
  5186. c = l * i + a * r - s * n,
  5187. h = l * n + s * i - o * r,
  5188. u = l * r + o * n - a * i,
  5189. d = -o * i - a * n - s * r;
  5190. t.x = c * l + d * -o + h * -s - u * -a, t.y = h * l + d * -a + u * -o - c * -s, t.z = u * l + d * -s + c * -a - h * -o;
  5191. };
  5192. MathLight.angleBetweenVectors = function (e, t) {
  5193. return Math.acos(MathLight.dot(e, t));
  5194. };
  5195. MathLight.closeTo = function (e1, e2, precision) {
  5196. //xzw add 判断e1,e2是否接近
  5197. var prec = Math.pow(10, -(precision || 4));
  5198. var s1 = Math.abs(e1.x - e2.x) < prec && Math.abs(e1.y - e2.y) < prec && Math.abs(e1.z - e2.z) < prec;
  5199. if (e1.w) {
  5200. return s1 && Math.abs(e1.w - e2.w) < prec;
  5201. } else return s1;
  5202. };
  5203. var ray$2 = new THREE.Raycaster();
  5204. var convertTool = {
  5205. getPos2d: function getPos2d(point, player, camera, dom) {
  5206. //获取一个三维坐标对应屏幕中的二维坐标
  5207. var camera = camera || player.camera;
  5208. var dom = dom || player.domElement;
  5209. var pos = point.clone().project(camera); //比之前hotspot的计算方式写得简单 project用于3转2(求法同shader); unproject用于2转3 :new r.Vector3(e.x, e.y, -1).unproject(this.camera);
  5210. var x, y;
  5211. x = (pos.x + 1) / 2 * dom.clientWidth;
  5212. y = (1 - (pos.y + 1) / 2) * dom.clientHeight;
  5213. var inSight = x <= dom.clientWidth && x >= 0 && //是否在屏幕中
  5214. y <= dom.clientHeight && y >= 0;
  5215. return {
  5216. pos: new THREE.Vector2(x, y),
  5217. // 屏幕像素坐标
  5218. vector: pos,
  5219. //(范围 -1 ~ 1)
  5220. trueSide: pos.z < 1,
  5221. //trueSide为false时,即使在屏幕范围内可见,也是反方向的另一个不可以被渲染的点 参见Tag.update
  5222. inSight: inSight //在屏幕范围内可见
  5223. };
  5224. },
  5225. ifShelter: function ifShelter(pos3d, player, pos2d, camera, floorIndex) {
  5226. //检测某点在视线中是否被mesh遮挡
  5227. if (!pos2d) pos2d = this.getPos2d(pos3d, player);
  5228. camera = camera || player.camera;
  5229. var ori = new THREE.Vector3(pos2d.x, pos2d.y, -1).unproject(camera); //找到视线原点
  5230. var dir = pos3d.clone().sub(ori).normalize();
  5231. ray$2.set(ori, dir); //由外向里 因为模型从内侧是可见的所以从外侧
  5232. /* if(config.isEdit && publicObjectSet.editor.mainDesign.editing){
  5233. var o = ray.intersectObjects(publicObjectSet.editor.mainDesign.wallMeshes);
  5234. }else{ */
  5235. var colliders = floorIndex == void 0 ? player.model.colliders : player.model.floors.index[floorIndex].collider.children;
  5236. var o = ray$2.intersectObjects(colliders); //}
  5237. var len = pos3d.distanceTo(ori);
  5238. if (o && o.length) {
  5239. for (var i = 0; i < o.length; i++) {
  5240. if (o[i].distance < len) {
  5241. return true;
  5242. } //有遮挡
  5243. }
  5244. }
  5245. },
  5246. /*
  5247. 拖拽时,获取鼠标在拖拽面上的位置(需要借助另一个intersectPlane面来计算,即和相机方向一样的面,可保证铺满屏幕)
  5248. 但是不一定能获取到,比如鼠标射线不朝向拖拽面时,即使获取也会是一个意外的反方向的交点。
  5249. */
  5250. getPosAtPlane: function getPosAtPlane(pos, player, info
  5251. /* , mouse, camera */
  5252. ) {
  5253. //pos:与intersectPlane的交点 见笔记
  5254. var A = pos;
  5255. var mouse = player.mouse;
  5256. var O = new THREE.Vector3(mouse.x, mouse.y, -1).unproject(player.camera);
  5257. if (info.y != void 0) {
  5258. //地面线的
  5259. var y = info.y;
  5260. if (player.mode == 'floorplan'
  5261. /* || Math.abs(O.x-pos.x)<0.0001 && Math.abs(O.z-pos.z)<0.0001) */
  5262. ) {
  5263. //intersectPlane和地面平行,无交点
  5264. var x = pos.x,
  5265. z = pos.z;
  5266. } else {
  5267. if (y < player.camera.position.y && O.y <= A.y
  5268. /* || y>player.camera.position.y && O.y >= A.y */
  5269. ) return null; //鼠标射线向上。因为相机一定位于地面以上(地面不会抬高到相机上吧?),所以无交点。
  5270. if (O.y == A.y) {
  5271. console.log('一样??');
  5272. return;
  5273. }
  5274. if (A.y == y) {
  5275. console.log('一样2??');
  5276. return;
  5277. }
  5278. var r = (O.y - y) / (A.y - y);
  5279. var x = (r * A.x - O.x) / (r - 1);
  5280. var z = (r * A.z - O.z) / (r - 1);
  5281. }
  5282. } else {
  5283. //垂直的也有越过消失点以后反向变化的情况,但使用时影响不大
  5284. var N = info.normalVec;
  5285. var P = info.pullPos;
  5286. if (N.y != 0) {
  5287. console.log('N.y != 0');
  5288. return;
  5289. } //仅仅支持垂直于地面的的墙壁,目前都是
  5290. if (O.z == A.z) {
  5291. console.log('O.z==A.z?');
  5292. return;
  5293. }
  5294. if (N.z != 0 && N.x != 0) {
  5295. //直接用这个通用的也可以,支持斜线的墙
  5296. //console.log('N.z==0 && N.x == 0?');
  5297. var c = N.x * (A.x - O.x) + N.y * (A.y - O.y) + N.z * (A.z - O.z);
  5298. if (c == 0) {
  5299. console.log('分母为0?? return;');
  5300. return;
  5301. }
  5302. var t = -(N.x * O.x + N.y * O.y + N.z * O.z - (P.x * N.x + P.y * N.y + P.z * N.z)) / c;
  5303. var x = t * (A.x - O.x) + O.x;
  5304. var y = t * (A.y - O.y) + O.y;
  5305. var z = t * (A.z - O.z) + O.z;
  5306. /*原理: 已知空间直线L:(x-a)/m=(x-b)/n=(z-c)/p和空间平面π:Ax+By+Cz+D=0;
  5307. 求直线L与平面π的交点的坐标。
  5308. 把直线方程改写成参数形式:设(x-a)/m=(x-b)/n=(z-c)/p=t;
  5309. 则x=mt+a;y=nt+b;z=pt+c;代入平面π的方程得:
  5310. A(mt+a)+B(nt+b)+C(pt+c)+D=0
  5311. 由此解得t=-(Aa+Bb+Cc+D)/(Am+Bn+Cp)
  5312. 再代入参数方程即得交点的坐标(x,y,z). */
  5313. } else if (N.x == 0) {
  5314. //z与pullPos相等
  5315. var z = P.z;
  5316. if (O.y == A.y) {
  5317. console.log('一样??');
  5318. return;
  5319. }
  5320. if (A.y == y) {
  5321. console.log('一样2??');
  5322. return;
  5323. }
  5324. if (A.z == z) {
  5325. console.log('一样3??');
  5326. return;
  5327. }
  5328. var r = (O.z - z) / (A.z - z);
  5329. var x = (r * A.x - O.x) / (r - 1);
  5330. var y = (r * A.y - O.y) / (r - 1);
  5331. } else if (N.z == 0) {
  5332. //x与pullPos相等
  5333. var x = P.x;
  5334. if (O.y == A.y) {
  5335. console.log('一样??');
  5336. return;
  5337. }
  5338. if (A.y == y) {
  5339. console.log('一样2??');
  5340. return;
  5341. }
  5342. if (A.x == x) {
  5343. console.log('一样3??');
  5344. return;
  5345. }
  5346. var r = (O.x - x) / (A.x - x);
  5347. var y = (r * A.y - O.y) / (r - 1);
  5348. var z = (r * A.z - O.z) / (r - 1);
  5349. }
  5350. }
  5351. return new THREE.Vector3(x, y, z);
  5352. },
  5353. getMouseIntersect: function getMouseIntersect(camera, meshes, mouse) {
  5354. //获取鼠标和meshes交点
  5355. var raycaster = new THREE.Raycaster();
  5356. camera.updateMatrixWorld();
  5357. var origin = new THREE.Vector3(mouse.x, mouse.y, -1).unproject(camera),
  5358. end = new THREE.Vector3(mouse.x, mouse.y, 1).unproject(camera);
  5359. var dir = end.sub(origin).normalize();
  5360. raycaster.set(origin, dir);
  5361. meshes.forEach(function (e) {
  5362. raycaster.layers.enable(math$1.getBaseLog(2, e.layers.mask));
  5363. });
  5364. var n = raycaster.intersectObjects(meshes);
  5365. if (0 === n.length) return null;
  5366. var i = n.find(function (e) {
  5367. return e.object.visible === true;
  5368. });
  5369. if (i) return i;
  5370. return null;
  5371. },
  5372. ifIntersectChunks: function ifIntersectChunks(A, B, model) {
  5373. var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
  5374. //获取某个线段/射线和meshes的交点
  5375. var dir = B.clone().sub(A).normalize();
  5376. var len = options.InfinityLen ? Infinity : A.distanceTo(B) + (options.extLen || 0);
  5377. if (len == 0) return;
  5378. var ray = new THREE.Raycaster(A.clone(), dir, 0, len);
  5379. var meshes = options.meshes || [];
  5380. if (meshes.length == 0) {
  5381. meshes = model.floors.reduce(function (e, t) {
  5382. return t.hidden ? e : e.concat(t.collider.children);
  5383. }, meshes);
  5384. }
  5385. var o = ray.intersectObjects(meshes); //var o = ray.intersectObjects(options.meshes || model.colliders)
  5386. if (o && o.length) return o;
  5387. if (options.throughWidth) {
  5388. //允许最小宽度,防止穿过极小的缝隙导致撞墙感
  5389. var normal = math$1.getNormal({
  5390. points: [{
  5391. x: A.x,
  5392. y: A.z
  5393. }, {
  5394. x: B.x,
  5395. y: B.z
  5396. }]
  5397. }); //线段法线
  5398. normal.multiplyScalar(options.throughWidth);
  5399. var normalVec3 = new THREE.Vector3(normal.x, 0, normal.y);
  5400. var A2 = A.clone().add(normalVec3);
  5401. ray.set(A2, dir);
  5402. var o2 = ray.intersectObjects(options.meshes || model.colliders);
  5403. ray.set(A.clone().add(normalVec3.negate()), dir);
  5404. if (o2 && o2.length) return o2;
  5405. var o3 = ray.intersectObjects(options.meshes || model.colliders);
  5406. if (o3 && o3.length) return o3;
  5407. }
  5408. return null;
  5409. },
  5410. /* getPosAtSphere : function(pos3d, toPanoPos){
  5411. var dir = pos3d.clone().sub(toPanoPos);
  5412. dir.normalize();//然后计算在球中
  5413. dir.multiplyScalar(Constants.skyRadius);
  5414. dir.add(toPanoPos);
  5415. return dir;
  5416. }, */
  5417. getVisiblePano: function getVisiblePano(position, model) {
  5418. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  5419. //获取某个坐标的可见pano。即没有遮挡的位置。
  5420. var visiblePanos = []; //var wallDepth = 0.075, discScale = 0.06;
  5421. var B = position.clone();
  5422. var panos = options.panos || model.panos.list;
  5423. panos.forEach(function (pano) {
  5424. if (!pano.isAligned()) return;
  5425. var A = pano.position.clone();
  5426. var distance = A.distanceTo(B);
  5427. if (options.maxDis != void 0 && distance > options.maxDis) {
  5428. //超出这个距离不可见
  5429. //console.log('超出',pano.id, distance-options.maxDis)
  5430. return;
  5431. }
  5432. var ray = new THREE.Raycaster(A.clone(), B.clone().sub(A).normalize(), 0, distance - (options.tolerance || 0));
  5433. /* discScale / 2 - wallDepth */
  5434. var o = ray.intersectObjects(options.model || model.colliders, true);
  5435. /* if(o && o.length){
  5436. console.log('ex', pano.id, distance - o[0].distance)
  5437. }else console.log('visi',pano.id) */
  5438. if (!o || !o.length) visiblePanos.push(pano);
  5439. });
  5440. return visiblePanos;
  5441. },
  5442. raycastToFindFloor: function () {
  5443. //八个方向上寻找floor,返回碰撞到最多的floor
  5444. var e = [new THREE.Vector3(0, -1, 0), new THREE.Vector3(1, -1, 0), new THREE.Vector3(0, -1, 1), new THREE.Vector3(-1, -1, 0), new THREE.Vector3(0, -1, -1), new THREE.Vector3(1, 0, 0), new THREE.Vector3(0, 0, 1), new THREE.Vector3(-1, 0, 0), new THREE.Vector3(0, 0, -1)];
  5445. return function (player, position) {
  5446. /* var floors = []; //有时候在建筑外侧,容易识别到其他层
  5447. var max = {floor:null,count:0};
  5448. for (var t = 0; t < e.length; t++) {
  5449. var i = new THREE.Raycaster(position.clone(), e[t].clone())
  5450. , n = i.intersectObjects(objects.model.colliders);
  5451. if (n.length){
  5452. var floor = n[0].object.parent.parent
  5453. var item = floors.find(item=>item.floor == floor)
  5454. if(item)item.len++
  5455. else floors.push({floor:floor , len:1})
  5456. }
  5457. }
  5458. floors.sort((a,b)=>{b.len-a.len})
  5459. if(floors[0]) return floors[0].floor */
  5460. var floors = [],
  5461. colliders = [],
  5462. floorScores = [];
  5463. for (var u in player.model.floors.list) {
  5464. //寻找高度区间
  5465. var floor = player.model.floors.list[u];
  5466. if (position.y >= floor.boundingBox.min.y && position.y <= floor.boundingBox.max.y) {
  5467. floors.push(floor);
  5468. colliders.push.apply(colliders, _toConsumableArray(floor.collider.children)); //在floor区间的话就添加
  5469. }
  5470. }
  5471. if (floors.length == 1) return floors[0];else if (floors.length > 1) {
  5472. //寻找 raycaster最多的floor
  5473. for (var t = 0; t < e.length; t++) {
  5474. var i = new THREE.Raycaster(position.clone(), e[t].clone()),
  5475. n = i.intersectObjects(colliders);
  5476. if (n.length) {
  5477. (function () {
  5478. var floor = n[0].object.parent.floor;
  5479. var item = floorScores.find(function (item) {
  5480. return item.floor == floor;
  5481. });
  5482. if (item) item.len++;else floorScores.push({
  5483. floor: floor,
  5484. len: 1
  5485. });
  5486. })();
  5487. }
  5488. }
  5489. floorScores.sort(function (a, b) {
  5490. b.len - a.len;
  5491. }); //可能数量一致
  5492. if (floorScores[0]) return floorScores[0].floor;else {
  5493. //如果找不到mesh,直接用boundingbox
  5494. floorScores = [];
  5495. floors.forEach(function (floor) {
  5496. var box = floor.boundingBox;
  5497. var points = [new THREE.Vector3(box.min.x, box.min.y, box.min.z), new THREE.Vector3(box.max.x, box.max.y, box.max.z), new THREE.Vector3(box.min.x, box.min.y, box.max.z), new THREE.Vector3(box.min.x, box.max.y, box.min.z), new THREE.Vector3(box.max.x, box.min.y, box.min.z), new THREE.Vector3(box.max.x, box.max.y, box.min.z), new THREE.Vector3(box.min.x, box.max.y, box.max.z), new THREE.Vector3(box.max.x, box.min.y, box.max.z)];
  5498. var dis = 0;
  5499. points.forEach(function (p) {
  5500. return dis += p.distanceTo(position);
  5501. });
  5502. floorScores.push({
  5503. floor,
  5504. dis
  5505. });
  5506. });
  5507. floorScores.sort(function (a, b) {
  5508. a.dis - b.dis;
  5509. }); //选择boundingbox八个点到position最短的
  5510. return floorScores[0].floor;
  5511. }
  5512. } else {
  5513. //超出floor区间后要么是第一层,要么是最后一层(因为寻找最接近的)
  5514. if (position.y < player.model.floors.list[0].center.y) {
  5515. //比随意一层低 即 低于最低层
  5516. var floors = player.model.floors.list.sort(function (f1, f2) {
  5517. return f1.boundingBox.min.y - f2.boundingBox.min.y;
  5518. });
  5519. return floors[0];
  5520. } else {
  5521. var floors = player.model.floors.list.sort(function (f1, f2) {
  5522. return f2.boundingBox.max.y - f1.boundingBox.max.y;
  5523. });
  5524. return floors[0];
  5525. }
  5526. }
  5527. /* 思路笔记:1 即使1个面片都能成为floor,可能是底面,可能是墙
  5528. 2 且这个floor还不一定有panos
  5529. 3 根据上述特征 最好是根据在不同panos的visible来判断楼层
  5530. 4 但是存在一个bug : 漫游点和mesh之间可能不对应,也就是看上去在某个楼层,飞出后发现它对应的mesh是另一个。。(这个是明显错误。可以推给算法部)
  5531. 5 在漫游时和楼层无关,一直显示overlay的。所以重点是要让飞出来的mesh看上去和overlay对应。所以直接考虑mesh即可。这样可以避开4
  5532. */
  5533. };
  5534. }(),
  5535. getQuaByAim: function getQuaByAim(aim) {
  5536. var center = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new THREE.Vector3();
  5537. var forward = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new THREE.Vector3(0, 0, -1);
  5538. //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
  5539. var qua1 = new THREE.Quaternion().setFromUnitVectors(forward, aim.clone().sub(center).normalize()); //或var _ = (new THREE.Matrix4).lookAt(pano.position, aim, new THREE.Vector3(0,1,0)); aimQua = (new THREE.Quaternion).setFromRotationMatrix(_);
  5540. return qua1;
  5541. },
  5542. getAimByQua: function getAimByQua(quaternion, center) {
  5543. return new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(center);
  5544. }
  5545. };
  5546. /**
  5547. * 日志输出
  5548. */
  5549. var logger$1 = {
  5550. info() {
  5551. var _console;
  5552. (_console = console).log.apply(_console, arguments);
  5553. },
  5554. debug() {
  5555. var _console2;
  5556. (_console2 = console).debug.apply(_console2, arguments);
  5557. },
  5558. error() {
  5559. var _console3;
  5560. (_console3 = console).error.apply(_console3, arguments);
  5561. },
  5562. warn() {
  5563. var _console4;
  5564. (_console4 = console).warn.apply(_console4, arguments);
  5565. },
  5566. time(s) {
  5567. console.time(s);
  5568. },
  5569. timeEnd(s) {
  5570. console.timeEnd(s);
  5571. },
  5572. message(s) {
  5573. alert(s);
  5574. }
  5575. };
  5576. var BlackoutStyle$1 = {
  5577. NONE: 0,
  5578. MIDDLE: 1,
  5579. END: 2,
  5580. BEGINNING: 3,
  5581. FADEIN: 4
  5582. };
  5583. var ZoomStats = function ZoomStats() {
  5584. this.actionSequence = [], this.actionSequenceInProgress = !1;
  5585. }; // function r(e, t, i, n) {
  5586. ZoomStats.prototype.reset = function (e) {
  5587. this.actionSequenceInProgress = !1, this.actionSequence.length = 0;
  5588. };
  5589. ZoomStats.prototype.addZoomAction = function () {
  5590. var e = null,
  5591. t = null,
  5592. i = !1,
  5593. n = function n() {
  5594. if (e = null, this.actionSequence.length > 0) {
  5595. this.actionSequence[0].start;
  5596. this.actionSequence[this.actionSequence.length - 1].end;
  5597. }
  5598. this.reset();
  5599. };
  5600. return function (r, o, a) {
  5601. if (r !== o) {
  5602. i || (n = n.bind(this), i = !0), e && (window.clearTimeout(e), e = null), a === t && this.actionSequenceInProgress || (this.reset(), t = a), this.actionSequenceInProgress = !0;
  5603. var s = {
  5604. start: r,
  5605. end: o
  5606. };
  5607. this.actionSequence.push(s), e = window.setTimeout(n, 150);
  5608. }
  5609. };
  5610. }();
  5611. var Joystick = {
  5612. UP: 1,
  5613. DOWN: -1,
  5614. LEFT: 'L',
  5615. RIGHT: 'R',
  5616. FORWARD: 'F',
  5617. BACK: 'B',
  5618. reverse: {},
  5619. opposite: function opposite(e) {
  5620. return this.reverse[e.toString()];
  5621. }
  5622. };
  5623. !function () {
  5624. Joystick.reverse[Joystick.UP] = Joystick.DOWN, Joystick.reverse[Joystick.DOWN] = Joystick.UP, Joystick.reverse[Joystick.LEFT] = Joystick.RIGHT, Joystick.reverse[Joystick.RIGHT] = Joystick.LEFT, Joystick.reverse[Joystick.FORWARD] = Joystick.BACK, Joystick.reverse[Joystick.BACK] = Joystick.FORWARD;
  5625. }();
  5626. var History = /*#__PURE__*/function () {
  5627. function History() {
  5628. _classCallCheck(this, History);
  5629. this.events = [];
  5630. this.valid = !1;
  5631. }
  5632. _createClass(History, [{
  5633. key: "push",
  5634. value: function push(e, t) {
  5635. this.events.push({
  5636. direction: e,
  5637. pano: t
  5638. });
  5639. this.valid = !0;
  5640. }
  5641. }, {
  5642. key: "pop",
  5643. value: function pop(e) {
  5644. var t = this.events.pop();
  5645. return this.events.length < 1 && (this.valid = !1), t;
  5646. }
  5647. }, {
  5648. key: "peek",
  5649. value: function peek() {
  5650. return this.events.length ? this.events[this.events.length - 1] : {
  5651. direction: null,
  5652. pano: null
  5653. };
  5654. }
  5655. }, {
  5656. key: "invalidate",
  5657. value: function invalidate() {
  5658. this.events = [];
  5659. this.valid = !1;
  5660. }
  5661. }, {
  5662. key: "reversePano",
  5663. value: function reversePano(e) {
  5664. if (!this.valid) return null;
  5665. var t = this.peek();
  5666. return Joystick.opposite(e) === t.direction ? (this.pop(), t.pano) : null;
  5667. }
  5668. }]);
  5669. return History;
  5670. }();
  5671. var Viewmode$1 = {
  5672. PANORAMA: 'panorama',
  5673. DOLLHOUSE: 'dollhouse',
  5674. FLOORPLAN: 'floorplan',
  5675. TRANSITIONING: 'transitioning'
  5676. };
  5677. Viewmode$1.toInt = function (mode) {
  5678. switch (mode) {
  5679. case this.PANORAMA:
  5680. return 1;
  5681. case this.DOLLHOUSE:
  5682. return 2;
  5683. case this.FLOORPLAN:
  5684. return 3;
  5685. case this.TRANSITIONING:
  5686. return -1;
  5687. }
  5688. throw new Error('未知模式: ' + c);
  5689. };
  5690. Viewmode$1.fromInt = function (mode) {
  5691. switch (mode) {
  5692. case '1':
  5693. case 1:
  5694. return this.PANORAMA;
  5695. case '2':
  5696. case 2:
  5697. return this.DOLLHOUSE;
  5698. case '3':
  5699. case 3:
  5700. return this.FLOORPLAN;
  5701. }
  5702. throw new Error('未知模式: ' + c);
  5703. };
  5704. var ModelUrls = /*#__PURE__*/function () {
  5705. function ModelUrls(projectNum, app) {
  5706. _classCallCheck(this, ModelUrls);
  5707. this.version = 1;
  5708. this.cache = null;
  5709. this.expires = 0;
  5710. this.projectNum = projectNum;
  5711. this.app = app;
  5712. }
  5713. _createClass(ModelUrls, [{
  5714. key: "validate",
  5715. value: function validate(e) {
  5716. return 'catalog.json' in e && Object.keys(e).length > 0;
  5717. }
  5718. }, {
  5719. key: "update",
  5720. value: function update(e) {
  5721. this.cache = e;
  5722. this.expires = Date.now() + constants.signedUrlDefaultExpireTime;
  5723. return Deferred$1.when();
  5724. }
  5725. }, {
  5726. key: "get",
  5727. value: function get(e) {
  5728. return this.app.resource.getViewImagesURL(e);
  5729. }
  5730. }]);
  5731. return ModelUrls;
  5732. }();
  5733. function _superPropBase(object, property) {
  5734. while (!Object.prototype.hasOwnProperty.call(object, property)) {
  5735. object = _getPrototypeOf(object);
  5736. if (object === null) break;
  5737. }
  5738. return object;
  5739. }
  5740. function _get(target, property, receiver) {
  5741. if (typeof Reflect !== "undefined" && Reflect.get) {
  5742. _get = Reflect.get;
  5743. } else {
  5744. _get = function _get(target, property, receiver) {
  5745. var base = _superPropBase(target, property);
  5746. if (!base) return;
  5747. var desc = Object.getOwnPropertyDescriptor(base, property);
  5748. if (desc.get) {
  5749. return desc.get.call(receiver);
  5750. }
  5751. return desc.value;
  5752. };
  5753. }
  5754. return _get(target, property, receiver || target);
  5755. }
  5756. var IndexedCollection = /*#__PURE__*/function () {
  5757. function IndexedCollection() {
  5758. _classCallCheck(this, IndexedCollection);
  5759. this.list = [];
  5760. this.index = {};
  5761. Object.defineProperty(this, 'length', {
  5762. get: function get() {
  5763. return this.list.length;
  5764. }
  5765. });
  5766. if (typeof this.getIndex != 'function') {
  5767. throw new Error('IndexedCollection.getIndex not implemented in subclass.');
  5768. }
  5769. }
  5770. _createClass(IndexedCollection, [{
  5771. key: "forEach",
  5772. value: function forEach(e) {
  5773. this.list.forEach(e);
  5774. }
  5775. }, {
  5776. key: "add",
  5777. value: function add(pano) {
  5778. this.list.push(pano);
  5779. this.index[this.getIndex(pano)] = pano;
  5780. }
  5781. }, {
  5782. key: "extend",
  5783. value: function extend(e) {
  5784. for (var t = 0; t < e.length; t++) {
  5785. this.add(e[t]);
  5786. }
  5787. }
  5788. }, {
  5789. key: "get",
  5790. value: function get(panoId) {
  5791. return this.index[panoId];
  5792. }
  5793. }, {
  5794. key: "first",
  5795. value: function first() {
  5796. return this.list[0];
  5797. }
  5798. }, {
  5799. key: "last",
  5800. value: function last() {
  5801. return this.list[this.list.length - 1];
  5802. }
  5803. }, {
  5804. key: "reIndex",
  5805. value: function reIndex() {
  5806. this.index = {};
  5807. var e = this;
  5808. this.forEach(function (t) {
  5809. e.index[e.getIndex(t)] = t;
  5810. });
  5811. }
  5812. }, {
  5813. key: "filter",
  5814. value: function filter(e) {
  5815. var t = this.list.filter(e);
  5816. return this.reIndex(), t;
  5817. }
  5818. }, {
  5819. key: "reduce",
  5820. value: function reduce(e, t) {
  5821. return this.list.reduce(e, t);
  5822. }
  5823. }, {
  5824. key: "sort",
  5825. value: function sort(e) {
  5826. return this.list.sort(e);
  5827. }
  5828. }, {
  5829. key: "indexOf",
  5830. value: function indexOf(e) {
  5831. for (var t = 0; t < this.list.length; ++t) {
  5832. if (this.list[t] === e) return t;
  5833. }
  5834. return -1;
  5835. }
  5836. }, {
  5837. key: "clone",
  5838. value: function clone() {
  5839. //xzw add
  5840. var newobj = new this.constructor();
  5841. newobj.extend(this.list);
  5842. return newobj;
  5843. }
  5844. }]);
  5845. return IndexedCollection;
  5846. }();
  5847. var ChunkedCollider = /*#__PURE__*/function () {
  5848. function ChunkedCollider(chunksize) {
  5849. _classCallCheck(this, ChunkedCollider);
  5850. this.chunksize = chunksize || 10;
  5851. this.chunks = {};
  5852. this.boundingBoxes = {};
  5853. this.children = [];
  5854. this.offset = new THREE.Vector3(0, 0.5, 0);
  5855. this.material = new THREE.MeshBasicMaterial({
  5856. color: 16777215 * Math.random(),
  5857. side: THREE.DoubleSide
  5858. });
  5859. }
  5860. _createClass(ChunkedCollider, [{
  5861. key: "add",
  5862. value: function add(geometry) {
  5863. var vertices,
  5864. index,
  5865. o,
  5866. a,
  5867. s,
  5868. l,
  5869. c,
  5870. h,
  5871. u,
  5872. d,
  5873. p,
  5874. f,
  5875. g,
  5876. attributes = geometry.attributes;
  5877. if (attributes) {
  5878. vertices = attributes.position.array;
  5879. index = void 0 !== geometry.index ? geometry.index.array : void 0;
  5880. } else {
  5881. vertices = geometry.vertices;
  5882. }
  5883. var v = new THREE.Vector3();
  5884. if (index) {
  5885. for (o = 0, a = index.length; o < a; o += 3) {
  5886. var triangleIndex1 = 3 * index[o],
  5887. triangleIndex2 = 3 * index[o + 1],
  5888. triangleIndex3 = 3 * index[o + 2];
  5889. s = (vertices[triangleIndex1] + vertices[triangleIndex2] + vertices[triangleIndex3]) / 3;
  5890. l = (vertices[triangleIndex1 + 1] + vertices[triangleIndex2 + 1] + vertices[triangleIndex3 + 1]) / 3;
  5891. c = (vertices[triangleIndex1 + 2] + vertices[triangleIndex2 + 2] + vertices[triangleIndex3 + 2]) / 3;
  5892. h = Math.floor(s / this.chunksize);
  5893. u = Math.floor(l / this.chunksize);
  5894. d = Math.floor(c / this.chunksize);
  5895. p = h + '.' + u + '.' + d;
  5896. if (p in this.chunks) {
  5897. g = this.chunks[p];
  5898. f = this.boundingBoxes[p];
  5899. } else {
  5900. g = this.chunks[p] = [];
  5901. f = this.boundingBoxes[p] = new THREE.Box3();
  5902. }
  5903. g.push(vertices[triangleIndex1], vertices[triangleIndex1 + 1], vertices[triangleIndex1 + 2], vertices[triangleIndex2], vertices[triangleIndex2 + 1], vertices[triangleIndex2 + 2], vertices[triangleIndex3], vertices[triangleIndex3 + 1], vertices[triangleIndex3 + 2]);
  5904. f.expandByPoint(v.set(vertices[triangleIndex1], vertices[triangleIndex1 + 1], vertices[triangleIndex1 + 2]));
  5905. f.expandByPoint(v.set(vertices[triangleIndex2], vertices[triangleIndex2 + 1], vertices[triangleIndex2 + 2]));
  5906. f.expandByPoint(v.set(vertices[triangleIndex3], vertices[triangleIndex3 + 1], vertices[triangleIndex3 + 2]));
  5907. }
  5908. } else {
  5909. for (o = 0, a = vertices.length; o < a; o += 9) {
  5910. s = (vertices[o] + vertices[o + 3] + vertices[o + 6]) / 3, l = (vertices[o + 1] + vertices[o + 4] + vertices[o + 7]) / 3, c = (vertices[o + 2] + vertices[o + 5] + vertices[o + 8]) / 3, h = Math.floor(s / this.chunksize), u = Math.floor(l / this.chunksize), d = Math.floor(c / this.chunksize), p = h + '.' + u + '.' + d;
  5911. if (p in this.chunks) {
  5912. g = this.chunks[p];
  5913. f = this.boundingBoxes[p];
  5914. } else {
  5915. g = this.chunks[p] = [];
  5916. f = this.boundingBoxes[p] = new THREE.Box3();
  5917. }
  5918. g.push(vertices[o], vertices[o + 1], vertices[o + 2], vertices[o + 3], vertices[o + 4], vertices[o + 5], vertices[o + 6], vertices[o + 7], vertices[o + 8]);
  5919. f.expandByPoint(v.set(vertices[o], vertices[o + 1], vertices[o + 2]));
  5920. f.expandByPoint(v.set(vertices[o + 3], vertices[o + 4], vertices[o + 5]));
  5921. f.expandByPoint(v.set(vertices[o + 6], vertices[o + 7], vertices[o + 8]));
  5922. }
  5923. }
  5924. }
  5925. }, {
  5926. key: "build",
  5927. value: function build() {
  5928. var object3D = new THREE.Object3D();
  5929. object3D.material = this.material;
  5930. object3D.name = 'colliderGroup';
  5931. for (var t in this.chunks) {
  5932. var chunk = this.chunks[t],
  5933. bufferGeometry = new THREE.BufferGeometry();
  5934. bufferGeometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(chunk), 3));
  5935. bufferGeometry.boundingBox = this.boundingBoxes[t];
  5936. var mesh = new THREE.Mesh(bufferGeometry, this.material);
  5937. mesh.material.visible = !1;
  5938. mesh.name = 'collider';
  5939. object3D.add(mesh);
  5940. this.chunks[t] = [];
  5941. }
  5942. return object3D;
  5943. }
  5944. }]);
  5945. return ChunkedCollider;
  5946. }();
  5947. function _createSuper$1z(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1z(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  5948. function _isNativeReflectConstruct$1z() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  5949. var Floor$1 = /*#__PURE__*/function (_THREE$Object3D) {
  5950. _inherits(Floor, _THREE$Object3D);
  5951. var _super = _createSuper$1z(Floor);
  5952. function Floor(model, floorIndex, name) {
  5953. var _this;
  5954. _classCallCheck(this, Floor);
  5955. _this = _super.call(this);
  5956. _this.model = model;
  5957. _this.floorIndex = floorIndex;
  5958. _this.name = name || '楼层' + (floorIndex + 1);
  5959. _this.panos = [];
  5960. _this.chunksDam = [];
  5961. _this.tiles = [];
  5962. _this.colliderBuilder = new ChunkedCollider(3);
  5963. _this.collider = null;
  5964. _this.center = null;
  5965. _this.boundingBox = new THREE.Box3();
  5966. _this.size = null;
  5967. _this.hidden = !1;
  5968. _this.display = true;
  5969. _this.conservativeBoundingBox = new THREE.Box3();
  5970. _this.debugColor = 16777215 * Math.random();
  5971. _this.transition = null;
  5972. _this.entryArrow = [];
  5973. _this.views = [];
  5974. return _this;
  5975. }
  5976. _createClass(Floor, [{
  5977. key: "chunks",
  5978. get: function get() {
  5979. if (this.chunksDam.length) {
  5980. // Dam
  5981. return this.chunksDam;
  5982. } else {
  5983. // 3dTiles
  5984. var chunks = [];
  5985. this.tiles.forEach(function (tile) {
  5986. tile.traverse(function (obj) {
  5987. if (obj.isChunk) {
  5988. chunks.push(obj);
  5989. }
  5990. });
  5991. });
  5992. return chunks;
  5993. }
  5994. }
  5995. /**
  5996. * 设置为当前楼层
  5997. */
  5998. }, {
  5999. key: "enter",
  6000. value: function enter(mode) {
  6001. // setFloor会设置楼层显隐
  6002. this.model.setFloor(this, mode);
  6003. }
  6004. /**
  6005. * 显示该楼层
  6006. */
  6007. }, {
  6008. key: "show",
  6009. value: function show() {
  6010. var _this2 = this;
  6011. var player = this.model.$app.core.get('Player');
  6012. this.hidden = !1; //transparent恒为true才能设置遮挡
  6013. /* this.chunks.forEach(chunk => {
  6014. chunk.material.transparent = !1
  6015. }) */
  6016. // 显示该楼层的球幕marker(locked时、飞入时、编辑cad时不显示),
  6017. var canShowVideoMarker = this.model.$app.core.get('PanoVideoRenderer').canShowMarker();
  6018. player.modeTran.split('-')[1] == 'panorama' || player.locked || canShowVideoMarker && this.panos.forEach(function (pano) {
  6019. return pano.hasVideo && pano.hasNeighbor() && (pano.marker.material.opacity = 1);
  6020. }); // 显示楼层label和overlay等
  6021. setTimeout(function () {
  6022. // setTimeout用于防止flyToNewModel前执行show
  6023. player.mode == 'floorplan' && _this2.model.floorplanCadImg.showCadPlane(); // 显示cad
  6024. _this2.setMaterial();
  6025. player.labelManager && player.labelManager.show(_this2.floorIndex);
  6026. player.OverlayManager && player.OverlayManager.show(_this2.floorIndex, true);
  6027. player.GLTFEditor && player.GLTFEditor.show(_this2.floorIndex, true);
  6028. _this2.model.$app.Camera.monitor.control.showAll(_this2.floorIndex);
  6029. }, 1); // console.error('显示楼层:' + this.floorIndex)
  6030. }
  6031. /**
  6032. * 隐藏该楼层
  6033. */
  6034. }, {
  6035. key: "hide",
  6036. value: function hide() {
  6037. var _this3 = this;
  6038. this.hidden = !0;
  6039. /* this.chunks.forEach(chunk => {
  6040. chunk.material.transparent = !0
  6041. }) */
  6042. this.setMaterial(); // 隐藏该楼层的球幕marker
  6043. this.panos.forEach(function (pano) {
  6044. return pano.hasVideo && (pano.marker.material.opacity = 0);
  6045. }); // 隐藏楼层label和overlay等
  6046. var player = this.model.$app.core.get('Player');
  6047. setTimeout(function () {
  6048. player.labelManager && player.labelManager.hide(_this3.floorIndex);
  6049. player.OverlayManager && player.OverlayManager.hide(_this3.floorIndex);
  6050. player.GLTFEditor && player.GLTFEditor.hide(_this3.floorIndex);
  6051. _this3.model.$app.Camera.monitor.control.hideAll(_this3.floorIndex);
  6052. }, 1); // console.error('隐藏楼层:' + this.floorIndex)
  6053. }
  6054. /**
  6055. * 切换该楼层显隐
  6056. */
  6057. }, {
  6058. key: "toggle",
  6059. value: function toggle(ifShow) {
  6060. //switch状态
  6061. if (ifShow === void 0) ifShow = this.hidden;
  6062. ifShow ? this.show() : this.hide();
  6063. }
  6064. /**
  6065. * chunks(Dam)
  6066. */
  6067. }, {
  6068. key: "addChunk",
  6069. value: function addChunk(chunk) {
  6070. //chunk.renderOrder = RenderOrder.ghostFloor
  6071. this.add(chunk);
  6072. this.chunksDam.push(chunk);
  6073. this.boundingBox.union(chunk.geometry.boundingBox);
  6074. var size = new THREE.Vector3();
  6075. this.boundingBox.getSize(size);
  6076. this.size = size;
  6077. this.colliderBuilder.add(chunk.geometry);
  6078. chunk.floor = this;
  6079. }
  6080. /**
  6081. * tiles
  6082. */
  6083. }, {
  6084. key: "addTile",
  6085. value: function addTile(tileContent) {
  6086. var _this4 = this;
  6087. tileContent.floorIndex = this.floorIndex;
  6088. this.tiles.push(tileContent);
  6089. this.add(tileContent);
  6090. tileContent.modified = '';
  6091. tileContent.traverse(function (obj) {
  6092. if (obj.isChunk) {
  6093. obj.setMode(_this4.model.mode, _this4.model.$app.core.get('Player').modeTran); //obj.renderOrder = RenderOrder.ghostFloor
  6094. _this4.setMaterial(obj); // floor显隐判断
  6095. // floor显隐判断
  6096. /* if(this.hidden){
  6097. obj.material.uniforms.opacity.value = settings.floorMat['stardard-hide'].opacity
  6098. obj.material.uniforms.mixRatio && (obj.material.uniforms.mixRatio.value = settings.floorMat['stardard-hide'].mixRatio )
  6099. obj.material.uniforms.brightness && (obj.material.uniforms.brightness.value = settings.floorMat['stardard-hide'].brightness )
  6100. }else{
  6101. obj.material.uniforms.opacity.value = settings.floorMat['stardard-show'].opacity
  6102. obj.material.uniforms.mixRatio && (obj.material.uniforms.mixRatio.value = settings.floorMat['stardard-show'].mixRatio )
  6103. obj.material.uniforms.brightness && (obj.material.uniforms.brightness.value = settings.floorMat['stardard-show'].brightness )
  6104. } */
  6105. //obj.material.transparent = this.hidden
  6106. // todo 关于3dtiles的boundingBox和collider
  6107. _this4.boundingBox.union(obj.geometry.boundingBox);
  6108. var size = new THREE.Vector3();
  6109. _this4.boundingBox.getSize(size);
  6110. _this4.size = size;
  6111. _this4.colliderBuilder && _this4.colliderBuilder.add(obj.geometry);
  6112. }
  6113. });
  6114. }
  6115. }, {
  6116. key: "removeTile",
  6117. value: function removeTile(tileContent) {
  6118. this.tiles = this.tiles.filter(function (tile) {
  6119. return tile !== tileContent;
  6120. });
  6121. tileContent.traverse(function (obj) {
  6122. if (obj.isChunk) {
  6123. obj.geometry.dispose();
  6124. obj.material.dispose();
  6125. obj.material.uniforms.map.value && obj.material.uniforms.map.value.dispose();
  6126. }
  6127. });
  6128. this.remove(tileContent);
  6129. tileContent.modified = 'remove';
  6130. }
  6131. /**
  6132. * panos
  6133. */
  6134. }, {
  6135. key: "addPano",
  6136. value: function addPano(pano) {
  6137. this.panos.push(pano); //this.add(pano.skyboxMesh)
  6138. pano.marker && this.add(pano.marker);
  6139. var t = new THREE.Vector3(1, 1, 1),
  6140. i = new THREE.Box3().setFromCenterAndSize(pano.position, t);
  6141. this.boundingBox.union(i);
  6142. }
  6143. }, {
  6144. key: "removePano",
  6145. value: function removePano(pano) {
  6146. var index = this.panos.indexOf(pano);
  6147. index > -1 && this.panos.splice(index, 1);
  6148. }
  6149. /**
  6150. * 场景关联
  6151. */
  6152. }, {
  6153. key: "addView",
  6154. value: function addView(view) {
  6155. this.views.push(view);
  6156. }
  6157. }, {
  6158. key: "removeView",
  6159. value: function removeView(view) {
  6160. var index = this.views.indexOf(view);
  6161. index > -1 && this.views.splice(index, 1);
  6162. }
  6163. /**
  6164. * 初始化
  6165. */
  6166. }, {
  6167. key: "build",
  6168. value: function build() {
  6169. this.collider = this.colliderBuilder.build(!0);
  6170. this.collider.floor = this; //this.add(this.collider)
  6171. var center = new THREE.Vector3();
  6172. this.boundingBox.getCenter(center);
  6173. this.center = center;
  6174. this.conservativeBoundingBox.copy(this.boundingBox);
  6175. this.conservativeBoundingBox.min.y = common.lowerMedian(this.collider.children.map(function (mesh) {
  6176. return mesh.geometry.boundingBox.min.y;
  6177. }), 5);
  6178. this.conservativeBoundingBox.max.y = common.lowerMedian(this.collider.children.map(function (mesh) {
  6179. return mesh.geometry.boundingBox.max.y;
  6180. }), 5);
  6181. this.colliderBuilder = null;
  6182. }
  6183. }, {
  6184. key: "toShortString",
  6185. value: function toShortString() {
  6186. return common.nth(this.floorIndex + 1);
  6187. }
  6188. }, {
  6189. key: "toString",
  6190. value: function toString() {
  6191. return this.name;
  6192. }
  6193. }, {
  6194. key: "setMaterial",
  6195. value: function setMaterial(mesh) {
  6196. var matPropName, meshes;
  6197. if (mesh) {
  6198. matPropName = this.matPropName, meshes = [mesh];
  6199. } else {
  6200. var modeTran = this.model.$app.core.get('Player').modeTran;
  6201. var hasCadPlane = modeTran.split('-')[1] == 'floorplan' && this.model.currentFloor.shouldShowPlane && !this.model.currentFloor.imgLoadFailed && this.model.$app.store.getValue('metadata').floorPlanUser; //需要展示cad(默认floorplan没有all的可能)
  6202. matPropName = this.matPropName = hasCadPlane ? this.hidden ? 'hasPlane-normal' : 'hasPlane-curFloor' : this.hidden ? 'stardard-hide' : 'stardard-show';
  6203. meshes = this.chunks; //console.log(matPropName, hasCadPlane)
  6204. }
  6205. var matProps = settings$3.floorMat[matPropName];
  6206. meshes.forEach(function (chunk) {
  6207. for (var name in matProps) {
  6208. if (name == 'renderOrder') {
  6209. chunk.renderOrder = matProps[name];
  6210. } else if (name == 'depthTest' || name == 'depthWrite' || name == 'transparent') {
  6211. //不知道为什么当前楼层不能完全遮住其他楼层,即使更改了depthTest等
  6212. chunk.materialOutside[name] = matProps[name];
  6213. } else {
  6214. chunk.materialOutside.extraValues[name] = chunk.materialOutside.uniforms[name].value = matProps[name];
  6215. }
  6216. }
  6217. });
  6218. }
  6219. }]);
  6220. return Floor;
  6221. }(THREE.Object3D);
  6222. function _createSuper$1y(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1y(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  6223. function _isNativeReflectConstruct$1y() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  6224. var FloorCollection = /*#__PURE__*/function (_IndexedCollection) {
  6225. _inherits(FloorCollection, _IndexedCollection);
  6226. var _super = _createSuper$1y(FloorCollection);
  6227. function FloorCollection(model) {
  6228. var _this;
  6229. _classCallCheck(this, FloorCollection);
  6230. _this = _super.call(this);
  6231. _this.model = model;
  6232. _this.exploded = !1;
  6233. return _this;
  6234. }
  6235. _createClass(FloorCollection, [{
  6236. key: "add",
  6237. value: function add(floor) {
  6238. _get(_getPrototypeOf(FloorCollection.prototype), "add", this).call(this, floor);
  6239. this.model.add(floor);
  6240. }
  6241. }, {
  6242. key: "getIndex",
  6243. value: function getIndex(floor) {
  6244. return floor.floorIndex;
  6245. }
  6246. }, {
  6247. key: "build",
  6248. value: function build() {
  6249. this.list.forEach(function (floor) {
  6250. floor.build();
  6251. });
  6252. }
  6253. }, {
  6254. key: "nextFloor",
  6255. value: function nextFloor(e, t) {
  6256. return this.index[e.floorIndex + t] || null;
  6257. }
  6258. }, {
  6259. key: "getOrMakeFloor",
  6260. value: function getOrMakeFloor(floorIndex) {
  6261. var floor = this.index[floorIndex];
  6262. if (!floor) {
  6263. floor = new Floor$1(this.model, floorIndex);
  6264. this.add(floor);
  6265. }
  6266. return floor;
  6267. }
  6268. }, {
  6269. key: "hide",
  6270. value: function hide() {
  6271. this.list.forEach(function (floor) {
  6272. floor.hide();
  6273. });
  6274. }
  6275. }, {
  6276. key: "show",
  6277. value: function show() {
  6278. this.list.forEach(function (floor) {
  6279. floor.show();
  6280. });
  6281. }
  6282. }, {
  6283. key: "getFloorAtPoint",
  6284. value: function getFloorAtPoint(e) {
  6285. for (var t = null, i = 1 / 0, n = 0; n < this.list.length; n++) {
  6286. var r = this.list[n],
  6287. o = r.distanceToPoint(e);
  6288. (!t || i > o) && (i = o, t = r);
  6289. }
  6290. return t;
  6291. }
  6292. }]);
  6293. return FloorCollection;
  6294. }(IndexedCollection);
  6295. var lerp = {
  6296. vector: function vector(e, t, f) {
  6297. //xzw change, add f
  6298. var i = e.clone();
  6299. return t = t.clone(), function (n) {
  6300. e.set(i.x * (1 - n) + t.x * n, i.y * (1 - n) + t.y * n, i.z * (1 - n) + t.z * n);
  6301. f && f(e, n);
  6302. };
  6303. },
  6304. quaternion: function quaternion(e, t, f) {
  6305. //xzw change, add f
  6306. var i = e.clone();
  6307. return function (n) {
  6308. e.copy(i).slerp(t, n);
  6309. f && f(e, n);
  6310. };
  6311. },
  6312. color: function color(e, t, f) {
  6313. var i = e.clone();
  6314. return function (n) {
  6315. e.copy(i).lerp(t, n);
  6316. f && f(e, n);
  6317. };
  6318. },
  6319. property(e, t, i, n) {
  6320. var r = e[t];
  6321. return function (o) {
  6322. e[t] = r * (1 - o) + i * o, n && n(e[t]);
  6323. };
  6324. },
  6325. uniform(e, t, i) {
  6326. var n = e.material.uniforms[t].value;
  6327. return function (r) {
  6328. e.material.uniforms[t] && (e.material.uniforms[t].value = n * (1 - r) + i * r);
  6329. };
  6330. },
  6331. matrix4(e, t) {
  6332. var i = e.clone();
  6333. return function (n) {
  6334. for (var r = e.elements, o = i.elements, a = t.elements, s = 0; s < 16; s++) {
  6335. r[s] = o[s] * (1 - n) + a[s] * n;
  6336. }
  6337. };
  6338. },
  6339. allUniforms(e, t, i) {
  6340. var n = e.map(function (e) {
  6341. return this.uniform(e, t, i);
  6342. }.bind(this));
  6343. return function (e) {
  6344. n.forEach(function (t) {
  6345. t(e);
  6346. });
  6347. };
  6348. }
  6349. };
  6350. var PanoRendererEvents = {
  6351. PanoRenderComplete: 'panorama.render.complete',
  6352. TileRenderFailure: 'panorama.tile.render.failed',
  6353. TileRenderSuccess: 'panorama.tile.render.success',
  6354. TileUploadAttempted: 'panorama.tile.upload.attempted',
  6355. UploadAttemptedForAllTiles: 'panorama.upload.attempted.all.tiles',
  6356. ZoomLevelRenderStarted: 'panorama.zoom.render.started'
  6357. };
  6358. var RenderLayers = {
  6359. DEFAULT: 0,
  6360. //mesh默认都会显示在DEFAULT层。若不要需要手动toggle(DEFAULT)
  6361. PANOMARKERS: 1,
  6362. //这三个是在截图时用到的,其实也可以不用分这么多
  6363. RETICULE: 2,
  6364. // add by xzw:
  6365. BothAtMainAndSubScreen: 3,
  6366. //在主屏幕和分屏幕上都有的
  6367. SubScreen: 4,
  6368. //仅在分屏幕上有的
  6369. Monitor: 5
  6370. };
  6371. var PanoramaEvents = {
  6372. LoadComplete: 'panorama.load.complete',
  6373. LoadFailed: 'panorama.load.failed',
  6374. TileLoaded: 'panorama.tile.loaded'
  6375. };
  6376. var PanoSizeClass = {
  6377. BASE: 1,
  6378. STANDARD: 2,
  6379. HIGH: 3,
  6380. ULTRAHIGH: 4
  6381. };
  6382. /*
  6383. * @Author: Rindy
  6384. * @Date: 2021-05-07 15:48:57
  6385. * @LastEditors: Rindy
  6386. * @LastEditTime: 2021-05-07 15:49:49
  6387. * @Description: 注释
  6388. */
  6389. var basicTextured = {
  6390. uniforms: {
  6391. tDiffuse: {
  6392. type: 't',
  6393. value: null
  6394. },
  6395. alpha: {
  6396. type: 'f',
  6397. value: 1
  6398. }
  6399. },
  6400. vertexShader: 'varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}',
  6401. fragmentShader: 'varying vec2 vUv;\nuniform float alpha;\nuniform sampler2D tDiffuse;\nvoid main() {\n vec4 texColor = texture2D(tDiffuse, vUv);\n gl_FragColor = vec4(texColor.rgb, texColor.a * alpha);\n}'
  6402. };
  6403. /*
  6404. * @Author: Rindy
  6405. * @Date: 2021-05-07 15:50:38
  6406. * @LastEditors: Rindy
  6407. * @LastEditTime: 2021-05-07 15:51:20
  6408. * @Description: 注释
  6409. */
  6410. var copyCubeMap = {
  6411. uniforms: {
  6412. tDiffuse: {
  6413. type: 't',
  6414. value: null
  6415. },
  6416. alpha: {
  6417. type: 'f',
  6418. value: 1
  6419. }
  6420. },
  6421. vertexShader: 'varying vec3 vWorldPos;\nvoid main() {\n vWorldPos = vec3(-position.x, -position.y, position.z);\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}',
  6422. fragmentShader: 'varying vec3 vWorldPos;\nuniform float alpha;\nuniform samplerCube tDiffuse;\nvoid main() {\n vec4 texColor = textureCube(tDiffuse, vWorldPos);\n gl_FragColor = vec4(texColor.rgb, texColor.a * alpha);\n}'
  6423. };
  6424. /*
  6425. * @Author: Rindy
  6426. * @Date: 2021-05-07 15:52:29
  6427. * @LastEditors: Rindy
  6428. * @LastEditTime: 2021-05-07 15:53:00
  6429. * @Description: 注释
  6430. */
  6431. var cube = {
  6432. uniforms: {
  6433. map: {
  6434. type: 't',
  6435. value: null
  6436. },
  6437. opacity: {
  6438. type: 'f',
  6439. value: 1
  6440. }
  6441. },
  6442. vertexShader: 'varying vec3 vWorldPosition;\n\nvoid main() {\n vWorldPosition = position;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n',
  6443. fragmentShader: 'uniform samplerCube map;\nuniform float opacity;\n\nvarying vec3 vWorldPosition;\n\nvoid main() {\n vec4 color = textureCube( map, vec3( -vWorldPosition.x, vWorldPosition.yz ) );\n gl_FragColor = vec4(color.rgb, opacity);\n}\n'
  6444. };
  6445. /*
  6446. * @Author: Rindy
  6447. * @Date: 2021-05-07 16:02:08
  6448. * @LastEditors: Rindy
  6449. * @LastEditTime: 2021-05-07 16:02:27
  6450. * @Description: 注释
  6451. */
  6452. var customDepth = {
  6453. uniforms: {
  6454. panoPosition: {
  6455. type: 'v3',
  6456. value: new THREE.Vector3()
  6457. }
  6458. },
  6459. vertexShader: 'varying vec4 worldPosition;\n\nvoid main() {\n\n worldPosition = modelMatrix * vec4(position, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n}\n',
  6460. fragmentShader: 'uniform vec3 panoPosition;\nvarying vec4 worldPosition;\n\nvoid main() {\n\n float depth = distance(worldPosition.xyz, panoPosition);\n float color = 1.0 - depth / 10.0;\n gl_FragColor = vec4(color, color, color, 1.0);\n\n}\n'
  6461. };
  6462. /*
  6463. * @Author: Rindy
  6464. * @Date: 2021-05-07 15:52:29
  6465. * @LastEditors: Rindy
  6466. * @LastEditTime: 2021-05-12 15:35:23
  6467. * @Description: 注释
  6468. */
  6469. var modelPaint = {
  6470. fragmentShader: {
  6471. Common: "\n \n uniform vec4 iMouse;\n uniform vec2 iResolution;\n uniform sampler2D iChannel0; // bufferArray\n uniform sampler2D iChannel1; // \u5168\u666F\u56FE\n uniform int iBrushType; // \u7B14\u5237\u7C7B\u578B\uFF08\u9A6C\u8D5B\u514B\u3001\u9AD8\u65AF\u6A21\u7CCA\u3001\u6A61\u76AE\uFF09\n uniform float iBrushSize;\n uniform float iAngle;\n uniform float iPitch;\n \n \n const float MAX_TRACE_DISTANCE = 3.0; // max trace distance\n const float INTERSECTION_PRECISION = 0.001; // precision of the intersection\n const int NUM_OF_TRACE_STEPS = 100;\n \n const float PI = 3.145;\n \n vec3 spCenter = vec3( 0.0 , 0.0 , -0.8 ); // \u753B\u7B14\u4E2D\u5FC3\u504F\u79FB\n float spRad = 1.; // \u503C\u8D8A\u5927\uFF0C \u534A\u5F84\u8D8A\u5C0F\n \n // camera\u89C6\u89D2\u53D8\u6362\u77E9\u9635\uFF0Cpitch\u7ED5x\u8F74\uFF0Croll\u7ED5z\u8F74\uFF0Cangle\u7ED5y\u8F74\n mat3 calcLookAtMatrix( in float angle, in float roll, in float pitch )\n {\n vec3 angleVec = vec3( cos(angle), sqrt(cos(angle)*cos(angle) + sin(angle)*sin(angle)) * tan(pitch), sin(angle) );\n vec3 rollVec = vec3( sin(roll), cos(roll), 0.0 );\n \n vec3 ww = normalize( angleVec );\n vec3 uu = normalize( cross(ww, rollVec) );\n vec3 vv = normalize( cross(ww, uu));\n return mat3( uu, vv, ww );\n }\n \n float posMap( vec3 pos ){\n return length(pos - spCenter) - spRad;\n }\n \n float calcIntersection( in vec3 spCenter, in vec3 rayDirec ){\n float h = INTERSECTION_PRECISION*2.0;\n float trace = 0.0;\n \n for( int i=0; i< NUM_OF_TRACE_STEPS ; i++ ){\n if( h < INTERSECTION_PRECISION || trace > MAX_TRACE_DISTANCE ) break;\n h = posMap( spCenter + rayDirec * trace );\n trace += h;\n }\n \n if( trace < MAX_TRACE_DISTANCE ) \n return trace;\n else \n return -1.0;\n }\n \n vec3 calcPoint(vec2 screenPoint, float angle, float pitch) {\n \n mat3 camMat = calcLookAtMatrix(angle, 0.0, pitch);\n vec3 rayDirec = normalize( camMat * vec3(screenPoint.xy, 1.4) ); // create view ray. 2.0 is the lens length\n \n float trace = calcIntersection(spCenter, rayDirec);\n vec3 point = spCenter + rayDirec * trace;\n return point;\n }\n \n // \u6297\u952F\u9F7F \u539F\u7406\uFF1A\u7ED9\u8FB9\u7F18\u4E00\u4E2A\u900F\u660E\u6E10\u53D8\n // edge0 \u5411\u5185\u6E10\u53D8\u8303\u56F4\uFF0Cedge1 \u5411\u5916\u6E10\u53D8\u8303\u56F4\uFF0Cx \u548C\u4E2D\u5FC3\u7684\u8DDD\u79BB\n float smootherstep(float edge0, float edge1, float x) {\n float t = (x - edge0)/(edge1 - edge0);\n float t1 = t*t*t*(t*(t*6. - 15.) + 10.);\n return clamp(t1, 0.0, 1.0);\n }\n //\u65B0\u7248\u9AD8\u65AF\u6A21\u7CCA\u7B97\u6CD5\n float weight(float t, float log2radius, float gamma)\n {\n return exp(-gamma * pow(log2radius - t, 2.0));\n }\n vec4 sample_blured(vec2 uv, float radius, float gamma) {\n vec4 pix = vec4(0.0);\n float norm = 0.0;\n for(float i = 0.0; i < 10.0; i += 0.5)\n {\n float k = weight(i, log2(radius), gamma);\n pix += k*texture2D(iChannel1, uv, i); \n norm += k;\n }\n return pix * pow(norm, -0.95);\n }\n\n \n // modelPaint\u6709\u4E24\u4E2A\u4F5C\u7528\uFF1A\u6839\u636E\u9F20\u6807\u4F4D\u7F6E\u663E\u793A\u7B14\u5237\u3001\u6839\u636E\u9F20\u6807\u4F4D\u7F6E\u6D82\u62B9 \uFF08\u901A\u8FC7iIsBrush\u533A\u5206\uFF09\n vec4 modelPaint(vec2 uv, int iIsBrush)\n {\n vec2 mouse = (-iResolution.xy + 2.0*iMouse.xy)/iResolution.y;\n \n float hAngle = (uv.x * 2.0 + 0.5) * -PI * 0.9989; // uv\u5728\u5168\u666F\u56FE\u8FB9\u754C\u5904\u4F1A\u6709\u4E9B\u8BB8\u7684\u9519\u4F4D\uFF0C\u4E58\u4E0A0.9989\u5219\u6B63\u5E38\n float vAngle = uv.y * PI;\n vec3 n = normalize( vec3(\n sin(vAngle) * sin(hAngle),\n -cos(vAngle),\n sin(vAngle) * cos(hAngle)\n ));\n vec3 wPos = spCenter + n * spRad; // \u5C06uv\u5750\u6807\u6620\u5C04\u5230\u4E09\u7EF4\u4E0A \n vec3 point = calcPoint(mouse, iAngle, iPitch); // \u5C06\u9F20\u6807\u4F4D\u7F6E\u6620\u5C04\u5230\u4E09\u7EF4\u4E0A \n\n float brushSize = iBrushSize / 100.; // \u7B14\u5237\u5927\u5C0F\n if(iIsBrush == 0) brushSize += 0.005; // \u8865\u507F\u9ED1\u8FB9\n vec4 col;\n // \u9650\u5236\u5728brushSize\u8303\u56F4\u5185 && (\u6309\u4E0B\u9F20\u6807 || \u663E\u793A\u7B14\u5237)\n if( length( point - wPos ) < brushSize && (iMouse.z > 0.0 || iIsBrush == 1))\n {\n // \u6D82\u62B9\n if(iMouse.z > 0.0) {\n if(iBrushType == 2) {\n // \u9A6C\u8D5B\u514B\n float mosaicAccuracy = 2. * iResolution.x / 1024.; // \u9A6C\u8D5B\u514B\u7CBE\u5EA6\n vec2 pixelSize = mosaicAccuracy / iResolution.xy;\n vec2 fixedUV = uv + pixelSize;\n vec2 pxUV = floor(fixedUV/pixelSize)*pixelSize;\n col = texture2D(iChannel1, pxUV);\n } \n else if(iBrushType == 1) {\n // \u65E7\u7248\u9AD8\u65AF\u6A21\u7CCA \u5728apple\u7AEF\u4F1A\u51FA\u73B0\u5947\u602A\u7684\u8FB9\u7F18bug\uFF0C\u539F\u56E0\u4E0D\u660E\uFF0C\u9700\u8981\u5C06\u51FA\u73B0bug\u7684\u8FB9\u7F18\u8FDB\u884C\u88C1\u526A\u3002\u4E14\u5728ios\u7AEF\u6A21\u7CCA\u540Ergb\u503C\u504F\u9AD8\n // const float Directions = 16.0;\n // const float Quality =5.0;\n // float Size = 20.0; // \u6A21\u7CCA\u5EA6\n // vec2 Radius = Size/iResolution.xy;\n // col = texture2D(iChannel1, uv);\n \n // for( float d=0.0; d < PI*2.; d += PI*2./Directions) {\n // for(float i = 1.0/Quality; i <= 1.0; i += 1.0/Quality) {\n //\u7591\u4F3Ctexture2D\u65B9\u6CD5\u4E2D\u7684uv\u53C2\u6570\u4E0D\u4E3A\u539F\u59CBuv\u5C31\u4F1A\u51FA\u73B0\u8FB9\u7F18bug\n // col += texture2D(iChannel1, uv + vec2(cos(d), sin(d)) * Radius * i);\n // }\n // }\n // col /= (Quality * Directions - 16.0);\n\n //\u65B0\u7248\u9AD8\u65AF\u6A21\u7CCA\u7B97\u6CD5\n float strong = 0.45;\n float blur_radius = 50.0 * strong;\n col = sample_blured(uv, blur_radius, 0.5);\n // \u5BF9\u5168\u666F\u8D34\u56FE\u8FDB\u884C\u6A21\u7CCA\u5904\u7406\u540E\u5168\u666F\u8D34\u56FE\u4E4B\u95F4\u7684\u63A5\u7F1D\u4F1A\u8F83\u4E3A\u660E\u663E\uFF0C\u9700\u8981\u5BF9\u5168\u666F\u8D34\u56FE\u63A5\u7F1D\u8FDB\u884C\u5904\u7406\n float handlepixel = 10.0; //\u5904\u7406\u5BBD\u5EA6\n if (uv.x > 0.0 && uv.x < handlepixel / iResolution.x) {\n float newuvx = 1.0 - uv.x;\n vec3 mixColor = sample_blured(vec2(newuvx, uv.y), blur_radius, 0.5).rgb;\n col.rgb = col.rgb * (uv.x * iResolution.x / handlepixel) + mixColor * (1.0-uv.x * iResolution.x / handlepixel);\n }\n //\u6A21\u7CCA\u5904\u7406\u540E\u56E0\u4E3A\u91C7\u6837\u539F\u56E0\u8F83\u539F\u56FE\u6709\u6240\u63D0\u4EAE\uFF0C\u9700\u5C06rgb\u603B\u4F53\u8C03\u4F4E\n col.rgb *=0.95;\n } \n else {\n // \u6A61\u76AE\n col = vec4(texture2D(iChannel0, uv).rgb, 0.);\n }\n\n // \u8FB9\u7F18\u6E10\u53D8\n // \u8FD9\u4E2Ashader\u5728\u6D82\u62B9\u8D34\u56FE\u548C\u5168\u666F\u56FE\u7684\u8854\u63A5\u5904\u4F1A\u5B58\u5728\u9ED1\u8FB9\uFF0C\u539F\u56E0\u4E0D\u660E\u3002\u76EE\u524D\u901A\u8FC7\u7ED9\u9ED1\u8FB9\u4E00\u4E2A\u5F88\u5C0F\u7684\u900F\u660E\u5EA6\u6765\u89C4\u907F\u8FD9\u4E2A\u95EE\u9898\u3002\n // \u5982\u679C\u60F3\u663E\u793A\u9ED1\u8FB9\u7684\u8BDD\uFF0C\u6CE8\u91CA\u6389\u53BB\u9ED1\u8FB9\u7684\u90A3\u884C\u4EE3\u7801\uFF0C\u7136\u540E\u628AnewAlpha\u6539\u62101.\u3002\n if(iBrushType != 0) {\n // \u6A61\u76AE\u4EE5\u5916\n // float newAlpha = 1.;\n float newAlpha = min(max(1.-length(point-wPos)/brushSize, 0.) * 2., 1.); // \u4ECE\u5185\u5230\u5916\u6E10\u53D8\u6D88\u5931\n if(length(point-wPos) - brushSize < 0. && length(point-wPos) - brushSize > -0.005){// 0.005\u53BB\u9ED1\u8FB9\n if (texture2D(iChannel0, uv).a != 0.0) { //\u4FEE\u590D\u8FB9\u7F18bug\n col = texture2D(iChannel0, uv);\n col.a = 0.01;\n }\n newAlpha = 0.01;\n }\n col.a = newAlpha > texture2D(iChannel0, uv).a ? newAlpha : texture2D(iChannel0, uv).a; // \u9AD8alpha\u8986\u76D6\u4F4Ealpha\n } else {\n // \u6A61\u76AE\u67D4\u8F6F\u5EA6\n float newAlpha = min(max(length(point-wPos)/brushSize-0.5, 0.) * (1./0.5), 1.); // \u4ECE\u5916\u5230\u5185\u6E10\u53D8\u6D88\u5931\n if(length(point-wPos) - brushSize*.5 < 0.005 && length(point-wPos) - brushSize*.5 > 0.) newAlpha = 0.01; // 0.005\u53BB\u9ED1\u8FB9\n col.a = newAlpha < texture2D(iChannel0, uv).a ? newAlpha : texture2D(iChannel0, uv).a; // \u4F4Ealpha\u8986\u76D6\u9AD8alpha\n }\n }\n \n // \u663E\u793A\u7B14\u5237\n if(iIsBrush == 1) {\n if(iBrushType != 0) {\n col = vec4(1., 1., 1., 0.4); // \u5176\u4ED6\u7B14\u5237\u767D\u8272\u534A\u900F\u660E\n } else {\n col = vec4(1., 1., 1., 0.); // \u6A61\u76AE\u7B14\u5237\u5B8C\u5168\u900F\u660E\n }\n\n // \u7B14\u5237\u8FB9\u7F18\n float ratio = 0.93; // \u975E\u8FB9\u7F18\u5360brushSize\u7684\u6BD4\u7387\n if(length(point-wPos)/brushSize > ratio) col = vec4(.9, .9, .9, 1.);\n // \u5916\u8FB9\u7F18\u6297\u952F\u9F7F\n float m0 = smootherstep(brushSize-0.002, brushSize+0.002, length(point - wPos));\n col = mix(col, vec4(0.), m0);\n if(length(point - wPos) <= brushSize*ratio+0.002) {\n // \u5185\u8FB9\u7F18\u6297\u952F\u9F7F\n float m1 = smootherstep(brushSize*ratio-0.002, brushSize*ratio+0.002, length(point - wPos));\n col = mix(col, vec4(.9, .9, .9, 1.), m1);\n }\n }\n \n } else if(iIsBrush == 0) {\n // brushSize\u8303\u56F4\u5916\u663E\u793A\u5DF2\u6709\u7684\u6D82\u62B9 bufferTexture\n col = texture2D(iChannel0, uv);\n }\n \n return col;\n }\n \n ",
  6472. Buffer: "\n \n varying vec2 vUv;\n \n void main()\n {\n vec2 uv = vUv;\n gl_FragColor = modelPaint(uv, 0);\n }\n "
  6473. }
  6474. };
  6475. /*
  6476. * @Author: Rindy
  6477. * @Date: 2021-05-07 15:52:29
  6478. * @LastEditors: Rindy
  6479. * @LastEditTime: 2021-05-12 15:35:23
  6480. * @Description: 注释
  6481. */
  6482. var model$1 = {
  6483. //非fish
  6484. uniforms: {
  6485. //许钟文加 和编辑墙有关
  6486. minOpa: {
  6487. //最小透明度系数
  6488. type: 'f',
  6489. value: 0.14
  6490. },
  6491. minDistance: {
  6492. //最小距离控制
  6493. type: 'f',
  6494. value: 2.5
  6495. },
  6496. maxDistance: {
  6497. //最大距离控制
  6498. type: 'f',
  6499. value: 4
  6500. },
  6501. //---------------
  6502. map: {
  6503. // 模型贴图(即dollhouse贴图);当定义了BasePanoMap后,它就是全景贴图,但用的是普通映射
  6504. type: 't',
  6505. value: null
  6506. },
  6507. repeatInfoMap: {
  6508. //重复比率图 sxz
  6509. type: 't',
  6510. value: null
  6511. },
  6512. modelAlpha: {
  6513. type: 'f',
  6514. value: settings$3.modelAlpha
  6515. },
  6516. baseColor: {
  6517. //用来调试的颜色
  6518. type: 'v3',
  6519. value: new THREE.Color(1, 1, 1)
  6520. },
  6521. opacity: {
  6522. type: 'f',
  6523. value: 1
  6524. },
  6525. progress: {
  6526. type: 'f',
  6527. value: 0
  6528. },
  6529. blackout: {
  6530. type: 'i',
  6531. value: 0
  6532. },
  6533. // pano0Map和pano1Map的区分是为了过渡,pano0Map是上一个点位全景图,pano1Map是下一个。一般取pano1Map为当前点位。
  6534. pano0Map: {
  6535. type: 't',
  6536. value: null
  6537. },
  6538. pano0Position: {
  6539. type: 'v3',
  6540. value: new THREE.Vector3()
  6541. },
  6542. pano0Matrix: {
  6543. type: 'm4',
  6544. value: new THREE.Matrix4()
  6545. },
  6546. pano1Map: {
  6547. type: 't',
  6548. value: null
  6549. },
  6550. pano1Position: {
  6551. type: 'v3',
  6552. value: new THREE.Vector3()
  6553. },
  6554. pano1Matrix: {
  6555. type: 'm4',
  6556. value: new THREE.Matrix4()
  6557. },
  6558. /**球幕视频 */
  6559. videoReady: {
  6560. type: '',
  6561. value: 0
  6562. },
  6563. videoTexture: {
  6564. type: 't',
  6565. value: null
  6566. },
  6567. exposure: {
  6568. type: 'f',
  6569. value: 1
  6570. },
  6571. parameters: {
  6572. type: 'm4',
  6573. value: new THREE.Matrix4().set(4608, 3456, 8192, 4096, 1.95985, 1.34, 1739, 2285, -0.00173905, 0.0000274835, -0.0340487, 0, 1235, 954, 2112, 1584)
  6574. },
  6575. clipRect: {
  6576. type: 'v4',
  6577. value: new THREE.Vector4(0.1, 0.1, 0.5, 0.5)
  6578. },
  6579. blendFov: {
  6580. type: 'f',
  6581. value: 5
  6582. },
  6583. // 用于判断球幕视频是否横竖旋转
  6584. bFlag: {
  6585. type: 'i',
  6586. value: 1
  6587. },
  6588. /**马赛克 */
  6589. paint1Map: {
  6590. type: 't',
  6591. value: null
  6592. },
  6593. paint0Map: {
  6594. type: 't',
  6595. value: null
  6596. },
  6597. iShowBrush: {
  6598. type: 'i',
  6599. value: 0
  6600. },
  6601. iMouse: {
  6602. type: 'v4',
  6603. value: new THREE.Vector4()
  6604. },
  6605. iResolution: {
  6606. type: 'v2',
  6607. value: new THREE.Vector2()
  6608. },
  6609. iChannel0: {
  6610. type: 't',
  6611. value: null
  6612. },
  6613. iChannel1: {
  6614. type: 't',
  6615. value: null
  6616. },
  6617. iBrushType: {
  6618. type: 'i',
  6619. value: 1
  6620. },
  6621. iBrushSize: {
  6622. type: 'f',
  6623. value: null
  6624. },
  6625. // 相机的上下转角和左右转角
  6626. iAngle: {
  6627. type: 'f',
  6628. value: null
  6629. },
  6630. iPitch: {
  6631. type: 'f',
  6632. value: null
  6633. },
  6634. /**滤镜 */
  6635. // [-1.0, 1.0] 亮度 对比度 饱和度
  6636. filterBase0: {
  6637. type: 'v3',
  6638. value: new THREE.Vector3(0, 0, 0) // brightness contrast saturation
  6639. },
  6640. // [-1.0, 1.0] 色温调节范围,[ 冷 -- 暖 ]
  6641. filterTemperature0: {
  6642. type: 'f',
  6643. value: 0
  6644. },
  6645. filterBase1: {
  6646. type: 'v3',
  6647. value: new THREE.Vector3(0, 0, 0)
  6648. },
  6649. filterTemperature1: {
  6650. type: 'f',
  6651. value: 0
  6652. },
  6653. //裁剪
  6654. clipBoxType: {
  6655. type: 'a',
  6656. value: null
  6657. },
  6658. clipBoxPoints: {
  6659. type: 'a',
  6660. value: null
  6661. }
  6662. },
  6663. //全景贴图的shader不同-许钟文-----------------
  6664. /* fragmentShader: prefixFragment + (config.scene_version == 1 ? "\n#define Not_Cube\n":"") +
  6665. "uniform sampler2D map;uniform float modelAlpha;uniform float opacity;uniform float progress;uniform int blackout;uniform vec3 pano0Position;uniform vec3 pano1Position;varying vec2 vUv;varying vec3 vWorldPosition0;varying vec3 vWorldPosition1;\n\n#define PI 3.141592653 \n#if defined(Not_Cube)\nuniform sampler2D pano0Map;uniform sampler2D pano1Map;vec4 texCubemapWith2D(sampler2D t,vec3 dir){dir=normalize(dir);float tx=atan(dir.x,dir.z)/(PI*2.0)+0.5;float ty=acos(dir.y)/PI;vec4 color=texture2D(t,vec2(tx,ty));return color;}\n#else\nuniform samplerCube pano0Map;uniform samplerCube pano1Map;\n#endif\nconst vec4 BLACK=vec4(0.0,0.0,0.0,1.0);const vec4 GREY=vec4(0.5,0.5,0.5,1.0);void main(){vec4 colorFromPanos;\n#if defined(Not_Cube)\nvec4 colorFromPano0=texCubemapWith2D(pano0Map,vWorldPosition0);vec4 colorFromPano1=texCubemapWith2D(pano1Map,vWorldPosition1);\n#else\nvec4 colorFromPano0=textureCube(pano0Map,vWorldPosition0.xyz);vec4 colorFromPano1=textureCube(pano1Map,vWorldPosition1.xyz);\n#endif\nif(blackout==0){colorFromPanos=mix(colorFromPano0,colorFromPano1,progress);}else if(blackout==1){colorFromPanos=mix(colorFromPano0,BLACK,min(1.0,progress*2.0));colorFromPanos=mix(colorFromPanos,colorFromPano1,max(0.0,progress*2.0-1.0));}else if(blackout==2){colorFromPanos=mix(colorFromPano0,BLACK,progress);}else if(blackout==3){colorFromPanos=mix(BLACK,colorFromPano1,max(0.0,progress*2.0-1.0));}vec4 colorFromTexture=texture2D(map,vUv);colorFromPanos=mix(colorFromPanos,colorFromTexture,modelAlpha);float whiteness=1.0-smoothstep(0.1,0.2,opacity);colorFromPanos=mix(colorFromPanos,GREY,whiteness);gl_FragColor=vec4(colorFromPanos.rgb,opacity);}"
  6666. */
  6667. vertexShader: "\n\n uniform vec3 pano0Position;\n uniform mat4 pano0Matrix;\n \n uniform vec3 pano1Position;\n uniform mat4 pano1Matrix;\n\n #if defined(checkDistance)\n varying vec3 world_Position; \n #endif\n\n varying vec2 vUv;\n varying vec3 vWorldPosition0;\n varying vec3 vWorldPosition1;\n #ifdef HasClip\n //\u88C1\u526A\u6A21\u5757\n varying vec3 vPos;\n #endif\n \n void main() {\n \n vUv = uv;\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\n \n #if defined(checkDistance)\n world_Position = worldPosition.xyz; \n #endif\n \n vec3 positionLocalToPanoCenter0 = worldPosition.xyz - pano0Position;\n vWorldPosition0 = (vec4(positionLocalToPanoCenter0, 1.0) * pano0Matrix).xyz;\n vWorldPosition0.x *= -1.0;\n \n vec3 positionLocalToPanoCenter1 = worldPosition.xyz - pano1Position;\n vWorldPosition1 = (vec4(positionLocalToPanoCenter1, 1.0) * pano1Matrix).xyz;\n vWorldPosition1.x *= -1.0;\n \n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n #ifdef HasClip\n vPos = position;\n #endif\n }\n\n ",
  6668. fragmentShader: "\n #ifdef HasPaint" + modelPaint.fragmentShader.Common + "\n #endif\n\n #define PI 3.141592653 \n\n // #define Not_Cube_0 1\n // #define Not_Cube_1 1\n \n const vec4 BLACK=vec4(0.0,0.0,0.0,1.0);\n const vec4 GREY2=vec4(0.5,0.5,0.5,1.0); \n const vec4 GREY=vec4(0.23,0.23,0.23,1.0); //cadImg greyArea to cover model\n \n uniform sampler2D map;\n uniform float modelAlpha;\n uniform float opacity;\n uniform float progress;\n uniform int blackout;\n uniform vec3 pano0Position;\n uniform vec3 pano1Position;\n uniform float maxDistance;\n uniform float minDistance;\n uniform float minOpa;\n uniform int bFlag;\n uniform vec3 baseColor;\n \n uniform sampler2D paint1Map;\n uniform sampler2D paint0Map;\n uniform int iShowBrush;\n\n uniform vec3 filterBase0;\n uniform float filterTemperature0;\n uniform vec3 filterBase1;\n uniform float filterTemperature1;\n \n #if defined(HasVideo)\n uniform int videoReady;\n uniform sampler2D videoTexture;\n uniform float exposure;\n uniform mat4 parameters;\n uniform float blendFov;\n #endif\n #ifdef HasClip\n //\u88C1\u526A\u6A21\u5757\n varying vec3 vPos;\n uniform vec3 clipBoxPoints[40]; \n //4\u4E2Avec3\u4E3A\u4E00\u7EC4(\u4E00\u4E2A\u7ACB\u65B9\u4F53)\n uniform int clipBoxType[10];\n //\u5224\u65AD\u88C1\u526A\u7C7B\u578B\u5E76\u8BB0\u5F55\u6709\u6548\u6570\u636E 0\u4E3AclipInside 1\u4E3AclipOutSide -1\u4E3A\u65E0\u6548\u6570\u636E\n #endif\n \n //split Not_Cube defines\n #if defined(Not_Cube_0) \n uniform sampler2D pano0Map;\n #else\n uniform samplerCube pano0Map;\n #endif\n \n #if defined(Not_Cube_1) \n uniform sampler2D pano1Map;\n #else\n uniform samplerCube pano1Map;\n #endif\n \n \n \n \n \n #if defined(RepeatUV) \n uniform sampler2D repeatInfoMap;\n #endif\n \n \n varying vec2 vUv;\n varying vec3 vWorldPosition0;\n varying vec3 vWorldPosition1;\n\n #if defined(checkDistance)\n varying vec3 world_Position; \n #endif\n\n \n uniform vec4 clipRect;\n \n\n float linearStep( float start, float end, float value ) {\n\n return clamp( (value - start) / (end - start), 0.0, 1.0 );\n }\n\n vec2 getSamplerCoord( vec3 direction ) \n {\n direction = normalize(direction);\n float tx=atan(direction.x,direction.z)/(PI*2.0)+0.5; //\u7ECF\u5EA6\u89D2\u5EA6\n float ty=acos(direction.y)/PI; //\u7EAC\u5EA6\u89D2\u5EA6\n\n return vec2(tx,ty);\n }\n\n // \u4ECELinearEncoding\u8F6C\u5230sRGBEncoding\n // \u53C2\u8003\uFF1Ahttps://www.zhangxinxu.com/wordpress/2017/12/linear-rgb-srgb-js-convert/\n vec3 linearToSrgb(vec3 col){\n return mix(col*12.92, 1.055 * pow(col, vec3(0.41667)) - 0.055, step(0.0031308, col));\n }\n #ifdef HasClip\n float inBox(vec3 P, vec3 C, vec3 G, vec3 O, vec3 A){\n return step(0.0,(sign(dot(O-A, P-A)) \n +sign(dot(A-O, P-O)) \n +sign(dot(P-O, C-O)) \n +sign(dot(O-C, P-C)) \n +sign(dot(G-O, P-O)) \n +sign(dot(P-G, O-G))\n - 5.0));\n }\n #endif\n \n #if defined(HasVideo)\n\n #if (HasVideo == 8)\n \n float f42( float phi_undistorted )\n {\n return - 0.0497*phi_undistorted*phi_undistorted*phi_undistorted*phi_undistorted*phi_undistorted\n + 0.2548*phi_undistorted*phi_undistorted*phi_undistorted*phi_undistorted\n - 0.4303*phi_undistorted*phi_undistorted*phi_undistorted\n - 0.016 *phi_undistorted*phi_undistorted \n + 1.0068*phi_undistorted - 0.0004;\t\t \n }\n\n vec2 uv2CameraCoord( vec2 uv) \n {\n vec2 coor;\n coor.x = (uv.x* parameters[0][0] - parameters[0][3]) / parameters[2][3];\n coor.y = (uv.y* parameters[1][0] - parameters[1][3]) / parameters[3][3];\n return coor;\n }\n \n vec4 f44(sampler2D texture, vec2 dc)\n {\n \n float vm = parameters[0][0];\n float vb = parameters[1][0];\n float vy = parameters[2][0];\n float oh = parameters[3][0];\n\n float wa = parameters[0][1];\n float qa = parameters[1][1];\n float cx = parameters[2][1];\n float cy = parameters[3][1];\n \n float tx = parameters[0][2];\n float ty = parameters[1][2];\n float tz = parameters[2][2];\n \n\n \n float focal_final = wa * 1000.0 / qa;\n \n float ptIn_x = dc.x * vy;\n float ptIn_y = (1.0 - dc.y) * oh;\n \n float ptOut_x, ptOut_y;\n \n float size = vy > oh ? vy : oh;\n \n float camx, camy;\n \n camx = (ptIn_x - vy / 2.0) / size;\n camy = (ptIn_y - oh / 2.0) / size;\n \n float lon, lat;\n \n lon = camx * 2.0 * 3.1415926;\n lat = camy * 2.0 * 3.1415926;\n \n float zq, zw, zr;\n \n zq = 0.33 * tx + cos(lat) * sin(lon);\n zw = 0.33 * ty - sin(lat);\n zr = 0.33 * tz + cos(lat) * cos(lon); \n \n \n float theta = atan(-zw, zq);\n \n float al = atan( sqrt(zq * zq + zw * zw), zr);\n \n float x12, x13;\n \n float wea = f42(al);\n float r = focal_final * tan(wea);\n \n x12 = cx + r * cos(theta);\n x13 = cy - r * sin(theta);\n \n ptOut_x = x13 / vm;\n ptOut_y = x12 / vb;\n \n \n vec2 samplerCoord = vec2(ptOut_x, ptOut_y);\n\n #if VideoMapping == 1\n samplerCoord = uv2CameraCoord(samplerCoord);\n #endif\n\n vec2 samplerCoord_final;\n\n if(bFlag==0)\n {\n samplerCoord_final.x = samplerCoord.y;\n samplerCoord_final.y = 1.0 - samplerCoord.x;\n }\n else\n {\n samplerCoord_final.x = samplerCoord.x;\n samplerCoord_final.y = samplerCoord.y; \n }\n \n // \u7403\u5E55\u89C6\u9891\u7FFB\u8F6C\n return texture2D(texture, samplerCoord_final);\n // return texture2D(texture, samplerCoord);\n \n }\n\n float smoothRect( vec4 clipRect, vec2 mixWidth, vec2 uv )\n {\n float x = clipRect.x < clipRect.z ? \n \n step( clipRect.x, uv.x ) * linearStep( clipRect.x, clipRect.x + mixWidth.x, uv.x ) *\n step( uv.x, clipRect.z ) * linearStep( clipRect.z, clipRect.z - mixWidth.x, uv.x ):\n \n step( clipRect.x, uv.x ) * step( uv.x, 1.0 ) * linearStep( clipRect.x, clipRect.x + mixWidth.x, uv.x ) + \n step( 0.0, uv.x ) * step( uv.x, clipRect.z ) * linearStep( clipRect.z, clipRect.z - mixWidth.x, uv.x );\n \n \n float y = step( clipRect.y, uv.y ) * linearStep( clipRect.y, clipRect.y + mixWidth.y, uv.y ) // from\n * step( uv.y, clipRect.w ) * linearStep( clipRect.w, clipRect.w - mixWidth.y, uv.y ); // to \n \n \n return x * y;\n }\n \n vec3 satEnhance( vec3 inputColor, float sat )\n {\n float R = inputColor.r * 255.0;\n float G = inputColor.g * 255.0;\n float B = inputColor.b * 255.0;\n \n float Y = 0.257 * R + 0.564 * G + 0.098 * B + 16.0;\n float Cb = -0.148 * R - 0.291 * G + 0.439 * B + 128.0;\n float Cr = 0.439 * R - 0.368 * G - 0.071 * B + 128.0;\n\n Cr = sat * (Cr - 128.0) + 128.0;\n Cb = sat * (Cb - 128.0) + 128.0; \n \n float newB = 1.164*(Y-16.0)+2.017*(Cb-128.0);\n float newR = 1.164*(Y-16.0)+1.596*(Cr-128.0);\n float newG = 1.164*(Y-16.0)-0.392*(Cb-128.0)-0.813*(Cr-128.0);\n \n newB /= 255.0;\n newR /= 255.0;\n newG /= 255.0;\n \n return vec3(newR, newG, newB); \n }\n\n\n #elif (HasVideo == 2)\n\n float f42( float phi )\n {\n return (-2.08836240e-05) * pow(phi, 9.0)\n + (-2.20461427e-04) * pow(phi, 8.0) \n + (-8.04183603e-03) * pow(phi, 7.0) \n + (3.95783387e-02) * pow(phi, 6.0)\n + (-6.51361598e-02) * pow(phi, 5.0)\n + (3.16523167e-02) * pow(phi, 4.0)\n + (-1.35220728e-02) * pow(phi, 3.0) \n + (3.86472740e-03) * pow(phi, 2.0)\n + (9.99717594e-01) * pow(phi, 1.0) \n + (3.98472625e-06) * pow(phi, 0.0);\t\t \n }\n\n vec2 uv2CameraCoord( vec2 uv) \n {\n vec2 coor;\n coor.x = (uv.x* parameters[0][0] - parameters[0][3]) / parameters[2][3];\n coor.y = (uv.y* parameters[1][0] - parameters[1][3]) / parameters[3][3];\n return coor;\n }\n \n vec4 f44(sampler2D texture, vec2 dc)\n {\n \n float iw = parameters[0][0]; //inputWidth\n float ih = parameters[1][0]; //inputHeight\n float ow = parameters[2][0]; //outputWidth\n float oh = parameters[3][0]; //outputHeight\n\n float wa = parameters[0][1]; //focal\n float qa = parameters[1][1]; //pixel\n float cx = parameters[2][1]; //cx\n float cy = parameters[3][1]; //cy\n \n float tx = parameters[0][2];\n float ty = parameters[1][2];\n float tz = parameters[2][2];\n \n\n \n float focal_final = wa * 1000.0 / qa;\n \n float ptIn_x = dc.x * ow;\n float ptIn_y = dc.y * oh;\n\n float ptOut_x, ptOut_y;\n \n float size = ow > oh ? ow : oh;\n\n float camx, camy;\n\n camx = (ptIn_x - ow / 2.0) / size;\n camy = (ptIn_y - oh / 2.0) / size;\n\n float lon, lat;\n\n lon = camx * 2.0 * 3.1415926;\n lat = -1.0 * camy * 2.0 * 3.1415926;\n\n float sphx, sphy, sphz;\n\n sphx = cos(lat) * sin(lon);\n sphy = -sin(lat);\n sphz = cos(lat) * cos(lon);\n\n float theta = atan(-sphy, sphx);\n\n float phi_undistorted = atan( sqrt(sphx * sphx + sphy * sphy), sphz);\n\n float phi_distorted = f42(phi_undistorted);\n float r = focal_final * phi_distorted;\n\n float du = cx + r * cos(theta);\n float dv = cy - r * sin(theta);\n \n ptOut_x = (du - 508.0) / 1984.0;\n ptOut_y = 1.0 - (dv - 508.0) / 1984.0;\n \n vec2 samplerCoord = vec2(ptOut_x, ptOut_y);\n \n \n return texture2D(texture, samplerCoord);\n \n }\n\n #elif (HasVideo == 3)\n \n float f42( float phi )\n {\n return (-1.47485770e-02) * pow(phi, 9.0)\n + (9.72111981e-02) * pow(phi, 8.0) \n + (-2.48315153e-01) * pow(phi, 7.0) \n + (3.20998529e-01) * pow(phi, 6.0)\n + (-2.46321067e-01) * pow(phi, 5.0)\n + (9.53838280e-02) * pow(phi, 4.0)\n + (-4.29416319e-02) * pow(phi, 3.0) \n + (1.84551397e-03) * pow(phi, 2.0)\n + (9.99948738e-01) * pow(phi, 1.0) \n + (5.00118946e-07) * pow(phi, 0.0);;\t\t \n }\n\n vec2 uv2CameraCoord( vec2 uv) \n {\n vec2 coor;\n coor.x = (uv.x* parameters[0][0] - parameters[0][3]) / parameters[2][3];\n coor.y = (uv.y* parameters[1][0] - parameters[1][3]) / parameters[3][3];\n return coor;\n }\n \n vec4 f44(sampler2D texture, vec2 dc)\n {\n \n float vm = parameters[0][0];\n float vb = parameters[1][0];\n float vy = parameters[2][0];\n float oh = parameters[3][0];\n\n float wa = parameters[0][1];\n float qa = parameters[1][1];\n float cx = parameters[2][1];\n float cy = parameters[3][1];\n \n float tx = parameters[0][2];\n float ty = parameters[1][2];\n float tz = parameters[2][2];\n \n\n \n float focal_final = wa;\n \n float ptIn_x = dc.x * vy;\n float ptIn_y = (1.0 - dc.y) * oh;\n \n float ptOut_x, ptOut_y;\n \n float size = vy > oh ? vy : oh;\n \n float camx, camy;\n \n camx = (ptIn_x - vy / 2.0) / size;\n camy = (ptIn_y - oh / 2.0) / size;\n \n float lon, lat;\n \n lon = camx * 2.0 * 3.1415926;\n lat = camy * 2.0 * 3.1415926;\n \n float sphx, sphy, sphz;\n \n sphx = cos(lat) * sin(lon);\n sphy = - sin(lat);\n sphz = cos(lat) * cos(lon); \n\n\n //apply rz to video stitch\n\n float r00 = cos(tz);\n float r01 = -1.0 * sin(tz);\n float r02 = 0.0;\n\n float r10 = sin(tz);\n float r11 = cos(tz);\n float r12 = 0.0;\n\n float r20 = 0.0;\n float r21 = 0.0;\n float r22 = 1.0;\n\n float zq, zw, zr;\n\n zq = r00*sphx + r01*sphy + r02*sphz;\n zw = r10*sphx + r11*sphy + r12*sphz;\n zr = r20*sphx + r21*sphy + r22*sphz;\n\n\n float theta = atan(-zw, zq);\n \n float al = atan( sqrt(zq * zq + zw * zw), zr);\n \n float x12, x13;\n \n float wea = f42(al);\n float r = focal_final * (wea);\n \n x12 = cx + r * cos(theta);\n x13 = cy - r * sin(theta);\n \n ptOut_x = x13 / vm;\n ptOut_y = x12 / vb;\n \n \n vec2 samplerCoord = vec2(ptOut_x, ptOut_y);\n\n #if VideoMapping == 1\n samplerCoord = uv2CameraCoord(samplerCoord);\n #endif\n \n samplerCoord.x = 1.0 - samplerCoord.x;\n samplerCoord.y = 1.0 - samplerCoord.y;\n\n vec2 samplerCoord_final;\n\n if(bFlag==0)\n {\n samplerCoord_final.x = 1.0 - samplerCoord.y;\n samplerCoord_final.y = samplerCoord.x;\n }\n else\n {\n samplerCoord_final.x = samplerCoord.x;\n samplerCoord_final.y = samplerCoord.y; \n }\n\n return texture2D(texture, samplerCoord_final);\n // return texture2D(texture, samplerCoord);\n }\n\n float smoothRect( vec4 clipRect, vec2 mixWidth, vec2 uv )\n {\n float x = clipRect.x < clipRect.z ? \n \n step( clipRect.x, uv.x ) * linearStep( clipRect.x, clipRect.x + mixWidth.x, uv.x ) *\n step( uv.x, clipRect.z ) * linearStep( clipRect.z, clipRect.z - mixWidth.x, uv.x ):\n \n step( clipRect.x, uv.x ) * step( uv.x, 1.0 ) * linearStep( clipRect.x, clipRect.x + mixWidth.x, uv.x ) + \n step( 0.0, uv.x ) * step( uv.x, clipRect.z ) * linearStep( clipRect.z, clipRect.z - mixWidth.x, uv.x );\n \n \n float y = step( clipRect.y, uv.y ) * linearStep( clipRect.y, clipRect.y + mixWidth.y, uv.y ) // from\n * step( uv.y, clipRect.w ) * linearStep( clipRect.w, clipRect.w - mixWidth.y, uv.y ); // to \n \n \n return x * y;\n }\n\n vec3 satEnhance( vec3 inputColor, float sat )\n {\n float R = inputColor.r * 255.0;\n float G = inputColor.g * 255.0;\n float B = inputColor.b * 255.0;\n \n float Y = 0.257 * R + 0.564 * G + 0.098 * B + 16.0;\n float Cb = -0.148 * R - 0.291 * G + 0.439 * B + 128.0;\n float Cr = 0.439 * R - 0.368 * G - 0.071 * B + 128.0;\n\n Cr = sat * (Cr - 128.0) + 128.0;\n Cb = sat * (Cb - 128.0) + 128.0; \n \n float newB = 1.164*(Y-16.0)+2.017*(Cb-128.0);\n float newR = 1.164*(Y-16.0)+1.596*(Cr-128.0);\n float newG = 1.164*(Y-16.0)-0.392*(Cb-128.0)-0.813*(Cr-128.0);\n \n newB /= 255.0;\n newR /= 255.0;\n newG /= 255.0;\n \n return vec3(newR, newG, newB); \n }\n\n vec3 conAdjust( vec3 inputColor, float alpha )\n {\n float R = inputColor.r * 255.0;\n float G = inputColor.g * 255.0;\n float B = inputColor.b * 255.0;\n\n float newB = alpha * (B - 0.5) + 0.5;\n float newG = alpha * (G - 0.5) + 0.5;\n float newR = alpha * (R - 0.5) + 0.5;\n\n newB /= 255.0;\n newR /= 255.0;\n newG /= 255.0;\n\n return vec3(newR, newG, newB); \n }\n\n\n #endif\n\n \n\n #endif\n\n\n #if defined(RepeatUV) \n float getUV(float num, float cellSize, float mul){ \n float index = floor(num / cellSize); //\u7B2Cindex\u9694\u95F4\n float start = index * cellSize; //\u533A\u95F4\u8D77\u59CB\n float delta = num - start; //\u76F8\u6BD4\u8D77\u59CB\u7684\u589E\u91CF\n float delta_mul = delta * mul; //\u653E\u5927\u540E\u7684\u589E\u91CF \n delta_mul = delta_mul - cellSize * floor(delta_mul / cellSize); //\u6C42\u4F59\u3002 \u6700\u7EC8\u9700\u8981\u7684\u589E\u52A0\u91CF\uFF0C\u4F46\u662F\u4E0D\u80FD\u8D85\u8FC7\u8BE5\u533A\u95F4\uFF0C\u6240\u4EE5\u591A\u51FA\u6765\u7684\u8981\u7F29\u51CF\uFF0Crepeat\n \n return start + delta_mul;\n }\n float round(float num){\n float intPart = floor(num);\n if(num - intPart < 0.5)return intPart;\n else return intPart+1.0;\n } \n #endif\n\n ////////////////////////////////////////////////////////////////\n // \u4F7F\u7528HasPaint\u3001hasFilter\u7684\u539F\u56E0\uFF1A\u51CF\u5C11\u9700\u8981\u8FD0\u884C\u7684shader\u4EE3\u7801\uFF0C\u4F18\u5316gpu\n\n // \u6D82\u62B9\n #ifdef HasPaint\n // \u5C06\u6D82\u62B9\u8D34\u56FE\u8D34\u5230\u5168\u666F\u56FE\u4E0A colorFromPano\uFF1A\u5168\u666F\u56FE\uFF0CpaintMap\uFF1A\u6D82\u62B9\u8D34\u56FE\n vec4 paint(vec4 colorFromPano, sampler2D paintMap, vec3 vWorldPosition) {\n // uv\u4FEE\u6B63\n vec2 sphereUv = getSamplerCoord(vWorldPosition.xyz);\n sphereUv.y = 1. - sphereUv.y;\n sphereUv.x -= 0.25; //\u5168\u666F\u56FE\u548CCube\u7684\u6C34\u5E73\u91C7\u6837\u8D77\u59CB\u5750\u6807\u76F8\u5DEE90\u5EA6\uFF0C\u8FD9\u91CC\u77EB\u6B63 0.25 \u4E2A\u91C7\u6837\u504F\u79FB\n if(sphereUv.x < 0.) sphereUv.x += 1.;\n \n vec4 colBuffer = texture2D(paintMap, sphereUv);\n\n return vec4(colBuffer.rgb * colBuffer.a + colorFromPano.rgb * (1. - colBuffer.a), 1.);\n }\n #endif\n\n ////////////////////////////////////////////////////////////////\n // \u6EE4\u955C\uFF08\u7B97\u6CD5\u6765\u81EAshadertoy\uFF09\n #ifdef hasFilter\n // \u8C03\u6574\u4EAE\u5EA6[-1, 1]\n vec4 colorBrightness(vec4 color, float brightness) {\n brightness = clamp(brightness, -1., 1.);\n if(brightness < 0.) brightness = brightness/2.;\n return color * (brightness + 1.);\n }\n\n // \u8C03\u6574\u5BF9\u6BD4\u5EA6[-1, 1]\n vec4 colorContrast(vec4 color, float contrast) {\n contrast = clamp(contrast, -1., 1.);\n // return mix(color, vec4(1.0) / (vec4(1.0) + exp(-(color * 10.0 - 5.0))), -contrast);\n return mix(color, smoothstep(0.0, 1.0, color), contrast);\n }\n\n // \u8C03\u6574\u9971\u548C\u5EA6[-1, 1]\n vec4 colorSaturation(vec4 color, float saturation) {\n saturation = clamp(saturation, -1., 1.);\n vec3 weights = vec3(0.2125, 0.7154, 0.0721);\n float luminance = dot(color.rgb, weights);\n return mix(vec4(luminance), color, saturation + 1.);\n }\n\n vec3 colorTemperatureToRGB(const in float temperature){\n mat3 m = (temperature <= 6500.0) ? \n mat3(vec3(0.0, -2902.1955373783176, -8257.7997278925690),\n vec3(0.0, 1669.5803561666639, 2575.2827530017594),\n vec3(1.0, 1.3302673723350029, 1.8993753891711275)) : \n mat3(vec3(1745.0425298314172, 1216.6168361476490, -8257.7997278925690),\n vec3(-2666.3474220535695, -2173.1012343082230, 2575.2827530017594),\n vec3(0.55995389139931482, 0.70381203140554553, 1.8993753891711275)); \n return mix(clamp(vec3(m[0] / (vec3(clamp(temperature, 4000.0, 9000.0)) + m[1]) + m[2]), vec3(0.0), vec3(1.0)), vec3(1.0), smoothstep(4000.0, 0.0, temperature));\n }\n // \u8C03\u6574\u8272\u6E29[-1, 1]\n vec4 colorTemperature(vec4 color, float temperature) {\n temperature = clamp(temperature, -1., 1.);\n const float LuminancePreservationFactor = 1.0;\n float temperatureFactor;\n float temperatureStrength;\n if(temperature > 0.) {\n temperatureFactor = 4000.0;\n temperatureStrength = mix(0., 1.5, abs(temperature));\n } else {\n temperatureFactor = 9000.0;\n temperatureStrength = mix(0., 2.3, abs(temperature));\n }\n vec3 inColor = color.rgb;\n vec3 outColor = mix(inColor, inColor * colorTemperatureToRGB(temperatureFactor), temperatureStrength); \n // WithQuickAndDirtyLuminancePreservation\n outColor *= mix(1.0, dot(inColor, vec3(0.2126, 0.7152, 0.0722)) / max(dot(outColor, vec3(0.2126, 0.7152, 0.0722)), 1e-5), LuminancePreservationFactor); \n return vec4(outColor, color.a);\n }\n\n // \u628A\u6EE4\u955C\u6548\u679C\u878D\u5165\u5168\u666F\u56FE colorFromPano\uFF1A\u5168\u666F\u56FE\uFF0CfilterBase\uFF1A\u4EAE\u5EA6\uFF08x\uFF09\u3001\u5BF9\u6BD4\u5EA6\uFF08y\uFF09\u3001\u9971\u548C\u5EA6\uFF08z\uFF09\uFF0CfilterTemperature\uFF1A\u8272\u6E29\n vec4 filter(vec4 colorFromPano, vec3 filterBase, float filterTemperature) {\n colorFromPano = colorBrightness(colorFromPano, filterBase.x);\n colorFromPano = colorContrast(colorFromPano, filterBase.y);\n colorFromPano = colorSaturation(colorFromPano, filterBase.z);\n colorFromPano = colorTemperature(colorFromPano, filterTemperature);\n return colorFromPano;\n }\n #endif\n\n\n \n \n void main()\n {\n #ifdef HasClip\n float isClip = 0.0; \n //isClip\u7528\u4E8E\u6807\u8BB0\u662F\u5426\u9700\u8981\u88C1\u526A, >0 \u5C06\u4F1A\u88ABdiscard\n #pragma unroll_loop_start\n for(int i = 0; i < 10; i++) {\n if(clipBoxType[i] == -1) {\n } else if (clipBoxType[i] == 0) {\n if (inBox(vPos, clipBoxPoints[UNROLLED_LOOP_INDEX*4], clipBoxPoints[UNROLLED_LOOP_INDEX*4+1], clipBoxPoints[UNROLLED_LOOP_INDEX*4+2], clipBoxPoints[UNROLLED_LOOP_INDEX*4+3]) == 1.0) {\n isClip = 2.0;\n }\n } else if (clipBoxType[i] == 1) {\n if(isClip != 2.0) isClip != -1.0 && inBox(vPos, clipBoxPoints[UNROLLED_LOOP_INDEX*4], clipBoxPoints[UNROLLED_LOOP_INDEX*4+1], clipBoxPoints[UNROLLED_LOOP_INDEX*4+2], clipBoxPoints[UNROLLED_LOOP_INDEX*4+3]) == 0.0 ? isClip = 1.0 : isClip = -1.0;\n }\n }\n #pragma unroll_loop_end\n if(isClip > 0.0) discard;\n #endif\n \n vec4 colorFromPano0 = vec4(0.0,0.0,0.0,0.0);\n #if defined(usePanoMap0)\n //\u5373progress < 1.0 \u901A\u5E38\u662F1 \n #if (defined(Not_Cube_0) || defined(HasVideo)) \n vec2 samplerCoord0 = getSamplerCoord(vWorldPosition0.xyz); \n #endif \n \n \n #if defined(Not_Cube_0)\n colorFromPano0=texture2D(pano0Map,samplerCoord0); \n #else\n colorFromPano0=textureCube(pano0Map,vWorldPosition0.xyz); \n #endif\n #endif \n \n \n #if (defined(Not_Cube_1) || defined(HasVideo)) \n vec2 samplerCoord1 = getSamplerCoord(vWorldPosition1.xyz); \n #endif \n \n\n #ifdef BasePanoMap\n //\u666E\u901A\u8D34\u56FE\u5F53\u505A\u5168\u666F\u56FE\n vec4 colorFromPano1 = texture2D(map, vUv);\n #ifdef HasVideo\n samplerCoord1.x -= 0.25; \n #endif\n #else \n #if defined(Not_Cube_1)\n vec4 colorFromPano1=texture2D(pano1Map,samplerCoord1); \n #else\n vec4 colorFromPano1=textureCube(pano1Map,vWorldPosition1.xyz); \n #ifdef HasVideo\n samplerCoord1.x -= 0.25; //\u5168\u666F\u56FE\u548CCube\u7684\u6C34\u5E73\u91C7\u6837\u8D77\u59CB\u5750\u6807\u76F8\u5DEE90\u5EA6\uFF0C\u8FD9\u91CC\u77EB\u6B63 0.25 \u4E2A\u91C7\u6837\u504F\u79FB\n #endif\n #endif\n #endif\n\n\n #ifdef HasPaint\n // \u6D82\u62B9\u56FE\u5C42\uFF08\u76EE\u524D\u6D82\u62B9\u56FE\u5C42\u8981\u5148\u4E8E\u7403\u5E55\u89C6\u9891\u56FE\u5C42\u6267\u884C\uFF0C\u6240\u4EE5\u4F1A\u88AB\u7403\u5E55\u89C6\u9891\u6321\u4F4F\uFF09\n colorFromPano0 = paint(colorFromPano0, paint0Map, vWorldPosition0);\n colorFromPano1 = paint(colorFromPano1, paint1Map, vWorldPosition1);\n #endif\n\n \n // \u7403\u5E55\u89C6\u9891\n #if defined(HasVideo)\n\n vec4 colorFromVideo = vec4(0.0,0.0,0.0,0.0);\n \n #if HasVideo == 8\n\n colorFromVideo = f44(videoTexture, samplerCoord1);\n colorFromVideo.rgb *= exposure;\n\n vec2 transitionSize = 80.0 / vec2( 4096.0, 2048.0 );\n\n \n #if VideoMapping == 0\n float alpha = linearStep(0.3, 0.33, samplerCoord1.x) * 1.0 - linearStep(0.66, 0.7, samplerCoord1.x);\n colorFromPano1 = mix(colorFromPano1, colorFromVideo, alpha * float(videoReady));\n #elif VideoMapping == 1\n\n \n float rect = smoothRect( vec4(\n 0.4166, 0.2833,\n 0.5833, 0.7133\n ), vec2( blendFov / 360.0, blendFov / 180.0 ), samplerCoord1 );\n\n colorFromPano1 = mix(colorFromPano1, colorFromVideo, rect * float(videoReady) * max(0.0,progress*2.0-1.0));\n \n #elif VideoMapping == 2\n\n samplerCoord1 = fract(samplerCoord1);\n\n vec2 clipUV = vec2(\n clipRect.x < clipRect.z ? linearStep( clipRect.x, clipRect.z, samplerCoord1.x ) : linearStep( clipRect.x, clipRect.z + 1.0, samplerCoord1.x < clipRect.z ? samplerCoord1.x + 1.0 : samplerCoord1.x ),\n linearStep( clipRect.y, clipRect.w, samplerCoord1.y )\n );\n clipUV.y = 1.0- clipUV.y;\n\n colorFromVideo = texture2D( videoTexture, clipUV );\n float rect = smoothRect( clipRect, vec2(0.02,0.02), samplerCoord1 );\n\n \n colorFromPano1 = mix( colorFromPano1, colorFromVideo, rect * float(videoReady) * max(0.0,progress*2.0-1.0) );\n\n #endif\n\n #elif HasVideo == 2\n\n colorFromVideo = f44(videoTexture, samplerCoord1);\n float alphaX = linearStep( 0.31, 0.33, samplerCoord1.x) * 1.0 - linearStep(0.65, 0.67, samplerCoord1.x);\n float alphaY = linearStep( 0.15, 0.17, 1.0 - samplerCoord1.y) * 1.0 - linearStep(0.82, 0.84, 1.0 - samplerCoord1.y);\n colorFromPano1 = mix(colorFromPano1, colorFromVideo, alphaX * alphaY * float(videoReady) * max(0.0,progress*2.0-1.0));\t\n\n #elif HasVideo == 3\n\n float cx = parameters[2][1]; //cx\n float cy = parameters[3][1]; //cy\n\n float diffx = (cx - 1824.0) / 16416.0;\n float diffy = (cy - 2736.0) / 7576.0;\n\n colorFromVideo = f44(videoTexture, samplerCoord1);\n colorFromVideo.rgb *= exposure;\n \n\n vec2 transitionSize = 80.0 / vec2( 4096.0, 2048.0 );\n\n \n #if VideoMapping == 0\n float alpha = linearStep(0.3, 0.33, samplerCoord1.x) * 1.0 - linearStep(0.66, 0.7, samplerCoord1.x);\n colorFromPano1 = mix(colorFromPano1, colorFromVideo, alpha * float(videoReady));\n #elif VideoMapping == 1\n \n float rect = smoothRect( vec4(\n 0.4277-diffx, 0.28-diffy,\n 0.572-diffx, 0.72-diffy\n ), vec2( blendFov / 360.0, blendFov / 180.0 ), samplerCoord1 );\n\n colorFromPano1 = mix(colorFromPano1, colorFromVideo, rect * float(videoReady) * max(0.0,progress*2.0-1.0));\n \n #elif VideoMapping == 2\n\n samplerCoord1 = fract(samplerCoord1);\n\n vec2 clipUV = vec2(\n clipRect.x < clipRect.z ? linearStep( clipRect.x, clipRect.z, samplerCoord1.x ) : linearStep( clipRect.x, clipRect.z + 1.0, samplerCoord1.x < clipRect.z ? samplerCoord1.x + 1.0 : samplerCoord1.x ),\n linearStep( clipRect.y, clipRect.w, samplerCoord1.y )\n );\n clipUV.y = 1.0- clipUV.y;\n\n colorFromVideo = texture2D( videoTexture, clipUV );\n\n \n float rect = smoothRect( clipRect, vec2(0.02,0.02), samplerCoord1 );\n\n \n colorFromPano1 = mix( colorFromPano1, colorFromVideo, rect * float(videoReady) * max(0.0,progress*2.0-1.0) );\n\n #endif\n\n #endif\n\n #endif\n\n\n #ifdef hasFilter\n // \u6EE4\u955C\n colorFromPano0 = filter(colorFromPano0, filterBase0, filterTemperature0);\n colorFromPano1 = filter(colorFromPano1, filterBase1, filterTemperature1);\n #endif\n\n\n\n\n // \u5408\u5E76colorFromPano0\u548CcolorFromPano1\n vec4 color; \n \n if(blackout==0)\n { \n #if defined(usePanoMap0) \n color=mix(colorFromPano0,colorFromPano1,progress);\n #else\n color = colorFromPano1;\n #endif \n \n }\n else if(blackout==1)\n {\n color=mix(colorFromPano0,BLACK,min(1.0,progress*2.0));\n color=mix(color,colorFromPano1,max(0.0,progress*2.0-1.0));\n }\n else if(blackout==2)\n {\n color=mix(colorFromPano0,BLACK,progress);\n }\n else if(blackout==3)\n {\n color=mix(BLACK,colorFromPano1,max(0.0,progress*2.0-1.0));\n }\n \n \n \n vec2 uv = vUv;\n \n #if defined(RepeatUV) \n \n vec4 infoColor = texture2D(repeatInfoMap, vUv); \n float mul = round(infoColor.r * 255.0 / 5.0) + round(infoColor.g * 255.0 / 5.0) / 10.0; \n \n if(mul>0.0 && mul != 1.0){\n float cellCount = 8.0; \n \n float cellSize = 1.0 / cellCount;\n float dir = round(infoColor.b * 255.0 / 5.0);\n if (dir == 0.0) {\n uv.x = getUV(uv.x, cellSize, mul) ;\n }else if (dir == 1.0) {\n uv.y = getUV(uv.y, cellSize, mul) ; \n }else{\n uv.x = getUV(uv.x, cellSize, mul) ;\n uv.y = getUV(uv.y, cellSize, mul) ;\n } \n }\n \n #endif\n \n \n #if defined(useModelMap) \n // \u5408\u5E76color\u548CmodelColor\n vec4 colorFromTexture = texture2D(map,uv);\n #ifdef Is3dTiles\n // 3dtiles\u8D34\u56FE\u9700\u8981\u7528linearToSrgb\u8F6C\u5230Srgb\u8272\u5F69\u7A7A\u95F4\n colorFromTexture = vec4(linearToSrgb(colorFromTexture.rgb), colorFromTexture.a);\n #endif\n color = mix(color, colorFromTexture, modelAlpha); \n #endif\n\n\n\n float whiteness = 1.0-smoothstep(0.1, 1.0, opacity); \n color = mix(color, GREY, whiteness ); \n \n float opa = opacity;\n #if defined(checkDistance)\n vec3 cameraPos = mix(pano0Position, pano1Position, progress);\n float dis = distance(cameraPos, world_Position);\n float disOpa=minOpa;\n if(dis < minDistance)\n {\n disOpa=1.0;\n }\n else if(dis<maxDistance)\n {\n float k=(minOpa-1.0)/(maxDistance-minDistance);\n disOpa=k*dis+1.0-k*minDistance;\n } \n float whiteness2 = 1.0-smoothstep(0.1,0.2,disOpa); \n color = mix(color, GREY2, whiteness2); \n opa *= disOpa;\n \n #endif\n \n\n\n #ifdef HasPaint\n // \u7B14\u5237\n if(iShowBrush == 1) {\n vec2 sphereUv = getSamplerCoord(vWorldPosition1.xyz);\n sphereUv.y = 1. - sphereUv.y;\n sphereUv.x -= 0.25; //\u5168\u666F\u56FE\u548CCube\u7684\u6C34\u5E73\u91C7\u6837\u8D77\u59CB\u5750\u6807\u76F8\u5DEE90\u5EA6\uFF0C\u8FD9\u91CC\u77EB\u6B63 0.25 \u4E2A\u91C7\u6837\u504F\u79FB\n if(sphereUv.x < 0.) sphereUv.x += 1.;\n vec4 brushBuffer = modelPaint(sphereUv, 1);\n if(brushBuffer.a > 0.) {\n color = vec4(brushBuffer.rgb * brushBuffer.a + color.rgb * (1. - brushBuffer.a), 1.);\n } \n }\n #endif\n \n\n\n\n gl_FragColor = vec4(color.rgb * baseColor, opa);\n \n \n \n }\n ",
  6669. fragmentBufferShader: modelPaint.fragmentShader.Common + modelPaint.fragmentShader.Buffer
  6670. };
  6671. /*
  6672. * @Author: Rindy
  6673. * @Date: 2021-05-07 16:01:31
  6674. * @LastEditors: Rindy
  6675. * @LastEditTime: 2021-05-12 15:35:42
  6676. * @Description: 注释
  6677. */
  6678. var modelDebug = {
  6679. uniforms: {
  6680. map: {
  6681. type: 't',
  6682. value: null
  6683. },
  6684. modelAlpha: {
  6685. type: 'f',
  6686. value: settings$3.modelAlpha
  6687. },
  6688. depthmapRatio: {
  6689. type: 'f',
  6690. value: 0
  6691. },
  6692. opacity: {
  6693. type: 'f',
  6694. value: 1
  6695. },
  6696. progress: {
  6697. type: 'f',
  6698. value: 0
  6699. },
  6700. considerOcclusion: {
  6701. type: 'i',
  6702. value: settings$3.fancierTransition
  6703. },
  6704. highlightPanoSelection: {
  6705. type: 'i',
  6706. value: 0
  6707. },
  6708. useThirdPano: {
  6709. type: 'i',
  6710. value: settings$3.useThirdPano
  6711. },
  6712. pano0Map: {
  6713. type: 't',
  6714. value: null
  6715. },
  6716. pano0Depth: {
  6717. type: 't',
  6718. value: null
  6719. },
  6720. pano0Position: {
  6721. type: 'v3',
  6722. value: new THREE.Vector3()
  6723. },
  6724. pano0Matrix: {
  6725. type: 'm4',
  6726. value: new THREE.Matrix4()
  6727. },
  6728. pano0Weight: {
  6729. type: 'f',
  6730. value: settings$3.transition.pano0Weight
  6731. },
  6732. pano1Map: {
  6733. type: 't',
  6734. value: null
  6735. },
  6736. pano1Depth: {
  6737. type: 't',
  6738. value: null
  6739. },
  6740. pano1Position: {
  6741. type: 'v3',
  6742. value: new THREE.Vector3()
  6743. },
  6744. pano1Matrix: {
  6745. type: 'm4',
  6746. value: new THREE.Matrix4()
  6747. },
  6748. pano1Weight: {
  6749. type: 'f',
  6750. value: settings$3.transition.pano1Weight
  6751. },
  6752. pano2Map: {
  6753. type: 't',
  6754. value: null
  6755. },
  6756. pano2Depth: {
  6757. type: 't',
  6758. value: null
  6759. },
  6760. pano2Position: {
  6761. type: 'v3',
  6762. value: new THREE.Vector3()
  6763. },
  6764. pano2Matrix: {
  6765. type: 'm4',
  6766. value: new THREE.Matrix4()
  6767. },
  6768. pano2Weight: {
  6769. type: 'f',
  6770. value: settings$3.transition.pano2Weight
  6771. }
  6772. },
  6773. vertexShader: 'uniform vec3 pano0Position;\nuniform mat4 pano0Matrix;\n\nuniform vec3 pano1Position;\nuniform mat4 pano1Matrix;\n\nuniform vec3 pano2Position;\nuniform mat4 pano2Matrix;\n\nvarying vec2 vUv;\nvarying vec3 vWorldPosition0;\nvarying vec3 vWorldPosition1;\nvarying vec3 vWorldPosition2;\n\nvarying vec4 worldPosition;\n\nvoid main() {\n\n vUv = uv;\n worldPosition = modelMatrix * vec4(position, 1.0);\n\n vec3 positionLocalToPanoCenter0 = worldPosition.xyz - pano0Position;\n vWorldPosition0 = (vec4(positionLocalToPanoCenter0, 1.0) * pano0Matrix).xyz;\n vWorldPosition0.x *= -1.0;\n\n vec3 positionLocalToPanoCenter1 = worldPosition.xyz - pano1Position;\n vWorldPosition1 = (vec4(positionLocalToPanoCenter1, 1.0) * pano1Matrix).xyz;\n vWorldPosition1.x *= -1.0;\n\n vec3 positionLocalToPanoCenter2 = worldPosition.xyz - pano2Position;\n vWorldPosition2 = (vec4(positionLocalToPanoCenter2, 2.0) * pano2Matrix).xyz;\n vWorldPosition2.x *= -1.0;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n}\n',
  6774. fragmentShader: 'uniform sampler2D map;\nuniform float depthmapRatio;\nuniform float modelAlpha;\nuniform float opacity;\nuniform float progress;\nuniform int considerOcclusion;\nuniform int highlightPanoSelection;\nuniform int useThirdPano;\n\nuniform vec3 pano0Position;\nuniform samplerCube pano0Map;\nuniform samplerCube pano0Depth;\nuniform float pano0Weight;\n\nuniform vec3 pano1Position;\nuniform samplerCube pano1Map;\nuniform samplerCube pano1Depth;\nuniform float pano1Weight;\n\nuniform vec3 pano2Position;\nuniform samplerCube pano2Map;\nuniform samplerCube pano2Depth;\nuniform float pano2Weight;\n\nvarying vec2 vUv;\nvarying vec3 vWorldPosition0;\nvarying vec3 vWorldPosition1;\nvarying vec3 vWorldPosition2;\n\nvarying vec4 worldPosition;\n\nvoid main() {\n\n vec4 depthFromPano0 = textureCube( pano0Depth, vWorldPosition0.xyz );\n vec4 depthFromPano1 = textureCube( pano1Depth, vWorldPosition1.xyz );\n vec4 depthFromPano2 = textureCube( pano2Depth, vWorldPosition2.xyz );\n\n vec4 colorFromPano0 = textureCube( pano0Map, vWorldPosition0.xyz );\n vec4 colorFromPano1 = textureCube( pano1Map, vWorldPosition1.xyz );\n vec4 colorFromPano2 = textureCube( pano2Map, vWorldPosition2.xyz );\n\n float distanceToPano0 = distance(worldPosition.xyz, pano0Position);\n float distanceToPano1 = distance(worldPosition.xyz, pano1Position);\n float distanceToPano2 = distance(worldPosition.xyz, pano2Position);\n\n float cameraToPano0 = distance(cameraPosition.xyz, pano0Position);\n float cameraToPano1 = distance(cameraPosition.xyz, pano1Position);\n float cameraToPano2 = distance(cameraPosition.xyz, pano2Position);\n\n float contributionFromPano0 = cameraToPano0 == 0.0 ? 1000.0 : pano0Weight / cameraToPano0;\n float contributionFromPano1 = cameraToPano1 == 0.0 ? 1000.0 : pano1Weight / cameraToPano1;\n float contributionFromPano2 = cameraToPano2 == 0.0 ? 1000.0 : pano2Weight / cameraToPano2;\n\n contributionFromPano0 *= 1.0 / distanceToPano0;\n contributionFromPano1 *= 1.0 / distanceToPano1;\n contributionFromPano2 *= 1.0 / distanceToPano2;\n\n if(considerOcclusion == 1) {\n bool occludedFromPano0 = distanceToPano0 / 10.0 > 1.01 - depthFromPano0.x;\n bool occludedFromPano1 = distanceToPano1 / 10.0 > 1.01 - depthFromPano1.x;\n bool occludedFromPano2 = distanceToPano2 / 10.0 > 1.01 - depthFromPano2.x;\n\n if(occludedFromPano0){contributionFromPano0 *= 0.1;}\n if(occludedFromPano1){contributionFromPano1 *= 0.1;}\n if(occludedFromPano2){contributionFromPano2 *= 0.1;}\n //if(occludedFromPano0 && occludedFromPano1 && !occludedFromPano2) { contributionFromPano2 += 0.5; }\n }\n\n float contributionSum = contributionFromPano0 + contributionFromPano1 + contributionFromPano2;\n contributionFromPano0 /= contributionSum;\n contributionFromPano1 /= contributionSum;\n contributionFromPano2 /= contributionSum;\n\n vec4 colorFromPanos = colorFromPano0 * contributionFromPano0;\n colorFromPanos += colorFromPano1 * contributionFromPano1;\n colorFromPanos += colorFromPano2 * contributionFromPano2;\n\n vec4 depthFromPanos = depthFromPano0 * contributionFromPano0;\n depthFromPanos += depthFromPano1 * contributionFromPano1;\n depthFromPanos += depthFromPano2 * contributionFromPano2;\n\n vec4 colorFromTexture = texture2D( map, vUv );\n colorFromPanos = mix(colorFromPanos, colorFromTexture, modelAlpha);\n\n if(highlightPanoSelection == 1) {\n colorFromPanos.r = contributionFromPano0;\n colorFromPanos.g = contributionFromPano1;\n colorFromPanos.b = contributionFromPano2;\n }\n\n gl_FragColor = vec4(mix(colorFromPanos, depthFromPanos, depthmapRatio).rgb, opacity);\n\n}\n'
  6775. };
  6776. /*
  6777. * @Author: Rindy
  6778. * @Date: 2021-05-07 15:52:29
  6779. * @LastEditors: Rindy
  6780. * @LastEditTime: 2021-05-07 15:59:37
  6781. * @Description: 注释
  6782. */
  6783. var modelOutside = {
  6784. uniforms: {
  6785. map: {
  6786. type: 't',
  6787. value: null
  6788. },
  6789. opacity: {
  6790. type: 'f',
  6791. value: 1
  6792. },
  6793. brightness: {
  6794. type: 'f',
  6795. value: 0.23
  6796. },
  6797. mixRatio: {
  6798. type: 'f',
  6799. value: 0.3
  6800. },
  6801. //裁剪
  6802. clipBoxType: {
  6803. type: 'a',
  6804. value: null
  6805. },
  6806. clipBoxPoints: {
  6807. type: 'a',
  6808. value: null
  6809. }
  6810. },
  6811. // vertexShader: 'varying vec2 vUv;\n\nvoid main() {\n\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n}\n',
  6812. vertexShader: "\n varying vec2 vUv;\n #ifdef HasClip \n //\u88C1\u526A\u6A21\u5757\n varying vec3 vPos; \n #endif\n\n void main() {\n vUv = uv;\n #ifdef HasClip\n vPos = position;\n #endif\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",
  6813. fragmentShader: "\n uniform sampler2D map;\n uniform float opacity;\n varying vec2 vUv;\n uniform float brightness;\n uniform float mixRatio;\n\n #ifdef HasClip \n //\u88C1\u526A\u6A21\u5757\n varying vec3 vPos;\n uniform vec3 clipBoxPoints[40]; \n //4\u4E2Avec3\u4E3A\u4E00\u7EC4(\u4E00\u4E2A\u7ACB\u65B9\u4F53)\n uniform int clipBoxType[10];\n //\u5224\u65AD\u88C1\u526A\u7C7B\u578B\u5E76\u8BB0\u5F55\u6709\u6548\u6570\u636E 0\u4E3AclipInside 1\u4E3AclipOutSide -1\u4E3A\u65E0\u6548\u6570\u636E\n #endif\n \n \n //vec4 grey = vec4(0.23, 0.23, 0.23, 1.0); //cadImg greyArea to cover model, base color\n \n vec4 grey = vec4(brightness, brightness, brightness, 1.0); \n \n // \u4ECELinearEncoding\u8F6C\u5230sRGBEncoding\n vec3 linearToSrgb(vec3 col){\n return mix(col*12.92, 1.055 * pow(col, vec3(0.41667)) - 0.055, step(0.0031308, col));\n }\n #ifdef HasClip\n float inBox(vec3 P, vec3 C, vec3 G, vec3 O, vec3 A){\n return step(0.0,(sign(dot(O-A, P-A)) \n +sign(dot(A-O, P-O)) \n +sign(dot(P-O, C-O)) \n +sign(dot(O-C, P-C)) \n +sign(dot(G-O, P-O)) \n +sign(dot(P-G, O-G))\n - 5.0));\n }\n #endif\n \n void main() {\n vec2 uv = vUv; \n vec4 colorFromTexture = texture2D( map, uv ); \n #ifdef Is3dTiles\n // 3dtiles\u8D34\u56FE\u9700\u8981\u7528linearToSrgb\u8F6C\u5230Srgb\u8272\u5F69\u7A7A\u95F4\n colorFromTexture = vec4(linearToSrgb(colorFromTexture.rgb), colorFromTexture.a);\n #endif\n #ifdef HasClip\n float isClip = 0.0; \n //isClip\u7528\u4E8E\u6807\u8BB0\u662F\u5426\u9700\u8981\u88C1\u526A, >0 \u5C06\u4F1A\u88ABdiscard\n #pragma unroll_loop_start\n for(int i = 0; i < 10; i++) {\n if(clipBoxType[i] == -1) {\n } else if (clipBoxType[i] == 0) {\n if (inBox(vPos, clipBoxPoints[UNROLLED_LOOP_INDEX*4], clipBoxPoints[UNROLLED_LOOP_INDEX*4+1], clipBoxPoints[UNROLLED_LOOP_INDEX*4+2], clipBoxPoints[UNROLLED_LOOP_INDEX*4+3]) == 1.0) {\n isClip = 2.0;\n }\n } else if (clipBoxType[i] == 1) {\n if(isClip != 2.0) isClip != -1.0 && inBox(vPos, clipBoxPoints[UNROLLED_LOOP_INDEX*4], clipBoxPoints[UNROLLED_LOOP_INDEX*4+1], clipBoxPoints[UNROLLED_LOOP_INDEX*4+2], clipBoxPoints[UNROLLED_LOOP_INDEX*4+3]) == 0.0 ? isClip = 1.0 : isClip = -1.0;\n }\n }\n #pragma unroll_loop_end\n if(isClip > 0.0) discard;\n #endif\n colorFromTexture = mix(colorFromTexture, grey, mixRatio ); \n gl_FragColor = vec4(colorFromTexture.rgb, opacity);\n }\n "
  6814. };
  6815. /*
  6816. * @Author: Rindy
  6817. * @Date: 2021-05-07 15:59:59
  6818. * @LastEditors: Rindy
  6819. * @LastEditTime: 2021-05-12 15:36:01
  6820. * @Description: 注释
  6821. */
  6822. var ribbon = {
  6823. uniforms: {
  6824. map: {
  6825. type: 't',
  6826. value: null
  6827. },
  6828. opacity: {
  6829. type: 'f',
  6830. value: 1
  6831. },
  6832. color: {
  6833. type: 'c',
  6834. value: new THREE.Color(settings$3.path.color)
  6835. }
  6836. },
  6837. vertexShader: 'varying vec2 vUv;\nvarying vec3 vN;\nvarying vec4 vP;\n\nvoid main() {\n\n vUv = uv;\n vN= normalMatrix * normal;\n vP = modelViewMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix * vP;\n}\n',
  6838. fragmentShader: 'uniform sampler2D map;\nuniform float opacity;\nvarying vec2 vUv;\nuniform vec3 color;\nvarying vec3 vN; // show-1182\nvarying vec4 vP; // show-1182\n\nvoid main() {\n\t// TODO add scroll-in and pulsing behaviors\n\tvec3 vNn = normalize(vN);\n\tvec3 vPn = normalize(vP.xyz);\n\tfloat f = pow(1.0-abs(dot(vNn,vPn)),0.2);\n vec4 colorFromTexture = texture2D( map, vUv );\n colorFromTexture.a *= f;\n gl_FragColor = vec4((color.rgb*colorFromTexture.rgb),\n \t\t\t\t\t\t(opacity*colorFromTexture.a));\n}\n'
  6839. };
  6840. /*
  6841. * @Author: Rindy
  6842. * @Date: 2021-05-07 16:02:38
  6843. * @LastEditors: Rindy
  6844. * @LastEditTime: 2021-05-07 16:03:01
  6845. * @Description: 注释
  6846. */
  6847. var skysphere = {
  6848. uniforms: {
  6849. radius: {
  6850. type: 'f',
  6851. value: 0
  6852. }
  6853. },
  6854. vertexShader: 'varying vec4 worldPosition;\n\nvoid main() {\n\n worldPosition = modelMatrix * vec4(position, 1.0);\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n}\n',
  6855. fragmentShader: 'varying vec4 worldPosition;\nuniform float radius;\n\nvoid main() {\n\n vec4 topColor = vec4(0.094, 0.102, 0.11, 1.0);\n vec4 bottomColor = vec4(0.2, 0.216, 0.235, 1.0);\n float normalizedHeight = (worldPosition.y + radius) / (radius * 2.0);\n float ratio = smoothstep(0.0, 0.5, normalizedHeight);\n gl_FragColor = mix(bottomColor, topColor, ratio);\n\n}\n'
  6856. };
  6857. /*
  6858. * @Author: Rindy
  6859. * @Date: 2021-05-07 16:03:13
  6860. * @LastEditors: Rindy
  6861. * @LastEditTime: 2021-05-07 16:03:51
  6862. * @Description: 注释
  6863. */
  6864. var tagDisc = {
  6865. uniforms: {
  6866. opacity: {
  6867. type: 'f',
  6868. value: 0
  6869. },
  6870. color: {
  6871. type: 'c',
  6872. value: new THREE.Color()
  6873. },
  6874. bg: {
  6875. type: 't',
  6876. value: null
  6877. },
  6878. mask: {
  6879. type: 't',
  6880. value: null
  6881. }
  6882. },
  6883. vertexShader: 'varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}',
  6884. fragmentShader: 'uniform float opacity;\nuniform vec3 color;\nuniform sampler2D bg;\nuniform sampler2D mask;\n\nvarying vec2 vUv;\n\nvoid main() {\n vec4 maskColor = texture2D(mask, vUv);\n vec4 bgColor = texture2D(bg, vUv);\n vec3 mappedColor = mix(bgColor.rgb, color, maskColor.a);\n gl_FragColor = vec4(mappedColor, bgColor.a * opacity);\n}\n'
  6885. };
  6886. /*
  6887. * @Author: Rindy
  6888. * @Date: 2021-05-07 16:03:13
  6889. * @LastEditors: Rindy
  6890. * @LastEditTime: 2021-05-07 16:03:51
  6891. * @Description: 注释
  6892. */
  6893. var tagDiscDefault = {
  6894. uniforms: {
  6895. uTime: {
  6896. value: 0
  6897. },
  6898. opacity: {
  6899. value: 1
  6900. },
  6901. dark: {
  6902. type: 'i',
  6903. value: 0
  6904. },
  6905. openning: {
  6906. type: 'f',
  6907. value: 0
  6908. },
  6909. uColor: {
  6910. value: new THREE.Color().setRGB(0.0, 0.7843137254901961, 0.6862745098039216)
  6911. }
  6912. },
  6913. vertexShader: "\n\n uniform float uTime;\n uniform float openning;\n\n varying vec2 vUv;\n \n\n vec3 scalePos( vec3 pos ) {\n\n float s = 1.0 + 0.3 * abs( sin(uTime) ) ;\n\n pos.x *= s;\n pos.y *= s;\n pos.z *= s;\n\n return pos;\n }\n\n void main() \n {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( scalePos( position ), 1.0);\n }\n\n ",
  6914. fragmentShader: "\n \n uniform float uTime;\n uniform vec3 uColor;\n uniform float opacity;\n uniform int dark;\n \n varying vec2 vUv;\n \n vec4 circle( vec2 position, vec2 center, float radius )\n {\n vec4 backgroundColor = vec4( 0.0, 0.0, 0.0, 0.0 );\n\n vec4 color = mix( backgroundColor, vec4(uColor, 1.0 ), smoothstep( radius + 0.05, radius, length( position - center )) );\n \n return color;\n }\n\n\n vec4 ring( vec2 position, vec2 center, vec2 radius )\n {\n \n float len = length( position - center );\n\n float alpha = smoothstep( radius.x - 0.03, radius.x + 0.01, len) - smoothstep(radius.y - 0.03, radius.y + 0.03, len);\n\n return mix( vec4( 0.0 ), vec4( 1.0 ), alpha);\n }\n\n\n\n void main() {\n\n\n vec2 uv = vUv * 2.0 - 1.0;\n\n //uv *= (0.85 + abs( sin(uTime) * 0.5 ));\n\n \n vec4 mainColor = vec4( 0.0 );\n mainColor += circle( uv, vec2(0.0), 0.4 );\n mainColor += ring( uv, vec2(0.0), vec2(0.3, 0.35));\n\n \n float r = (uv.x * uv.x + uv.y * uv.y) * 4.0;\n \n float intensity = sin( r - uTime * 2.5 );\n float alpha = 1.0 - 0.25* r;\n\n intensity = intensity * step(r, 3.5 ) * step(1.0, r);\t\n intensity = smoothstep( 0.9, 1.0, intensity );\n\n mainColor += vec4( vec3(intensity), intensity * alpha);\n \n \n \n gl_FragColor = vec4(mainColor.rgb, mainColor.a * opacity);\n \n }\n "
  6915. };
  6916. /*
  6917. * @Author: Rindy
  6918. * @Date: 2021-05-07 16:03:13
  6919. * @LastEditors: Rindy
  6920. * @LastEditTime: 2021-05-07 16:03:51
  6921. * @Description: 注释
  6922. */
  6923. var tagDiscCustom = {
  6924. uniforms: {
  6925. opacity: {
  6926. type: 'f',
  6927. value: 1
  6928. },
  6929. dark: {
  6930. //hover时会颜色会变深
  6931. type: 'i',
  6932. value: 0
  6933. },
  6934. map: {
  6935. type: 't',
  6936. value: null
  6937. },
  6938. uTime: {
  6939. value: 0
  6940. },
  6941. openning: {
  6942. type: 'f',
  6943. value: 0
  6944. }
  6945. },
  6946. vertexShader: "\n\n uniform float openning;\n uniform float uTime;\n\n varying vec2 vUv;\n\n vec3 scalePos( vec3 pos ) {\n\n float s = cos(openning * 3.1415926*0.28) * (1.0 + 0.3 * abs( sin(uTime)) * step( openning, 0.5 ) );\n\n pos.x *= s;\n pos.y *= s;\n pos.z *= s;\n\n return pos;\n }\n\n \n \n void main() \n {\n vUv = uv;\n\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4( scalePos(position), 1.0);\n }\n \n ",
  6947. fragmentShader: "\n\n uniform float opacity;\n uniform int dark;\n uniform float uTime;\n uniform sampler2D map;\n uniform float openning;\n \n varying vec2 vUv;\n \n\n vec4 circle( vec2 position, vec2 center, float radius, vec4 color )\n {\n vec4 backgroundColor = vec4( 0.0 );\n \n float alpha = smoothstep( radius + 0.03, radius - 0.03, length( position - center ));\n\n return mix( backgroundColor, color, alpha );\n }\n\n vec4 ring( vec2 position, vec2 center, vec2 radius, vec4 color )\n {\n vec4 backgroundColor = vec4( 0.0, 0.0, 0.0, 0.0);\n \n float len = length( position - center );\n \n float alpha = smoothstep( radius.x - 0.03, radius.x + 0.03, len) - smoothstep(radius.y - 0.03, radius.y + 0.03, len);\n \n return mix( backgroundColor, color, alpha);\n }\n\n void main() {\n\n vec2 uv = vUv;\n\n vec4 color = texture2D(map, uv);\n \n if(dark == 1 && (color.r + color.g + color.b < 240.0*3.0/255.0))\n {\n color.rgb *= 0.9;\n }\n\n\n vec2 coord = uv * 2.0 - 1.0;\n vec4 opennedColor = vec4(0.0);\n\n opennedColor += circle( coord, vec2(0.0), 0.25, vec4(1.0, 1.0, 1.0, 0.5) );\n opennedColor += circle( coord, vec2(0.0), 0.5, vec4(1.0, 1.0, 1.0, 0.3) );\n\n color = mix( color, opennedColor, openning );\n \n gl_FragColor = vec4(color.rgb, color.a * opacity);\n }\n\n "
  6948. };
  6949. /*
  6950. * @Author: Rindy
  6951. * @Date: 2021-05-07 16:03:13
  6952. * @LastEditors: Rindy
  6953. * @LastEditTime: 2021-05-07 16:03:51
  6954. * @Description: 注释 videoPano Tag的shader 视频播放按钮
  6955. */
  6956. var tagVideoMarker = {
  6957. // uniforms: {
  6958. // opacity: {
  6959. // type: 'f',
  6960. // value: 1,
  6961. // },
  6962. // dark: {
  6963. // //hover时会颜色会变深
  6964. // type: 'i',
  6965. // value: 0,
  6966. // },
  6967. // map: {
  6968. // type: 't',
  6969. // value: null,
  6970. // },
  6971. // uTime: {
  6972. // value: 0,
  6973. // },
  6974. // openning: {
  6975. // type: 'f',
  6976. // value: 0,
  6977. // },
  6978. // },
  6979. uniforms: {
  6980. progress: {
  6981. type: 'f',
  6982. value: 0
  6983. },
  6984. bigCircleProgress: {
  6985. type: 'f',
  6986. value: 0
  6987. },
  6988. smallCircleProgress: {
  6989. type: 'f',
  6990. value: 0
  6991. },
  6992. map: {
  6993. type: 't',
  6994. value: null
  6995. },
  6996. map0: {
  6997. type: 't',
  6998. value: null
  6999. },
  7000. map1: {
  7001. type: 't',
  7002. value: null
  7003. },
  7004. map2: {
  7005. type: 't',
  7006. value: null
  7007. },
  7008. opacity: {
  7009. type: 'f',
  7010. value: 0
  7011. }
  7012. },
  7013. vertexShader: "\n\n // uniform float openning;\n // uniform float uTime;\n\n varying vec2 vUv;\n\n void main() \n {\n vUv = uv;\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n }\n \n ",
  7014. fragmentShader: "\n\n // uniform float opacity;\n // uniform int dark;\n // uniform float uTime;\n // uniform sampler2D map;\n // uniform float openning;\n \n // varying vec2 vUv;\n \n\n // vec4 circle( vec2 position, vec2 center, float radius, vec4 color )\n // {\n // vec4 backgroundColor = vec4( 0.0 );\n \n // float alpha = smoothstep( radius + 0.03, radius - 0.03, length( position - center ));\n\n // return mix( backgroundColor, color, alpha );\n // }\n\n // vec4 ring( vec2 position, vec2 center, vec2 radius, vec4 color )\n // {\n // vec4 backgroundColor = vec4( 0.0, 0.0, 0.0, 0.0);\n \n // float len = length( position - center );\n \n // float alpha = smoothstep( radius.x - 0.03, radius.x + 0.03, len) - smoothstep(radius.y - 0.03, radius.y + 0.03, len);\n \n // return mix( backgroundColor, color, alpha);\n // }\n\n // void main() {\n\n // vec2 uv = vUv;\n\n // vec4 color = texture2D(map, uv);\n \n // if(dark == 1 && (color.r + color.g + color.b < 240.0*3.0/255.0))\n // {\n // color.rgb *= 0.9;\n // }\n\n\n // vec2 coord = uv * 2.0 - 1.0;\n // vec4 opennedColor = vec4(0.0);\n\n // opennedColor += circle( coord, vec2(0.0), 0.25, vec4(1.0, 1.0, 1.0, 0.5) );\n // opennedColor += circle( coord, vec2(0.0), 0.5, vec4(1.0, 1.0, 1.0, 0.3) );\n\n // color = mix( color, opennedColor, openning );\n \n // gl_FragColor = vec4(color.rgb, color.a * opacity);\n // //gl_FragColor = vec4( 0.86, 0.078, 0.2353, 1.0);\n // }\n\n //xst add\n //\u4ECEmin1-max1\u7F29\u653E\u5230min2-max2\uFF0Cvalue\u672C\u6765\u662Fmin1-max1\u8303\u56F4\u5185\u7684\uFF0C\u76F8\u5E94\u7684\u8FD4\u56DE\u5BF9\u5E94\u7684\u503C\n float linearClamp(float value, float min1,float max1,float min2,float max2){\n return min2 + (value - min1) * (max2 - min2)/(max1 - min1);\n }\n\n /* vec4 ring( vec2 position, vec2 center, float minRadius, float maxRadius, vec4 color, vec4 backgroundColor)\n {\n float len = length( position - center );\n if(len>minRadius && len < maxRadius){\n return color;\n }\n else{\n return backgroundColor;\n }\n } */\n\n \n\n /* bool sameside(vec2 uv, vec3 A, vec3 B, vec3 C) //permet d'indiquer de quel cot\xE9 d'une ligne on se trouve (0 ou 1)\n {\n vec3 u = vec3(uv.x,uv.y,0.0);\n vec3 valuexy = cross(B-A,C-A);\n vec3 valuexz = cross(B-A,u-A);\n \n if(dot(valuexy,valuexz)>=0.){return true;}\n else{return false;} \n }\n \n bool inTriangle(vec2 uv,vec3 v[3]) // permet d'indiquer si on se trouve bien a l'int\xE9rieur d'un triangle (3 ligne)\n {\n if(sameside(uv,v[0],v[1],v[2]) && sameside(uv,v[1],v[2],v[0]) && sameside(uv,v[2],v[0],v[1])){return true;}\n else{return false;}\n \n } */\n\n \n\n //\u653E\u5927\uFF0C\u4ECEradius\u653E\u5927\u5230maxRadius\n /* vec2 zoomUV2(vec2 vuv,float radius,float maxRadius){\n vec2 dis = vuv - vec2(0.5);\n float len = length(dis);\n\n float step = maxRadius/radius;\n if(len < radius ){\n return vec2(0.5 + dis.x/step,0.5 + dis.y/step);\n }\n else{\n return vuv; \n }\n } */\n\n uniform float bigCircleProgress;\n uniform sampler2D map;\n varying vec2 vUv;\n \n \n vec4 noRepeat(sampler2D sampler, vec2 uv){\t\t\t\t\t \n vec4 color;\n if(uv.x<0.0) \t color = vec4(0.0, 0.0, 0.0, 0.0) ;\n else if(uv.x>1.0) color = vec4(0.0, 0.0, 0.0, 0.0) ;\n else if(uv.y<0.0) color = vec4(0.0, 0.0, 0.0, 0.0) ;\n else if(uv.y>1.0) color = vec4(0.0, 0.0, 0.0, 0.0) ;\t\n else color = texture2D(sampler, uv);\n return color ;\t\t\n }\n //\u7F29\u5C0F\uFF0C\u628AmaxRadius\u7F29\u5C0F\u5230radius\n vec2 zoomInUV(vec2 vuv,float radius,float maxRadius){\n vec2 dis = vuv - vec2(0.5);\n float len = length(dis);\n \n float step = radius/maxRadius;\n if(len < maxRadius ){\n return vec2(0.5 + dis.x/step,0.5 + dis.y/step);\n }\n else{\n return vuv; \n }\n }\n \n float circle(vec2 vuv, float radius){\n vec2 dis = vuv - vec2(0.5);\n float len = length(dis);\n float w = abs(len - radius);\n \n if(w < 0.015 ){//\u753B\u5708\u5708\uFF0C\u6709\u6548\u7684\n return 2.0; \n }else if(w < 0.03){\n return 1.0 - (w-0.015) / (0.03-0.015); //\u8FB9\u7F18\u6A21\u7CCA\u6297\u952F\u9F7F\n }else if(len<radius){\n return -1.0;\n }else if(len>radius){\n return -2.0;\n }\n }\n \n \n void main() {\n\n vec2 uv = vUv;\n\n float sTime = 0.26;\n float mTime = 0.48;\n float eTime = 0.8;\n\n\n float mTime2 = 0.57; \n\n float lineWidth = 0.02;\n float outerRadius = 0.4;\n float extendRadius = 0.5;\n float outerRadius2;\n \n vec2 center = vec2(0.5);\n \n //float innerRadius = 0.3; //\u4E09\u89D2\u5F62\u6240\u5728\u534A\u5F84\n\n\n\n\n //\u8D34\u56FE\u7F29\u5C0F\n \n\n float flag;\n //\u5F00\u59CB\u7684\u65F6\u5019\u662F\u9759\u6B62\u7684\n if(bigCircleProgress<sTime){\n flag = circle( uv, outerRadius); \n }else{\n //\u5708\u5708\u653E\u5927\n if(bigCircleProgress<mTime){\n \n outerRadius2 = outerRadius + smoothstep(0.0, mTime-sTime, bigCircleProgress-sTime ) * (extendRadius - outerRadius - lineWidth) ;\n \n //outerRadius2 = outerRadius + linearClamp(bigCircleProgress-sTime, 0.0, mTime-sTime,0.0, extendRadius - outerRadius - lineWidth);\n //flag = circle( uv, outerRadius + linearClamp(bigCircleProgress-sTime, 0.0, mTime-sTime,0.0, extendRadius - outerRadius - lineWidth));\n flag = circle( uv, outerRadius2); \n }\n //\u5708\u5708\u7F29\u5C0F\n else if(bigCircleProgress<eTime){ \n \n outerRadius2 = extendRadius - lineWidth - smoothstep(0.0, eTime-mTime, bigCircleProgress-mTime ) * (extendRadius - outerRadius - lineWidth) ;\n \n //outerRadius2 = extendRadius - lineWidth - linearClamp(bigCircleProgress-mTime, 0.0, eTime-mTime, 0.0, extendRadius - outerRadius - lineWidth);\n flag = circle( uv, outerRadius2); \n \n if(bigCircleProgress<mTime2){ \n outerRadius = outerRadius + smoothstep(0.0, mTime2-mTime, bigCircleProgress-mTime ) * (extendRadius - outerRadius - lineWidth) ;\n \n }else{\n outerRadius = extendRadius - lineWidth - smoothstep(0.0, eTime-mTime2, bigCircleProgress-mTime2 ) * (extendRadius - outerRadius - lineWidth) ;\n }\n \n } \n else{//\u6062\u590D\u6B63\u5E38\n flag = circle( uv, outerRadius); \n } \n }\n \n \n\n if(flag == 2.0){//\u5728\u5708\u5708\u4E0A\n gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0);\n }else if(flag == -2.0){//\u5927\u4E8E\u5708\u5708\u7684\n gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);\n }else if(flag<=1.0 && flag>=0.0){ //\u5708\u8FB9\u7F18\u6A21\u7CCA\u6297\u952F\u9F7F\n gl_FragColor = vec4(1.0, 1.0, 1.0, flag);\n }else if(flag == -1.0){//\u5708\u5185 \n vec2 zoomuv = zoomInUV(uv, outerRadius,extendRadius);\n gl_FragColor = noRepeat(map, zoomuv); \n } \n }\n\n "
  7015. };
  7016. /*
  7017. * @Author: Rindy
  7018. * @Date: 2021-05-07 16:00:54
  7019. * @LastEditors: Rindy
  7020. * @LastEditTime: 2021-05-12 15:36:15
  7021. * @Description: 注释
  7022. */
  7023. var waypoint = {
  7024. uniforms: {
  7025. map: {
  7026. type: 't',
  7027. value: null
  7028. },
  7029. opacity: {
  7030. type: 'f',
  7031. value: 1
  7032. },
  7033. pulse: {
  7034. type: 'f',
  7035. value: 1
  7036. },
  7037. nearFade: {
  7038. type: 'v2',
  7039. value: new THREE.Vector2(2 * settings$3.insideNear, 2 * settings$3.path.waypointIndoorRadius)
  7040. },
  7041. color: {
  7042. type: 'c',
  7043. value: new THREE.Color('#fff')
  7044. }
  7045. },
  7046. vertexShader: 'varying vec2 vUv;\nvarying vec4 vPointView;\n\nvoid main() {\n\n vUv = uv;\n vPointView = modelViewMatrix * vec4( position, 1.0 );\n gl_Position = projectionMatrix * vPointView;\n\n}\n',
  7047. fragmentShader: 'uniform sampler2D map;\nuniform float opacity;\nuniform float pulse; // another opacity, with a different clock\nuniform vec2 nearFade;\nvarying vec2 vUv;\nvarying vec4 vPointView;\nuniform vec3 color;\n\nvoid main() {\n\t// TODO add scroll-in and pulsing behaviors\n\tfloat depthFade = min(1.0, (abs(vPointView.z)-nearFade.x)/(nearFade.y-nearFade.x));\n vec4 colorFromTexture = texture2D( map, vUv );\t\t// we only use the alpha!\n gl_FragColor = vec4(color.rgb,\n \t\t\t\t\t\t(pulse*opacity*colorFromTexture.a * depthFade));\n}\n'
  7048. };
  7049. //球上的鱼眼(无过渡):
  7050. var skybox = {
  7051. uniforms: {
  7052. opacity: {
  7053. type: 'f',
  7054. value: 1
  7055. },
  7056. pano1Map: {
  7057. type: 't',
  7058. value: null
  7059. },
  7060. pano1Matrix: {
  7061. type: 'm4',
  7062. value: new THREE.Matrix4()
  7063. }
  7064. },
  7065. vertexShader: 'uniform mat4 pano1Matrix;varying vec3 vWorldPosition;void main(){vWorldPosition=(vec4(position,1.0)*pano1Matrix).xyz;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}',
  7066. fragmentShader: 'uniform float opacity;varying vec3 vWorldPosition;\n#define PI 3.141592653 \n\n#if defined(Not_Cube)\nuniform sampler2D pano1Map;vec4 texCubemapWith2D(sampler2D t,vec3 dir){dir=normalize(dir);float tx=atan(dir.x,dir.z)/(PI*2.0)+0.5;float ty=acos(dir.y)/PI;vec4 color=texture2D(t,vec2(tx,ty));return color;}\n#else\nuniform samplerCube pano1Map;\n#endif\nvoid main(){\n#if defined(Not_Cube)\nvec4 colorFromPanos=texCubemapWith2D(pano1Map,vec3(-1.0*vWorldPosition.x,vWorldPosition.yz));\n#else\nvec4 colorFromPanos=textureCube(pano1Map,vec3(-1.0*vWorldPosition.x,vWorldPosition.yz));\n#endif\ngl_FragColor=vec4(colorFromPanos.rgb,opacity);}'
  7067. };
  7068. /*
  7069. * @Author: Rindy
  7070. * @Date: 2021-05-07 15:48:57
  7071. * @LastEditors: zhou enguang
  7072. * @LastEditTime: 2022-01-12 16:49:49
  7073. * @Description: 注释
  7074. */
  7075. var videoLoading = {
  7076. uniforms: {
  7077. uColor: {
  7078. type: 'vec4',
  7079. value: null
  7080. },
  7081. uTime: {
  7082. type: 'f',
  7083. value: 0
  7084. }
  7085. },
  7086. vertexShader: "\n \n varying vec2 vUv;\n \n void main() \n {\n vUv = uv;\n \n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n\n ",
  7087. fragmentShader: "\n \n #define PI2 6.2831852 \n\n uniform vec4 uColor;\n uniform float uTime;\n\n varying vec2 vUv;\n\n float lerp( float a, float b, float alpha ) \n {\n return a + (b -a ) * alpha;\n }\n\n vec4 ring( vec2 uv, vec2 radius )\n {\n float len = length( uv );\n float angle = atan( uv.y, uv.x );\n float opacity = 0.7;\n \n float progress = fract( uTime / 4000.0 );\n\n float step1 = step( 0.0, progress );\n float step2 = step( 0.25, progress );\n float step3 = step( 0.75, progress );\n\n float progressStep1 = smoothstep( 0.0, 0.25, progress );\n float progressStep2 = smoothstep( 0.25, 1.0, progress );\n \n radius *= progressStep1 * step1;\n opacity *= (1.0 - smoothstep( 0.7, 1.0, progress ));\n\n float alpha = smoothstep( radius.x - 0.01, radius.x, len ) - smoothstep( radius.y, radius.y + 0.01, len );\n \n float speed = step2 * ( progressStep2 * 20.0 );\n\n float period = floor(30.0 - 29.0 * progressStep2);\n \n float interval = lerp( 0.0, 0.012, 1.0- progressStep2 );\n \n float dashed = smoothstep( interval * period, interval * period, fract( period * angle / PI2 + speed ) )\n - smoothstep( 1.0 - interval * period, 1.0 - interval * period , fract( period * angle / PI2 + speed ) );\n \n alpha *= dashed;\n \n return mix( vec4(0.0), vec4(1.0, 1.0, 1.0, opacity), alpha );\n }\n\n\n void main()\n {\n\n vec2 uv = vUv * 2.0 - 1.0;\n\n vec4 mainColor = vec4(0);\n\n mainColor += ring(uv, vec2(0.2, 0.22));\t\t\n \n gl_FragColor = mainColor;\n }\n "
  7088. };
  7089. /*
  7090. * @Author: Rindy
  7091. * @Date: 2021-05-07 15:48:57
  7092. * @LastEditors: zhou enguang
  7093. * @LastEditTime: 2022-01-12 16:49:49
  7094. * @Description: 注释
  7095. */
  7096. var videoMakerWidget = {
  7097. uniforms: {
  7098. opacity: {
  7099. type: 'f',
  7100. value: 1
  7101. },
  7102. dark: {
  7103. //hover时会颜色会变深
  7104. type: 'i',
  7105. value: 0
  7106. },
  7107. map: {
  7108. type: 't',
  7109. value: null
  7110. },
  7111. position: {
  7112. value: new THREE.Vector3(0, 0, 0)
  7113. }
  7114. },
  7115. vertexShader: "\n\n varying vec2 vUv;\n\n\n void main() \n {\n vUv = uv;\n\n vec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0);\n\n vec2 scale;\n scale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n scale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n scale *= mvPosition.z * 0.5;\n\n vec2 alignedPosition = position.xy * scale;\n\n mvPosition.xy += alignedPosition;\n\n gl_Position = projectionMatrix * mvPosition;\n\n }\n ",
  7116. fragmentShader: "\n \n uniform float opacity;\n uniform int dark;\n uniform sampler2D map;\n \n \n varying vec2 vUv;\n \n void main()\n {\n\n vec4 color = texture2D(map, vUv); \n\n if( dark == 1 && (color.r + color.g + color.b < 240.0*3.0/255.0))\n {\n color.rgb *= 0.9;\n } \n\n gl_FragColor = vec4(color.rgb, color.a * opacity);\n }\n \n "
  7117. };
  7118. /*
  7119. * @Author: Rindy
  7120. * @Date: 2021-05-07 15:48:57
  7121. * @LastEditors: zhou enguang
  7122. * @LastEditTime: 2022-01-12 16:49:49
  7123. * @Description: 注释 videoPano marker 的shader
  7124. */
  7125. var videoPanoMarker = {
  7126. uniforms: {
  7127. progress: {
  7128. type: 'f',
  7129. value: 0
  7130. },
  7131. bigCircleProgress: {
  7132. type: 'f',
  7133. value: 0
  7134. },
  7135. smallCircleProgress: {
  7136. type: 'f',
  7137. value: 0
  7138. },
  7139. map: {
  7140. type: 't',
  7141. value: null
  7142. },
  7143. /* map0: {
  7144. type: 't',
  7145. value: null,
  7146. },
  7147. map1: {
  7148. type: 't',
  7149. value: null,
  7150. },
  7151. map2: {
  7152. type: 't',
  7153. value: null,
  7154. }, */
  7155. opacity: {
  7156. type: 'f',
  7157. value: 0
  7158. }
  7159. },
  7160. vertexShader: " \n varying vec2 vUv; \n /* vec2 Scale(vec2 vuv, float scale){\n scale = 1.0/scale; \n vuv.x=(uv.x-0.5) * scale + 0.5; \n vuv.y=(uv.y-0.5) * scale + 0.5 ; \n return vuv ; \t\t\t\t\t \t\t\n } */\t\n\n void main(){ \n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n \n }\n\n ",
  7161. fragmentShader: "\n \n uniform sampler2D map;\n uniform float opacity; \n uniform float bigCircleProgress;\n uniform float smallCircleProgress;\n vec4 noRepeat(sampler2D sampler, vec2 uv){\t\t\t\t\t \n vec4 color;\n if(uv.x<0.0) \t color = vec4(0.0, 0.0, 0.0, 0.0) ;\n else if(uv.x>1.0) color = vec4(0.0, 0.0, 0.0, 0.0) ;\n else if(uv.y<0.0) color = vec4(0.0, 0.0, 0.0, 0.0) ;\n else if(uv.y>1.0) color = vec4(0.0, 0.0, 0.0, 0.0) ;\t\n else color = texture2D(sampler, uv);\n return color ;\t\t\n }\n vec4 mixColor(vec4 downColor,vec4 upColor){\n return vec4(upColor.rgb * upColor.a + (1.0 - upColor.a) * downColor.rgb, upColor.a+downColor.a);//\u4E0B\u5C42\u7684\u5206\u91CF\u901A\u8FC7\u4E0A\u5C42\u7684a\u6765\u51B3\u5B9A\uFF0C\u6682\u65F6\u8FD9\u4E48\u8BBE\u7F6E\n /* vec4 sum = downColor + upColor; \n if(sum.a == 0.0){\n \treturn sum;\n }\n float upPct = upColor.a / sum.a;\n float downPct = downColor.a / sum.a; \n return vec4(upColor.rgb * upPct + downColor.rgb * downPct , sum.a ); */\n }\n\n float drawMinCircle(vec2 vuv, float minR){\n vec2 dis = vuv - vec2(0.5);\n float len = length(dis);\n float w = abs(len - minR);\n \n if(w < 0.01 ){//\u753B\u5708\u5708\uFF0C\u6709\u6548\u7684\n return 1.0; \n }else if(w < 0.03){\n return 1.0 - (w-0.01) / (0.03-0.01); //\u8FB9\u7F18\u6A21\u7CCA\u6297\u952F\u9F7F\n }else if(len < minR){\n return 2.0; //\u5708\u5708\u5185\u7684\u60C5\u51B5\n }else{\n return 0.0; //\u900F\u660E \uFF0C\u4E0D\u8003\u8651\n }\n }\n \n float drawCircle(vec2 vuv, float maxR,float minR){\n vec2 dis = vuv - vec2(0.5);\n float len = length(dis);\n if(abs(len - maxR) < 0.04 ){//\u753B\u5708\u5708\uFF0C\u6709\u6548\u7684\n return len; \n }\n else if(len < maxR && len > minR){\n return 1.0; //minR\u5230maxR\u4E4B\u95F4\u7684\u533A\u57DF\n }\n else{\n return 2.0; //\u900F\u660E \uFF0C\u4E0D\u8003\u8651\n }\n }\n \n vec2 Scale(vec2 vuv, float scale){\n scale = 1.0/scale; \n vec2 uv;\n uv.x=(vuv.x-0.5) * scale + 0.5; \n uv.y=(vuv.y-0.5) * scale + 0.5 ; \n return uv ; \t\t\t\t\t \t\t\n }\t\n \n varying vec2 vUv; varying vec2 vUv1; varying vec2 vUv2; \n void main(){ \n //xst\u6DFB\u52A0\n \n float vtime2 = 0.08; //\u6536\u7F29\u7ED3\u675F\u65F6\u95F4\n float vtime22 = 0.24; //\u5F00\u59CB\u6269\u6563\u65F6\u95F4\n float vtime32 = 0.51; //\u7ED3\u675F\u6269\u6563\u65F6\u95F4\n float vtime3 = 0.56; //\u5F00\u59CB\u6E10\u53D8\u51FA\u5916\u5708\u7684\u65F6\u95F4\n float vtime4 = 1.0; //\u7ED3\u675F\u65F6\u95F4\n \n float minRadius = 0.32 ; //\u5185\u5708\u5916\u56F4\u7684\u534A\u5F84\n float progress1 = bigCircleProgress - vtime22; //\u5916\u5708\u8FDB\u5EA6\uFF0CbigCircleProgress\uFF1A0-1\n float progress2 = smallCircleProgress - vtime22; //\u5185\u5708\u8FDB\u5EA6\uFF0CsmallCircleProgress\uFF1A-0.2-1.5\n \n vec2 dis = vUv - vec2(0.5);\n float len = length(dis);\n \n if(bigCircleProgress>vtime3 || len < minRadius){//\u9759\u6B62 \n gl_FragColor = noRepeat(map, vUv); \n if(bigCircleProgress > vtime3 && bigCircleProgress < vtime4 && len > minRadius){ //\u7ED3\u5C3E\u9010\u6E10\u663E\u793A\u5916\u5708\n gl_FragColor.a *= (bigCircleProgress - vtime3) / (vtime4 - vtime3);\n }\n }else if(bigCircleProgress<vtime2 ){ //\u5F00\u59CB\u7F29\u5C0F\u5916\u5708 \n float progress = bigCircleProgress / vtime2 ; \n float minScale = 0.7; float maxScale = 1.0;\n vec2 uv = Scale(vUv, maxScale*(1.0-progress)+minScale*progress);\n \n vec4 color = noRepeat(map, uv); \n /* if( color.a != 0.0){//\u53D8\u6DE1\n color.a = color.a * (1.0 - progress * 1.0/vtime2);\n } */\n float w = abs(len - minRadius); //\u4EA4\u754C\u5904\u6297\u952F\u9F7F\u8FC7\u6E21\n if(w < 0.04){\n color.a *= w / 0.04;\n } \n gl_FragColor = color; \n }else if(bigCircleProgress>vtime22 && bigCircleProgress < vtime32){//\u6269\u5927\u6CE2\u7EB9\n \n float maxRadius = minRadius + 0.58*progress1; //\u5927\u4E00\u4E9B\uFF0C\u5148\u6269\u5927\uFF0Cprogress1\u7684\u8303\u56F4\uFF1A0-0.5\n float midRadius = minRadius + 0.58*progress2; //\u5C0F\u4E00\u4E9B\uFF0C\u540E\u6269\u5927\uFF0Cprogress2\u7684\u8303\u56F4\uFF1A-0.2-1.5\uFF0C\u6BD4progress1\u591A\u4E86\u70B9\uFF0C\u8FD9\u4E00\u70B9\u8981\u5728\u540E\u9762\u5904\u7406\u6389\n \n float value = drawMinCircle(vUv, minRadius);\n if(value == 0.0){ //\u5708\u5708\u5916\n value = drawCircle(vUv, midRadius,minRadius); //1.0\u8868\u793AmidRadius\u5230minRadius\u4E4B\u95F4\u7684\u533A\u57DF\uFF0C2.0\u8868\u793A\u5176\u4ED6\u533A\u57DF\uFF0C\u5176\u4ED6\u503C\u8868\u793AmidRadius\u4E0A\u7684\n if(value == 1.0){ //\u5185\u5708\u548C\u6700\u91CC\u9762\u7684\u5708\u5708\u4E2D\u95F4\uFF0C\u900F\u660E\n //gl_FragColor = vec4( 1.0, 1.0, 1.0, 0.0); \n }\n else if(value != 2.0){ //\u5185\u5708\u9644\u8FD1\uFF0C\u9700\u8981\u6E10\u53D8\n gl_FragColor = vec4( 1.0, 1.0, 1.0, ((value - midRadius) * 20.0+0.2) * (bigCircleProgress - vtime32) / (vtime22 - vtime32)); \n \n }\n else { //\u5185\u5708\u7684\u5916\u90E8\n value = drawCircle(vUv, maxRadius,midRadius); \n if(value == 1.0){ //\u4E2D\u95F4\u900F\u660E\n //gl_FragColor = vec4( 1.0, 1.0, 1.0, 0.0); \n }\n else if(value != 2.0){ //\u5916\u5708\u9644\u8FD1\uFF0C\u9700\u8981\u6E10\u53D8\n gl_FragColor = vec4( 1.0, 1.0, 1.0, ((value - maxRadius) * 20.0+0.2) * (bigCircleProgress - vtime32) / (vtime22 - vtime32)); \n }\n else{ \n gl_FragColor = vec4( 1.0, 1.0, 1.0, 0.0); //\u900F\u660E\n }\n }\n \n }\n /* else if(value == 1.0){\n //gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0); //\u767D\u8272\n }\n else if(value == 2.0){\n gl_FragColor = vec4( 1.0, 1.0, 1.0, 0.0); //\u5708\u5708\u5185\u900F\u660E\n }\n else{//\u6E10\u53D8\u6A21\u7CCA\uFF0C\u6297\u952F\u9F7F\n gl_FragColor = vec4( 1.0, 1.0, 1.0, value); \n } */\n\n /* //\u5904\u7406\u591A\u4E8Eprogress1\u7684\u90E8\u5206\n if(progress2 > vtime2){\n vec4 color = noRepeat(map, vUv);\n gl_FragColor = color;\n gl_FragColor.a = gl_FragColor.a * (progress2-vtime2)*2.0;\n } */\n }\n gl_FragColor.a *= opacity;\n }\n \n "
  7162. };
  7163. /*
  7164. * @Author: xst
  7165. * @Date: 2021-05-07 15:48:57
  7166. * @LastEditors: xst
  7167. * @LastEditTime: 2022-01-12 16:49:49
  7168. * @Description: 注释
  7169. */
  7170. var videoStemLine = {
  7171. uniforms: {
  7172. progress: {
  7173. type: 'f',
  7174. value: 0
  7175. },
  7176. bigCircleProgress: {
  7177. type: 'f',
  7178. value: 0
  7179. },
  7180. smallCircleProgress: {
  7181. type: 'f',
  7182. value: 0
  7183. },
  7184. map: {
  7185. type: 't',
  7186. value: null
  7187. },
  7188. map0: {
  7189. type: 't',
  7190. value: null
  7191. },
  7192. map1: {
  7193. type: 't',
  7194. value: null
  7195. },
  7196. map2: {
  7197. type: 't',
  7198. value: null
  7199. },
  7200. opacity: {
  7201. type: 'f',
  7202. value: 0
  7203. }
  7204. },
  7205. vertexShader: "\n\n varying vec2 vUv;\n void main() \n {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n\n ",
  7206. fragmentShader: "\n \n uniform float bigCircleProgress;\n varying vec2 vUv;\n\n //\u4ECEmin1-max1\u7F29\u653E\u5230min2-max2\uFF0Cvalue\u672C\u6765\u662Fmin1-max1\u8303\u56F4\u5185\u7684\uFF0C\u76F8\u5E94\u7684\u8FD4\u56DE\u5BF9\u5E94\u7684\u503C\n float linearClamp(float value, float min1,float max1,float min2,float max2){\n return min2 + (value - min1) * (max2 - min2)/(max1 - min1);\n }\n\n void main()\n {\n // if(vUv.y > 0.3){\n // gl_FragColor = vec4( 0.86, 0.078, 0.2353, 1.0);\n // } \n // else{\n // gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0);\n // }\n //gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0);\n //gl_FragColor = vec4( vPoint.x, vPoint.y, vPoint.z, 1.0);\n \n float vtime = 0.2; //\u6301\u7EED\u65F6\u95F4 \u4F46\u4E0D\u4E00\u5B9A\u662F\u79D2\n float step = 1.0/vtime;\n float len = 0.5;\n\n if(bigCircleProgress<vtime){\n if(vUv.y < bigCircleProgress*step ){\n float v = linearClamp(vUv.y, bigCircleProgress*step - len,bigCircleProgress*step,0.0,1.0);\n gl_FragColor = vec4( 1.0, 1.0, 1.0, v);\n //if(bigCircleProgress*step > len && vUv.y < bigCircleProgress*step - len){\n if(vUv.y < bigCircleProgress*step - len){\n gl_FragColor.a = 0.0;\n }\n }\n } \n else{\n gl_FragColor.a = 0.0;\n }\n }\n "
  7207. };
  7208. /*
  7209. * @Author: Rindy
  7210. * @Date: 2021-05-07 15:48:57
  7211. * @LastEditors: Rindy
  7212. * @LastEditTime: 2021-05-07 15:49:49
  7213. * @Description: 注释
  7214. */
  7215. var linkSpot = {
  7216. //balloon
  7217. uniforms: {
  7218. /* isActive: {
  7219. type: 'i',
  7220. value: 0,
  7221. }, */
  7222. activeProgress: {
  7223. type: 'f',
  7224. value: 0
  7225. },
  7226. mapIn: {
  7227. type: 't',
  7228. value: null
  7229. },
  7230. mapOut: {
  7231. type: 't',
  7232. value: null
  7233. },
  7234. mapOut2: {
  7235. type: 't',
  7236. value: null
  7237. },
  7238. opacity: {
  7239. type: 'f',
  7240. value: 0
  7241. },
  7242. changeMap: {
  7243. type: 'i',
  7244. value: 0
  7245. }
  7246. },
  7247. vertexShader: " \n varying vec2 vUv; \n void main() \n { \n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n\t\t",
  7248. fragmentShader: "\n varying vec2 vUv; \n uniform sampler2D mapOut; \n uniform sampler2D mapOut2;\n uniform sampler2D mapIn; \n uniform float opacity;\n //uniform int isActive; \n \n uniform float activeProgress;\n \n uniform int changeMap; //\u662F\u5426\u6709mapIn\u8D34\u56FE\uFF0C\u6709\u7684\u8BDD\u5C31\u662F\u4E2D\u95F4\u8981\u6362\u6210mapIn\n \n const float x1=0.2333, x2=0.76669, y1=0.388, y2=0.9333; \n const vec4 sumColor = vec4(1.24,1.24,1.24,2.0);//\u7528\u4E8E\u4E2D\u5FC3\u90E8\u5206\u53CD\u8F6C\u9ED1\u767D\u7684\u989C\u8272\n \n \n \n vec4 getColor_default(vec4 mapColor, vec4 mapColor2, int where,vec2 vUvInside ,vec4 white){\n vec4 color;\n if(where == 1){\n color = vec4(1.0,1.0,1.0,mapColor.a);\n }else{\n\n if(changeMap == 1){ \n if(where == 2){\n vec4 color0 = texture2D(mapIn,vUvInside);\n if(mapColor2.r==1.0){color = color0;}\n else color = mix(white, color0, mapColor2.r);//\u5E73\u6ED11\u7684\u5185\u8FB9\u7F18 \n } \n else color = mapColor;\n }else{ \n if(where == 2){ \n vec4 color0 = sumColor-mapColor; \n if(mapColor2.r==1.0){color = color0;}\n else{\n color = mix(white, color0, mapColor2.r);//\u5E73\u6ED11\u7684\u5185\u8FB9\u7F18 \n float c = (color.x + color.y + color.z) / 3.0;//\u53BB\u7EA2\u8FB9\uFF0C\u6539\u4E3A\u7070\u8272 \n color = vec4(c,c,c,1.0); \n }\n } \n else color = mapColor; \n }\n } \n return color;\n }\n \n vec4 getColor_hovered(vec4 mapColor, vec4 mapColor2, int where,vec2 vUvInside ,vec4 green){\n vec4 color;\n if(changeMap == 1){\n if(where == 2){\n vec4 color0 = texture2D(mapIn,vUvInside);\n if(mapColor2.r==1.0){color = color0;}\n else color = mix(green, color0, mapColor2.r);//\u5E73\u6ED1\u5185\u8FB9\u7F18 \n }\n else if(mapColor.a>0.0 && mapColor.a<1.0) color = green; //\u56E0\u4E3A\u5F00\u542F\u4E86\u6297\u952F\u9F7F\uFF0C\u5BFC\u81F4\u5916\u8FB9\u7F18\u6709\u70B9\u95EE\u9898\uFF0C\u6240\u4EE5\u81EA\u5DF1\u7ED8\u5236\n else color = mapColor;\n }else{ \n color = mapColor; \n }\n return color;\n }\n \n \n \n \n void main(){ \n \n vec4 mapColor = texture2D(mapOut,vUv);\n vec4 mapColor2 = texture2D(mapOut2,vUv);//\u7528\u4E8E\u5206\u533A\u7684\u8D34\u56FE \n vec2 vUvInside = vec2((vUv.x-x1)/(x2-x1), (vUv.y-y1)/(y2-y1)); \n \n \n //\u7EFF\u8272\u7684 r=0 \u767D\u8272r=1\n //where: 0\u662F\u900F\u660E\u5916\u5C42\uFF0C 1\u662F\u7EFF\u73AF\uFF0C 2\u662F\u4E2D\u95F4\u5706 \n //int where = mapColor2.a <= 0.0 ? 0 : (mapColor2.r <= 0.0 || mapColor2.a<1.0 ) ? 1 : 2; // \u8FD9\u4E2A\u5E9F\u5F03\u662F\u56E0\u4E3A\u7F29\u5C0F\u65F61\u5916\u8FB9\u7F18\u7684\u534A\u900F\u660E\u4F1A\u4FB5\u72AF2\u533A\u57DF\uFF0C\u672C\u8BE5\u5C5E\u4E8E2\u7684\u53D8\u4E3A1\uFF0C\u5185\u8FB9\u7F18\u7ED8\u5236\u6210\u4E0D\u900F\u660E\u767D\u8272\u952F\u9F7F\u3002\u6545\u800C\u6539\u4E3A\u5148\u9009\u51FA2\n int where = mapColor2.a <= 0.0 ? 0 : (mapColor2.r >0.0 && mapColor2.a>0.5 ) ? 2 : 1; //2\u4E2D\u5305\u542B1-2\u7684\u8FC7\u6E21\uFF0C\u56E0\u4E3A\u8981\u57282\u4E2D\u5E73\u6ED1. \u4E4B\u6240\u4EE52\u9700\u8981mapColor2.a>0.5\u662F\u56E0\u4E3A\u5728\u5DE6\u8FB9\u7F18\u591A\u4E86\u4E00\u6761\u5947\u602Ar>0\u7684\u7AD6\u7EBF\uFF0C\u4E3A\u4E86\u53BB\u6389\u5B83\u63D0\u9AD8\u4E86a\u9608\u503C\u3002\n \n \n \n vec4 green = vec4(0.0, 0.7843137, 0.6823529, mapColor.a);\n vec4 white = vec4(1.0, 1.0, 1.0, mapColor.a);\n \n \n if(activeProgress == 0.0){ //\u666E\u901A\n gl_FragColor = getColor_default( mapColor, mapColor2, where, vUvInside , white);\n \n }else if(activeProgress == 1.0){ \n gl_FragColor = getColor_hovered( mapColor, mapColor2, where, vUvInside , green); \n }else{\n vec4 color0 = getColor_default(mapColor, mapColor2, where, vUvInside , white);\n vec4 color1 = getColor_hovered(mapColor, mapColor2, where, vUvInside , green);\n \n gl_FragColor = mix(color0,color1,activeProgress);\n } \n \n gl_FragColor.a *= opacity; \n \n \n }\n "
  7249. /* fragmentShader: `
  7250. varying vec2 vUv;
  7251. uniform sampler2D mapOut;
  7252. uniform sampler2D mapOut2;
  7253. uniform sampler2D mapIn;
  7254. uniform float opacity;
  7255. uniform int isActive;
  7256. uniform int changeMap; //是否有mapIn贴图,有的话就是中间要换成mapIn
  7257. void main(){
  7258. vec4 mapColor = texture2D(mapOut,vUv);
  7259. vec4 mapColor2 = texture2D(mapOut2,vUv);//用于分区的贴图
  7260. vec4 sumColor = vec4(1.24,1.24,1.24,2.0);//用于中心部分反转黑白的颜色
  7261. float x1=0.2333, x2=0.76669, y1=0.388, y2=0.9333;
  7262. vec2 vUvInside = vec2((vUv.x-x1)/(x2-x1), (vUv.y-y1)/(y2-y1));
  7263. //绿色的 r=0 白色r=1
  7264. //where: 0是外层, 1是环, 2是中间层
  7265. int where = mapColor2.a <= 0.0 ? 0 : (mapColor2.r <= 0.0 || mapColor2.a<1.0) ? 1 : 2; //2中包含1-2的过渡,待平滑
  7266. vec4 green = vec4(0.0, 0.7843137, 0.6823529, mapColor.a);
  7267. vec4 white = vec4(1.0, 1.0, 1.0, mapColor.a);
  7268. if(isActive!=1){ //普通
  7269. if(where == 1){
  7270. gl_FragColor = vec4(1.0,1.0,1.0,mapColor.a);
  7271. }else{
  7272. if(changeMap == 1){
  7273. if(where == 2){
  7274. vec4 color = texture2D(mapIn,vUvInside);
  7275. if(mapColor2.r==1.0){gl_FragColor = color;}
  7276. else gl_FragColor = mix(white, color, mapColor2.r);//平滑内边缘
  7277. }
  7278. else gl_FragColor = mapColor;
  7279. }else{
  7280. if(where == 2){
  7281. vec4 color = sumColor-mapColor;
  7282. if(mapColor2.r==1.0){gl_FragColor = color;}
  7283. else gl_FragColor = mix(white, color, mapColor2.r);//平滑内边缘
  7284. }
  7285. else gl_FragColor = mapColor;
  7286. }
  7287. }
  7288. }else{//hover时
  7289. if(changeMap == 1){
  7290. if(where == 2){
  7291. vec4 color = texture2D(mapIn,vUvInside);
  7292. if(mapColor2.r==1.0){gl_FragColor = color;}
  7293. else gl_FragColor = mix(green, color, mapColor2.r);//平滑内边缘
  7294. }
  7295. else if(mapColor.a>0.0 && mapColor.a<1.0) gl_FragColor = green; //因为开启了抗锯齿,导致外边缘有点问题,所以自己绘制
  7296. else gl_FragColor = mapColor;
  7297. }else{
  7298. if(mapColor.a>0.0 && mapColor.a<1.0) gl_FragColor = green;
  7299. else gl_FragColor = mapColor;
  7300. }
  7301. }
  7302. gl_FragColor.a *= opacity;
  7303. }
  7304. `, */
  7305. };
  7306. /*
  7307. * @Author: Rindy
  7308. * @Date: 2021-05-07 15:48:57
  7309. * @LastEditors: Rindy
  7310. * @LastEditTime: 2021-05-07 15:49:49
  7311. * @Description: 注释
  7312. */
  7313. var linkSpotInside = {
  7314. //circle
  7315. uniforms: {
  7316. circleRadius: {
  7317. //UV内半径的平方
  7318. type: 'f',
  7319. value: 0.815
  7320. },
  7321. progress: {
  7322. type: 'f',
  7323. value: 0
  7324. },
  7325. mapOut: {
  7326. type: 't',
  7327. value: null
  7328. },
  7329. mapIn: {
  7330. type: 't',
  7331. value: null
  7332. },
  7333. changeMap: {
  7334. type: 'i',
  7335. value: 0
  7336. }
  7337. },
  7338. vertexShader:
  7339. /* prefixVertex + */
  7340. " \n varying vec2 vUv; \n \n void main() \n { \n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n\t\t",
  7341. fragmentShader:
  7342. /* prefixFragment + */
  7343. "\n varying vec2 vUv; \n uniform float circleRadius;\n uniform float progress;\n uniform sampler2D mapOut; \n uniform sampler2D mapIn; \n uniform int changeMap;\n void main(){ \n vec4 mapColor = texture2D(mapOut,vUv);\n vec2 vUv2 = vec2(vUv.x*2.0-1.0,vUv.y*2.0-1.0);\n float d = vUv2.x*vUv2.x+vUv2.y*vUv2.y; \n if(progress > 0.0){ \n vec4 ringColorNew = vec4(0.0, 0.7943137, 0.6823529, 0.68);\n \n if(d>circleRadius && d<=1.0){\n gl_FragColor = mix(mapColor, ringColorNew, progress);\n }else{\n if(changeMap == 1 && d<=circleRadius){ \n vec4 colorFromTexture2 = texture2D(mapIn,vUv); \n gl_FragColor = mix(mapColor, colorFromTexture2, progress);\n }\n else{\n if(d<=circleRadius)gl_FragColor = mapColor;\n //else gl_FragColor = vec4(mapColor.xyz, min(1.0-progress,mapColor.a)); //\u5982\u679C\u4E0D\u628A\u81EA\u5B9A\u4E49\u56FE\u663E\u793A\u6210\u5706\u7684\u8BDD\u7528\u8FD9\u53E5\n else gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n }\n }\n }else{\n if(d>1.0)gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n else gl_FragColor = mapColor;\n } \n \n \n }\n "
  7344. };
  7345. var sphereRenderToCube = {
  7346. uniforms: {
  7347. tDiffuse: {
  7348. type: 't',
  7349. value: null
  7350. }
  7351. /* ,
  7352. panoMatrix:{
  7353. type:'m4',
  7354. value:new THREE.Matrix4
  7355. } */
  7356. },
  7357. vertexShader:
  7358. /* prefixVertex + */
  7359. " \n //uniform mat4 panoMatrix; \n varying vec4 vWorldPosition;\n void main() \n { \n \n vWorldPosition = modelMatrix * vec4(position, 1.0);\n //vWorldPosition = (vec4(vWorldPosition, 1.0) * panoMatrix).xyz;\n vWorldPosition.x *= -1.0;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n\t\t",
  7360. fragmentShader:
  7361. /* prefixFragment + */
  7362. "\n varying vec4 vWorldPosition;\n uniform sampler2D tDiffuse; \n \n #define PI 3.141592653 \n \n vec2 getSamplerCoord( vec3 direction ) \n {\n direction = normalize(direction);\n float tx=atan(direction.x,direction.z)/(PI*2.0)+0.5;\n float ty=acos(direction.y)/PI;\n\n return vec2(tx,ty);\n }\n \n void main() \n {\n vec2 samplerCoord = getSamplerCoord(vWorldPosition.xyz);\n gl_FragColor = texture2D(tDiffuse, samplerCoord);\n } \n \n "
  7363. };
  7364. /*
  7365. * @Author: Rindy
  7366. * @Date: 2021-05-07 15:44:55
  7367. * @LastEditors: Rindy
  7368. * @LastEditTime: 2021-05-08 16:01:48
  7369. * @Description: 注释
  7370. */
  7371. function mergePrefixVertex(vertex) {
  7372. return 'precision highp float;\nprecision highp int;\n\nuniform mat4 modelMatrix;\nuniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat4 viewMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nattribute vec3 position;\nattribute vec3 normal;\nattribute vec2 uv;\n' + vertex;
  7373. }
  7374. function mergePrefixFragment(fragment) {
  7375. return 'precision highp float;\nprecision highp int;\n\nuniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n' + fragment;
  7376. }
  7377. function margePrefix(shader) {
  7378. if (shader.vertexShader) {
  7379. shader.vertexShader = mergePrefixVertex(shader.vertexShader);
  7380. }
  7381. if (shader.fragmentShader) {
  7382. shader.fragmentShader = mergePrefixFragment(shader.fragmentShader);
  7383. shader == model$1 && (shader.fragmentBufferShader = mergePrefixFragment(shader.fragmentBufferShader));
  7384. }
  7385. }
  7386. margePrefix(cube);
  7387. margePrefix(customDepth);
  7388. margePrefix(model$1);
  7389. margePrefix(modelDebug);
  7390. margePrefix(modelOutside);
  7391. margePrefix(ribbon);
  7392. margePrefix(skysphere);
  7393. margePrefix(tagDisc);
  7394. margePrefix(tagDiscDefault);
  7395. margePrefix(tagDiscCustom);
  7396. margePrefix(tagVideoMarker);
  7397. margePrefix(waypoint);
  7398. margePrefix(skybox);
  7399. margePrefix(videoLoading);
  7400. margePrefix(videoMakerWidget);
  7401. margePrefix(videoPanoMarker);
  7402. margePrefix(videoStemLine);
  7403. margePrefix(linkSpot);
  7404. margePrefix(linkSpotInside);
  7405. margePrefix(sphereRenderToCube);
  7406. var shaders = {
  7407. cube,
  7408. customDepth,
  7409. model: model$1,
  7410. modelDebug,
  7411. modelOutside,
  7412. ribbon,
  7413. skysphere,
  7414. tagDisc,
  7415. tagDiscDefault,
  7416. tagDiscCustom,
  7417. tagVideoMarker,
  7418. waypoint,
  7419. basicTextured,
  7420. copyCubeMap,
  7421. skybox,
  7422. videoLoading,
  7423. videoMakerWidget,
  7424. videoPanoMarker,
  7425. videoStemLine,
  7426. linkSpot,
  7427. linkSpotInside,
  7428. sphereRenderToCube
  7429. }; //
  7430. var bind$1 = function bind(fn, thisArg) {
  7431. return function wrap() {
  7432. var args = new Array(arguments.length);
  7433. for (var i = 0; i < args.length; i++) {
  7434. args[i] = arguments[i];
  7435. }
  7436. return fn.apply(thisArg, args);
  7437. };
  7438. };
  7439. /*global toString:true*/
  7440. // utils is a library of generic helper functions non-specific to axios
  7441. var toString = Object.prototype.toString;
  7442. /**
  7443. * Determine if a value is an Array
  7444. *
  7445. * @param {Object} val The value to test
  7446. * @returns {boolean} True if value is an Array, otherwise false
  7447. */
  7448. function isArray$3(val) {
  7449. return toString.call(val) === '[object Array]';
  7450. }
  7451. /**
  7452. * Determine if a value is undefined
  7453. *
  7454. * @param {Object} val The value to test
  7455. * @returns {boolean} True if the value is undefined, otherwise false
  7456. */
  7457. function isUndefined(val) {
  7458. return typeof val === 'undefined';
  7459. }
  7460. /**
  7461. * Determine if a value is a Buffer
  7462. *
  7463. * @param {Object} val The value to test
  7464. * @returns {boolean} True if value is a Buffer, otherwise false
  7465. */
  7466. function isBuffer$2(val) {
  7467. return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
  7468. }
  7469. /**
  7470. * Determine if a value is an ArrayBuffer
  7471. *
  7472. * @param {Object} val The value to test
  7473. * @returns {boolean} True if value is an ArrayBuffer, otherwise false
  7474. */
  7475. function isArrayBuffer(val) {
  7476. return toString.call(val) === '[object ArrayBuffer]';
  7477. }
  7478. /**
  7479. * Determine if a value is a FormData
  7480. *
  7481. * @param {Object} val The value to test
  7482. * @returns {boolean} True if value is an FormData, otherwise false
  7483. */
  7484. function isFormData(val) {
  7485. return typeof FormData !== 'undefined' && val instanceof FormData;
  7486. }
  7487. /**
  7488. * Determine if a value is a view on an ArrayBuffer
  7489. *
  7490. * @param {Object} val The value to test
  7491. * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
  7492. */
  7493. function isArrayBufferView(val) {
  7494. var result;
  7495. if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
  7496. result = ArrayBuffer.isView(val);
  7497. } else {
  7498. result = val && val.buffer && val.buffer instanceof ArrayBuffer;
  7499. }
  7500. return result;
  7501. }
  7502. /**
  7503. * Determine if a value is a String
  7504. *
  7505. * @param {Object} val The value to test
  7506. * @returns {boolean} True if value is a String, otherwise false
  7507. */
  7508. function isString$2(val) {
  7509. return typeof val === 'string';
  7510. }
  7511. /**
  7512. * Determine if a value is a Number
  7513. *
  7514. * @param {Object} val The value to test
  7515. * @returns {boolean} True if value is a Number, otherwise false
  7516. */
  7517. function isNumber$1(val) {
  7518. return typeof val === 'number';
  7519. }
  7520. /**
  7521. * Determine if a value is an Object
  7522. *
  7523. * @param {Object} val The value to test
  7524. * @returns {boolean} True if value is an Object, otherwise false
  7525. */
  7526. function isObject$3(val) {
  7527. return val !== null && typeof val === 'object';
  7528. }
  7529. /**
  7530. * Determine if a value is a plain Object
  7531. *
  7532. * @param {Object} val The value to test
  7533. * @return {boolean} True if value is a plain Object, otherwise false
  7534. */
  7535. function isPlainObject(val) {
  7536. if (toString.call(val) !== '[object Object]') {
  7537. return false;
  7538. }
  7539. var prototype = Object.getPrototypeOf(val);
  7540. return prototype === null || prototype === Object.prototype;
  7541. }
  7542. /**
  7543. * Determine if a value is a Date
  7544. *
  7545. * @param {Object} val The value to test
  7546. * @returns {boolean} True if value is a Date, otherwise false
  7547. */
  7548. function isDate$1(val) {
  7549. return toString.call(val) === '[object Date]';
  7550. }
  7551. /**
  7552. * Determine if a value is a File
  7553. *
  7554. * @param {Object} val The value to test
  7555. * @returns {boolean} True if value is a File, otherwise false
  7556. */
  7557. function isFile(val) {
  7558. return toString.call(val) === '[object File]';
  7559. }
  7560. /**
  7561. * Determine if a value is a Blob
  7562. *
  7563. * @param {Object} val The value to test
  7564. * @returns {boolean} True if value is a Blob, otherwise false
  7565. */
  7566. function isBlob$1(val) {
  7567. return toString.call(val) === '[object Blob]';
  7568. }
  7569. /**
  7570. * Determine if a value is a Function
  7571. *
  7572. * @param {Object} val The value to test
  7573. * @returns {boolean} True if value is a Function, otherwise false
  7574. */
  7575. function isFunction$1(val) {
  7576. return toString.call(val) === '[object Function]';
  7577. }
  7578. /**
  7579. * Determine if a value is a Stream
  7580. *
  7581. * @param {Object} val The value to test
  7582. * @returns {boolean} True if value is a Stream, otherwise false
  7583. */
  7584. function isStream(val) {
  7585. return isObject$3(val) && isFunction$1(val.pipe);
  7586. }
  7587. /**
  7588. * Determine if a value is a URLSearchParams object
  7589. *
  7590. * @param {Object} val The value to test
  7591. * @returns {boolean} True if value is a URLSearchParams object, otherwise false
  7592. */
  7593. function isURLSearchParams(val) {
  7594. return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
  7595. }
  7596. /**
  7597. * Trim excess whitespace off the beginning and end of a string
  7598. *
  7599. * @param {String} str The String to trim
  7600. * @returns {String} The String freed of excess whitespace
  7601. */
  7602. function trim(str) {
  7603. return str.replace(/^\s*/, '').replace(/\s*$/, '');
  7604. }
  7605. /**
  7606. * Determine if we're running in a standard browser environment
  7607. *
  7608. * This allows axios to run in a web worker, and react-native.
  7609. * Both environments support XMLHttpRequest, but not fully standard globals.
  7610. *
  7611. * web workers:
  7612. * typeof window -> undefined
  7613. * typeof document -> undefined
  7614. *
  7615. * react-native:
  7616. * navigator.product -> 'ReactNative'
  7617. * nativescript
  7618. * navigator.product -> 'NativeScript' or 'NS'
  7619. */
  7620. function isStandardBrowserEnv() {
  7621. if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || navigator.product === 'NativeScript' || navigator.product === 'NS')) {
  7622. return false;
  7623. }
  7624. return typeof window !== 'undefined' && typeof document !== 'undefined';
  7625. }
  7626. /**
  7627. * Iterate over an Array or an Object invoking a function for each item.
  7628. *
  7629. * If `obj` is an Array callback will be called passing
  7630. * the value, index, and complete array for each item.
  7631. *
  7632. * If 'obj' is an Object callback will be called passing
  7633. * the value, key, and complete object for each property.
  7634. *
  7635. * @param {Object|Array} obj The object to iterate
  7636. * @param {Function} fn The callback to invoke for each item
  7637. */
  7638. function forEach(obj, fn) {
  7639. // Don't bother if no value provided
  7640. if (obj === null || typeof obj === 'undefined') {
  7641. return;
  7642. } // Force an array if not already something iterable
  7643. if (typeof obj !== 'object') {
  7644. /*eslint no-param-reassign:0*/
  7645. obj = [obj];
  7646. }
  7647. if (isArray$3(obj)) {
  7648. // Iterate over array values
  7649. for (var i = 0, l = obj.length; i < l; i++) {
  7650. fn.call(null, obj[i], i, obj);
  7651. }
  7652. } else {
  7653. // Iterate over object keys
  7654. for (var key in obj) {
  7655. if (Object.prototype.hasOwnProperty.call(obj, key)) {
  7656. fn.call(null, obj[key], key, obj);
  7657. }
  7658. }
  7659. }
  7660. }
  7661. /**
  7662. * Accepts varargs expecting each argument to be an object, then
  7663. * immutably merges the properties of each object and returns result.
  7664. *
  7665. * When multiple objects contain the same key the later object in
  7666. * the arguments list will take precedence.
  7667. *
  7668. * Example:
  7669. *
  7670. * ```js
  7671. * var result = merge({foo: 123}, {foo: 456});
  7672. * console.log(result.foo); // outputs 456
  7673. * ```
  7674. *
  7675. * @param {Object} obj1 Object to merge
  7676. * @returns {Object} Result of all merge properties
  7677. */
  7678. function merge() {
  7679. var result = {};
  7680. function assignValue(val, key) {
  7681. if (isPlainObject(result[key]) && isPlainObject(val)) {
  7682. result[key] = merge(result[key], val);
  7683. } else if (isPlainObject(val)) {
  7684. result[key] = merge({}, val);
  7685. } else if (isArray$3(val)) {
  7686. result[key] = val.slice();
  7687. } else {
  7688. result[key] = val;
  7689. }
  7690. }
  7691. for (var i = 0, l = arguments.length; i < l; i++) {
  7692. forEach(arguments[i], assignValue);
  7693. }
  7694. return result;
  7695. }
  7696. /**
  7697. * Extends object a by mutably adding to it the properties of object b.
  7698. *
  7699. * @param {Object} a The object to be extended
  7700. * @param {Object} b The object to copy properties from
  7701. * @param {Object} thisArg The object to bind function to
  7702. * @return {Object} The resulting value of object a
  7703. */
  7704. function extend$1(a, b, thisArg) {
  7705. forEach(b, function assignValue(val, key) {
  7706. if (thisArg && typeof val === 'function') {
  7707. a[key] = bind$1(val, thisArg);
  7708. } else {
  7709. a[key] = val;
  7710. }
  7711. });
  7712. return a;
  7713. }
  7714. /**
  7715. * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
  7716. *
  7717. * @param {string} content with BOM
  7718. * @return {string} content value without BOM
  7719. */
  7720. function stripBOM(content) {
  7721. if (content.charCodeAt(0) === 0xFEFF) {
  7722. content = content.slice(1);
  7723. }
  7724. return content;
  7725. }
  7726. var utils = {
  7727. isArray: isArray$3,
  7728. isArrayBuffer: isArrayBuffer,
  7729. isBuffer: isBuffer$2,
  7730. isFormData: isFormData,
  7731. isArrayBufferView: isArrayBufferView,
  7732. isString: isString$2,
  7733. isNumber: isNumber$1,
  7734. isObject: isObject$3,
  7735. isPlainObject: isPlainObject,
  7736. isUndefined: isUndefined,
  7737. isDate: isDate$1,
  7738. isFile: isFile,
  7739. isBlob: isBlob$1,
  7740. isFunction: isFunction$1,
  7741. isStream: isStream,
  7742. isURLSearchParams: isURLSearchParams,
  7743. isStandardBrowserEnv: isStandardBrowserEnv,
  7744. forEach: forEach,
  7745. merge: merge,
  7746. extend: extend$1,
  7747. trim: trim,
  7748. stripBOM: stripBOM
  7749. };
  7750. function encode$5(val) {
  7751. return encodeURIComponent(val).replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');
  7752. }
  7753. /**
  7754. * Build a URL by appending params to the end
  7755. *
  7756. * @param {string} url The base of the url (e.g., http://www.google.com)
  7757. * @param {object} [params] The params to be appended
  7758. * @returns {string} The formatted url
  7759. */
  7760. var buildURL = function buildURL(url, params, paramsSerializer) {
  7761. /*eslint no-param-reassign:0*/
  7762. if (!params) {
  7763. return url;
  7764. }
  7765. var serializedParams;
  7766. if (paramsSerializer) {
  7767. serializedParams = paramsSerializer(params);
  7768. } else if (utils.isURLSearchParams(params)) {
  7769. serializedParams = params.toString();
  7770. } else {
  7771. var parts = [];
  7772. utils.forEach(params, function serialize(val, key) {
  7773. if (val === null || typeof val === 'undefined') {
  7774. return;
  7775. }
  7776. if (utils.isArray(val)) {
  7777. key = key + '[]';
  7778. } else {
  7779. val = [val];
  7780. }
  7781. utils.forEach(val, function parseValue(v) {
  7782. if (utils.isDate(v)) {
  7783. v = v.toISOString();
  7784. } else if (utils.isObject(v)) {
  7785. v = JSON.stringify(v);
  7786. }
  7787. parts.push(encode$5(key) + '=' + encode$5(v));
  7788. });
  7789. });
  7790. serializedParams = parts.join('&');
  7791. }
  7792. if (serializedParams) {
  7793. var hashmarkIndex = url.indexOf('#');
  7794. if (hashmarkIndex !== -1) {
  7795. url = url.slice(0, hashmarkIndex);
  7796. }
  7797. url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
  7798. }
  7799. return url;
  7800. };
  7801. function InterceptorManager() {
  7802. this.handlers = [];
  7803. }
  7804. /**
  7805. * Add a new interceptor to the stack
  7806. *
  7807. * @param {Function} fulfilled The function to handle `then` for a `Promise`
  7808. * @param {Function} rejected The function to handle `reject` for a `Promise`
  7809. *
  7810. * @return {Number} An ID used to remove interceptor later
  7811. */
  7812. InterceptorManager.prototype.use = function use(fulfilled, rejected) {
  7813. this.handlers.push({
  7814. fulfilled: fulfilled,
  7815. rejected: rejected
  7816. });
  7817. return this.handlers.length - 1;
  7818. };
  7819. /**
  7820. * Remove an interceptor from the stack
  7821. *
  7822. * @param {Number} id The ID that was returned by `use`
  7823. */
  7824. InterceptorManager.prototype.eject = function eject(id) {
  7825. if (this.handlers[id]) {
  7826. this.handlers[id] = null;
  7827. }
  7828. };
  7829. /**
  7830. * Iterate over all the registered interceptors
  7831. *
  7832. * This method is particularly useful for skipping over any
  7833. * interceptors that may have become `null` calling `eject`.
  7834. *
  7835. * @param {Function} fn The function to call for each interceptor
  7836. */
  7837. InterceptorManager.prototype.forEach = function forEach(fn) {
  7838. utils.forEach(this.handlers, function forEachHandler(h) {
  7839. if (h !== null) {
  7840. fn(h);
  7841. }
  7842. });
  7843. };
  7844. var InterceptorManager_1 = InterceptorManager;
  7845. /**
  7846. * Transform the data for a request or a response
  7847. *
  7848. * @param {Object|String} data The data to be transformed
  7849. * @param {Array} headers The headers for the request or response
  7850. * @param {Array|Function} fns A single function or Array of functions
  7851. * @returns {*} The resulting transformed data
  7852. */
  7853. var transformData = function transformData(data, headers, fns) {
  7854. /*eslint no-param-reassign:0*/
  7855. utils.forEach(fns, function transform(fn) {
  7856. data = fn(data, headers);
  7857. });
  7858. return data;
  7859. };
  7860. var isCancel = function isCancel(value) {
  7861. return !!(value && value.__CANCEL__);
  7862. };
  7863. var normalizeHeaderName = function normalizeHeaderName(headers, normalizedName) {
  7864. utils.forEach(headers, function processHeader(value, name) {
  7865. if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
  7866. headers[normalizedName] = value;
  7867. delete headers[name];
  7868. }
  7869. });
  7870. };
  7871. /**
  7872. * Update an Error with the specified config, error code, and response.
  7873. *
  7874. * @param {Error} error The error to update.
  7875. * @param {Object} config The config.
  7876. * @param {string} [code] The error code (for example, 'ECONNABORTED').
  7877. * @param {Object} [request] The request.
  7878. * @param {Object} [response] The response.
  7879. * @returns {Error} The error.
  7880. */
  7881. var enhanceError = function enhanceError(error, config, code, request, response) {
  7882. error.config = config;
  7883. if (code) {
  7884. error.code = code;
  7885. }
  7886. error.request = request;
  7887. error.response = response;
  7888. error.isAxiosError = true;
  7889. error.toJSON = function toJSON() {
  7890. return {
  7891. // Standard
  7892. message: this.message,
  7893. name: this.name,
  7894. // Microsoft
  7895. description: this.description,
  7896. number: this.number,
  7897. // Mozilla
  7898. fileName: this.fileName,
  7899. lineNumber: this.lineNumber,
  7900. columnNumber: this.columnNumber,
  7901. stack: this.stack,
  7902. // Axios
  7903. config: this.config,
  7904. code: this.code
  7905. };
  7906. };
  7907. return error;
  7908. };
  7909. /**
  7910. * Create an Error with the specified message, config, error code, request and response.
  7911. *
  7912. * @param {string} message The error message.
  7913. * @param {Object} config The config.
  7914. * @param {string} [code] The error code (for example, 'ECONNABORTED').
  7915. * @param {Object} [request] The request.
  7916. * @param {Object} [response] The response.
  7917. * @returns {Error} The created error.
  7918. */
  7919. var createError = function createError(message, config, code, request, response) {
  7920. var error = new Error(message);
  7921. return enhanceError(error, config, code, request, response);
  7922. };
  7923. /**
  7924. * Resolve or reject a Promise based on response status.
  7925. *
  7926. * @param {Function} resolve A function that resolves the promise.
  7927. * @param {Function} reject A function that rejects the promise.
  7928. * @param {object} response The response.
  7929. */
  7930. var settle = function settle(resolve, reject, response) {
  7931. var validateStatus = response.config.validateStatus;
  7932. if (!response.status || !validateStatus || validateStatus(response.status)) {
  7933. resolve(response);
  7934. } else {
  7935. reject(createError('Request failed with status code ' + response.status, response.config, null, response.request, response));
  7936. }
  7937. };
  7938. var cookies = utils.isStandardBrowserEnv() ? // Standard browser envs support document.cookie
  7939. function standardBrowserEnv() {
  7940. return {
  7941. write: function write(name, value, expires, path, domain, secure) {
  7942. var cookie = [];
  7943. cookie.push(name + '=' + encodeURIComponent(value));
  7944. if (utils.isNumber(expires)) {
  7945. cookie.push('expires=' + new Date(expires).toGMTString());
  7946. }
  7947. if (utils.isString(path)) {
  7948. cookie.push('path=' + path);
  7949. }
  7950. if (utils.isString(domain)) {
  7951. cookie.push('domain=' + domain);
  7952. }
  7953. if (secure === true) {
  7954. cookie.push('secure');
  7955. }
  7956. document.cookie = cookie.join('; ');
  7957. },
  7958. read: function read(name) {
  7959. var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
  7960. return match ? decodeURIComponent(match[3]) : null;
  7961. },
  7962. remove: function remove(name) {
  7963. this.write(name, '', Date.now() - 86400000);
  7964. }
  7965. };
  7966. }() : // Non standard browser env (web workers, react-native) lack needed support.
  7967. function nonStandardBrowserEnv() {
  7968. return {
  7969. write: function write() {},
  7970. read: function read() {
  7971. return null;
  7972. },
  7973. remove: function remove() {}
  7974. };
  7975. }();
  7976. /**
  7977. * Determines whether the specified URL is absolute
  7978. *
  7979. * @param {string} url The URL to test
  7980. * @returns {boolean} True if the specified URL is absolute, otherwise false
  7981. */
  7982. var isAbsoluteURL = function isAbsoluteURL(url) {
  7983. // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
  7984. // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
  7985. // by any combination of letters, digits, plus, period, or hyphen.
  7986. return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
  7987. };
  7988. /**
  7989. * Creates a new URL by combining the specified URLs
  7990. *
  7991. * @param {string} baseURL The base URL
  7992. * @param {string} relativeURL The relative URL
  7993. * @returns {string} The combined URL
  7994. */
  7995. var combineURLs = function combineURLs(baseURL, relativeURL) {
  7996. return relativeURL ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL;
  7997. };
  7998. /**
  7999. * Creates a new URL by combining the baseURL with the requestedURL,
  8000. * only when the requestedURL is not already an absolute URL.
  8001. * If the requestURL is absolute, this function returns the requestedURL untouched.
  8002. *
  8003. * @param {string} baseURL The base URL
  8004. * @param {string} requestedURL Absolute or relative URL to combine
  8005. * @returns {string} The combined full path
  8006. */
  8007. var buildFullPath = function buildFullPath(baseURL, requestedURL) {
  8008. if (baseURL && !isAbsoluteURL(requestedURL)) {
  8009. return combineURLs(baseURL, requestedURL);
  8010. }
  8011. return requestedURL;
  8012. };
  8013. // Headers whose duplicates are ignored by node
  8014. // c.f. https://nodejs.org/api/http.html#http_message_headers
  8015. var ignoreDuplicateOf = ['age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', 'referer', 'retry-after', 'user-agent'];
  8016. /**
  8017. * Parse headers into an object
  8018. *
  8019. * ```
  8020. * Date: Wed, 27 Aug 2014 08:58:49 GMT
  8021. * Content-Type: application/json
  8022. * Connection: keep-alive
  8023. * Transfer-Encoding: chunked
  8024. * ```
  8025. *
  8026. * @param {String} headers Headers needing to be parsed
  8027. * @returns {Object} Headers parsed into an object
  8028. */
  8029. var parseHeaders = function parseHeaders(headers) {
  8030. var parsed = {};
  8031. var key;
  8032. var val;
  8033. var i;
  8034. if (!headers) {
  8035. return parsed;
  8036. }
  8037. utils.forEach(headers.split('\n'), function parser(line) {
  8038. i = line.indexOf(':');
  8039. key = utils.trim(line.substr(0, i)).toLowerCase();
  8040. val = utils.trim(line.substr(i + 1));
  8041. if (key) {
  8042. if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
  8043. return;
  8044. }
  8045. if (key === 'set-cookie') {
  8046. parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
  8047. } else {
  8048. parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
  8049. }
  8050. }
  8051. });
  8052. return parsed;
  8053. };
  8054. var isURLSameOrigin = utils.isStandardBrowserEnv() ? // Standard browser envs have full support of the APIs needed to test
  8055. // whether the request URL is of the same origin as current location.
  8056. function standardBrowserEnv() {
  8057. var msie = /(msie|trident)/i.test(navigator.userAgent);
  8058. var urlParsingNode = document.createElement('a');
  8059. var originURL;
  8060. /**
  8061. * Parse a URL to discover it's components
  8062. *
  8063. * @param {String} url The URL to be parsed
  8064. * @returns {Object}
  8065. */
  8066. function resolveURL(url) {
  8067. var href = url;
  8068. if (msie) {
  8069. // IE needs attribute set twice to normalize properties
  8070. urlParsingNode.setAttribute('href', href);
  8071. href = urlParsingNode.href;
  8072. }
  8073. urlParsingNode.setAttribute('href', href); // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
  8074. return {
  8075. href: urlParsingNode.href,
  8076. protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
  8077. host: urlParsingNode.host,
  8078. search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
  8079. hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
  8080. hostname: urlParsingNode.hostname,
  8081. port: urlParsingNode.port,
  8082. pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname
  8083. };
  8084. }
  8085. originURL = resolveURL(window.location.href);
  8086. /**
  8087. * Determine if a URL shares the same origin as the current location
  8088. *
  8089. * @param {String} requestURL The URL to test
  8090. * @returns {boolean} True if URL shares the same origin, otherwise false
  8091. */
  8092. return function isURLSameOrigin(requestURL) {
  8093. var parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;
  8094. return parsed.protocol === originURL.protocol && parsed.host === originURL.host;
  8095. };
  8096. }() : // Non standard browser envs (web workers, react-native) lack needed support.
  8097. function nonStandardBrowserEnv() {
  8098. return function isURLSameOrigin() {
  8099. return true;
  8100. };
  8101. }();
  8102. var xhr = function xhrAdapter(config) {
  8103. return new Promise(function dispatchXhrRequest(resolve, reject) {
  8104. var requestData = config.data;
  8105. var requestHeaders = config.headers;
  8106. if (utils.isFormData(requestData)) {
  8107. delete requestHeaders['Content-Type']; // Let the browser set it
  8108. }
  8109. var request = new XMLHttpRequest(); // HTTP basic authentication
  8110. if (config.auth) {
  8111. var username = config.auth.username || '';
  8112. var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
  8113. requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
  8114. }
  8115. var fullPath = buildFullPath(config.baseURL, config.url);
  8116. request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); // Set the request timeout in MS
  8117. request.timeout = config.timeout; // Listen for ready state
  8118. request.onreadystatechange = function handleLoad() {
  8119. if (!request || request.readyState !== 4) {
  8120. return;
  8121. } // The request errored out and we didn't get a response, this will be
  8122. // handled by onerror instead
  8123. // With one exception: request that using file: protocol, most browsers
  8124. // will return status as 0 even though it's a successful request
  8125. if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
  8126. return;
  8127. } // Prepare the response
  8128. var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
  8129. var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
  8130. var response = {
  8131. data: responseData,
  8132. status: request.status,
  8133. statusText: request.statusText,
  8134. headers: responseHeaders,
  8135. config: config,
  8136. request: request
  8137. };
  8138. settle(resolve, reject, response); // Clean up request
  8139. request = null;
  8140. }; // Handle browser request cancellation (as opposed to a manual cancellation)
  8141. request.onabort = function handleAbort() {
  8142. if (!request) {
  8143. return;
  8144. }
  8145. reject(createError('Request aborted', config, 'ECONNABORTED', request)); // Clean up request
  8146. request = null;
  8147. }; // Handle low level network errors
  8148. request.onerror = function handleError() {
  8149. // Real errors are hidden from us by the browser
  8150. // onerror should only fire if it's a network error
  8151. reject(createError('Network Error', config, null, request)); // Clean up request
  8152. request = null;
  8153. }; // Handle timeout
  8154. request.ontimeout = function handleTimeout() {
  8155. var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';
  8156. if (config.timeoutErrorMessage) {
  8157. timeoutErrorMessage = config.timeoutErrorMessage;
  8158. }
  8159. reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', request)); // Clean up request
  8160. request = null;
  8161. }; // Add xsrf header
  8162. // This is only done if running in a standard browser environment.
  8163. // Specifically not if we're in a web worker, or react-native.
  8164. if (utils.isStandardBrowserEnv()) {
  8165. // Add xsrf header
  8166. var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? cookies.read(config.xsrfCookieName) : undefined;
  8167. if (xsrfValue) {
  8168. requestHeaders[config.xsrfHeaderName] = xsrfValue;
  8169. }
  8170. } // Add headers to the request
  8171. if ('setRequestHeader' in request) {
  8172. utils.forEach(requestHeaders, function setRequestHeader(val, key) {
  8173. if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
  8174. // Remove Content-Type if data is undefined
  8175. delete requestHeaders[key];
  8176. } else {
  8177. // Otherwise add header to the request
  8178. request.setRequestHeader(key, val);
  8179. }
  8180. });
  8181. } // Add withCredentials to request if needed
  8182. if (!utils.isUndefined(config.withCredentials)) {
  8183. request.withCredentials = !!config.withCredentials;
  8184. } // Add responseType to request if needed
  8185. if (config.responseType) {
  8186. try {
  8187. request.responseType = config.responseType;
  8188. } catch (e) {
  8189. // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
  8190. // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
  8191. if (config.responseType !== 'json') {
  8192. throw e;
  8193. }
  8194. }
  8195. } // Handle progress if needed
  8196. if (typeof config.onDownloadProgress === 'function') {
  8197. request.addEventListener('progress', config.onDownloadProgress);
  8198. } // Not all browsers support upload events
  8199. if (typeof config.onUploadProgress === 'function' && request.upload) {
  8200. request.upload.addEventListener('progress', config.onUploadProgress);
  8201. }
  8202. if (config.cancelToken) {
  8203. // Handle cancellation
  8204. config.cancelToken.promise.then(function onCanceled(cancel) {
  8205. if (!request) {
  8206. return;
  8207. }
  8208. request.abort();
  8209. reject(cancel); // Clean up request
  8210. request = null;
  8211. });
  8212. }
  8213. if (!requestData) {
  8214. requestData = null;
  8215. } // Send the request
  8216. request.send(requestData);
  8217. });
  8218. };
  8219. var DEFAULT_CONTENT_TYPE = {
  8220. 'Content-Type': 'application/x-www-form-urlencoded'
  8221. };
  8222. function setContentTypeIfUnset(headers, value) {
  8223. if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
  8224. headers['Content-Type'] = value;
  8225. }
  8226. }
  8227. function getDefaultAdapter() {
  8228. var adapter;
  8229. if (typeof XMLHttpRequest !== 'undefined') {
  8230. // For browsers use XHR adapter
  8231. adapter = xhr;
  8232. } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
  8233. // For node use HTTP adapter
  8234. adapter = xhr;
  8235. }
  8236. return adapter;
  8237. }
  8238. var defaults = {
  8239. adapter: getDefaultAdapter(),
  8240. transformRequest: [function transformRequest(data, headers) {
  8241. normalizeHeaderName(headers, 'Accept');
  8242. normalizeHeaderName(headers, 'Content-Type');
  8243. if (utils.isFormData(data) || utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {
  8244. return data;
  8245. }
  8246. if (utils.isArrayBufferView(data)) {
  8247. return data.buffer;
  8248. }
  8249. if (utils.isURLSearchParams(data)) {
  8250. setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
  8251. return data.toString();
  8252. }
  8253. if (utils.isObject(data)) {
  8254. setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
  8255. return JSON.stringify(data);
  8256. }
  8257. return data;
  8258. }],
  8259. transformResponse: [function transformResponse(data) {
  8260. /*eslint no-param-reassign:0*/
  8261. if (typeof data === 'string') {
  8262. try {
  8263. data = JSON.parse(data);
  8264. } catch (e) {
  8265. /* Ignore */
  8266. }
  8267. }
  8268. return data;
  8269. }],
  8270. /**
  8271. * A timeout in milliseconds to abort a request. If set to 0 (default) a
  8272. * timeout is not created.
  8273. */
  8274. timeout: 0,
  8275. xsrfCookieName: 'XSRF-TOKEN',
  8276. xsrfHeaderName: 'X-XSRF-TOKEN',
  8277. maxContentLength: -1,
  8278. maxBodyLength: -1,
  8279. validateStatus: function validateStatus(status) {
  8280. return status >= 200 && status < 300;
  8281. }
  8282. };
  8283. defaults.headers = {
  8284. common: {
  8285. 'Accept': 'application/json, text/plain, */*'
  8286. }
  8287. };
  8288. utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
  8289. defaults.headers[method] = {};
  8290. });
  8291. utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  8292. defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
  8293. });
  8294. var defaults_1 = defaults;
  8295. /**
  8296. * Throws a `Cancel` if cancellation has been requested.
  8297. */
  8298. function throwIfCancellationRequested(config) {
  8299. if (config.cancelToken) {
  8300. config.cancelToken.throwIfRequested();
  8301. }
  8302. }
  8303. /**
  8304. * Dispatch a request to the server using the configured adapter.
  8305. *
  8306. * @param {object} config The config that is to be used for the request
  8307. * @returns {Promise} The Promise to be fulfilled
  8308. */
  8309. var dispatchRequest = function dispatchRequest(config) {
  8310. throwIfCancellationRequested(config); // Ensure headers exist
  8311. config.headers = config.headers || {}; // Transform request data
  8312. config.data = transformData(config.data, config.headers, config.transformRequest); // Flatten headers
  8313. config.headers = utils.merge(config.headers.common || {}, config.headers[config.method] || {}, config.headers);
  8314. utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function cleanHeaderConfig(method) {
  8315. delete config.headers[method];
  8316. });
  8317. var adapter = config.adapter || defaults_1.adapter;
  8318. return adapter(config).then(function onAdapterResolution(response) {
  8319. throwIfCancellationRequested(config); // Transform response data
  8320. response.data = transformData(response.data, response.headers, config.transformResponse);
  8321. return response;
  8322. }, function onAdapterRejection(reason) {
  8323. if (!isCancel(reason)) {
  8324. throwIfCancellationRequested(config); // Transform response data
  8325. if (reason && reason.response) {
  8326. reason.response.data = transformData(reason.response.data, reason.response.headers, config.transformResponse);
  8327. }
  8328. }
  8329. return Promise.reject(reason);
  8330. });
  8331. };
  8332. /**
  8333. * Config-specific merge-function which creates a new config-object
  8334. * by merging two configuration objects together.
  8335. *
  8336. * @param {Object} config1
  8337. * @param {Object} config2
  8338. * @returns {Object} New object resulting from merging config2 to config1
  8339. */
  8340. var mergeConfig = function mergeConfig(config1, config2) {
  8341. // eslint-disable-next-line no-param-reassign
  8342. config2 = config2 || {};
  8343. var config = {};
  8344. var valueFromConfig2Keys = ['url', 'method', 'data'];
  8345. var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params'];
  8346. var defaultToConfig2Keys = ['baseURL', 'transformRequest', 'transformResponse', 'paramsSerializer', 'timeout', 'timeoutMessage', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName', 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress', 'decompress', 'maxContentLength', 'maxBodyLength', 'maxRedirects', 'transport', 'httpAgent', 'httpsAgent', 'cancelToken', 'socketPath', 'responseEncoding'];
  8347. var directMergeKeys = ['validateStatus'];
  8348. function getMergedValue(target, source) {
  8349. if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
  8350. return utils.merge(target, source);
  8351. } else if (utils.isPlainObject(source)) {
  8352. return utils.merge({}, source);
  8353. } else if (utils.isArray(source)) {
  8354. return source.slice();
  8355. }
  8356. return source;
  8357. }
  8358. function mergeDeepProperties(prop) {
  8359. if (!utils.isUndefined(config2[prop])) {
  8360. config[prop] = getMergedValue(config1[prop], config2[prop]);
  8361. } else if (!utils.isUndefined(config1[prop])) {
  8362. config[prop] = getMergedValue(undefined, config1[prop]);
  8363. }
  8364. }
  8365. utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {
  8366. if (!utils.isUndefined(config2[prop])) {
  8367. config[prop] = getMergedValue(undefined, config2[prop]);
  8368. }
  8369. });
  8370. utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);
  8371. utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {
  8372. if (!utils.isUndefined(config2[prop])) {
  8373. config[prop] = getMergedValue(undefined, config2[prop]);
  8374. } else if (!utils.isUndefined(config1[prop])) {
  8375. config[prop] = getMergedValue(undefined, config1[prop]);
  8376. }
  8377. });
  8378. utils.forEach(directMergeKeys, function merge(prop) {
  8379. if (prop in config2) {
  8380. config[prop] = getMergedValue(config1[prop], config2[prop]);
  8381. } else if (prop in config1) {
  8382. config[prop] = getMergedValue(undefined, config1[prop]);
  8383. }
  8384. });
  8385. var axiosKeys = valueFromConfig2Keys.concat(mergeDeepPropertiesKeys).concat(defaultToConfig2Keys).concat(directMergeKeys);
  8386. var otherKeys = Object.keys(config1).concat(Object.keys(config2)).filter(function filterAxiosKeys(key) {
  8387. return axiosKeys.indexOf(key) === -1;
  8388. });
  8389. utils.forEach(otherKeys, mergeDeepProperties);
  8390. return config;
  8391. };
  8392. /**
  8393. * Create a new instance of Axios
  8394. *
  8395. * @param {Object} instanceConfig The default config for the instance
  8396. */
  8397. function Axios(instanceConfig) {
  8398. this.defaults = instanceConfig;
  8399. this.interceptors = {
  8400. request: new InterceptorManager_1(),
  8401. response: new InterceptorManager_1()
  8402. };
  8403. }
  8404. /**
  8405. * Dispatch a request
  8406. *
  8407. * @param {Object} config The config specific for this request (merged with this.defaults)
  8408. */
  8409. Axios.prototype.request = function request(config) {
  8410. /*eslint no-param-reassign:0*/
  8411. // Allow for axios('example/url'[, config]) a la fetch API
  8412. if (typeof config === 'string') {
  8413. config = arguments[1] || {};
  8414. config.url = arguments[0];
  8415. } else {
  8416. config = config || {};
  8417. }
  8418. config = mergeConfig(this.defaults, config); // Set config.method
  8419. if (config.method) {
  8420. config.method = config.method.toLowerCase();
  8421. } else if (this.defaults.method) {
  8422. config.method = this.defaults.method.toLowerCase();
  8423. } else {
  8424. config.method = 'get';
  8425. } // Hook up interceptors middleware
  8426. var chain = [dispatchRequest, undefined];
  8427. var promise = Promise.resolve(config);
  8428. this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
  8429. chain.unshift(interceptor.fulfilled, interceptor.rejected);
  8430. });
  8431. this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
  8432. chain.push(interceptor.fulfilled, interceptor.rejected);
  8433. });
  8434. while (chain.length) {
  8435. promise = promise.then(chain.shift(), chain.shift());
  8436. }
  8437. return promise;
  8438. };
  8439. Axios.prototype.getUri = function getUri(config) {
  8440. config = mergeConfig(this.defaults, config);
  8441. return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, '');
  8442. }; // Provide aliases for supported request methods
  8443. utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
  8444. /*eslint func-names:0*/
  8445. Axios.prototype[method] = function (url, config) {
  8446. return this.request(mergeConfig(config || {}, {
  8447. method: method,
  8448. url: url,
  8449. data: (config || {}).data
  8450. }));
  8451. };
  8452. });
  8453. utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  8454. /*eslint func-names:0*/
  8455. Axios.prototype[method] = function (url, data, config) {
  8456. return this.request(mergeConfig(config || {}, {
  8457. method: method,
  8458. url: url,
  8459. data: data
  8460. }));
  8461. };
  8462. });
  8463. var Axios_1 = Axios;
  8464. /**
  8465. * A `Cancel` is an object that is thrown when an operation is canceled.
  8466. *
  8467. * @class
  8468. * @param {string=} message The message.
  8469. */
  8470. function Cancel(message) {
  8471. this.message = message;
  8472. }
  8473. Cancel.prototype.toString = function toString() {
  8474. return 'Cancel' + (this.message ? ': ' + this.message : '');
  8475. };
  8476. Cancel.prototype.__CANCEL__ = true;
  8477. var Cancel_1 = Cancel;
  8478. /**
  8479. * A `CancelToken` is an object that can be used to request cancellation of an operation.
  8480. *
  8481. * @class
  8482. * @param {Function} executor The executor function.
  8483. */
  8484. function CancelToken(executor) {
  8485. if (typeof executor !== 'function') {
  8486. throw new TypeError('executor must be a function.');
  8487. }
  8488. var resolvePromise;
  8489. this.promise = new Promise(function promiseExecutor(resolve) {
  8490. resolvePromise = resolve;
  8491. });
  8492. var token = this;
  8493. executor(function cancel(message) {
  8494. if (token.reason) {
  8495. // Cancellation has already been requested
  8496. return;
  8497. }
  8498. token.reason = new Cancel_1(message);
  8499. resolvePromise(token.reason);
  8500. });
  8501. }
  8502. /**
  8503. * Throws a `Cancel` if cancellation has been requested.
  8504. */
  8505. CancelToken.prototype.throwIfRequested = function throwIfRequested() {
  8506. if (this.reason) {
  8507. throw this.reason;
  8508. }
  8509. };
  8510. /**
  8511. * Returns an object that contains a new `CancelToken` and a function that, when called,
  8512. * cancels the `CancelToken`.
  8513. */
  8514. CancelToken.source = function source() {
  8515. var cancel;
  8516. var token = new CancelToken(function executor(c) {
  8517. cancel = c;
  8518. });
  8519. return {
  8520. token: token,
  8521. cancel: cancel
  8522. };
  8523. };
  8524. var CancelToken_1 = CancelToken;
  8525. /**
  8526. * Syntactic sugar for invoking a function and expanding an array for arguments.
  8527. *
  8528. * Common use case would be to use `Function.prototype.apply`.
  8529. *
  8530. * ```js
  8531. * function f(x, y, z) {}
  8532. * var args = [1, 2, 3];
  8533. * f.apply(null, args);
  8534. * ```
  8535. *
  8536. * With `spread` this example can be re-written.
  8537. *
  8538. * ```js
  8539. * spread(function(x, y, z) {})([1, 2, 3]);
  8540. * ```
  8541. *
  8542. * @param {Function} callback
  8543. * @returns {Function}
  8544. */
  8545. var spread = function spread(callback) {
  8546. return function wrap(arr) {
  8547. return callback.apply(null, arr);
  8548. };
  8549. };
  8550. /**
  8551. * Determines whether the payload is an error thrown by Axios
  8552. *
  8553. * @param {*} payload The value to test
  8554. * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
  8555. */
  8556. var isAxiosError = function isAxiosError(payload) {
  8557. return typeof payload === 'object' && payload.isAxiosError === true;
  8558. };
  8559. /**
  8560. * Create an instance of Axios
  8561. *
  8562. * @param {Object} defaultConfig The default config for the instance
  8563. * @return {Axios} A new instance of Axios
  8564. */
  8565. function createInstance(defaultConfig) {
  8566. var context = new Axios_1(defaultConfig);
  8567. var instance = bind$1(Axios_1.prototype.request, context); // Copy axios.prototype to instance
  8568. utils.extend(instance, Axios_1.prototype, context); // Copy context to instance
  8569. utils.extend(instance, context);
  8570. return instance;
  8571. } // Create the default instance to be exported
  8572. var axios$1 = createInstance(defaults_1); // Expose Axios class to allow class inheritance
  8573. axios$1.Axios = Axios_1; // Factory for creating new instances
  8574. axios$1.create = function create(instanceConfig) {
  8575. return createInstance(mergeConfig(axios$1.defaults, instanceConfig));
  8576. }; // Expose Cancel & CancelToken
  8577. axios$1.Cancel = Cancel_1;
  8578. axios$1.CancelToken = CancelToken_1;
  8579. axios$1.isCancel = isCancel; // Expose all/spread
  8580. axios$1.all = function all(promises) {
  8581. return Promise.all(promises);
  8582. };
  8583. axios$1.spread = spread; // Expose isAxiosError
  8584. axios$1.isAxiosError = isAxiosError;
  8585. var axios_1 = axios$1; // Allow use of default import syntax in TypeScript
  8586. var _default$1 = axios$1;
  8587. axios_1.default = _default$1;
  8588. var axios = axios_1;
  8589. var fetch$1 = null;
  8590. var config$3 = null;
  8591. var instance = null;
  8592. Promise.prototype.done = Promise.prototype.then;
  8593. Promise.prototype.fail = Promise.prototype.catch; // TextDecoder polyfills for lower browser
  8594. if (undefined === window.TextEncoder) {
  8595. window.TextEncoder = /*#__PURE__*/function () {
  8596. function _TextEncoder() {
  8597. _classCallCheck(this, _TextEncoder);
  8598. }
  8599. _createClass(_TextEncoder, [{
  8600. key: "encode",
  8601. value: function encode(s) {
  8602. return unescape(encodeURIComponent(s)).split('').map(function (val) {
  8603. return val.charCodeAt();
  8604. });
  8605. }
  8606. }]);
  8607. return _TextEncoder;
  8608. }();
  8609. window.TextDecoder = /*#__PURE__*/function () {
  8610. function _TextDecoder() {
  8611. _classCallCheck(this, _TextDecoder);
  8612. }
  8613. _createClass(_TextDecoder, [{
  8614. key: "decode",
  8615. value: function decode(code_arr) {
  8616. return decodeURIComponent(escape(String.fromCharCode.apply(null, code_arr)));
  8617. }
  8618. }]);
  8619. return _TextDecoder;
  8620. }();
  8621. }
  8622. var http = {
  8623. retry(func) {
  8624. var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  8625. var delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
  8626. return new Promise(function (resolve, reject) {
  8627. func().then(resolve).catch(function (error) {
  8628. if (retries <= 1) {
  8629. reject(error);
  8630. } else {
  8631. setTimeout(function () {
  8632. http.retry(func, retries - 1, delay).then(resolve).catch(reject);
  8633. }, delay);
  8634. }
  8635. });
  8636. });
  8637. },
  8638. get(url, data) {
  8639. if (data && typeof data === 'object') {
  8640. if (url.indexOf('?') == -1) {
  8641. url += '?';
  8642. } else {
  8643. url += '&';
  8644. }
  8645. url += new URLSearchParams(data).toString();
  8646. }
  8647. return fetch$1.get(url);
  8648. },
  8649. getImage(url) {
  8650. var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
  8651. if (config$3.region == 'aws') {
  8652. if (url.indexOf('x-oss-process=image') != -1) {
  8653. var arr = url.split('?');
  8654. url = arr[0] + encodeURIComponent('?' + arr[1].replace(/\//g, '@'));
  8655. }
  8656. }
  8657. return http.retry(function () {
  8658. return new Promise(function (resolve, reject) {
  8659. var img = new Image();
  8660. img.crossOrigin = 'anonymous';
  8661. img.src = url;
  8662. img.onload = function () {
  8663. resolve(img);
  8664. };
  8665. img.onerror = function () {
  8666. reject("[".concat(url, "] load fail"));
  8667. };
  8668. });
  8669. }, retries);
  8670. },
  8671. getText(url) {
  8672. return fetch$1.get(url, {
  8673. responseType: 'text'
  8674. });
  8675. },
  8676. getBueffer(url) {
  8677. return fetch$1.get(url, {
  8678. responseType: 'arraybuffer'
  8679. });
  8680. },
  8681. getBlob(url) {
  8682. return fetch$1.get(url, {
  8683. responseType: 'blob'
  8684. });
  8685. },
  8686. post(url, data) {
  8687. return fetch$1.post(url, data);
  8688. },
  8689. postFile(url, data) {
  8690. var form = new FormData();
  8691. var cb = null;
  8692. if (data.onUploadProgress) {
  8693. cb = data.onUploadProgress;
  8694. delete data.onUploadProgress;
  8695. }
  8696. for (var key in data) {
  8697. if (key === 'files' && data[key].length > 0) {
  8698. for (var i = 0; i < data[key].length; i++) {
  8699. var file = data[key][i];
  8700. if (file instanceof File) {
  8701. form.append(key, file);
  8702. } else if (file.file) {
  8703. if (file.filename) {
  8704. form.append(key, file.file, file.filename);
  8705. } else {
  8706. form.append(key, file.file);
  8707. }
  8708. } else {
  8709. console.warn('file is wong !', data);
  8710. }
  8711. }
  8712. } else if (key == 'file' || key === 'filename') {
  8713. if (key == 'file') {
  8714. if (data.filename) {
  8715. form.append('file', data[key], data.filename);
  8716. } else {
  8717. form.append('file', data[key]);
  8718. }
  8719. }
  8720. } else {
  8721. form.append(key, data[key]);
  8722. }
  8723. }
  8724. return fetch$1.post(url, form, {
  8725. headers: {
  8726. 'Content-Type': 'multipart/form-data'
  8727. },
  8728. onUploadProgress: cb
  8729. });
  8730. }
  8731. };
  8732. function setup$1(app) {
  8733. if (!app || instance) {
  8734. return;
  8735. }
  8736. config$3 = app.config;
  8737. instance = app;
  8738. fetch$1 = axios.create({
  8739. // baseURL: 'https://v4-test.4dkankan.com',
  8740. // baseURL: 'http://192.168.0.47',
  8741. baseURL: config$3.server || ''
  8742. });
  8743. fetch$1.interceptors.request.use(function (config) {
  8744. if (config.url.indexOf('/service/') != -1) {
  8745. var token = browser$1.valueFromUrl('token') || localStorage.getItem('token') || '';
  8746. if (token) {
  8747. config.headers['token'] = token;
  8748. }
  8749. }
  8750. return config;
  8751. }, function (error) {
  8752. return Promise.reject(error);
  8753. });
  8754. fetch$1.interceptors.response.use(function (response) {
  8755. // 正常的文件流
  8756. if (!/json/gi.test(response.headers['content-type'])) {
  8757. return response.data;
  8758. } // 以文件流方式请求但是返回json,需要解析为JSON对象
  8759. if (response.request.responseType === 'arraybuffer') {
  8760. var enc = new TextDecoder('utf-8');
  8761. var res = JSON.parse(enc.decode(new Uint8Array(response.data)));
  8762. return res;
  8763. }
  8764. if (instance && response.data.success === false) {
  8765. instance.Scene.emit('error', {
  8766. type: 'network',
  8767. code: response.data.code,
  8768. message: response.data.message
  8769. });
  8770. }
  8771. return response.data;
  8772. }, function (error) {
  8773. if (instance) {
  8774. var data = null;
  8775. if (error.response && error.response.data) {
  8776. data = error.response.data;
  8777. } else {
  8778. data = {
  8779. code: 500,
  8780. message: error
  8781. };
  8782. }
  8783. if (error.config && error.config.url.indexOf('data/mapping') == -1 && error.config.url.indexOf('floorplan.json') == -1 && error.config.url.indexOf('vision2.modeldata') == -1) {
  8784. instance.Scene.emit('error', {
  8785. type: 'network',
  8786. code: data.code,
  8787. message: data.message
  8788. });
  8789. }
  8790. }
  8791. if (error.response && error.response.data) {
  8792. return Promise.reject(error.response);
  8793. }
  8794. return Promise.reject(error);
  8795. });
  8796. }
  8797. var sdk_domain = getScriptURL(); //.match(/^http(s)?:\/\/(.*?)\//)[0]
  8798. var texture = {
  8799. data: {}
  8800. };
  8801. texture.load = function (imgUrl, addTextureFunc, failFnc) {
  8802. var _texture = texture.data[imgUrl];
  8803. if (_texture) {
  8804. addTextureFunc && setTimeout(function () {
  8805. addTextureFunc(_texture);
  8806. }, 1);
  8807. return _texture;
  8808. } else {
  8809. _texture = new THREE.Texture();
  8810. if (settings$3.minimalMemoryMode) {
  8811. _texture.minFilter = THREE.LinearFilter;
  8812. _texture.magFilter = THREE.LinearFilter;
  8813. _texture.generateMipmaps = !1;
  8814. }
  8815. _texture.sourceFile = imgUrl;
  8816. texture.data[imgUrl] = _texture;
  8817. http.getImage(imgUrl).then(function (img) {
  8818. _texture.image = img;
  8819. _texture.needsUpdate = !0;
  8820. addTextureFunc && addTextureFunc(_texture);
  8821. }).catch(failFnc);
  8822. return _texture;
  8823. }
  8824. };
  8825. texture.loadWithoutUpdate = /*#__PURE__*/function () {
  8826. var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(imgUrl, addTextureFunc, failFnc) {
  8827. var _texture;
  8828. return regenerator.wrap(function _callee$(_context) {
  8829. while (1) {
  8830. switch (_context.prev = _context.next) {
  8831. case 0:
  8832. _texture = texture.data[imgUrl.split('?')[0]];
  8833. if (!_texture) {
  8834. _context.next = 6;
  8835. break;
  8836. }
  8837. addTextureFunc && addTextureFunc(_texture);
  8838. return _context.abrupt("return", _texture);
  8839. case 6:
  8840. _texture = new THREE.Texture();
  8841. if (settings$3.minimalMemoryMode) {
  8842. _texture.minFilter = THREE.LinearFilter;
  8843. _texture.magFilter = THREE.LinearFilter;
  8844. _texture.generateMipmaps = !1;
  8845. }
  8846. _texture.sourceFile = imgUrl;
  8847. texture.data[imgUrl.split('?')[0]] = _texture;
  8848. _context.next = 12;
  8849. return http.getImage(imgUrl).then(function (img) {
  8850. _texture.image = img;
  8851. _texture.needsUpdate = !0;
  8852. addTextureFunc && addTextureFunc(_texture);
  8853. }).catch(failFnc);
  8854. case 12:
  8855. return _context.abrupt("return", _texture);
  8856. case 13:
  8857. case "end":
  8858. return _context.stop();
  8859. }
  8860. }
  8861. }, _callee);
  8862. }));
  8863. return function (_x, _x2, _x3) {
  8864. return _ref.apply(this, arguments);
  8865. };
  8866. }();
  8867. texture.loadBase64 = function (base64, fileType) {
  8868. fileType = fileType || 'png';
  8869. var _texture = new THREE.Texture();
  8870. _texture.image = document.createElement('img');
  8871. _texture.image.setAttribute('src', 'data:image/' + fileType + ';base64,' + base64);
  8872. if (settings$3.minimalMemoryMode) {
  8873. _texture.minFilter = THREE.LinearFilter;
  8874. _texture.magFilter = THREE.LinearFilter;
  8875. _texture.generateMipmaps = !1;
  8876. }
  8877. _texture.needsUpdate = !0;
  8878. return _texture;
  8879. };
  8880. texture.isLoaded = function (imgUrl) {
  8881. return !!texture.data[imgUrl];
  8882. };
  8883. texture.getImageURL = function (path) {
  8884. if (path && path.indexOf('http') === 0) {
  8885. return path;
  8886. }
  8887. return sdk_domain + path;
  8888. };
  8889. function _createSuper$1x(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1x(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  8890. function _isNativeReflectConstruct$1x() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  8891. /**
  8892. * @author WestLangley / http://github.com/WestLangley
  8893. *
  8894. * parameters = {
  8895. * color: <hex>,
  8896. * lineWidth: <float>,
  8897. * dashed: <boolean>,
  8898. * dashScale: <float>,
  8899. * dashSize: <float>,
  8900. * gapSize: <float>,
  8901. * resolution: <Vector2>, // to be set by renderer
  8902. * }
  8903. */
  8904. var line = {
  8905. lineWidth: {
  8906. value: 1,
  8907. type: 'f'
  8908. },
  8909. resolution: {
  8910. value: new THREE.Vector2(1, 1),
  8911. type: 'v2'
  8912. },
  8913. dashScale: {
  8914. value: 1,
  8915. type: 'f'
  8916. },
  8917. dashSize: {
  8918. value: 1,
  8919. type: 'f'
  8920. },
  8921. gapSize: {
  8922. value: 1,
  8923. type: 'f'
  8924. } // todo FIX - maybe change to totalSize
  8925. };
  8926. var shaderLib = {
  8927. uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, line]),
  8928. vertexShader: '#include <common>\n#include <color_pars_vertex>\n \n#include <logdepthbuf_pars_vertex>\n \nuniform float lineWidth;\nuniform vec2 resolution;\nattribute vec3 instanceStart;\nattribute vec3 instanceEnd;\nattribute vec3 instanceColorStart;\nattribute vec3 instanceColorEnd;\nvarying vec2 vUv;\n#ifdef USE_DASH\n uniform float dashScale;\n attribute float instanceDistanceStart;\n attribute float instanceDistanceEnd;\n varying float vLineDistance;\n#endif\nvoid trimSegment( const in vec4 start, inout vec4 end ) {\n float a = projectionMatrix[ 2 ][ 2 ]; \n float b = projectionMatrix[ 3 ][ 2 ]; \n float nearEstimate = - 0.5 * b / a;\n float alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n end.xyz = mix( start.xyz, end.xyz, alpha );\n}\nvoid main() {\n #ifdef USE_COLOR\n vColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n #endif\n #ifdef USE_DASH\n vLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n #endif\n float aspect = resolution.x / resolution.y;\n vUv = uv;\n vec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n vec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n bool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); \n if ( perspective ) {\n if ( start.z < 0.0 && end.z >= 0.0 ) {\n trimSegment( start, end );\n } else if ( end.z < 0.0 && start.z >= 0.0 ) {\n trimSegment( end, start );\n }\n }\n vec4 clipStart = projectionMatrix * start;\n vec4 clipEnd = projectionMatrix * end;\n vec2 ndcStart = clipStart.xy / clipStart.w;\n vec2 ndcEnd = clipEnd.xy / clipEnd.w;\n vec2 dir = ndcEnd - ndcStart;\n dir.x *= aspect;\n dir = normalize( dir );\n vec2 offset = vec2( dir.y, - dir.x );\n dir.x /= aspect;\n offset.x /= aspect;\n if ( position.x < 0.0 ) offset *= - 1.0;\n if ( position.y < 0.0 ) {\n offset += - dir;\n } else if ( position.y > 1.0 ) {\n offset += dir;\n }\n offset *= lineWidth;\n offset /= resolution.y;\n vec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n offset *= clip.w;\n clip.xy += offset;\n gl_Position = clip;\n vec4 mvPosition = ( position.y < 0.5 ) ? start : end; \n #include <logdepthbuf_vertex>\n \n \n} ',
  8929. fragmentShader: 'uniform vec3 diffuse;\n uniform float opacity;\n #ifdef USE_DASH\n uniform float dashSize;\n uniform float gapSize;\n #endif\n varying float vLineDistance;\n #include <common>\n #include <color_pars_fragment>\n #include <fog_pars_fragment>\n #include <logdepthbuf_pars_fragment>\n \n varying vec2 vUv;\n void main() {\n \n #ifdef USE_DASH\n\nif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; \n\nif ( mod( vLineDistance, dashSize + gapSize ) > dashSize ) discard; \n #endif\n if ( abs( vUv.y ) > 1.0 ) {\n\nfloat a = vUv.x;\n\nfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\nfloat len2 = a * a + b * b;\n\nif ( len2 > 1.0 ) discard;\n }\n vec4 diffuseColor = vec4( diffuse, opacity );\n #include <logdepthbuf_fragment>\n #include <color_fragment>\n gl_FragColor = vec4( diffuseColor.rgb, diffuseColor.a );\n #include <premultiplied_alpha_fragment>\n #include <tonemapping_fragment>\n #include <encodings_fragment>\n #include <fog_fragment>\n }'
  8930. };
  8931. var lineMats = [];
  8932. var LineMaterial = /*#__PURE__*/function (_THREE$ShaderMaterial) {
  8933. _inherits(LineMaterial, _THREE$ShaderMaterial);
  8934. var _super = _createSuper$1x(LineMaterial);
  8935. function LineMaterial(parameters) {
  8936. var _this;
  8937. _classCallCheck(this, LineMaterial);
  8938. _this = _super.call(this, {
  8939. type: 'LineMaterial',
  8940. uniforms: THREE.UniformsUtils.clone(shaderLib.uniforms),
  8941. vertexShader: shaderLib.vertexShader,
  8942. fragmentShader: shaderLib.fragmentShader
  8943. }); // 因为opacity会与ShaderMaterial.opacity冲突,所以必须放在super之后
  8944. Object.defineProperties(_assertThisInitialized(_this), {
  8945. opacity: {
  8946. enumerable: true,
  8947. get: function get() {
  8948. return this.uniforms.opacity.value;
  8949. },
  8950. set: function set(value) {
  8951. this.uniforms.opacity.value = value;
  8952. }
  8953. }
  8954. });
  8955. _this.isLineMaterial = true;
  8956. _this.dashed = false;
  8957. _this.setValues(parameters); //add:
  8958. lineMats.push(_assertThisInitialized(_this));
  8959. _this.addEventListener('dispose', function () {
  8960. var i = lineMats.indexOf(_assertThisInitialized(_this));
  8961. i > -1 && lineMats.splice(i, 1);
  8962. });
  8963. return _this;
  8964. }
  8965. _createClass(LineMaterial, [{
  8966. key: "color",
  8967. get: function get() {
  8968. return this.uniforms.diffuse.value;
  8969. },
  8970. set: function set(value) {
  8971. this.uniforms.diffuse.value = value;
  8972. }
  8973. }, {
  8974. key: "lineWidth",
  8975. get: function get() {
  8976. return this.uniforms.lineWidth.value;
  8977. },
  8978. set: function set(value) {
  8979. this.uniforms.lineWidth.value = value;
  8980. }
  8981. }, {
  8982. key: "dashScale",
  8983. get: function get() {
  8984. return this.uniforms.dashScale.value;
  8985. },
  8986. set: function set(value) {
  8987. this.uniforms.dashScale.value = value;
  8988. }
  8989. }, {
  8990. key: "dashSize",
  8991. get: function get() {
  8992. return this.uniforms.dashSize.value;
  8993. },
  8994. set: function set(value) {
  8995. this.uniforms.dashSize.value = value;
  8996. }
  8997. }, {
  8998. key: "gapSize",
  8999. get: function get() {
  9000. return this.uniforms.gapSize.value;
  9001. },
  9002. set: function set(value) {
  9003. this.uniforms.gapSize.value = value;
  9004. }
  9005. }, {
  9006. key: "resolution",
  9007. get: function get() {
  9008. return this.uniforms.resolution.value;
  9009. },
  9010. set: function set(value) {
  9011. this.uniforms.resolution.value.copy(value);
  9012. }
  9013. }, {
  9014. key: "dashed",
  9015. get: function get() {
  9016. return 'USE_DASH' in this.defines;
  9017. },
  9018. set: function set(value) {
  9019. if (value) {
  9020. this.defines.USE_DASH = '';
  9021. } else {
  9022. delete this.defines.USE_DASH;
  9023. }
  9024. this.needsUpdate = true;
  9025. }
  9026. }, {
  9027. key: "copy",
  9028. value: function copy(source) {
  9029. THREE.ShaderMaterial.prototype.copy.call(this, source);
  9030. this.color.copy(source.color);
  9031. this.lineWidth = source.lineWidth;
  9032. this.resolution = source.resolution; // todo
  9033. return this;
  9034. }
  9035. }], [{
  9036. key: "init",
  9037. value: function init(app) {
  9038. app.core.get('SceneRenderer').addComponent(this);
  9039. }
  9040. }, {
  9041. key: "setSize",
  9042. value: function setSize(x, y) {
  9043. lineMats.forEach(function (e) {
  9044. e.resolution = new THREE.Vector2(x, y);
  9045. });
  9046. }
  9047. }]);
  9048. return LineMaterial;
  9049. }(THREE.ShaderMaterial); // LineMaterial.prototype = Object.create(THREE.ShaderMaterial.prototype)
  9050. // LineMaterial.prototype.constructor = THREE.LineMaterial
  9051. // LineMaterial.prototype.isLineMaterial = true
  9052. /**
  9053. * @author WestLangley / http://github.com/WestLangley
  9054. *
  9055. */
  9056. var LineSegmentsGeometry = /*#__PURE__*/function (_THREE$InstancedBuffe) {
  9057. _inherits(LineSegmentsGeometry, _THREE$InstancedBuffe);
  9058. var _super2 = _createSuper$1x(LineSegmentsGeometry);
  9059. function LineSegmentsGeometry() {
  9060. var _this2;
  9061. _classCallCheck(this, LineSegmentsGeometry);
  9062. _this2 = _super2.call(this);
  9063. _this2.computeBoundingBox = function () {
  9064. var box = new THREE.Box3();
  9065. return function () {
  9066. if (_this2.boundingBox === null) {
  9067. _this2.boundingBox = new THREE.Box3();
  9068. }
  9069. var start = _this2.attributes.instanceStart;
  9070. var end = _this2.attributes.instanceEnd;
  9071. if (start !== undefined && end !== undefined) {
  9072. _this2.boundingBox.setFromBufferAttribute(start);
  9073. box.setFromBufferAttribute(end);
  9074. _this2.boundingBox.union(box);
  9075. }
  9076. };
  9077. }();
  9078. _this2.computeBoundingSphere = function () {
  9079. var vector = new THREE.Vector3();
  9080. return function () {
  9081. if (_this2.boundingSphere === null) {
  9082. _this2.boundingSphere = new THREE.Sphere();
  9083. }
  9084. if (_this2.boundingBox === null) {
  9085. _this2.computeBoundingBox();
  9086. }
  9087. var start = _this2.attributes.instanceStart;
  9088. var end = _this2.attributes.instanceEnd;
  9089. if (start !== undefined && end !== undefined) {
  9090. var center = _this2.boundingSphere.center;
  9091. _this2.boundingBox.getCenter(center);
  9092. var maxRadiusSq = 0;
  9093. for (var i = 0, il = start.count; i < il; i++) {
  9094. vector.fromBufferAttribute(start, i);
  9095. maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector));
  9096. vector.fromBufferAttribute(end, i);
  9097. maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector));
  9098. }
  9099. _this2.boundingSphere.radius = Math.sqrt(maxRadiusSq);
  9100. if (isNaN(_this2.boundingSphere.radius)) {
  9101. console.error('LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', _assertThisInitialized(_this2));
  9102. }
  9103. }
  9104. };
  9105. }();
  9106. _this2.type = 'LineSegmentsGeometry';
  9107. new THREE.BufferGeometry();
  9108. var positions = [-1, 2, 0, 1, 2, 0, -1, 1, 0, 1, 1, 0, -1, 0, 0, 1, 0, 0, -1, -1, 0, 1, -1, 0];
  9109. var uvs = [-1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2];
  9110. var index = new THREE.BufferAttribute(new Uint16Array([0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5]), 1);
  9111. _this2.setIndex(index);
  9112. _this2.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
  9113. _this2.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));
  9114. _this2.isLineSegmentsGeometry = true;
  9115. return _this2;
  9116. }
  9117. _createClass(LineSegmentsGeometry, [{
  9118. key: "applyMatrix",
  9119. value: function applyMatrix(matrix) {
  9120. var start = this.attributes.instanceStart;
  9121. var end = this.attributes.instanceEnd;
  9122. if (start !== undefined) {
  9123. matrix.applyToBufferAttribute(start);
  9124. matrix.applyToBufferAttribute(end);
  9125. start.data.needsUpdate = true;
  9126. }
  9127. if (this.boundingBox !== null) {
  9128. this.computeBoundingBox();
  9129. }
  9130. if (this.boundingSphere !== null) {
  9131. this.computeBoundingSphere();
  9132. }
  9133. return this;
  9134. }
  9135. }, {
  9136. key: "setPositions",
  9137. value: function setPositions(array) {
  9138. var lineSegments;
  9139. if (array instanceof Float32Array) {
  9140. lineSegments = array;
  9141. } else if (Array.isArray(array)) {
  9142. lineSegments = new Float32Array(array);
  9143. }
  9144. var instanceBuffer = new THREE.InstancedInterleavedBuffer(lineSegments, 6, 1); // xyz, xyz
  9145. this.setAttribute('instanceStart', new THREE.InterleavedBufferAttribute(instanceBuffer, 3, 0)); // xyz
  9146. this.setAttribute('instanceEnd', new THREE.InterleavedBufferAttribute(instanceBuffer, 3, 3)); // xyz
  9147. //
  9148. this.computeBoundingBox();
  9149. this.computeBoundingSphere();
  9150. return this;
  9151. }
  9152. }, {
  9153. key: "setColors",
  9154. value: function setColors(array) {
  9155. var colors;
  9156. if (array instanceof Float32Array) {
  9157. colors = array;
  9158. } else if (Array.isArray(array)) {
  9159. colors = new Float32Array(array);
  9160. }
  9161. var instanceColorBuffer = new THREE.InstancedInterleavedBuffer(colors, 6, 1); // rgb, rgb
  9162. this.setAttribute('instanceColorStart', new THREE.InterleavedBufferAttribute(instanceColorBuffer, 3, 0)); // rgb
  9163. this.setAttribute('instanceColorEnd', new THREE.InterleavedBufferAttribute(instanceColorBuffer, 3, 3)); // rgb
  9164. return this;
  9165. }
  9166. }, {
  9167. key: "fromWireframeGeometry",
  9168. value: function fromWireframeGeometry(geometry) {
  9169. this.setPositions(geometry.attributes.position.array);
  9170. return this;
  9171. }
  9172. }, {
  9173. key: "fromEdgesGeometry",
  9174. value: function fromEdgesGeometry(geometry) {
  9175. this.setPositions(geometry.attributes.position.array);
  9176. return this;
  9177. }
  9178. }, {
  9179. key: "fromMesh",
  9180. value: function fromMesh(mesh) {
  9181. this.fromWireframeGeometry(new THREE.WireframeGeometry(mesh.geometry)); // set colors, maybe
  9182. return this;
  9183. }
  9184. }, {
  9185. key: "fromLineSegements",
  9186. value: function fromLineSegements(lineSegments) {
  9187. var geometry = lineSegments.geometry;
  9188. if (geometry.isGeometry) {
  9189. this.setPositions(geometry.vertices);
  9190. } else if (geometry.isBufferGeometry) {
  9191. this.setPositions(geometry.position.array); // assumes non-indexed
  9192. } // set colors, maybe
  9193. return this;
  9194. }
  9195. }, {
  9196. key: "toJSON",
  9197. value: function toJSON() {// todo
  9198. }
  9199. }, {
  9200. key: "clone",
  9201. value: function clone() {// todo
  9202. }
  9203. }, {
  9204. key: "copy",
  9205. value: function copy(source) {
  9206. // todo
  9207. return this;
  9208. }
  9209. }]);
  9210. return LineSegmentsGeometry;
  9211. }(THREE.InstancedBufferGeometry);
  9212. /**
  9213. * @author WestLangley / http://github.com/WestLangley
  9214. *
  9215. */
  9216. var LineGeometry = /*#__PURE__*/function (_LineSegmentsGeometry) {
  9217. _inherits(LineGeometry, _LineSegmentsGeometry);
  9218. var _super3 = _createSuper$1x(LineGeometry);
  9219. function LineGeometry() {
  9220. var _this3;
  9221. _classCallCheck(this, LineGeometry);
  9222. _this3 = _super3.call(this);
  9223. _this3.type = 'LineGeometry';
  9224. _this3.isLineGeometry = true;
  9225. return _this3;
  9226. }
  9227. _createClass(LineGeometry, [{
  9228. key: "setPositions",
  9229. value: function setPositions(arr) {
  9230. // converts [ x1, y1, z1, x2, y2, z2, ... ] to pairs format
  9231. var length = arr.length - 3;
  9232. var points = new Float32Array(2 * length);
  9233. for (var i = 0; i < length; i += 3) {
  9234. points[2 * i] = arr[i];
  9235. points[2 * i + 1] = arr[i + 1];
  9236. points[2 * i + 2] = arr[i + 2];
  9237. points[2 * i + 3] = arr[i + 3];
  9238. points[2 * i + 4] = arr[i + 4];
  9239. points[2 * i + 5] = arr[i + 5];
  9240. }
  9241. _get(_getPrototypeOf(LineGeometry.prototype), "setPositions", this).call(this, points);
  9242. return this;
  9243. }
  9244. }, {
  9245. key: "setColors",
  9246. value: function setColors(array) {
  9247. // converts [ r1, g1, b1, r2, g2, b2, ... ] to pairs format
  9248. var length = array.length - 3;
  9249. var colors = new Float32Array(2 * length);
  9250. for (var i = 0; i < length; i += 3) {
  9251. colors[2 * i] = array[i];
  9252. colors[2 * i + 1] = array[i + 1];
  9253. colors[2 * i + 2] = array[i + 2];
  9254. colors[2 * i + 3] = array[i + 3];
  9255. colors[2 * i + 4] = array[i + 4];
  9256. colors[2 * i + 5] = array[i + 5];
  9257. }
  9258. _get(_getPrototypeOf(LineGeometry.prototype), "setColors", this).call(this, colors);
  9259. return this;
  9260. }
  9261. }, {
  9262. key: "fromLine",
  9263. value: function fromLine(line) {
  9264. var geometry = line.geometry;
  9265. if (geometry.isGeometry) {
  9266. this.setPositions(geometry.vertices);
  9267. } else if (geometry.isBufferGeometry) {
  9268. this.setPositions(geometry.position.array); // assumes non-indexed
  9269. } // set colors, maybe
  9270. return this;
  9271. }
  9272. }, {
  9273. key: "copy",
  9274. value: function copy(source) {
  9275. // todo
  9276. return this;
  9277. }
  9278. }]);
  9279. return LineGeometry;
  9280. }(LineSegmentsGeometry);
  9281. /**
  9282. * @author WestLangley / http://github.com/WestLangley
  9283. *
  9284. */
  9285. var LineSegments2 = /*#__PURE__*/function (_THREE$Mesh) {
  9286. _inherits(LineSegments2, _THREE$Mesh);
  9287. var _super4 = _createSuper$1x(LineSegments2);
  9288. function LineSegments2(_geometry, material) {
  9289. var _this4;
  9290. _classCallCheck(this, LineSegments2);
  9291. _this4 = _super4.call(this, _geometry, material);
  9292. _this4.computeLineDistances = function () {
  9293. // for backwards-compatability, but could be a method of LineSegmentsGeometry...
  9294. var start = new THREE.Vector3();
  9295. var end = new THREE.Vector3();
  9296. return function () {
  9297. var geometry = _this4.geometry;
  9298. var instanceStart = geometry.attributes.instanceStart;
  9299. var instanceEnd = geometry.attributes.instanceEnd;
  9300. var lineDistances = new Float32Array(2 * instanceStart.data.count);
  9301. for (var i = 0, j = 0, l = instanceStart.data.count; i < l; i++, j += 2) {
  9302. start.fromBufferAttribute(instanceStart, i);
  9303. end.fromBufferAttribute(instanceEnd, i);
  9304. lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1];
  9305. lineDistances[j + 1] = lineDistances[j] + start.distanceTo(end);
  9306. }
  9307. var instanceDistanceBuffer = new THREE.InstancedInterleavedBuffer(lineDistances, 2, 1); // d0, d1
  9308. geometry.setAttribute('instanceDistanceStart', new THREE.InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)); // d0
  9309. geometry.setAttribute('instanceDistanceEnd', new THREE.InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)); // d1
  9310. return _assertThisInitialized(_this4);
  9311. };
  9312. }();
  9313. _this4.type = 'LineSegments2';
  9314. _this4.isLineSegments2 = true;
  9315. _this4.geometry = _geometry !== undefined ? _geometry : new LineSegmentsGeometry();
  9316. _this4.material = material !== undefined ? material : new LineMaterial({
  9317. color: Math.random() * 0xffffff
  9318. });
  9319. return _this4;
  9320. }
  9321. _createClass(LineSegments2, [{
  9322. key: "copy",
  9323. value: function copy(source) {
  9324. // todo
  9325. return this;
  9326. }
  9327. }]);
  9328. return LineSegments2;
  9329. }(THREE.Mesh);
  9330. var Fatline = /*#__PURE__*/function (_LineSegments) {
  9331. _inherits(Fatline, _LineSegments);
  9332. var _super5 = _createSuper$1x(Fatline);
  9333. function Fatline(geometry, material) {
  9334. var _this5;
  9335. _classCallCheck(this, Fatline);
  9336. _this5 = _super5.call(this, geometry, material);
  9337. _this5.type = 'Fatline';
  9338. _this5.isFatline = true;
  9339. _this5.geometry = geometry !== undefined ? geometry : new LineGeometry();
  9340. _this5.material = material !== undefined ? material : new LineMaterial({
  9341. color: Math.random() * 0xffffff
  9342. });
  9343. return _this5;
  9344. }
  9345. _createClass(Fatline, [{
  9346. key: "copy",
  9347. value: function copy(source) {
  9348. // todo
  9349. return this;
  9350. }
  9351. }]);
  9352. return Fatline;
  9353. }(LineSegments2);
  9354. var defaultColor$1 = Colors.lightGreen;
  9355. var player$c = null;
  9356. var LineDraw = {
  9357. /*
  9358. 多段普通线 (第二个点和第三个点之间是没有线段的, 所以不用在意线段顺序)
  9359. */
  9360. createLine: function createLine(posArr) {
  9361. var o = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  9362. var mat;
  9363. if (o.mat) {
  9364. mat = o.mat;
  9365. } else {
  9366. var prop = {
  9367. color: o.color || defaultColor$1,
  9368. transparent: o.dontAlwaysSeen ? false : true,
  9369. depthTest: o.dontAlwaysSeen ? true : false
  9370. };
  9371. if (o.deshed) {
  9372. prop.lineWidth = o.lineWidth || 1; //windows无效。 似乎mac/ios上粗细有效 ?
  9373. prop.dashSize = o.dashSize || 0.1;
  9374. prop.gapSize = o.gapSize || 0.1;
  9375. }
  9376. mat = new THREE[o.deshed ? 'LineDashedMaterial' : 'LineBasicMaterial'](prop);
  9377. }
  9378. var line = new THREE.LineSegments(new THREE.BufferGeometry(), mat);
  9379. line.renderOrder = o.renderOrder || 4;
  9380. this.moveLine(line, posArr);
  9381. return line;
  9382. },
  9383. moveLine: function moveLine(line, posArr) {
  9384. if (posArr.length == 0) {
  9385. return console.log(1);
  9386. }
  9387. var position = [];
  9388. posArr.forEach(function (e) {
  9389. return position.push(e.x, e.y, e.z);
  9390. });
  9391. line.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(position), 3));
  9392. line.geometry.attributes.position.needsUpdate = true;
  9393. line.geometry.computeBoundingSphere();
  9394. if (line.material instanceof THREE.LineDashedMaterial) {
  9395. line.computeLineDistances();
  9396. }
  9397. },
  9398. createFatLineMat: function createFatLineMat(o) {
  9399. var matParam = Object.assign({}, {
  9400. //默认
  9401. lineWidth: 5,
  9402. color: 0xffffff,
  9403. transparent: true,
  9404. depthWrite: false,
  9405. depthTest: false,
  9406. dashSize: 0.1,
  9407. gapSize: 0.1
  9408. }, o, {//修正覆盖:
  9409. // dashed
  9410. /* polygonOffset: true, //是否开启多边形偏移 for not cover the lineMesh
  9411. polygonOffsetFactor: -o.width * 2.5 || -5, //多边形偏移因子
  9412. polygonOffsetUnits: -4.0, //多边形偏移单位 */
  9413. });
  9414. var mat = new LineMaterial(matParam);
  9415. return mat;
  9416. },
  9417. /*
  9418. 创建可以改变粗细的线。
  9419. */
  9420. createFatLine: function createFatLine(posArr, o) {
  9421. var geometry = new LineGeometry();
  9422. geometry.setColors(o.color || [1, 1, 1]);
  9423. var matLine = o.material || this.createFatLineMat(o);
  9424. var line = new Fatline(geometry, matLine); //line.computeLineDistances();
  9425. line.scale.set(1, 1, 1);
  9426. line.renderOrder = 2;
  9427. this.moveFatLine(line, posArr);
  9428. return line;
  9429. },
  9430. /* createFatLine: function (posArr, o) {
  9431. var geometry = new THREE.BufferGeometry()
  9432. geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(posArr), 3))
  9433. geometry.setAttribute('color', new THREE.BufferAttribute(new Float32Array(o.color || [1, 1, 1]), 3))
  9434. var matLine = o.material || this.createFatLineMat(o)
  9435. var line = new THREE.Line(geometry, matLine)
  9436. line.computeLineDistances()
  9437. line.scale.set(1, 1, 1)
  9438. line.renderOrder = 2
  9439. return line
  9440. }, */
  9441. moveFatLine: function moveFatLine(line, posArr) {
  9442. var geometry = line.geometry;
  9443. var positions = [];
  9444. posArr.forEach(function (e) {
  9445. return positions.push(e.x, e.y, e.z);
  9446. });
  9447. if (positions.length > 0) {
  9448. if (!geometry) {
  9449. geometry = line.geometry = new LineGeometry();
  9450. }
  9451. if (geometry.attributes.instanceEnd && geometry.attributes.instanceEnd.data.array.length != positions.length) {
  9452. //positions个数改变会有部分显示不出来,所以重建
  9453. geometry.dispose();
  9454. geometry = new LineGeometry();
  9455. line.geometry = geometry;
  9456. }
  9457. geometry.setPositions(positions);
  9458. if (line.material.dashed) {
  9459. //line.geometry.computeBoundingSphere();
  9460. line.computeLineDistances();
  9461. }
  9462. } else {
  9463. geometry.dispose();
  9464. line.geometry = new LineGeometry();
  9465. }
  9466. },
  9467. /* moveFatLine: function (line, posArr) {
  9468. var geometry = line.geometry
  9469. geometry.setPositions(posArr)
  9470. }, */
  9471. /*
  9472. 为line创建用于检测鼠标的透明mesh,实际是个1-2段圆台。
  9473. 由于近大远小的原因,假设没有透视畸变、创建的是等粗的圆柱的话, 所看到的线上每个位置的粗细应该和距离成反比。所以将圆柱改为根据距离线性渐变其截面半径的圆台,在最近点(相机到线的垂足)最细。如果最近点在线段上,则分成两段圆台,否则一段。
  9474. */
  9475. createBoldLine: function createBoldLine(points, o, p) {
  9476. player$c = p;
  9477. o = o || {};
  9478. var cylinder = o && o.cylinder;
  9479. var CD = points[1].clone().sub(points[0]);
  9480. var rotate = function rotate() {
  9481. //根据端点旋转好模型
  9482. cylinder.lastVector = CD; //记录本次的端点向量
  9483. var AB = new THREE.Vector3(0, -1, 0);
  9484. var axisVec = AB.clone().cross(CD).normalize(); //得到垂直于它们的向量,也就是旋转轴
  9485. var rotationAngle = AB.angleTo(CD);
  9486. cylinder.quaternion.setFromAxisAngle(axisVec, rotationAngle);
  9487. };
  9488. if (o && o.type == 'init') {
  9489. cylinder = new THREE.Mesh();
  9490. cylinder.material = o.mat;
  9491. if (CD.length() == 0) return cylinder;
  9492. rotate();
  9493. }
  9494. if (CD.length() == 0) return cylinder;
  9495. if (o.type != 'update') {
  9496. var CDcenter = points[0].clone().add(points[1]).multiplyScalar(0.5);
  9497. cylinder.position.copy(CDcenter);
  9498. if (!cylinder.lastVector || o.type == 'moveAndRotate') rotate();else if (cylinder.lastVector && CD.angleTo(cylinder.lastVector) > 0) rotate(); //线方向改了or线反向了 重新旋转一下模型
  9499. // if (config.isEdit && !objects.mainDesign.editing) return cylinder //节省初始加载时间?
  9500. } //为了保证线段任何地方的可检测点击范围看起来一样大,更新圆台的结构(但是在镜头边缘会比中心看起来大)
  9501. var height = points[0].distanceTo(points[1]);
  9502. var standPos = o && o.standPos || player$c.position;
  9503. var k = config$4.isMobile ? 20 : 40;
  9504. var dis1 = points[0].distanceTo(standPos);
  9505. var dis2 = points[1].distanceTo(standPos);
  9506. var foot = math$1.getFootPoint(standPos, points[0], points[1]); //垂足
  9507. if (o.constantBold || player$c.mode != 'panorama') {
  9508. var width = 0.1; //0.08;
  9509. var pts = [new THREE.Vector2(width, height / 2), new THREE.Vector2(width, -height / 2)];
  9510. } else if (foot.clone().sub(points[0]).dot(foot.clone().sub(points[1])) > 0) {
  9511. //foot不在线段上
  9512. var pts = [new THREE.Vector2(dis1 / k, height / 2), new THREE.Vector2(dis2 / k, -height / 2)];
  9513. } else {
  9514. //在线段上的话,要在垂足这加一个节点,因它距离站位最近,而两端较远
  9515. var dis3 = foot.distanceTo(standPos);
  9516. var len = foot.distanceTo(points[0]);
  9517. var pts = [new THREE.Vector2(dis1 / k, height / 2), new THREE.Vector2(dis3 / k, height / 2 - len), new THREE.Vector2(dis2 / k, -height / 2)];
  9518. }
  9519. cylinder.geometry && cylinder.geometry.dispose(); //若不删除会占用内存
  9520. cylinder.geometry = new THREE.LatheBufferGeometry(pts, 4
  9521. /* Math.min(dis1,dis2)<10?4:3 */
  9522. );
  9523. cylinder.renderOrder = 2;
  9524. return cylinder;
  9525. },
  9526. updateBoldLine: function updateBoldLine(cylinder, points, type, standPos, constantBold) {
  9527. this.createBoldLine(points, {
  9528. type: type,
  9529. cylinder: cylinder,
  9530. standPos: standPos,
  9531. constantBold
  9532. }, player$c); //type:move:平移 会改长短 , type:update根据距离和角度更新 不改长短
  9533. },
  9534. Fatline,
  9535. fatLineGeometry: LineGeometry
  9536. };
  9537. function _createSuper$1w(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1w(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  9538. function _isNativeReflectConstruct$1w() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  9539. var markerGeometry = new THREE.PlaneBufferGeometry(0.4, 0.4, 1, 1);
  9540. var stemLineLen = 0.5;
  9541. var config$2, player$b;
  9542. var videoPanoTags = [];
  9543. var getStemMat = function () {
  9544. var stemMat;
  9545. return function () {
  9546. return stemMat || (stemMat = new VideoLineMaterial(), stemMat);
  9547. };
  9548. }();
  9549. var getVideoSpotMat = function () {
  9550. var spotMat;
  9551. return function () {
  9552. return spotMat || (spotMat = new VideoPlayerMaterial(), spotMat);
  9553. };
  9554. }();
  9555. var getVideoMarkerMat = function () {
  9556. var mat;
  9557. return function () {
  9558. return mat || (mat = new VideoPanoMarkerMaterial(), mat);
  9559. };
  9560. }();
  9561. var getMarkerTex = function () {
  9562. var markerTex;
  9563. return function (name) {
  9564. if (!markerTex) {
  9565. markerTex = common.loadTextureFromCache(texture.getImageURL(config$2.scene.markerURL || 'images/marker.png'));
  9566. markerTex.minFilter = THREE.LinearMipMapLinearFilter;
  9567. markerTex.generateMipmaps = true;
  9568. markerTex.anisotropy = 4; // 各向异性过滤 .防止倾斜模糊
  9569. }
  9570. return markerTex;
  9571. };
  9572. }();
  9573. /* var getVideTex = (function () {
  9574. let markerTex
  9575. return function (name) {
  9576. if (!markerTex) {
  9577. markerTex = common.loadTextureFromCache(texture.getImageURL(config.scene.markerURL || 'images/marker.png'))
  9578. markerTex.minFilter = THREE.LinearMipMapLinearFilter
  9579. markerTex.generateMipmaps = true
  9580. markerTex.anisotropy = 4 // 各向异性过滤 .防止倾斜模糊
  9581. }
  9582. return markerTex
  9583. })()
  9584. */
  9585. var initOpacityProp = function initOpacityProp(material, marker) {
  9586. var opa = material.opacity;
  9587. Object.defineProperty(material, 'opacity', {
  9588. get: function get() {
  9589. return opa;
  9590. },
  9591. set: function set(o) {
  9592. if (material instanceof VideoPanoMarkerMaterial) {
  9593. marker = material.marker; //仅有一个,切换到不同pano上
  9594. }
  9595. opa = o; //if(o>0)console.log('o>0',this.pano.id)
  9596. common.updateVisible(marker, 'hideWhenZeroOpa', o != 0);
  9597. }
  9598. });
  9599. };
  9600. var Marker = /*#__PURE__*/function (_THREE$Mesh) {
  9601. _inherits(Marker, _THREE$Mesh);
  9602. var _super = _createSuper$1w(Marker);
  9603. function Marker(pano) {
  9604. var _this;
  9605. _classCallCheck(this, Marker);
  9606. _this = _super.call(this);
  9607. player$b = pano.$app.core.get('Player');
  9608. _this.pano = pano;
  9609. _this.config = config$2 = pano.$app.config;
  9610. _this.geometry = markerGeometry;
  9611. _this.widget = null;
  9612. _this.material = new THREE.MeshBasicMaterial({
  9613. map: getMarkerTex('normalMarker'),
  9614. side: THREE.DoubleSide,
  9615. opacity: 0,
  9616. //许钟文 change
  9617. transparent: !0,
  9618. depthWrite: !1,
  9619. depthTest: false
  9620. });
  9621. _this.visible = false; //add 加速加载
  9622. _this.renderOrder = RenderOrder.panoMarker;
  9623. _this.name = 'marker';
  9624. _this.layers.set(RenderLayers.PANOMARKERS);
  9625. _this.updateMatrixWorld();
  9626. _this.initAnimate();
  9627. settings$3.colorMarkerOnLoad && _this.on('load', function () {
  9628. this.marker.material.color.set(65280);
  9629. }); //xzw
  9630. {
  9631. initOpacityProp(_this.material, _assertThisInitialized(_this));
  9632. var vis = _this.visible;
  9633. Object.defineProperty(_assertThisInitialized(_this), 'visible', {
  9634. get: function get() {
  9635. return vis;
  9636. },
  9637. set: function set(v) {
  9638. if (pano.flagSpot) {
  9639. v ? pano.flagSpot.show() : pano.flagSpot.hide(); //console.log('marker Visi', pano.id, v)
  9640. }
  9641. vis = v;
  9642. }
  9643. });
  9644. }
  9645. return _this;
  9646. }
  9647. _createClass(Marker, [{
  9648. key: "updateStyle",
  9649. value: function updateStyle(model, type) {
  9650. //console.log('updateStyle', this.pano.id, type)
  9651. var oldOpacity = this.material.opacity;
  9652. if (type == 'animate') {
  9653. var videoMarkerMat = getVideoMarkerMat();
  9654. videoMarkerMat.marker = this;
  9655. if (this.material != videoMarkerMat) {
  9656. this.normalMaterial = this.material;
  9657. this.material = videoMarkerMat;
  9658. }
  9659. } else {
  9660. this.normalMaterial && (this.material = this.normalMaterial);
  9661. if (type == 'video') {
  9662. this.setWidget(model, this.pano, type);
  9663. } else {
  9664. this.pano.oldFlagSpot = this.pano.flagSpot;
  9665. this.pano.flagSpot = null;
  9666. this.pano.oldFlagSpot && this.pano.oldFlagSpot.hide();
  9667. }
  9668. }
  9669. this.material.opacity = oldOpacity;
  9670. }
  9671. }, {
  9672. key: "setWidget",
  9673. value: function setWidget(model, pano, type) {
  9674. // 球幕播放图标
  9675. if (type == 'video') {
  9676. if (pano.oldFlagSpot) {
  9677. pano.flagSpot = pano.oldFlagSpot;
  9678. } else if (!pano.flagSpot) {
  9679. var tag = new VideoPanoTag(model, 'flagSpot___' + pano.id, {
  9680. position: pano.position.clone(),
  9681. state: 'videoPanoFlag',
  9682. sid: 'flagSpot___' + pano.id,
  9683. style: 'videoMarker',
  9684. pano
  9685. });
  9686. tag.style = 'videoMarker'; // 球幕图标线
  9687. var line = tag.createMarkLine({
  9688. type: 'flagSpot',
  9689. stemLineLen,
  9690. markerPos: this.position
  9691. });
  9692. line.marker = this;
  9693. tag.rePos(tag.markLine.groundPoint.clone().add(new THREE.Vector3(0, stemLineLen, 0))); //tag.rePos(tag.markLine.position.clone().add(new THREE.Vector3(0, stemLineLen/2, 0)))
  9694. videoPanoTags.push(tag); // 用于animate
  9695. pano.flagSpot = tag;
  9696. if (!this.visible) tag.hide(); //初始化可见性
  9697. }
  9698. }
  9699. }
  9700. }, {
  9701. key: "initAnimate",
  9702. value: function initAnimate() {
  9703. if (animateInited) return;
  9704. player$b.on('update', function () {
  9705. animate();
  9706. });
  9707. animateInited = true;
  9708. }
  9709. }]);
  9710. return Marker;
  9711. }(THREE.Mesh);
  9712. var animateMaterialQuene = [];
  9713. var progress = 0; //let minProgress = 0;
  9714. //let maxProgress = 0;
  9715. var bigCircleProgress = 0;
  9716. var smallCircleProgress0 = -0.12; //间隔
  9717. var smallCircleProgress = smallCircleProgress0;
  9718. var animateInited;
  9719. var speed = 0.0045;
  9720. var noGif = true;
  9721. function animate() {
  9722. for (var i = 0; i < animateMaterialQuene.length; i++) {
  9723. animateMaterialQuene[i].uniforms['progress'].value = progress;
  9724. animateMaterialQuene[i].uniforms['bigCircleProgress'].value = bigCircleProgress;
  9725. animateMaterialQuene[i].uniforms['smallCircleProgress'].value = smallCircleProgress;
  9726. }
  9727. videoPanoTags.forEach(function (tag) {
  9728. return tag.update();
  9729. });
  9730. if (progress > 1) {
  9731. progress = 0;
  9732. }
  9733. progress += speed;
  9734. if (bigCircleProgress > 1.0) {
  9735. if (noGif) {
  9736. //为false的话在别处调控
  9737. bigCircleProgress = 0;
  9738. smallCircleProgress = smallCircleProgress0; //间隔
  9739. }
  9740. } else {
  9741. bigCircleProgress += speed;
  9742. smallCircleProgress += speed;
  9743. }
  9744. }
  9745. var VideoPanoTag = /*#__PURE__*/function (_EventEmitter) {
  9746. _inherits(VideoPanoTag, _EventEmitter);
  9747. var _super2 = _createSuper$1w(VideoPanoTag);
  9748. function VideoPanoTag(model, sid, tagData) {
  9749. var _this2;
  9750. _classCallCheck(this, VideoPanoTag);
  9751. _this2 = _super2.call(this);
  9752. _this2.model = model;
  9753. _this2.sid = sid;
  9754. _this2.floor = null;
  9755. _this2.floors = [];
  9756. _this2.position = new THREE.Vector3().copy(tagData.position); //position最好提到外面,像pano的position一样,因为有的计算函数就是这么用的
  9757. _this2.content = {};
  9758. _this2.initContent(tagData);
  9759. _this2.snapInfo = tagData.snapInfo;
  9760. _this2.style = tagData.style || 'default';
  9761. _this2.color = new THREE.Color().setRGB(0.0, 0.7843137254901961, 0.6862745098039216);
  9762. tagData.color && _this2.color.setStyle(tagData.color);
  9763. _this2.styleImageURL = tagData.styleImageURL;
  9764. _this2.hoverColor = Colors._darken(_this2.content.color, 0.2);
  9765. _this2.animTime = 0;
  9766. _this2.animated = false;
  9767. _this2.openning = 0;
  9768. _this2.openTransition = null;
  9769. _this2.mode = Viewmode$1.PANORAMA;
  9770. _this2.obj3d = null; //THREE.Object3D 类型
  9771. _this2.disc = null; //mesh类型
  9772. _this2.discWorldPosition = null;
  9773. _this2.discScale = 0.06;
  9774. _this2.floorIndex = tagData.floorIndex;
  9775. _this2.visibleTransition = null;
  9776. _this2.hoveringDisc = !1;
  9777. _this2.state = tagData.state;
  9778. _this2.videoPano = tagData.pano;
  9779. _this2.build();
  9780. return _this2;
  9781. }
  9782. _createClass(VideoPanoTag, [{
  9783. key: "initContent",
  9784. value: function initContent(tagData) {
  9785. //和billboard有关
  9786. this.content.description = tagData.description;
  9787. this.content.label = tagData.label;
  9788. this.content.link = tagData.link;
  9789. this.content.outLink = tagData.outLink;
  9790. this.content.color = new THREE.Color().set(tagData.color || Colors.tagDefault); //this.content.floorIndex = tagData.floorIndex || 0;
  9791. this.content.fileName = tagData.fileName || {}; //存储音频视频原文件名
  9792. this.content.fileSrc = tagData.fileSrc || {}; //存储音频视频的完整地址。原先是七牛,现在是阿里云的oss了
  9793. this.content.media = tagData.media || [];
  9794. }
  9795. }, {
  9796. key: "getFloors",
  9797. value: function getFloors() {
  9798. var _this3 = this;
  9799. //根据floor和visiblePanos 得到热点所在的所有可能楼层。 包括原先所在的floor和所有可见点所在楼层。
  9800. this.floors = []; //拥有多楼层的原因: 热点会在tagVisibleOnCurrentFloor来隐藏热点,会使楼道间的热点只在部分位置可见。
  9801. this.visiblePanos && this.visiblePanos.forEach(function (id) {
  9802. if (_this3.model.panos.index[id]) {
  9803. if (!_this3.floors.includes(_this3.model.panos.index[id].floor)) {
  9804. _this3.floors.push(_this3.model.panos.index[id].floor);
  9805. }
  9806. }
  9807. });
  9808. if (this.floor && !this.floors.includes(this.floor)) this.floors.push(this.floor);
  9809. }
  9810. }, {
  9811. key: "rePos",
  9812. value: function rePos(pos) {
  9813. //add by xzw 重新定位置
  9814. this.position.copy(pos);
  9815. this.obj3d.position.copy(pos);
  9816. }
  9817. }, {
  9818. key: "createMarkLine",
  9819. value: function createMarkLine(o) {
  9820. this.markLine = new VideoMarkLine({
  9821. type: o.type,
  9822. stemLineLen: o.stemLineLen,
  9823. markerPos: o.markerPos,
  9824. tag: this,
  9825. model: this.model
  9826. });
  9827. return this.markLine;
  9828. }
  9829. }, {
  9830. key: "build",
  9831. value: function build() {
  9832. this.floor = this.videoPano.floor;
  9833. this.floorIndex = this.floor.floorIndex;
  9834. if (this.floor) {
  9835. this.obj3d = this.buildObject3D();
  9836. this.floor.add(this.obj3d);
  9837. }
  9838. this.getFloors();
  9839. return this;
  9840. }
  9841. }, {
  9842. key: "buildObject3D",
  9843. value: function buildObject3D() {
  9844. var _this4 = this;
  9845. var group = new THREE.Object3D();
  9846. group.position.copy(this.position);
  9847. var config = this.model.$app.config;
  9848. this.animated = true;
  9849. var planeGeo = config.isMobile ? new THREE.PlaneBufferGeometry(2.4, 2.4) : new THREE.PlaneBufferGeometry(1, 1);
  9850. this.disc = new THREE.Mesh(planeGeo, getVideoSpotMat());
  9851. this.disc.layers.set(RenderLayers.PANOMARKERS);
  9852. this.disc.renderOrder = RenderOrder.panoMarker; //tagDisc 不要遮住overlay等
  9853. player$b.on('mode.changing', function (from, to) {
  9854. _this4.disc.renderOrder = to != 'floorplan' ? RenderOrder.panoMarker : 5; //floorplan时需要提高,其他时候需要比透明楼层低
  9855. });
  9856. this.disc.tag = this;
  9857. this.disc.pano = this.videoPano;
  9858. this.disc.name = 'disc';
  9859. group.add(this.disc);
  9860. group.name = 'tagGroup';
  9861. return group;
  9862. }
  9863. }, {
  9864. key: "hide",
  9865. value: function hide(e, t) {
  9866. if (this.hidden) return;else this.hidden = true; // var i = KanKan.Deferred()
  9867. // if (0 === this.disc.material.uniforms.opacity.value && !transitions.isRunning(this.visibleTransition)) return i.resolve().promise()
  9868. // ;(e = e || 0), (t = t || 0), transitions.cancel(this.visibleTransition)
  9869. if (this.markLine) this.markLine.hide(); //add
  9870. //xst
  9871. if (this.disc) {
  9872. this.disc.visible = false;
  9873. }
  9874. }
  9875. }, {
  9876. key: "show",
  9877. value: function show(e, t) {
  9878. if (!this.hidden) return;else this.hidden = false; // var i = KanKan.Deferred()
  9879. // if (this.disc.material.uniforms.opacity.value === 1 && !transitions.isRunning(this.visibleTransition)) return i.resolve().promise()
  9880. // ;(e = e || 0), (t = t || 0), transitions.cancel(this.visibleTransition)
  9881. if (this.markLine) this.markLine.show(); //add
  9882. //xst
  9883. if (this.disc) {
  9884. this.disc.visible = true;
  9885. }
  9886. }
  9887. }, {
  9888. key: "update",
  9889. value: function update() {
  9890. if (!this.disc) return;
  9891. this.discWorldPosition = this.disc.getWorldPosition(new THREE.Vector3());
  9892. this.updateDisc();
  9893. }
  9894. /* 更新disc的大小和朝向
  9895. 朝向: billboard的效果,只需要mesh.quaternion = camera.quaternion
  9896. 大小:在保证距离不变的情况下,要消除屏幕边缘放大的效果,需要结合camera和屏幕(应该和projection有关),如下一顿操作
  9897. 然后再考虑距离,smoothstep化近大远小
  9898. */
  9899. }, {
  9900. key: "updateDisc",
  9901. value: function updateDisc() {
  9902. var mode = this.model.mode;
  9903. var camera = this.model.player.mode == 'floorplan' ? this.model.player.cameraControls.activeControl.camera : this.model.player.camera; //floorplan 时要用到OrthographicCamera
  9904. var u = settings$3.tags.visibility,
  9905. d = settings$3.tags.disc.scale,
  9906. p = mode === Viewmode$1.DOLLHOUSE || mode === Viewmode$1.FLOORPLAN ? settings$3.tags.visibility.visibleDistance : camera.position.distanceTo(this.discWorldPosition); //改 许钟文
  9907. // 只是用来设置obj3d.visible。显隐控制要设置marker
  9908. this.obj3d.visible = 0 !== this.disc.material.opacity && (u.anyDistance || p <= u.visibleDistance || mode === Viewmode$1.TRANSITIONING) && (!u.hideViaFloor || this.tagVisibleOnCurrentFloor(mode)) && (!u.hideOffScreenDisc || !this.offScreen(this.disc, camera)) && (!u.hideOffScreenObject || !this.offScreen(this.obj3d, camera));
  9909. if (this.obj3d.visible && this.disc.visible) {
  9910. //add this.disc.visible
  9911. //this.markLine.stemLine.quaternion.copy(camera.quaternion)
  9912. this.markLine.stemLine.rotation.y = -new THREE.Vector2(this.markLine.stemLine.position.x - camera.position.x, this.markLine.stemLine.position.z - camera.position.z).angle() + Math.PI / 2; //this.disc.quaternion.copy(camera.quaternion)
  9913. var _player = this.model.$app.core.get('Player');
  9914. if (_player.modeTran.split('-')[1] == 'floorplan') {
  9915. this.disc.quaternion.copy(camera.quaternion);
  9916. } else {
  9917. this.disc.lookAt(camera.position); //for video tag 看起来和marker一样有点歪斜、立体点
  9918. } //this.disc.rotation.y = -new THREE.Vector2(this.obj3d.position.x - camera.position.x, this.obj3d.position.z - camera.position.z).angle() + Math.PI / 2
  9919. //scale:
  9920. var scale = math$1.getScaleForConstantSize({
  9921. maxSize: d.maxSize,
  9922. minSize: this.state == 'videoPanoFlag' && mode != Viewmode$1.PANORAMA ? 30 : d.minSize,
  9923. nearBound: d.nearBound,
  9924. farBound: d.farBound,
  9925. camera: camera,
  9926. position: this.discWorldPosition,
  9927. dom: this.model.$app.dom
  9928. });
  9929. var response = 1 + settings$3.tags.disc.scale.responsiveness / 100 * (VideoPanoTag.viewportScale() - 1);
  9930. this.discScale = scale * response;
  9931. try {
  9932. //editor player可能还没有
  9933. if (this.model.player.linkEditor.setTagVisible) {
  9934. //许钟文add 编辑热点可视时放大热点
  9935. this.discScale *= 1.5; // config.isMobile ? 2 : 1.5
  9936. } else if (this.isMeasurePoint) {
  9937. this.discScale *= 0.9;
  9938. } else if (this.model.$app.TagManager.editHandle && this.model.$app.TagManager.editHandle.editing) {
  9939. this.discScale *= 2.5;
  9940. }
  9941. } catch (mode) {}
  9942. this.disc.scale.set(2 * this.discScale, 2 * this.discScale, 2 * this.discScale); //使stem的顶部在圆圈底部
  9943. var circleRadius = this.discScale * 0.95;
  9944. this.markLine.stemLine.scale.y = (stemLineLen - circleRadius) / stemLineLen; //不要覆盖住圆圈
  9945. this.markLine.stemLine.position.copy(this.markLine.stemLine.originPos);
  9946. this.markLine.stemLine.position.y -= circleRadius / 2; // if (this.animated) {
  9947. // this.animTime += 0.016
  9948. // this.disc.material.uniforms['uTime'].value = this.animTime
  9949. // }
  9950. }
  9951. }
  9952. }, {
  9953. key: "tagVisibleOnCurrentFloor",
  9954. value: function tagVisibleOnCurrentFloor(e) {
  9955. return !(e === Viewmode$1.DOLLHOUSE || e === Viewmode$1.FLOORPLAN) || this.model.allFloorsVisible || !!this.floors.find(function (floor) {
  9956. return !floor.hidden;
  9957. });
  9958. } // updateVideoFlagVisible() {
  9959. // if (!this.obj3d.visible || this.model.player.mode != 'dollhouse') return
  9960. // if (this.model.allFloorsVisible && convertTool.ifShelter(this.position, this.model.player, null, null, this.model.currentFloor.floorIndex)) {
  9961. // this.videoPano.marker.visible = false
  9962. // } else {
  9963. // this.videoPano.marker.visible = !!this.videoPano.marker.visibleOri
  9964. // }
  9965. // }
  9966. }], [{
  9967. key: "viewportScale",
  9968. value: function viewportScale() {
  9969. var player = document.getElementsByClassName('player')[0];
  9970. return VideoPanoTag.viewportWidth === player.clientWidth && VideoPanoTag.viewportHeight === player.clientHeight || (VideoPanoTag.viewportWidth = player.clientWidth, VideoPanoTag.viewportHeight = player.clientHeight, VideoPanoTag.currentViewportScale = Math.sqrt(Math.min(VideoPanoTag.viewportWidth, VideoPanoTag.viewportHeight) / settings$3.tags.disc.scale.baseViewportSize)), VideoPanoTag.currentViewportScale;
  9971. }
  9972. }]);
  9973. return VideoPanoTag;
  9974. }(EventEmitter);
  9975. var VideoMarkLine = /*#__PURE__*/function () {
  9976. function VideoMarkLine(o) {
  9977. _classCallCheck(this, VideoMarkLine);
  9978. this.tag = o.tag;
  9979. this.groundPoint = o.groundPoint || o.markerPos; //垂线和地面交点
  9980. // this.stemLine = LineDraw.createLine([o.stemLineLen ? this.groundPoint.clone().add(new THREE.Vector3(0, o.stemLineLen, 0)) : o.tag.position, this.groundPoint], {
  9981. // width: 2,
  9982. // color: o.stemLineColor || '#eee',
  9983. // }) //垂线
  9984. this.stemLine = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.006, o.stemLineLen), getStemMat());
  9985. this.stemLine.position.copy(this.groundPoint.clone().add(new THREE.Vector3(0, o.stemLineLen / 2, 0)));
  9986. this.stemLine.originPos = this.stemLine.position.clone();
  9987. this.stemLine.name = 'markGroup-stemLine';
  9988. this.stemLine.layers.set(RenderLayers.PANOMARKERS);
  9989. this.stemLine.renderOrder = RenderOrder.panoMarker;
  9990. this.tag.obj3d.parent.add(this.stemLine);
  9991. }
  9992. _createClass(VideoMarkLine, [{
  9993. key: "hide",
  9994. value: function hide() {
  9995. this.stemLine.visible = false;
  9996. }
  9997. }, {
  9998. key: "show",
  9999. value: function show() {
  10000. this.stemLine.visible = true;
  10001. }
  10002. }]);
  10003. return VideoMarkLine;
  10004. }(); //闪烁的marker
  10005. var VideoPanoMarkerMaterial = /*#__PURE__*/function (_THREE$RawShaderMater) {
  10006. _inherits(VideoPanoMarkerMaterial, _THREE$RawShaderMater);
  10007. var _super3 = _createSuper$1w(VideoPanoMarkerMaterial);
  10008. function VideoPanoMarkerMaterial() {
  10009. var _this5;
  10010. _classCallCheck(this, VideoPanoMarkerMaterial);
  10011. _this5 = _super3.call(this);
  10012. var u = THREE.UniformsUtils.clone(shaders.videoPanoMarker.uniforms);
  10013. u.map.value = getMarkerTex('normalMarker');
  10014. u.opacity.value = 1;
  10015. _this5.vertexShader = shaders.videoPanoMarker.vertexShader;
  10016. _this5.fragmentShader = shaders.videoPanoMarker.fragmentShader;
  10017. _this5.uniforms = u;
  10018. _this5.transparent = true;
  10019. _this5.depthTest = false; //browser.detectIOS() && (this.defines['useColor2'] = '')
  10020. initOpacityProp(_assertThisInitialized(_this5));
  10021. animateMaterialQuene.push(_assertThisInitialized(_this5));
  10022. return _this5;
  10023. }
  10024. return VideoPanoMarkerMaterial;
  10025. }(THREE.RawShaderMaterial);
  10026. var VideoLineMaterial = /*#__PURE__*/function (_THREE$RawShaderMater2) {
  10027. _inherits(VideoLineMaterial, _THREE$RawShaderMater2);
  10028. var _super4 = _createSuper$1w(VideoLineMaterial);
  10029. function VideoLineMaterial() {
  10030. var _this6;
  10031. _classCallCheck(this, VideoLineMaterial);
  10032. _this6 = _super4.call(this);
  10033. var u = THREE.UniformsUtils.clone(shaders.videoStemLine.uniforms);
  10034. _this6.vertexShader = shaders.videoStemLine.vertexShader, _this6.fragmentShader = shaders.videoStemLine.fragmentShader, _this6.uniforms = u;
  10035. _this6.transparent = true;
  10036. _this6.depthTest = false;
  10037. _this6.side = THREE.DoubleSide;
  10038. animateMaterialQuene.push(_assertThisInitialized(_this6));
  10039. return _this6;
  10040. }
  10041. return VideoLineMaterial;
  10042. }(THREE.RawShaderMaterial);
  10043. /* //视频播放按钮
  10044. class VideoPlayerMaterial extends THREE.RawShaderMaterial {
  10045. constructor() {
  10046. super()
  10047. var u = THREE.UniformsUtils.clone(shaders.tagVideoMarker.uniforms)
  10048. ;(this.vertexShader = shaders.tagVideoMarker.vertexShader), (this.fragmentShader = shaders.tagVideoMarker.fragmentShader), (this.uniforms = u)
  10049. this.transparent = true
  10050. this.depthTest = false
  10051. this.side = THREE.DoubleSide
  10052. this.uniforms.map.value = getMarkerTex('shineMarker')
  10053. animateMaterialQuene.push(this)
  10054. }
  10055. }
  10056. */
  10057. var VideoPlayerMaterial = /*#__PURE__*/function (_THREE$MeshBasicMater) {
  10058. _inherits(VideoPlayerMaterial, _THREE$MeshBasicMater);
  10059. var _super5 = _createSuper$1w(VideoPlayerMaterial);
  10060. function VideoPlayerMaterial() {
  10061. var _this7;
  10062. _classCallCheck(this, VideoPlayerMaterial);
  10063. var map = texture.load(texture.getImageURL('images/videoTag.png'));
  10064. var animateInfo = {
  10065. cellXcount: 6,
  10066. cellYcount: 5,
  10067. voidCount: 0,
  10068. loop: true,
  10069. duration: 1200,
  10070. //动画时长
  10071. delay: 600,
  10072. //延迟
  10073. waitNextTime: 1700 //间隔
  10074. };
  10075. _this7 = _super5.call(this, {
  10076. map,
  10077. transparent: true,
  10078. depthTest: false
  10079. }); //飞出要被模型遮挡
  10080. _this7.animation = common.GifTexDeal.addAnimation(map, _assertThisInitialized(_this7), animateInfo, 0);
  10081. _this7.animation.startCallback = function () {
  10082. bigCircleProgress = 0;
  10083. smallCircleProgress = smallCircleProgress0; //间隔
  10084. };
  10085. noGif = false;
  10086. common.GifTexDeal.start(_this7.animation);
  10087. player$b.on('mode.changing', function (from, to) {
  10088. _this7.depthTest = to != 'floorplan' && to != 'panorama'; //因为即使提高了renderOrder还是会被透明的楼层遮住所以设置一下这个(renderOrder需要比透明楼层低才能不被遮,但又要比当前楼层高,而当前楼层要比透明的高,所以不可能)
  10089. });
  10090. return _this7;
  10091. }
  10092. return VideoPlayerMaterial;
  10093. }(THREE.MeshBasicMaterial);
  10094. var GLCubeFaces$1 = {
  10095. GL_TEXTURE_CUBE_MAP_POSITIVE_X: 0,
  10096. GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1,
  10097. GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 2,
  10098. GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 3,
  10099. GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 4,
  10100. GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 5
  10101. };
  10102. var TileUtils = {};
  10103. TileUtils.TILE_SIZE = 512, TileUtils.FACES_PER_PANO = 6, TileUtils.LocationOnTile = {
  10104. Center: 0,
  10105. UpperLeft: 1,
  10106. UpperRight: 2,
  10107. LowerRight: 3,
  10108. LowerLeft: 4
  10109. }, TileUtils.getTileVector = function () {
  10110. //获取某tile在cube中的方向 direction (向量起点在cube中心,终点在tile图的中心)
  10111. return function (size, tileSize, cubeFace, tileX, tileY, Center, c, dir) {
  10112. //c似乎是缩进百分比
  10113. Center = Center || TileUtils.LocationOnTile.Center; //假设该cube边长为2:
  10114. var u = size / tileSize,
  10115. d = tileX / u;
  10116. tileY = -tileY + (u - 1);
  10117. var p = tileY / u,
  10118. f = tileSize / size,
  10119. g = 2 * f,
  10120. //一个tile的宽度 (乘以2是因为cube边长是2)
  10121. m = g / 2,
  10122. v = 2 * d - 1 + m,
  10123. A = 2 * p - 1 + m;
  10124. switch (Center //计算在tile中指定位置带来的偏移
  10125. ) {
  10126. case TileUtils.LocationOnTile.UpperLeft:
  10127. v -= m, A += m, v += c * g; //似乎是向内缩进
  10128. break;
  10129. case TileUtils.LocationOnTile.UpperRight:
  10130. v += m, A += m, A -= c * g;
  10131. break;
  10132. case TileUtils.LocationOnTile.LowerRight:
  10133. v += m, A -= m, v -= c * g;
  10134. break;
  10135. case TileUtils.LocationOnTile.LowerLeft:
  10136. v -= m, A -= m, A += c * g;
  10137. break;
  10138. case TileUtils.LocationOnTile.Center: //0
  10139. }
  10140. switch (cubeFace) {
  10141. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
  10142. MathLight.setVector(dir, -1, A, -v);
  10143. break;
  10144. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
  10145. MathLight.setVector(dir, 1, A, v);
  10146. break;
  10147. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
  10148. //顶面
  10149. MathLight.setVector(dir, -v, 1, -A);
  10150. break;
  10151. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
  10152. MathLight.setVector(dir, -v, -1, A);
  10153. break;
  10154. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
  10155. MathLight.setVector(dir, -v, A, 1);
  10156. break;
  10157. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
  10158. MathLight.setVector(dir, v, A, -1);
  10159. }
  10160. MathLight.normalize(dir);
  10161. };
  10162. }(), TileUtils.getFaceForTile = function (size, index) {
  10163. //获取该tile在第几个面
  10164. var tileSize = TileUtils.TILE_SIZE;
  10165. size < TileUtils.TILE_SIZE && (tileSize = size);
  10166. var n = Math.floor(size / tileSize),
  10167. sum = n * n; //得每个面tile总数
  10168. return Math.floor(index / sum);
  10169. }, TileUtils.getTileLocation = function (size, t, result) {
  10170. var tileSize = TileUtils.TILE_SIZE;
  10171. size < TileUtils.TILE_SIZE && (tileSize = size);
  10172. var r = TileUtils.getFaceForTile(size, t),
  10173. a = Math.floor(size / tileSize),
  10174. s = a * a,
  10175. l = t - r * s;
  10176. result.tileX = l % a;
  10177. result.tileY = Math.floor(l / a);
  10178. result.face = r;
  10179. result.faceTileIndex = l;
  10180. return result; //add
  10181. }, TileUtils.getTileCountForSize = function (e) {
  10182. if (e <= TileUtils.TILE_SIZE) return TileUtils.FACES_PER_PANO;
  10183. var t = Math.floor(e / TileUtils.TILE_SIZE),
  10184. i = t * t,
  10185. n = i * TileUtils.FACES_PER_PANO;
  10186. return n;
  10187. }, TileUtils.getRelativeDirection = function () {
  10188. var e = new MathLight.Matrix4(),
  10189. t = new MathLight.Quaternion();
  10190. return function (i, n) {
  10191. //i是pano.quaternion, n是camera的direction
  10192. t.copy(i), t.inverse(), e.makeRotationFromQuaternion(t), e.applyToVector3(n), MathLight.normalize(n);
  10193. };
  10194. }(), TileUtils.matchingTilesInDirection = function () {
  10195. var e = new MathLight.Vector3(),
  10196. t = new MathLight.Vector3(0, 0, -1),
  10197. i = new MathLight.Quaternion(),
  10198. n = function n(e, t) {
  10199. e.push({
  10200. face: t.face,
  10201. faceTileIndex: t.faceTileIndex,
  10202. tileX: t.tileX,
  10203. tileY: t.tileY
  10204. });
  10205. },
  10206. a = function () {
  10207. var e = {
  10208. face: -1,
  10209. faceTileIndex: -1,
  10210. tileX: -1,
  10211. tileY: -1
  10212. };
  10213. return function (size, i, r) {
  10214. for (var a = TileUtils.getTileCountForSize(size), s = 0, l = 0; l < a; l++) {
  10215. TileUtils.getTileLocation(size, l, e), i && !i(e) || (s++, r && n(r, e));
  10216. }
  10217. return s;
  10218. };
  10219. }();
  10220. return function (pano, size, dir, hFov, vFov, result) {
  10221. var d = size < TileUtils.TILE_SIZE ? size : TileUtils.TILE_SIZE; //TileUtils.getTileCountForSize(size);
  10222. if (!hFov && !vFov) return a(size, null, result);
  10223. var p = !!vFov;
  10224. vFov = vFov || hFov, vFov = Math.max(0, Math.min(vFov, 360)), hFov = Math.max(0, Math.min(hFov, 360)), MathLight.copyVector(dir, e), TileUtils.getRelativeDirection(pano.quaternion, e);
  10225. if (p) {
  10226. //如果有vFov hFov
  10227. i.setFromUnitVectors(e, t);
  10228. var f = function f(e) {
  10229. return TileUtils.isTileWithinFrustum(size, d, e.face, e.tileX, e.tileY, i, hFov, vFov); //在视野中的
  10230. };
  10231. return a(size, f, result);
  10232. }
  10233. var g = function g(t) {
  10234. //如果仅有hFov
  10235. return TileUtils.isTileWithinFOV(size, d, t.face, t.tileX, t.tileY, e, hFov);
  10236. };
  10237. return a(size, g, result);
  10238. };
  10239. }(), TileUtils.isTileWithinFrustum = function () {
  10240. var e = new MathLight.Vector3(),
  10241. t = 1e-5;
  10242. return function (i, n, a, s, l, c, h, u) {
  10243. for (var d = Math.tan(0.5 * u * MathLight.RADIANS_PER_DEGREE), p = -d, f = Math.tan(0.5 * h * MathLight.RADIANS_PER_DEGREE), g = -f, m = TileUtils.mapFaceToCubemapFace(a), v = 0, A = 0, y = 0, C = 0, E = 0, b = TileUtils.LocationOnTile.Center; b <= TileUtils.LocationOnTile.LowerLeft; b++) {
  10244. TileUtils.getTileVector(i, n, m, s, l, b, 0, e), //get e // size, tileSize, cubeFace, tileX, tileY, Center, c, dir
  10245. MathLight.applyQuaternionToVector(c, e);
  10246. if (e.z >= -t) //似乎是在相机背面
  10247. ;else {
  10248. var w = -1 / e.z,
  10249. _ = e.x * w,
  10250. T = e.y * w;
  10251. T > d ? v++ : T < p && A++, //这四种似乎代表在这个画框之外,如在左、在上、在下、在右
  10252. _ > f ? y++ : _ < g && C++, E++;
  10253. }
  10254. }
  10255. return A !== E && v !== E && y !== E && C !== E; //如果有一项和E相等代表要么是在相机背面要么是tile的四个顶点都画在画布的同一边,所以肯定不在画布上
  10256. };
  10257. }(), TileUtils.isTileWithinFOV = function () {
  10258. var e = new MathLight.Vector3(),
  10259. t = new MathLight.Vector3(0, 1, 0),
  10260. i = new MathLight.Vector3(1, 0, 0);
  10261. return function (panoSize, tileSize, face, tileX, tileY, direction, fov) {
  10262. //direction是作用了pano.quaternion的camera.direction
  10263. var d = TileUtils.mapFaceToCubemapFace(face);
  10264. MathLight.cross(direction, t, i); //get i 好像没用到
  10265. TileUtils.getTileVector(panoSize, tileSize, d, tileX, tileY, TileUtils.LocationOnTile.Center, 0, e);
  10266. if (TileUtils.isWithinFOV(e, direction, fov, null)) //先判断tile中心在不在FOV内
  10267. return !0;
  10268. for (var p = fov / 360, f = Math.floor(1 / p), g = 0, m = 0; m < f; m++) {
  10269. for (var v = TileUtils.LocationOnTile.UpperLeft; v <= TileUtils.LocationOnTile.LowerLeft; v++) {
  10270. if (TileUtils.getTileVector(panoSize, tileSize, d, tileX, tileY, v, g, e), TileUtils.isWithinFOV(e, direction, fov, null)) return !0;
  10271. }
  10272. g += p; //可能是考虑到有可能tile比fov覆盖了fov(虽然一般不可能,除非fov特别小),所以将tile分成若干段,取tile中的点再检测下
  10273. }
  10274. return !1;
  10275. };
  10276. }(), TileUtils.isWithinFOV = function () {
  10277. var e = new MathLight.Vector3(),
  10278. t = new MathLight.Vector3();
  10279. return function (dir, cameraDir, fov, a) {
  10280. if (MathLight.copyVector(dir, t), a) {
  10281. MathLight.copyVector(a, e), MathLight.normalize(e);
  10282. var s = MathLight.dot(e, dir);
  10283. e.x *= s, e.y *= s, e.z *= s, MathLight.subVector(t, e);
  10284. }
  10285. var l = fov / 2 * MathLight.RADIANS_PER_DEGREE,
  10286. c = Math.cos(l),
  10287. h = MathLight.dot(t, cameraDir);
  10288. return h >= c;
  10289. };
  10290. }(), TileUtils.mapFaceToCubemapFace = function () {
  10291. var e = {
  10292. 0: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
  10293. 1: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
  10294. 2: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
  10295. 3: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
  10296. 4: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
  10297. 5: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
  10298. };
  10299. return function (t) {
  10300. return e[t];
  10301. };
  10302. }();
  10303. function _createForOfIteratorHelper$7(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$7(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  10304. function _unsupportedIterableToArray$7(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$7(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$7(o, minLen); }
  10305. function _arrayLikeToArray$7(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  10306. function _createSuper$1v(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1v(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  10307. function _isNativeReflectConstruct$1v() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  10308. var player$a;
  10309. var planeGeo$1 = new THREE.PlaneBufferGeometry(1, 1, 1, 1);
  10310. var TextSprite = /*#__PURE__*/function (_THREE$Object3D) {
  10311. _inherits(TextSprite, _THREE$Object3D);
  10312. var _super = _createSuper$1v(TextSprite);
  10313. function TextSprite() {
  10314. var _this;
  10315. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  10316. _classCallCheck(this, TextSprite);
  10317. _this = _super.call(this);
  10318. var map = new THREE.Texture();
  10319. _this.root = options.root || _assertThisInitialized(_this); //if (options.fixOrient) {
  10320. _this.sprite = new THREE.Mesh(planeGeo$1, new THREE.MeshBasicMaterial({
  10321. map,
  10322. color: 0xffffff,
  10323. transparent: true,
  10324. depthTest: false,
  10325. depthWrite: false
  10326. }));
  10327. /*} else {
  10328. this.sprite = new THREE.Sprite(
  10329. new THREE.SpriteMaterial({
  10330. map,
  10331. color: 0xffffff,
  10332. transparent: true,
  10333. depthTest: false,
  10334. depthWrite: false,
  10335. })
  10336. )
  10337. } */
  10338. _this.add(_this.sprite);
  10339. _this.sprite.renderOrder = options.renderOrder != void 0 ? options.renderOrder : 2;
  10340. _this.fontWeight = options.fontWeight == void 0 ?
  10341. /* 'Bold' */
  10342. '' : options.fontWeight;
  10343. _this.rectBorderThick = options.rectBorderThick || 0;
  10344. _this.textBorderThick = options.textBorderThick || 0;
  10345. _this.fontface = 'Arial';
  10346. _this.fontsize = options.fontsize || 16;
  10347. _this.textBorderColor = options.textBorderColor || {
  10348. r: 0,
  10349. g: 0,
  10350. b: 0,
  10351. a: 0.0
  10352. };
  10353. _this.backgroundColor = options.backgroundColor || {
  10354. r: 255,
  10355. g: 255,
  10356. b: 255,
  10357. a: 1.0
  10358. };
  10359. _this.textColor = options.textColor || {
  10360. r: 0,
  10361. g: 0,
  10362. b: 0,
  10363. a: 1.0
  10364. };
  10365. _this.borderColor = options.borderColor || {
  10366. r: 0,
  10367. g: 0,
  10368. b: 0,
  10369. a: 0.0
  10370. };
  10371. _this.borderRadius = options.borderRadius == void 0 ? 6 : options.borderRadius;
  10372. _this.margin = options.margin;
  10373. _this.textshadowColor = options.textshadowColor;
  10374. if (options.text != void 0) _this.setText(options.text);
  10375. _this.name = options.name;
  10376. _this.sizeInfo = options.sizeInfo; //this.setText(text);
  10377. player$a = options.player;
  10378. _this.addEventListener('dispose', _this.dispose.bind(_assertThisInitialized(_this)));
  10379. _this.fixOrient = options.fixOrient;
  10380. _this.events = {
  10381. updatePose: _this.updatePose.bind(_assertThisInitialized(_this))
  10382. };
  10383. options.player.on('update', _this.events.updatePose);
  10384. _this.addEventListener('isVisible', function (e) {
  10385. if (e.visible) {
  10386. _this.updatePose();
  10387. }
  10388. });
  10389. _this.updatePose();
  10390. return _this;
  10391. }
  10392. _createClass(TextSprite, [{
  10393. key: "updatePose",
  10394. value: function updatePose() {
  10395. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  10396. _ref$lastFrameChanged = _ref.lastFrameChanged,
  10397. lastFrameChanged = _ref$lastFrameChanged === void 0 ? true : _ref$lastFrameChanged;
  10398. if (lastFrameChanged) this.needsUpdate = true;
  10399. if (!common.realVisible(this) || !this.needsUpdate) return;
  10400. this.needsUpdate = false;
  10401. var camera = player$a.mode == 'floorplan' ? player$a.cameraControls.activeControl.camera : player$a.camera; //floorplan 时要用到OrthographicCamera
  10402. if (!this.fixOrient) {
  10403. var parentQua = this.root.parent.getWorldQuaternion(new THREE.Quaternion());
  10404. this.root.quaternion.multiplyQuaternions(parentQua.invert(), camera.quaternion); //乘上parentQua.invert()是为了中和掉父结点的qua,使只剩下camera.quaternion
  10405. }
  10406. if (this.sizeInfo) {
  10407. var _player$cameraControl;
  10408. var s = math$1.getScaleForConstantSize(Object.assign({
  10409. camera: ((_player$cameraControl = player$a.cameraControls.activeControl) === null || _player$cameraControl === void 0 ? void 0 : _player$cameraControl.camera) || player$a.cameraControls.cameras.panorama,
  10410. dom: player$a.domElement
  10411. }, this.sizeInfo, {
  10412. farBound: player$a.mode == 'floorplan' ? this.sizeInfo.farBoundPlan || this.sizeInfo.farBound : this.sizeInfo.farBound,
  10413. position: this.root.getWorldPosition(new THREE.Vector3())
  10414. }));
  10415. this.scale.set(s, s, s);
  10416. }
  10417. }
  10418. }, {
  10419. key: "setText",
  10420. value: function setText(text) {
  10421. if (this.text !== text) {
  10422. if (!(text instanceof Array)) {
  10423. this.text = [text + ''];
  10424. } else this.text = text;
  10425. this.updateTexture();
  10426. this.needsUpdate = true;
  10427. }
  10428. }
  10429. }, {
  10430. key: "setPos",
  10431. value: function setPos(pos) {
  10432. this.position.copy(pos);
  10433. this.needsUpdate = true; //updatePose
  10434. }
  10435. }, {
  10436. key: "setTextColor",
  10437. value: function setTextColor(color) {
  10438. this.textColor = color;
  10439. this.updateTexture();
  10440. }
  10441. }, {
  10442. key: "setBorderColor",
  10443. value: function setBorderColor(color) {
  10444. this.borderColor = color;
  10445. this.updateTexture();
  10446. }
  10447. }, {
  10448. key: "setBackgroundColor",
  10449. value: function setBackgroundColor(color) {
  10450. this.backgroundColor = color;
  10451. this.updateTexture();
  10452. }
  10453. }, {
  10454. key: "setVisible",
  10455. value: function setVisible(v) {
  10456. this.visible = v;
  10457. }
  10458. }, {
  10459. key: "setUniforms",
  10460. value: function setUniforms(name, value) {
  10461. this.sprite.setUniforms(name, value);
  10462. }
  10463. }, {
  10464. key: "updateTexture",
  10465. value: function updateTexture() {
  10466. var canvas = document.createElement('canvas');
  10467. var context = canvas.getContext('2d');
  10468. context.font = this.fontWeight + ' ' + this.fontsize + 'px ' + this.fontface; //context["font-weight"] = 100; //语法与 CSS font 属性相同。
  10469. // get size data (height depends only on font size)
  10470. //this.text = 'f 啊啊啊 jg'
  10471. var textMaxWidth = 0,
  10472. infos = [];
  10473. var _iterator = _createForOfIteratorHelper$7(this.text),
  10474. _step;
  10475. try {
  10476. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  10477. var text = _step.value;
  10478. var metrics = context.measureText(text);
  10479. var textWidth = metrics.width;
  10480. infos.push(metrics);
  10481. textMaxWidth = Math.max(textMaxWidth, textWidth);
  10482. }
  10483. } catch (err) {
  10484. _iterator.e(err);
  10485. } finally {
  10486. _iterator.f();
  10487. }
  10488. var margin = this.margin || new THREE.Vector2(this.fontsize, Math.max(this.fontsize * 0.4, 10));
  10489. var lineSpace = (this.fontsize + margin.y) * 0.5;
  10490. var spriteWidth = 2 * margin.x + textMaxWidth + 2 * this.rectBorderThick;
  10491. var spriteHeight = 2 * margin.y + this.fontsize * this.text.length + 2 * this.rectBorderThick + lineSpace * (this.text.length - 1);
  10492. context.canvas.width = spriteWidth;
  10493. context.canvas.height = spriteHeight;
  10494. context.font = this.fontWeight + ' ' + this.fontsize + 'px ' + this.fontface;
  10495. var expand = Math.max(1, Math.pow(this.fontsize / 12, 1.4)); // 针对英文大部分在baseLine之上所以降低一点,或者可以识别当不包含jgqp时才加这个值
  10496. //canvas原点在左上角
  10497. context.textBaseline = 'alphabetic'; // "middle" //设置文字基线。当起点y设置为0时,只有该线以下的部分被绘制出来。middle时文字显示一半(但是对该字体所有字的一半,有的字是不一定显示一半的,尤其汉字),alphabetic时是英文字母的那条基线。
  10498. // border color
  10499. context.strokeStyle = 'rgba(' + this.borderColor.r + ',' + this.borderColor.g + ',' + this.borderColor.b + ',' + this.borderColor.a + ')';
  10500. context.lineWidth = this.rectBorderThick; // background color
  10501. context.fillStyle = 'rgba(' + this.backgroundColor.r + ',' + this.backgroundColor.g + ',' + this.backgroundColor.b + ',' + this.backgroundColor.a + ')';
  10502. this.roundRect(context, this.rectBorderThick / 2, this.rectBorderThick / 2, spriteWidth - this.rectBorderThick, spriteHeight - this.rectBorderThick, this.borderRadius);
  10503. context.fillStyle = 'rgba(' + this.textColor.r + ',' + this.textColor.g + ',' + this.textColor.b + ',' + this.textColor.a + ')';
  10504. var y = margin.y;
  10505. for (var i = 0; i < this.text.length; i++) {
  10506. //let actualHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent // 当前文本字符串在这个字体下用的实际高度
  10507. //文字y向距离从textBaseline向上算
  10508. var actualBoundingBoxAscent = infos[i].actualBoundingBoxAscent == void 0 ? this.fontsize * 0.8 : infos[i].actualBoundingBoxAscent; //有的流览器没有。只能大概给一个
  10509. y += actualBoundingBoxAscent + expand; //console.log(actualBoundingBoxAscent)
  10510. //console.log(this.text, 'y' , y, 'actualBoundingBoxAscent', metrics.actualBoundingBoxAscent,'expand',expand )
  10511. var textLeftSpace = (textMaxWidth - infos[i].width) / 2;
  10512. var x = this.rectBorderThick + margin.x + textLeftSpace; // text color
  10513. if (this.textBorderThick) {
  10514. context.strokeStyle = 'rgba(' + this.textBorderColor.r + ',' + this.textBorderColor.g + ',' + this.textBorderColor.b + ',' + this.textBorderColor.a + ')';
  10515. context.lineWidth = this.textBorderThick;
  10516. context.strokeText(this.text[i], x, y);
  10517. }
  10518. if (this.textshadowColor) {
  10519. context.shadowOffsetX = 0;
  10520. context.shadowOffsetY = 0;
  10521. context.shadowColor = this.textshadowColor;
  10522. context.shadowBlur = 12;
  10523. }
  10524. context.fillText(this.text[i], x, y);
  10525. y += lineSpace;
  10526. }
  10527. var texture = new THREE.Texture(canvas);
  10528. texture.minFilter = THREE.LinearFilter;
  10529. texture.magFilter = THREE.LinearFilter;
  10530. texture.anisotropy = 4;
  10531. texture.needsUpdate = true; //this.material.needsUpdate = true;
  10532. if (this.sprite.material.map) {
  10533. this.sprite.material.map.dispose();
  10534. }
  10535. this.sprite.material.map = texture;
  10536. this.sprite.scale.set(spriteWidth * 0.01, spriteHeight * 0.01, 1.0);
  10537. }
  10538. }, {
  10539. key: "roundRect",
  10540. value: function roundRect(ctx, x, y, w, h, r) {
  10541. ctx.beginPath();
  10542. ctx.moveTo(x + r, y);
  10543. ctx.lineTo(x + w - r, y);
  10544. ctx.arcTo(x + w, y, x + w, y + r, r); //圆弧。前四个参数同quadraticCurveTo
  10545. //ctx.quadraticCurveTo(x + w, y, x + w, y + r); //二次贝塞尔曲线需要两个点。第一个点是用于二次贝塞尔计算中的控制点,第二个点是曲线的结束点。
  10546. ctx.lineTo(x + w, y + h - r);
  10547. ctx.arcTo(x + w, y + h, x + w - r, y + h, r);
  10548. ctx.lineTo(x + r, y + h);
  10549. ctx.arcTo(x, y + h, x, y + h - r, r);
  10550. ctx.lineTo(x, y + r);
  10551. ctx.arcTo(x, y, x + r, y, r);
  10552. ctx.closePath();
  10553. ctx.fill();
  10554. ctx.stroke();
  10555. }
  10556. }, {
  10557. key: "dispose",
  10558. value: function dispose() {
  10559. this.sprite.material.map.dispose();
  10560. this.sprite.material.dispose();
  10561. this.parent && this.parent.remove(this);
  10562. this.sprite.dispatchEvent({
  10563. type: 'dispose'
  10564. });
  10565. this._listeners = [];
  10566. this.events.updatePos && options.player.off('update', this.events.updatePose);
  10567. }
  10568. }]);
  10569. return TextSprite;
  10570. }(THREE.Object3D);
  10571. var Vectors$1 = {
  10572. UP: new THREE.Vector3(0, 1, 0),
  10573. DOWN: new THREE.Vector3(0, -1, 0),
  10574. LEFT: new THREE.Vector3(-1, 0, 0),
  10575. RIGHT: new THREE.Vector3(1, 0, 0),
  10576. FORWARD: new THREE.Vector3(0, 0, -1),
  10577. BACK: new THREE.Vector3(0, 0, 1),
  10578. ZERO: new THREE.Vector3(0, 0, 0)
  10579. };
  10580. function _createSuper$1u(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1u(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  10581. function _isNativeReflectConstruct$1u() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  10582. var rot90 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), -Math.PI / 2);
  10583. var labelProp$1 = {
  10584. backgroundColor: {
  10585. r: 0,
  10586. g: 0,
  10587. b: 0,
  10588. a: 0
  10589. },
  10590. textColor: {
  10591. r: 255,
  10592. g: 255,
  10593. b: 255,
  10594. a: 1
  10595. },
  10596. //textBorderColor:{r:30 , g:30, b: 30, a: 1 },
  10597. //textBorderThick:3,
  10598. //textshadowColor: '#888',
  10599. fixOrient: true,
  10600. renderOrder: RenderOrder.panoMarker,
  10601. //panoLabel,
  10602. fontsize: 30
  10603. };
  10604. var labelProp2 = {
  10605. backgroundColor: {
  10606. r: 255,
  10607. g: 255,
  10608. b: 255,
  10609. a: 0.4
  10610. },
  10611. textColor: {
  10612. r: 0,
  10613. g: 0,
  10614. b: 0,
  10615. a: 1
  10616. },
  10617. borderRadius: 15,
  10618. renderOrder: RenderOrder.panoMarker
  10619. }; // 显示点位
  10620. var addLabel$2 = browser$1.urlHasValue('panoLabel');
  10621. var Panorama = /*#__PURE__*/function (_EventEmitter) {
  10622. _inherits(Panorama, _EventEmitter);
  10623. var _super = _createSuper$1u(Panorama);
  10624. function Panorama($app, sweepuuid, sweepLocation, videoInfo, supportsTiles) {
  10625. var _this;
  10626. _classCallCheck(this, Panorama);
  10627. _this = _super.call(this);
  10628. _this.raycastToFindFloor = function () {
  10629. var e = [new THREE.Vector3(0, -1, 0), new THREE.Vector3(1, -1, 0), new THREE.Vector3(0, -1, 1), new THREE.Vector3(-1, -1, 0), new THREE.Vector3(0, -1, -1), new THREE.Vector3(1, 0, 0), new THREE.Vector3(0, 0, 1), new THREE.Vector3(-1, 0, 0), new THREE.Vector3(0, 0, -1)];
  10630. return function () {
  10631. //logger.warn("Performance warning: Raycasting to find floor index");
  10632. for (var t = 0; t < e.length; t++) {
  10633. var i = new THREE.Raycaster(this.position.clone(), e[t].clone()),
  10634. n = i.intersectObjects(this.model.colliders);
  10635. if (n.length) return n[0].object.parent.floor;
  10636. }
  10637. return null;
  10638. };
  10639. }();
  10640. _this.findNeighourPanos = function () {
  10641. return this.model.panos.setNeighbour(this.id, this.id, !1), this.model.panos.forEach(function (e) {
  10642. if (e !== this && (!this.model.panos.neighbourMap[this.id] || void 0 === this.model.panos.neighbourMap[this.id][e.id])) {
  10643. var t = this.position.distanceTo(e.position);
  10644. if (t > settings$3.panoramaNeighbourMaxDistance) return this.model.panos.setNeighbour(this, e, !1), void Panorama.raycastsSkipped++;
  10645. var i = e.position.clone().sub(this.position).normalize(),
  10646. o = new THREE.Raycaster(this.position, i.clone(), 0, t),
  10647. s = o.intersectObjects(this.model.colliders);
  10648. Panorama.raycastsDone++, this.model.panos.setNeighbour(this, e, 0 === s.length), settings$3.showNeighbourRaycasts && (s.length ? this.floor.model.add(new THREE.ArrowHelper(i, this.position, s[0].distance, 16711680)) : this.floor.model.add(new THREE.ArrowHelper(i, this.position, t, 16777215, 0, 0)));
  10649. }
  10650. }.bind(this)), this.model.panos.neighbourMap[this.id];
  10651. };
  10652. _this.enter = function () {
  10653. /* var e = null
  10654. return function () {
  10655. this.setZoomed(!1),
  10656. this.emit('enter', {
  10657. oldPano: e,
  10658. newPano: this,
  10659. }),
  10660. (e = this)
  10661. } */
  10662. var old = null;
  10663. return function () {
  10664. this.setZoomed(!1), this.emit(PanoramaEvents.Enter, old, this), old = this;
  10665. this.model.setHighMap(this); //add
  10666. this.model.dispatchEvent({
  10667. type: 'panoEntered'
  10668. });
  10669. };
  10670. }();
  10671. _this.loadTiledPano = function () {
  10672. var downloaded = {},
  10673. eventAdded = {},
  10674. latestPartialRequest = {}; //每个pano对应一组这些
  10675. return function (size, dir, fov, o, a, s) {
  10676. null !== o && void 0 !== o || (o = !0), null !== a && void 0 !== a || (a = !0);
  10677. var l = this.getWaitDeferred(size),
  10678. c = l.deferred,
  10679. h = null,
  10680. u = null;
  10681. fov && ('number' == typeof fov ? h = fov : (h = fov.hFov, u = fov.vFov));
  10682. if (!this.isLoaded(size)) {
  10683. //console.log('开始加载贴图', this.id, size )
  10684. if (!l.active) {
  10685. l.active = !0;
  10686. var name = this.id + ':' + size;
  10687. downloaded[name] = downloaded[name] || [];
  10688. /*
  10689. this.downloaded = downloaded
  10690. this.latestPartialRequest = latestPartialRequest
  10691. */
  10692. latestPartialRequest[name] = null;
  10693. if (fov) {
  10694. var tileArr = []; //add
  10695. var d = TileUtils.matchingTilesInDirection(this, size, dir, h, u, tileArr);
  10696. latestPartialRequest[name] = tileArr;
  10697. downloaded[name].forEach(function (e) {
  10698. var item = latestPartialRequest[name].find(function (a) {
  10699. return e.faceTileIndex == a.faceTileIndex && e.face == a.face;
  10700. });
  10701. if (item) {
  10702. item.loaded = true;
  10703. }
  10704. });
  10705. if (!latestPartialRequest[name].some(function (e) {
  10706. return !e.loaded;
  10707. })) {
  10708. //所需要的全部加载成功
  10709. //let total = TileUtils.getTileCountForSize(size)
  10710. //this.onPanoRendered(this.id, size, total, !0);
  10711. c.resolve(size
  10712. /* , total */
  10713. );
  10714. this.resetWaitDeferred(size); //console.log('该部分早已经加载好了'+size, this.id)
  10715. latestPartialRequest[name] = null;
  10716. }
  10717. logger$1.info('Loading partial pano: ' + this.id + ' with ' + d + ' tiles');
  10718. }
  10719. if (!eventAdded[this.id]) {
  10720. eventAdded[this.id] = !0;
  10721. this.on(PanoramaEvents.LoadComplete, function (e, t) {
  10722. //本次任务全部加载完毕
  10723. //console.warn('点位(可能部分)下载完成 ', 'id:' + this.id, 'count:' + t)
  10724. var i = this.getWaitDeferred(e).deferred; //"pending"为还未完成
  10725. i && 'pending' === i.state() && this.highestPartialTileRenderOpCompleted >= e && (i.resolve(e, t), this.resetWaitDeferred(e)); //恢复active为false
  10726. }.bind(this));
  10727. this.on(PanoramaEvents.LoadFailed, function (e) {
  10728. var t = this.getWaitDeferred(e).deferred;
  10729. t && 'pending' === t.state() && this.highestPartialTileRenderOpCompleted >= e && (t.reject(e), this.resetWaitDeferred(e)); //恢复active为false
  10730. }.bind(this));
  10731. this.on(PanoramaEvents.TileLoaded, function (size, tileIndex, total) {
  10732. //每张加载完时
  10733. //size == 512 && console.log('tileLoaded', 'id:' + this.id, 'size:' + size, 'index:' + tileIndex)
  10734. var name = this.id + ':' + size;
  10735. downloaded[name] = downloaded[name] || []; //不是所有的加载都是从loadTiledPano获取的所以会有未定义的情况
  10736. var _TileUtils$getTileLoc = TileUtils.getTileLocation(size, tileIndex, {}),
  10737. faceTileIndex = _TileUtils$getTileLoc.faceTileIndex,
  10738. face = _TileUtils$getTileLoc.face;
  10739. downloaded[name].push({
  10740. faceTileIndex,
  10741. face
  10742. });
  10743. var r = this.getWaitDeferred(size).deferred;
  10744. if (r && 'pending' === r.state()) {
  10745. r.notify(size, tileIndex, total);
  10746. if (latestPartialRequest[name]) {
  10747. var item = latestPartialRequest[name].find(function (e) {
  10748. return e.faceTileIndex == faceTileIndex && e.face == face;
  10749. });
  10750. item && (item.loaded = true);
  10751. if (!latestPartialRequest[name].some(function (e) {
  10752. return !e.loaded;
  10753. })) {
  10754. //所需要的局部tiles全部加载成功
  10755. this.onPanoRendered(this.id, size, total, !0); //onPanoRendered还会触发 PanoramaEvents.LoadComplete
  10756. r.resolve(size, total);
  10757. this.resetWaitDeferred(size); //console.log('该部分加载好了'+size, this.id)
  10758. latestPartialRequest[name] = null;
  10759. }
  10760. }
  10761. }
  10762. }.bind(this));
  10763. }
  10764. }
  10765. this.tileDownloader.clearForceQueue();
  10766. this.tileDownloader.forceQueueTilesForPano(this, size, dir, h, u, s);
  10767. var quality = this.curTileQuality || this.qualityManager.getMaxNavPanoSize(); //xzw: add quality
  10768. this.tiledPanoRenderTarget = this.panoRenderer.activateTiledPano(this, quality, o);
  10769. this.panoRenderer.renderPanoTiles(this.id, dir, a, null, quality);
  10770. } else {
  10771. //console.log('早已经全加载好了' + size, this.id)
  10772. c.resolve(size);
  10773. }
  10774. return c.promise();
  10775. };
  10776. }();
  10777. _this.id = sweepuuid;
  10778. _this.panoType = sweepLocation.panoType; //标记特殊 如 'assistant'校准热点时的相机协助点 '360view' 独立全景
  10779. //alignmentType是用来标记户外的拍摄点是否校准了,这个数据存放在vision.modeldata里,我们四维看看没有这个数据
  10780. //UNKNOWN = 0;ALIGNED = 1;UNALIGNED = 2;MANUALLY_PLACED = 3;
  10781. //this.alignmentType = sweepLocation.alignmentType || AlignmentType.ALIGNED;
  10782. _this.neighbourUUIDs = sweepLocation.neighbours || []; //null
  10783. _this.neighbourPanos = null;
  10784. _this.floor = null;
  10785. _this.floorIndex = sweepLocation.subgroup || 0;
  10786. _this.failedLoadingAt = 0;
  10787. _this.maxLoadRetries = 4;
  10788. _this.origin = sweepLocation.position.clone(); //this.position = this.alignmentType === AlignmentType.UNALIGNED ? new THREE.Vector3(0,-5,0) : sweepLocation.position.clone();
  10789. _this.position = sweepLocation.position.clone();
  10790. _this.quaternion = sweepLocation.quaternion.clone();
  10791. _this.appId = sweepLocation.index + 1;
  10792. _this.$app = $app;
  10793. _this.model = _this.$app.core.get('Player').model;
  10794. /*
  10795. this.skyboxMesh = new THREE.Mesh(settings.sphereBufferGeometry) //skyboxMesh飞出后能表示当前position的小球
  10796. this.skyboxMesh.position.copy(this.position)
  10797. this.skyboxMesh.name = 'skybox'
  10798. */
  10799. _this.debugColor = new THREE.Color().setHSL(0.06 + 0.53 * Math.random(), 0.8 + 0.2 * Math.random(), 0.5 + 0.2 * Math.random());
  10800. _this.floorPosition = sweepLocation.puck ? sweepLocation.puck.clone() : null;
  10801. _this.marker = null; //许钟文:
  10802. _this.noBlockPanos = []; //不穿墙 sweepLocation.noBlocks,//算法很不准,不用了
  10803. _this.blocks = []; //会导致穿墙的mesh
  10804. _this.seeMarkers = sweepLocation.seeMarkers;
  10805. _this.tiled = sweepLocation.tiled != void 0 ? sweepLocation.tiled : _this.model.supportsTiles;
  10806. if (_this.isAligned()) {
  10807. _this.marker = new Marker(_assertThisInitialized(_this));
  10808. }
  10809. var rot90qua = new THREE.Quaternion().multiplyQuaternions(_this.quaternion, rot90); //改 为球目全景照片而改
  10810. var rot90Matrix = new THREE.Matrix4().compose(_this.position, rot90qua, new THREE.Vector3(1, 1, 1)); //转90度后的
  10811. if (_this.tiled) {
  10812. /*var quaternion = new THREE.Quaternion().multiplyQuaternions(this.quaternion, rot90) //改 为球目全景照片而改
  10813. this.skyboxMesh.quaternion.copy(quaternion)
  10814. this.skyboxMesh.updateMatrix()
  10815. this.skyboxMesh.updateMatrixWorld()
  10816. this.rot90Matrix = this.skyboxMesh.matrixWorld.clone()
  10817. */
  10818. //this.panoMatrix = new THREE.Matrix4().makeRotationFromQuaternion(this.quaternion)
  10819. _this.rot90Matrix = rot90Matrix; // 给热点校准用 因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
  10820. _this.matrixWorld = new THREE.Matrix4().compose(_this.position, _this.quaternion, new THREE.Vector3(1, 1, 1));
  10821. } else {
  10822. _this.solidSkybox = new THREE.Texture([null, null, null, null, null, null]);
  10823. _this.solidSkybox.flipY = !1;
  10824. if (settings$3.minimalMemoryMode) {
  10825. _this.solidSkybox.minFilter = THREE.LinearFilter;
  10826. _this.solidSkybox.magFilter = THREE.LinearFilter;
  10827. _this.solidSkybox.generateMipmaps = !1;
  10828. } //-------许钟文-----全景贴图的quaternion不同-----
  10829. /* var quaternion = sweepLocation.quaternion.clone()
  10830. //var rot90 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,1,0), -Math.PI/2);
  10831. this.quaternion = new THREE.Quaternion().multiplyQuaternions(quaternion, rot90) //改 为球目全景照片而改
  10832. */
  10833. _this.quaternion = rot90qua;
  10834. _this.matrixWorld = rot90Matrix;
  10835. }
  10836. /* this.skyboxMesh.material.color = new THREE.Color(1, 1, 1)
  10837. this.skyboxMesh.quaternion.copy(this.quaternion)
  10838. this.skyboxMesh.name = 'skybox'
  10839. this.skyboxMesh.visible = !1
  10840. this.skyboxMesh.updateMatrix()
  10841. this.skyboxMesh.updateMatrixWorld() */
  10842. _this.zoomed = !1;
  10843. _this.panoRenderer = null;
  10844. _this.qualityManager = null;
  10845. _this.tileDownloader = null;
  10846. _this.tiledPanoRenderTarget = null;
  10847. _this.resolutionPromise = {};
  10848. _this.minimumTiledPanoLoaded = !1;
  10849. _this.highestPartialTileRenderOpCompleted = 0;
  10850. _this.highestFullTileRenderOpCompleted = 0;
  10851. _this.shouldRedrawOnBaseLoaded = !1;
  10852. _this.lockUntilRenderingComplete = !1;
  10853. if (videoInfo) {
  10854. _this.hasVideo = true; //是否有球幕视频
  10855. _this.videoInfo = videoInfo;
  10856. } else {
  10857. _this.hasVideo = false; //是否有球幕视频
  10858. }
  10859. _this.panoVideo = false; //是否有去绿布视频
  10860. /* settings.colorMarkerOnLoad && this.on('load', function () {
  10861. this.marker.material.color.set(65280)
  10862. }) */
  10863. _this.filterEffect = {
  10864. brightness: 0,
  10865. contrast: 0,
  10866. saturation: 0,
  10867. temperature: 0
  10868. };
  10869. return _this;
  10870. }
  10871. _createClass(Panorama, [{
  10872. key: "hasFilter",
  10873. get: function get() {
  10874. var _ref = this.$app.FilterManager.filterTemp[this.id] || this.filterEffect,
  10875. brightness = _ref.brightness,
  10876. contrast = _ref.contrast,
  10877. saturation = _ref.saturation,
  10878. temperature = _ref.temperature;
  10879. return brightness !== 0 || contrast !== 0 || saturation !== 0 || temperature !== 0;
  10880. }
  10881. }, {
  10882. key: "exit",
  10883. value: function exit() {
  10884. //console.log('exit', this.id)
  10885. if (this.tiled) {
  10886. this.clearWaitDeferreds();
  10887. this.minimumTiledPanoLoaded = !1;
  10888. this.tiledPanoRenderTarget = null;
  10889. this.setZoomed(!1);
  10890. this.panoRenderer.deactivateTiledPano(this);
  10891. this.highestPartialTileRenderOpCompleted = 0;
  10892. this.highestFullTileRenderOpCompleted = 0;
  10893. } else {
  10894. if (!this.useAtScreenB) {
  10895. this.solidSkybox.dispose();
  10896. this.solidSkybox.loaded = !1;
  10897. this.solidSkybox.version = 0;
  10898. }
  10899. }
  10900. this.emit('exit');
  10901. }
  10902. }, {
  10903. key: "hoverOn",
  10904. value: function hoverOn(e) {
  10905. if (
  10906. /* (this.hasVideo && this.panoVideoRenderer.ifEnable()) || */
  10907. settings$3[e].markerOpacityOnHover == 0 || this.$app.core.get('Player').locked) return;
  10908. if (this.marker) {
  10909. transitions$1.start(lerp.property(this.marker.material, 'opacity', settings$3[e].markerOpacityOnHover), 250);
  10910. }
  10911. }
  10912. }, {
  10913. key: "hoverOff",
  10914. value: function hoverOff(e) {
  10915. if (
  10916. /* (this.hasVideo && this.panoVideoRenderer.ifEnable()) || */
  10917. settings$3[e].markerOpacity == 0 || this.$app.core.get('Player').locked) return;
  10918. this.marker && transitions$1.start(lerp.property(this.marker.material, 'opacity', settings$3[e].markerOpacity), 250);
  10919. }
  10920. }, {
  10921. key: "build1",
  10922. value: function build1() {
  10923. this.floor = this.floor || this.model.floors.get(this.floorIndex) || this.raycastToFindFloor() || this.model.floors.list[0]; //this.model.getFloorAtPoint(this.position)
  10924. this.floorIndex = this.floor.floorIndex; //xzw add 2023.12.28 否则wallManager错的楼层获取的错的data
  10925. this.floor.addPano(this);
  10926. this.floorPosition = this.floorPosition || this.raycastFloorPosition();
  10927. this.neighbourPanos = this.neighbourPanos || this.findNeighourPanos();
  10928. if (settings$3.colorMarkerByFloor && this.marker) {
  10929. this.marker.material.color.set(this.floor.debugColor);
  10930. }
  10931. }
  10932. }, {
  10933. key: "build2",
  10934. value: function build2() {
  10935. var _this2 = this;
  10936. this.floorPosition = this.floorPosition || this.interpolateFloorPosition();
  10937. this.height = this.position.distanceTo(this.floorPosition);
  10938. this.placeMarker();
  10939. if (this.isAligned()) {
  10940. this.$app.config.view || this.addLabel();
  10941. setTimeout(function () {
  10942. addLabel$2 && _this2.addLabel2();
  10943. }, 1);
  10944. }
  10945. }
  10946. }, {
  10947. key: "placeMarker",
  10948. value: function placeMarker() {
  10949. if (this.marker) {
  10950. this.marker.position.copy(this.floorPosition);
  10951. this.marker.position.y += 0.01;
  10952. this.marker.lookAt(new THREE.Vector3(0, 1, 0).add(this.marker.position));
  10953. }
  10954. }
  10955. }, {
  10956. key: "attachToPanoRenderer",
  10957. value: function attachToPanoRenderer(panoRenderer) {
  10958. this.panoRenderer = panoRenderer;
  10959. this.panoRenderer.on(PanoRendererEvents.TileRenderSuccess, this.onTileRendered.bind(this));
  10960. this.panoRenderer.on(PanoRendererEvents.PanoRenderComplete, this.onPanoRendered.bind(this));
  10961. this.panoRenderer.on(PanoRendererEvents.TileRenderFailure, this.onTileRenderFail.bind(this));
  10962. this.panoRenderer.on(PanoRendererEvents.UploadAttemptedForAllTiles, this.onUploadAttemptedForAllTiles.bind(this));
  10963. }
  10964. }, {
  10965. key: "updateMakerStyle",
  10966. value: function updateMakerStyle(type) {
  10967. if (!this.marker) return;
  10968. if (type == 'animate') {
  10969. this.marker.updateStyle(this.model, 'animate', this);
  10970. } else if (this.hasVideo && this.panoVideoRenderer.ifEnable() || this.panoVideo) {
  10971. this.marker.updateStyle(this.model, 'video', this);
  10972. } else {
  10973. this.marker.updateStyle(this.model, 'normal', this);
  10974. }
  10975. }
  10976. /* updateMarkerVisible(ifShow, player) {
  10977. //video
  10978. if (!this.flagSpot) return
  10979. if (!this.isAligned()) return
  10980. // 强制隐藏
  10981. if (!ifShow) {
  10982. this.marker.visible = false
  10983. return
  10984. }
  10985. // 漫游可行时要全部显示
  10986. if (player.linkEditor && player.linkEditor.setPanoVisible) {
  10987. this.marker.visible = true
  10988. return
  10989. }
  10990. // 没有邻居点时隐藏
  10991. if (!player.linkEditor.checkHasNeighbor(this)) {
  10992. this.marker.visible = false
  10993. // if (player.mode != 'panorama') this.marker.visible = true
  10994. // if (!this.flagSpot) this.marker.visible = false
  10995. return
  10996. }
  10997. // PANORAMA时,当前点位不可视时隐藏
  10998. if (player.currentPano == Viewmode.PANORAMA && !this.neighbourPanos[player.currentPano.id]) {
  10999. this.marker.visible = false
  11000. return
  11001. }
  11002. this.marker.visible = true
  11003. // if (this.flagSpot) this.flagSpot.updateVideoFlagVisible() //注:不用hasVideo来判断,因有的手机没有flagSpot
  11004. } */
  11005. }, {
  11006. key: "createVrMarker",
  11007. value: function createVrMarker(vrTexture, player) {
  11008. var _this3 = this;
  11009. if (this.isAligned()) {
  11010. this.vrMarker = new THREE.Sprite(new THREE.SpriteMaterial({
  11011. // color: new r.Color('#00c8af'),//16777215,
  11012. transparent: !0,
  11013. opacity: 0.75,
  11014. map: vrTexture,
  11015. depthTest: false
  11016. }));
  11017. this.vrMarker.name = 'vrMarker';
  11018. this.vrMarker.scale.set(0.16, 0.16, 1), this.vrMarker.boluoType = 'vr'; //this.vrMarker.position.z = 1,
  11019. this.vrMarker.position.copy(this.position), this.vrMarker.position.y -= 0.2, this.vrMarker.enabled = !0;
  11020. this.vrMarker.visible = !1;
  11021. this.vrMarker.renderOrder = RenderOrder.panoMarker //add
  11022. ;
  11023. this.vrMarker.pano = this, //xzw add
  11024. this.model.vrMarkers.push(this.vrMarker);
  11025. this.model.add(this.vrMarker);
  11026. this.vrMarker.addEventListener('click', function () {
  11027. if (window.VRScreenType != 'portrait') {
  11028. player.flyToPano({
  11029. pano: _this3
  11030. });
  11031. }
  11032. });
  11033. }
  11034. }
  11035. }, {
  11036. key: "hasNeighbor",
  11037. value: function hasNeighbor() {
  11038. var _this4 = this;
  11039. return this.neighbourUUIDs.filter(function (id) {
  11040. return id != _this4.id;
  11041. }).length > 0;
  11042. }
  11043. /**
  11044. * lv yuanyuan
  11045. * 球幕视频
  11046. */
  11047. }, {
  11048. key: "attachToPanoVideoRenderer",
  11049. value: function attachToPanoVideoRenderer(panoVideoRenderer) {
  11050. if (!this.hasVideo) return;
  11051. this.panoVideoRenderer = panoVideoRenderer; //this.panoVideoRenderer.on(PanoVideoRendererEvents.ResumeRender, this.onVideoRendered.bind(this));
  11052. this.on(PanoramaEvents.Enter, panoVideoRenderer.onVideoPanoramasEnter.bind(panoVideoRenderer));
  11053. this.on(PanoramaEvents.Exit, panoVideoRenderer.onVideoPanoramasExit.bind(panoVideoRenderer));
  11054. }
  11055. }, {
  11056. key: "getWaitDeferred",
  11057. value: function getWaitDeferred(size) {
  11058. var t = this.resolutionPromise[this.id];
  11059. t || (t = {}, this.resolutionPromise[this.id] = t);
  11060. var i = t[size];
  11061. return i || (i = {
  11062. deferred: Deferred$1(),
  11063. active: !1
  11064. }, t[size] = i), i;
  11065. }
  11066. }, {
  11067. key: "resetWaitDeferred",
  11068. value: function resetWaitDeferred(e) {
  11069. var t = this.getWaitDeferred(e);
  11070. t.active = !1;
  11071. t.deferred = Deferred$1();
  11072. }
  11073. }, {
  11074. key: "clearWaitDeferreds",
  11075. value: function clearWaitDeferreds() {
  11076. var e = this.resolutionPromise[this.id];
  11077. e || (e = {}, this.resolutionPromise[this.id] = e);
  11078. for (var t in e) {
  11079. if (e.hasOwnProperty(t)) {
  11080. var i = e[t];
  11081. i.active = !1, i.deferred = Deferred$1();
  11082. }
  11083. }
  11084. }
  11085. }, {
  11086. key: "onUploadAttemptedForAllTiles",
  11087. value: function onUploadAttemptedForAllTiles(e, t, i) {
  11088. if (e === this.id) {
  11089. var n = this.qualityManager.getPanoSize(PanoSizeClass.BASE);
  11090. if (t === n && this.shouldRedrawOnBaseLoaded) {
  11091. this.shouldRedrawOnBaseLoaded = !1;
  11092. this.panoRenderer.resetRenderStatus(this.id, !0, !1);
  11093. this.panoRenderer.renderPanoTiles(this.id, null, !0, !0);
  11094. }
  11095. }
  11096. }
  11097. }, {
  11098. key: "onTileRendered",
  11099. value: function onTileRendered(e, t, i, n) {
  11100. e === this.id && this.emit(PanoramaEvents.TileLoaded, t, i, n);
  11101. }
  11102. }, {
  11103. key: "onPanoRendered",
  11104. value: function onPanoRendered(e, t, i, n) {
  11105. if (e === this.id) {
  11106. //console.log('onPanoRendered', this.id)
  11107. this.minimumTiledPanoLoaded = !0;
  11108. this.updateSkyboxForZoomLevel();
  11109. t > this.highestPartialTileRenderOpCompleted && (this.highestPartialTileRenderOpCompleted = t);
  11110. !n && t > this.highestFullTileRenderOpCompleted && (this.highestFullTileRenderOpCompleted = t);
  11111. this.emit('load', t);
  11112. this.model.emit('load', this);
  11113. this.emit(PanoramaEvents.LoadComplete, t, i);
  11114. }
  11115. }
  11116. }, {
  11117. key: "setZoomed",
  11118. value: function setZoomed(e) {
  11119. this.zoomed = e;
  11120. this.updateSkyboxForZoomLevel();
  11121. if (e) {
  11122. //add
  11123. if (this.$app.core.get('QualityManager').navTileClass != '1k') {
  11124. this.model.showHighMap();
  11125. }
  11126. } else {
  11127. this.model.hideHighMap();
  11128. }
  11129. }
  11130. }, {
  11131. key: "ensureSkyboxReadyForRender",
  11132. value: function ensureSkyboxReadyForRender() {
  11133. if (this.tiled) ; else {
  11134. this.solidSkybox.loaded || (this.solidSkybox.needsUpdate = !0);
  11135. this.solidSkybox.loaded = !0;
  11136. }
  11137. }
  11138. }, {
  11139. key: "updateSkyboxForZoomLevel",
  11140. value: function updateSkyboxForZoomLevel() {
  11141. this.minimumTiledPanoLoaded && this.model.updateProjectedPanos(this); //xzw add this
  11142. }
  11143. }, {
  11144. key: "getSkyboxTexture",
  11145. value: function getSkyboxTexture() {
  11146. if (this.tiled) {
  11147. if (this.minimumTiledPanoLoaded) {
  11148. if (this.zoomed && this.qualityManager.maxRenderTargetSize > this.qualityManager.maxNavPanoSize) {
  11149. //change 如果放大后和不放大都是2k就不用这个
  11150. return this.panoRenderer.zoomRenderTarget.texture;
  11151. } else {
  11152. return this.tiledPanoRenderTarget && this.tiledPanoRenderTarget.texture;
  11153. }
  11154. } else {
  11155. return null;
  11156. }
  11157. } else {
  11158. return this.solidSkybox;
  11159. }
  11160. }
  11161. }, {
  11162. key: "onTileRenderFail",
  11163. value: function onTileRenderFail(e, t, i) {
  11164. e === this.id && this.emit(PanoramaEvents.LoadFailed, t);
  11165. } //e是'high'或者'low'
  11166. /* isLoaded(e) {
  11167. if (this.tiled) {
  11168. if (e && 'string' == typeof e) throw new BasicException('Wrong panoSize given to Panorama.isLoaded(); a tiled pano uses PanoSizeClass')
  11169. return !!this.minimumTiledPanoLoaded && (!e || this.highestPartialTileRenderOpCompleted >= e)
  11170. }
  11171. if (e && 'number' == typeof e) {
  11172. console.error('Wrong panoSize given to Panorama.isLoaded(); a non-tiled pano uses high/low.')
  11173. }
  11174. return !!this.solidSkybox.high || e in this.solidSkybox
  11175. } */
  11176. }, {
  11177. key: "isLoaded",
  11178. value: function isLoaded(e) {
  11179. if (this.tiled) {
  11180. if (e && 'string' == typeof e) console.error('Wrong panoSize given to Panorama.isLoaded(); a tiled pano uses PanoSizeClass');
  11181. return !!this.minimumTiledPanoLoaded && (!e || this.highestFullTileRenderOpCompleted >= e); //改:原本是:this.highestPartialTileRenderOpCompleted >= e, 希望这代表全部加载完
  11182. }
  11183. if (e && 'number' == typeof e) console.error('Wrong panoSize given to Panorama.isLoaded(); a non-tiled pano uses high/low.');
  11184. return !!this.solidSkybox.high || e in this.solidSkybox;
  11185. }
  11186. /* loadCube(e) {//旧的加载六张
  11187. if (this.isLoaded(e)) {
  11188. logger.info('Skipping load of pano, already loaded')
  11189. return Deferred().when()
  11190. }
  11191. this.emit('loading', e)
  11192. this.model.emit('loading', this)
  11193. var t = this.getCubemapUrls(this.id, e),
  11194. i = t.filter(function (e) {
  11195. return !e
  11196. })
  11197. if ('low' === e && i.length > 0) {
  11198. logger.info('Pano', this.id, 'not available in low res, loading high res right away')
  11199. e = 'high'
  11200. t = this.getCubemapUrls(this.id, e)
  11201. }
  11202. var n = 0,
  11203. r = [0, 1, 2, 3, 4, 5].map(
  11204. function (e, i, n) {
  11205. return this.loadCubeImage(t[i])
  11206. }.bind(this)
  11207. )
  11208. return Deferred()
  11209. .when(r[0], r[1], r[2], r[3], r[4], r[5])
  11210. .then(
  11211. function (t, i, n, r, o, a) {
  11212. return (
  11213. (this.solidSkybox[e] = [t, i, n, r, o, a]),
  11214. ('high' !== e && this.solidSkybox.high) || ((this.solidSkybox.image = this.solidSkybox[e]), (this.solidSkybox.low = null)),
  11215. (this.solidSkybox.needsUpdate = !0),
  11216. this.emit('load', e),
  11217. this.model.emit('load', this),
  11218. this
  11219. )
  11220. }.bind(this),
  11221. function () {
  11222. logger.error('Downloading cubemap for pano', this.id, 'failed'), (this.failedLoadingAt = Date.now())
  11223. }.bind(this),
  11224. function () {
  11225. return Deferred().when(++n, 6)
  11226. }
  11227. )
  11228. } */
  11229. }, {
  11230. key: "loadCube",
  11231. value: function loadCube(imgRatio) {
  11232. //新的加载单张
  11233. if (this.isLoaded(imgRatio)) {
  11234. logger$1.info('Skipping load of pano, already loaded');
  11235. return Defer.when();
  11236. }
  11237. this.emit('loading', imgRatio);
  11238. this.model.emit('loading', this);
  11239. var cubeImgUrl = this.getCubemapUrls(this.id, imgRatio);
  11240. if (this.panoType == '360view') {
  11241. //xzw add
  11242. //cubeImgUrl = cubeImgUrl.replace("tiles/", (config.isEdit ? ("panorama_edit/"+this.id) : ("panorama/"+this.id) ) + "/tiles/" );
  11243. var player = this.$app.core.get('Player');
  11244. if (!player.viewLinkManager.views[this.id]) return;
  11245. var ext = player.viewLinkManager.views[this.id].panoImgVersion;
  11246. ext && (cubeImgUrl += '&' + ext);
  11247. }
  11248. return http.getImage(cubeImgUrl).then(function (imgData) {
  11249. this.solidSkybox[imgRatio] = imgData;
  11250. this.solidSkybox.minFilter = THREE.LinearFilter; //1006 防止竖条纹
  11251. // "high" !== imgRatio && this.solidSkybox.high || (this.solidSkybox.image = this.solidSkybox[imgRatio],
  11252. // this.solidSkybox.low = null),
  11253. if ('high' !== imgRatio && this.solidSkybox.high) ; else {
  11254. this.solidSkybox.image = this.solidSkybox[imgRatio];
  11255. this.solidSkybox.low = null;
  11256. }
  11257. this.solidSkybox.dispose(); //xzw add 需要加这句,否则在从外部飞入后,low无法切换为high,会警告Offset overflows texture dimensions. 似乎是因为在使用贴图时切换image尺寸造成的。
  11258. this.solidSkybox.needsUpdate = !0;
  11259. this.emit('load', imgRatio);
  11260. this.model.emit('load', this); //this.emit(PanoramaEvents.LoadComplete,/* t, i */) //?
  11261. return this;
  11262. }.bind(this), function () {
  11263. logger$1.error('Downloading cubemap for pano', this.id, 'failed'), this.failedLoadingAt = Date.now();
  11264. }.bind(this), function () {
  11265. console.log('load cubeTex 出现问题?'); //return $.when(++n, 6)//什么?
  11266. });
  11267. }
  11268. }, {
  11269. key: "loadCubeImage",
  11270. value: function loadCubeImage(c) {
  11271. var h = Deferred$1(),
  11272. i = new Image();
  11273. return i.onerror = function () {
  11274. h.reject();
  11275. }, i.onload = function () {
  11276. h.resolve(i);
  11277. }, i.crossOrigin = THREE.ImageUtils.crossOrigin, i.src = c, h;
  11278. }
  11279. }, {
  11280. key: "getCubemapUrls",
  11281. value: function getCubemapUrls(id, type) {
  11282. /* return [2, 4, 0, 5, 1, 3].map(
  11283. function (h) {
  11284. return config.getResourceImageURL(this.model.sid + '/pan/' + type + '/' + this.id + '_skybox' + h + '.jpg')
  11285. }.bind(this)
  11286. ) */
  11287. if (this.mapSrc) return this.mapSrc; // 360 edit
  11288. // 判断随心装同屏需要降低全景图分辨率,否则过渡会卡顿
  11289. var splitup = false;
  11290. if (browser$1.valueFromUrl('m') && browser$1.valueFromUrl('m2')) {
  11291. var metadata = this.$app.store.getValue('metadata');
  11292. if (metadata.sceneFrom == 'sxz') {
  11293. splitup = true;
  11294. }
  11295. }
  11296. return this.$app.resource.getViewImagesURL("pan/".concat(type, "/").concat(id, ".jpg").concat(splitup ? '?x-oss-process=image/resize,m_lfit,w_4096' : ''));
  11297. }
  11298. }, {
  11299. key: "worldPosition",
  11300. value: function worldPosition() {
  11301. return this.position;
  11302. }
  11303. }, {
  11304. key: "isAligned",
  11305. value: function isAligned() {
  11306. return !this.panoType; //this.alignmentType === AlignmentType.ALIGNED
  11307. }
  11308. }, {
  11309. key: "updateTileQuality",
  11310. value:
  11311. /* updateTileQuality(state, min) {
  11312. let player = this.$app.core.get('Player')
  11313. let navSize = this.qualityManager.getMaxNavPanoSize()
  11314. if(typeof(state) == 'number'){
  11315. this.curTileQuality = state
  11316. }else if (state == 'full') {
  11317. this.curTileQuality = navSize
  11318. } else if (state == 'standard') {
  11319. this.curTileQuality = player.lowTile == 'level2' ? 512 : player.lowTile ? 1024 : 2048
  11320. } else if (state == 'low') {
  11321. this.curTileQuality = 512
  11322. }
  11323. this.curTileQuality = Math.min(this.curTileQuality, navSize)
  11324. if (min) this.curTileQuality = Math.min(this.curTileQuality, min)
  11325. return this.curTileQuality
  11326. } */
  11327. function updateTileQuality(size) {
  11328. this.$app.core.get('Player');
  11329. var navSize = this.qualityManager.getMaxNavPanoSize();
  11330. this.curTileQuality = Math.min(size, navSize);
  11331. }
  11332. }, {
  11333. key: "getVideoFilter",
  11334. value: function getVideoFilter(type) {
  11335. var _this5 = this;
  11336. //视频漫游点角度范围内隐藏遮挡物
  11337. var panoVideoFilter, angle, dir;
  11338. if (this.hasVideo && this.$app.core.get('PanoVideoRenderer').ifEnable()) {
  11339. if (this.videoInfo.dir) {
  11340. dir = this.videoInfo.dir.clone();
  11341. angle = THREE.MathUtils.degToRad(this.videoInfo.hfov / 2);
  11342. } else {
  11343. var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(this.model.supportsTiles ? 90 : 180));
  11344. var lookAtPoint = Vectors$1.FORWARD.clone().applyQuaternion(qua.multiply(this.quaternion)).add(this.position);
  11345. dir = lookAtPoint.clone().sub(this.position);
  11346. angle = THREE.MathUtils.degToRad(65 / 2);
  11347. }
  11348. } else if (this.panoVideo) {
  11349. dir = this.panoVideo.dir.clone();
  11350. angle = THREE.MathUtils.degToRad(this.panoVideo.hfov / 2);
  11351. }
  11352. if (dir) {
  11353. if (type == 'across') {
  11354. //传送两个点,看是否在这两个点区间内包含视频
  11355. panoVideoFilter = function panoVideoFilter(p1, p2) {
  11356. var dir1 = new THREE.Vector3().subVectors(p1, _this5.position).setY(0).normalize();
  11357. var dir2 = new THREE.Vector3().subVectors(p2, _this5.position).setY(0).normalize();
  11358. var midVec = new THREE.Vector3().addVectors(dir1, dir2).normalize(); //以此反向假扮视频区域
  11359. var angle_ = dir1.angleTo(midVec);
  11360. var midPoint = new THREE.Vector3().addVectors(_this5.position, dir); //视频中点
  11361. return Panorama.filters.isInFanAngle(_this5.position, midVec, angle_)(midPoint); //看视频中点是否落在p1p2区间
  11362. };
  11363. } else {
  11364. panoVideoFilter = Panorama.filters.isInFanAngle(this.position, dir, angle);
  11365. }
  11366. }
  11367. return panoVideoFilter;
  11368. }
  11369. }, {
  11370. key: "addLabel",
  11371. value: function addLabel() {
  11372. //圈内的数字
  11373. this.label = new TextSprite(Object.assign({
  11374. player: this.$app.core.get('Player')
  11375. }, labelProp$1, {
  11376. text: this.appId
  11377. }));
  11378. var s = math$1.linearClamp(this.label.text.length, 2, 6, 0.4, 0.2); //应该不会多于6位数
  11379. this.label.scale.set(s, s, s);
  11380. this.marker.add(this.label);
  11381. }
  11382. }, {
  11383. key: "addLabel2",
  11384. value: function addLabel2() {
  11385. //漂浮的数字
  11386. this.removeLabel();
  11387. this.label2 = new TextSprite(Object.assign({
  11388. player: this.$app.core.get('Player'),
  11389. sizeInfo: {
  11390. minSize: 50,
  11391. maxSize: 300,
  11392. nearBound: 0.2,
  11393. farBound: Math.max(20, this.model.size.length() / 3),
  11394. farBoundPlan: 250
  11395. }
  11396. }, labelProp2, {
  11397. text: "".concat(this.id, "-f").concat(this.floorIndex)
  11398. })); //this.label2.sprite.material.depthTest = true
  11399. var position = this.floorPosition.clone();
  11400. position.y += 0.4;
  11401. this.label2.position.copy(position);
  11402. this.floor.add(this.label2);
  11403. }
  11404. }, {
  11405. key: "removeLabel",
  11406. value: function removeLabel() {
  11407. this.label2 && (this.floor.remove(this.label2), this.label2.material.dispose(), this.label2 = null);
  11408. }
  11409. }]);
  11410. return Panorama;
  11411. }(EventEmitter);
  11412. Panorama.raycastsSkipped = 0;
  11413. Panorama.raycastsDone = 0;
  11414. Panorama.filters = {
  11415. inDirection: function inDirection(e, t, i) {
  11416. return function (n) {
  11417. var r = n.position.clone().sub(e).normalize();
  11418. return r.dot(t) > i;
  11419. };
  11420. },
  11421. inFloorDirection: function inFloorDirection(e, t, i) {
  11422. return function (n) {
  11423. var r = n.floorPosition.clone().sub(e).normalize();
  11424. return r.dot(t) > i;
  11425. };
  11426. },
  11427. inFloorDirection_2d: function inFloorDirection_2d(e, t, i) {
  11428. return function (n) {
  11429. var origin = new THREE.Vector2(n.floorPosition.x, n.floorPosition.z);
  11430. var target = new THREE.Vector2(e.x, e.z); //var r = n.floorPosition.clone().sub(e).normalize()
  11431. var r = origin.sub(target).normalize();
  11432. return r.dot(new THREE.Vector2(t.x, t.z)) > i;
  11433. };
  11434. },
  11435. inPanoDirection: function inPanoDirection(e, t, i) {
  11436. return i = settings$3.navigation.panoScores ? settings$3.navigation.filterStrictness : i, function (n) {
  11437. var r = n.floorPosition.clone().sub(e).normalize(),
  11438. o = n.position.clone().sub(e).normalize();
  11439. return r.dot(t) > i || o.dot(t) > i;
  11440. };
  11441. },
  11442. atFloor: function atFloor(e) {
  11443. return function (t) {
  11444. return !e || t.floor === e;
  11445. };
  11446. },
  11447. not: function not(e) {
  11448. return function (t) {
  11449. return t !== e;
  11450. };
  11451. },
  11452. notIn: function notIn(e) {
  11453. return function (t) {
  11454. return e.indexOf(t) === -1;
  11455. };
  11456. },
  11457. isLoaded: function isLoaded() {
  11458. return function (e) {
  11459. return e.isLoaded();
  11460. };
  11461. },
  11462. isNotLoaded: function isNotLoaded() {
  11463. return function (e) {
  11464. return !e.isLoaded();
  11465. };
  11466. },
  11467. isCloseEnoughTo: function isCloseEnoughTo(e, t) {
  11468. return function (i) {
  11469. return e.distanceTo(i.floorPosition) < t;
  11470. };
  11471. },
  11472. isClampDisSquaredTo: function isClampDisSquaredTo(e, min, max) {
  11473. //add
  11474. return function (i) {
  11475. var dis = e.distanceToSquared(i.floorPosition);
  11476. return dis > min && dis < max;
  11477. };
  11478. },
  11479. hasMinimumHeightDifferenceTo: function hasMinimumHeightDifferenceTo(e, t) {
  11480. return function (i) {
  11481. return Math.abs(i.position.y - e.y) > t;
  11482. };
  11483. },
  11484. isNotBehindNormal: function isNotBehindNormal(e, t) {
  11485. var i = new THREE.Vector3();
  11486. return t = t.clone(), function (n) {
  11487. var r = i.copy(n.position).sub(e).normalize();
  11488. return r.dot(t) > 0;
  11489. };
  11490. },
  11491. isNeighbourPanoTo: function isNeighbourPanoTo(e) {
  11492. return function (t) {
  11493. return !e || !e.neighbourPanos || !!e.neighbourPanos[t.id];
  11494. };
  11495. },
  11496. isNeighbourOfNeighbourTo: function isNeighbourOfNeighbourTo(e) {
  11497. return function (t) {
  11498. return !!e.neighbourPanos[t.id] || e.neighbourUUIDs.some(function (i) {
  11499. var n = e.model.panos.get(i);
  11500. return !!n && n.neighbourPanos[t.id];
  11501. });
  11502. };
  11503. },
  11504. isNotRecentlyFailed: function isNotRecentlyFailed(e) {
  11505. return function (t) {
  11506. return Date.now() - t.failedLoadingAt > e;
  11507. };
  11508. },
  11509. isOnVisibleFloor: function isOnVisibleFloor() {
  11510. return function (e) {
  11511. return !e.floor.hidden;
  11512. };
  11513. },
  11514. isPanoAligned: function isPanoAligned() {
  11515. return function (e) {
  11516. return e.isAligned();
  11517. };
  11518. },
  11519. /* isInFanAngle: function (curPos, dir, maxAngle) {
  11520. //是否和中心方向的dir的角度不超过maxAngle
  11521. return function (position) {
  11522. var v1 = dir.setY(0)
  11523. var v2 = position.clone().sub(curPos).setY(0)
  11524. return v1.angleTo(v2) <= maxAngle
  11525. }
  11526. }, */
  11527. isInFanAngle: function isInFanAngle(curPos, dir, maxAngle) {
  11528. //是否和中心方向的dir的角度不超过maxAngle
  11529. return function (position) {
  11530. var v1 = dir.setY(0);
  11531. var v2 = position.clone().sub(curPos).setY(0);
  11532. return v1.angleTo(v2) <= maxAngle;
  11533. };
  11534. }
  11535. };
  11536. Panorama.sortFunctions = {
  11537. distanceToPoint: function distanceToPoint(e) {
  11538. return function (t, i) {
  11539. return t.position.distanceTo(e) - i.position.distanceTo(e);
  11540. };
  11541. },
  11542. floorDistanceToPoint: function floorDistanceToPoint(e) {
  11543. return function (t, i) {
  11544. return t.floorPosition.distanceTo(e) - i.floorPosition.distanceTo(e);
  11545. };
  11546. },
  11547. choose: function choose(e) {
  11548. return function (t, i) {
  11549. return e.id === t.id ? -1 : e.id === i.id ? 1 : 0;
  11550. };
  11551. }
  11552. };
  11553. Panorama.scoreFunctions = {
  11554. distance: function distance(e, t) {
  11555. return t = t || settings$3.navigation.distanceFactor, function (i) {
  11556. return e ? e.position.distanceTo(i.position) * t : 0;
  11557. };
  11558. },
  11559. distanceSquared: function distanceSquared(e, t) {
  11560. return t = t || settings$3.navigation.distanceFactor, function (i) {
  11561. return e ? e.position.distanceToSquared(i.position) * t : 0;
  11562. };
  11563. },
  11564. direction: function direction(e, t, r) {
  11565. return function (i) {
  11566. var n = i.position.clone().sub(e).normalize();
  11567. return n.dot(t) * (r || settings$3.navigation.directionFactor);
  11568. };
  11569. },
  11570. directionFloor: function directionFloor(e, t) {
  11571. //add
  11572. return function (i) {
  11573. var n = i.floorPosition.clone().sub(e).normalize();
  11574. return n.dot(t) * settings$3.navigation.directionFactor;
  11575. };
  11576. },
  11577. angle: function angle(e, t) {
  11578. return function (i) {
  11579. var n = i.position.clone().sub(e).normalize();
  11580. return n.angleTo(t) * settings$3.navigation.angleFactor;
  11581. };
  11582. },
  11583. inFieldOfView: function inFieldOfView(e, t) {
  11584. return function (i) {
  11585. var n = i.position.clone().sub(e).normalize();
  11586. return n.dot(t) > 0.75 ? 10 : -1;
  11587. };
  11588. },
  11589. optionality: function optionality(e) {
  11590. return function (t) {
  11591. var i = t.neighbourUUIDs.filter(function (t) {
  11592. return !(t in e.neighbourUUIDs) && t !== e.id;
  11593. });
  11594. return i.length * settings$3.navigation.optionalityFactor;
  11595. };
  11596. },
  11597. penalizeHeightDifferenceUnder: function penalizeHeightDifferenceUnder(e, t) {
  11598. return function (i) {
  11599. return e.y - i.position.y < t ? -20 : 0;
  11600. };
  11601. }
  11602. };
  11603. function _createSuper$1t(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1t(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  11604. function _isNativeReflectConstruct$1t() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  11605. var PanoramaCollection = /*#__PURE__*/function (_IndexedCollection) {
  11606. _inherits(PanoramaCollection, _IndexedCollection);
  11607. var _super = _createSuper$1t(PanoramaCollection);
  11608. function PanoramaCollection(app) {
  11609. var _this;
  11610. _classCallCheck(this, PanoramaCollection);
  11611. _this = _super.call(this);
  11612. _this.neighbourMap = {};
  11613. _this.map = null;
  11614. _this.animatePanoId = null;
  11615. app && app.TourManager.player.then(function (player) {
  11616. player.on('play2', function () {
  11617. _this.list.forEach(function (e) {
  11618. e.label && common.updateVisible(e.label, 'recordTour', false); //为了防止录屏时将点位录入 2023.10.8
  11619. });
  11620. });
  11621. player.on('end', function () {
  11622. _this.list.forEach(function (e) {
  11623. e.label && common.updateVisible(e.label, 'recordTour', true);
  11624. });
  11625. });
  11626. player.on('pause', function () {
  11627. _this.list.forEach(function (e) {
  11628. e.label && common.updateVisible(e.label, 'recordTour', true);
  11629. });
  11630. });
  11631. });
  11632. return _this;
  11633. }
  11634. _createClass(PanoramaCollection, [{
  11635. key: "getIndex",
  11636. value: function getIndex(pano) {
  11637. return pano.id;
  11638. }
  11639. }, {
  11640. key: "find",
  11641. value: function find(e, t) {
  11642. var i = common.filterAll(this.list, e);
  11643. return 0 === i.length ? null : (t && t.forEach(function (e) {
  11644. i = common.stableSort(i, e);
  11645. }), i[0]);
  11646. }
  11647. /* sortByScore(e, t) {
  11648. var i = common.filterAll(this.list, e)
  11649. return 0 === i.length
  11650. ? null
  11651. : (i = i
  11652. .map(function (e) {
  11653. return {
  11654. pano: e,
  11655. score: t.reduce(function (t, i) {
  11656. return t + i(e)
  11657. }, 0),
  11658. }
  11659. })
  11660. .sort(function (e, t) {
  11661. return t.score - e.score
  11662. }))
  11663. } */
  11664. }, {
  11665. key: "lowestByScore",
  11666. value: function lowestByScore(e, t, i) {
  11667. return this.findRankedByScore(0, e, t, i);
  11668. }
  11669. }, {
  11670. key: "findRankedByScore",
  11671. value: function findRankedByScore(e, t, i, n) {
  11672. n && (n.candidates = null, n.pano = null), e || (e = 0);
  11673. var r = common.sortByScore(this.list, t, i);
  11674. return !r || 0 === r.length || e >= r.length ? null : (n && (n.candidates = r, n.pano = r[e].item), r[e].item);
  11675. }
  11676. }, {
  11677. key: "getNeighbours",
  11678. value: function getNeighbours(pano) {
  11679. return this.neighbourMap[pano.id];
  11680. }
  11681. }, {
  11682. key: "setNeighbour",
  11683. value: function setNeighbour(pano, neighbourPano, isNeighbour) {
  11684. this.neighbourMap[pano.id] || (this.neighbourMap[pano.id] = {});
  11685. this.neighbourMap[neighbourPano.id] || (this.neighbourMap[neighbourPano.id] = {});
  11686. this.neighbourMap[pano.id][pano.id] = !0;
  11687. this.neighbourMap[neighbourPano.id][neighbourPano.id] = !0;
  11688. this.neighbourMap[pano.id][neighbourPano.id] = isNeighbour;
  11689. this.neighbourMap[neighbourPano.id][pano.id] = isNeighbour;
  11690. return this.neighbourMap[pano.id];
  11691. }
  11692. }, {
  11693. key: "findClosest",
  11694. value: function findClosest(position, t) {
  11695. var func = [Panorama.filters.isPanoAligned()];
  11696. t && func.push(Panorama.filters.inDirection(position, t, 0.75));
  11697. return this.find(func, [Panorama.sortFunctions.distanceToPoint(position)]);
  11698. }
  11699. }, {
  11700. key: "fadeMarkerOpacity",
  11701. value: function fadeMarkerOpacity(e, t, gr) {
  11702. //许钟文 改
  11703. transitions$1.cancelById('fadeMarkerOpacity');
  11704. var n = this.list.findIndex(function (e) {
  11705. //why? 难道没有marker的pano吗 findeIndex:获取数组中函数返回值不为fasle的第一个元素索引位置
  11706. return e.marker;
  11707. });
  11708. if (n < 0) {
  11709. logger.info('marker findIndex<0');
  11710. return;
  11711. }
  11712. var group;
  11713. var tran = function tran(list, index) {
  11714. list.member = list.member.filter(function (m) {
  11715. return m.marker && m.marker.material.opacity != list.toOp;
  11716. });
  11717. transitions$1.trigger({
  11718. func: function (e, t) {
  11719. //e:0-1
  11720. list.member.forEach(function (m) {
  11721. var o = m.marker.oldOpacity;
  11722. var i = o + e * (list.toOp - o);
  11723. m.marker && (m.marker.material.opacity = i);
  11724. });
  11725. }.bind(this),
  11726. duration: void 0 == t ? settings$3.markerOpacityTransitionTime : t,
  11727. name: '_fpm_' + index,
  11728. id: 'fadeMarkerOpacity'
  11729. });
  11730. };
  11731. this.forEach(function (e) {
  11732. //先记录旧的opacity
  11733. e.marker && (e.marker.oldOpacity = e.marker.material.opacity);
  11734. });
  11735. e = void 0 == e ? settings$3.panorama.markerOpacity : e;
  11736. if (e > 0 && gr) {
  11737. group = gr;
  11738. } else {
  11739. group = [{
  11740. member: this.list,
  11741. toOp: e
  11742. }];
  11743. }
  11744. for (var i = 0; i < group.length; i++) {
  11745. tran(group[i], i);
  11746. }
  11747. }
  11748. }, {
  11749. key: "closestPanoTowardPoint",
  11750. value: function closestPanoTowardPoint(o) {
  11751. //改自closestPanoTowardTag by:xzw
  11752. var point = o.point,
  11753. require = o.require || [],
  11754. temp = {
  11755. position: point
  11756. },
  11757. a = new THREE.Vector3(),
  11758. rank = o.rank || [Panorama.scoreFunctions.distanceSquared(temp, -2)];
  11759. o.force;
  11760. var getAll = o.getAll,
  11761. angleTolerDecrease = o.angleTolerDecrease || 2; // let player = window.kankan.core.get('Player')
  11762. // if (player.linkEditor && !player.linkEditor.noPanoHasNeighbor) {
  11763. // //xzw add 如果不是全孤立点的话,就要避开孤立点
  11764. // require.push(pano => {
  11765. // return player.linkEditor.checkHasNeighbor(pano)
  11766. // })
  11767. // }
  11768. require.push(Panorama.filters.isPanoAligned());
  11769. require.push(function (pano) {
  11770. return pano.hasNeighbor();
  11771. /* || pano == this.$app.core.get('Scene').firstView.pano */
  11772. });
  11773. require.push(function (pano) {
  11774. a.copy(point).sub(pano.position);
  11775. var angle = -THREE.MathUtils.radToDeg(Math.atan(a.y / Math.sqrt(a.x * a.x + a.z * a.z))),
  11776. tolerance = settings$3.insideFOV / 2 - angleTolerDecrease;
  11777. var a1 = settings$3.insideLookLimitDown - tolerance;
  11778. var a2 = settings$3.insideLookLimitUp + tolerance;
  11779. return a1 < angle && angle < a2;
  11780. /* if(angle < settings.insideLookLimitDown){
  11781. return -10 * (angle-settings.insideLookLimitDown)
  11782. }else if(angle > settings.insideLookLimitUp){
  11783. return -10 * (angle-settings.insideLookLimitDown)
  11784. } */
  11785. });
  11786. if (o.floor) require.push(Panorama.filters.atFloor(o.floor));
  11787. var g = common.sortByScore(this.list, require, rank); //console.log(g)
  11788. if (getAll) return g;
  11789. return g && g.length > 0 && g[0].item;
  11790. }
  11791. }]);
  11792. return PanoramaCollection;
  11793. }(IndexedCollection);
  11794. function _createSuper$1s(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1s(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  11795. function _isNativeReflectConstruct$1s() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  11796. //skybox
  11797. var BoundingMesh = /*#__PURE__*/function (_THREE$Mesh) {
  11798. _inherits(BoundingMesh, _THREE$Mesh);
  11799. var _super = _createSuper$1s(BoundingMesh);
  11800. function BoundingMesh(boundingBox, material) {
  11801. var _this;
  11802. var skyHeight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 50;
  11803. _classCallCheck(this, BoundingMesh);
  11804. //boundingBox = boundingBox.clone().expandByScalar(0.01) //许钟文改: 稍微放大了一丢丢的,避免和其他mesh冲突闪烁。尤其在飞入飞出时,地面闪烁一下,好像是和chunk冲突。过去是和marker冲突。
  11805. //大部分没有mesh的都是户外,所以放大些,作为天空盒背景. 另外地板因为可能破损,所以position向上提升使最低高度不变
  11806. boundingBox = boundingBox.clone().expandByVector(new THREE.Vector3(skyHeight, skyHeight, skyHeight));
  11807. var size = new THREE.Vector3();
  11808. boundingBox.getSize(size);
  11809. var geometry = new THREE.BoxGeometry(size.x, size.y, size.z); //geometry.boundingBox = boundingBox; //xzw delete 较早:这句加上不对。因为后面算鼠标与skybox交点时 要用到的是boundingbox加上position才是真实skybox真实位置,所以boundingbox要居中的,而不应该是整体模型所在的位置。
  11810. geometry.computeBoundingBox(); //需要重新计算对称的bounding, 在获取鼠标交点时需要。否则热点加不上
  11811. _this = _super.call(this, geometry, material);
  11812. var center = new THREE.Vector3();
  11813. boundingBox.getCenter(center);
  11814. skyHeight && (center.y += skyHeight - 0.1);
  11815. _this.position.copy(center);
  11816. _this.frustumCulled = !1; //flag && this.add(new THREE.WireframeHelper(this))
  11817. return _this;
  11818. }
  11819. return BoundingMesh;
  11820. }(THREE.Mesh);
  11821. function _createSuper$1r(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1r(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  11822. function _isNativeReflectConstruct$1r() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  11823. /**
  11824. * 全景贴图材质
  11825. */
  11826. var ModelTextureMaterial = /*#__PURE__*/function (_THREE$RawShaderMater) {
  11827. _inherits(ModelTextureMaterial, _THREE$RawShaderMater);
  11828. var _super = _createSuper$1r(ModelTextureMaterial);
  11829. /* constructor(parameters) {
  11830. parameters = parameters || {}
  11831. super(
  11832. common.extendObject(
  11833. {
  11834. fragmentShader: shaders.model.fragmentShader,
  11835. vertexShader: shaders.model.vertexShader,
  11836. uniforms: THREE.UniformsUtils.clone(shaders.model.uniforms),
  11837. name: 'ModelTextureMaterial',
  11838. },
  11839. parameters
  11840. )
  11841. )
  11842. } */
  11843. function ModelTextureMaterial(parameters, matName) {
  11844. var _this;
  11845. _classCallCheck(this, ModelTextureMaterial);
  11846. parameters = parameters || {}; //使用的是单张全景图,不是cube型的
  11847. if (parameters.not_Cube) {
  11848. var defines = parameters.defines || {};
  11849. defines.Not_Cube = '';
  11850. parameters.defines = defines;
  11851. }
  11852. var matName = matName || 'model';
  11853. _this = _super.call(this, common.extendObject({
  11854. fragmentShader: shaders[matName].fragmentShader,
  11855. vertexShader: shaders[matName].vertexShader,
  11856. uniforms: THREE.UniformsUtils.clone(shaders[matName].uniforms),
  11857. name: 'ModelTextureMaterial'
  11858. }, parameters));
  11859. if (_this.uniforms.progress) {
  11860. var progress = 0;
  11861. Object.defineProperty(_this.uniforms.progress, 'value', {
  11862. get: function get() {
  11863. return progress;
  11864. },
  11865. set: function set(e) {
  11866. if (e < 1) {
  11867. if (!('usePanoMap0' in _this.defines)) {
  11868. _this.defines.usePanoMap0 = '';
  11869. _this.needsUpdate = true;
  11870. }
  11871. } else {
  11872. if ('usePanoMap0' in _this.defines) {
  11873. delete _this.defines.usePanoMap0;
  11874. _this.needsUpdate = true;
  11875. }
  11876. }
  11877. progress = e;
  11878. }
  11879. });
  11880. } //-------------------------------------
  11881. return _this;
  11882. }
  11883. /**
  11884. * 用于点位跳转
  11885. * 跳转后,pano0和pano1都会被赋值为currentPano,uniforms.progress由0过渡为1
  11886. * @param {*} pano0 跳转前的点位
  11887. * @param {*} pano1 跳转后的点位
  11888. * @param {*} flag 将progress重置为0
  11889. */
  11890. _createClass(ModelTextureMaterial, [{
  11891. key: "setProjectedPanos",
  11892. value: function setProjectedPanos(pano0, pano1, flag) {
  11893. var _this2 = this;
  11894. if (!('BasePanoMap' in this.defines)) {
  11895. flag && (this.uniforms.progress.value = 0); // pano0的贴图、坐标、旋转
  11896. pano0.ensureSkyboxReadyForRender();
  11897. pano1.ensureSkyboxReadyForRender();
  11898. this.updateTexDefines(pano0, pano1); // 判断是全景图还是六面图
  11899. }
  11900. this.uniforms.pano0Map.value = pano0.getSkyboxTexture();
  11901. this.uniforms.pano0Position.value.copy(pano0.position);
  11902. this.uniforms.pano0Matrix.value.copy(pano0.matrixWorld);
  11903. this.uniforms.pano1Map.value = pano1.getSkyboxTexture();
  11904. this.uniforms.pano1Position.value.copy(pano1.position);
  11905. this.uniforms.pano1Matrix.value.copy(pano1.matrixWorld);
  11906. delete this.defines['HasVideo'];
  11907. if (pano1.hasVideo) {
  11908. // 存在球幕视频
  11909. this.uniforms.exposure.value = pano1.videoInfo.exposure || 1; // 曝光
  11910. this.uniforms.blendFov.value = pano1.videoInfo.blendFov || 5; // 目前全都取默认值
  11911. // 球幕区域
  11912. pano1.videoInfo.clipRect && this.uniforms.clipRect.value.set(pano1.videoInfo.clipRect.leftBottom.x, pano1.videoInfo.clipRect.leftBottom.y, pano1.videoInfo.clipRect.rightTop.x, pano1.videoInfo.clipRect.rightTop.y);
  11913. this.defines['VideoMapping'] = pano1.videoInfo.mapping || 0; // 球幕视频与全景图混合方式
  11914. this.defines['HasVideo'] = pano1.videoInfo.cameraType || 8; // 业务需求:bFlag用于判断当球幕视频宽大于高时,需要翻转90度
  11915. var videoPlayer = pano1.panoVideoRenderer.videoPlayer;
  11916. var video = videoPlayer._resource ? videoPlayer._resource.get(pano1.id).video : videoPlayer.instances.get(pano1.id).videoElement;
  11917. if (video.readyState == 0) {
  11918. video.addEventListener('resize', function (ev) {
  11919. _this2.uniforms.bFlag.value = video.videoWidth > video.videoHeight ? 1 : 0;
  11920. }, false);
  11921. } else this.uniforms.bFlag.value = video.videoWidth > video.videoHeight ? 1 : 0;
  11922. } // 没有hasFilter时,会绕过滤镜相关代码,节省gpu
  11923. // 考虑到过渡效果,pano1和pano0任意一个hasFilter,就要执行滤镜代码
  11924. if (pano1.hasFilter || pano0.hasFilter) {
  11925. this.defines['hasFilter'] = true;
  11926. } else {
  11927. delete this.defines['hasFilter'];
  11928. }
  11929. this.needsUpdate = true; //console.log('setProjectedPanos', pano0.id, pano1.id)
  11930. } // 判断pano贴图是全景图还是六面图
  11931. }, {
  11932. key: "updateTexDefines",
  11933. value: function updateTexDefines(pano0, pano1) {
  11934. var _this3 = this;
  11935. var hasChanged = false;
  11936. var change = function change(pano, index) {
  11937. if (!pano.tiled) {
  11938. // 全景图
  11939. if (_this3.defines['Not_Cube_' + index] == void 0) {
  11940. _this3.defines['Not_Cube_' + index] = '';
  11941. hasChanged = true;
  11942. }
  11943. } else {
  11944. // 六面图
  11945. if (_this3.defines['Not_Cube_' + index] != void 0) {
  11946. delete _this3.defines['Not_Cube_' + index];
  11947. hasChanged = true;
  11948. }
  11949. }
  11950. };
  11951. change(pano0, 0);
  11952. change(pano1, 1);
  11953. hasChanged && (this.needsUpdate = true);
  11954. }
  11955. }]);
  11956. return ModelTextureMaterial;
  11957. }(THREE.RawShaderMaterial);
  11958. function _createSuper$1q(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1q(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  11959. function _isNativeReflectConstruct$1q() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  11960. var BoundingTextureSkybox = /*#__PURE__*/function (_BoundingMesh) {
  11961. _inherits(BoundingTextureSkybox, _BoundingMesh);
  11962. var _super = _createSuper$1q(BoundingTextureSkybox);
  11963. function BoundingTextureSkybox(bounding, skyHeight) {
  11964. var _this;
  11965. _classCallCheck(this, BoundingTextureSkybox);
  11966. logger$1.time('Computing a nice bounding cubemap');
  11967. var material = new ModelTextureMaterial({
  11968. side: THREE.BackSide,
  11969. transparent: !0
  11970. });
  11971. material.uniforms.modelAlpha.value = 0;
  11972. material.uniforms.opacity.value = 1 - settings$3.modelAlpha;
  11973. _this = _super.call(this, bounding, material, skyHeight);
  11974. _this.renderOrder = RenderOrder.boundingSkybox;
  11975. logger$1.timeEnd('Computing a nice bounding cubemap');
  11976. return _this;
  11977. }
  11978. return BoundingTextureSkybox;
  11979. }(BoundingMesh);
  11980. function E$1() {// Keep this empty so it's easier to inherit from
  11981. // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
  11982. }
  11983. E$1.prototype = {
  11984. on: function on(name, callback, ctx) {
  11985. var e = this.e || (this.e = {});
  11986. (e[name] || (e[name] = [])).push({
  11987. fn: callback,
  11988. ctx: ctx
  11989. });
  11990. return this;
  11991. },
  11992. once: function once(name, callback, ctx) {
  11993. var self = this;
  11994. function listener() {
  11995. self.off(name, listener);
  11996. callback.apply(ctx, arguments);
  11997. }
  11998. listener._ = callback;
  11999. return this.on(name, listener, ctx);
  12000. },
  12001. emit: function emit(name) {
  12002. var data = [].slice.call(arguments, 1);
  12003. var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
  12004. var i = 0;
  12005. var len = evtArr.length;
  12006. for (i; i < len; i++) {
  12007. evtArr[i].fn.apply(evtArr[i].ctx, data);
  12008. }
  12009. return this;
  12010. },
  12011. off: function off(name, callback) {
  12012. var e = this.e || (this.e = {});
  12013. var evts = e[name];
  12014. var liveEvents = [];
  12015. if (evts && callback) {
  12016. for (var i = 0, len = evts.length; i < len; i++) {
  12017. if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]);
  12018. }
  12019. } // Remove event from queue to prevent memory leak
  12020. // Suggested by https://github.com/lazd
  12021. // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
  12022. liveEvents.length ? e[name] = liveEvents : delete e[name];
  12023. return this;
  12024. }
  12025. };
  12026. var tinyEmitter = E$1;
  12027. var TinyEmitter = E$1;
  12028. tinyEmitter.TinyEmitter = TinyEmitter;
  12029. /*
  12030. * @Author: Rindy
  12031. * @Date: 2021-05-07 15:52:29
  12032. * @LastEditors: Rindy
  12033. * @LastEditTime: 2021-05-07 15:53:00
  12034. * @Description: 注释
  12035. */
  12036. /**
  12037. * 地面logo
  12038. */
  12039. var floorLogo = {
  12040. uniforms: {
  12041. map: {
  12042. type: 't',
  12043. value: null
  12044. },
  12045. opacity: {
  12046. type: 'f',
  12047. value: 1
  12048. },
  12049. opaRadius: {
  12050. //百分比
  12051. type: 'f',
  12052. value: 0.2
  12053. }
  12054. },
  12055. vertexShader: "\n varying vec2 vUv;\n void main() {\n vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",
  12056. fragmentShader: "uniform sampler2D map; \n uniform float opacity;\n uniform float opaRadius;\n varying vec2 vUv; \n void main() {\n vec2 vUv2 = vec2(vUv.x*2.0 - 1.0, vUv.y*2.0 - 1.0); \n vec4 colorFromTexture = texture2D( map, vUv ); \n float opa = 1.0; \n float r = vUv2.x*vUv2.x + vUv2.y*vUv2.y; \n if(r > 1.0) opa = 0.0; \n else if(r < opaRadius)opa = 1.0; \n else{\t\n float a = -1.0 / ((opaRadius - 1.0)*(opaRadius - 1.0));\n float b = -2.0 * a * opaRadius;\t\n float c = 1.0 + a * opaRadius * opaRadius; \n opa = a * r*r + b * r + c; \n } \n gl_FragColor = vec4(colorFromTexture.rgb, opacity * colorFromTexture.a * opa );\n }\n "
  12057. };
  12058. function _createSuper$1p(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1p(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  12059. function _isNativeReflectConstruct$1p() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  12060. var settings$1 = {
  12061. floorLogo: {
  12062. name: 'floorLogoImg.png',
  12063. geometry: new THREE.Vector4(2.5, 2.5, 1, 1),
  12064. size: 100,
  12065. position: new THREE.Vector3(0, -1.49, 0),
  12066. renderOrder: 99
  12067. }
  12068. };
  12069. var FloorLogos = /*#__PURE__*/function (_Emiter) {
  12070. _inherits(FloorLogos, _Emiter);
  12071. var _super = _createSuper$1p(FloorLogos);
  12072. function FloorLogos(app) {
  12073. var _this;
  12074. _classCallCheck(this, FloorLogos);
  12075. _this = _super.call(this);
  12076. _this.changefloorLogoOpa = function (o) {
  12077. var logo = o.index == 0 ? this.firstLogo : this.secondLogo;
  12078. transitions$1.cancelById('flOpa_' + o.index); //先停止之前该logo的透明度变化
  12079. if (o.from != void 0) logo.material.opacity = o.from; //初始透明度
  12080. if (!o.dur) {
  12081. //立刻
  12082. logo.material.opacity = o.opa;
  12083. } else {
  12084. transitions$1.start(lerp.property(logo.material, 'opacity', o.opa), o.dur || 0, null, o.delay || 0, easing['easeInQuad'], 'changefloorLogoOpa', 'flOpa_' + o.index);
  12085. }
  12086. };
  12087. _this.updateFloorlogo = function () {
  12088. var lastQ = new THREE.Quaternion();
  12089. return function (Q) {
  12090. if (this.fixDirection) return;
  12091. if (!Q || !this.ready) return;
  12092. var sameQ, quaternion, visible;
  12093. if (this.firstLogo.visible || this.firstLogo.material.opacity != 0 || this.secondLogo.visible || this.secondLogo.material.opacity != 0) {
  12094. visible = true;
  12095. }
  12096. if (!visible) {
  12097. return; //如果两个都不可见,就不更改,如果有一个可见,就都改
  12098. } //因为导览时有直接更改quaternion而不是lon的情况 所以更改为下面的
  12099. var q = this.app.core.get('Player').camera.quaternion;
  12100. var sameQ = MathLight.closeTo(q, lastQ, 5);
  12101. sameQ || (lastQ = q.clone()); //相机旋转是否改变了
  12102. if (!sameQ) {
  12103. if (!quaternion) {
  12104. //将camera的朝向转化成vector并去掉y上的分量:
  12105. var a = new THREE.Vector3(0, 0, -1).applyQuaternion(Q).setY(0); //这是把方向转化成matrix的方法:
  12106. var _ = new THREE.Matrix4().lookAt(a, new THREE.Vector3(), new THREE.Vector3(0, 1, 0)); // new Matrix().lookAt(from, aim, Vectors.UP); 前两个参数代表位置和朝向(顺序反过来应该就是反向的),第三个默认这个axis
  12107. //转化为quaternion:
  12108. quaternion = new THREE.Quaternion().setFromRotationMatrix(_); //最后考虑一下最初lookAt上方的旋转:
  12109. var b = new THREE.Quaternion(0, 0.7071067811865476, 0.7071067811865476, 0); //计算得(logo面朝上的旋转)
  12110. quaternion.multiply(b); //等同b.premultiply(quaternion), b变换在先,左乘之后的quaternion。
  12111. }
  12112. this.firstLogo.quaternion.copy(quaternion);
  12113. this.secondLogo.quaternion.copy(quaternion); //console.log('floorlogo changed')
  12114. }
  12115. };
  12116. }();
  12117. _this.setDir = function (angle) {
  12118. //根据compass设置北方向
  12119. if (!this.fixDirection) return;
  12120. this.firstLogo.rotation.z = THREE.MathUtils.degToRad(-angle);
  12121. this.secondLogo.rotation.z = THREE.MathUtils.degToRad(-angle);
  12122. };
  12123. _this.app = app;
  12124. _this.ready = false;
  12125. _this.fixDirection = false; //固定东南西北朝向
  12126. _this.firstLogo = new THREE.Mesh(new THREE.PlaneGeometry(2.5, 2.5, 1, 1), new THREE.MeshBasicMaterial({
  12127. transparent: true,
  12128. depthWrite: !1,
  12129. depthTest: false //改 在chunk\skybox外也可看到
  12130. }));
  12131. _this.secondLogo = _this.firstLogo.clone();
  12132. _this.secondLogo.material = _this.firstLogo.material.clone();
  12133. return _this;
  12134. }
  12135. _createClass(FloorLogos, [{
  12136. key: "bindEvents",
  12137. value: function bindEvents() {}
  12138. }, {
  12139. key: "createFloorLogo",
  12140. value: function createFloorLogo() {
  12141. var _this2 = this;
  12142. //const { url, scale = size / 100 } = this.getLogo()
  12143. var logoMeta = this.getLogo();
  12144. var url = logoMeta.url;
  12145. var scale = logoMeta.size / 100;
  12146. this.setLogoMesh(this.firstLogo, scale);
  12147. this.setLogoMesh(this.secondLogo, scale);
  12148. var map = texture.load(url, function () {
  12149. var outputTex = _this2.getTex(map);
  12150. _this2.firstLogo.material.map = outputTex;
  12151. _this2.secondLogo.material.map = outputTex;
  12152. _this2.firstLogo.material.needsUpdate = true;
  12153. _this2.secondLogo.material.needsUpdate = true;
  12154. common.updateVisible(_this2.firstLogo, 'unready', true);
  12155. common.updateVisible(_this2.secondLogo, 'unready', true);
  12156. _this2.emit('ready');
  12157. _this2.ready = true;
  12158. });
  12159. }
  12160. }, {
  12161. key: "setLogoMesh",
  12162. value: function setLogoMesh(logo, scale) {
  12163. logo.name = 'floorlogo';
  12164. logo.scale.set(scale, scale, scale);
  12165. logo.position.set(settings$1.floorLogo.position.x, settings$1.floorLogo.position.y, settings$1.floorLogo.position.z);
  12166. logo.lookAt(logo.position.clone().add(new THREE.Vector3(0, 1, 0)));
  12167. logo.renderOrder = settings$1.floorLogo.renderOrder; //cover the videoSkybox
  12168. common.updateVisible(logo, 'unready', false);
  12169. common.updateVisible(logo, 'outside', false);
  12170. return logo;
  12171. }
  12172. }, {
  12173. key: "getTex",
  12174. value: function getTex(map) {
  12175. var uniforms = THREE.UniformsUtils.clone(floorLogo.uniforms);
  12176. uniforms.map.value = map;
  12177. var materialFirst = new THREE.ShaderMaterial({
  12178. fragmentShader: floorLogo.fragmentShader,
  12179. vertexShader: floorLogo.vertexShader,
  12180. uniforms: uniforms,
  12181. side: THREE.DoubleSide,
  12182. transparent: !0,
  12183. premultipliedAlpha: true // !!! 不加这句的话透明部分会变黑
  12184. });
  12185. materialFirst.needsUpdate = true;
  12186. var tex = common.renderTex(materialFirst, this.app.core.get('SceneRenderer').renderer, {
  12187. x: 512,
  12188. y: 512
  12189. });
  12190. materialFirst.dispose();
  12191. tex.anisotropy = 5; //防止倾斜模糊
  12192. return tex;
  12193. }
  12194. }, {
  12195. key: "getLogo",
  12196. value: function getLogo() {
  12197. var metadata = this.app.store.getValue('metadata');
  12198. var url = '';
  12199. var logo = this.app.config.scene.floorlogoId || metadata.floorLogo || '0';
  12200. if (this.app.config.lang != 'zh') {
  12201. logo = 'en/' + logo;
  12202. }
  12203. if (this.app.config.region == 'aws') {
  12204. logo = 'aws/' + logo;
  12205. }
  12206. var size = metadata.floorLogoSize || 100;
  12207. if (metadata.floorLogo === 'user') {
  12208. url = this.app.resource.getUserResourceURL(metadata.floorLogoFile);
  12209. } else {
  12210. url = this.app.resource.getAppURL("images/floorlogos/".concat(logo, ".png"));
  12211. }
  12212. return {
  12213. url,
  12214. size
  12215. };
  12216. }
  12217. }, {
  12218. key: "changeFloorLogo",
  12219. value: function changeFloorLogo(logo) {
  12220. var _this3 = this;
  12221. if (!this.ready) {
  12222. return;
  12223. }
  12224. var material = this.firstLogo.material;
  12225. var changeTex = function changeTex(tex) {
  12226. material.map && material.map.dispose();
  12227. var outputTex = _this3.getTex(tex);
  12228. _this3.firstLogo.material.map = outputTex;
  12229. _this3.secondLogo.material.map = outputTex;
  12230. };
  12231. if (logo.url) {
  12232. texture.load(logo.url, changeTex);
  12233. } else if (logo.id) {
  12234. texture.load(this.app.resource.getAppURL("images/floorlogos/".concat(logo.id, ".png")), changeTex);
  12235. } else if (logo.image) {
  12236. var tex = new THREE.Texture(logo.image);
  12237. tex.needsUpdate = !0;
  12238. changeTex(tex);
  12239. }
  12240. if (logo.size) {
  12241. var scale = logo.size / 100;
  12242. this.firstLogo.scale.set(scale, scale, scale);
  12243. this.secondLogo.scale.set(scale, scale, scale);
  12244. }
  12245. } //渐变opacity
  12246. }]);
  12247. return FloorLogos;
  12248. }(tinyEmitter);
  12249. function _createSuper$1o(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1o(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  12250. function _isNativeReflectConstruct$1o() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  12251. var BoxBufferGeometry = THREE.BoxBufferGeometry,
  12252. BufferGeometry = THREE.BufferGeometry,
  12253. Color = THREE.Color,
  12254. CylinderBufferGeometry = THREE.CylinderBufferGeometry,
  12255. DoubleSide = THREE.DoubleSide,
  12256. Euler = THREE.Euler,
  12257. Float32BufferAttribute = THREE.Float32BufferAttribute,
  12258. Line$1 = THREE.Line;
  12259. THREE.LineBasicMaterial;
  12260. var Matrix4$1 = THREE.Matrix4,
  12261. Mesh = THREE.Mesh,
  12262. MeshBasicMaterial = THREE.MeshBasicMaterial,
  12263. Object3D = THREE.Object3D,
  12264. OctahedronBufferGeometry = THREE.OctahedronBufferGeometry,
  12265. PlaneBufferGeometry = THREE.PlaneBufferGeometry,
  12266. Quaternion$1 = THREE.Quaternion;
  12267. THREE.Raycaster;
  12268. var TorusBufferGeometry = THREE.TorusBufferGeometry;
  12269. var changeEvent, mouseDownEvent, mouseMoveEvent, mouseUpEvent, objectChangeEvent; // Reusable utility variables
  12270. var ray$1 = new THREE.Raycaster();
  12271. var _tempVector = new THREE.Vector3();
  12272. var _tempVector2 = new THREE.Vector3();
  12273. var _tempQuaternion = new THREE.Quaternion();
  12274. var _unit = {
  12275. X: new THREE.Vector3(1, 0, 0),
  12276. Y: new THREE.Vector3(0, 1, 0),
  12277. Z: new THREE.Vector3(0, 0, 1)
  12278. };
  12279. var pointStart = new THREE.Vector3();
  12280. var pointEnd = new THREE.Vector3();
  12281. var offset = new THREE.Vector3();
  12282. var rotationAxis = new THREE.Vector3();
  12283. var startNorm = new THREE.Vector3();
  12284. var endNorm = new THREE.Vector3();
  12285. var rotationAngle = 0;
  12286. var cameraPosition = new THREE.Vector3();
  12287. var cameraQuaternion = new THREE.Quaternion();
  12288. var cameraScale = new THREE.Vector3();
  12289. var parentPosition = new THREE.Vector3();
  12290. var parentQuaternion = new THREE.Quaternion();
  12291. var parentQuaternionInv = new THREE.Quaternion();
  12292. var parentScale = new THREE.Vector3();
  12293. var worldPositionStart = new THREE.Vector3();
  12294. var worldQuaternionStart = new THREE.Quaternion();
  12295. var worldScaleStart = new THREE.Vector3();
  12296. var worldPosition = new THREE.Vector3();
  12297. var worldQuaternion = new THREE.Quaternion();
  12298. var worldQuaternionInv = new THREE.Quaternion();
  12299. var worldScale = new THREE.Vector3();
  12300. var eye = new THREE.Vector3();
  12301. var positionStart = new THREE.Vector3();
  12302. var quaternionStart = new THREE.Quaternion();
  12303. var scaleStart = new THREE.Vector3();
  12304. var _gizmo, _plane;
  12305. var lastRotationAngle = 0; // 用于计算旋转时的deltaAngle
  12306. var TransformControls = /*#__PURE__*/function (_THREE$Object3D) {
  12307. _inherits(TransformControls, _THREE$Object3D);
  12308. var _super = _createSuper$1o(TransformControls);
  12309. function TransformControls(camera, domElement, options) {
  12310. var _this;
  12311. _classCallCheck(this, TransformControls);
  12312. _this = _super.call(this);
  12313. if (domElement === undefined) {
  12314. console.warn('THREE.TransformControls: The second parameter "domElement" is now mandatory.');
  12315. domElement = document;
  12316. }
  12317. _this.visible = false;
  12318. _this.domElement = domElement;
  12319. _gizmo = new TransformControlsGizmo(options);
  12320. _this.add(_gizmo);
  12321. _plane = new TransformControlsPlane(options);
  12322. _this.add(_plane);
  12323. _this.player = options.player; //xzw add
  12324. _this.options = options; //xzw add
  12325. changeEvent = {
  12326. type: 'change'
  12327. };
  12328. mouseDownEvent = {
  12329. type: 'mouseDown'
  12330. };
  12331. mouseUpEvent = {
  12332. type: 'mouseUp',
  12333. mode: _this.mode
  12334. };
  12335. mouseMoveEvent = {
  12336. type: 'mousing'
  12337. };
  12338. objectChangeEvent = {
  12339. type: 'objectChange'
  12340. }; // Define properties with getters/setter
  12341. // Setting the defined property will automatically trigger change event
  12342. // Defined properties are passed down to gizmo and plane
  12343. _this.defineProperty('camera', camera);
  12344. _this.defineProperty('object', undefined);
  12345. _this.defineProperty('enabled', true);
  12346. _this.defineProperty('axis', null);
  12347. _this.defineProperty('mode', 'translate');
  12348. _this.defineProperty('translationSnap', null);
  12349. _this.defineProperty('rotationSnap', null);
  12350. _this.defineProperty('scaleSnap', null);
  12351. _this.defineProperty('space', 'world');
  12352. _this.defineProperty('spaceForRotate', null);
  12353. _this.defineProperty('size', 1);
  12354. _this.defineProperty('dragging', false);
  12355. _this.defineProperty('showX', true);
  12356. _this.defineProperty('showY', true);
  12357. _this.defineProperty('showZ', true); // TODO: remove properties unused in plane and gizmo
  12358. _this.defineProperty('worldPosition', worldPosition);
  12359. _this.defineProperty('worldPositionStart', worldPositionStart);
  12360. _this.defineProperty('worldQuaternion', worldQuaternion);
  12361. _this.defineProperty('worldQuaternionStart', worldQuaternionStart);
  12362. _this.defineProperty('cameraPosition', cameraPosition);
  12363. _this.defineProperty('cameraQuaternion', cameraQuaternion);
  12364. _this.defineProperty('pointStart', pointStart);
  12365. _this.defineProperty('pointEnd', pointEnd);
  12366. _this.defineProperty('rotationAxis', rotationAxis);
  12367. _this.defineProperty('rotationAngle', rotationAngle);
  12368. _this.defineProperty('eye', eye);
  12369. domElement.addEventListener('mousedown', _this.onPointerDown.bind(_assertThisInitialized(_this)), false);
  12370. domElement.addEventListener('touchstart', _this.onPointerDown.bind(_assertThisInitialized(_this)), false);
  12371. domElement.addEventListener('mousemove', _this.onPointerHover.bind(_assertThisInitialized(_this)), false);
  12372. domElement.addEventListener('touchmove', _this.onPointerHover.bind(_assertThisInitialized(_this)), false);
  12373. domElement.addEventListener('touchmove', _this.onPointerMove.bind(_assertThisInitialized(_this)), false);
  12374. window.addEventListener('mouseup', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
  12375. window.addEventListener('pointerup', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
  12376. domElement.addEventListener('touchend', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
  12377. domElement.addEventListener('touchcancel', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
  12378. domElement.addEventListener('touchleave', _this.onPointerUp.bind(_assertThisInitialized(_this)), false); // this.player.$app.core.get('SceneRenderer').addComponent(this)
  12379. _this.isTransformControls = true;
  12380. return _this;
  12381. }
  12382. _createClass(TransformControls, [{
  12383. key: "dispose",
  12384. value: function dispose() {
  12385. domElement.removeEventListener('mousedown', this.onPointerDown.bind(this));
  12386. domElement.removeEventListener('touchstart', this.onPointerDown.bind(this));
  12387. domElement.removeEventListener('mousemove', this.onPointerHover.bind(this));
  12388. document.removeEventListener('mousemove', this.onPointerMove.bind(this));
  12389. domElement.removeEventListener('touchmove', this.onPointerHover.bind(this));
  12390. domElement.removeEventListener('touchmove', this.onPointerMove.bind(this));
  12391. window.removeEventListener('mouseup', this.onPointerUp.bind(this), false);
  12392. window.removeEventListener('pointerup', this.onPointerUp.bind(this), false);
  12393. domElement.removeEventListener('touchend', this.onPointerUp.bind(this));
  12394. domElement.removeEventListener('touchcancel', this.onPointerUp.bind(this));
  12395. domElement.removeEventListener('touchleave', this.onPointerUp.bind(this));
  12396. this.traverse(function (child) {
  12397. if (child.geometry) child.geometry.dispose();
  12398. if (child.material) child.material.dispose();
  12399. });
  12400. } // Set current object
  12401. // 通过设置object的width和depth来设置箭头偏移
  12402. }, {
  12403. key: "attach",
  12404. value: function attach(object) {
  12405. this.object = object;
  12406. this.visible = true;
  12407. config$4.isTyping = true; //add
  12408. return this;
  12409. } // Detatch from object
  12410. }, {
  12411. key: "detach",
  12412. value: function detach() {
  12413. this.object = undefined;
  12414. this.visible = false;
  12415. this.axis = null;
  12416. config$4.isTyping = false; //add
  12417. return this;
  12418. } //add
  12419. }, {
  12420. key: "setSize",
  12421. value: function setSize(x, y) {}
  12422. }, {
  12423. key: "switchEditState",
  12424. value: function switchEditState(state) {
  12425. var oldScaleAxis = JSON.stringify(this.options.scaleAxis);
  12426. if (state == 'overlay') {
  12427. this.options.NoScaleZ = true;
  12428. this.options.scaleAxis = ['x', 'y'];
  12429. } else if (state == 'panovideo') {
  12430. this.mode = 'scale';
  12431. this.options.NoScaleZ = true;
  12432. this.options.scaleAxis = ['x', 'y'];
  12433. } else if (state == 'decoration') {
  12434. this.options.NoScaleZ = false;
  12435. this.options.scaleAxis = ['x', 'y', 'z'];
  12436. } else if (state == 'clipbox') {
  12437. this.options.NoScaleZ = false;
  12438. this.options.scaleAxis = ['x', 'y', 'z'];
  12439. } else if (state == 'css3dpanel') {
  12440. this.options.NoScaleZ = false;
  12441. this.options.scaleAxis = ['x', 'y'];
  12442. }
  12443. if (oldScaleAxis != JSON.stringify(this.options.scaleAxis)) {
  12444. this.rebuildAxis('scale');
  12445. }
  12446. this.editState = state; //this.visible = true
  12447. }
  12448. }, {
  12449. key: "filterRotateAxis",
  12450. value: function filterRotateAxis(axisArr) {
  12451. var oldRotateAxis = JSON.stringify(this.options.rotateAxis);
  12452. this.options.rotateAxis = axisArr;
  12453. if (oldRotateAxis != JSON.stringify(this.options.rotateAxis)) {
  12454. this.rebuildAxis('rotate');
  12455. }
  12456. }
  12457. }, {
  12458. key: "rebuildAxis",
  12459. value: function rebuildAxis(transType) {
  12460. _gizmo.gizmo[transType].removeFromParent();
  12461. _gizmo.picker[transType].removeFromParent();
  12462. _gizmo.gizmo[transType].traverse(function (child) {
  12463. if (child.geometry) child.geometry.dispose();
  12464. if (child.material) child.material.dispose();
  12465. });
  12466. _gizmo.picker[transType].traverse(function (child) {
  12467. if (child.geometry) child.geometry.dispose();
  12468. if (child.material) child.material.dispose();
  12469. });
  12470. var _gizmo2 = _gizmo['update' + transType.charAt(0).toUpperCase() + transType.slice(1)](),
  12471. gizmo = _gizmo2.gizmo,
  12472. picker = _gizmo2.picker; // updateScale()、updateRotate()
  12473. _gizmo.add(_gizmo.gizmo[transType] = _gizmo.setupGizmo(gizmo));
  12474. _gizmo.add(_gizmo.picker[transType] = _gizmo.setupGizmo(picker));
  12475. _gizmo.picker[transType].visible = false;
  12476. }
  12477. }, {
  12478. key: "handleDragStart",
  12479. value: function handleDragStart() {
  12480. this.editState && this.onPointerDown();
  12481. }
  12482. }, {
  12483. key: "handleDragging",
  12484. value: function handleDragging() {
  12485. this.editState && this.onPointerMove();
  12486. }
  12487. }, {
  12488. key: "handleDragEnd",
  12489. value: function handleDragEnd() {
  12490. this.editState && this.onPointerUp();
  12491. } //-------------------
  12492. // Defined getter, setter and store for a property
  12493. }, {
  12494. key: "defineProperty",
  12495. value: function defineProperty(propName, defaultValue) {
  12496. var propValue = defaultValue;
  12497. Object.defineProperty(this, propName, {
  12498. get: function get() {
  12499. return propValue !== undefined ? propValue : defaultValue;
  12500. },
  12501. set: function set(value) {
  12502. if (propValue !== value) {
  12503. propValue = value;
  12504. _plane[propName] = value;
  12505. _gizmo[propName] = value;
  12506. this.dispatchEvent({
  12507. type: propName + '-changed',
  12508. value: value
  12509. });
  12510. this.dispatchEvent(changeEvent);
  12511. }
  12512. }
  12513. });
  12514. this[propName] = defaultValue;
  12515. _plane[propName] = defaultValue;
  12516. _gizmo[propName] = defaultValue;
  12517. } // updateMatrixWorld updates key transformation variables
  12518. }, {
  12519. key: "updateMatrixWorld",
  12520. value: function updateMatrixWorld() {
  12521. if (this.object !== undefined) {
  12522. this.object.updateMatrixWorld();
  12523. this.object.parent.matrixWorld.decompose(parentPosition, parentQuaternion, parentScale);
  12524. this.object.matrixWorld.decompose(worldPosition, worldQuaternion, worldScale);
  12525. parentQuaternionInv.copy(parentQuaternion).invert();
  12526. worldQuaternionInv.copy(worldQuaternion).invert();
  12527. }
  12528. this.camera.updateMatrixWorld();
  12529. this.camera.matrixWorld.decompose(cameraPosition, cameraQuaternion, cameraScale);
  12530. eye.copy(cameraPosition).sub(worldPosition).normalize();
  12531. Object3D.prototype.updateMatrixWorld.call(this);
  12532. }
  12533. }, {
  12534. key: "pointerHover",
  12535. value: function pointerHover(pointer) {
  12536. if (this.object === undefined || this.dragging === true || pointer.button !== undefined && pointer.button !== 0) return; //ray.setFromCamera( pointer, this.camera ); //������floorplanģʽget����intersect
  12537. var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera);
  12538. ray$1.set(origin, this.player.getMouseDirection(pointer));
  12539. var intersect = ray$1.intersectObjects(_gizmo.picker[this.mode].children, true)[0] || false;
  12540. if (intersect) {
  12541. this.axis = intersect.object.name;
  12542. this.intersect = intersect.object; //add
  12543. this.player.domElement.style.cursor = 'pointer';
  12544. } else {
  12545. this.intersect = null;
  12546. this.axis = null;
  12547. this.player.domElement.style.cursor = '';
  12548. }
  12549. }
  12550. }, {
  12551. key: "pointerDown",
  12552. value: function pointerDown(pointer) {
  12553. if (this.object === undefined || this.dragging === true || pointer.button !== undefined && pointer.button !== 0) return;
  12554. if ((pointer.button === 0 || pointer.button === undefined) && this.axis !== null) {
  12555. //ray.setFromCamera( pointer, this.camera ); //������floorplanģʽget����intersect
  12556. var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera);
  12557. ray$1.set(origin, this.player.getMouseDirection(pointer));
  12558. var planeIntersect = ray$1.intersectObjects([_plane], true)[0] || false;
  12559. if (planeIntersect) {
  12560. var space = this.space;
  12561. if (this.mode === 'scale') {
  12562. space = 'local';
  12563. } else if (this.axis === 'E' || this.axis === 'XYZE' || this.axis === 'XYZ') {
  12564. space = 'world';
  12565. }
  12566. if (space === 'local' && this.mode === 'rotate') {
  12567. var snap = this.rotationSnap;
  12568. if (this.axis === 'X' && snap) this.object.rotation.x = Math.round(this.object.rotation.x / snap) * snap;
  12569. if (this.axis === 'Y' && snap) this.object.rotation.y = Math.round(this.object.rotation.y / snap) * snap;
  12570. if (this.axis === 'Z' && snap) this.object.rotation.z = Math.round(this.object.rotation.z / snap) * snap;
  12571. }
  12572. this.object.updateMatrixWorld();
  12573. this.object.parent.updateMatrixWorld();
  12574. positionStart.copy(this.object.position);
  12575. quaternionStart.copy(this.object.quaternion);
  12576. scaleStart.copy(this.object.scale);
  12577. this.object.matrixWorld.decompose(worldPositionStart, worldQuaternionStart, worldScaleStart);
  12578. pointStart.copy(planeIntersect.point).sub(worldPositionStart);
  12579. if (this.player.cameraControls.activeControl) {
  12580. //this.player.cameraControls.activeControl.locked = true; //add
  12581. this.player.cameraControls.activeControl.enabled = false; //add
  12582. }
  12583. }
  12584. this.dragging = true;
  12585. mouseDownEvent.mode = this.mode;
  12586. this.dispatchEvent(mouseDownEvent);
  12587. }
  12588. }
  12589. }, {
  12590. key: "pointerMove",
  12591. value: function pointerMove(pointer) {
  12592. var axis = this.axis;
  12593. var mode = this.mode;
  12594. var object = this.object;
  12595. var space = this.space;
  12596. if (mode === 'scale') {
  12597. space = 'local';
  12598. } else if (axis === 'E' || axis === 'XYZE' || axis === 'XYZ') {
  12599. space = 'world';
  12600. } //console.log(axis)
  12601. if (object === undefined || axis === null || this.dragging === false || pointer.button !== undefined && pointer.button !== 0) return; //ray.setFromCamera( pointer, this.camera ); //������floorplanģʽget����intersect
  12602. var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera);
  12603. ray$1.set(origin, this.player.getMouseDirection(pointer));
  12604. var planeIntersect = ray$1.intersectObjects([_plane], true)[0] || false;
  12605. if (planeIntersect === false) return;
  12606. pointEnd.copy(planeIntersect.point).sub(worldPositionStart);
  12607. if (mode === 'translate') {
  12608. // Apply translate
  12609. offset.copy(pointEnd).sub(pointStart);
  12610. if (space === 'local' && axis !== 'XYZ') {
  12611. offset.applyQuaternion(worldQuaternionInv);
  12612. }
  12613. if (axis.indexOf('X') === -1) offset.x = 0;
  12614. if (axis.indexOf('Y') === -1) offset.y = 0;
  12615. if (axis.indexOf('Z') === -1) offset.z = 0;
  12616. if (space === 'local' && axis !== 'XYZ') {
  12617. offset.applyQuaternion(quaternionStart).divide(parentScale);
  12618. } else {
  12619. offset.applyQuaternion(parentQuaternionInv).divide(parentScale);
  12620. }
  12621. if (object.overlayType) {
  12622. // overlay高度略小于地面高度时会出bug
  12623. var heightProtect = object.floor.boundingBox.min.y - offset.y - positionStart.y;
  12624. if (heightProtect > 0 && heightProtect < 0.024) offset.y = object.floor.boundingBox.min.y - positionStart.y;
  12625. } // 当scale缩放为负时,offset得出的y、z值符号相反,原因不明,目前先打个补丁
  12626. offset.y *= Math.sign(object.scale.y);
  12627. offset.z *= Math.sign(object.scale.z);
  12628. object.position.copy(offset).add(positionStart); // Apply translation snap
  12629. if (this.translationSnap) {
  12630. if (space === 'local') {
  12631. object.position.applyQuaternion(_tempQuaternion.copy(quaternionStart).invert());
  12632. if (axis.search('X') !== -1) {
  12633. object.position.x = Math.round(object.position.x / this.translationSnap) * this.translationSnap;
  12634. }
  12635. if (axis.search('Y') !== -1) {
  12636. object.position.y = Math.round(object.position.y / this.translationSnap) * this.translationSnap;
  12637. }
  12638. if (axis.search('Z') !== -1) {
  12639. object.position.z = Math.round(object.position.z / this.translationSnap) * this.translationSnap;
  12640. }
  12641. object.position.applyQuaternion(quaternionStart);
  12642. }
  12643. if (space === 'world') {
  12644. if (object.parent) {
  12645. object.position.add(_tempVector.setFromMatrixPosition(object.parent.matrixWorld));
  12646. }
  12647. if (axis.search('X') !== -1) {
  12648. object.position.x = Math.round(object.position.x / this.translationSnap) * this.translationSnap;
  12649. }
  12650. if (axis.search('Y') !== -1) {
  12651. object.position.y = Math.round(object.position.y / this.translationSnap) * this.translationSnap;
  12652. }
  12653. if (axis.search('Z') !== -1) {
  12654. object.position.z = Math.round(object.position.z / this.translationSnap) * this.translationSnap;
  12655. }
  12656. if (object.parent) {
  12657. object.position.sub(_tempVector.setFromMatrixPosition(object.parent.matrixWorld));
  12658. }
  12659. }
  12660. }
  12661. } else if (mode === 'scale') {
  12662. if (axis.search('XYZ') !== -1) {
  12663. var d = pointEnd.length() / pointStart.length();
  12664. if (pointEnd.dot(pointStart) < 0) d *= -1;
  12665. if (this.options.NoScaleZ) {
  12666. //xzw add
  12667. _tempVector2.set(d, d, 1);
  12668. } else {
  12669. _tempVector2.set(d, d, d);
  12670. }
  12671. } else if (axis.search('XY') !== -1) {
  12672. //add 等比例for plane
  12673. var d = pointEnd.length() / pointStart.length();
  12674. if (pointEnd.dot(pointStart) < 0) d *= -1;
  12675. _tempVector2.set(d, d, 1);
  12676. } else {
  12677. _tempVector.copy(pointStart);
  12678. _tempVector2.copy(pointEnd);
  12679. _tempVector.applyQuaternion(worldQuaternionInv);
  12680. _tempVector2.applyQuaternion(worldQuaternionInv);
  12681. _tempVector2.divide(_tempVector);
  12682. if (axis.search('X') === -1) {
  12683. _tempVector2.x = 1;
  12684. }
  12685. if (axis.search('Y') === -1) {
  12686. _tempVector2.y = 1;
  12687. }
  12688. if (axis.search('Z') === -1) {
  12689. _tempVector2.z = 1;
  12690. }
  12691. } // Apply scale
  12692. /*if (this.editState == 'overlay' ) {
  12693. // 将视频缩放大小限制在0.1到10之间
  12694. if (Math.abs(scaleStart.x * _tempVector2.x * settings.overlay.width) < 0.1) return
  12695. if (Math.abs(scaleStart.x * _tempVector2.x * settings.overlay.width) > 10) return
  12696. if (Math.abs(scaleStart.y * _tempVector2.y * settings.overlay.height) < 0.1) return
  12697. if (Math.abs(scaleStart.y * _tempVector2.y * settings.overlay.height) > 10) return
  12698. }
  12699. if (this.editState == 'decoration') {
  12700. // 将模型缩放大小限制在0.1到10之间
  12701. if (Math.abs(scaleStart.x * _tempVector2.x) < 0.1) return
  12702. if (Math.abs(scaleStart.x * _tempVector2.x) > 10) return
  12703. if (Math.abs(scaleStart.y * _tempVector2.y) < 0.1) return
  12704. if (Math.abs(scaleStart.y * _tempVector2.y) > 10) return
  12705. if (Math.abs(scaleStart.z * _tempVector2.z) < 0.1) return
  12706. if (Math.abs(scaleStart.z * _tempVector2.z) > 10) return
  12707. } */
  12708. if (this.editState == 'overlay' || this.editState == 'decoration') {
  12709. // 将模型缩放大小限制在0.1到10之间
  12710. var min = 0.1,
  12711. max = 10;
  12712. if (this.editState == 'overlay') {
  12713. //先暂乘以geo长宽比率,修改为真实大小
  12714. scaleStart.x *= settings$3.overlay.width;
  12715. scaleStart.y *= settings$3.overlay.height;
  12716. }
  12717. var axises = ['x', 'y', 'z'];
  12718. var result = {
  12719. min: {
  12720. v: Infinity
  12721. },
  12722. max: {
  12723. v: -Infinity
  12724. }
  12725. };
  12726. axises.forEach(function (e) {
  12727. _tempVector2[e] = Math.abs(_tempVector2[e]); //先保证都是非负
  12728. if (_tempVector2[e] != 1) {
  12729. var v = _tempVector2[e] * scaleStart[e];
  12730. if (v < result.min.v) {
  12731. result.min.axis = e, result.min.v = v;
  12732. } else if (v > result.min.v) {
  12733. result.max.axis = e, result.max.v = v;
  12734. }
  12735. }
  12736. }); //已知_tempVector2 的三个轴的值除了1其他的都一样
  12737. var newS;
  12738. if (result.min.v < min) {
  12739. //用最小的得到最小比值
  12740. newS = min / scaleStart[result.min.axis];
  12741. } else if (result.max.v > max) {
  12742. //用最大的得到最大比值
  12743. newS = max / scaleStart[result.max.axis];
  12744. } //newS && console.log('newS',newS,result)
  12745. newS && axises.forEach(function (e) {
  12746. if (_tempVector2[e] != 1) {
  12747. //1的是绝对不能更改的轴
  12748. _tempVector2[e] = newS;
  12749. }
  12750. });
  12751. if (this.editState == 'overlay') {
  12752. //恢复
  12753. scaleStart.x /= settings$3.overlay.width;
  12754. scaleStart.y /= settings$3.overlay.height;
  12755. } //注,拖拽缩小时,容易缩放不到0(如0.3)就直接变大,因为需要无限接近原点才行。
  12756. }
  12757. if (this.editState == 'clipbox') ;
  12758. object.scale.copy(scaleStart).multiply(_tempVector2);
  12759. if (this.scaleSnap) {
  12760. if (axis.search('X') !== -1) {
  12761. object.scale.x = Math.round(object.scale.x / this.scaleSnap) * this.scaleSnap || this.scaleSnap;
  12762. }
  12763. if (axis.search('Y') !== -1) {
  12764. object.scale.y = Math.round(object.scale.y / this.scaleSnap) * this.scaleSnap || this.scaleSnap;
  12765. }
  12766. if (axis.search('Z') !== -1) {
  12767. object.scale.z = Math.round(object.scale.z / this.scaleSnap) * this.scaleSnap || this.scaleSnap;
  12768. }
  12769. } //add
  12770. if (this.editState == 'overlay') {
  12771. object.width = settings$3.overlay.width * object.scale.x;
  12772. object.height = settings$3.overlay.height * object.scale.y;
  12773. this.player.EditOverlay.updateOverlayScaleDisplay();
  12774. }
  12775. } else if (mode === 'rotate') {
  12776. offset.copy(pointEnd).sub(pointStart);
  12777. if (this.player.mode == 'floorplan') {
  12778. var flcamera = this.player.cameraControls.cameras.floorplan;
  12779. var eyeDistance = (flcamera.right - flcamera.left) / flcamera.aspect;
  12780. var ROTATION_SPEED = 5 / eyeDistance;
  12781. } else var ROTATION_SPEED = 5 / worldPosition.distanceTo(_tempVector.setFromMatrixPosition(this.camera.matrixWorld));
  12782. if (axis === 'E') {
  12783. rotationAxis.copy(eye);
  12784. rotationAngle = pointEnd.angleTo(pointStart);
  12785. startNorm.copy(pointStart).normalize();
  12786. endNorm.copy(pointEnd).normalize();
  12787. rotationAngle *= endNorm.cross(startNorm).dot(eye) < 0 ? 1 : -1;
  12788. } else if (axis === 'XYZE') {
  12789. rotationAxis.copy(offset).cross(eye).normalize();
  12790. rotationAngle = offset.dot(_tempVector.copy(rotationAxis).cross(this.eye)) * ROTATION_SPEED;
  12791. } else if (axis === 'X' || axis === 'Y' || axis === 'Z') {
  12792. rotationAxis.copy(_unit[axis]);
  12793. _tempVector.copy(_unit[axis]);
  12794. if (space === 'local') {
  12795. _tempVector.applyQuaternion(worldQuaternion);
  12796. }
  12797. rotationAngle = offset.dot(_tempVector.cross(eye).normalize()) * ROTATION_SPEED;
  12798. } // Apply rotation snap
  12799. if (this.rotationSnap) rotationAngle = Math.round(rotationAngle / this.rotationSnap) * this.rotationSnap;
  12800. this.rotationAngle = rotationAngle; // Apply rotate
  12801. var isLocalSpace = space === 'local';
  12802. if (this.spaceForRotate) {
  12803. if (axis === 'X') isLocalSpace = this.spaceForRotate.x === 'local';
  12804. if (axis === 'Y') isLocalSpace = this.spaceForRotate.y === 'local';
  12805. if (axis === 'Z') isLocalSpace = this.spaceForRotate.z === 'local';
  12806. }
  12807. if (isLocalSpace && axis !== 'E' && axis !== 'XYZE') {
  12808. object.quaternion.copy(quaternionStart);
  12809. object.quaternion.multiply(_tempQuaternion.setFromAxisAngle(rotationAxis, rotationAngle)).normalize();
  12810. } else {
  12811. rotationAxis.applyQuaternion(parentQuaternionInv);
  12812. object.quaternion.copy(_tempQuaternion.setFromAxisAngle(rotationAxis, rotationAngle));
  12813. object.quaternion.multiply(quaternionStart).normalize();
  12814. }
  12815. }
  12816. this.dispatchEvent(Object.assign(mouseMoveEvent, {
  12817. mode: this.mode,
  12818. state: this.editState,
  12819. axis,
  12820. angle: rotationAngle,
  12821. deltaAngle: rotationAngle - lastRotationAngle
  12822. }));
  12823. this.dispatchEvent(changeEvent);
  12824. this.dispatchEvent(objectChangeEvent);
  12825. lastRotationAngle = rotationAngle;
  12826. }
  12827. }, {
  12828. key: "pointerUp",
  12829. value: function pointerUp(pointer) {
  12830. if (this.object === undefined) return; //if ( pointer.button !== undefined && pointer.button !== 0 ) return;
  12831. if (this.dragging && this.axis !== null) {
  12832. mouseUpEvent.mode = this.mode;
  12833. this.dispatchEvent(mouseUpEvent);
  12834. }
  12835. this.dragging = false;
  12836. if (pointer.button === undefined) this.axis = null;
  12837. if (this.player.cameraControls.activeControl) {
  12838. //this.player.cameraControls.activeControl.locked = false; //add
  12839. this.player.cameraControls.activeControl.pointerDragOn = false; //add
  12840. this.player.cameraControls.activeControl.enabled = true;
  12841. }
  12842. lastRotationAngle = 0;
  12843. } // normalize mouse / touch pointer and remap {x,y} to view space.
  12844. }, {
  12845. key: "getPointer",
  12846. value: function getPointer(event) {
  12847. if (!event) {
  12848. console.log('hhahhhahah');
  12849. return;
  12850. }
  12851. if (document.pointerLockElement) {
  12852. return {
  12853. x: 0,
  12854. y: 0,
  12855. button: event.button
  12856. };
  12857. } else {
  12858. var pointer = event.changedTouches ? event.changedTouches[0] : event;
  12859. var rect = domElement.getBoundingClientRect();
  12860. return {
  12861. x: (pointer.clientX - rect.left) / rect.width * 2 - 1,
  12862. y: -(pointer.clientY - rect.top) / rect.height * 2 + 1,
  12863. button: event.button
  12864. };
  12865. }
  12866. } // mouse / touch event handlers
  12867. }, {
  12868. key: "onPointerHover",
  12869. value: function onPointerHover(event) {
  12870. if (!this.enabled) return; //this.pointerHover( getPointer( event ) );
  12871. this.pointerHover(this.player.mouse);
  12872. }
  12873. }, {
  12874. key: "onPointerDown",
  12875. value: function onPointerDown(event) {
  12876. if (!this.enabled) return; //document.addEventListener( "mousemove", onPointerMove, false );
  12877. /* this.pointerHover( getPointer( event ) );
  12878. this.pointerDown( getPointer( event ) ); */
  12879. this.pointerHover(this.player.mouse);
  12880. this.pointerDown(this.player.mouse);
  12881. }
  12882. }, {
  12883. key: "onPointerMove",
  12884. value: function onPointerMove(event) {
  12885. if (!this.enabled || !this.dragging) return; //xzw change
  12886. //this.pointerMove( getPointer( event ) );
  12887. this.pointerMove(this.player.mouse);
  12888. }
  12889. }, {
  12890. key: "onPointerUp",
  12891. value: function onPointerUp(event) {
  12892. if (!this.enabled) return; //document.removeEventListener( "mousemove", onPointerMove, false );
  12893. //this.pointerUp( getPointer( event ) );
  12894. this.pointerUp(this.player.mouse);
  12895. } // TODO: deprecate
  12896. }, {
  12897. key: "getMode",
  12898. value: function getMode() {
  12899. return this.mode;
  12900. }
  12901. }, {
  12902. key: "setMode",
  12903. value: function setMode(mode) {
  12904. this.mode = mode;
  12905. }
  12906. }, {
  12907. key: "setTranslationSnap",
  12908. value: function setTranslationSnap(translationSnap) {
  12909. this.translationSnap = translationSnap;
  12910. }
  12911. }, {
  12912. key: "setRotationSnap",
  12913. value: function setRotationSnap(rotationSnap) {
  12914. this.rotationSnap = rotationSnap;
  12915. }
  12916. }, {
  12917. key: "setScaleSnap",
  12918. value: function setScaleSnap(scaleSnap) {
  12919. this.scaleSnap = scaleSnap;
  12920. }
  12921. /* this.setSize = function ( size ) {
  12922. this.size = size;
  12923. }; */
  12924. }, {
  12925. key: "setSpace",
  12926. value: function setSpace(space) {
  12927. this.space = space;
  12928. }
  12929. }, {
  12930. key: "update",
  12931. value: function update() {
  12932. console.warn('THREE.TransformControls: update function has no more functionality and therefore has been deprecated.');
  12933. }
  12934. }]);
  12935. return TransformControls;
  12936. }(THREE.Object3D); // TransformControls.prototype = Object.assign(Object.create(Object3D.prototype), {
  12937. // constructor: TransformControls,
  12938. // isTransformControls: true,
  12939. // })
  12940. var TransformControlsGizmo = /*#__PURE__*/function (_THREE$Object3D2) {
  12941. _inherits(TransformControlsGizmo, _THREE$Object3D2);
  12942. var _super2 = _createSuper$1o(TransformControlsGizmo);
  12943. function TransformControlsGizmo(options) {
  12944. var _this2;
  12945. _classCallCheck(this, TransformControlsGizmo);
  12946. _this2 = _super2.call(this);
  12947. _this2.type = 'TransformControlsGizmo';
  12948. _this2.options = options;
  12949. _this2.player = options.player; // shared materials
  12950. var gizmoMaterial = new THREE.MeshBasicMaterial({
  12951. depthTest: false,
  12952. depthWrite: false,
  12953. transparent: true,
  12954. side: DoubleSide,
  12955. fog: false
  12956. });
  12957. var gizmoLineMaterial = new THREE.LineBasicMaterial({
  12958. depthTest: false,
  12959. depthWrite: false,
  12960. transparent: true,
  12961. linewidth: 1,
  12962. fog: false
  12963. }); // Make unique material for each axis/color
  12964. var matInvisible = gizmoMaterial.clone();
  12965. matInvisible.opacity = 0.35;
  12966. var matHelper = gizmoMaterial.clone();
  12967. matHelper.opacity = 0.1; //У׼��
  12968. var matRed = gizmoMaterial.clone();
  12969. matRed.color.set(0xff0000);
  12970. var matGreen = gizmoMaterial.clone();
  12971. matGreen.color.set(0x00ff00);
  12972. var matBlue = gizmoMaterial.clone();
  12973. matBlue.color.set(0x0000ff);
  12974. var matWhiteTransparent = gizmoMaterial.clone();
  12975. matWhiteTransparent.opacity = 0.75;
  12976. matWhiteTransparent.color.set(0xf0f0f0); // matWhiteTransparent.color.set(0x00d0fd) //xzw add
  12977. var matYellowTransparent = matWhiteTransparent.clone();
  12978. matYellowTransparent.color.set(0xffff00);
  12979. var matCyanTransparent = matWhiteTransparent.clone();
  12980. matCyanTransparent.color.set(0x00ffff);
  12981. var matMagentaTransparent = matWhiteTransparent.clone();
  12982. matMagentaTransparent.color.set(0xff00ff);
  12983. var matYellow = gizmoMaterial.clone();
  12984. matYellow.color.set(0xffff00);
  12985. var matLineRed = gizmoLineMaterial.clone();
  12986. matLineRed.color.set(0xff0000);
  12987. var matLineGreen = gizmoLineMaterial.clone();
  12988. matLineGreen.color.set(0x00ff00);
  12989. var matLineBlue = gizmoLineMaterial.clone();
  12990. matLineBlue.color.set(0x0000ff);
  12991. var matLineCyan = gizmoLineMaterial.clone();
  12992. matLineCyan.color.set(0x00ffff);
  12993. var matLineMagenta = gizmoLineMaterial.clone();
  12994. matLineMagenta.color.set(0xff00ff);
  12995. var matLineYellow = gizmoLineMaterial.clone();
  12996. matLineYellow.color.set(0xffff00);
  12997. var matLineGray = gizmoLineMaterial.clone();
  12998. matLineGray.color.set(0x787878);
  12999. var matLineYellowTransparent = matLineYellow.clone();
  13000. matLineYellowTransparent.opacity = 0.25; // reusable geometry
  13001. var arrowGeometry = new CylinderBufferGeometry(0, 0.07, 0.2, 12, 1, false);
  13002. var scaleHandleGeometry = new BoxBufferGeometry(0.125, 0.125, 0.125);
  13003. var lineGeometry = new BufferGeometry();
  13004. lineGeometry.setAttribute('position', new Float32BufferAttribute([0, 0, 0, 1, 0, 0], 3)); //--------------- xzw add fatLines: -----------------
  13005. var fatLinePoints = {
  13006. 'x+': [{
  13007. x: 0,
  13008. y: 0,
  13009. z: 0
  13010. }, {
  13011. x: 0.5,
  13012. y: 0,
  13013. z: 0
  13014. }],
  13015. 'x-': [{
  13016. x: 0,
  13017. y: 0,
  13018. z: 0
  13019. }, {
  13020. x: -0.5,
  13021. y: 0,
  13022. z: 0
  13023. }],
  13024. 'y+': [{
  13025. x: 0,
  13026. y: 0,
  13027. z: 0
  13028. }, {
  13029. x: 0,
  13030. y: 0.5,
  13031. z: 0
  13032. }],
  13033. 'y-': [{
  13034. x: 0,
  13035. y: 0,
  13036. z: 0
  13037. }, {
  13038. x: 0,
  13039. y: -0.5,
  13040. z: 0
  13041. }],
  13042. 'z+': [{
  13043. x: 0,
  13044. y: 0,
  13045. z: 0
  13046. }, {
  13047. x: 0,
  13048. y: 0,
  13049. z: 0.5
  13050. }],
  13051. 'z-': [{
  13052. x: 0,
  13053. y: 0,
  13054. z: 0
  13055. }, {
  13056. x: 0,
  13057. y: 0,
  13058. z: -0.5
  13059. }]
  13060. };
  13061. var fatLineGeos = {};
  13062. var fatLintMats = {
  13063. x: LineDraw.createFatLineMat({
  13064. lineWidth: 3,
  13065. color: 0xff0000,
  13066. depthTest: false,
  13067. opacity: 0.9
  13068. }),
  13069. y: LineDraw.createFatLineMat({
  13070. lineWidth: 3,
  13071. color: 0x00ff00,
  13072. depthTest: false,
  13073. opacity: 0.9
  13074. }),
  13075. z: LineDraw.createFatLineMat({
  13076. lineWidth: 3,
  13077. color: 0x0000ff,
  13078. depthTest: false,
  13079. opacity: 0.9
  13080. })
  13081. };
  13082. var getFatLine = function getFatLine(geoName, matName) {
  13083. var points = fatLinePoints[geoName];
  13084. var material = fatLintMats[matName];
  13085. var line = LineDraw.createFatLine(points, {
  13086. material
  13087. });
  13088. fatLineGeos[geoName] = line.geometry; //record
  13089. line.renderOrder = 4;
  13090. return line;
  13091. }; //--------------------------------------------------
  13092. var CircleGeometry = function CircleGeometry(radius, arc) {
  13093. var geometry = new BufferGeometry();
  13094. var vertices = [];
  13095. for (var i = 0; i <= 64 * arc; ++i) {
  13096. vertices.push(0, Math.cos(i / 32 * Math.PI) * radius, Math.sin(i / 32 * Math.PI) * radius);
  13097. }
  13098. geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));
  13099. return geometry;
  13100. }; // Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position
  13101. var TranslateHelperGeometry = function TranslateHelperGeometry() {
  13102. var geometry = new BufferGeometry();
  13103. geometry.setAttribute('position', new Float32BufferAttribute([0, 0, 0, 1, 1, 1], 3));
  13104. return geometry;
  13105. }; // Gizmo definitions - custom hierarchy definitions for setupGizmo() function
  13106. var gizmoTranslate = {
  13107. X: [[new Mesh(arrowGeometry, matRed), [0.5, 0, 0], [0, 0, -Math.PI / 2], null, 'fwd'], //[ new Mesh( arrowGeometry, matRed ), [ 1, 0, 0 ], [ 0, 0, Math.PI / 2 ], null, 'bwd' ],
  13108. [getFatLine('x+', 'x')
  13109. /* new Line( lineGeometry, matLineRed ) */
  13110. ]],
  13111. Y: [[new Mesh(arrowGeometry, matGreen), [0, 0.5, 0], null, null, 'fwd'], //[ new Mesh( arrowGeometry, matGreen ), [ 0, 1, 0 ], [ Math.PI, 0, 0 ], null, 'bwd' ],
  13112. [getFatLine('y+', 'y')
  13113. /* new Line( lineGeometry, matLineGreen ) */
  13114. ]],
  13115. Z: [[new Mesh(arrowGeometry, matBlue), [0, 0, 0.5], [Math.PI / 2, 0, 0], null, 'fwd'], //[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, 1 ], [ - Math.PI / 2, 0, 0 ], null, 'bwd' ],
  13116. [getFatLine('z+', 'z')
  13117. /* new Line( lineGeometry, matLineBlue ) */
  13118. ]]
  13119. /* XYZ: [
  13120. [ new Mesh( new OctahedronBufferGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ], [ 0, 0, 0 ]]
  13121. ],
  13122. XY: [
  13123. [ new Mesh( new PlaneBufferGeometry( 0.295, 0.295 ), matYellowTransparent.clone() ), [ 0.15, 0.15, 0 ]],
  13124. [ new Line( lineGeometry, matLineYellow ), [ 0.18, 0.3, 0 ], null, [ 0.125, 1, 1 ]],
  13125. [ new Line( lineGeometry, matLineYellow ), [ 0.3, 0.18, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]
  13126. ],
  13127. YZ: [
  13128. [ new Mesh( new PlaneBufferGeometry( 0.295, 0.295 ), matCyanTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],
  13129. [ new Line( lineGeometry, matLineCyan ), [ 0, 0.18, 0.3 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]],
  13130. [ new Line( lineGeometry, matLineCyan ), [ 0, 0.3, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
  13131. ],
  13132. XZ: [
  13133. [ new Mesh( new PlaneBufferGeometry( 0.295, 0.295 ), matMagentaTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],
  13134. [ new Line( lineGeometry, matLineMagenta ), [ 0.18, 0, 0.3 ], null, [ 0.125, 1, 1 ]],
  13135. [ new Line( lineGeometry, matLineMagenta ), [ 0.3, 0, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
  13136. ]*/
  13137. };
  13138. var pickerTranslate = {
  13139. X: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0.3, 0, 0], [0, 0, -Math.PI / 2]]],
  13140. Y: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0.3, 0]]],
  13141. Z: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0, 0.3], [Math.PI / 2, 0, 0]]]
  13142. /* XYZ: [
  13143. [ new Mesh( new OctahedronBufferGeometry( 0.2, 0 ), matInvisible ) ]
  13144. ],
  13145. XY: [
  13146. [ new Mesh( new PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0.2, 0 ]]
  13147. ],
  13148. YZ: [
  13149. [ new Mesh( new PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ]]
  13150. ],
  13151. XZ: [
  13152. [ new Mesh( new PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ]]
  13153. ]*/
  13154. };
  13155. var helperTranslate = {
  13156. START: [[new Mesh(new OctahedronBufferGeometry(0.01, 2), matHelper), null, null, null, 'helper']],
  13157. END: [[new Mesh(new OctahedronBufferGeometry(0.01, 2), matHelper), null, null, null, 'helper']],
  13158. DELTA: [[new Line$1(TranslateHelperGeometry(), matHelper), null, null, null, 'helper']],
  13159. X: [[new Line$1(lineGeometry, matHelper.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], 'helper']],
  13160. Y: [[new Line$1(lineGeometry, matHelper.clone()), [0, -1e3, 0], [0, 0, Math.PI / 2], [1e6, 1, 1], 'helper']],
  13161. Z: [[new Line$1(lineGeometry, matHelper.clone()), [0, 0, -1e3], [0, -Math.PI / 2, 0], [1e6, 1, 1], 'helper']]
  13162. };
  13163. _this2.updateRotate = function () {
  13164. var gizmoRotate = {
  13165. X: [[new Line$1(CircleGeometry(1, 0.5), matLineRed)], [new Mesh(new OctahedronBufferGeometry(0.04, 0), matRed), [0, 0, 0.99], null, [1, 3, 1]]],
  13166. Y: [[new Line$1(CircleGeometry(1, 0.5), matLineGreen), null, [0, 0, -Math.PI / 2]], [new Mesh(new OctahedronBufferGeometry(0.04, 0), matGreen), [0, 0, 0.99], null, [3, 1, 1]]],
  13167. Z: [[new Line$1(CircleGeometry(1, 0.5), matLineBlue), null, [0, Math.PI / 2, 0]], [new Mesh(new OctahedronBufferGeometry(0.04, 0), matBlue), [0.99, 0, 0], null, [1, 3, 1]]],
  13168. /* E: [
  13169. [ new Line( CircleGeometry( 1.25, 1 ), matLineYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]],
  13170. [ new Mesh( new CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 1.17, 0, 0 ], [ 0, 0, - Math.PI / 2 ], [ 1, 1, 0.001 ]],
  13171. [ new Mesh( new CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ - 1.17, 0, 0 ], [ 0, 0, Math.PI / 2 ], [ 1, 1, 0.001 ]],
  13172. [ new Mesh( new CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, - 1.17, 0 ], [ Math.PI, 0, 0 ], [ 1, 1, 0.001 ]],
  13173. [ new Mesh( new CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, 1.17, 0 ], [ 0, 0, 0 ], [ 1, 1, 0.001 ]],
  13174. ] , */
  13175. XYZE: [[new Line$1(CircleGeometry(1, 1), matLineGray), null, [0, Math.PI / 2, 0]]]
  13176. };
  13177. var helperRotate = {
  13178. AXIS: [[new Line$1(lineGeometry, matHelper.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], 'helper']]
  13179. };
  13180. var pickerRotate = {
  13181. X: [[new Mesh(new TorusBufferGeometry(1, 0.1, 4, 24), matInvisible), [0, 0, 0], [0, -Math.PI / 2, -Math.PI / 2]]],
  13182. Y: [[new Mesh(new TorusBufferGeometry(1, 0.1, 4, 24), matInvisible), [0, 0, 0], [Math.PI / 2, 0, 0]]],
  13183. Z: [[new Mesh(new TorusBufferGeometry(1, 0.1, 4, 24), matInvisible), [0, 0, 0], [0, 0, -Math.PI / 2]]]
  13184. /*E: [
  13185. [ new Mesh( new TorusBufferGeometry( 1.25, 0.1, 2, 24 ), matInvisible ) ]
  13186. ] ,
  13187. XYZE: [
  13188. [ new Mesh( new SphereBufferGeometry( 0.7, 10, 8 ), matInvisible ) ]
  13189. ] */
  13190. };
  13191. if (options.rotateAxis) {
  13192. if (options.rotateAxis.indexOf('x') < 0) {
  13193. delete gizmoRotate.X;
  13194. delete gizmoRotate.XYZE;
  13195. delete pickerRotate.X;
  13196. }
  13197. if (options.rotateAxis.indexOf('y') < 0) {
  13198. delete gizmoRotate.Y;
  13199. delete gizmoRotate.XYZE;
  13200. delete pickerRotate.Y;
  13201. }
  13202. if (options.rotateAxis.indexOf('z') < 0) {
  13203. delete gizmoRotate.Z;
  13204. delete gizmoRotate.XYZE;
  13205. delete pickerRotate.Z;
  13206. }
  13207. }
  13208. return {
  13209. gizmo: gizmoRotate,
  13210. picker: pickerRotate,
  13211. helper: helperRotate
  13212. };
  13213. };
  13214. _this2.updateScale = function () {
  13215. var gizmoScale = {
  13216. X: [[new Mesh(scaleHandleGeometry, matRed), [0.5, 0, 0], [0, 0, -Math.PI / 2]], [getFatLine('x-', 'x')] //use x- instead of x+, cause need to get all axis lineGeos
  13217. ],
  13218. Y: [[new Mesh(scaleHandleGeometry, matGreen), [0, 0.5, 0]], [getFatLine('y-', 'y')]],
  13219. Z: [[new Mesh(scaleHandleGeometry, matBlue), [0, 0, 0.5], [Math.PI / 2, 0, 0]], [getFatLine('z-', 'z'), null, [0, -Math.PI / 2, 0], [0.5, 1, 1]]],
  13220. /*XY: [[ new Mesh( scaleHandleGeometry, matYellowTransparent ), [ 0.85, 0.85, 0 ], null, [ 2, 2, 0.2 ]],
  13221. [ new Line( lineGeometry, matLineYellow ), [ 0.855, 0.98, 0 ], null, [ 0.125, 1, 1 ]],
  13222. [ new Line( lineGeometry, matLineYellow ), [ 0.98, 0.855, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]],
  13223. YZ: [[ new Mesh( scaleHandleGeometry, matCyanTransparent ), [ 0, 0.85, 0.85 ], null, [ 0.2, 2, 2 ]],
  13224. [ new Line( lineGeometry, matLineCyan ), [ 0, 0.855, 0.98 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]],
  13225. [ new Line( lineGeometry, matLineCyan ), [ 0, 0.98, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]],
  13226. XZ: [[ new Mesh( scaleHandleGeometry, matMagentaTransparent ), [ 0.85, 0, 0.85 ], null, [ 2, 0.2, 2 ]],
  13227. [ new Line( lineGeometry, matLineMagenta ), [ 0.855, 0, 0.98 ], null, [ 0.125, 1, 1 ]],
  13228. [ new Line( lineGeometry, matLineMagenta ), [ 0.98, 0, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]], */
  13229. /*XYZX: [[ new Mesh( new BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 1.1, 0, 0 ]],],
  13230. XYZY: [[ new Mesh( new BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 1.1, 0 ]],] ,
  13231. XYZZ: [[ new Mesh( new BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 0, 1.1 ]],] */
  13232. XY: [[new Mesh(scaleHandleGeometry, matYellowTransparent), [0.5, 0.5, 0]]],
  13233. YZ: [[new Mesh(scaleHandleGeometry, matCyanTransparent), [0, 0.5, 0.5]]],
  13234. XZ: [[new Mesh(scaleHandleGeometry, matMagentaTransparent), [0.5, 0, 0.5]]],
  13235. XYZX: [[new Mesh(new BoxBufferGeometry(0.125, 0.125, 0.125), matWhiteTransparent.clone()), [0.5, 0.5, 0.5]]]
  13236. };
  13237. var pickerScale = {
  13238. X: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0.3, 0, 0], [0, 0, -Math.PI / 2]]],
  13239. Y: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0.3, 0]]],
  13240. Z: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0, 0.3], [Math.PI / 2, 0, 0]]],
  13241. /*XY: [[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0.85, 0 ], null, [ 3, 3, 0.2 ]],],
  13242. YZ: [[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0, 0.85, 0.85 ], null, [ 0.2, 3, 3 ]],],
  13243. XZ: [[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0, 0.85 ], null, [ 3, 0.2, 3 ]],], */
  13244. /*XYZX: [[ new Mesh( new BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 1.1, 0, 0 ]],],
  13245. XYZY: [[ new Mesh( new BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 1.1, 0 ]],] ,
  13246. XYZZ: [[ new Mesh( new BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 1.1 ]],] */
  13247. XY: [[new Mesh(scaleHandleGeometry, matInvisible), [0.5, 0.5, 0]]],
  13248. YZ: [[new Mesh(scaleHandleGeometry, matInvisible), [0, 0.5, 0.5]]],
  13249. XZ: [[new Mesh(scaleHandleGeometry, matInvisible), [0.5, 0, 0.5]]],
  13250. XYZX: [[new Mesh(new BoxBufferGeometry(0.2, 0.2, 0.2), matInvisible), [0.5, 0.5, 0.5]]]
  13251. };
  13252. if (options.scaleAxis) {
  13253. if (options.scaleAxis.indexOf('z') < 0) {
  13254. delete gizmoScale.Z;
  13255. delete gizmoScale.YZ;
  13256. delete gizmoScale.XZ;
  13257. delete gizmoScale.XYZX;
  13258. delete pickerScale.Z;
  13259. delete pickerScale.YZ;
  13260. delete pickerScale.XZ;
  13261. delete pickerScale.XYZX;
  13262. }
  13263. if (options.scaleAxis.indexOf('x') > -1 && options.scaleAxis.indexOf('y') > -1 && options.scaleAxis.indexOf('z') > -1) {
  13264. delete gizmoScale.XY;
  13265. delete gizmoScale.YZ;
  13266. delete gizmoScale.XZ;
  13267. delete pickerScale.XY;
  13268. delete pickerScale.YZ;
  13269. delete pickerScale.XZ;
  13270. }
  13271. }
  13272. var helperScale = {
  13273. X: [[new Line$1(lineGeometry, matHelper.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], 'helper']],
  13274. Y: [[new Line$1(lineGeometry, matHelper.clone()), [0, -1e3, 0], [0, 0, Math.PI / 2], [1e6, 1, 1], 'helper']],
  13275. Z: [[new Line$1(lineGeometry, matHelper.clone()), [0, 0, -1e3], [0, -Math.PI / 2, 0], [1e6, 1, 1], 'helper']]
  13276. };
  13277. return {
  13278. gizmo: gizmoScale,
  13279. picker: pickerScale,
  13280. helper: helperScale
  13281. };
  13282. }; // Creates an Object3D with gizmos described in custom hierarchy definition.
  13283. _this2.setupGizmo = function (gizmoMap) {
  13284. var gizmo = new Object3D();
  13285. for (var name in gizmoMap) {
  13286. for (var i = gizmoMap[name].length; i--;) {
  13287. var object = gizmoMap[name][i][0];
  13288. var position = gizmoMap[name][i][1];
  13289. var rotation = gizmoMap[name][i][2];
  13290. var scale = gizmoMap[name][i][3];
  13291. var tag = gizmoMap[name][i][4];
  13292. if (object.type != 'Fatline') {
  13293. //xzw add for fatline
  13294. object = object.clone();
  13295. } // name and tag properties are essential for picking and updating logic.
  13296. object.name = name;
  13297. object.tag = tag;
  13298. if (position) {
  13299. object.position.set(position[0], position[1], position[2]);
  13300. }
  13301. if (rotation) {
  13302. object.rotation.set(rotation[0], rotation[1], rotation[2]);
  13303. }
  13304. if (scale) {
  13305. object.scale.set(scale[0], scale[1], scale[2]);
  13306. }
  13307. object.updateMatrix();
  13308. if (object.geometry.clone()) {
  13309. var tempGeometry = object.geometry.clone();
  13310. tempGeometry.applyMatrix4(object.matrix);
  13311. object.geometry = tempGeometry;
  13312. } else {
  13313. object.geometry.applyMatrix4(object.matrix);
  13314. }
  13315. object.renderOrder = Infinity;
  13316. object.position.set(0, 0, 0);
  13317. object.rotation.set(0, 0, 0);
  13318. object.scale.set(1, 1, 1);
  13319. gizmo.add(object);
  13320. }
  13321. }
  13322. return gizmo;
  13323. }; // Reusable utility variables
  13324. var tempVector = new THREE.Vector3(0, 0, 0);
  13325. var tempEuler = new Euler();
  13326. var alignVector = new THREE.Vector3(0, 1, 0);
  13327. var zeroVector = new THREE.Vector3(0, 0, 0);
  13328. var lookAtMatrix = new Matrix4$1();
  13329. var tempQuaternion = new Quaternion$1();
  13330. var tempQuaternion2 = new Quaternion$1();
  13331. var identityQuaternion = new Quaternion$1();
  13332. var unitX = new THREE.Vector3(1, 0, 0);
  13333. var unitY = new THREE.Vector3(0, 1, 0);
  13334. var unitZ = new THREE.Vector3(0, 0, 1); // Gizmo creation
  13335. _this2.gizmo = {};
  13336. _this2.picker = {};
  13337. _this2.helper = {};
  13338. _this2.add(_this2.gizmo['translate'] = _this2.setupGizmo(gizmoTranslate));
  13339. _this2.add(_this2.gizmo['rotate'] = _this2.setupGizmo(_this2.updateRotate().gizmo));
  13340. _this2.add(_this2.gizmo['scale'] = _this2.setupGizmo(_this2.updateScale().gizmo));
  13341. _this2.add(_this2.picker['translate'] = _this2.setupGizmo(pickerTranslate));
  13342. _this2.add(_this2.picker['rotate'] = _this2.setupGizmo(_this2.updateRotate().picker));
  13343. _this2.add(_this2.picker['scale'] = _this2.setupGizmo(_this2.updateScale().picker));
  13344. _this2.add(_this2.helper['translate'] = _this2.setupGizmo(helperTranslate));
  13345. _this2.add(_this2.helper['rotate'] = _this2.setupGizmo(_this2.updateRotate().helper));
  13346. _this2.add(_this2.helper['scale'] = _this2.setupGizmo(_this2.updateScale().helper)); // Pickers should be hidden always
  13347. _this2.picker['translate'].visible = false;
  13348. _this2.picker['rotate'].visible = false;
  13349. _this2.picker['scale'].visible = false; // updateMatrixWorld will update transformations and appearance of individual handles
  13350. _this2.updateMatrixWorld = function () {
  13351. var space = this.space;
  13352. if (this.mode === 'scale') space = 'local'; // scale always oriented to local rotation
  13353. var quaternion = space === 'local' ? this.worldQuaternion : identityQuaternion; // Show only gizmos for current transform mode
  13354. this.gizmo['translate'].visible = this.mode === 'translate';
  13355. this.gizmo['rotate'].visible = this.mode === 'rotate';
  13356. this.gizmo['scale'].visible = this.mode === 'scale';
  13357. this.helper['translate'].visible = this.mode === 'translate';
  13358. this.helper['rotate'].visible = this.mode === 'rotate';
  13359. this.helper['scale'].visible = this.mode === 'scale';
  13360. var handles = [];
  13361. handles = handles.concat(this.picker[this.mode].children);
  13362. handles = handles.concat(this.gizmo[this.mode].children);
  13363. handles = handles.concat(this.helper[this.mode].children);
  13364. var eyeDistance = this.worldPosition.distanceTo(this.cameraPosition); //俯视图的透视和距离无关,因此在两种相机切换切换时大小过渡比较困难
  13365. if (this.player.mode == 'transitioning' && (this.player.modeTran.split('-')[0] == 'floorplan' || this.player.modeTran.split('-')[1] == 'floorplan')) {
  13366. var flcamera = this.player.cameraControls.cameras.floorplan;
  13367. var min = (flcamera.right - flcamera.left) / flcamera.aspect;
  13368. eyeDistance = Math.min(eyeDistance, min);
  13369. } else if (this.player.mode == 'floorplan') {
  13370. var flcamera = this.player.cameraControls.cameras.floorplan;
  13371. eyeDistance = (flcamera.right - flcamera.left) / flcamera.aspect;
  13372. }
  13373. var scale = eyeDistance * this.size / 7;
  13374. for (var i = 0; i < handles.length; i++) {
  13375. var handle = handles[i]; // hide aligned to camera
  13376. handle.visible = true;
  13377. handle.rotation.set(0, 0, 0);
  13378. handle.position.copy(this.worldPosition);
  13379. handle.scale.set(1, 1, 1).multiplyScalar(scale);
  13380. /* if(this.mode == "translate" && this.parent.object){
  13381. if(handle.name == "X"){
  13382. //handle.position.copy(handle.initPos || new THREE.Vector3).add(new THREE.Vector3( this.parent.object.width / 2 / scale, 0,0));
  13383. handle.position.add(new THREE.Vector3( this.parent.object.width / 2 , 0,0));
  13384. }else if(handle.name == "Y"){
  13385. //handle.position.set(0, this.parent.object.height / 2 / scale,0);
  13386. }else if(handle.name == "Z"){
  13387. //handle.position.set( 0,0,this.parent.object.depth / scale);
  13388. }
  13389. }
  13390. */
  13391. // TODO: simplify helpers and consider decoupling from gizmo
  13392. if (handle.tag === 'helper') {
  13393. handle.visible = false;
  13394. if (handle.name === 'AXIS') {
  13395. handle.position.copy(this.worldPositionStart);
  13396. handle.visible = !!this.axis;
  13397. if (this.axis === 'X') {
  13398. tempQuaternion.setFromEuler(tempEuler.set(0, 0, 0));
  13399. handle.quaternion.copy(quaternion).multiply(tempQuaternion);
  13400. if (Math.abs(alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye)) > 0.9) {
  13401. handle.visible = false;
  13402. }
  13403. }
  13404. if (this.axis === 'Y') {
  13405. tempQuaternion.setFromEuler(tempEuler.set(0, 0, Math.PI / 2));
  13406. handle.quaternion.copy(quaternion).multiply(tempQuaternion);
  13407. if (Math.abs(alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye)) > 0.9) {
  13408. handle.visible = false;
  13409. }
  13410. }
  13411. if (this.axis === 'Z') {
  13412. tempQuaternion.setFromEuler(tempEuler.set(0, Math.PI / 2, 0));
  13413. handle.quaternion.copy(quaternion).multiply(tempQuaternion);
  13414. if (Math.abs(alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye)) > 0.9) {
  13415. handle.visible = false;
  13416. }
  13417. }
  13418. if (this.axis === 'XYZE') {
  13419. tempQuaternion.setFromEuler(tempEuler.set(0, Math.PI / 2, 0));
  13420. alignVector.copy(this.rotationAxis);
  13421. handle.quaternion.setFromRotationMatrix(lookAtMatrix.lookAt(zeroVector, alignVector, unitY));
  13422. handle.quaternion.multiply(tempQuaternion);
  13423. handle.visible = this.dragging;
  13424. }
  13425. if (this.axis === 'E') {
  13426. handle.visible = false;
  13427. }
  13428. } else if (handle.name === 'START') {
  13429. handle.position.copy(this.worldPositionStart);
  13430. handle.visible = this.dragging;
  13431. } else if (handle.name === 'END') {
  13432. handle.position.copy(this.worldPosition);
  13433. handle.visible = this.dragging;
  13434. } else if (handle.name === 'DELTA') {
  13435. handle.position.copy(this.worldPositionStart);
  13436. handle.quaternion.copy(this.worldQuaternionStart);
  13437. tempVector.set(1e-10, 1e-10, 1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1);
  13438. tempVector.applyQuaternion(this.worldQuaternionStart.clone().invert());
  13439. handle.scale.copy(tempVector);
  13440. handle.visible = this.dragging;
  13441. } else {
  13442. handle.quaternion.copy(quaternion);
  13443. if (this.dragging) {
  13444. handle.position.copy(this.worldPositionStart);
  13445. } else {
  13446. handle.position.copy(this.worldPosition);
  13447. }
  13448. if (this.axis) {
  13449. handle.visible = this.axis.search(handle.name) !== -1;
  13450. }
  13451. } // If updating helper, skip rest of the loop
  13452. continue;
  13453. } // Align handles to current local or world rotation
  13454. handle.quaternion.copy(quaternion);
  13455. if (this.mode === 'translate' || this.mode === 'scale') {
  13456. // Hide translate and scale axis facing the camera
  13457. var AXIS_HIDE_TRESHOLD = 0.99;
  13458. var PLANE_HIDE_TRESHOLD = 0.2;
  13459. var AXIS_FLIP_TRESHOLD = 0.0;
  13460. if (options.dontHideWhenFaceCamera) ; else {
  13461. if (handle.name === 'X' || handle.name === 'XYZX') {
  13462. if (Math.abs(alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye)) > AXIS_HIDE_TRESHOLD) {
  13463. handle.scale.set(1e-10, 1e-10, 1e-10);
  13464. handle.visible = false;
  13465. }
  13466. }
  13467. if (handle.name === 'Y' || handle.name === 'XYZY') {
  13468. if (Math.abs(alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye)) > AXIS_HIDE_TRESHOLD) {
  13469. handle.scale.set(1e-10, 1e-10, 1e-10);
  13470. handle.visible = false;
  13471. }
  13472. }
  13473. if (handle.name === 'Z' || handle.name === 'XYZZ') {
  13474. if (Math.abs(alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye)) > AXIS_HIDE_TRESHOLD) {
  13475. handle.scale.set(1e-10, 1e-10, 1e-10);
  13476. handle.visible = false;
  13477. }
  13478. }
  13479. if (handle.name === 'XY') {
  13480. if (Math.abs(alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye)) < PLANE_HIDE_TRESHOLD) {
  13481. handle.scale.set(1e-10, 1e-10, 1e-10);
  13482. handle.visible = false;
  13483. }
  13484. }
  13485. if (handle.name === 'YZ') {
  13486. if (Math.abs(alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye)) < PLANE_HIDE_TRESHOLD) {
  13487. handle.scale.set(1e-10, 1e-10, 1e-10);
  13488. handle.visible = false;
  13489. }
  13490. }
  13491. if (handle.name === 'XZ') {
  13492. if (Math.abs(alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye)) < PLANE_HIDE_TRESHOLD) {
  13493. handle.scale.set(1e-10, 1e-10, 1e-10);
  13494. handle.visible = false;
  13495. }
  13496. }
  13497. } // Flip translate and scale axis ocluded behind another axis
  13498. var zReverse = false;
  13499. if (alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye) < AXIS_FLIP_TRESHOLD) {
  13500. zReverse = true;
  13501. } //xzw modify : remove backward arrow
  13502. if (handle.name.search('X') !== -1) {
  13503. if (alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye) < AXIS_FLIP_TRESHOLD) {
  13504. /* if ( handle.tag === 'fwd' ) {
  13505. handle.visible = false;
  13506. } else {
  13507. handle.scale.x *= - 1;
  13508. }
  13509. } else if ( handle.tag === 'bwd' ) {
  13510. handle.visible = false;*/
  13511. //反向
  13512. if (handle.type == 'Fatline') {
  13513. handle.geometry = fatLineGeos['x-'];
  13514. } else {
  13515. handle.scale.x *= -1;
  13516. }
  13517. if (this.space == 'world') {
  13518. handle.position.add(new THREE.Vector3(-0.1, 0, 0));
  13519. } else {
  13520. if (this.parent.object) {
  13521. //放置在边缘
  13522. handle.position.add(new THREE.Vector3(-Math.abs(this.parent.object.width || 0.1) / 2, 0, zReverse || handle.name == 'XYZX' ? 0 : this.parent.object.depth || 0).applyQuaternion(handle.quaternion));
  13523. }
  13524. }
  13525. } else {
  13526. if (handle.type == 'Fatline') {
  13527. handle.geometry = fatLineGeos['x+'];
  13528. }
  13529. if (this.space == 'world') {
  13530. handle.position.add(new THREE.Vector3(0.1, 0, 0));
  13531. } else {
  13532. if (this.parent.object) {
  13533. //放置在边缘
  13534. handle.position.add(new THREE.Vector3(Math.abs(this.parent.object.width || 0.1) / 2, 0, zReverse || handle.name == 'XYZX' ? 0 : this.parent.object.depth || 0).applyQuaternion(handle.quaternion));
  13535. }
  13536. }
  13537. }
  13538. }
  13539. if (handle.name.search('Y') !== -1) {
  13540. if (alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye) < AXIS_FLIP_TRESHOLD) {
  13541. /* if ( handle.tag === 'fwd' ) {
  13542. handle.visible = false;
  13543. } else {
  13544. handle.scale.y *= - 1;
  13545. }
  13546. } else if ( handle.tag === 'bwd' ) {
  13547. handle.visible = false;
  13548. */
  13549. if (handle.type == 'Fatline') {
  13550. handle.geometry = fatLineGeos['y-'];
  13551. } else handle.scale.y *= -1;
  13552. if (this.space == 'world') handle.position.add(new THREE.Vector3(0, -0.1, 0));else this.parent.object && handle.position.add(new THREE.Vector3(0, -Math.abs(this.parent.object.height || 0.1) / 2, zReverse || handle.name == 'XYZX' ? 0 : this.parent.object.depth || 0).applyQuaternion(handle.quaternion));
  13553. } else {
  13554. if (handle.type == 'Fatline') {
  13555. handle.geometry = fatLineGeos['y+'];
  13556. }
  13557. if (this.space == 'world') handle.position.add(new THREE.Vector3(0, 0.1, 0));else this.parent.object && handle.position.add(new THREE.Vector3(0, Math.abs(this.parent.object.height || 0.1) / 2, zReverse || handle.name == 'XYZX' ? 0 : this.parent.object.depth || 0).applyQuaternion(handle.quaternion));
  13558. }
  13559. }
  13560. if (handle.name.search('Z') !== -1) {
  13561. if (zReverse) {
  13562. if (handle.type == 'Fatline') {
  13563. handle.geometry = fatLineGeos['z-'];
  13564. } else handle.scale.z *= -1;
  13565. if (this.space == 'world') handle.position.add(new THREE.Vector3(0, 0, -0.1));
  13566. } else {
  13567. if (handle.type == 'Fatline') {
  13568. handle.geometry = fatLineGeos['z+'];
  13569. }
  13570. /* if(this.parent.object ){
  13571. if(this.mode != "scale" ){
  13572. handle.position.add(new THREE.Vector3(0, 0 , this.parent.object.depth).applyQuaternion( handle.quaternion ));
  13573. }else{
  13574. handle.position.add(new THREE.Vector3(0, 0 , this.parent.object.depth).applyQuaternion( handle.quaternion ));
  13575. }
  13576. } */
  13577. if (this.space == 'world') handle.position.add(new THREE.Vector3(0, 0, 0.1));else this.parent.object && handle.position.add(new THREE.Vector3(0, 0, this.parent.object.depth || 0).applyQuaternion(handle.quaternion));
  13578. }
  13579. }
  13580. } else if (this.mode === 'rotate') {
  13581. // Align handles to current local or world rotation
  13582. tempQuaternion2.copy(quaternion);
  13583. alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
  13584. if (handle.name.search('E') !== -1) {
  13585. handle.quaternion.setFromRotationMatrix(lookAtMatrix.lookAt(this.eye, zeroVector, unitY));
  13586. }
  13587. if (handle.name === 'X') {
  13588. if (this.spaceForRotate) {
  13589. quaternion = this.spaceForRotate.x === 'local' ? this.worldQuaternion : identityQuaternion;
  13590. tempQuaternion2.copy(quaternion);
  13591. alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
  13592. }
  13593. tempQuaternion.setFromAxisAngle(unitX, Math.atan2(-alignVector.y, alignVector.z));
  13594. tempQuaternion.multiplyQuaternions(tempQuaternion2, tempQuaternion);
  13595. handle.quaternion.copy(tempQuaternion);
  13596. }
  13597. if (handle.name === 'Y') {
  13598. if (this.spaceForRotate) {
  13599. quaternion = this.spaceForRotate.y === 'local' ? this.worldQuaternion : identityQuaternion;
  13600. tempQuaternion2.copy(quaternion);
  13601. alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
  13602. }
  13603. tempQuaternion.setFromAxisAngle(unitY, Math.atan2(alignVector.x, alignVector.z));
  13604. tempQuaternion.multiplyQuaternions(tempQuaternion2, tempQuaternion);
  13605. handle.quaternion.copy(tempQuaternion);
  13606. }
  13607. if (handle.name === 'Z') {
  13608. if (this.spaceForRotate) {
  13609. quaternion = this.spaceForRotate.z === 'local' ? this.worldQuaternion : identityQuaternion;
  13610. tempQuaternion2.copy(quaternion);
  13611. alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
  13612. }
  13613. tempQuaternion.setFromAxisAngle(unitZ, Math.atan2(alignVector.y, alignVector.x));
  13614. tempQuaternion.multiplyQuaternions(tempQuaternion2, tempQuaternion);
  13615. handle.quaternion.copy(tempQuaternion);
  13616. }
  13617. } // Hide disabled axes
  13618. handle.visible = handle.visible && (handle.name.indexOf('X') === -1 || this.showX);
  13619. handle.visible = handle.visible && (handle.name.indexOf('Y') === -1 || this.showY);
  13620. handle.visible = handle.visible && (handle.name.indexOf('Z') === -1 || this.showZ);
  13621. handle.visible = handle.visible && (handle.name.indexOf('E') === -1 || this.showX && this.showY && this.showZ); // highlight selected axis
  13622. handle.material._opacity = handle.material._opacity || handle.material.opacity;
  13623. handle.material._color = handle.material._color || handle.material.color.clone();
  13624. handle.material.color.copy(handle.material._color);
  13625. handle.material.opacity = handle.material._opacity;
  13626. if (!this.enabled) {
  13627. handle.material.opacity *= 0.5;
  13628. handle.material.color.lerp(new Color(1, 1, 1), 0.5);
  13629. } else if (this.axis) {
  13630. if (handle.name === this.axis) {
  13631. handle.material.opacity = 1.0;
  13632. handle.material.color.lerp(new Color(1, 1, 1), 0.5);
  13633. } else if (this.axis.split('').some(function (a) {
  13634. return handle.name === a;
  13635. })) {
  13636. handle.material.opacity = 1.0;
  13637. handle.material.color.lerp(new Color(1, 1, 1), 0.5);
  13638. } else {
  13639. handle.material.opacity *= 0.25;
  13640. handle.material.color.lerp(new Color(1, 1, 1), 0.5);
  13641. }
  13642. }
  13643. }
  13644. Object3D.prototype.updateMatrixWorld.call(this);
  13645. };
  13646. return _this2;
  13647. }
  13648. return TransformControlsGizmo;
  13649. }(THREE.Object3D); // TransformControlsGizmo.prototype = Object.assign(Object.create(Object3D.prototype), {
  13650. // constructor: TransformControlsGizmo,
  13651. // isTransformControlsGizmo: true,
  13652. // })
  13653. var unitX = new THREE.Vector3(1, 0, 0);
  13654. var unitY = new THREE.Vector3(0, 1, 0);
  13655. var unitZ = new THREE.Vector3(0, 0, 1);
  13656. var tempVector = new THREE.Vector3();
  13657. var dirVector = new THREE.Vector3();
  13658. var alignVector = new THREE.Vector3();
  13659. var tempMatrix = new THREE.Matrix4();
  13660. var identityQuaternion = new THREE.Quaternion();
  13661. var unitX = new THREE.Vector3(1, 0, 0);
  13662. var unitY = new THREE.Vector3(0, 1, 0);
  13663. var unitZ = new THREE.Vector3(0, 0, 1);
  13664. var tempVector = new THREE.Vector3();
  13665. var dirVector = new THREE.Vector3();
  13666. var alignVector = new THREE.Vector3();
  13667. var tempMatrix = new THREE.Matrix4();
  13668. var identityQuaternion = new THREE.Quaternion();
  13669. var TransformControlsPlane = /*#__PURE__*/function (_THREE$Mesh) {
  13670. _inherits(TransformControlsPlane, _THREE$Mesh);
  13671. var _super3 = _createSuper$1o(TransformControlsPlane);
  13672. function TransformControlsPlane(options) {
  13673. var _this3;
  13674. _classCallCheck(this, TransformControlsPlane);
  13675. _this3 = _super3.call(this, new PlaneBufferGeometry(10000, 10000, 2, 2), new MeshBasicMaterial({
  13676. color: '#ff0000',
  13677. visible: false,
  13678. wireframe: false,
  13679. side: DoubleSide,
  13680. transparent: true,
  13681. opacity: 0.6
  13682. }));
  13683. _this3.type = 'TransformControlsPlane';
  13684. return _this3;
  13685. }
  13686. _createClass(TransformControlsPlane, [{
  13687. key: "updateMatrixWorld",
  13688. value: function updateMatrixWorld() {
  13689. var space = this.space; //this.position.copy( this.worldPosition );//xzw ��
  13690. this.parent.intersect ? this.position.copy(this.parent.intersect.position) : this.position.copy(this.worldPosition);
  13691. if (this.mode === 'scale') space = 'local'; // scale always oriented to local rotation
  13692. unitX.set(1, 0, 0).applyQuaternion(space === 'local' ? this.worldQuaternion : identityQuaternion);
  13693. unitY.set(0, 1, 0).applyQuaternion(space === 'local' ? this.worldQuaternion : identityQuaternion);
  13694. unitZ.set(0, 0, 1).applyQuaternion(space === 'local' ? this.worldQuaternion : identityQuaternion); // Align the plane for current transform mode, axis and space.
  13695. alignVector.copy(unitY);
  13696. switch (this.mode) {
  13697. case 'translate':
  13698. case 'scale':
  13699. switch (this.axis) {
  13700. case 'X':
  13701. alignVector.copy(this.eye).cross(unitX);
  13702. dirVector.copy(unitX).cross(alignVector); //this.parent.object && this.position.add(new THREE.Vector3(0, 0, (zReverse||handle.name == "XYZX")?0:this.parent.object.depth).applyQuaternion( handle.quaternion ));
  13703. break;
  13704. case 'Y':
  13705. alignVector.copy(this.eye).cross(unitY);
  13706. dirVector.copy(unitY).cross(alignVector);
  13707. break;
  13708. case 'Z':
  13709. alignVector.copy(this.eye).cross(unitZ);
  13710. dirVector.copy(unitZ).cross(alignVector);
  13711. break;
  13712. case 'XY':
  13713. dirVector.copy(unitZ);
  13714. break;
  13715. case 'YZ':
  13716. dirVector.copy(unitX);
  13717. break;
  13718. case 'XZ':
  13719. alignVector.copy(unitZ);
  13720. dirVector.copy(unitY);
  13721. break;
  13722. case 'XYZ':
  13723. case 'E':
  13724. default:
  13725. //xzw add for scale xyzz
  13726. dirVector.set(0, 0, 0);
  13727. break;
  13728. }
  13729. break;
  13730. case 'rotate':
  13731. default:
  13732. // special case for rotate
  13733. dirVector.set(0, 0, 0);
  13734. } //this.axis && console.log(this.axis)
  13735. if (dirVector.length() === 0) {
  13736. // If in rotate mode, make the plane parallel to camera
  13737. this.quaternion.copy(this.cameraQuaternion);
  13738. } else {
  13739. tempMatrix.lookAt(tempVector.set(0, 0, 0), dirVector, alignVector);
  13740. this.quaternion.setFromRotationMatrix(tempMatrix);
  13741. }
  13742. Object3D.prototype.updateMatrixWorld.call(this);
  13743. }
  13744. }]);
  13745. return TransformControlsPlane;
  13746. }(THREE.Mesh); // TransformControlsPlane.prototype = Object.assign(Object.create(Mesh.prototype), {
  13747. var PlayerEvents = {
  13748. Move: 'move',
  13749. Rotate: 'rotate',
  13750. //xst
  13751. Zoom: 'zoom',
  13752. //xst
  13753. EndRotation: 'endRotation',
  13754. //xst
  13755. MoveModel: 'moveModel',
  13756. //xst
  13757. MoveComplete: 'move.complete',
  13758. ModeChanged: 'mode.changed',
  13759. ModeChanging: 'mode.changing',
  13760. PanoChosen: 'pano.chosen',
  13761. ClosestPanoChanging: 'closest.pano.changing',
  13762. WarpStarted: 'warp.started',
  13763. WarpInterrupted: 'warp.interrupted',
  13764. WarpEnded: 'warp.ended',
  13765. FlyinFinished: 'flyin.finished',
  13766. FlyingStarted: 'flying.started',
  13767. FlyingInterrupted: 'flying.interrupted',
  13768. FlyingEnded: 'flying.ended',
  13769. Ready: 'ready',
  13770. StartInside: 'start.inside',
  13771. StartOutside: 'start.outside',
  13772. ViewChanged: 'view.changed',
  13773. WarpInterruptedWithFlyTo: 'warp.interrupted.flyto',
  13774. InputStart: 'input.start'
  13775. };
  13776. new THREE.TextureLoader();
  13777. var showForOpacity = 1;
  13778. var hideForOpacity = 0;
  13779. var planeGeo = new THREE.PlaneBufferGeometry(1, 1);
  13780. var FloorplanCadImg = /*#__PURE__*/function () {
  13781. function FloorplanCadImg(app) {
  13782. _classCallCheck(this, FloorplanCadImg);
  13783. this.app = app;
  13784. this.config = this.app.config;
  13785. this.show = true;
  13786. this.done = 0;
  13787. this.ready = false;
  13788. this.center = new THREE.Vector3();
  13789. this.deferred = Deferred$1();
  13790. }
  13791. _createClass(FloorplanCadImg, [{
  13792. key: "getCadInfo",
  13793. value: function getCadInfo(index) {
  13794. var cadInfo = this.app.store.getValue('flooruser').cadInfo;
  13795. if (cadInfo instanceof Array) {
  13796. //初始加载时没有id, 所以用下标;等保存时会有subgroup,一般就是单层的subgroup和下标不一样,所以使用subgroup
  13797. if (this.model.floors.list.length == 1) {
  13798. cadInfo = cadInfo[0];
  13799. } else {
  13800. var info = cadInfo.find(function (info) {
  13801. return info.subgroup == index;
  13802. });
  13803. info || (info = cadInfo[index]);
  13804. cadInfo = info;
  13805. }
  13806. } else if (!cadInfo) {
  13807. //console.error('no cadInfo,可能是导入的平面图', index)
  13808. return null;
  13809. }
  13810. return cadInfo;
  13811. } //临时改变所有楼层的floorplane图的显示
  13812. }, {
  13813. key: "changeCadVisible",
  13814. value: function changeCadVisible(v) {
  13815. var o = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  13816. if (o.show != void 0) this.show = o.show; //编辑页面的设置开关控制show
  13817. this.model.floors.forEach(function (floor) {
  13818. if (floor.plane) {
  13819. floor.plane.visible = !!v;
  13820. } else {
  13821. console.warn('还没有创建plane');
  13822. }
  13823. });
  13824. }
  13825. /****************************************************************************************************************************************************************/
  13826. }, {
  13827. key: "deleteCustomFloorTexture",
  13828. value: function deleteCustomFloorTexture(index) {
  13829. console.log('deleteCustomFloorTexture!查看是否有问题', index);
  13830. var floor = this.model.floors.index[index];
  13831. floor.plane.visible = false;
  13832. floor.plane.material.opacity = hideForOpacity;
  13833. floor.plane.material.map = null;
  13834. floor.plane.material.needsUpdate = !0;
  13835. }
  13836. /* addCustomFloorTexture(index, url) {
  13837. let floor = this.model.floors.index[index]
  13838. floor.plane.material = new THREE.MeshBasicMaterial({
  13839. map: loader.load(url),
  13840. opacity: showForOpacity,
  13841. transparent: !0,
  13842. side: THREE.DoubleSide,
  13843. depthTest: false, //防止遮挡热点等物体
  13844. })
  13845. floor.plane.visible = true
  13846. floor.plane.material.needsUpdate = !0
  13847. } */
  13848. }, {
  13849. key: "updateCustomFloorTexture",
  13850. value: function updateCustomFloorTexture(index, url) {
  13851. console.log('updateCustomFloorTexture!', index);
  13852. this.floorPlanImgUrls[index] = url;
  13853. this.updateCadPlane(index);
  13854. /* let floor = this.model.floors.index[index]
  13855. let plane = floor.plane
  13856. plane.material = new THREE.MeshBasicMaterial({
  13857. map: loader.load(url),
  13858. opacity: showForOpacity,
  13859. transparent: !0,
  13860. side: THREE.DoubleSide,
  13861. depthTest: false, //防止遮挡热点等物体
  13862. })
  13863. let boundingBox = floor.boundingBox
  13864. let center = boundingBox.getCenter(this.center)
  13865. plane.position.set(center.x, boundingBox.max.y + constants.planeHeightShift, center.z)
  13866. let size = boundingBox.getSize(new THREE.Vector3())
  13867. plane.scale.set(Math.abs(size.x), Math.abs(size.z), 1)
  13868. if (this.model.currentFloor.floorIndex != index) {
  13869. floor.plane.visible = false
  13870. floor.plane.material.opacity = hideForOpacity
  13871. } else {
  13872. floor.plane.visible = true
  13873. floor.plane.material.opacity = showForOpacity
  13874. } */
  13875. }
  13876. /* createCustomPlane(index, url) {
  13877. let floor = this.model.floors.index[index]
  13878. let boundingBox = floor.boundingBox
  13879. let center = boundingBox.getCenter(this.center)
  13880. let size = boundingBox.getSize(new THREE.Vector3())
  13881. let plane = floor.plane
  13882. if (!plane) {
  13883. var geometry = new THREE.PlaneBufferGeometry(1, 1)
  13884. var material = new THREE.MeshBasicMaterial({
  13885. //map: THREE.ImageUtils.loadTexture(url),
  13886. map: texture.load(url),
  13887. opacity: this.player.modeTran && this.player.modeTran.split('-')[1] == 'floorplan' ? showForOpacity : hideForOpacity,
  13888. //opacity: 1,
  13889. transparent: !0,
  13890. side: THREE.DoubleSide,
  13891. depthTest: false, //防止遮挡热点等物体
  13892. })
  13893. material.needsUpdate = !0
  13894. plane = new THREE.Mesh(geometry, material)
  13895. plane.renderOrder = RenderOrder.cad //盖住模型,否则其他层模型会影响它
  13896. plane.name = 'floorplanImg'
  13897. plane.rotateX(-Math.PI / 2)
  13898. this.model.add(plane)
  13899. } else {
  13900. plane.material = new THREE.MeshBasicMaterial({
  13901. //map: THREE.ImageUtils.loadTexture(url),
  13902. map: loader.load(url),
  13903. opacity: showForOpacity,
  13904. transparent: !0,
  13905. side: THREE.DoubleSide,
  13906. depthTest: false, //防止遮挡热点等物体
  13907. })
  13908. plane.visible = true
  13909. plane.material.needsUpdate = !0
  13910. }
  13911. plane.position.set(center.x, boundingBox.max.y + constants.planeHeightShift, center.z)
  13912. plane.scale.set(Math.abs(size.x), Math.abs(size.z), 1)
  13913. floor.plane = plane
  13914. if (this.model.currentFloor.floorIndex != index) {
  13915. floor.plane.visible = false
  13916. }
  13917. } */
  13918. }, {
  13919. key: "createCustomPlane",
  13920. value: function createCustomPlane(index, url) {
  13921. this.floorPlanImgUrls[index] = url;
  13922. this.updateCadPlane(index);
  13923. /* if (this.model.currentFloor.floorIndex != index) {
  13924. floor.plane.visible = false
  13925. } */
  13926. }
  13927. }, {
  13928. key: "changeModelOpacity",
  13929. value: function changeModelOpacity() {
  13930. //console.log('changeModelOpacity', type)
  13931. this.model.floors.list.forEach(function (floor) {
  13932. return floor.setMaterial();
  13933. });
  13934. }
  13935. /*changeModelOpacity(type) {
  13936. let setOpacity = e => {
  13937. // if (e.parent.hidden && value > 0.5) {
  13938. // return
  13939. // }
  13940. // if (value == showForModelOpacity) {
  13941. // e.visible = false
  13942. // } else {
  13943. // e.visible = true
  13944. // }
  13945. // ;(e.materialInside.uniforms.opacity.value = value), (e.materialOutside.uniforms.opacity.value = value)
  13946. if (visible) {
  13947. e.material.uniforms.opacity.value = 1
  13948. e.material.transparent = !1
  13949. } else {
  13950. e.material.uniforms.opacity.value = 0
  13951. e.material.transparent = !0
  13952. }
  13953. }
  13954. if (this.player.modeTran.split('-')[1] === Viewmode.FLOORPLAN) {
  13955. // FLOORPLAN模式下修改模型透明度,仅限当前楼层
  13956. this.model.currentFloor.chunks.forEach(setOpacity)
  13957. } else {
  13958. this.model.chunks.forEach(setOpacity)
  13959. }
  13960. }*/
  13961. /********************************************************************重构***************************************************************************************/
  13962. }, {
  13963. key: "init",
  13964. value: function init(model) {
  13965. var _this = this;
  13966. this.player = this.app.core.get('Player');
  13967. this.model = model;
  13968. var floorplan = this.app.store.getValue('flooruser');
  13969. if (floorplan) {
  13970. //获取所有楼层的cad图片的url
  13971. this.getCadImgUrl(floorplan); //创建多楼层平面
  13972. //this.createCadAllPlanes(floorplan)
  13973. } else {
  13974. this.app.store.on('flooruser', function (floor) {
  13975. //获取所有楼层的cad图片的url
  13976. _this.getCadImgUrl(floor); //创建多楼层平面
  13977. //this.createCadAllPlanes(floor)
  13978. });
  13979. }
  13980. this.player.on(PlayerEvents.ModeChanging, function (lastMode, mode, pano, dur) {
  13981. if (mode == Viewmode$1.FLOORPLAN) {
  13982. var view360ShowDur = 1000;
  13983. _this.shouldShowPlane = true;
  13984. setTimeout(function () {
  13985. _this.shouldShowPlane && _this.showCadPlane();
  13986. }, Math.min(view360ShowDur, dur));
  13987. } else {
  13988. _this.shouldShowPlane = false; //console.log('mode',mode, 'hideCadPlane')
  13989. _this.hideCadPlane();
  13990. _this.changeModelOpacity('hidePlane'); //恢复材质
  13991. }
  13992. });
  13993. this.ready = true;
  13994. } //创建多楼层平面
  13995. }, {
  13996. key: "createCadAllPlanes",
  13997. value: function createCadAllPlanes(cadData) {
  13998. var _this2 = this;
  13999. //采用用户上传的图片
  14000. if (cadData.type == 'image') {
  14001. cadData.floors.forEach(function (floor) {
  14002. _this2.createCustomPlane(floor.subgroup, _this2.app.resource.getUserResourceURL(floor.filename));
  14003. });
  14004. this.ready = true;
  14005. } //采用矢量数据
  14006. else {
  14007. // 初始数据,不能加载图片
  14008. if (!this.app.store.getValue('metadata').floorPlanUser) {
  14009. this.ready = true;
  14010. this.deferred.resolve();
  14011. return;
  14012. }
  14013. this.model.floors.forEach(function (floor) {
  14014. //创建每个楼层的平面
  14015. _this2.createCadPlane(floor.floorIndex);
  14016. });
  14017. }
  14018. }
  14019. }, {
  14020. key: "createCadPlane",
  14021. value: function createCadPlane(floorIndex) {
  14022. this.updateCadPlane(floorIndex);
  14023. } //更新某个户型图
  14024. }, {
  14025. key: "updateCadPlane",
  14026. value: function updateCadPlane(floorIndex) {
  14027. var _this3 = this;
  14028. var opacity = 0;
  14029. var imgUrl = this.floorPlanImgUrls[floorIndex];
  14030. var floor = this.model.floors.index[floorIndex]; //有图片才会有plane
  14031. console.log("\u5F00\u59CB\u52A0\u8F7Dfloorplan_".concat(floorIndex, ".png, imgUrl: ").concat(imgUrl));
  14032. if (imgUrl) {
  14033. var deferred = floor.deferred = new Deferred$1();
  14034. opacity = this.player.modeTran && this.player.modeTran.split('-')[1] == 'floorplan' ? showForOpacity : hideForOpacity;
  14035. texture.load(imgUrl, function (texture) {
  14036. //加载完成:
  14037. if (!texture.image || floor.deferred != deferred) return; //还没加载完或又重新加载了
  14038. floor.cadImg = texture.image;
  14039. if (floor.shouldShowPlane) {
  14040. texture.needsUpdate = !0;
  14041. console.warn("\u52A0\u8F7D\u5B8C\u6BD5floorplan_".concat(floorIndex, ".png, ").concat(imgUrl));
  14042. } else {
  14043. texture.dispose();
  14044. console.error('dispose Tex');
  14045. texture = null;
  14046. }
  14047. var plane = floor.plane; //之前没有plane的话,得创建
  14048. if (!plane) {
  14049. var material = _this3.createCadPlaneMaterial(texture, opacity);
  14050. plane = new THREE.Mesh(planeGeo, material);
  14051. floor.shouldShowPlane || (plane.visible = false);
  14052. } else {
  14053. plane.material.map = texture;
  14054. plane.material.needsUpdate = true;
  14055. }
  14056. _this3.model.add(plane);
  14057. floor.plane = plane;
  14058. _this3.setCadPlanePose(plane, floorIndex); //注意:图和模型吻合的前提是模型生成正确 且和cad图一致。比如不能模型多了一个房间或者修改过了添加了个东西导致boundingbox变化之类的 (所以以floor.json来重新算了次boundingbox)
  14059. floor.deferred = null;
  14060. deferred.resolve(true);
  14061. }, function (xhr) {
  14062. floor.deferred = null;
  14063. floor.imgLoadFailed = true;
  14064. deferred.resolve(false); //当显示户型图平面的时候,需要修改模型材质
  14065. _this3.changeModelOpacity('hidePlane');
  14066. console.warn("\u6CA1\u6709floorplan_".concat(floorIndex, ".png, ").concat(imgUrl));
  14067. });
  14068. return floor.deferred;
  14069. } //没有图片,但是之前已经有了plane,这时候需要删除
  14070. else {
  14071. this.deleteCadPlane(floor);
  14072. floor.imgLoadFailed = true; //没有图也算加载失败
  14073. }
  14074. }
  14075. }, {
  14076. key: "createCadPlaneMaterial",
  14077. value: function createCadPlaneMaterial(floorTexture, opacity) {
  14078. var material = new THREE.MeshBasicMaterial({
  14079. map: floorTexture,
  14080. opacity: opacity,
  14081. transparent: !0,
  14082. side: THREE.DoubleSide,
  14083. depthTest: false //防止遮挡热点等物体
  14084. });
  14085. return material;
  14086. } //floorplanData表示户型数据
  14087. }, {
  14088. key: "getCadImgUrl",
  14089. value: function getCadImgUrl(cadData) {
  14090. var _this4 = this;
  14091. this.floorPlanImgUrls = [];
  14092. if (this.app.store.getValue('metadata').floorPlanUser) {
  14093. this.model.floors.forEach(function (floor) {
  14094. var floorIndex = floor.floorIndex; //如果是用户自己上传的图片
  14095. if (cadData.type == 'image') {
  14096. // 如果是颠倒楼层会出现楼层与图片不对应的bug,需要重新获取对应的图片
  14097. var findFloorIndex = cadData.floors.findIndex(function (c) {
  14098. return c.subgroup == floorIndex;
  14099. });
  14100. if (findFloorIndex == -1) {
  14101. findFloorIndex = floorIndex;
  14102. }
  14103. if (!cadData.floors[findFloorIndex]) {
  14104. return console.error('cad缺少此楼层数据,楼层:', findFloorIndex);
  14105. }
  14106. _this4.floorPlanImgUrls[floorIndex] = _this4.app.resource.getUserResourceURL(cadData.floors[findFloorIndex].filename);
  14107. } else {
  14108. _this4.floorPlanImgUrls[floorIndex] = _this4.app.resource.getUserResourceURL("floor-cad-".concat(floorIndex, ".png"));
  14109. }
  14110. });
  14111. }
  14112. } //设置cad面的坐标,大小和角度,确保与模型对准
  14113. }, {
  14114. key: "setCadPlanePose",
  14115. value: function setCadPlanePose(plane, index) {
  14116. var floor = this.model.floors.index[index];
  14117. var boundingBox = floor.boundingBox;
  14118. var center = boundingBox.getCenter(this.center);
  14119. var size = boundingBox.getSize(new THREE.Vector3()); //plane.rotateX(-Math.PI / 2)
  14120. plane.rotation.x = -Math.PI / 2; //靠这参数设置plane的大小和位置
  14121. var cadInfo; //let info = this.app.store.getValue('metadata').floorPlanUser
  14122. var data = this.app.store.getValue('flooruser');
  14123. if (data.type != 'image') {
  14124. //非导入
  14125. cadInfo = this.getCadInfo(index);
  14126. if (cadInfo && cadInfo.bound) {
  14127. size.x = cadInfo.bound.right - cadInfo.bound.left;
  14128. size.z = cadInfo.bound.bottom - cadInfo.bound.top;
  14129. center.x = (cadInfo.bound.right + cadInfo.bound.left) / 2;
  14130. center.z = (cadInfo.bound.bottom + cadInfo.bound.top) / 2; //本来不需要旋转的(导入的就不用),但cad那边转了之后也改了size,这里就要旋转
  14131. var metadata = this.app.store.getValue('metadata');
  14132. var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0); //plane.rotateZ(floorPlanAngle)
  14133. plane.rotation.z = floorPlanAngle;
  14134. }
  14135. }
  14136. plane.renderOrder = RenderOrder.cad; //盖住模型,否则其他层模型会影响它
  14137. plane.name = 'floorplanImg';
  14138. this.adjustModelForPlane(boundingBox, index, size, center, false, cadInfo);
  14139. }
  14140. }, {
  14141. key: "adjustModelForPlane",
  14142. value: function adjustModelForPlane(boundingBox, index, size, center, onlyHeight, cadInfo) {
  14143. var floor = this.model.floors.index[index];
  14144. if (onlyHeight) {
  14145. floor.plane.position.y = boundingBox.max.y + constants$4.planeHeightShift;
  14146. return;
  14147. }
  14148. size = size || boundingBox.getSize(new THREE.Vector3());
  14149. center = center || boundingBox.getCenter(new THREE.Vector3());
  14150. if (cadInfo) {
  14151. /* if (!floor.plane.material || !floor.plane.material.map || !floor.plane.material.map.image) {
  14152. return
  14153. } */
  14154. //为了让图片刚好和模型吻合(cadInfo包含的信息是像素为单位,表示出了图中从哪到哪为模型的部分,贴在plane上通过缩放位移就能调整好)
  14155. var floorPlanImgWidth = floor.cadImg.width;
  14156. var floorPlanImgHeight = floor.cadImg.height; //let floorPlanImgWidth = 3840
  14157. //let floorPlanImgHeight = 2160
  14158. var ratio = floor.cadImgRatio = size.x / (floorPlanImgWidth - cadInfo.left - cadInfo.right); //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
  14159. //var ratio = (floor.cadImgRatio = size.y / (floorPlanImgHeight - cadInfo.top - cadInfo.bottom)) //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
  14160. var width = ratio * floorPlanImgWidth;
  14161. var height = ratio * floorPlanImgHeight;
  14162. this.width = width;
  14163. this.height = height;
  14164. var shiftX = (cadInfo.left - cadInfo.right) / 2 * ratio; //偏移中心的距离
  14165. var shiftY = (cadInfo.top - cadInfo.bottom) / 2 * ratio;
  14166. floor.plane.position.set(center.x - shiftX, boundingBox.max.y + constants$4.planeHeightShift, center.z - shiftY);
  14167. floor.plane.scale.set(width, height, 1); //this.player.planLabels.forEach(label => label.update()) //因才获得cadImgRatio ,更新下
  14168. } else {
  14169. //导入的平面图
  14170. floor.plane.scale.set(size.x, size.z, 1);
  14171. floor.plane.position.copy(center).setY(boundingBox.max.y + constants$4.planeHeightShift);
  14172. }
  14173. } //设置是否可见
  14174. }, {
  14175. key: "setVisibleForCadImg",
  14176. value: function setVisibleForCadImg() {
  14177. var _this5 = this;
  14178. // 是否隐藏户型图
  14179. var hideBigMap = this.app.store.getValue('metadata').controls.showBigMap === 0;
  14180. if (!this.show || hideBigMap) {
  14181. return;
  14182. }
  14183. if (!this.ready) {
  14184. return this.deferred.then(function () {
  14185. return _this5.showCadPlane();
  14186. });
  14187. } // 不显示户型图
  14188. if (this.app.TagManager.showTagsVisible || // 热点可视
  14189. this.app.ViewLinkEdit.markView || // 编辑场景关联
  14190. this.player.EditOverlay.isAdding || this.player.EditOverlay.editPlane || // 编辑空间贴图
  14191. this.player.GLTFEditor.adding || this.player.GLTFEditor.selecting // 编辑空间模型
  14192. ) {
  14193. this.hideCadPlane();
  14194. }
  14195. } //显示某楼层的户型图
  14196. }, {
  14197. key: "showCadPlane",
  14198. value: function showCadPlane(floorIndex) {
  14199. var _this6 = this;
  14200. // 是否隐藏户型图
  14201. var hideBigMap = this.app.store.getValue('metadata').controls.showBigMap === 0;
  14202. if (floorIndex == void 0) {
  14203. floorIndex = this.model.currentFloor.floorIndex;
  14204. }
  14205. var floor = this.model.floors.index[floorIndex]; // 这些情况下,即使调用了也不显示户型图
  14206. if (!this.show || hideBigMap || this.app.TagManager.showTagsVisible || // 热点可视
  14207. this.app.ViewLinkEdit.markView || // 编辑场景关联
  14208. this.player.EditOverlay.isAdding || this.player.EditOverlay.editPlane || // 编辑空间贴图
  14209. this.player.GLTFEditor.adding || this.player.GLTFEditor.selecting || this.model.$app.Plugins.EditCAD && this.model.$app.Plugins.EditCAD.display && !this.app.store.getValue('flooruser').type == 'image' //在编辑cad且非导入的平面图
  14210. ) return floor.shouldShowPlane = false;
  14211. if (floor.deferred) {
  14212. //仍在加载
  14213. return;
  14214. /* floor.deferred.then(() => { //done就不重复写了,加载完会执行原先的
  14215. this.showCadPlane(floorIndex)
  14216. }) */
  14217. } //先隐藏其他楼层的cad
  14218. if (this.model.floors.list.length > 1) {
  14219. this.hideCadPlane({
  14220. ignoreFloor: floor
  14221. });
  14222. }
  14223. floor.shouldShowPlane = true;
  14224. var plane = floor.plane;
  14225. if (!plane && !floor.imgLoadFailed) {
  14226. var deferred = this.updateCadPlane(floorIndex);
  14227. if (deferred) {
  14228. return deferred.then(function () {
  14229. floor.shouldShowPlane && _this6.showCadPlane(floorIndex);
  14230. });
  14231. } else {
  14232. return this.changeModelOpacity(); //改为普通材质
  14233. }
  14234. } //当显示户型图平面的时候,需要修改模型材质
  14235. this.changeModelOpacity();
  14236. if (plane) {
  14237. plane.material.opacity = showForOpacity;
  14238. plane.visible = true; //console.log(' plane.visible = true')
  14239. if (!plane.material.map) {
  14240. //恢复
  14241. plane.material.map = new THREE.Texture(floor.cadImg);
  14242. plane.material.map.needsUpdate = true; //为什么不加这句显示不出
  14243. plane.material.needsUpdate = true;
  14244. }
  14245. }
  14246. } //隐藏户型图
  14247. }, {
  14248. key: "hideCadPlane",
  14249. value: function hideCadPlane() {
  14250. var _this7 = this;
  14251. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  14252. ignoreFloor = _ref.ignoreFloor;
  14253. if (!this.ready) {
  14254. return this.deferred.then(function () {
  14255. return _this7.hideCadPlane();
  14256. });
  14257. }
  14258. this.model.floors.forEach(function (floor) {
  14259. if (ignoreFloor == floor) return;
  14260. floor.shouldShowPlane = false;
  14261. if (floor.plane) {
  14262. //if(floor.plane.visible)console.log('visible = false')
  14263. floor.plane.visible = false; //floor.plane.material.opacity = hideForOpacity
  14264. if (floor.plane.material.map) {
  14265. //dispose
  14266. floor.plane.material.map.dispose();
  14267. floor.plane.material.map = null;
  14268. floor.plane.material.needsUpdate = true;
  14269. }
  14270. }
  14271. });
  14272. this.changeModelOpacity();
  14273. }
  14274. /**
  14275. * 手动显示/隐藏户型图
  14276. * @param {*} show
  14277. */
  14278. }, {
  14279. key: "displayCadPlane",
  14280. value: function displayCadPlane(show) {
  14281. this.setVisible(show);
  14282. show ? this.showCadPlane() : this.hideCadPlane();
  14283. } //cad编辑模块那里,因为允许用户重置,所以这里可以删除cad图片
  14284. }, {
  14285. key: "deleteAllCadPlanes",
  14286. value: function deleteAllCadPlanes() {
  14287. var _this8 = this;
  14288. this.model.floors.forEach( /*#__PURE__*/function () {
  14289. var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(floor) {
  14290. return regenerator.wrap(function _callee$(_context) {
  14291. while (1) {
  14292. switch (_context.prev = _context.next) {
  14293. case 0:
  14294. _this8.deleteCadPlane(floor);
  14295. case 1:
  14296. case "end":
  14297. return _context.stop();
  14298. }
  14299. }
  14300. }, _callee);
  14301. }));
  14302. return function (_x) {
  14303. return _ref2.apply(this, arguments);
  14304. };
  14305. }());
  14306. }
  14307. }, {
  14308. key: "deleteCadPlane",
  14309. value: function deleteCadPlane(floor) {
  14310. if (floor.plane) {
  14311. floor.plane.geometry.dispose();
  14312. floor.plane.material.map && floor.plane.material.map.dispose();
  14313. floor.plane.material.dispose();
  14314. this.model.remove(floor.plane);
  14315. floor.plane = null;
  14316. }
  14317. floor.cadImg = null;
  14318. floor.imgLoadFailed = false;
  14319. } //更新全部楼层的户型图
  14320. //cad编辑模块那里,有时候会重新载入数据,这时候等于重新执行createCadAllPlanes,但是plane可能已经创建好了,只是需要更新图片即可
  14321. }, {
  14322. key: "updateAllCadPlanes",
  14323. value: function updateAllCadPlanes() {
  14324. var _this9 = this;
  14325. //重新获取cad矢量数据
  14326. var floorplan = this.app.store.getValue('flooruser');
  14327. this.getCadImgUrl(floorplan);
  14328. this.model.floors.forEach(function (floor) {
  14329. //创建每个楼层的平面
  14330. /* floor.cadImg = null
  14331. floor.imgLoadFailed = false
  14332. this.updateCadPlane(floor.floorIndex) */
  14333. _this9.deleteCadPlane(floor);
  14334. });
  14335. } //设置模型的透明度
  14336. }, {
  14337. key: "setModelOpacity",
  14338. value: function setModelOpacity(floorIndex) {}
  14339. }, {
  14340. key: "getVisible",
  14341. value: function getVisible() {
  14342. return this.show;
  14343. }
  14344. }, {
  14345. key: "setVisible",
  14346. value: function setVisible(value) {
  14347. this.show = value;
  14348. }
  14349. }]);
  14350. return FloorplanCadImg;
  14351. }();
  14352. // init2(model) {
  14353. // this.player = this.app.core.get('Player')
  14354. // this.model = model
  14355. // // 保证数据加载后调用
  14356. // if (this.app.store.getValue('flooruser')) {
  14357. // this.createCad(this.app.store.getValue('flooruser'))
  14358. // } else {
  14359. // this.app.store.on('flooruser', floor => this.createCad(floor))
  14360. // }
  14361. // this.player.on(PlayerEvents.ModeChanging, (lastMode, mode, pano, dur) => {
  14362. // if (mode == Viewmode.FLOORPLAN) {
  14363. // let view360ShowDur = 1000
  14364. // setTimeout(this.showCad.bind(this), Math.min(view360ShowDur, dur))
  14365. // } else {
  14366. // this.hideCad()
  14367. // }
  14368. // })
  14369. // }
  14370. // /**
  14371. // * 显示户型图
  14372. // * @returns
  14373. // */
  14374. // showCad() {
  14375. // // 是否隐藏户型图
  14376. // const hideBigMap = this.app.store.getValue('metadata').controls.showBigMap === 0
  14377. // if (!this.show || hideBigMap) {
  14378. // return
  14379. // }
  14380. // if (!this.ready) {
  14381. // return this.deferred.then(() => this.showCad())
  14382. // }
  14383. // // 不显示户型图
  14384. // if (
  14385. // this.app.TagManager.showTagsVisible || // 热点可视
  14386. // this.app.ViewLinkEdit.markView || // 编辑场景关联
  14387. // this.player.EditOverlay.isAdding ||
  14388. // this.player.EditOverlay.editPlane || // 编辑空间贴图
  14389. // this.player.GLTFEditor.adding ||
  14390. // this.player.GLTFEditor.selecting // 编辑空间模型
  14391. // )
  14392. // return
  14393. // this.hideCad()
  14394. // // console.log('showCad ' + this.model.currentFloor.floorIndex)
  14395. // let plane = this.model.floors.index[this.model.currentFloor.floorIndex].plane
  14396. // if (plane) {
  14397. // plane.material.opacity = showForOpacity
  14398. // plane.visible = true
  14399. // this.changeModelOpacity(showForModelOpacity)
  14400. // }
  14401. // }
  14402. // /**
  14403. // * 隐藏户型图
  14404. // * @returns
  14405. // */
  14406. // hideCad() {
  14407. // if (!this.ready) {
  14408. // return this.deferred.then(() => this.hideCad())
  14409. // }
  14410. // // console.log('hideCad ' + this.model.currentFloor.floorIndex)
  14411. // this.model.floors.forEach(floor => {
  14412. // if (floor.plane) {
  14413. // floor.plane.visible = false
  14414. // floor.plane.material.opacity = hideForOpacity
  14415. // } else {
  14416. // console.warn('还没有创建plane')
  14417. // }
  14418. // })
  14419. // this.changeModelOpacity(hideForModelOpacity)
  14420. // }
  14421. // /**
  14422. // * 手动显示/隐藏户型图
  14423. // * @param {*} show
  14424. // */
  14425. // displayCad(show) {
  14426. // this.show = show
  14427. // this.show ? this.showCad() : this.hideCad()
  14428. // }
  14429. // /**
  14430. // * 创建户型图的贴图
  14431. // */
  14432. // createCad(floor) {
  14433. // if (floor.type == 'image') {
  14434. // // 图片模式
  14435. // floor.floors.forEach(floor => {
  14436. // this.createCustomPlane(floor.subgroup, this.app.resource.getUserResourceURL(floor.filename))
  14437. // })
  14438. // this.ready = true
  14439. // } else {
  14440. // // CAD模式
  14441. // if (!this.app.store.getValue('metadata').floorPlanUser) {
  14442. // this.ready = true
  14443. // this.deferred.resolve()
  14444. // return
  14445. // }
  14446. // this.model.floors.forEach(floor => {
  14447. // floor.floorTexture && (floor.floorTexture.dispose(), (floor.floorTexture = null))
  14448. // texture.load(
  14449. // this.app.resource.getUserResourceURL(`floor-cad-${floor.floorIndex}.png`),
  14450. // texture => {
  14451. // //加载完成:
  14452. // texture.needsUpdate = !0
  14453. // floor.floorTexture = texture
  14454. // this.createPlane(floor.floorIndex)
  14455. // },
  14456. // xhr => {
  14457. // if (++this.done == this.model.floors.length) {
  14458. // this.ready = true
  14459. // this.deferred.resolve()
  14460. // }
  14461. // console.warn(`没有floorplan_${floor.floorIndex}.png`)
  14462. // }
  14463. // )
  14464. // })
  14465. // }
  14466. // }
  14467. // createPlane(index) {
  14468. // var floor = this.model.floors.index[index]
  14469. // var needAdjust = false
  14470. // var boundingBox = floor.boundingBox
  14471. // needAdjust = true
  14472. // var center = boundingBox.getCenter(this.center)
  14473. // var size = boundingBox.getSize(new THREE.Vector3())
  14474. // var geometry = new THREE.PlaneBufferGeometry(1, 1)
  14475. // var plane = null
  14476. // var cadInfo = this.getCadInfo(index)
  14477. // if (!cadInfo || this.app.store.getValue('flooruser').vesion) {
  14478. // plane = new THREE.Mesh(
  14479. // geometry,
  14480. // new THREE.MeshBasicMaterial({
  14481. // map: null,
  14482. // opacity: 0,
  14483. // transparent: !0,
  14484. // side: THREE.DoubleSide,
  14485. // depthTest: false, //防止遮挡热点等物体
  14486. // visible: false,
  14487. // })
  14488. // )
  14489. // } else {
  14490. // var material = new THREE.MeshBasicMaterial({
  14491. // map: floor.floorTexture,
  14492. // opacity: this.player.modeTran && this.player.modeTran.split('-')[1] == 'floorplan' ? showForOpacity : hideForOpacity,
  14493. // //opacity: 1,
  14494. // transparent: !0,
  14495. // side: THREE.DoubleSide,
  14496. // depthTest: false, //防止遮挡热点等物体
  14497. // })
  14498. // material.needsUpdate = !0
  14499. // plane = new THREE.Mesh(geometry, material)
  14500. // if (cadInfo.bound) {
  14501. // size.x = cadInfo.bound.right - cadInfo.bound.left
  14502. // size.z = cadInfo.bound.bottom - cadInfo.bound.top
  14503. // center.x = (cadInfo.bound.right + cadInfo.bound.left) / 2
  14504. // center.z = (cadInfo.bound.bottom + cadInfo.bound.top) / 2
  14505. // }
  14506. // }
  14507. // // TRANSITIONING时add会造成动画卡顿
  14508. // //if (this.player.mode !== Viewmode.TRANSITIONING) this.model.add(plane)
  14509. // //else this.player.once('mode.afterChange', () => this.model.add(plane))
  14510. // this.model.add(plane)
  14511. // floor.plane = plane
  14512. // plane.rotateX(-Math.PI / 2)
  14513. // const metadata = this.app.store.getValue('metadata')
  14514. // var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0)
  14515. // plane.rotateZ(floorPlanAngle)
  14516. // plane.renderOrder = RenderOrder.cad //盖住模型,否则其他层模型会影响它
  14517. // plane.name = 'floorplanImg'
  14518. // if (cadInfo) {
  14519. // this.adjustPlane(boundingBox, index, size, center, false, cadInfo)
  14520. // }
  14521. // //注意:图和模型吻合的前提是模型生成正确 且和cad图一致。比如不能模型多了一个房间或者修改过了添加了个东西导致boundingbox变化之类的 (所以以floor.json来重新算了次boundingbox)
  14522. // this.changeCadVisible(null, { autoJudge: true })
  14523. // if (++this.done == this.model.floors.length) {
  14524. // this.ready = true
  14525. // this.deferred.resolve()
  14526. // if (this.player.mode == Viewmode.FLOORPLAN) {
  14527. // this.showCad()
  14528. // }
  14529. // }
  14530. // }
  14531. // deletePlanes() {
  14532. // this.model.floors.forEach(async floor => {
  14533. // floor.plane.geometry.dispose()
  14534. // floor.plane.material.dispose()
  14535. // this.model.remove(floor.plane)
  14536. // floor.plane = null
  14537. // })
  14538. // }
  14539. // updatePlanes() {
  14540. // this.model.floors.forEach(async floor => {
  14541. // floor.floorTexture && (floor.floorTexture.dispose(), (floor.floorTexture = null))
  14542. // if (!floor.plane) {
  14543. // this.createCad(floor.floorIndex)
  14544. // }
  14545. // if (floor.plane) {
  14546. // floor.plane.material.opacity = hideForOpacity
  14547. // floor.plane.material.map = null
  14548. // floor.plane.material.needsUpdate = !0
  14549. // floor.plane.material.visible = false
  14550. // let imgName = null
  14551. // let flooruser = this.app.store.getValue('flooruser')
  14552. // //cad绘图保存的时候
  14553. // if (flooruser.type != 'image') {
  14554. // imgName = `floor-cad-${floor.floorIndex}.png`
  14555. // loader.load(
  14556. // this.app.resource.getUserResourceURL(imgName, true),
  14557. // //this.app.resource.getUserResourceURL(imgName, true),
  14558. // texture => {
  14559. // //加载完成:
  14560. // texture.needsUpdate = !0
  14561. // floor.floorTexture = texture
  14562. // this.updatePlane(floor.floorIndex, texture)
  14563. // },
  14564. // xhr => {
  14565. // if (++this.done == this.model.floors.length) {
  14566. // this.ready = true
  14567. // this.deferred.resolve()
  14568. // }
  14569. // console.warn(`没有 floorplan_${floor.floorIndex}.png`)
  14570. // }
  14571. // )
  14572. // } else {
  14573. // let data = flooruser.floors.find(c => c.subgroup == floor.floorIndex)
  14574. // imgName = data.filename
  14575. // floor.plane.material = new THREE.MeshBasicMaterial({
  14576. // map: loader.load(this.app.resource.getUserResourceURL(imgName, true)),
  14577. // opacity: showForOpacity,
  14578. // transparent: !0,
  14579. // side: THREE.DoubleSide,
  14580. // depthTest: false, //防止遮挡热点等物体
  14581. // })
  14582. // floor.plane.material.needsUpdate = !0
  14583. // }
  14584. // }
  14585. // })
  14586. // }
  14587. // updatePlane(index, texture) {
  14588. // var floor = this.model.floors.index[index]
  14589. // var needAdjust = false
  14590. // var boundingBox = floor.boundingBox
  14591. // needAdjust = true
  14592. // var center = boundingBox.getCenter(this.center)
  14593. // var size = boundingBox.getSize(new THREE.Vector3())
  14594. // if (floor.plane) {
  14595. // floor.plane.renderOrder = RenderOrder.cad //盖住模型,否则其他层模型会影响它
  14596. // floor.plane.name = 'floorplanImg'
  14597. // const metadata = this.app.store.getValue('metadata')
  14598. // var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0)
  14599. // floor.plane.rotation.z = 0
  14600. // floor.plane.rotateZ(floorPlanAngle)
  14601. // }
  14602. // var cadInfo = this.getCadInfo(index)
  14603. // console.log(cadInfo, '----after')
  14604. // if (!cadInfo || this.app.store.getValue('flooruser').vesion) {
  14605. // if (floor.plane) {
  14606. // floor.plane.material.opacity = hideForOpacity
  14607. // floor.plane.material.map = null
  14608. // floor.plane.material.needsUpdate = !0
  14609. // floor.plane.material.visible = false
  14610. // }
  14611. // } else if (cadInfo.bound) {
  14612. // size.x = cadInfo.bound.right - cadInfo.bound.left
  14613. // size.z = cadInfo.bound.bottom - cadInfo.bound.top
  14614. // center.x = (cadInfo.bound.right + cadInfo.bound.left) / 2
  14615. // center.z = (cadInfo.bound.bottom + cadInfo.bound.top) / 2
  14616. // if (floor.plane) {
  14617. // floor.plane.material.map = texture
  14618. // floor.plane.material.needsUpdate = !0
  14619. // floor.plane.material.visible = true
  14620. // }
  14621. // this.adjustPlane(boundingBox, index, size, center, false, cadInfo)
  14622. // }
  14623. // //注意:图和模型吻合的前提是模型生成正确 且和cad图一致。比如不能模型多了一个房间或者修改过了添加了个东西导致boundingbox变化之类的 (所以以floor.json来重新算了次boundingbox)
  14624. // this.changeCadVisible(null, { autoJudge: true })
  14625. // if (++this.done == this.model.floors.length) {
  14626. // this.ready = true
  14627. // this.deferred.resolve()
  14628. // }
  14629. // }
  14630. // adjustPlane(boundingBox, index, size, center, onlyHeight, cadInfo) {
  14631. // var floor = this.model.floors.index[index]
  14632. // if (onlyHeight) {
  14633. // floor.plane.position.y = boundingBox.max.y + constants.planeHeightShift
  14634. // return
  14635. // }
  14636. // size = size || boundingBox.getSize(new THREE.Vector3())
  14637. // center = center || boundingBox.getCenter(new THREE.Vector3())
  14638. // if (floor.floorTexture.image == null) {
  14639. // return
  14640. // }
  14641. // //为了让图片刚好和模型吻合(cadInfo包含的信息是像素为单位,表示出了图中从哪到哪为模型的部分,贴在plane上通过缩放位移就能调整好)
  14642. // let floorPlanImgWidth = floor.floorTexture.image.width
  14643. // let floorPlanImgHeight = floor.floorTexture.image.height
  14644. // //let floorPlanImgWidth = 3840
  14645. // //let floorPlanImgHeight = 2160
  14646. // var ratio = (floor.cadImgRatio = size.x / (floorPlanImgWidth - cadInfo.left - cadInfo.right)) //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
  14647. // //var ratio = (floor.cadImgRatio = size.y / (floorPlanImgHeight - cadInfo.top - cadInfo.bottom)) //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
  14648. // var width = ratio * floorPlanImgWidth
  14649. // var height = ratio * floorPlanImgHeight
  14650. // this.width = width
  14651. // this.height = height
  14652. // var shiftX = ((cadInfo.left - cadInfo.right) / 2) * ratio //偏移中心的距离
  14653. // var shiftY = ((cadInfo.top - cadInfo.bottom) / 2) * ratio
  14654. // floor.plane.position.set(center.x - shiftX, boundingBox.max.y + constants.planeHeightShift, center.z - shiftY)
  14655. // floor.plane.scale.set(width, height, 1)
  14656. // this.player.planLabels.forEach(label => label.update()) //因才获得cadImgRatio ,更新下
  14657. // }
  14658. var cameraLight = {
  14659. clampVFOV: function clampVFOV(currentFov, maxHFov, width, height) {
  14660. //限制currentFov, 使之造成的横向fov不大于指定值maxHFov
  14661. var r = cameraLight.getHFOVFromVFOV(currentFov, width, height);
  14662. return r > maxHFov ? cameraLight.getVFOVFromHFOV(maxHFov, width, height) : currentFov;
  14663. },
  14664. getHFOVForCamera: function getHFOVForCamera(camera, width, height, getRad) {
  14665. if (!width) width = camera.aspect, height = width / camera.aspect;
  14666. return cameraLight.getHFOVFromVFOV(camera.fov, width, height, getRad);
  14667. },
  14668. getHFOVFromVFOV: function getHFOVFromVFOV(fov, width, height, getRad) {
  14669. var hfov = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (width / height));
  14670. return getRad ? hfov : hfov * MathLight.DEGREES_PER_RADIAN;
  14671. },
  14672. getVFOVFromHFOV: function getVFOVFromHFOV(fov, width, height, getRad) {
  14673. var vfov = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (height / width));
  14674. return getRad ? vfov : vfov * MathLight.DEGREES_PER_RADIAN;
  14675. }
  14676. /* clampVFOV: function(fov, t, i, n) {
  14677. var r = cameraLight.getHFOVFromVFOV(fov, i, n);
  14678. return r > t ? cameraLight.getVFOVFromHFOV(t, i, n) : fov
  14679. },
  14680. getHFOVForCamera: function(e, t, i) {
  14681. return cameraLight.getHFOVFromVFOV(e.fov, t, i)
  14682. },
  14683. getHFOVFromVFOV: function(fov, t, i) {
  14684. var n = t
  14685. , o = i
  14686. , a = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (n / o)) * MathLight.DEGREES_PER_RADIAN;
  14687. return a
  14688. },
  14689. getVFOVFromHFOV: function(e, t, i) {
  14690. var n = t
  14691. , o = i
  14692. , a = 2 * Math.atan(Math.tan(e * MathLight.RADIANS_PER_DEGREE / 2) * (o / n)) * MathLight.DEGREES_PER_RADIAN;
  14693. return a
  14694. } */
  14695. };
  14696. /*
  14697. 二维的标尺。
  14698. 主要难度是将三维线段转化为二维。
  14699. 因此需要知道三维线段两个端点对应的二维点。 但是它们不一定同时可求。
  14700. 如果两个端点都不可求,姑且不显示这条线段(因为概率很小,虽然利用线上任意两点)
  14701. 如果一个可求一个不可求,可以利用可求点和线上任意一个可求点作一条直线,和屏幕边缘求交点,即可画出。 目前使用的是线段中点,如果中点不可求,继续尝试可求点到中点的中点……
  14702. 求出二维点后,算出和某个基准线的夹角,即可用transfrom来变换element。
  14703. */
  14704. function CornerRuler(o, player) {
  14705. var _this = this;
  14706. this.sid = o.sid;
  14707. this.showSid = o.showSid;
  14708. this.text = o.text || '';
  14709. this.state = o.state || 'active';
  14710. this.player = player;
  14711. this.app = player.$app;
  14712. this.elem = document.createElement('div');
  14713. this.elem.className = 'ruler';
  14714. this.elem.setAttribute('data-name', '');
  14715. this.elem.style.display = 'none';
  14716. this.elem.innerHTML = "\n\t\t<div class=\"ruler-line\">\n\t\t\t<em></em>\n\t\t\t<div class=\"ruler-label\">\n\t\t\t\t<div class=\"ruler-label-point\"></div>\n\t\t\t\t<span class=\"ruler-label-name\">".concat(this.text, "</span>\n\t\t\t</div>\n\t\t</div>\n\t");
  14717. this.setPoints(o.points);
  14718. this.player.cornerRulers.push(this);
  14719. var count = 0;
  14720. var tryAppend = function tryAppend() {
  14721. if (document.querySelector('.widgets-rulers')) {
  14722. document.querySelector('.widgets-rulers').append(_this.elem);
  14723. } else if (count++ < 4) {
  14724. setTimeout(tryAppend, 500);
  14725. }
  14726. };
  14727. tryAppend();
  14728. }
  14729. CornerRuler.prototype.setPoints = function (p) {
  14730. if (this.points && this.points[0].equals(p[0]) && this.points[1].equals(p[1])) return;
  14731. this.points = p;
  14732. this.updateText();
  14733. };
  14734. CornerRuler.prototype.updateText = function () {
  14735. {
  14736. //试试自动计算长度 在mp的场景应该很准确
  14737. this.length = Math.round(this.points[0].distanceTo(this.points[1]) * 100) / 100;
  14738. this.text = this.app.config.i18n('common.about') + this.length + this.app.config.i18n('common.meter') + (this.showSid ? ' | ' + this.sid : '');
  14739. }
  14740. this.elem.querySelector('.ruler-label-name').innerText = this.text;
  14741. };
  14742. CornerRuler.prototype.remove = function () {
  14743. this.elem.remove();
  14744. };
  14745. CornerRuler.prototype.getCrossPoint = function (posIn, posOut) {
  14746. //求posOut在屏幕的可见端点,也就是从posOut到posIn的射线和屏幕边界的交点。 其中posIn只是另一个端点,并不是一定在屏幕内;而posOut是一定要在屏幕外,否则..没试过。
  14747. var W = this.player.domElement.clientWidth;
  14748. var H = this.player.domElement.clientHeight;
  14749. var x, y, border;
  14750. var r = (posOut.x - posIn.x) / (posOut.y - posIn.y); //根据相似三角形原理先求出这个比值
  14751. var getX = function getX(y) {
  14752. return r * (y - posIn.y) + posIn.x;
  14753. };
  14754. var getY = function getY(x) {
  14755. return 1 / r * (x - posIn.x) + posIn.y;
  14756. };
  14757. if (posOut.x > W || posOut.x < 0) {
  14758. //x超出的情况
  14759. if (posOut.x > W) border = W;else border = 0;
  14760. if (posOut.y < 0 || posOut.y > H) {
  14761. //y也超出
  14762. if (posOut.y < 0) y = 0;else y = H;
  14763. x = getX(y);
  14764. if (x > W || x < 0) {
  14765. x = border;
  14766. y = getY(x);
  14767. }
  14768. } else {
  14769. x = border;
  14770. y = getY(x);
  14771. }
  14772. } else {
  14773. //只有y超出,x没有超出
  14774. if (posOut.y < 0) y = 0;else y = H;
  14775. x = getX(y);
  14776. }
  14777. return new THREE.Vector2(x, y);
  14778. }; //getCrossPoint的posIn版本
  14779. CornerRuler.prototype.getPosInCrossPoint = function (p1, aim) {
  14780. //求aim在边界上的交点,其中aim在屏幕范围内,p1则不一定
  14781. var W = this.player.domElement.clientWidth;
  14782. var H = this.player.domElement.clientHeight;
  14783. return math$1.getCrossPointAtRect(p1, aim, W, H, 0, 0);
  14784. };
  14785. CornerRuler.prototype.getPosAtSphere = function (toPos) {
  14786. //fish
  14787. this.fishPoints = [];
  14788. this.points.forEach(function (p) {
  14789. var pos = convertTool.getPosAtSphere(p.clone(), toPos);
  14790. this.fishPoints.push(pos);
  14791. }.bind(this));
  14792. };
  14793. var reTryCount$1 = 1;
  14794. CornerRuler.prototype.getPosInScreen = function (p1, p2, count) {
  14795. // p1 p2中一个是trueSide一个不是, 目的是得到两个trueSide
  14796. var center = p1.point.clone().add(p2.point).multiplyScalar(0.5); //二分法
  14797. var pos2d = convertTool.getPos2d(center, this.player);
  14798. if (pos2d.trueSide) {
  14799. var visi = p1.pos2d.trueSide ? p1.pos2d : p2.pos2d;
  14800. if (pos2d.inSight) {
  14801. pos2d.pos = this.getPosInCrossPoint(visi.pos, pos2d.pos);
  14802. pos2d.vector = null;
  14803. /* console.log("pos2d.inSight") */
  14804. } //要求它在边界上的点才行,否则范围被缩小
  14805. return {
  14806. result: 'p1p2',
  14807. p1: visi,
  14808. p2: pos2d
  14809. };
  14810. } else {
  14811. if (count + 1 > reTryCount$1) return; //最多重复次数
  14812. var trueSide = p1.pos2d.trueSide ? p1 : p2;
  14813. return this.getPosInScreen(trueSide, {
  14814. point: center,
  14815. pos2d: pos2d
  14816. }, ++count);
  14817. }
  14818. };
  14819. CornerRuler.prototype.update = function () {
  14820. // Todo 有bug 先注释
  14821. if (this.player.mode != 'panorama' || this.state != 'active') {
  14822. this.elem.style.display = 'none';
  14823. return;
  14824. } //似乎不能根据遮挡来取消显示,因为家具就是会遮住靠墙的尺子。所以只能根据编辑的可视点?
  14825. var p1 = convertTool.getPos2d(this.points[0], this.player);
  14826. var p2 = convertTool.getPos2d(this.points[1], this.player);
  14827. if (!p1.trueSide || !p2.trueSide) {
  14828. //背面点处理
  14829. if (!p1.trueSide && !p2.trueSide) {
  14830. //这种情况一般都是线段背离相机了,基本不用考虑
  14831. this.elem.style.display = 'none';
  14832. return;
  14833. }
  14834. var retry = this.getPosInScreen( //如果线太长了,在很多倾斜点的角度只有一个端点trueSide,那么去到线段中点找trueSide的点,化作新的端点。
  14835. {
  14836. point: this.points[0],
  14837. pos2d: p1
  14838. }, {
  14839. point: this.points[1],
  14840. pos2d: p2
  14841. }, 0);
  14842. if (!retry) {
  14843. this.elem.style.display = 'none';
  14844. return;
  14845. }
  14846. p1 = retry.p1;
  14847. p2 = retry.p2;
  14848. }
  14849. var pos1 = p1.pos,
  14850. pos2 = p2.pos;
  14851. var len = pos1.distanceTo(pos2);
  14852. if (len == 0) {
  14853. console.warn('ruler间距为0!');
  14854. return;
  14855. } //计算BA和水平向右的向量间的夹角0-180
  14856. var angle = Math.acos((pos1.x - pos2.x) / len);
  14857. angle %= 360;
  14858. angle *= 180 / Math.PI; //计算angle方向是顺时针还是逆时针(画出4种情况即可发现有这两个方向)
  14859. var BA1 = pos1.clone().sub(pos2);
  14860. var BA = new THREE.Vector3(BA1.x, BA1.y, 0);
  14861. var BC = new THREE.Vector3(1, 0, 0);
  14862. var dir = BA.cross(BC).z > 0 ? 1 : -1;
  14863. angle *= dir; //更新尺子的位置 具体绘图见笔记 //以第二个点B为基准
  14864. {
  14865. var lineElem = this.elem.querySelector('.ruler-line');
  14866. lineElem.style.width = len + 'px', lineElem.style.left = p2.pos.x + 'px';
  14867. lineElem.style.top = p2.pos.y + 'px', lineElem.style.transform = 'rotate(' + -angle + 'deg)';
  14868. } //更新label箭头的中心位置
  14869. var centerX,
  14870. centerY,
  14871. ratio = 0.5,
  14872. W = this.player.domElement.clientWidth,
  14873. H = this.player.domElement.clientHeight;
  14874. if (!p1.inSight || !p2.inSight) {
  14875. var pos1inSight, pos2inSight; //屏幕可见线段端点。
  14876. if (!p1.inSight) {
  14877. //在屏幕外的端点要求出在和屏幕边界的交点作为可见线段端点
  14878. pos1inSight = this.getCrossPoint(pos2, pos1);
  14879. } else {
  14880. pos1inSight = pos1.clone();
  14881. }
  14882. if (!p2.inSight) {
  14883. pos2inSight = this.getCrossPoint(pos1, pos2);
  14884. } else {
  14885. pos2inSight = pos2.clone();
  14886. }
  14887. var center = pos1inSight.clone().add(pos2inSight).multiplyScalar(0.5); //在屏幕上的可见中心点
  14888. centerX = center.x;
  14889. centerY = center.y;
  14890. if (center.x > W || center.x < 0 || center.y > H || center.y < 0) {
  14891. //可见中心不在屏幕范围内,那么这条线也一定不在范围内。(似乎是,想象的..因为是可见中心)
  14892. this.elem.style.display = 'none';
  14893. return;
  14894. } //ratio是center到div旋转中心(原始B点)的距离 和 线段长度 的比例
  14895. if (pos2.x == pos1.x) {
  14896. if (pos2.y == pos1.y) {
  14897. console.warn('pos1和2一样???');
  14898. return;
  14899. } else {
  14900. if (pos2.y < pos1.y) ratio = (centerY - pos2.y) / (pos1.y - pos2.y);else ratio = (pos2.y - centerY) / (pos2.y - pos1.y);
  14901. }
  14902. } else {
  14903. if (pos2.x < pos1.x) ratio = (centerX - pos2.x) / (pos1.x - pos2.x); //if B在右
  14904. else ratio = (pos2.x - centerX) / (pos2.x - pos1.x); //if B在左
  14905. }
  14906. if (ratio < 0 || ratio > 1) {
  14907. this.elem.style.display = 'none';
  14908. return;
  14909. } //如果ratio超出范围,说明可见中心脱离线段
  14910. } else {
  14911. centerX = (pos1.x + pos2.x) / 2;
  14912. }
  14913. this.elem.style.display = ''; //更新label的方向是左侧还是右侧
  14914. var labelElem = this.elem.querySelector('.ruler-label');
  14915. if (this.dir != 'left' && centerX < W / 2 || this.dir == 'right') {
  14916. labelElem.classList.add('reverse');
  14917. } else {
  14918. labelElem.classList.remove('reverse');
  14919. }
  14920. labelElem.style.transform = 'rotate(' + angle + 'deg)';
  14921. labelElem.style.left = ratio * 100 + '%';
  14922. };
  14923. var SceneRendererEvents = {
  14924. ContextCreated: 'scene-renderer-context-created',
  14925. AfterRender: 'after-render',
  14926. MemoryUsageUpdated: 'scene-renderer-memory-usage-updated'
  14927. };
  14928. var addLabel$1 = browser$1.urlHasValue('pointLabel');
  14929. var horRulerShowSid = addLabel$1;
  14930. var labelProp = {
  14931. backgroundColor: {
  14932. r: 255,
  14933. g: 255,
  14934. b: 255,
  14935. a: 0.4
  14936. },
  14937. textColor: {
  14938. r: 0,
  14939. g: 0,
  14940. b: 0,
  14941. a: 1
  14942. },
  14943. borderRadius: 15,
  14944. renderOrder: 50
  14945. };
  14946. var player$9;
  14947. var WallManager = /*#__PURE__*/function () {
  14948. function WallManager(app) {
  14949. _classCallCheck(this, WallManager);
  14950. this.app = app;
  14951. this.roomInfo = {};
  14952. this.rulerVisi = false;
  14953. this.version = 2;
  14954. this.cad = null;
  14955. this.planeNeedAdjust = [];
  14956. this.appType = null;
  14957. this.showRulers = addLabel$1; //true
  14958. this.updateList = [];
  14959. }
  14960. _createClass(WallManager, [{
  14961. key: "init",
  14962. value: function init(model) {
  14963. this.model = model;
  14964. player$9 = this.app.core.get('Player');
  14965. if (Object.keys(this.roomInfo).length && this.roomInfo[Object.keys(this.roomInfo)[0]].rooms.length) {
  14966. return false; //已经创建了?
  14967. }
  14968. var metadata = this.app.store.getValue('metadata');
  14969. var floorJson = this.app.store.getValue('flooruser');
  14970. this.initRoomInfo(common.CloneJson(floorJson));
  14971. if (metadata && metadata.controls.showScale) {
  14972. this.showRulers = true;
  14973. return true;
  14974. }
  14975. }
  14976. }, {
  14977. key: "switchDisplay",
  14978. value: function switchDisplay(ifShow) {
  14979. this.showRulers = !!ifShow;
  14980. this.updateRulersVisi();
  14981. } // 加额外显示的label 如房间名 标尺
  14982. }, {
  14983. key: "initRoomInfo",
  14984. value: function initRoomInfo(floorJson) {
  14985. var _this = this;
  14986. new THREE.MeshBasicMaterial({
  14987. transparent: true,
  14988. wireframe: true,
  14989. opacity: 0.3,
  14990. color: '#ff9999',
  14991. depthTest: false,
  14992. side: THREE.DoubleSide
  14993. });
  14994. var oriRoomGroup = new THREE.Object3D();
  14995. this.model.add(oriRoomGroup);
  14996. oriRoomGroup.visible = false;
  14997. this.cad = floorJson;
  14998. this.initFloorPlan(floorJson);
  14999. /* performance.mark('ifPanoSeePoints-start')
  15000. this.model.panos.list.forEach((pano)=>{
  15001. this.ifPanoSeePoints(pano);
  15002. })
  15003. performance.mark('ifPanoSeePoints-end')
  15004. performance.measure('ifPanoSeePoints', 'ifPanoSeePoints-start', 'ifPanoSeePoints-end')
  15005. */
  15006. {
  15007. var update = function update() {
  15008. //console.log('update', this.updateList.length)
  15009. _this.updateList.forEach(function (ruler) {
  15010. ruler.update();
  15011. });
  15012. };
  15013. this.app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function (e) {
  15014. if (player$9.lastFrameChanged) {
  15015. common.intervalTool.isWaiting('updateRulersVisi_' + _this.app.resource.num, function () {
  15016. _this.updateRulersVisi();
  15017. }, 500);
  15018. update();
  15019. }
  15020. });
  15021. }
  15022. }
  15023. }, {
  15024. key: "initFloorPlan",
  15025. value: function initFloorPlan(floorCad) {
  15026. var _this2 = this;
  15027. common.timeMeasuring.addTimeMark('initFloorPlan', 'start');
  15028. floorCad.floors.forEach(function (floorJson, floorIndex) {
  15029. var floor = player$9.model.floors.index[floorIndex];
  15030. if (!floor) {
  15031. console.error('没找到floor', floorJson);
  15032. return;
  15033. }
  15034. var bottom = floor.boundingBox.min.y;
  15035. var top = floor.boundingBox.max.y;
  15036. floorJson.bottom = bottom;
  15037. floorJson.top = top;
  15038. for (var id in floorJson.points) {
  15039. var point = floorJson.points[id];
  15040. var walls = point.parent;
  15041. var btmPos = _this2.getPos3dFrom2d(point, bottom);
  15042. var topPos = _this2.getPos3dFrom2d(point, top);
  15043. var pointRulerInfo = {
  15044. point,
  15045. horizons: [],
  15046. verti: null
  15047. };
  15048. pointRulerInfo.verti = _this2.addRuler(btmPos, topPos, "floor".concat(floorIndex, "-p").concat(id, "-verti"));
  15049. for (var wall in walls) {
  15050. //这个不准
  15051. /* let p2type = walls[wall] == 'start' ? 'end' : 'start'
  15052. let rulerInfo = this.getHorRuler(id, floorJson.walls[wall][p2type], floorIndex, bottom)
  15053. */
  15054. //监控错误:
  15055. if (wall == 'null' || !floorJson.walls[wall]) {
  15056. console.warn('该点有wall == null的walls', point);
  15057. continue;
  15058. }
  15059. walls[wall] == 'start' ? 'end' : 'start';
  15060. var realp2Type = floorJson.walls[wall].start == id ? 'end' : 'start'; //if (p2type != realp2Type) console.error('p2type != realp2Type', wall, id)
  15061. var p2Id = floorJson.walls[wall][realp2Type];
  15062. var rulerInfo = _this2.getHorRuler(id, p2Id, floorIndex, bottom); //
  15063. pointRulerInfo.horizons.push(rulerInfo);
  15064. }
  15065. pointRulerInfo.horizons = pointRulerInfo.horizons.sort(function (r1, r2) {
  15066. return r1.angle - r2.angle;
  15067. });
  15068. point.pointRulerInfo = pointRulerInfo;
  15069. addLabel$1 && _this2.addLabel(point, btmPos, floor);
  15070. }
  15071. });
  15072. common.timeMeasuring.addTimeMark('initFloorPlan', 'end', true);
  15073. }
  15074. }, {
  15075. key: "getHorRuler",
  15076. value: function getHorRuler(p1Id, p2Id, floorIndex, bottom) {
  15077. if (p1Id == p2Id) {
  15078. console.error('p1Id == p2Id');
  15079. }
  15080. var id1 = p1Id.split('Point')[1];
  15081. var id2 = p2Id.split('Point')[1];
  15082. var sid1 = "f".concat(floorIndex, "-").concat(id1, "-").concat(id2, "-hor");
  15083. var sid2 = "f".concat(floorIndex, "-").concat(id2, "-").concat(id1, "-hor");
  15084. var ruler = player$9.cornerRulers.find(function (e) {
  15085. return e.sid == sid1;
  15086. });
  15087. if (ruler) return {
  15088. ruler,
  15089. angle: ruler.angle
  15090. }; //多半找不到,因为一条线最多只能从两个点找到,getHorRuler应该是创建完就从反方向get了
  15091. else ruler = player$9.cornerRulers.find(function (e) {
  15092. return e.sid == sid2;
  15093. });
  15094. if (ruler) return {
  15095. ruler,
  15096. angle: (ruler.angle + Math.PI) % (2 * Math.PI)
  15097. };else {
  15098. var json = this.cad.floors[floorIndex];
  15099. var p1 = json.points[p1Id];
  15100. var p2 = json.points[p2Id];
  15101. ruler = this.addRuler(this.getPos3dFrom2d(p1, bottom), this.getPos3dFrom2d(p2, bottom), sid1, horRulerShowSid);
  15102. ruler.angle = new THREE.Vector2().subVectors(p2, p1).angle(); //用来排序角度
  15103. ruler.pointIds = [p1Id, p2Id];
  15104. return {
  15105. ruler,
  15106. angle: ruler.angle
  15107. };
  15108. }
  15109. }
  15110. }, {
  15111. key: "addRuler",
  15112. value: function addRuler(startPos, endPos, sid, showSid) {
  15113. var ruler = new CornerRuler({
  15114. sid,
  15115. points: [startPos, endPos],
  15116. state: 'unable',
  15117. showSid
  15118. }, player$9);
  15119. return ruler;
  15120. }
  15121. }, {
  15122. key: "addLabel",
  15123. value: function addLabel(point, pos, model) {
  15124. //this.removeLabel()
  15125. var label = new TextSprite(Object.assign({}, labelProp, {
  15126. text: point.vectorId.split('Point')[1],
  15127. player: player$9
  15128. }));
  15129. label.sprite.material.depthTest = true;
  15130. var position = pos.clone();
  15131. position.y += 0.2;
  15132. label.position.copy(position);
  15133. model.add(label);
  15134. labelProp.scale || (labelProp.scale = math$1.linearClamp(this.model.size.length(), 10, 500, 0.5, 7));
  15135. var s = labelProp.scale;
  15136. label.scale.set(s, s, s);
  15137. }
  15138. }, {
  15139. key: "getPos3dFrom2d",
  15140. value: function getPos3dFrom2d(point2d, height) {
  15141. return new THREE.Vector3(point2d.x, height, -point2d.y);
  15142. }
  15143. }, {
  15144. key: "getPos2dFrom3d",
  15145. value: function getPos2dFrom3d(point3d) {
  15146. return new THREE.Vector2(point3d.x, -point3d.z);
  15147. }
  15148. }, {
  15149. key: "isShelter",
  15150. value: function isShelter(floorJson, point1, point2) {
  15151. //walls数量多时耗时
  15152. var line1 = [point1, point2];
  15153. var atWalls = [];
  15154. point1.parent && atWalls.push.apply(atWalls, _toConsumableArray(Object.keys(point1.parent)));
  15155. point2.parent && atWalls.push.apply(atWalls, _toConsumableArray(Object.keys(point2.parent)));
  15156. var intersecPoint;
  15157. var intersectLine = Object.values(floorJson.walls).find(function (wall) {
  15158. if (atWalls.some(function (e) {
  15159. return e == wall.vectorId;
  15160. })) return;
  15161. var point1_ = floorJson.points[wall.start];
  15162. var point2_ = floorJson.points[wall.end];
  15163. var line2 = [point1_, point2_];
  15164. intersecPoint = math$1.isLineIntersect(line1, line2);
  15165. if (intersecPoint) {
  15166. if (math$1.closeTo(intersecPoint.x, point1.x, 0.01) && math$1.closeTo(intersecPoint.y, point1.y, 0.01) || math$1.closeTo(intersecPoint.x, point2.x, 0.01) && math$1.closeTo(intersecPoint.y, point2.y, 0.01)) {
  15167. //console.log('a',point1_.vectorId, point2_.vectorId)
  15168. return; //点在线上,不算, 相当于atWall
  15169. } else return intersecPoint;
  15170. }
  15171. });
  15172. return !!intersectLine;
  15173. } //注:如果有两条线看起来相交,但其实没有共用交点;或线重叠了一部分。这样很容易识别为true,导致ruler不显示。如果要根据点是否在线上来排除,要计算getFootPoint,太复杂了。所以需要人为把cad调整规范
  15174. /*
  15175. !假定:
  15176. 1 每个漫游点只能看到一个point的一组边,且这两条边相邻。
  15177. 可推断:
  15178. 1 pano的可见group可以提前得到,因为和视角无关,只和位置有关
  15179. */
  15180. }, {
  15181. key: "ifPanoSeePoints",
  15182. value: function ifPanoSeePoints(pano) {
  15183. var _this3 = this;
  15184. //差不多每个pano用时0.5-2ms(在无console时)。很大的场景可能达到100ms, 还好连续漫游时只要加载不停顿就不会触发计算
  15185. common.timeMeasuring.addTimeMark('ifPanoSeePoints', 'start');
  15186. var panoVideoFilter = pano.getVideoFilter(); //视频漫游点角度范围内隐藏ruler
  15187. pano.visibleRulerInfos = [];
  15188. var panoPos2d = this.getPos2dFrom3d(pano.position);
  15189. var floor = this.cad.floors[pano.floorIndex];
  15190. if (!floor) {
  15191. if (!player$9.model.floors.index[pano.floorIndex] && player$9.model.floors.length == 1) {
  15192. floor = player$9.model.floors.list[0];
  15193. } else {
  15194. console.error('ifPanoSeePoints 没找到楼层');
  15195. return;
  15196. }
  15197. }
  15198. var bottom = floor.bottom;
  15199. var r1 = 1 / (2 * Math.sin(THREE.MathUtils.degToRad(5))); //5是最小可见deg的一半。假设只有一个horizon且和panoToPoint垂直
  15200. var minRad = THREE.MathUtils.degToRad(5);
  15201. var _loop = function _loop(id) {
  15202. var point = floor.points[id];
  15203. var horizons = point.pointRulerInfo.horizons; //angle已经从小到大排序
  15204. var panoAngle = new THREE.Vector2().subVectors(panoPos2d, point).angle(); //类同horizons求角度,用来排序
  15205. var neibourHorizons = []; //要挑选的在当前pano能见的该point的边
  15206. if (horizons.length > 2) {
  15207. //选择两条在pano两边最近的线
  15208. var h1 = horizons.find(function (e) {
  15209. return e.angle > panoAngle;
  15210. });
  15211. if (h1) {
  15212. var h1Index = horizons.indexOf(h1);
  15213. if (h1Index == 0) {
  15214. //pano在第一个之前
  15215. neibourHorizons = [h1, horizons[horizons.length - 1]]; //选择第一个和最后一个
  15216. } else {
  15217. neibourHorizons = [horizons[h1Index - 1], h1]; //选择h1和它前面那个
  15218. }
  15219. } else {
  15220. //在最后一个之后
  15221. neibourHorizons = [horizons[0], horizons[horizons.length - 1]]; //也是选择第一个和最后一个
  15222. } //选完后依旧是从小到大
  15223. } else {
  15224. neibourHorizons = horizons;
  15225. }
  15226. if (panoPos2d.distanceTo(point) > neibourHorizons.reduce(function (w, c) {
  15227. return w + c.ruler.length;
  15228. }, 0) * r1) {
  15229. //console.log('排除'/* , point.vectorId, pano.id */); //提前排除一些距离远的,基本看不到。但可能误伤
  15230. return "continue";
  15231. }
  15232. var mid = _this3.getPos3dFrom2d(point, bottom);
  15233. if (panoVideoFilter && panoVideoFilter(mid)) {
  15234. //遮住pano视频了
  15235. addLabel$1 && console.log('点在视频区域内', point);
  15236. return "continue";
  15237. }
  15238. /* if(this.isShelter(floor, point, panoPos2d ) ){//墙角容易遮挡,不算了(尤其是特意编辑好的户型里)
  15239. addLabel && console.log('isShelter', id, pano.id)
  15240. continue
  15241. } */
  15242. var info = [];
  15243. neibourHorizons.forEach(function (r, i) {
  15244. info[i] = {};
  15245. r.anotherPoint2d = floor.points[r.ruler.pointIds.find(function (pid) {
  15246. return pid != id;
  15247. })];
  15248. r.anotherPoint = _this3.getPos3dFrom2d(r.anotherPoint2d, bottom);
  15249. var mid2 = new THREE.Vector2().addVectors(r.anotherPoint2d, point).multiplyScalar(0.5); //用中点而不是端点是因为端点容易被遮住,如点靠在别的线上,或仅被墙角遮住一点点
  15250. if (_this3.isShelter(floor, mid2,
  15251. /* r.anotherPoint2d, */
  15252. panoPos2d)) {
  15253. addLabel$1 && console.log('isShelter线段中点被遮挡', r.ruler.pointIds, pano.id);
  15254. info[i].lineShelter = true;
  15255. return;
  15256. }
  15257. if (panoVideoFilter && panoVideoFilter(r.anotherPoint)) {
  15258. //点在视频区域内
  15259. addLabel$1 && console.log('端点在视频区域内', r);
  15260. info[i].coverVideo = true;
  15261. return;
  15262. }
  15263. if (panoVideoFilter && pano.getVideoFilter('across').apply(void 0, _toConsumableArray(r.ruler.points))) {
  15264. //线横跨视频区域
  15265. addLabel$1 && console.log('线横跨视频区域', r);
  15266. info[i].coverVideo = true;
  15267. return;
  15268. }
  15269. info[i].panoToSidePoint = new THREE.Vector3().subVectors(r.anotherPoint, pano.position).setY(0); //端点方向
  15270. info[i].panoToSidePoint.normalize();
  15271. });
  15272. neibourHorizons = neibourHorizons.filter(function (r, i) {
  15273. return !info[i].coverVideo && !info[i].lineShelter;
  15274. });
  15275. if (neibourHorizons.length == 0) return "continue";
  15276. info = info.filter(function (r, i) {
  15277. return !r.coverVideo && !r.lineShelter;
  15278. });
  15279. panoToPoint = new THREE.Vector3().subVectors(mid, pano.position).setY(0); //方向
  15280. var disSquaredToPano = panoToPoint.lengthSq();
  15281. panoToPoint.normalize();
  15282. var backSide = void 0,
  15283. coverRad = void 0,
  15284. midVec = void 0,
  15285. sidePanoVec1 = void 0,
  15286. sidePanoVec2 = void 0; //pano到两端的向量
  15287. if (neibourHorizons.length == 2) {
  15288. ruler1Vec = new THREE.Vector3().subVectors(mid, neibourHorizons[0].anotherPoint).setY(0);
  15289. ruler2Vec = new THREE.Vector3().subVectors(mid, neibourHorizons[1].anotherPoint).setY(0);
  15290. panoToPoint.clone().cross(ruler1Vec).y;
  15291. panoToPoint.clone().cross(ruler2Vec).y;
  15292. /*backSide = axis1 * axis2 > 0
  15293. if(axis1 * axis2 > 0){//必须一个顺时针一个逆时针才能两个墙壁都看到 (但是这样遇到柱子经常只能看到远的那边)//已计算遮挡这段不需要了
  15294. continue;
  15295. }
  15296. if(axis1>0){
  15297. neibourHorizons = [neibourHorizons[1], neibourHorizons[0] ]//调换顺序,使第一个在左边,第二个在右边
  15298. } */
  15299. //已知:0的angle小于1的angle,所以当pano在两个angle之间时就是正常的0为左1为右;但若pano在包含角度为0的这边就要反一下
  15300. if (panoAngle >= 0 && panoAngle < neibourHorizons[0].angle || panoAngle > neibourHorizons[1].angle && panoAngle < Math.PI * 2) {
  15301. neibourHorizons = [neibourHorizons[1], neibourHorizons[0]]; //调换顺序,使第一个在左边,第二个在右边
  15302. }
  15303. sidePanoVec1 = info[0].panoToSidePoint;
  15304. sidePanoVec2 = info[1].panoToSidePoint;
  15305. } else {
  15306. sidePanoVec1 = info[0].panoToSidePoint;
  15307. sidePanoVec2 = panoToPoint;
  15308. } //计算覆盖角度
  15309. midVec = new THREE.Vector3().addVectors(sidePanoVec1, sidePanoVec2).normalize(); //到两端方向的中间方向
  15310. coverRad = Math.acos(sidePanoVec1.dot(sidePanoVec2)); //在界面上覆盖的角度
  15311. if (panoToPoint.dot(midVec) < 0) {
  15312. //中心方向和panoToPoint夹角大于90度,需要反向
  15313. midVec.negate();
  15314. coverRad = 2 * Math.PI - coverRad;
  15315. }
  15316. if (coverRad < minRad) {
  15317. addLabel$1 && console.log('coverRad过小', id, pano.id, coverRad.toFixed(3));
  15318. return "continue"; //在界面上覆盖的角度过小
  15319. }
  15320. pano.visibleRulerInfos.push({
  15321. pId: point.vectorId,
  15322. point,
  15323. neibourHorizons,
  15324. coverRad,
  15325. panoToPoint,
  15326. disSquaredToPano,
  15327. backSide,
  15328. midVec
  15329. });
  15330. };
  15331. for (var id in floor.points) {
  15332. var panoToPoint;
  15333. var ruler1Vec;
  15334. var ruler2Vec;
  15335. var _ret = _loop(id);
  15336. if (_ret === "continue") continue;
  15337. }
  15338. common.timeMeasuring.addTimeMark('ifPanoSeePoints', 'end', true);
  15339. }
  15340. }, {
  15341. key: "updateRulersVisi",
  15342. value: function updateRulersVisi() {
  15343. this.lastShowRulers && this.lastShowRulers.forEach(function (ruler) {
  15344. ruler.state = 'unable';
  15345. });
  15346. var pano = player$9.currentPano;
  15347. this.updateList = this.lastShowRulers || []; //player.cornerRulers
  15348. if (this.showRulers && !player$9.flying && player$9.mode == 'panorama' && pano.isAligned() && !(settings$3.vrEnabled && settings$3.vrSplitScreen)) {
  15349. if (!pano.visibleRulerInfos) {
  15350. this.ifPanoSeePoints(pano);
  15351. }
  15352. var playerDir = player$9.getDirection().setY(0).normalize();
  15353. player$9.position;
  15354. var playerPos2d = this.getPos2dFrom3d(player$9.position);
  15355. var hfov = cameraLight.getHFOVForCamera(player$9.cameraControls.activeControl.camera, null, null, true);
  15356. var results = common.sortByScore(pano.visibleRulerInfos, [], [function (group) {
  15357. //离相机方向角度越小越好, ruler角度跨越越大越好
  15358. var shiftRad = Math.acos(group.midVec.dot(playerDir)); //ruler中心偏移屏幕(相机)水平中心方向的角度
  15359. //计算在屏幕中(水平)所占的fov, 它由镜头方向左侧和右侧部分组成, 假设镜头相对标尺中心偏左边(实际偏哪边结果都一样)
  15360. var leftRad = Math.min(group.coverRad / 2 + shiftRad, hfov / 2);
  15361. var righRad = Math.min(group.coverRad / 2 - shiftRad, hfov / 2);
  15362. var v = leftRad + righRad; //由于有的墙角很小,比不上旁边墙所占的fov,但focus它的时候还是希望显示它,所以加一点奖励
  15363. var v2 = (Math.PI - shiftRad) * 0.5;
  15364. var d = 5 + group.disSquaredToPano / 30;
  15365. var a = Math.pow(1 + v + v2, 3) * 3; //(+1是因为底数要大于1 . 另外所有参数都要是正数)
  15366. var w = a / d; //if(group.backSide) w = Math.min(w-2, w *= 0.8)
  15367. group.logMsg = "v ".concat(v, ", v2 ").concat(v2, ", v\u590D\u5408").concat(a, ", dis\u590D\u5408 ").concat(d, ", ");
  15368. return w;
  15369. }]);
  15370. addLabel$1 && console.log(results);
  15371. if (results[0]) {
  15372. {
  15373. //矫正高度,因模型崎岖不平,之前使用的最低点一般都低于真实值
  15374. results[0].item.neibourHorizons.forEach(function (e) {
  15375. return e.ruler.points.forEach(function (p) {
  15376. return p.y = pano.floorPosition.y;
  15377. });
  15378. });
  15379. results[0].item.point.pointRulerInfo.verti.points[0].y = pano.floorPosition.y;
  15380. results[0].item.point.pointRulerInfo.verti.updateText(); //这样房间高度会一直变会不会很奇怪?虽然可以计算所有相同neibourHorizon的pano的低高中位数,但是因为是走一个算一个所以也在变。
  15381. }
  15382. var visiRulers = results[0].item.neibourHorizons.map(function (e) {
  15383. return e.ruler;
  15384. }).concat(results[0].item.point.pointRulerInfo.verti);
  15385. visiRulers.forEach(function (ruler) {
  15386. ruler.dir = null, ruler.state = 'active';
  15387. });
  15388. this.lastShowRulers = visiRulers;
  15389. this.updateList = common.getUnionSet(this.updateList, visiRulers); //有些字靠的近容易打架。 故左边的朝左,右边的朝右
  15390. if (results[0].item.neibourHorizons.length == 2) {
  15391. var dis = playerPos2d.distanceTo(results[0].item.point);
  15392. var left = results[0].item.neibourHorizons[0].ruler;
  15393. var right = results[0].item.neibourHorizons[1].ruler;
  15394. if (left.length < dis / 2) left.dir = 'left';
  15395. if (right.length < dis / 2) right.dir = 'right';
  15396. }
  15397. }
  15398. } else this.lastShowRulers = [];
  15399. this.updateList.forEach(function (ruler) {
  15400. ruler.update();
  15401. });
  15402. }
  15403. }]);
  15404. return WallManager;
  15405. }(); // const wallManager = new WallManager()
  15406. function _createSuper$1n(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1n(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  15407. function _isNativeReflectConstruct$1n() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  15408. /*
  15409. z
  15410. |
  15411. |
  15412. |
  15413. |
  15414. x <-------| 中心为点云position加boudingbox中心
  15415. /
  15416. /
  15417. y
  15418. */
  15419. var lineLen = 3,
  15420. stemLen = 1.5,
  15421. arrowLen = 0.5,
  15422. lineDisToStem = 0.5;
  15423. var Axis = /*#__PURE__*/function (_THREE$Object3D) {
  15424. _inherits(Axis, _THREE$Object3D);
  15425. var _super = _createSuper$1n(Axis);
  15426. // 坐标轴
  15427. function Axis(app) {
  15428. var _this;
  15429. _classCallCheck(this, Axis);
  15430. _this = _super.call(this);
  15431. _this.app = app;
  15432. _this.getArrow();
  15433. _this.createArrows();
  15434. return _this;
  15435. }
  15436. _createClass(Axis, [{
  15437. key: "getArrow",
  15438. value: function getArrow() {
  15439. var arrowGroup = new THREE.Object3D();
  15440. var line = LineDraw.createLine([new THREE.Vector3(), new THREE.Vector3(0, 0, lineLen)]);
  15441. var stem = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.1, stemLen));
  15442. stem.position.set(0, 0, lineLen + lineDisToStem + stemLen / 2);
  15443. var arrow = new THREE.Mesh(new THREE.CylinderBufferGeometry(0, 0.3, arrowLen, 12, 1, false)); //radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2
  15444. arrow.position.set(0, 0, lineLen + lineDisToStem + stemLen + arrowLen / 2);
  15445. arrow.rotation.set(Math.PI / 2, 0, 0);
  15446. arrowGroup.add(stem);
  15447. arrowGroup.add(line);
  15448. arrowGroup.add(arrow);
  15449. this.arrowGroup = arrowGroup;
  15450. }
  15451. }, {
  15452. key: "createArrows",
  15453. value: function createArrows() {
  15454. var _this2 = this;
  15455. new THREE.MeshBasicMaterial({
  15456. color: '#00d7df',
  15457. side: 2,
  15458. transparent: true,
  15459. opacity: 0.8,
  15460. depthWrite: false
  15461. });
  15462. var colors = {
  15463. x: '#ea3f3f',
  15464. y: '#86c215',
  15465. z: '#3396f8'
  15466. };
  15467. ['x', 'y', 'z'].forEach(function (axisText) {
  15468. var color = new THREE.Color().set(colors[axisText]);
  15469. var group = _this2.arrowGroup.clone();
  15470. group.children.forEach(function (e) {
  15471. e.material = e.material.clone();
  15472. /* e.material.opacity = opacity
  15473. e.material.transparent = true */
  15474. e.material.color.copy(color);
  15475. });
  15476. var label = _this2.createLabel(axisText, color);
  15477. label.position.set(0, 0, (lineLen + stemLen + arrowLen + lineDisToStem + 0.5) * 1.05);
  15478. group.add(label);
  15479. var meter = _this2.createLabel('1m', color, 20, 0.4);
  15480. meter.position.set(0, 0, 1);
  15481. group.add(meter);
  15482. if (axisText == 'y') {
  15483. group.rotation.x = -Math.PI / 2;
  15484. } else if (axisText == 'x') {
  15485. group.rotation.y = Math.PI / 2;
  15486. }
  15487. _this2.add(group);
  15488. });
  15489. }
  15490. }, {
  15491. key: "createLabel",
  15492. value: function createLabel(text, color) {
  15493. var fontsize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 120;
  15494. var scale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1.2;
  15495. var label = new TextSprite({
  15496. //无法解决 因其祖先有设定quaternion, 无法对着镜头
  15497. backgroundColor: {
  15498. r: 0,
  15499. g: 0,
  15500. b: 0,
  15501. a: 0
  15502. },
  15503. textColor: {
  15504. r: color.r * 255,
  15505. g: color.g * 255,
  15506. b: color.b * 255,
  15507. a: 1
  15508. },
  15509. fontsize,
  15510. //useDepth : true ,
  15511. renderOrder: 5,
  15512. // pickOrder:5,
  15513. player: this.app.core.get('Player'),
  15514. text,
  15515. name: 'axis'
  15516. });
  15517. label.scale.set(scale, scale, scale);
  15518. return label;
  15519. }
  15520. }]);
  15521. return Axis;
  15522. }(THREE.Object3D);
  15523. var _class;
  15524. function _createSuper$1m(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1m(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  15525. function _isNativeReflectConstruct$1m() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  15526. var highMapAddColor = browser$1.urlHasValue('highMapColor');
  15527. var Model = Emitter(_class = /*#__PURE__*/function (_THREE$Object3D) {
  15528. _inherits(Model, _THREE$Object3D);
  15529. var _super = _createSuper$1m(Model);
  15530. function Model(app) {
  15531. var _this;
  15532. _classCallCheck(this, Model);
  15533. _this = _super.call(this);
  15534. _this.setupCustomProperties = function () {
  15535. var e = settings$3.modelAlpha;
  15536. Object.defineProperty(this, 'alpha', {
  15537. get: function get() {
  15538. return e;
  15539. },
  15540. set: function set(t) {
  15541. e = t; //console.log('modelalpha', t)
  15542. this.chunks.forEach(function (chunk) {
  15543. if (chunk.material && chunk.material.uniforms.modelAlpha) {
  15544. chunk.material.uniforms.modelAlpha.value = e; //修改一下defines,为了在不需要map时不加载map。 by xzw
  15545. if (e) {
  15546. if (!('useModelMap' in chunk.material.defines)) {
  15547. chunk.material.defines.useModelMap = '';
  15548. chunk.material.needsUpdate = true;
  15549. }
  15550. } else {
  15551. if ('useModelMap' in chunk.material.defines) {
  15552. delete chunk.material.defines.useModelMap;
  15553. chunk.material.needsUpdate = true; //chunk.material.uniforms.map.value.dispose() //防止崩溃(但是因为这样飞出要等待时间所以被去掉了)
  15554. }
  15555. }
  15556. }
  15557. });
  15558. }
  15559. });
  15560. };
  15561. _this.build = function () {
  15562. var _this2 = this;
  15563. this.currentFloor = this.floors.last();
  15564. this.floors.build();
  15565. this.colliders = this.floors.reduce(function (array, floor) {
  15566. return array.concat(floor.collider.children);
  15567. }, []);
  15568. this.panos.forEach(function (pano) {
  15569. pano.build1(), pano.on('enter', function () {
  15570. pano.floor !== _this2.currentFloor && _this2.setFloor(pano.floor);
  15571. });
  15572. });
  15573. this.panos.forEach(function (pano) {
  15574. pano.build2();
  15575. });
  15576. this.floors.forEach(function (floor) {
  15577. this.boundingBox.union(floor.boundingBox);
  15578. }.bind(this));
  15579. var size = new THREE.Vector3();
  15580. var center = new THREE.Vector3();
  15581. this.boundingBox.getSize(size);
  15582. this.boundingBox.getCenter(center);
  15583. this.size = size;
  15584. this.center = center;
  15585. this.floors.forEach(function (floor) {
  15586. logger$1.info('Floor ' + floor + ': ' + floor.children.length + ' chunks, ' + floor.panos.length + ' panos.');
  15587. }.bind(this)); //this.panos.populate_path_graph();
  15588. this.skybox = new BoundingTextureSkybox(this.boundingBox);
  15589. this.skybox.matrixWorldNeedsUpdate = !0;
  15590. this.add(this.skybox);
  15591. {
  15592. this.skyBoxTight = new BoundingTextureSkybox(this.boundingBox, 2);
  15593. /* this.skyBoxTight = new THREE.Mesh(new THREE.BoxGeometry(size.x, size.y, size.z))
  15594. this.skyBoxTight.computeBoundingBox() //需要重新计算对称的bounding, 在获取鼠标交点时需要。否则热点加不上
  15595. this.skyBoxTight.position.copy(center) */
  15596. }
  15597. logger$1.debug('Done building model');
  15598. if (Panorama.raycastsDone > 0) {
  15599. logger$1.warn('raycasts: ' + Panorama.raycastsDone);
  15600. logger$1.warn('raycasts skipped: ' + Panorama.raycastsSkipped);
  15601. } //创建floorLogo
  15602. this.floorLogos.createFloorLogo();
  15603. this.add(this.floorLogos.firstLogo);
  15604. this.add(this.floorLogos.secondLogo);
  15605. if (browser$1.urlHasValue('axis')) {
  15606. this.add(new Axis(this.$app));
  15607. }
  15608. setTimeout(function () {
  15609. _this2.floorplanCadImg.init(_this2);
  15610. _this2.wallManager.init(_this2);
  15611. }, 100);
  15612. this.addHighMapCube();
  15613. var videoInfo = this.$app.core.get('PanoVideoRenderer').videosInfo;
  15614. if (videoInfo) {
  15615. var parameters = videoInfo.parameters;
  15616. this.updateVideoRenderParameters(parameters);
  15617. }
  15618. this.builded = true; //xzw
  15619. this.dispatchEvent({
  15620. type: 'builded'
  15621. });
  15622. this.texSizeBlock = this.chunks.reduce(function (w, e) {
  15623. var tex = e.material.uniforms.map.value;
  15624. return w + Math.pow(tex.image.width / 512, 2);
  15625. }, 0).toFixed(1); //注:初始时还没有_listeners
  15626. if (this.$app.config.mobile && browser$1.urlHasValue('vlog')) {
  15627. setInterval(function () {
  15628. var count = _this2.getDrawedTexCount().toFixed(1);
  15629. var title = document.querySelector('#app .information .title span');
  15630. if (title) {
  15631. title.innerText = count + '|' + _this2.$app.core.get('Player').lowTile;
  15632. }
  15633. }, 1000);
  15634. var right = document.querySelector('#app .information .right');
  15635. if (right) {
  15636. right.addEventListener('click', function () {
  15637. window.logEnable = !window.logEnable;
  15638. });
  15639. }
  15640. }
  15641. if (this.texSizeBlock > 40) {
  15642. setTimeout(function () {
  15643. //防止大的场景在首次飞出时卡顿一下,提前渲染 。控制未dispose的贴图块数
  15644. var player = _this2.$app.core.get('Player'); //虽然渲染的和没渲染的都有一个期望值,但是因为它们必须满足 和大于总数,所以不能随意设置。优先考虑满足飞出不卡顿,那么只考虑没渲染即可。在保证当前未渲染小于某个值的情况下向总数的一半靠拢。
  15645. var maxHasnt = _this2.$app.config.mobile ? 100 : 60; //最大能接受的飞出时不停顿的数字(大的场景稍微等待半秒、pc可以加载多点尽量不等待)
  15646. var hopeHas = _this2.texSizeBlock - Math.min(_this2.texSizeBlock * 0.5, maxHasnt); //console.log('hopeHas', hopeHas)
  15647. var lastChunkToRender,
  15648. historyRen = [];
  15649. var update = {
  15650. update: function update() {
  15651. if (player.mode == 'panorama' && !player.flying && !player.lastFrameChanged) {
  15652. if (lastChunkToRender) {
  15653. delete lastChunkToRender.material.defines.useModelMap;
  15654. lastChunkToRender.material.needsUpdate = true;
  15655. lastChunkToRender = null;
  15656. }
  15657. var c = _this2.getDrawedTexCount();
  15658. var chunk;
  15659. if (c > hopeHas) {
  15660. chunk = _this2.chunks.find(function (e) {
  15661. var tex = e.material.uniforms.map.value;
  15662. return tex && tex._listeners && tex._listeners.dispose && tex._listeners.dispose.length > 0;
  15663. });
  15664. if (chunk) {
  15665. chunk.material.uniforms.map.value.dispose(); //console.log('dispose', c)
  15666. }
  15667. } else if (c < hopeHas) {
  15668. var r = common.sortByScore(_this2.chunks, [function (e) {
  15669. if (historyRen.includes(e)) return; //historyRen用于记录这一次尝试渲染的chunk,万一哪个不成功就不要重复渲染
  15670. var tex = e.material.uniforms.map.value;
  15671. return tex && !(tex._listeners && tex._listeners.dispose && tex._listeners.dispose.length > 0) && Math.pow(tex.image.width / 512, 2) + c <= hopeHas;
  15672. }], [function (e) {
  15673. var s = 0;
  15674. if (e.floor == _this2.currentFloor) {
  15675. s += 1;
  15676. }
  15677. if (math$1.isInsideFrustum(e.geometry.boundingBox, player.camera)) {
  15678. s += 1;
  15679. }
  15680. return s;
  15681. }]);
  15682. if (r.length) {
  15683. chunk = r[0].item;
  15684. chunk.material.defines.useModelMap = ''; //暂时放开,使渲染
  15685. chunk.material.needsUpdate = true;
  15686. lastChunkToRender = chunk;
  15687. historyRen.push(chunk); //console.log('render', c, chunk.tileId ? chunk.tileId.split('3dtiles/')[1] : chunk.name)
  15688. }
  15689. }
  15690. } else {
  15691. historyRen.length = 0; //清空
  15692. }
  15693. }
  15694. };
  15695. _this2.$app.core.get('SceneRenderer').addComponent(update);
  15696. }, 1000);
  15697. }
  15698. return Promise.resolve(this);
  15699. };
  15700. _this.toggleAlpha = function () {
  15701. this.alpha < 1 ? this.alpha = 1 : this.alpha = 0;
  15702. };
  15703. _this.waitForLoad = function (pano, isLoadedCallbackFunc) {
  15704. if (!isLoadedCallbackFunc()) {
  15705. this.waitQueue.push({
  15706. object: pano,
  15707. isLoadedCallback: isLoadedCallbackFunc
  15708. }), 1 === this.waitQueue.length && this.emit('waiting');
  15709. }
  15710. };
  15711. _this.hide = function () {
  15712. this.floors.hide();
  15713. };
  15714. _this.show = function () {
  15715. this.floors.show();
  15716. };
  15717. _this.floorNames = function () {
  15718. return this.floors.names();
  15719. };
  15720. _this.setFloor = function (floor, mode) {
  15721. this.allFloorsVisible && this.emit('allfloors.toggled', !1, this.currentFloor);
  15722. this.allFloorsVisible = !1;
  15723. this._setFloor(floor, mode);
  15724. };
  15725. _this.toggleAllFloors = function (e) {
  15726. this.allFloorsVisible = void 0 !== e ? e : !this.allFloorsVisible;
  15727. this.emit('allfloors.toggled', this.allFloorsVisible, this.currentFloor);
  15728. this._setFloor(this.currentFloor);
  15729. };
  15730. _this._setFloor = function (floor, mode) {
  15731. var _this3 = this;
  15732. mode = mode || this.mode;
  15733. var old = this.currentFloor;
  15734. this.currentFloor = floor;
  15735. this.$app.core.get('Player').mode;
  15736. if (mode === Viewmode$1.PANORAMA) {
  15737. this.show();
  15738. } else if ( // mode === Viewmode.FLOORPLAN ||
  15739. // (mode === Viewmode.DOLLHOUSE && lastMode == mode) // UI在setMode时已让DOLLHOUSE楼层全显示,所以这里不做更改
  15740. mode === Viewmode$1.FLOORPLAN || mode === Viewmode$1.DOLLHOUSE) {
  15741. this.floors.list.forEach(function (floor, index) {
  15742. var flag = floor === this.currentFloor || this.allFloorsVisible;
  15743. floor.toggle(flag);
  15744. }.bind(this));
  15745. }
  15746. this.emit('floor.changed', this.currentFloor, mode, old); // 楼层显隐tile需要改变,要更新一下
  15747. setTimeout(function () {
  15748. return _this3.$app.core.get('SceneRenderer').update3dTiles({
  15749. force: true
  15750. });
  15751. }, 10);
  15752. };
  15753. _this.toggleExplode = function () {
  15754. this.floors.toggleExplodeHorizontal();
  15755. };
  15756. _this.toggleExplodeUp = function () {
  15757. this.floors.toggleExplodeVertical();
  15758. };
  15759. _this.nextFloor = function (nextfloor) {
  15760. return this.floors.nextFloor(this.currentFloor, nextfloor);
  15761. };
  15762. _this.addFloor = function (floor) {
  15763. this.floors.add(floor);
  15764. };
  15765. _this.getFloorAtPoint = function (position) {
  15766. return this.floors.getFloorAtPoint(position);
  15767. };
  15768. _this.addTile = function (floorIndex, tileContent) {
  15769. this.floors.getOrMakeFloor(floorIndex).addTile(tileContent);
  15770. };
  15771. _this.removeTile = function (tileContent) {
  15772. this.floors.getOrMakeFloor(tileContent.floorIndex).removeTile(tileContent);
  15773. };
  15774. _this.addChunk = function (floorIndex, chunk) {
  15775. this.floors.getOrMakeFloor(floorIndex).addChunk(chunk); // this.chunks.push(chunk)
  15776. };
  15777. _this.setMode = function (mode) {
  15778. var _this4 = this;
  15779. if (!this.supportedModes[mode]) {
  15780. throw new BasicException('Mode not supported for this model: ' + mode);
  15781. }
  15782. this.mode = mode;
  15783. this.chunks.forEach(function (chunk) {
  15784. chunk.setMode(mode, _this4.player.modeTran); // 根据mode选择materialInside/materialOutside以及单双面显隐
  15785. });
  15786. };
  15787. _this.updateProjectedPanos = function (pano) {
  15788. //xzw 改 for 无缝过渡
  15789. if (this.projectedPano0 && this.projectedPano1 && (pano == this.projectedPano0 || pano == this.projectedPano1)) {
  15790. this.setProjectedPanos(this.projectedPano0, this.projectedPano1, !1);
  15791. }
  15792. };
  15793. _this.setProjectedPanos = function (pano0, pano1, restoreFlag) {
  15794. void 0 !== restoreFlag && null !== restoreFlag || (restoreFlag = !0);
  15795. restoreFlag = !!restoreFlag;
  15796. this.projectedPano0 = pano0;
  15797. this.projectedPano1 = pano1;
  15798. this.skybox.material.setProjectedPanos(pano0, pano1, restoreFlag);
  15799. this.chunks.forEach(function (chunk) {
  15800. chunk.materialInside.setProjectedPanos(pano0, pano1, restoreFlag);
  15801. });
  15802. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  15803. tile.material.setProjectedPanos(pano0, pano1, restoreFlag);
  15804. });
  15805. };
  15806. _this.setSide = function (side) {
  15807. this.floors.forEach(function (floor) {
  15808. floor.collider.material.side = side;
  15809. });
  15810. };
  15811. _this.fadePanoMarkers = function (opacity, dur) {
  15812. var _this5 = this;
  15813. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  15814. mode = _ref.mode,
  15815. hideVideoFlag = _ref.hideVideoFlag;
  15816. if (!this.player) return;
  15817. var currentPano = this.player.currentPano;
  15818. if (settings$3.vrEnabled && window.VRScreenType != 'portrait') {
  15819. this.updateVrMarker();
  15820. return;
  15821. } //console.log("fadePanoMarkers", opacity,dur,o.vrCustomer)
  15822. // // customer时保持marker隐藏
  15823. // let role = location.search.match(new RegExp('[\\?,&]role=(.*?)[&,$]'))
  15824. // if (role && role[1] == 'customer') {
  15825. // // zeg 这部分如无必要只在customer时用,否则影响正常player的lock
  15826. // if (o.vrCustomer != void 0) {
  15827. // //vr被带看的走动时不显示marker
  15828. // this.markerUnable = !!o.vrCustomer
  15829. // }
  15830. // if (this.markerUnable && o.vrCustomer == void 0) {
  15831. // return
  15832. // }
  15833. // return
  15834. // }
  15835. var canShowVideoMarker = this.$app.core.get('PanoVideoRenderer').canShowMarker();
  15836. var hideWhenFlyOut = function hideWhenFlyOut() {
  15837. var shows = [],
  15838. hides = [];
  15839. _this5.player.model.panos.forEach(function (pano) {
  15840. if (pano.hasVideo || pano.panoVideo) {
  15841. if (hideVideoFlag || !pano.hasNeighbor() || pano.floor.hidden || !canShowVideoMarker) {
  15842. hides.push(pano);
  15843. } else {
  15844. //console.log('show',pano.id)
  15845. shows.push(pano);
  15846. }
  15847. } else hides.push(pano);
  15848. });
  15849. _this5.panos.fadeMarkerOpacity(1, dur, [{
  15850. toOp: 0,
  15851. member: hides
  15852. }, {
  15853. toOp: settings$3.panorama.markerOpacity,
  15854. member: shows
  15855. }]);
  15856. };
  15857. if (opacity == 0) {
  15858. hideWhenFlyOut();
  15859. } else {
  15860. if ((mode || this.player.mode) == Viewmode$1.PANORAMA && currentPano) {
  15861. var shows = [],
  15862. //shows2 = [],
  15863. hides = [],
  15864. panoVideoFilter = currentPano.getVideoFilter(); //视频漫游点角度范围内隐藏marker
  15865. this.player.model.panos.forEach(function (pano) {
  15866. //是邻近点就显示否则隐藏
  15867. if ((!panoVideoFilter || !panoVideoFilter(pano.position)) && currentPano.seeMarkers.indexOf(pano.id) > -1) {
  15868. /* if (pano.hasVideo || pano.panoVideo) {//videomarker已经改为普通的,所以删除
  15869. // if (objects.panoVideoRenderer.ifEnable())
  15870. if (this.$app.core.get('PanoVideoRenderer').ifEnable()) pano.marker.visible = true
  15871. } else { */
  15872. shows.push(pano); //}
  15873. } else {
  15874. /* if (pano.hasVideo || pano.panoVideo) pano.marker.visible = false
  15875. else */
  15876. hides.push(pano);
  15877. }
  15878. });
  15879. this.panos.fadeMarkerOpacity(opacity, dur, [{
  15880. toOp: settings$3.panorama.markerOpacity,
  15881. member: shows
  15882. }, {
  15883. toOp: 0,
  15884. member: hides
  15885. }]);
  15886. } else if (this.player.modeTran.split('-')[1] != 'panorama') {
  15887. //飞出后marker隐藏
  15888. hideWhenFlyOut();
  15889. }
  15890. }
  15891. };
  15892. _this.outsideAllowed = function () {
  15893. return this.supportedModes[Viewmode$1.DOLLHOUSE] && this.supportedModes[Viewmode$1.FLOORPLAN];
  15894. };
  15895. _this.getOption = function ($app) {
  15896. return {
  15897. autoload: false,
  15898. floors: true,
  15899. local: false,
  15900. url: $app.config.num,
  15901. urlFiles: 'http://www.4dage.com/BigScene7niu/api/player/models/' + $app.config.num + '/files',
  15902. useVisionModelData: true
  15903. };
  15904. };
  15905. _this.getModelMeta = function ($app) {
  15906. return {
  15907. sid: $app.config.num,
  15908. name: '四维时代',
  15909. status: 'viewable',
  15910. floors: '',
  15911. metainfo: {
  15912. allowed_methods: ['GET', 'OPTIONS', 'HEAD']
  15913. },
  15914. image: 'http://7xo6he.com2.z0.glb.qiniucdn.com/images/images1/07.13.2015_16.22.30.jpg',
  15915. images: [],
  15916. job: {
  15917. uuid: 'dacf7dfa24ae47fab8fcebfe4dc41ab9'
  15918. },
  15919. layers: []
  15920. };
  15921. };
  15922. var options = _this.getOption(app);
  15923. var modelData = _this.getModelMeta(app);
  15924. _this.$app = app;
  15925. _this.sid = modelData.sid;
  15926. _this.data = modelData;
  15927. _this.options = options;
  15928. _this.urls = new ModelUrls(_this.sid, app);
  15929. /* this.images = new ImageCollection(this)
  15930. this.images.extend(modelData.images)
  15931. this.heroImage = this.images.getImage(modelData.icon)
  15932. this.heroLocations = [] */
  15933. _this.outdoorPanoLocations = [];
  15934. _this.floors = new FloorCollection(_assertThisInitialized(_this));
  15935. _this.floorsEnabled = void 0 === options.floors || options.floors;
  15936. _this.changingFloor = !1; // this.chunks = []
  15937. _this.panos = new PanoramaCollection(app);
  15938. _this.colliders = [];
  15939. _this.loadPanosPromise = null;
  15940. _this.loadMeshTexturesPromise = null;
  15941. _this.auxDataPromise = null;
  15942. _this.mesh3dTilesLoaded = !1;
  15943. _this.meshTexturesLoaded = !1;
  15944. _this.meshTextures = [];
  15945. _this.mattertags = {};
  15946. _this.tagsShown = !1;
  15947. _this.shouldShowMattertags = !1;
  15948. _this.has360Views = !1;
  15949. _this.showingLabels = settings$3.labels.enabled && modelData.player_options.labels;
  15950. _this.supportedModes = {};
  15951. _this.supportedModes[Viewmode$1.PANORAMA] = !0;
  15952. _this.supportedModes[Viewmode$1.DOLLHOUSE] = !modelData.player_options || modelData.player_options.dollhouse && browser$1.valueFromHash('dh', 1);
  15953. _this.supportedModes[Viewmode$1.FLOORPLAN] = !modelData.player_options || modelData.player_options.floor_plan && browser$1.valueFromHash('dh', 1);
  15954. _this.supportedModes[Viewmode$1.TRANSITIONING] = !0;
  15955. _this.supportsTiles = true;
  15956. _this.supportsVR = modelData.is_vr;
  15957. _this.mode = Viewmode$1.DOLLHOUSE;
  15958. _this.size = null;
  15959. _this.center = null;
  15960. _this.boundingBox = new THREE.Box3();
  15961. _this.currentFloor = null;
  15962. _this.allFloorsVisible = !0;
  15963. _this.projectedPano0 = null;
  15964. _this.projectedPano1 = null;
  15965. _this.floorsEnabled && modelData.floors && modelData.floors.indexOf(',') !== -1 && modelData.floors.split(',').forEach(function (e, t) {
  15966. this.addFloor(new Floor(this, t, e.trim()));
  15967. }.bind(_assertThisInitialized(_this)));
  15968. _this.waitQueue = [];
  15969. _this.on('load', function (e) {
  15970. 0 !== this.waitQueue.length && (this.waitQueue = this.waitQueue.filter(function (e) {
  15971. return !e.isLoadedCallback();
  15972. }), 0 === this.waitQueue.length && this.emit('waiting-done'));
  15973. }.bind(_assertThisInitialized(_this)));
  15974. _this.setupCustomProperties(); //this.labels = new LabelCollection(this);
  15975. //other:
  15976. _this.vrMarkers = [];
  15977. _this.floorLogos = new FloorLogos(_this.$app);
  15978. _this.floorplanCadImg = new FloorplanCadImg(_this.$app);
  15979. _this.wallManager = new WallManager(_this.$app);
  15980. return _this;
  15981. }
  15982. _createClass(Model, [{
  15983. key: "chunks",
  15984. get: function get() {
  15985. var chunks = [];
  15986. this.floors.forEach(function (floor) {
  15987. return chunks.push.apply(chunks, _toConsumableArray(floor.chunks));
  15988. });
  15989. return chunks;
  15990. }
  15991. }, {
  15992. key: "getDrawedTexCount",
  15993. value: function getDrawedTexCount() {
  15994. return this.chunks.reduce(function (w, e) {
  15995. var tex = e.material.uniforms.map.value;
  15996. if (!tex) return w;
  15997. return w + (tex._listeners && tex._listeners.dispose && tex._listeners.dispose.length > 0 ? Math.pow(tex.image.width / 512, 2) : 0);
  15998. }, 0);
  15999. }
  16000. }, {
  16001. key: "createTranControl",
  16002. value: function createTranControl(player) {
  16003. //初始化控件
  16004. var options = {
  16005. player,
  16006. dontHideWhenFaceCamera: true,
  16007. scaleAxis: ['x', 'y'],
  16008. //隐藏了z轴。虽然参数没用上
  16009. NoScaleZ: true //整体缩放时只缩放xy轴。
  16010. };
  16011. this.transformControls = new TransformControls(player.camera, player.domElement, options);
  16012. this.transformControls.space = 'local';
  16013. this.transformControls.setSize(1.2);
  16014. this.add(this.transformControls);
  16015. this.transformControls.visible = false;
  16016. }
  16017. }, {
  16018. key: "updateVideoTexture",
  16019. value: function updateVideoTexture(texture) {
  16020. if (this.skybox) {
  16021. this.skybox.material.uniforms.videoTexture.value = texture;
  16022. }
  16023. this.chunks.forEach(function (item) {
  16024. item.materialInside.uniforms.videoTexture.value = texture;
  16025. });
  16026. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  16027. tile.material.uniforms.videoTexture.value = texture;
  16028. });
  16029. }
  16030. }, {
  16031. key: "suspendVideoRender",
  16032. value: function suspendVideoRender() {
  16033. if (this.skybox) {
  16034. this.skybox.material.uniforms.videoReady.value = 0;
  16035. }
  16036. this.chunks.forEach(function (item) {
  16037. item.materialInside.uniforms.videoReady.value = 0;
  16038. });
  16039. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  16040. tile.material.uniforms.videoReady.value = 0;
  16041. });
  16042. }
  16043. }, {
  16044. key: "resumeVideoRender",
  16045. value: function resumeVideoRender() {
  16046. if (this.skybox) {
  16047. this.skybox.material.uniforms.videoReady.value = 1;
  16048. this.skybox.material.uniforms.progress.value = 1;
  16049. }
  16050. this.chunks.forEach(function (item) {
  16051. item.materialInside.uniforms.videoReady.value = 1;
  16052. item.materialInside.uniforms.progress.value = 1;
  16053. });
  16054. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  16055. tile.material.uniforms.videoReady.value = 1;
  16056. tile.material.uniforms.progress.value = 1;
  16057. });
  16058. }
  16059. /* updateVideoRenderParameters(parameters) {
  16060. this.skybox.material.uniforms.parameters.value.set(
  16061. parameters.inputWidth,
  16062. parameters.inputHeight,
  16063. parameters.outputWidth,
  16064. parameters.outputHeight,
  16065. parameters.focal,
  16066. parameters.pixel,
  16067. parameters.centerX,
  16068. parameters.centerY,
  16069. parameters.translateX,
  16070. parameters.translateY,
  16071. parameters.translateZ,
  16072. 0,
  16073. parameters.lenOffsetX,
  16074. parameters.lenOffsetY,
  16075. parameters.videoWidth,
  16076. parameters.videoHeight
  16077. )
  16078. if (parameters.cameraType == 8) {
  16079. this.skybox.material.defines.HasVideo = 8 //8目
  16080. } else if (parameters.cameraType == 2) {
  16081. this.skybox.material.defines.HasVideo = 2 //2目
  16082. } else if (parameters.cameraType == 3) {
  16083. //转台双目
  16084. this.skybox.material.defines.HasVideo = 3
  16085. }
  16086. this.skybox.material.defines.VideoMapping = parameters.mapping
  16087. this.skybox.material.needsUpdate = true
  16088. this.chunks.forEach(item => {
  16089. item.materialInside.uniforms.parameters.value.set(
  16090. parameters.inputWidth,
  16091. parameters.inputHeight,
  16092. parameters.outputWidth,
  16093. parameters.outputHeight,
  16094. parameters.focal,
  16095. parameters.pixel,
  16096. parameters.centerX,
  16097. parameters.centerY,
  16098. parameters.translateX,
  16099. parameters.translateY,
  16100. parameters.translateZ,
  16101. 0,
  16102. parameters.lenOffsetX,
  16103. parameters.lenOffsetY,
  16104. parameters.videoWidth,
  16105. parameters.videoHeight
  16106. )
  16107. if (parameters.cameraType == 8) {
  16108. item.materialInside.defines.HasVideo = 8 //8目
  16109. } else if (parameters.cameraType == 2) {
  16110. item.materialInside.defines.HasVideo = 2 //2目
  16111. } else if (parameters.cameraType == 3) {
  16112. //转台双目
  16113. this.skybox.material.defines.HasVideo = 3
  16114. }
  16115. item.materialInside.defines.VideoMapping = parameters.mapping
  16116. item.materialInside.needsUpdate = true
  16117. })
  16118. } */
  16119. }, {
  16120. key: "updateVideoRenderParameters",
  16121. value: function updateVideoRenderParameters(parameters) {
  16122. var mats = [this.skybox.material].concat(_toConsumableArray(this.chunks.map(function (e) {
  16123. return e.materialInside;
  16124. })));
  16125. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  16126. mats.push(tile.material);
  16127. });
  16128. mats.forEach(function (material) {
  16129. material.uniforms.parameters.value.set(parameters.inputWidth, parameters.inputHeight, parameters.outputWidth, parameters.outputHeight, parameters.focal, parameters.pixel, parameters.centerX, parameters.centerY, parameters.translateX, parameters.translateY, parameters.translateZ, 0, parameters.lenOffsetX, parameters.lenOffsetY, parameters.videoWidth, parameters.videoHeight);
  16130. if (parameters.cameraType == 8) {
  16131. material.defines.HasVideo = 8; //8目
  16132. } else if (parameters.cameraType == 2) {
  16133. material.defines.HasVideo = 2; //2目
  16134. } else if (parameters.cameraType == 3) {
  16135. //转台双目
  16136. material.defines.HasVideo = 3;
  16137. }
  16138. material.defines.VideoMapping = parameters.mapping;
  16139. material.needsUpdate = true;
  16140. });
  16141. }
  16142. }, {
  16143. key: "updateVrMarker",
  16144. value: //更新vr的漂浮球位置
  16145. function updateVrMarker(enable) {
  16146. var _this6 = this;
  16147. //enable代表vrEnable
  16148. if (!this.player.currentPano.isAligned()) return; //在全景图里的话会先出来再updateVrMarker
  16149. enable = enable == void 0 ? settings$3.vrEnabled : enable;
  16150. if (enable) {
  16151. for (var i in this.panos.index) {
  16152. var pano = this.panos.index[i];
  16153. if (pano.isAligned()) pano.marker.opacity = 0;
  16154. }
  16155. } else {
  16156. this.fadePanoMarkers(null, null);
  16157. }
  16158. this.vrMarkers.forEach(function (v) {
  16159. v.visible = enable && _this6.player.currentPano.id != v.pano.id && !!_this6.player.currentPano.neighbourPanos[v.pano.id]; //!! 是防止undefined
  16160. });
  16161. }
  16162. }, {
  16163. key: "addHighMapCube",
  16164. value: function addHighMapCube() {
  16165. var _this7 = this;
  16166. //创建8*8的tile cube
  16167. if (this.$app.core.get('QualityManager').tileClass == '4k' && this.$app.core.get('QualityManager').maxRenderTargetSize == 2048) {
  16168. //this.$app.store.getValue('metadata').sceneResolution == 'tiles/4k'
  16169. var geo = new THREE.PlaneGeometry(1, 1, 1, 1);
  16170. var cube = new THREE.Object3D();
  16171. cube.tiles = [];
  16172. for (var cubeIndex = 0; cubeIndex < 6; cubeIndex++) {
  16173. var face = new THREE.Object3D();
  16174. for (var i = 0; i < 8; i++) {
  16175. for (var j = 0; j < 8; j++) {
  16176. var tile = new THREE.Mesh(geo, //new THREE.MeshBasicMaterial({ side: 2, depthTest: false, depthWrite: false }))
  16177. new ModelTextureMaterial({
  16178. side: THREE.DoubleSide,
  16179. depthTest: false,
  16180. //防止chunk比cube近从而被遮 且能不遮住box视频和viewlink等
  16181. transparent: true,
  16182. //遮蔽
  16183. defines: {
  16184. BasePanoMap: '' //普通贴图当做全景图
  16185. }
  16186. }));
  16187. tile.material.uniforms.progress.value = 1;
  16188. tile.material.uniforms.modelAlpha.value = 0;
  16189. tile.position.set(i - 3.5, j - 3.5, -4);
  16190. if (highMapAddColor) {
  16191. tile.material.uniforms.opacity.value = 0.4;
  16192. var colorHue = Math.random();
  16193. tile.material.uniforms.baseColor.value = new THREE.Color().setHSL(colorHue, 0.8, 0.9);
  16194. /* 0.5, 0.95) */
  16195. /* tile.scoreLabel = new TextSprite( {
  16196. backgroundColor: { r: 0, g: 0, b: 0, a: 0 },
  16197. textColor: { r: 0, g: 0, b: 0, a: 1 },
  16198. borderRadius: 15,
  16199. renderOrder: 50, fontsize : 13,
  16200. text: ''
  16201. })
  16202. tile.add(tile.scoreLabel) */
  16203. }
  16204. tile.visible = false;
  16205. tile.tileX = i;
  16206. tile.tileY = j;
  16207. tile.cubeFace = cubeIndex;
  16208. tile.renderOrder = RenderOrder.highTileCube;
  16209. cube.tiles.push(tile);
  16210. face.add(tile);
  16211. }
  16212. }
  16213. switch (cubeIndex) {
  16214. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
  16215. face.rotation.set(0, Math.PI / 2, 0);
  16216. break;
  16217. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
  16218. face.rotation.set(0, -Math.PI / 2, 0);
  16219. break;
  16220. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
  16221. var rot1 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI);
  16222. var rot2 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI / 2);
  16223. face.quaternion.copy(rot1).multiply(rot2);
  16224. break;
  16225. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
  16226. var rot1 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI);
  16227. var rot2 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 2);
  16228. face.quaternion.copy(rot1).multiply(rot2);
  16229. break;
  16230. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
  16231. face.rotation.set(0, Math.PI, 0);
  16232. break;
  16233. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
  16234. face.rotation.set(0, 0, 0);
  16235. }
  16236. face.scale.set(1, -1, 1);
  16237. face.cubeFace = cubeIndex;
  16238. cube.add(face);
  16239. }
  16240. cube.name = 'highMapCube';
  16241. this.highMapCube = cube;
  16242. this.add(cube);
  16243. cube.scale.set(0.21, 0.21, 0.21); //camera.near is 0.1
  16244. this.highMapCube.visible = false;
  16245. this.highMapCube.texLoadedCount = 0;
  16246. this.$app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function (e) {
  16247. if (_this7.highMapCube.visibleTiles) {
  16248. _this7.updateTiles(); //逐步将visibleTiles加载完
  16249. }
  16250. if (_this7.player && _this7.player.lastFrameChanged) {
  16251. //重新获取visibleTiles
  16252. common.intervalTool.isWaiting('update4kTiles_' + _this7.$app.resource.num, function () {
  16253. var vectorForward = _this7.player.getDirection();
  16254. _this7.updateTiles(vectorForward);
  16255. }, 500);
  16256. }
  16257. });
  16258. }
  16259. }
  16260. /*
  16261. highMapCube会遮住场景中所有物体, 如果一定要显示的话,只能类似potree中的那样渲染一个深度贴图出来(model无需贴图),然后其他所有物体的shader中都加入一段代码。(貌似本身已经支持了?)
  16262. */
  16263. }, {
  16264. key: "isHighMapLoaded",
  16265. value: function isHighMapLoaded(cubeFace, tileX, tileY) {
  16266. var tile = this.highMapCube.children[cubeFace].children[tileX * 8 + tileY];
  16267. return !!tile.material.uniforms.map.value;
  16268. }
  16269. }, {
  16270. key: "updateTiles",
  16271. value: function updateTiles(direction) {
  16272. var _this8 = this;
  16273. if (!this.highMapCube || !this.highMapCube.visible) return;
  16274. if (this.highMapCube.tiles.filter(function (e) {
  16275. return e.image;
  16276. }).length <= 10) return; //加载的太少了
  16277. //performance.mark('updateTiles-start')
  16278. if (direction) {
  16279. var camera = this.player.cameraControls.cameras.panorama;
  16280. var hfov = cameraLight.getHFOVForCamera(camera, null, null, true) / 2;
  16281. var vfov = THREE.MathUtils.degToRad(camera.fov) / 2;
  16282. /* let hcos = Math.cos(hfov / 2)
  16283. let vcos = Math.cos(vfov / 2) */
  16284. var list = this.highMapCube.tiles;
  16285. list.forEach(function (e) {
  16286. //屏幕外的不显示
  16287. var pos = e.getWorldPosition(new THREE.Vector3());
  16288. var dir = new THREE.Vector3().subVectors(pos, _this8.highMapCube.position).normalize();
  16289. var hcos_ = dir.clone().setY(direction.y).normalize().dot(direction); //在direction的斜面上水平角度差
  16290. var hRad = Math.acos(hcos_);
  16291. var vRad = -200;
  16292. if (hRad > hfov + 0.08) {
  16293. e.score = -100;
  16294. } else {
  16295. vRad = Math.abs(Math.acos(dir.y) - Math.acos(direction.y));
  16296. if (vRad > vfov + 0.08) {
  16297. e.score = -100;
  16298. } else {
  16299. e.score = -(hRad / hfov + vRad / vfov);
  16300. }
  16301. }
  16302. e.scores = hRad.toFixed(3) + ', ' + vRad.toFixed(3);
  16303. if (e.score == -100) {
  16304. _this8.resetTile(e);
  16305. }
  16306. });
  16307. this.highMapCube.visibleTiles = list.filter(function (e) {
  16308. return e.score > -100;
  16309. }); //list.forEach(e=>e.scoreLabel.setText(e.scores))
  16310. }
  16311. var needRecover = this.highMapCube.visibleTiles.filter(function (e) {
  16312. return !e.material.uniforms.map.value;
  16313. });
  16314. if (needRecover.length) {
  16315. var maxCount = common.getBestCount({
  16316. name: '4kmaxTileRecover',
  16317. minCount: 0,
  16318. maxCount: 2,
  16319. durBound1: 1.5,
  16320. durBound2: 6,
  16321. ifLog: false,
  16322. maxHistory: 2
  16323. });
  16324. var count = 0;
  16325. needRecover.forEach(function (e, i) {
  16326. //只更新若干个,因为太耗时了, 其余的等下帧更新
  16327. if (count >= maxCount) return;
  16328. var r = _this8.recoverTile(e);
  16329. if (r) count++;
  16330. });
  16331. }
  16332. /*if(recoverList.length == 0)this.highMapCube.restNeedRecover = []
  16333. else{
  16334. let maxCount = common.getBestCount({name:'4kmaxTileRecover', minCount : 0, maxCount : 2, durBound1 : 1.5, durBound2 : 6, ifLog:false, maxHistory:2 } )
  16335. let count = 0,index = -1
  16336. recoverList.forEach((e,i)=>{ //只更新若干个,因为太耗时了
  16337. if(count>=maxCount)return
  16338. let r = this.recoverTile(e)
  16339. if(r) count ++
  16340. index = i
  16341. })
  16342. this.highMapCube.restNeedRecover = recoverList.slice(index+1) //其余的等下帧更新
  16343. }*/
  16344. /* performance.mark('updateTiles-end')
  16345. let measure = performance.measure('updateTiles', 'updateTiles-start', 'updateTiles-end')
  16346. console.log('updateTiles', measure.duration.toFixed(3)) */
  16347. }
  16348. }, {
  16349. key: "getHighImage",
  16350. value: function getHighImage(image, cubeFace, tileX, tileY) {
  16351. var tile = this.highMapCube.children[cubeFace].children[tileX * 8 + tileY];
  16352. tile.image = image; //先记录下来
  16353. }
  16354. }, {
  16355. key: "updateHighMap",
  16356. value: function updateHighMap(image, cubeFace, tileX, tileY) {
  16357. var tile = this.highMapCube.children[cubeFace].children[tileX * 8 + tileY];
  16358. if (image) tile.image = image; //先记录下来
  16359. var uniforms = tile.material.uniforms;
  16360. if (uniforms.map.value) return;
  16361. if (this.highMapCube.visibleTiles && !this.highMapCube.visibleTiles.includes(tile)
  16362. /* this.highMapCube.texLoadedCount >= this.getMaxTileCount() */
  16363. ) {
  16364. return;
  16365. } //简易创建贴图
  16366. /* var tex = this.$app.core.get('SceneRenderer').initSizedTexture2D(512, THREE.ClampToEdgeWrapping)
  16367. //var loaded = this.$app.core.get('Player').model.isHighMapLoaded(tile.cubeFace, tile.tileX, tile.tileY)
  16368. this.$app.core.get('SceneRenderer').uploadTexture2D(image, tex, 0, 0, 512, 512) //只替换tex对应的img,不新建
  16369. */
  16370. var tex = new THREE.Texture();
  16371. tex.image = image;
  16372. tex.flipY = false;
  16373. tex.wrapS = tex.wrapT = THREE.ClampToEdgeWrapping;
  16374. tex.generateMipmaps = false;
  16375. tex.minFilter = THREE.LinearFilter;
  16376. tex.needsUpdate = true;
  16377. uniforms.map.value = tex;
  16378. if (highMapAddColor) {
  16379. uniforms.opacity.value = 1;
  16380. }
  16381. tile.visible = true;
  16382. tile.material.needsUpdate = true; //发现每次开始放大但还未放大到4k时也会把之前加载过的4k加载
  16383. //console.log('updateHighMap',cubeFace, tileX, tileY)
  16384. }
  16385. }, {
  16386. key: "recoverTile",
  16387. value: function recoverTile(tile) {
  16388. if (tile.material.uniforms.map.value) return;
  16389. if (tile.image) {
  16390. this.updateHighMap(tile.image, tile.cubeFace, tile.tileX, tile.tileY);
  16391. return true;
  16392. }
  16393. }
  16394. }, {
  16395. key: "resetTile",
  16396. value: function resetTile(tile, kill) {
  16397. if (kill) {
  16398. //完全消灭
  16399. tile.image = null;
  16400. }
  16401. var map = tile.material.uniforms.map.value;
  16402. if (map) {
  16403. map.dispose(); //这句执行了以后,h.__webglTexture一直就是undefined
  16404. map.loaded = !1;
  16405. map.version = 0; //保底再执行一下这个,类似app.sceneRenderer.deallocateCubeTexture(tile.material.map)
  16406. var h = this.$app.core.get('SceneRenderer').renderer.properties.get(map); //console.log('__webglTexture',!!h.__webglTexture)
  16407. this.$app.core.get('SceneRenderer').renderer.getContext().deleteTexture(h.__webglTexture);
  16408. tile.material.uniforms.map.value = null;
  16409. if (highMapAddColor) {
  16410. tile.material.uniforms.opacity.value = 0.4;
  16411. }
  16412. tile.material.needsUpdate = true;
  16413. tile.visible = false; //this.highMapCube.texLoadedCount --
  16414. //console.log('resetTile'/* , tile.cubeFace, tile.tileX, tile.tileY */)
  16415. }
  16416. }
  16417. }, {
  16418. key: "resetHighMap",
  16419. value: function resetHighMap() {
  16420. var _this9 = this;
  16421. if (!this.highMapCube) return;
  16422. this.highMapCube.children.forEach(function (e) {
  16423. return e.children.forEach(function (tile) {
  16424. _this9.resetTile(tile, true);
  16425. });
  16426. }); //this.highMapCube.texLoadedCount = 0
  16427. this.highMapCube.visibleTiles = null;
  16428. this.hideHighMap(); //console.log('resetHighMap')
  16429. }
  16430. }, {
  16431. key: "setHighMap",
  16432. value: function setHighMap(pano) {
  16433. if (!this.highMapCube) return;
  16434. this.highMapCube.position.copy(pano.position);
  16435. this.highMapCube.quaternion.copy(pano.quaternion);
  16436. }
  16437. }, {
  16438. key: "showHighMap",
  16439. value: function showHighMap() {
  16440. if (!this.highMapCube) return;
  16441. this.highMapCube.visible = true; //console.log('showHighMap')
  16442. }
  16443. }, {
  16444. key: "hideHighMap",
  16445. value: function hideHighMap() {
  16446. if (!this.highMapCube) return;
  16447. this.highMapCube.visible = false; //console.log('hideHighMap')
  16448. } //缩小后继续显示cube呢还是不显示? 不显示的话,就要把cube上的复制到renderTarget上……会不会又崩溃,or没加载的显示???
  16449. }, {
  16450. key: "showLowestTile",
  16451. value: function showLowestTile(isLowest) {
  16452. // 只显示最低精度的瓦片
  16453. if (this._3dTilesRuntime) {
  16454. this._3dTilesRuntime.pauseTilesetUpdate(false); // 最低精度时,暂停_3dTilesRuntime的update
  16455. var sceneRenderer = this.$app.core.get('SceneRenderer');
  16456. sceneRenderer.autoUpdate3dTiles = !isLowest;
  16457. sceneRenderer.autoUpdate3dTiles && sceneRenderer.update3dTiles({
  16458. force: true
  16459. }); // 立即更新一次相机位置
  16460. this._3dTilesRuntime.limit2lowestDepth(isLowest); // 只显示最低瓦片精度
  16461. this._3dTilesRuntime.ingoreVisibleCompute(isLowest); // 最低精度时,忽略瓦片是否在屏幕外
  16462. this._3dTilesRuntime.pauseTilesetUpdate(isLowest);
  16463. }
  16464. }
  16465. }]);
  16466. return Model;
  16467. }(THREE.Object3D)) || _class;
  16468. /*
  16469. note:
  16470. 目前highMap 4k放大 是会遮住所有marker、viewLink等mesh的
  16471. */
  16472. function _createSuper$1l(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1l(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  16473. function _isNativeReflectConstruct$1l() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  16474. var View = /*#__PURE__*/function (_EventEmitter) {
  16475. _inherits(View, _EventEmitter);
  16476. var _super = _createSuper$1l(View);
  16477. function View(e) {
  16478. var _this;
  16479. _classCallCheck(this, View);
  16480. _this = _super.call(this);
  16481. e = e || {};
  16482. _this.position = new THREE.Vector3();
  16483. _this.quaternion = new THREE.Quaternion();
  16484. _this.update(e);
  16485. return _this;
  16486. }
  16487. _createClass(View, [{
  16488. key: "isValid",
  16489. value: function isValid() {
  16490. return !!this.cameraMode;
  16491. }
  16492. }, {
  16493. key: "update",
  16494. value: function update(e) {
  16495. return this.cameraMode = e.cameraMode || this.cameraMode, this.pano = e.pano || this.pano, e.position && this.position.copy(e.position), e.quaternion && this.quaternion.copy(e.quaternion), this;
  16496. }
  16497. }]);
  16498. return View;
  16499. }(EventEmitter);
  16500. function _createSuper$1k(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1k(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  16501. function _isNativeReflectConstruct$1k() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  16502. var Reticule = /*#__PURE__*/function (_THREE$Mesh) {
  16503. _inherits(Reticule, _THREE$Mesh);
  16504. var _super = _createSuper$1k(Reticule);
  16505. function Reticule(player) {
  16506. var _this;
  16507. _classCallCheck(this, Reticule);
  16508. _this = _super.call(this);
  16509. var uniform = THREE.UniformsUtils.clone(shaders.waypoint.uniforms); //uniform.map.value = settings.blueReticule;
  16510. uniform.map.value = common.loadTextureFromCache(texture.getImageURL('images/blueReticle.png'));
  16511. uniform.map.value.minFilter = THREE.LinearMipMapLinearFilter;
  16512. uniform.map.value.anisotropy = 4;
  16513. uniform.opacity.value = 0; //uniform.color.value.set(settings.reticuleColor)
  16514. _this = _super.call(this, new THREE.PlaneBufferGeometry(0.4, 0.4, 1, 1), new THREE.RawShaderMaterial({
  16515. side: THREE.DoubleSide,
  16516. depthWrite: !1,
  16517. depthTest: !1,
  16518. transparent: !0,
  16519. vertexShader: shaders.waypoint.vertexShader,
  16520. fragmentShader: shaders.waypoint.fragmentShader,
  16521. uniforms: uniform,
  16522. name: 'waypoint',
  16523. opacity: 0
  16524. }));
  16525. _this.layers.set(RenderLayers.RETICULE);
  16526. _this.renderOrder = RenderOrder.reticule;
  16527. _this.player = player;
  16528. _this.direction = new THREE.Vector3();
  16529. _this.hidden = !0;
  16530. _this.mouseLastMoveTime = Date.now(); //this.alwaysShow = true //for test
  16531. return _this;
  16532. }
  16533. _createClass(Reticule, [{
  16534. key: "move",
  16535. value: function move(e, t, i) {
  16536. this.hidden = i, this.mouseLastMoveTime = Date.now();
  16537. }
  16538. }, {
  16539. key: "hide",
  16540. value: function hide() {
  16541. this.hidden || (this.hidden = !0, transitions$1.start(lerp.property(this.material.uniforms.opacity, 'value', 0), settings$3.reticuleOpacityTransitionTime));
  16542. }
  16543. }, {
  16544. key: "show",
  16545. value: function show() {
  16546. this.hidden = !1, this.material.opacity <= 0 && transitions$1.start(lerp.property(this.material.uniforms.opacity, 'value', settings$3[this.player.mode].reticuleOpacity), settings$3.reticuleOpacityTransitionTime);
  16547. }
  16548. }, {
  16549. key: "update",
  16550. value: function update() {
  16551. Date.now() - this.mouseLastMoveTime > settings$3.hideReticuleTimeout && !this.hidden && this.hide();
  16552. }
  16553. }, {
  16554. key: "updatePosition",
  16555. value: function updatePosition(e, t) {
  16556. if (!this.hidden) {
  16557. if (!t) return this.hide();
  16558. var i = t.point,
  16559. n = e.distanceTo(i),
  16560. r = 1 + 0.01 * n;
  16561. n < 1 && (r -= 1 - n), this.show();
  16562. this.scale.set(r, r, r);
  16563. this.direction = this.direction.multiplyScalar(0.8);
  16564. this.direction.add(t.face.normal.clone().multiplyScalar(0.2));
  16565. this.position.copy(i).add(t.face.normal.clone().multiplyScalar(0.01));
  16566. this.lookAt(this.position.clone().add(this.direction));
  16567. }
  16568. }
  16569. }]);
  16570. return Reticule;
  16571. }(THREE.Mesh);
  16572. var ControlEvents = {
  16573. Move: 'move',
  16574. InteractionDirect: 'interaction.direct',
  16575. InteractionKey: 'interaction.key',
  16576. InteractionGui: 'interaction.gui',
  16577. FlyInDirection: 'fly.direction',
  16578. InputStart: 'input.start',
  16579. Pinch: 'input.pinch',
  16580. Scroll: 'input.scroll',
  16581. AutoPanInterrupt: 'autopan.interrupt',
  16582. AutoPanComplete: 'autopan.complete',
  16583. AutoPanClamped: 'autopan.clamped',
  16584. LongTap: 'longtap'
  16585. };
  16586. var DownloadStatus = Object.freeze({
  16587. None: 0,
  16588. Queued: 1,
  16589. ForceQueued: 2,
  16590. Downloading: 3,
  16591. Downloaded: 4,
  16592. DownloadFailed: 5
  16593. });
  16594. var h$1 = Object.freeze({
  16595. None: 0,
  16596. DirectionalFOV: 1
  16597. });
  16598. var u$1 = function () {
  16599. var e = function e(t, i) {
  16600. var n = e._panoSpaceDir,
  16601. r = e._fovThreshold,
  16602. o = e._fovThresholdNarrow,
  16603. a = Math.max(Math.min(n.dot(t.direction), 1), -1),
  16604. s = Math.max(Math.min(n.dot(i.direction), 1), -1);
  16605. return t._dot = a, i._dot = s, a >= r && s < r ? -1 : a < r && s >= r ? 1 : a >= o && s < o ? -1 : a < o && s >= o ? 1 : t.panoSize > i.panoSize ? 1 : i.panoSize > t.panoSize ? -1 : -(a - s);
  16606. };
  16607. return e._panoSpaceDir = new THREE.Vector3(), e._fovThreshold = -1, e._fovThresholdNarrow = -1, e;
  16608. }();
  16609. var TilePrioritizer = /*#__PURE__*/function () {
  16610. function TilePrioritizer(_e, _t, _i, _o, _a) {
  16611. _classCallCheck(this, TilePrioritizer);
  16612. this.filterAndPrioritize = function () {
  16613. var e = [],
  16614. t = [],
  16615. i = [];
  16616. return function (r, o, a) {
  16617. var maxCount = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10;
  16618. //console.log('filterAndPrioritize', this.priorityCriteria.pano.model.sid)
  16619. if (this.priorityCriteria.pano.panoType != '360view') {
  16620. //没有相邻(如果加上了visibleView, 使用upcomingPanos)
  16621. this.populateNeighborPanos(this.priorityCriteria.pano, o, e);
  16622. this.populateScoredPanos(this.priorityCriteria.pano, o, t, this.priorityCriteria.cameraDir, TilePrioritizer.MAX_SCORED_PANOS_TOCONSIDER);
  16623. }
  16624. var s = this.baseSize,
  16625. //512
  16626. l = this.standardSize,
  16627. //1024
  16628. c = this.highSize,
  16629. //2048
  16630. h = this.ultraHighSize; //4096
  16631. this.queueTilesForPano(r, a, this.priorityCriteria.pano, s);
  16632. if (this.priorityCriteria.upcomingPanos) {
  16633. this.queueTilesForPanos(r, this.priorityCriteria.upcomingPanos, a, s, TilePrioritizer.MAX_UPCOMING_PANOS_TOADD);
  16634. }
  16635. i.length = 0;
  16636. if (this.canDownloadSize(l) && r.length < maxCount) {
  16637. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, l, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
  16638. }
  16639. TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDir);
  16640. TilePrioritizer.appendQueue(r, i);
  16641. this.queueTilesForPanos(r, t, a, s, TilePrioritizer.MAX_SCORED_PANOS_TOADD);
  16642. i.length = 0;
  16643. if (r.length < maxCount) {
  16644. if (this.canDownloadSize(c) && r.length + i.length < maxCount) {
  16645. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, c, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
  16646. }
  16647. if (this.canDownloadSize(h) && r.length + i.length < maxCount) {
  16648. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, h, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
  16649. }
  16650. TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDir);
  16651. TilePrioritizer.appendQueue(r, i);
  16652. i.length = 0;
  16653. }
  16654. if (r.length < maxCount) {
  16655. if (this.canDownloadSize(l) && r.length + i.length < maxCount) {
  16656. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, l, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV);
  16657. }
  16658. if (this.canDownloadSize(c) && r.length + i.length < maxCount) {
  16659. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, c, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV);
  16660. }
  16661. if (this.canDownloadSize(h) && r.length + i.length < maxCount) {
  16662. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, h, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV);
  16663. }
  16664. TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDir);
  16665. TilePrioritizer.appendQueue(r, i);
  16666. } //r.length && console.log(r.map(e=>e.pano.id + '-' + e.panoSize))
  16667. this.queueTilesForPanos(r, e, a, s);
  16668. };
  16669. }();
  16670. this.queueTilesForPano = function () {
  16671. var e = {
  16672. filter: h$1.None
  16673. };
  16674. return function (t, i, n, r) {
  16675. if (!n.tiled) return; //xzw add
  16676. return this.filterAndQueueTileDownloadDescriptors(t, i, n, r, e);
  16677. };
  16678. }();
  16679. this.queueTilesForPanosInDirection = function () {
  16680. var e = new THREE.Vector3();
  16681. return function (t, i, n, r, o, a, s, l) {
  16682. for (var h = 0, u = 0; u < n.length; u++) {
  16683. var d = n[u];
  16684. e.copy(d.position), e.sub(o), e.normalize();
  16685. var p = Math.max(Math.min(a.dot(e), 1), -1),
  16686. f = c.getFOVDotThreshold(s);
  16687. if (p >= f) {
  16688. var g = this.queueTilesInDirectionForPano(t, i, d, r, o, a, s);
  16689. if (h += g > 0 ? 1 : 0, l && h >= l) break;
  16690. }
  16691. }
  16692. return h;
  16693. };
  16694. }();
  16695. this.queueTilesInDirectionForPano = function () {
  16696. var e = {
  16697. filter: h$1.DirectionalFOV,
  16698. direction: new THREE.Vector3(),
  16699. fov: 60
  16700. },
  16701. t = new THREE.Vector3();
  16702. return function (i, n, r, o, a, s, c) {
  16703. if (!r.tiled) return; //xzw add
  16704. t.copy(s);
  16705. TileUtils.getRelativeDirection(r.quaternion, t);
  16706. e.direction.copy(t);
  16707. e.fov = c;
  16708. return this.filterAndQueueTileDownloadDescriptors(i, n, r, o, e);
  16709. };
  16710. }();
  16711. this.filterAndQueueTileDownloadDescriptors = function () {
  16712. var e = [];
  16713. return function (t, i, n, r, o) {
  16714. var a = i.getTileDownloadDescriptors(n, r);
  16715. e.length = 0, this.filterTileDownloadDescriptors(n, a, e, o);
  16716. for (var s = 0, l = 0; l < e.length; l++) {
  16717. var c = e[l];
  16718. if (c) {
  16719. t.push(c);
  16720. s++;
  16721. }
  16722. }
  16723. return s;
  16724. };
  16725. }();
  16726. this.filterTileDownloadDescriptors = function () {
  16727. new THREE.Vector3();
  16728. return function (e, t, i, n) {
  16729. var r, o;
  16730. switch (n.filter) {
  16731. case h$1.DirectionalFOV:
  16732. for (r = 0; r < t.length; r++) {
  16733. o = t[r], TileUtils.isTileWithinFOV(o.panoSize, o.tileSize, o.face, o.tileX, o.tileY, n.direction, n.fov) && i.push(o);
  16734. }
  16735. break;
  16736. default:
  16737. for (r = 0; r < t.length; r++) {
  16738. o = t[r], i.push(o);
  16739. }
  16740. }
  16741. for (r = 0; r < i.length; r++) {
  16742. o = i[r], this.canIncludeDescriptor(o) || (i[r] = null);
  16743. }
  16744. };
  16745. }();
  16746. this.qualityManager = _e;
  16747. this.maxNavQuality = this.qualityManager.getMaxNavPanoSize();
  16748. this.maxZoomQuality = this.qualityManager.getMaxZoomPanoSize();
  16749. this.baseSize = _t;
  16750. this.standardSize = _i;
  16751. this.highSize = _o;
  16752. this.ultraHighSize = _a;
  16753. this.priorityCriteria = new TilePrioritizer.PriorityCriteria(null, new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, -1), new THREE.Vector3(0, 0, -1));
  16754. }
  16755. _createClass(TilePrioritizer, [{
  16756. key: "updateCriteria",
  16757. value: function updateCriteria(pano, t, i, n) {
  16758. this.priorityCriteria.pano = pano;
  16759. this.priorityCriteria.cameraPosition.copy(t);
  16760. this.priorityCriteria.cameraDir.copy(i);
  16761. this.priorityCriteria.upcomingPanos = n;
  16762. this.maxNavQuality = this.qualityManager.limitQuality && pano.curTileQuality ? pano.curTileQuality : this.qualityManager.getMaxNavPanoSize(); //xzw : quality 表示在漫游过程中手机端先只加载低质量,静止片刻后再加载2k
  16763. this.maxZoomQuality = this.qualityManager.getMaxZoomPanoSize();
  16764. }
  16765. }, {
  16766. key: "canDownloadSize",
  16767. value: function canDownloadSize(e) {
  16768. return this.maxNavQuality >= e || this.maxZoomQuality >= e && this.zoomingActive;
  16769. }
  16770. }, {
  16771. key: "populateNeighborPanos",
  16772. value: function populateNeighborPanos(e, t, i) {
  16773. i = i || [], i.length = 0;
  16774. var n = t.getNeighbours(e);
  16775. for (var r in n) {
  16776. if (n.hasOwnProperty(r)) {
  16777. var o = t.get(r);
  16778. i.push(o);
  16779. }
  16780. }
  16781. return i;
  16782. }
  16783. }, {
  16784. key: "populateScoredPanos",
  16785. value: function populateScoredPanos(e, t, i, r, a) {
  16786. i = i || [], i.length = 0;
  16787. var s = [Panorama.filters.inPanoDirection(e.position, r, TilePrioritizer.DIRECTION_SCORE_STRICTNESS), Panorama.filters.not(e)],
  16788. l = [Panorama.scoreFunctions.distanceSquared(e), Panorama.scoreFunctions.direction(e.position, r)],
  16789. c = common.sortByScore(t.list, s, l);
  16790. if (c) for (var h = 0; h < c.length && h < a; h++) {
  16791. var u = c[h].item;
  16792. i.push(u);
  16793. }
  16794. return i;
  16795. }
  16796. }, {
  16797. key: "queueTilesForPanos",
  16798. value: function queueTilesForPanos(e, t, i, n, r) {
  16799. for (var o = 0, a = 0; a < t.length; a++) {
  16800. var s = t[a],
  16801. l = this.queueTilesForPano(e, i, s, n);
  16802. if (o += l > 0 ? 1 : 0, r && o >= r) break;
  16803. }
  16804. return o;
  16805. }
  16806. }, {
  16807. key: "queueTilesInDirectionForPanos",
  16808. value: function queueTilesInDirectionForPanos(e, t, i, n, r, o, a, s) {
  16809. for (var l = 0, c = 0; c < i.length; c++) {
  16810. var h = i[c],
  16811. u = this.queueTilesInDirectionForPano(e, t, h, n, o, a);
  16812. if (l += u > 0 ? 1 : 0, s && l >= s) break;
  16813. }
  16814. return l;
  16815. }
  16816. }, {
  16817. key: "canIncludeDescriptor",
  16818. value: function canIncludeDescriptor(e) {
  16819. return e.status !== DownloadStatus.Downloading && e.status !== DownloadStatus.Downloaded;
  16820. }
  16821. }, {
  16822. key: "canIncludePano",
  16823. value: function canIncludePano(e, t) {
  16824. return !e.isLoaded(t);
  16825. }
  16826. }, {
  16827. key: "setZoomingActive",
  16828. value: function setZoomingActive(e) {
  16829. e !== this.zoomingActive && (this.zoomingActive = e);
  16830. }
  16831. }], [{
  16832. key: "PriorityCriteria",
  16833. value: function PriorityCriteria(e, t, i, n, o) {
  16834. this.pano = e;
  16835. this.cameraPosition = new THREE.Vector3().copy(t);
  16836. this.cameraDir = new THREE.Vector3().copy(i);
  16837. this.panoSpaceDir = new THREE.Vector3().copy(n);
  16838. this.upcomingPanos = o;
  16839. this.copy = function (e) {
  16840. this.pano = e.pano;
  16841. this.cameraPosition.copy(e.cameraPosition);
  16842. this.cameraDir.copy(e.cameraDir);
  16843. this.panoSpaceDir.copy(e.panoSpaceDir);
  16844. this.upcomingPanos = o;
  16845. }, this.zoomingActive = !1;
  16846. }
  16847. }, {
  16848. key: "appendQueue",
  16849. value: function appendQueue(e, t) {
  16850. if (e && t) for (var i = 0; i < t.length; i++) {
  16851. e.push(t[i]);
  16852. }
  16853. }
  16854. }, {
  16855. key: "getFOVDotThreshold",
  16856. value: function getFOVDotThreshold(e) {
  16857. return Math.cos(THREE.MathUtils.degToRad(e / 2));
  16858. }
  16859. }, {
  16860. key: "sortPanoTiles",
  16861. value: function sortPanoTiles(e, t, i) {
  16862. u$1._panoSpaceDir.copy(i), TileUtils.getRelativeDirection(t.quaternion, u$1._panoSpaceDir), u$1._fovThresholdNarrow = math$1.getFOVDotThreshold(TilePrioritizer.DIRECTIONAL_FOV_NARROW), u$1._fovThreshold = math$1.getFOVDotThreshold(TilePrioritizer.DIRECTIONAL_FOV), e.sort(u$1);
  16863. }
  16864. }, {
  16865. key: "insertSortedPanoTile",
  16866. value: function insertSortedPanoTile(e, t, i, r) {
  16867. u$1._panoSpaceDir.copy(r), TileUtils.getRelativeDirection(i.quaternion, u$1._panoSpaceDir), u$1._fovThresholdNarrow = math$1.getFOVDotThreshold(TilePrioritizer.DIRECTIONAL_FOV_NARROW), u$1._fovThreshold = math$1.getFOVDotThreshold(TilePrioritizer.DIRECTIONAL_FOV);
  16868. for (var o = -1, a = 0; a < e.length; a++) {
  16869. var s = u$1(t, e[a]);
  16870. if (s <= 0) {
  16871. o = a;
  16872. break;
  16873. }
  16874. }
  16875. if (o === -1) e[e.length] = t;else {
  16876. for (var h = e.length; h > o; h--) {
  16877. e[h] = e[h - 1];
  16878. }
  16879. e[o] = t;
  16880. }
  16881. }
  16882. }]);
  16883. return TilePrioritizer;
  16884. }();
  16885. TilePrioritizer.DIRECTIONAL_FOV = 180;
  16886. TilePrioritizer.DIRECTIONAL_FOV_NARROW = 120;
  16887. TilePrioritizer.MAX_SCORED_PANOS_TOCONSIDER = 6;
  16888. TilePrioritizer.MAX_SCORED_PANOS_TOADD = 2;
  16889. TilePrioritizer.MAX_UPCOMING_PANOS_TOADD = 3;
  16890. TilePrioritizer.DIRECTION_SCORE_STRICTNESS = 0.75;
  16891. var Keys = {
  16892. ZERO: 48,
  16893. ONE: 49,
  16894. TWO: 50,
  16895. THREE: 51,
  16896. FOUR: 52,
  16897. FIVE: 53,
  16898. SIX: 54,
  16899. SEVEN: 55,
  16900. EIGHT: 56,
  16901. NINE: 57,
  16902. LEFTARROW: 37,
  16903. UPARROW: 38,
  16904. RIGHTARROW: 39,
  16905. DOWNARROW: 40,
  16906. A: 65,
  16907. B: 66,
  16908. C: 67,
  16909. D: 68,
  16910. E: 69,
  16911. F: 70,
  16912. G: 71,
  16913. H: 72,
  16914. I: 73,
  16915. J: 74,
  16916. K: 75,
  16917. L: 76,
  16918. M: 77,
  16919. N: 78,
  16920. O: 79,
  16921. P: 80,
  16922. Q: 81,
  16923. R: 82,
  16924. S: 83,
  16925. T: 84,
  16926. U: 85,
  16927. V: 86,
  16928. W: 87,
  16929. X: 88,
  16930. Y: 89,
  16931. Z: 90,
  16932. SPACE: 32,
  16933. RETURN: 13,
  16934. SEMICOLON: 186,
  16935. PLUSEQUALS: 187,
  16936. DASHUNDERSCORE: 189,
  16937. OPENBRACKET: 219
  16938. };
  16939. if (browser$1.detectFirefox()) {
  16940. Keys.SEMICOLON = 59;
  16941. Keys.PLUSEQUALS = 61;
  16942. Keys.DASHUNDERSCORE = 173;
  16943. }
  16944. var ModelManagerEvents = {
  16945. ModelAdded: 'model-added',
  16946. ActiveModelChanged: 'active-model-changed'
  16947. };
  16948. function _createSuper$1j(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1j(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  16949. function _isNativeReflectConstruct$1j() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  16950. var Snapshot = /*#__PURE__*/function (_View) {
  16951. _inherits(Snapshot, _View);
  16952. var _super = _createSuper$1j(Snapshot);
  16953. function Snapshot(objectSet) {
  16954. var _this;
  16955. _classCallCheck(this, Snapshot);
  16956. _this = _super.call(this, objectSet);
  16957. _this.panoId = objectSet.panoId;
  16958. _this.orthoZoom = objectSet.orthoZoom;
  16959. _this.floorVisibility = objectSet.floorVisibility;
  16960. _this.thumbUrl = objectSet.thumbUrl;
  16961. _this.name = objectSet.name;
  16962. return _this;
  16963. }
  16964. _createClass(Snapshot, [{
  16965. key: "isPano",
  16966. value: function isPano() {
  16967. return this.panoId && '' !== this.panoId;
  16968. }
  16969. }]);
  16970. return Snapshot;
  16971. }(View);
  16972. //导览时路径上出现的mesh 现在只用到了currentPanoMarker
  16973. var ShowPath = /*#__PURE__*/function () {
  16974. function ShowPath(director, player, controls) {
  16975. _classCallCheck(this, ShowPath);
  16976. this.flightStepWalk = function (e, t, i) {
  16977. var n = 0.001,
  16978. o = 1,
  16979. a = 1.2,
  16980. s = new THREE.Vector3(),
  16981. h = new THREE.Vector3(),
  16982. u = function u(e, t) {
  16983. var i = Math.min(this.player.position.distanceTo(e.position), settings$3.transition.flytimeMaxDistanceThreshold),
  16984. r = i * settings$3.transition.flytimeDistanceMultiplier + settings$3.transition.flyTime;
  16985. h.copy(Vectors$1.FORWARD), this.player.getDirection(h), s.copy(t).sub(e.position).normalize();
  16986. var l = s.dot(h),
  16987. u = Math.acos(l),
  16988. d = u / r;
  16989. return d > n && (r *= d / n, u < o && (r *= a)), r;
  16990. };
  16991. return function (e, t, i) {
  16992. if (this.warpInterrupted) i && i();else if (this.activeTransType !== l.WALK) this._clearWarpShading(), this._warpStopFlying(), this.player.spider.draw(), this.placeCpm(), i && i();else if (this.player.currentPano !== e) {
  16993. var n = {
  16994. pano: e,
  16995. lookAtPoint: t,
  16996. duration: null,
  16997. maxDistanceOverride: settings$3.warp.walkMaxDist,
  16998. skipWarpingCheck: !1,
  16999. constantMoveSpeed: !0
  17000. };
  17001. n.duration = u.call(this, e, t), this.player.nonInterruptingFlyToPano(n, i);
  17002. } else i && i();
  17003. };
  17004. }();
  17005. this.warpTravel_WALK = function () {
  17006. var e = [];
  17007. return function (t) {
  17008. var i = this.player.model.panos;
  17009. e.length = 0;
  17010. for (var n = null, o = !1, a = 0; a < this.nodes.length; a++) {
  17011. var s = this.nodes[a],
  17012. l = i.get(s);
  17013. a === this.nodes.length - 1;
  17014. o = n && l.position.distanceTo(n.position) < settings$3.warp.walkMinDist, n && o || (e.push(s), n = l);
  17015. }
  17016. o && this.nodes.length > 1 && (e[e.length - 1] = this.nodes[this.nodes.length - 1]);
  17017. var h = e.length,
  17018. u = i.get(e[h - 1]),
  17019. d = new Array(h + 1);
  17020. d[d.length - 1] = function () {
  17021. t && t();
  17022. }.bind(this);
  17023. for (var p = h - 1, f = d.length - 1; f > 0; f -= 1) {
  17024. var g = e[p];
  17025. u = i.get(g);
  17026. var m = new THREE.Vector3();
  17027. this.getLookAtForWalkingTourNode(e, p, m), d[f - 1] = this.makeWalkFlightFunc(u, m, d[f]), p--;
  17028. }
  17029. d[0]();
  17030. };
  17031. }();
  17032. this.getLookAtForWalkingTourNode = function () {
  17033. var e = new THREE.Vector3(),
  17034. t = new THREE.Vector3(),
  17035. i = new THREE.Vector3(),
  17036. n = new THREE.Vector3(),
  17037. o = new THREE.Vector3(),
  17038. a = 0.65,
  17039. s = 0.75,
  17040. l = 0.2,
  17041. c = 0.4,
  17042. h = 0.2,
  17043. u = 3;
  17044. return function (r, d, p) {
  17045. var f = r.length;
  17046. if (d >= f) return !1;
  17047. var g = 1,
  17048. m = 1;
  17049. t.set(0, 0, 0), o.set(0, 0, 0);
  17050. for (var v = null, A = d; A < d + u && !(A >= f); A++) {
  17051. if (v = this.player.model.panos.get(r[A]), this.getOrientationForWalkingTourNode(r, A, i), A === d && e.copy(i), n.copy(i), A > d) {
  17052. var y = n.dot(e) < a;
  17053. g *= y ? l : s, m *= y ? h : c;
  17054. }
  17055. i.multiplyScalar(g), t.add(i), o.lerp(v.position, m);
  17056. }
  17057. return t.normalize(), p.copy(o), p.add(t), !0;
  17058. };
  17059. }();
  17060. this.obj3d = null, this.nodes = [], this.colorHull = [], this.shortPaths = {}, this.floorHull = null, this.cameraHull = null, this.floorPathDistance = 0, this.floorCurvePoints = null, this.floorCurveColors = null, this.camCurvePoints = null, this.warpDestHeroLoc = null, this.warpDestPano = null, this.warpPathPoints = null, this.warpPathLengths = [0], this.warpLength = 0, this.closeWarpDistance = 4, this.UP = Vectors$1.UP.clone(), this.longestStep = 0, this.upcomingTransType = null, this.burnsDir = 1, this.prevNextDist = 0, this.nextI = 0, this.activeTransType = null, this.lastTransType = null, this.bunnyObj = null, this.director = director, this.player = player, this.playerControls = controls, this.modelManager = player.modelManager, this.updateModel(), this.bindEvents(), this.warping = !1, this.waitingToWarp = !1, this.warpInterrupted = !1, this.warpInterruptionBlackoutStyle = null, this.warpInterruptionTravelTime = null;
  17061. this.pathImg = {};
  17062. this.brushPrefs = {
  17063. linewidth: 7,
  17064. strokeWidth: 15,
  17065. cvSegments: 48,
  17066. paveStep: 0.1,
  17067. paveWidth: 0.2,
  17068. lookBlendDist: 3,
  17069. maxTurn: THREE.MathUtils.degToRad(2)
  17070. };
  17071. this.hintPrefs = {
  17072. rad: 0.18,
  17073. width: 0.0125,
  17074. depth: 0.0625,
  17075. setBack: -0.04,
  17076. markRad: 0.25,
  17077. markInnerRad: 0.16
  17078. };
  17079. this.init();
  17080. }
  17081. _createClass(ShowPath, [{
  17082. key: "init",
  17083. value: function init() {
  17084. //this.pathImg.path = common.loadTextureFromCache(config.path);//没用到
  17085. this.pathImg.pathEnd = common.loadTextureFromCache(texture.getImageURL('images/pathEnd.png')); //this.pathImg.pathStart = common.loadTextureFromCache(config.pathStart);//没用到
  17086. }
  17087. }, {
  17088. key: "setScene",
  17089. value: function setScene(scene) {
  17090. this.createCpm(scene); //this.createBunnyObj(scene);
  17091. }
  17092. }, {
  17093. key: "updateModel",
  17094. value: function updateModel() {
  17095. this.model = this.modelManager.getActiveModel();
  17096. }
  17097. }, {
  17098. key: "bindEvents",
  17099. value: function bindEvents() {
  17100. this.modelManager.on(ModelManagerEvents.ActiveModelChanged, this.updateModel.bind(this));
  17101. }
  17102. }, {
  17103. key: "pointPathDistance",
  17104. value: function pointPathDistance(points) {
  17105. for (var distance = 0, i = 1; i < points.length; i += 1) {
  17106. distance += points[i - 1].distanceTo(points[i]);
  17107. }
  17108. return distance;
  17109. }
  17110. }, {
  17111. key: "pointPathLengths",
  17112. value: function pointPathLengths(points) {
  17113. for (var t = [0], i = 1; i < points.length; i += 1) {
  17114. t.push(t[i - 1] + points[i - 1].distanceTo(points[i]));
  17115. }
  17116. return t;
  17117. }
  17118. }, {
  17119. key: "interpAlongPath",
  17120. value: function interpAlongPath(e, t, i) {
  17121. var n,
  17122. o = new THREE.Vector3(),
  17123. a = t[t.length - 1];
  17124. if (i < 1) {
  17125. n = i * a;
  17126. for (var s = 1; s < t.length; s += 1) {
  17127. if (t[s] > n) {
  17128. var l = (n - t[s - 1]) / (t[s] - t[s - 1]);
  17129. return o.copy(e[s]), o.sub(e[s - 1]), o.multiplyScalar(l), o.add(e[s - 1]), o;
  17130. }
  17131. }
  17132. } else o.copy(e[e.length - 1]);
  17133. return o;
  17134. }
  17135. }, {
  17136. key: "pathHeight",
  17137. value: function pathHeight() {
  17138. return settings$3.path.height; //this.player.mode !== ViewMode.FLOORPLAN ? settings.path.height : settings.path.outsideHeight
  17139. //outsideHeight为0.5, 导致floorplan->dollhouse下升高很多 ( 原版也是 )
  17140. }
  17141. }, {
  17142. key: "createBunnyObj",
  17143. value: function createBunnyObj(e) {
  17144. this.bunnyObj || (this.bunnyObj = new THREE.AxesHelper(0.1), this.bunnyObj.visible = settings$3.warp.showBunny), this.bunnyObj.parent && this.bunnyObj.parent.remove(this.bunnyObj), e.add(this.bunnyObj);
  17145. }
  17146. }, {
  17147. key: "createCpm",
  17148. value: function createCpm(e) {
  17149. if (!this.currentPanoMarker) {
  17150. var t = this.makeWaypointObj(this.pathImg.pathEnd, 'Current');
  17151. t.material.uniforms.opacity.value = 0, this.currentPanoMarker = {
  17152. mesh: t,
  17153. placed: !1
  17154. };
  17155. }
  17156. this.currentPanoMarker.mesh.parent && this.currentPanoMarker.mesh.parent.remove(this.currentPanoMarker.mesh), this.placeCpm(), this.currentPanoMarker.mesh.parent || e.add(this.currentPanoMarker.mesh);
  17157. }
  17158. }, {
  17159. key: "placeCpm",
  17160. value: function placeCpm() {
  17161. if (settings$3.path.mapGuides && this.player.currentPano && this.player.currentPano.isAligned()) {
  17162. var e = this.player.currentPano.floor;
  17163. this.currentPanoMarker.mesh.parent !== this.player.currentPano.floor && (this.currentPanoMarker.mesh.parent && this.currentPanoMarker.mesh.parent.remove(this.currentPanoMarker.mesh), e.add(this.currentPanoMarker.mesh)), this.currentPanoMarker.mesh.position.copy(this.player.currentPano.floorPosition).sub(e.position);
  17164. /*
  17165. if(edit && publicObjectSet.editor.mainDesign.editing){//如果底部高度不一致 另说
  17166. var mainDesign = publicObjectSet.editor.mainDesign;
  17167. mainDesign.atRoom && this.currentPanoMarker.mesh.position.setY(mainDesign.rooms[mainDesign.atRoom].bottom);
  17168. }
  17169. */
  17170. this.currentPanoMarker.mesh.position.y += this.pathHeight();
  17171. this.currentPanoMarker.placed = !0;
  17172. } else {
  17173. this.popOutCpm();
  17174. }
  17175. }
  17176. }, {
  17177. key: "fadeInCpm",
  17178. value: function fadeInCpm(e) {
  17179. this.player.mode === Viewmode$1.PANORAMA && this.player.currentPano && !this.player.currentPano.isAligned() || settings$3.path.mapGuides && this.currentPanoMarker.placed && transitions$1.start(lerp.property(this.currentPanoMarker.mesh.material.uniforms.opacity, 'value', 1), e);
  17180. }
  17181. }, {
  17182. key: "fadeOutCpm",
  17183. value: function fadeOutCpm(e) {
  17184. transitions$1.start(lerp.property(this.currentPanoMarker.mesh.material.uniforms.opacity, 'value', 0), e);
  17185. }
  17186. }, {
  17187. key: "popInCpm",
  17188. value: function popInCpm() {
  17189. settings$3.path.mapGuides && this.currentPanoMarker.placed && this.fadeInCpm(2);
  17190. }
  17191. }, {
  17192. key: "popOutCpm",
  17193. value: function popOutCpm() {
  17194. this.fadeOutCpm(2);
  17195. }
  17196. /* panoPathDistance(e){
  17197. var t = this.model.panos;
  17198. if (!e || e.length < 2)
  17199. return 0;
  17200. for (var i = [], n = 0; n < e.length; n += 1)
  17201. i.push(t.get(e[n]).floorPosition);
  17202. return this.pointPathDistance(i)
  17203. }
  17204. loadTileTexture(e){
  17205. var t = texture.load(e, function(t) {
  17206. t.wrapS = THREE.RepeatWrapping,
  17207. t.wrapT = THREE.RepeatWrapping,
  17208. t.needsUpdate = !0,
  17209. logger.debug('path texture "' + e + '" is ready')
  17210. }, function() {
  17211. logger.error('path texture "' + e + '" failed')
  17212. });
  17213. return t.mapping = THREE.UVMapping,
  17214. t
  17215. } */
  17216. }, {
  17217. key: "buildWarpDestinationDescriptor",
  17218. value: function buildWarpDestinationDescriptor(e, t, i, n, r, o) {
  17219. var a = {
  17220. cameraMode: n,
  17221. position: e,
  17222. quaternion: t,
  17223. panoId: i,
  17224. orthoZoom: o,
  17225. floorVisibility: r,
  17226. thumbUrl: null,
  17227. name: null
  17228. };
  17229. return new Snapshot(a);
  17230. }
  17231. }, {
  17232. key: "buildWarpDestinationDescriptorFromHero",
  17233. value: function buildWarpDestinationDescriptorFromHero(e) {
  17234. return this.buildWarpDestinationDescriptor(e.position, e.quaternion, this.getHeroId(e), e.cameraMode, e.floorVisibility, e.orthoZoom);
  17235. }
  17236. }, {
  17237. key: "setWarpDestination",
  17238. value: function setWarpDestination(e) {
  17239. this.warpDestHeroLoc = e;
  17240. }
  17241. }, {
  17242. key: "setWarpDestinationByHeroIndex",
  17243. value: function setWarpDestinationByHeroIndex(e) {
  17244. var t = this.getHeroDescriptorByHeroIndex(e);
  17245. return null !== t && (this.setWarpDestination(t), !0);
  17246. }
  17247. }, {
  17248. key: "setWarpDestinationByPano",
  17249. value: function setWarpDestinationByPano(e, t) {
  17250. var i = this.model.panos.get(e.id);
  17251. return !!i && this.setWarpDestinationByPanoId(e.id, t);
  17252. }
  17253. }, {
  17254. key: "setWarpDestinationByPanoId",
  17255. value: function setWarpDestinationByPanoId(e, t) {
  17256. var i = this.model.panos.get(e);
  17257. if (i) {
  17258. t = t || new THREE.Quaternion();
  17259. var n = this.buildWarpDestinationDescriptor(i.position, t, i.id, 'panorama', [], -1);
  17260. return this.setWarpDestination(n), !0;
  17261. }
  17262. return !1;
  17263. }
  17264. }, {
  17265. key: "getHeroDescriptorByHeroIndex",
  17266. value: function getHeroDescriptorByHeroIndex(e) {
  17267. var t = objects.play.heroCount();
  17268. if (null !== this.warpDestHeroLoc && t < 2) return logger$1.info('ShowPath.getHeroDescriptorByHeroIndex() -> Only one hero location is available.'), this.model.getHeroDescriptorByIndex(0);
  17269. var hero = this.model.getHeroDescriptorByIndex(e);
  17270. hero = util.getPlayDataItem(e);
  17271. var playData = objects.store.getters['guide/plays'];
  17272. if (playData[e].type == 1) {
  17273. hero = util.getPlayDataItem(e, 0);
  17274. }
  17275. var obj = util.convertHighlight(hero);
  17276. var i = new Snapshot(obj);
  17277. if (i) {
  17278. var n = i.isPano() ? i.panoId : i.cameraMode;
  17279. logger$1.debug('ShowPath.getHeroDescriptorByHeroIndex() -> New brush/warp destination: "' + n + '" out of ' + t + ' choices.');
  17280. }
  17281. return i;
  17282. }
  17283. }, {
  17284. key: "getHeroDescriptorByPano",
  17285. value: function getHeroDescriptorByPano(e) {
  17286. var t = this.model.panos.get(e.id);
  17287. return t ? this.getHeroDescriptorByPanoId(e.id) : null;
  17288. }
  17289. }, {
  17290. key: "getHeroDescriptorByPanoId",
  17291. value: function getHeroDescriptorByPanoId(e) {
  17292. var t = this.getHeroIndexFromPanoId(e);
  17293. return this.getHeroDescriptorByHeroIndex(t);
  17294. }
  17295. }, {
  17296. key: "getHeroIndexFromPanoId",
  17297. value: function getHeroIndexFromPanoId(e) {
  17298. for (var t = 0; t < this.model.heroLocations.length; t++) {
  17299. var i = this.model.heroLocations[t],
  17300. n = this.getHeroId(i);
  17301. if (n && n === e) return t;
  17302. }
  17303. return -1;
  17304. }
  17305. }, {
  17306. key: "getHeroPano",
  17307. value: function getHeroPano(e) {
  17308. if (null === e) return logger$1.warn('getHeroPano(): no destination'), null;
  17309. var t = this.getHeroId(e),
  17310. i = this.model.panos.get(t);
  17311. return void 0 === i && (i = null, '' !== t && logger$1.debug('unable to find pano "' + t + '"')), i;
  17312. }
  17313. }, {
  17314. key: "getHeroId",
  17315. value: function getHeroId(e) {
  17316. return e.panoId;
  17317. }
  17318. }, {
  17319. key: "setWarpDestPano",
  17320. value: function setWarpDestPano() {
  17321. return this.warpDestPano = this.getHeroPano(this.warpDestHeroLoc), this.warpDestPano;
  17322. }
  17323. /* brushToWarpPano(e,t){
  17324. if (this.discardPathObject(),
  17325. !this.setWarpDestPano())
  17326. return !1;
  17327. if (this.warpDestHeroLoc.cameraMode !== ViewMode.PANORAMA && logger.warn("Can only brush from pano to pano"),
  17328. !this.warpDestPano)
  17329. return logger.info("No brush"),
  17330. !1;
  17331. if (!this.player.currentPano)
  17332. return logger.debug("No current pano, visibility undefined"),
  17333. !1;
  17334. if (!this.warpDestPano)
  17335. return logger.info("No wPano, visibility undefined"),
  17336. !1;
  17337. if (!this.warpDestPano.isAligned())
  17338. return logger.debug("Cannot brush to unaligned pano"),
  17339. !1;
  17340. var i = (e === WarpStyle.STD || e === WarpStyle.WALK) && settings.path.mapGuides
  17341. , n = !0;
  17342. if (this.player.currentPano.id === this.warpDestPano.id)
  17343. logger.debug("Already at destination pano");
  17344. else {
  17345. this.nodes = this.findShortestPath(this.player.currentPano, this.warpDestPano),
  17346. n = void 0 === this.nodes || null === this.nodes || this.nodes.length < 1,
  17347. this.obj3d = new THREE.Object3D,
  17348. logger.debug('Brushing from "' + this.player.currentPano.id + '" to "' + this.warpDestPano.id + '" (' + (this.nodes ? this.nodes.length : 0) + ")"),
  17349. n ? (logger.info('No "walkable" route, using fall-back warp style transition'),
  17350. e = t) : (this.setPathHulls(this.nodes),
  17351. this.setFloorCurves(),
  17352. i && ("chevron" === settings.path.style ? this.obj3d.add(this.drawPathPavement(this.floorCurvePoints)) : "ribbon" === settings.path.style && this.obj3d.add(this.drawPathRibbon(this.floorCurvePoints, this.floorCurveColors)))),
  17353. this.player.currentPano.floor.add(this.obj3d);
  17354. var o = this.player.mode === ViewMode.DOLLHOUSE || this.player.mode === ViewMode.FLOORPLAN
  17355. , s = e === WarpStyle.STD;
  17356. if (!n && (i || s)) {
  17357. if (o) {
  17358. var h = this.makeStartMarker(this.floorHull[0], this.floorCurvePoints);
  17359. this.obj3d.add(h)
  17360. }
  17361. var u = this.makeEndMarker(this.floorHull[this.floorHull.length - 1]);
  17362. this.obj3d.add(u)
  17363. }
  17364. this.appearSlow()
  17365. }
  17366. return this.upcomingTransType = e,
  17367. !n
  17368. } */
  17369. }, {
  17370. key: "findShortestPath",
  17371. value: function findShortestPath(e, t) {
  17372. if (!e || !t) return null;
  17373. var i = settings$3.warp.walkExtraPanosDistance,
  17374. n = e.id + ':' + t.id + ':' + i;
  17375. if (this.shortPaths.hasOwnProperty(n)) return this.shortPaths[n] ? this.shortPaths[n].slice() : null;
  17376. var r = t.id + ':' + e.id + ':' + i;
  17377. if (this.shortPaths.hasOwnProperty(r)) return this.shortPaths[r] ? this.shortPaths[r].slice().reverse() : null;
  17378. var o = this.model.panos.aStarSearch(e, t);
  17379. return this.model.panos.includeNodesNearPath(o, i), this.shortPaths[n] = o ? o.slice() : null, o;
  17380. }
  17381. }, {
  17382. key: "makePathHulls",
  17383. value: function makePathHulls(e) {
  17384. var t,
  17385. i,
  17386. n,
  17387. r,
  17388. o,
  17389. a = 0,
  17390. s = [],
  17391. l = [],
  17392. h = [],
  17393. u = this.model.panos;
  17394. t = u.get(e[0]), r = t.floor.floorIndex;
  17395. for (var d = 0; d < e.length; d += 1) {
  17396. t = u.get(e[d]), i = t.floorPosition.clone().sub(this.model.position), i.y += this.pathHeight(), s.push(i), l.push(t.position.clone()), n = t.floor.floorIndex, h.push(n > r ? settings$3.path.colorUp : n < r ? settings$3.path.colorDown : settings$3.path.color), d > 0 && (o = l[d].distanceTo(l[d - 1]), o > a && (a = o));
  17397. }
  17398. return a > this.longestStep && (this.longestStep = a, logger$1.debug('path contains ' + a + ' meter segment')), {
  17399. floor: s,
  17400. camera: l,
  17401. color: h
  17402. };
  17403. }
  17404. }, {
  17405. key: "makeFloorCurves",
  17406. value: function makeFloorCurves(points, colors, i) {
  17407. var radius = this.player.mode === Viewmode$1.PANORAMA ? settings$3.path.waypointIndoorRadius : settings$3.path.waypointRadius,
  17408. distance = this.pointPathDistance(points) - 2 * radius,
  17409. s = points.slice(0),
  17410. l = s[1].clone().sub(s[0]);
  17411. l.y = 0, l.normalize().multiplyScalar(radius), s[0] = new THREE.Vector3().copy(s[0]).add(l), l = s[s.length - 2].clone().sub(s[s.length - 1]), l.y = 0, l.normalize().multiplyScalar(radius), s[s.length - 1] = new THREE.Vector3().copy(s[s.length - 1]).add(l);
  17412. var h = new THREE.CatmullRomCurve3(s),
  17413. u = Math.floor(distance / i);
  17414. u = 4 * Math.floor(u / 4), u = Math.max(4, u);
  17415. for (var d, p, f, g = h.getSpacedPoints(u), m = [], v = new THREE.Vector3(), A = 0; A < g.length; A += 1) {
  17416. f = 0, d = g[A].distanceTo(points[0]);
  17417. for (var y = 1; y < points.length; y += 1) {
  17418. v.copy(g[A]).sub(points[y]), v.y *= 4, p = v.length(), p < d && (f = y);
  17419. }
  17420. m.push(colors[f]);
  17421. }
  17422. return {
  17423. distance: distance,
  17424. points: g,
  17425. colors: m
  17426. };
  17427. }
  17428. }, {
  17429. key: "makeCameraCurvePoints",
  17430. value: function makeCameraCurvePoints(points, t) {
  17431. var distance = this.pointPathDistance(points),
  17432. n = new THREE.CatmullRomCurve3(points);
  17433. return n.getSpacedPoints(Math.max(2, Math.floor(distance / t)));
  17434. }
  17435. }, {
  17436. key: "setPathHulls",
  17437. value: function setPathHulls(e) {
  17438. var t = this.makePathHulls(e);
  17439. this.floorHull = t.floor, this.cameraHull = t.camera, this.colorHull = t.color;
  17440. }
  17441. }, {
  17442. key: "setFloorCurves",
  17443. value: function setFloorCurves() {
  17444. var e = this.makeFloorCurves(this.floorHull, this.colorHull, this.brushPrefs.paveStep);
  17445. this.floorPathDistance = e.distance, this.floorCurvePoints = e.points, this.floorCurveColors = e.colors;
  17446. }
  17447. }, {
  17448. key: "setCameraCurvePoints",
  17449. value: function setCameraCurvePoints() {
  17450. this.camCurvePoints = this.makeCameraCurvePoints(this.cameraHull, settings$3.warp.stepFactor * this.brushPrefs.paveStep);
  17451. }
  17452. }, {
  17453. key: "chooseWarpPath",
  17454. value: function chooseWarpPath(e) {
  17455. var t,
  17456. i,
  17457. n,
  17458. o = this.playerControls.cameras[Viewmode$1.PANORAMA];
  17459. if (this.player.currentPano === this.warpDestPano || !e) {
  17460. this.warpPathPoints = null;
  17461. this.warpLength = 0;
  17462. return !1;
  17463. }
  17464. this.nodes = this.findShortestPath(this.player.currentPano, this.warpDestPano);
  17465. this.setPathHulls(this.nodes);
  17466. if (void 0 === this.nodes || null === this.nodes || this.nodes.length < 1) {
  17467. logger$1.debug('warp path to unreachable node');
  17468. t = this.warpDestPano.position.clone().sub(o.position);
  17469. i = t.clone().negate();
  17470. t.multiplyScalar(0.15).add(o.position);
  17471. i.multiplyScalar(0.15).add(this.warpDestPano.position);
  17472. t.y = o.position.y;
  17473. i.y = this.warpDestPano.position.y;
  17474. n = new THREE.CubicBezierCurve3(o.position.clone(), t, i, this.warpDestPano.position.clone());
  17475. this.warpPathPoints = n.getSpacedPoints(this.brushPrefs.cvSegments);
  17476. } else {
  17477. logger$1.debug('follow warp path (path distance was ' + this.nodes.length + ' nodes, ' + this.floorPathDistance + ')');
  17478. this.setCameraCurvePoints();
  17479. this.warpPathPoints = this.camCurvePoints.slice(0);
  17480. }
  17481. this.warpLength = 0, this.warpPathLengths = [0];
  17482. for (var s = new THREE.Vector3(), l = new THREE.Vector3(), h = Math.cos(THREE.MathUtils.degToRad(settings$3.warp.minBrakeAngle)), u = Math.cos(THREE.MathUtils.degToRad(settings$3.warp.maxBrakeAngle)), d = 1; d < this.warpPathPoints.length; d += 1) {
  17483. s.copy(this.warpPathPoints[d - 1]).sub(this.warpPathPoints[d]);
  17484. var p = s.length();
  17485. s.y *= settings$3.warp.climbEffort;
  17486. var f = s.length() / p;
  17487. if (d > 1) {
  17488. s.setY(0).normalize(), l.copy(this.warpPathPoints[d - 2]).sub(this.warpPathPoints[d - 1]).setY(0).normalize();
  17489. var g = Math.min(1, s.dot(l)),
  17490. m = 1 + (settings$3.warp.brakeStrength - 1) * (1 - THREE.MathUtils.smoothstep(g, u, h));
  17491. f = Math.max(m, f);
  17492. }
  17493. this.warpLength += p * f, this.warpPathLengths[d] = this.warpLength;
  17494. }
  17495. return !0;
  17496. }
  17497. }, {
  17498. key: "drawPathRibbon",
  17499. value: function drawPathRibbon(e, t) {
  17500. this.bunnyObj.visible = settings$3.warp.showBunny;
  17501. for (var i = 0.6 * settings$3.path.ribbonWidth * 0.5, n = new THREE.Vector3(), o = new THREE.Vector3(0, this.pathHeight(), 0), l = new THREE.BufferGeometry(), h = new THREE.Vector3(), u = 0; u < e.length; u += 1) {
  17502. h.copy(e[u]), 0 === u ? h.sub(e[u + 1]) : h.sub(e[u - 1]).negate(), h.normalize(), n.crossVectors(h, Vectors$1.UP), n.multiplyScalar(i);
  17503. var d = new THREE.Vector3().copy(e[u]).add(o);
  17504. d.sub(n), l.vertices.push(d), d = new THREE.Vector3().copy(e[u]).add(o), d.add(n), l.vertices.push(d);
  17505. }
  17506. var p,
  17507. f = 0;
  17508. for (u = 0; u < e.length - 1; u += 1) {
  17509. var g = 2 * u,
  17510. v = f;
  17511. f += e[u + 1].distanceTo(e[u]);
  17512. var y = f,
  17513. C = t[u],
  17514. I = t[u + 1];
  17515. p = new THREE.Face3(g, g + 1, g + 2), p.vertexColors = [new THREE.Color(C), new THREE.Color(C), new THREE.Color(I)], l.faces.push(p), l.faceVertexUvs[0].push([new THREE.Vector2(0, v), new THREE.Vector2(1, v), new THREE.Vector2(0, y)]), p = new THREE.Face3(g + 2, g + 1, g + 3), p.vertexColors = [new THREE.Color(I), new THREE.Color(C), new THREE.Color(I)], l.faces.push(p), l.faceVertexUvs[0].push([new THREE.Vector2(0, y), new THREE.Vector2(1, v), new THREE.Vector2(1, y)]);
  17516. }
  17517. l.computeFaceNormals(), l.computeVertexNormals();
  17518. var E, b;
  17519. this.player.mode === Viewmode$1.PANORAMA ? (b = THREE.UniformsUtils.clone(shaders.ribbon.uniforms), b.map.value = this.pathImg.path, b.opacity.value = 0, b.color.value.set(settings$3.path.color), E = new THREE.RawShaderMaterial({
  17520. side: THREE.DoubleSide,
  17521. depthWrite: !1,
  17522. transparent: !0,
  17523. vertexShader: shaders.ribbon.vertexShader,
  17524. fragmentShader: shaders.ribbon.fragmentShader,
  17525. uniforms: b,
  17526. name: 'ribbonT',
  17527. opacity: 0
  17528. })) : E = new THREE.MeshBasicMaterial({
  17529. color: 16777215,
  17530. side: THREE.DoubleSide,
  17531. name: 'ribbonOut',
  17532. vertexColors: THREE.VertexColors
  17533. });
  17534. var _ = new THREE.Mesh(l, E);
  17535. return _.name = 'ribbon', this.player.mode === Viewmode$1.PANORAMA && (_.renderOrder = RenderOrder.ribbon), _;
  17536. }
  17537. }, {
  17538. key: "drawPathPavement",
  17539. value: function drawPathPavement(e) {
  17540. for (var t, i = 0.25, n = new THREE.Vector3(), o = new THREE.BufferGeometry(), s = new THREE.Vector3(), l = 0; l < e.length; l += 1) {
  17541. s.copy(e[l]), 0 === l ? s.sub(e[l + 1]).negate() : s.sub(e[l - 1]), s.normalize(), n.crossVectors(s, Vectors$1.UP), n.multiplyScalar(this.brushPrefs.paveWidth), t = new THREE.Vector3().copy(e[l]), t.sub(n), o.vertices.push(t), o.vertices.push(new THREE.Vector3().copy(e[l])), t = new THREE.Vector3().copy(e[l]), t.add(n), o.vertices.push(t);
  17542. }
  17543. var h, u, d;
  17544. for (l = 0; l < e.length - 1; l += 1) {
  17545. h = 3 * l + 1, u = l * i, d = u + i, o.faces.push(new THREE.Face3(h - 1, h, h + 3)), o.faceVertexUvs[0].push([new THREE.Vector2(0, u), new THREE.Vector2(0.5, u), new THREE.Vector2(0.5, d)]), o.faces.push(new THREE.Face3(h + 3, h + 2, h - 1)), o.faceVertexUvs[0].push([new THREE.Vector2(0.5, d), new THREE.Vector2(0, d), new THREE.Vector2(0, u)]), o.faces.push(new THREE.Face3(h + 3, h, h + 1)), o.faceVertexUvs[0].push([new THREE.Vector2(0.5, d), new THREE.Vector2(0.5, u), new THREE.Vector2(1, u)]), o.faces.push(new THREE.Face3(h + 3, h + 1, h + 4)), o.faceVertexUvs[0].push([new THREE.Vector2(0.5, d), new THREE.Vector2(1, u), new THREE.Vector2(1, d)]);
  17546. }
  17547. var p = this.player.mode === Viewmode$1.PANORAMA ? new THREE.MeshBasicMaterial({
  17548. color: settings$3.path.color,
  17549. side: THREE.DoubleSide,
  17550. transparent: !0,
  17551. depthWrite: !1,
  17552. opacity: 0,
  17553. name: 'paveT',
  17554. map: this.pathImg.path
  17555. }) : new THREE.MeshBasicMaterial({
  17556. color: settings$3.path.color,
  17557. side: THREE.DoubleSide,
  17558. transparent: !0,
  17559. depthWrite: !1,
  17560. opacity: 1,
  17561. name: 'paveO',
  17562. map: this.pathImg.path
  17563. });
  17564. return new THREE.Mesh(o, p);
  17565. }
  17566. }, {
  17567. key: "makeWaypointObj",
  17568. value: function makeWaypointObj(e, t) {
  17569. var n = this.player.mode === Viewmode$1.PANORAMA ? settings$3.path.waypointIndoorRadius : settings$3.path.waypointRadius,
  17570. o = this.pathHeight(),
  17571. i = new THREE.CylinderGeometry(n, n, o, 32); // i.setAttribute('position', new THREE.BufferAttribute(new Float32Array([-n, o, n, -n, o, -n, n, o, -n, n, o, n], 0, 3), 3))
  17572. // i.setAttribute('uv', new THREE.BufferAttribute(new Float32Array([0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0], 0, 2), 2))
  17573. // i.setIndex(new THREE.BufferAttribute(new Uint32Array([0, 1, 2, 2, 3, 0], 0, 1), 1))
  17574. var s = THREE.UniformsUtils.clone(shaders.waypoint.uniforms);
  17575. s.map.value = e, s.opacity.value = 0, s.color.value.set(settings$3.path.color);
  17576. var l = {
  17577. side: THREE.DoubleSide,
  17578. depthWrite: !1,
  17579. depthTest: false,
  17580. //许钟文 加
  17581. transparent: !0,
  17582. vertexShader: shaders.waypoint.vertexShader,
  17583. fragmentShader: shaders.waypoint.fragmentShader,
  17584. uniforms: s,
  17585. name: 'waypoint',
  17586. opacity: 0
  17587. };
  17588. this.player.mode !== Viewmode$1.PANORAMA && (l.depthTest = !1, l.name = 'wayPtOut');
  17589. var h = new THREE.RawShaderMaterial(l),
  17590. u = new THREE.Mesh(i, h);
  17591. u.renderOrder = RenderOrder.panoMarker; //.ribbon//许钟文加 否则在编辑模型时会时隐时现
  17592. return u.name = t, u;
  17593. }
  17594. }, {
  17595. key: "makeStartMarker",
  17596. value: function makeStartMarker(e, t) {
  17597. var i = new THREE.Vector3().copy(t[1]).sub(t[0]);
  17598. i.y = 0, i.normalize();
  17599. var n = Math.acos(i.x),
  17600. o = this.makeWaypointObj(this.pathImg.pathStart, 'Start');
  17601. return o.rotateOnAxis(new THREE.Vector3(0, 1, 0), n), o.position.copy(e), o;
  17602. }
  17603. }, {
  17604. key: "makeEndMarker",
  17605. value: function makeEndMarker(e) {
  17606. var t = this.makeWaypointObj(this.pathImg.pathEnd, 'End'),
  17607. i = this.model.panos.get(this.nodes[0]).floor.floorIndex,
  17608. n = this.model.panos.get(this.nodes[this.nodes.length - 1]).floor.floorIndex;
  17609. return i < n ? t.material.uniforms.color.value.set(settings$3.path.colorUp) : i > n && t.material.uniforms.color.value.set(settings$3.path.colorDown), t.position.copy(e), t;
  17610. }
  17611. }, {
  17612. key: "pathClean",
  17613. value: function pathClean(e) {
  17614. if (e) {
  17615. for (var t in e.children) {
  17616. this.pathClean(e.children[t]);
  17617. }
  17618. e.geometry && e.geometry.dispose(), e.material && e.material.dispose();
  17619. }
  17620. }
  17621. }, {
  17622. key: "discardPathObject",
  17623. value: function discardPathObject() {
  17624. if (this.obj3d) {
  17625. var e = this.obj3d.parent;
  17626. e && e.remove(this.obj3d), this.pathClean(this.obj3d);
  17627. }
  17628. this.obj3d = null, this.popInCpm();
  17629. }
  17630. }, {
  17631. key: "discardSlow",
  17632. value: function discardSlow() {
  17633. if (this.obj3d) {
  17634. if (this.player.mode !== Viewmode$1.PANORAMA) return void this.discardPathObject();
  17635. for (var e, t = this, i = 0, n = function () {
  17636. this.discardPathObject();
  17637. }.bind(this), r = 0; r < t.obj3d.children.length; r += 1) {
  17638. e = t.obj3d.children[r], void 0 !== e.material && e.material.transparent === !0 && (void 0 !== e.material.uniforms ? transitions$1.start(lerp.property(e.material.uniforms.opacity, 'value', 0), settings$3.path.fadeOutTime, n, 0, easing[settings$3.warp.blendEasing]) : transitions$1.start(lerp.property(e.material, 'opacity', 0), settings$3.path.fadeOutTime, n, 0, easing[settings$3.warp.blendEasing]), i += 1, n = null);
  17639. }
  17640. 0 === i && this.discardPathObject(), this.player.mode !== Viewmode$1.PANORAMA && this.fadeInCpm(settings$3.path.fadeInTime - 3);
  17641. }
  17642. }
  17643. }, {
  17644. key: "appearSlow",
  17645. value: function appearSlow() {
  17646. var e,
  17647. t = this;
  17648. this.fadeOutCpm(settings$3.path.fadeInTime);
  17649. for (var i = this.player.mode === Viewmode$1.PANORAMA ? settings$3.path.opacity : 1, n = 0; n < t.obj3d.children.length; n += 1) {
  17650. e = t.obj3d.children[n], void 0 !== e.material && e.material.transparent === !0 && (void 0 !== e.material.uniforms ? transitions$1.start(lerp.property(e.material.uniforms.opacity, 'value', i), settings$3.path.fadeInTime, null, 0, easing[settings$3.warp.blendEasing]) : transitions$1.start(lerp.property(e.material, 'opacity', i), settings$3.path.fadeInTime, null, 0, easing[settings$3.warp.blendEasing]));
  17651. }
  17652. }
  17653. }, {
  17654. key: "update",
  17655. value: function update() {
  17656. this.obj3d && this.obj3d.updateMatrixWorld();
  17657. }
  17658. }, {
  17659. key: "calcBurnsAmount",
  17660. value: function calcBurnsAmount(e) {
  17661. var t = THREE.MathUtils.degToRad(settings$3.warp.burnsAngle);
  17662. if (this.player.mode === Viewmode$1.PANORAMA) {
  17663. var i = this.burnsDir * t;
  17664. if (this.upcomingTransType === WarpStyle.BLACK) return i;
  17665. var n = e;
  17666. if (null === n) return logger$1.warn('Transition request for non-highlight'), i;
  17667. var o = this.getHeroDescriptorByHeroIndex(n);
  17668. if (null === o) return i;
  17669. if (!o.isPano()) return i;
  17670. var s = this.getHeroPano(o),
  17671. h = this.playerControls.cameras[Viewmode$1.PANORAMA],
  17672. u = Vectors$1.FORWARD.clone().applyQuaternion(h.quaternion).setY(0).normalize(),
  17673. d = Math.min(THREE.MathUtils.degToRad(settings$3.warp.minBurnsAngle), t),
  17674. p = function p(e) {
  17675. var i = Math.acos(Math.min(1, e.dot(u))),
  17676. n = new THREE.Vector3().crossVectors(u, e);
  17677. return Math.max(d, Math.min(Math.abs(i), t)) * Math.sign(n.y);
  17678. };
  17679. if (s === this.player.currentPano) return i = p(Vectors$1.FORWARD.clone().applyQuaternion(o.quaternion).setY(0).normalize());
  17680. var f = this.findShortestPath(this.player.currentPano, s);
  17681. if (void 0 === f || null === f || f.length < 1) return logger$1.debug('Empty path ahead...'), i;
  17682. var g = this.makePathHulls(f),
  17683. m = new THREE.CatmullRomCurve3(g.camera),
  17684. v = Math.min(0.1, settings$3.warp.lookAheadDist / m.getLength());
  17685. return i = p(m.getPointAt(v).clone().sub(h.position).setY(0).normalize());
  17686. }
  17687. return this.player.mode === Viewmode$1.DOLLHOUSE ? 0.02 * this.burnsDir : this.burnsDir;
  17688. }
  17689. }, {
  17690. key: "waitNextStep",
  17691. value: function waitNextStep(e, t) {
  17692. var i = settings$3.warp.tourStepDelay;
  17693. i || (i = this.lastTransType === WarpStyle.BLACK ? constants.tourStepDelaySlideShow : constants.tourStepDelayDefault);
  17694. var n = new THREE.Euler(),
  17695. o = new THREE.Vector3();
  17696. logger$1.debug('Starting wait: ' + (void 0 !== t));
  17697. var s = this.calcBurnsAmount(e),
  17698. h = function () {
  17699. this.endWarpState(), this.player.mode === Viewmode$1.DOLLHOUSE && (this.playerControls.cameras[Viewmode$1.DOLLHOUSE].controls.rotationAcceleration.x = 0), t && t();
  17700. }.bind(this),
  17701. u = function (e, t) {
  17702. if (this.warpInterrupted) return h(), !0;
  17703. var r = t || 1e3 / 60;
  17704. if (settings$3.warp.doBurns) if (this.player.mode === Viewmode$1.PANORAMA) {
  17705. var camera = this.playerControls.cameras[Viewmode$1.PANORAMA];
  17706. n.setFromQuaternion(WarpcameraStyle.quaternion, settings$3.warp.eOrder);
  17707. var u = r * s / i;
  17708. n.y += u, o.set(0, 0, -1), o.applyEuler(n), o.add(camera.position), camera.controls.lookAt(o), camera.controls.lookVector.copy(o), camera.lookAt(o);
  17709. } else this.player.mode === Viewmode$1.DOLLHOUSE ? this.playerControls.controls[Viewmode$1.DOLLHOUSE].rotationAcceleration.x = s : this.playerControls.controls[Viewmode$1.FLOORPLAN].absoluteScale *= 0.9996;
  17710. }.bind(this);
  17711. this.startWarpState(), transitions$1.start(u, i, h, 0, easing.easeInOutQuad, 'wait');
  17712. }
  17713. }, {
  17714. key: "warpToNonPano",
  17715. value: function warpToNonPano(e) {
  17716. if (this.discardPathObject(), this.warpDestHeroLoc.cameraMode === Viewmode$1.DOLLHOUSE || this.warpDestHeroLoc.cameraMode === Viewmode$1.FLOORPLAN) {
  17717. var t = function () {
  17718. e && e();
  17719. }.bind(this);
  17720. this.player.flyToNewMode({
  17721. mode: this.warpDestHeroLoc.cameraMode,
  17722. duration: settings$3.warp.outsideTime,
  17723. warpDest: this.warpDestHeroLoc,
  17724. callback: t,
  17725. force: !0
  17726. });
  17727. } else logger$1.warn('no warp destination!!!'), e && e();
  17728. }
  17729. }, {
  17730. key: "_resetWarpShaderParams",
  17731. value: function _resetWarpShaderParams(e) {
  17732. this.player.mode === Viewmode$1.PANORAMA && (void 0 !== e.material.uniforms.blackout && (e.material.uniforms.blackout.value = 0), void 0 !== e.material.uniforms.modelAlpha && (e.material.uniforms.modelAlpha.value = 0));
  17733. }
  17734. }, {
  17735. key: "_clearWarpShading",
  17736. value: function _clearWarpShading() {
  17737. for (var e = this.model.chunks, t = 0; t < e.length; t += 1) {
  17738. this._resetWarpShaderParams(e[t]), e[t].visible = !0;
  17739. }
  17740. this._resetWarpShaderParams(this.model.skybox);
  17741. }
  17742. }, {
  17743. key: "_warpStopFlying",
  17744. value: function _warpStopFlying() {
  17745. this.activeTransType = null, this.placeCpm();
  17746. }
  17747. }, {
  17748. key: "_wrapupTravelOnlyBits",
  17749. value: function _wrapupTravelOnlyBits() {
  17750. this._warpStopFlying(), this.warpPathPoints && (this.player.currentPano.exit(), this.warpDestPano.enter(), this.player.currentPano = this.warpDestPano), //this.player.spider.draw(),
  17751. this.placeCpm();
  17752. }
  17753. }, {
  17754. key: "_wrapupTravel",
  17755. value: function _wrapupTravel(e) {
  17756. this._wrapupTravelOnlyBits(), this.warpCameraAim(e);
  17757. }
  17758. }, {
  17759. key: "_wrapupWarpShading",
  17760. value: function _wrapupWarpShading(e) {
  17761. this._clearWarpShading(), this._wrapupTravel(e);
  17762. }
  17763. }, {
  17764. key: "wrapupWarpShadingOnly",
  17765. value: function wrapupWarpShadingOnly(e, t) {
  17766. t !== BlackoutStyle$1.END && this._clearWarpShading(), this._wrapupTravelOnlyBits(), this.upcomingTransType = null, e && e();
  17767. }
  17768. }, {
  17769. key: "_warpCameraAim",
  17770. value: function _warpCameraAim(e, t) {
  17771. var i = this.warpDestHeroLoc.quaternion,
  17772. n = this.playerControls.cameras[Viewmode$1.PANORAMA],
  17773. o = new THREE.Vector3(0, 0, 1).applyQuaternion(i).normalize(),
  17774. s = new THREE.Vector3(0, 0, 1).applyQuaternion(n.quaternion).normalize(),
  17775. l = s.dot(o),
  17776. u = THREE.MathUtils.radToDeg(Math.acos(l)),
  17777. f = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(i, settings$3.warp.eOrder),
  17778. g = new THREE.Euler().setFromQuaternion(n.quaternion, settings$3.warp.eOrder),
  17779. m = new THREE.Euler(f.x - g.x, f.y - g.y, f.z - g.z, settings$3.warp.eOrder);
  17780. m.y = math$1.constrainedTurn(m.y), this.burnsDir = Math.sign(m.y);
  17781. var v = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
  17782. A = new THREE.Vector3(),
  17783. C = function (e, t) {
  17784. return !!this.warpInterrupted || (v.x = g.x + e * m.x, v.y = g.y + e * m.y, v.z = g.z + e * m.z, A.set(0, 0, -1), A.applyEuler(v), A.add(n.position), n.controls.lookAt(A), n.controls.lookVector.copy(A), void n.lookAt(A));
  17785. }.bind(this);
  17786. if (u > settings$3.warp.minRotation) {
  17787. return transitions$1.start(C, e, t, 0, easing[settings$3.warp.movementEasing]);
  17788. } else {
  17789. logger$1.debug('Aim angle only is ' + u.toPrecision(3) + ' degrees, skipping explicit re-aim');
  17790. return void (t && t());
  17791. }
  17792. }
  17793. }, {
  17794. key: "_warpBendAim",
  17795. value: function _warpBendAim(e, t, i, n) {
  17796. var o = n || 0,
  17797. s = this.playerControls.cameras[Viewmode$1.PANORAMA],
  17798. l = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
  17799. u = new THREE.Euler().setFromQuaternion(s.quaternion, settings$3.warp.eOrder),
  17800. f = new THREE.Euler(l.x - u.x, l.y - u.y, l.z - u.z, settings$3.warp.eOrder);
  17801. f.y = math$1.constrainedTurn(f.y);
  17802. var g = Math.min(THREE.MathUtils.degToRad(settings$3.warp.softBendTilt), Math.abs(f.x));
  17803. f.x = g * Math.sign(f.x), g = Math.min(THREE.MathUtils.degToRad(Math.max(0, settings$3.warp.softBendAngle)), g), this.burnsDir = Math.sign(f.y), g *= Math.sign(f.y), f.y = g;
  17804. var m = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
  17805. v = new THREE.Vector3(),
  17806. A = function (e, t) {
  17807. if (e < 0.5) m.x = u.x + e * f.x, m.y = u.y + e * f.y, m.z = u.z + e * f.z;else {
  17808. var i = (1 - e) * settings$3.warp.softBendEnd;
  17809. m.x = l.x - i * f.x, m.y = l.y - i * f.y, m.z = l.z - i * f.z;
  17810. }
  17811. v.set(0, 0, -1), v.applyEuler(m), v.add(s.position), s.controls.lookAt(v), s.controls.lookVector.copy(v), s.lookAt(v);
  17812. }.bind(this);
  17813. return transitions$1.start(A, t, i, o, easing[settings$3.warp.movementEasing]);
  17814. }
  17815. }, {
  17816. key: "_warpStepCameraAim",
  17817. value: function _warpStepCameraAim(e, t, i) {
  17818. var n = this.playerControls.cameras[Viewmode$1.PANORAMA],
  17819. o = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
  17820. s = new THREE.Euler().setFromQuaternion(n.quaternion, settings$3.warp.eOrder),
  17821. l = new THREE.Euler(o.x - s.x, o.y - s.y, o.z - s.z, settings$3.warp.eOrder);
  17822. l.y = math$1.constrainedTurn(l.y), this.burnsDir = Math.sign(l.y);
  17823. var u = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
  17824. f = new THREE.Vector3(),
  17825. g = function (e, t) {
  17826. e < 0.5 ? u.copy(s) : u.copy(o), f.set(0, 0, -1), f.applyEuler(u), f.add(n.position), n.controls.lookAt(f), n.controls.lookVector.copy(f), n.lookAt(f);
  17827. }.bind(this);
  17828. return transitions$1.start(g, t, i, 0, easing[settings$3.warp.movementEasing]);
  17829. }
  17830. }, {
  17831. key: "setBurnsDir",
  17832. value: function setBurnsDir() {
  17833. var e = this.playerControls.cameras[Viewmode$1.PANORAMA],
  17834. t = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
  17835. i = new THREE.Euler().setFromQuaternion(e.quaternion, settings$3.warp.eOrder),
  17836. n = new THREE.Euler(t.x - i.x, t.y - i.y, t.z - i.z, settings$3.warp.eOrder);
  17837. n.y = math$1.constrainedTurn(n.y), this.burnsDir = Math.sign(n.y);
  17838. }
  17839. }, {
  17840. key: "stepWarpPath",
  17841. value: function stepWarpPath(firstPos, e
  17842. /* t */
  17843. ) {
  17844. //black过渡时的camera位置过渡
  17845. var i = this.playerControls.cameras[Viewmode$1.PANORAMA];
  17846. var n = this.warpPathPoints ? this.warpPathPoints[0] : firstPos; //xzw add firstPos
  17847. if (!n) {
  17848. return i.position.copy(this.warpDestPano.position), !0;
  17849. }
  17850. /* if (!this.warpPathPoints) {
  17851. i.position.copy(this.warpDestPano.position)
  17852. return !0
  17853. } */
  17854. var o = this.warpDestPano.position;
  17855. if (null !== this.nodes && this.cameraHull && this.cameraHull.length > 1) {
  17856. var s = new THREE.Vector3();
  17857. e < 0.5 ? s.copy(this.cameraHull[1]).sub(n).normalize().multiplyScalar(settings$3.warp.softPushDist * e).add(n) : s.copy(this.cameraHull[this.cameraHull.length - 2]).sub(o).normalize().multiplyScalar(settings$3.warp.softPushDist * settings$3.warp.softPushEnd * (1 - e)).add(o);
  17858. i.position.copy(s);
  17859. } else {
  17860. e < 0.5 ? i.position.copy(n) : i.position.copy(o);
  17861. }
  17862. }
  17863. }, {
  17864. key: "interruptAndFastForward",
  17865. value: function interruptAndFastForward(e, t) {
  17866. this.warping && (this.warpInterrupted = !0, this.warpInterruptionBlackoutStyle = e, this.warpInterruptionTravelTime = t, null !== this.warpInterruptionBlackoutStyle && void 0 !== this.warpInterruptionBlackoutStyle || (this.warpInterruptionBlackoutStyle = BlackoutStyle$1.MIDDLE), null !== this.warpInterruptionTravelTime && void 0 !== this.warpInterruptionTravelTime || (this.warpInterruptionTravelTime = settings$3.minWarpTime));
  17867. }
  17868. }, {
  17869. key: "warpCameraAim",
  17870. value: function warpCameraAim(e) {
  17871. var t = settings$3.warp.minWarpTime;
  17872. if (this.upcomingTransType === WarpStyle.BLACK) t = settings$3.warp.teleportTime;else {
  17873. var i = this.playerControls.cameras[Viewmode$1.PANORAMA],
  17874. n = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
  17875. o = new THREE.Euler().setFromQuaternion(i.quaternion, settings$3.warp.eOrder),
  17876. s = new THREE.Euler(n.x - o.x, n.y - o.y, n.z - o.z, settings$3.warp.eOrder);
  17877. s.y = math$1.constrainedTurn(s.y);
  17878. var u = 1e3 * Math.abs(s.y) / THREE.MathUtils.degToRad(settings$3.warp.maxAimPerSec);
  17879. t = Math.max(t, u);
  17880. }
  17881. var d = function () {
  17882. this._warpStopFlying(), this.discardSlow(), e && e();
  17883. }.bind(this);
  17884. this._warpCameraAim(t, d);
  17885. }
  17886. }, {
  17887. key: "warpCommonParameters",
  17888. value: function warpCommonParameters(e, t, i, n) {
  17889. this.model.skybox.material.uniforms.blackout.value = n;
  17890. var r = lerp.uniform(this.model.skybox, 'progress', 1),
  17891. o = lerp.allUniforms(this.model.chunks, 'progress', 1),
  17892. a = !1,
  17893. s = function () {
  17894. if (this.warpInterrupted) return a = !0, !0;
  17895. }.bind(this),
  17896. l = function (e, t) {
  17897. return i && a ? (this.model.skybox.material.uniforms.progress.value = 0, !0) : void r(e, t);
  17898. }.bind(this),
  17899. h = function (e, t) {
  17900. return i && a ? (o(0), !0) : void o(e, t);
  17901. }.bind(this);
  17902. transitions$1.start(s, e, null, t, null, 'safeHaltWatch'), transitions$1.start(l, e, null, t, easing[settings$3.warp.blendEasing], 'skyboxProgress'), transitions$1.start(h, e, null, t, easing[settings$3.warp.blendEasing], 'chunkProgress');
  17903. }
  17904. }, {
  17905. key: "warpTravel_STD",
  17906. value: function warpTravel_STD(e) {
  17907. var t,
  17908. i = Math.min(settings$3.warp.lookAheadMax, settings$3.warp.lookAheadDist / this.warpLength),
  17909. n = this.playerControls.cameras[a.PANORAMA],
  17910. o = (Math.min(0.25, 3 / this.warpLength), Math.min(0.35, 7 / this.warpLength)),
  17911. s = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
  17912. f = new THREE.Vector3(),
  17913. m = new THREE.Euler().setFromQuaternion(n.quaternion, settings$3.warp.eOrder),
  17914. v = new THREE.Euler().copy(m),
  17915. C = n.position.clone(),
  17916. E = new THREE.Matrix4(),
  17917. b = new THREE.Euler(),
  17918. w = settings$3.warp.minWarpTime;
  17919. w += this.warpLength * settings$3.warp.timePerMeter, settings$3.warp.flySpeed > 0.01 && (w = 1e3 * this.warpLength / settings$3.warp.flySpeed);
  17920. var _ = !1,
  17921. T = this.warpDestHeroLoc.quaternion,
  17922. x = new THREE.Vector3(0, 0, -1).applyQuaternion(T).normalize(),
  17923. S = this.warpPathPoints[this.warpPathPoints.length - 1].clone().sub(this.warpPathPoints[this.warpPathPoints.length - 2]).normalize(),
  17924. M = S.dot(x),
  17925. R = THREE.MathUtils.radToDeg(Math.acos(M)),
  17926. P = function P(e) {
  17927. var t = o,
  17928. i = THREE.MathUtils.smoothstep(e, 0, t) * (1 - THREE.MathUtils.smoothstep(e, 1 - t, 1));
  17929. return i;
  17930. },
  17931. O = function () {
  17932. return E.lookAt(C, t, Vectors$1.UP), s.setFromRotationMatrix(E, settings$3.warp.eOrder), m.setFromQuaternion(n.quaternion, settings$3.warp.eOrder), b.set(s.x - m.x, s.y - m.y, s.z - m.z, settings$3.warp.eOrder), math$1.constrainedTurn(b.y);
  17933. }.bind(this),
  17934. L = function (e, t) {
  17935. if (this.warpInterrupted) return _ = !0, !0;
  17936. }.bind(this),
  17937. D = function (e, t) {
  17938. return _ || !this.warpPathPoints ? (effects.blur(0), !0) : void effects.blur(e);
  17939. }.bind(this),
  17940. N = lerp.allUniforms(this.model.chunks, 'modelAlpha', 1),
  17941. B = function (e, t) {
  17942. return _ || !this.warpPathPoints ? (N(0), !0) : void N(e, t);
  17943. }.bind(this),
  17944. F = function (e, t) {
  17945. if (!this.warpPathPoints) return n.position.copy(this.warpDestPano.position), !0;
  17946. if (_) return !0;
  17947. var i = this.interpAlongPath(this.warpPathPoints, this.warpPathLengths, e);
  17948. n.position.copy(i), C = this.interpAlongPath(this.warpPathPoints, this.warpPathLengths, 0.99 * e);
  17949. }.bind(this),
  17950. V = function (e, n) {
  17951. return this.warpPathPoints ? !!_ || void (t = this.interpAlongPath(this.warpPathPoints, this.warpPathLengths, Math.min(e + i, 1))) : (logger$1.debug('Lost bunny.'), !0);
  17952. }.bind(this),
  17953. U = function (e, o) {
  17954. if (_) return logger$1.debug('>>>> Walkthrough interupted at t=' + e), !0;
  17955. if (!this.warpPathPoints) return !0;
  17956. var a = this.warpLength * e,
  17957. l = THREE.MathUtils.smoothstep(a, 0, this.brushPrefs.lookBlendDist),
  17958. u = THREE.MathUtils.smoothstep(a, this.warpLength - this.brushPrefs.lookBlendDist, this.warpLength);
  17959. settings$3.warp.matchCam && (l *= 1 - u), E.lookAt(C, t, Vectors$1.UP), s.setFromRotationMatrix(E, settings$3.warp.eOrder), m.setFromQuaternion(n.quaternion, settings$3.warp.eOrder), b.set(s.x - m.x, s.y - m.y, s.z - m.z, settings$3.warp.eOrder), b.y = math$1.constrainedTurn(b.y), s.x = m.x + l * b.x, s.y = m.y + l * b.y, s.z = m.z + l * b.z, b.set(s.x - v.x, s.y - v.y, s.z - v.z, settings$3.warp.eOrder), b.y = math$1.constrainedTurn(b.y);
  17960. var d = THREE.MathUtils.degToRad(settings$3.warp.maxTurnPerSec) * o / 1e3;
  17961. b.y = Math.sign(b.y) * Math.min(d, Math.abs(b.y)), v.x = v.x + b.x * settings$3.warp.turnFriction, v.y = v.y + b.y * settings$3.warp.turnFriction, v.z = v.z + b.z * settings$3.warp.turnFriction, v.x = Math.max(THREE.MathUtils.degToRad(settings$3.warp.minDownAngle), v.x);
  17962. var p = t.clone().sub(C).normalize();
  17963. if (R < settings$3.warp.maxAimRotation && u > 0) {
  17964. var g = 1 - u;
  17965. p.x = p.x * g + u * S.x, p.y = p.y * g + u * S.y, p.z = p.z * g + u * S.z, p.normalize();
  17966. }
  17967. this.bunnyObj.position.copy(n.position).add(p), f.set(0, 0, -1).applyEuler(v).normalize(), f.multiplyScalar(8), f.add(n.position), e > 1 - i && settings$3.warp.matchCam || (n.controls.lookAt(f), n.controls.lookVector.copy(f), n.lookAt(f));
  17968. }.bind(this),
  17969. k = function () {
  17970. _ ? (this.discardSlow(), this.upcomingTransType = l.BLACK, this.warpTravel_BLACK(-0.5, this.warpInterruptionTravelTime, BlackoutStyle$1.BEGINNING, e)) : this._wrapupWarpShading(e);
  17971. }.bind(this);
  17972. V(0);
  17973. var H = settings$3.warp.motionLeadTime + 1e3 * Math.abs(O()) / THREE.MathUtils.degToRad(settings$3.warp.maxTurnPerSec);
  17974. w += H;
  17975. var G = H / w;
  17976. this.warpCommonParameters(w, G, !0, BlackoutStyle$1.NONE), transitions$1.start(L, w, null, 0, null, '_haltWatcher'), settings$3.warp.blur > 0 && (g.blurStrength = settings$3.warp.blur, transitions$1.start(D, w, null, G, P, 'blurring')), transitions$1.start(B, w, null, G, P, 'modelAlpha'), transitions$1.start(F, w, null, G, d[settings$3.warp.blendEasing], 'followPath'), transitions$1.start(V, w, null, G, d[settings$3.warp.blendEasing], 'goBunny'), transitions$1.start(U, w, k, 0, d[settings$3.warp.blendEasing], 'lookAtBunny');
  17977. }
  17978. }, {
  17979. key: "warpTravel_BLACK",
  17980. value: function warpTravel_BLACK(e, t, i, n) {
  17981. this.player.model.floorLogos.firstLogo.visible = false;
  17982. this.player.model.floorLogos.secondLogo.visible = false; //this.player.tagManager.hideAllTags();
  17983. var r = e || 0;
  17984. void 0 !== t && null !== t || (t = settings$3.warp.teleportTime), this.warpCommonParameters(t, r, !1, i), this.model.chunks.forEach(function (e) {
  17985. e.material.uniforms.blackout.value = i;
  17986. }), this._warpBendAim(null, t, null, r);
  17987. var o = function () {
  17988. this.wrapupWarpShadingOnly(n, i);
  17989. }.bind(this);
  17990. var firstPos = this.player.position.clone(); //add
  17991. transitions$1.start(this.stepWarpPath.bind(this, firstPos), t, o, r, easing[settings$3.warp.blendEasing], 'stepMotion');
  17992. }
  17993. }, {
  17994. key: "makeWalkFlightFunc",
  17995. value: function makeWalkFlightFunc(e, t, i) {
  17996. return this.flightStepWalk.bind(this, e, t, i);
  17997. }
  17998. }, {
  17999. key: "getOrientationForWalkingTourNode",
  18000. value: function getOrientationForWalkingTourNode(e, t, i) {
  18001. var n = e.length;
  18002. if (t >= n) return !1;
  18003. if (t === n - 1) i.copy(Vectors$1.FORWARD).applyQuaternion(this.warpDestHeroLoc.quaternion);else {
  18004. var r = this.player.model.panos.get(e[t]),
  18005. o = this.player.model.panos.get(e[t + 1]);
  18006. i.copy(o.position).sub(r.position);
  18007. }
  18008. return i.normalize(), !0;
  18009. }
  18010. }, {
  18011. key: "warpCameraTravel",
  18012. value: function warpCameraTravel(e, t, i, n) {
  18013. if (this.activeTransType = this.upcomingTransType, this.lastTransType = this.activeTransType, this.upcomingTransType = null, !e) {
  18014. var r = function () {
  18015. this._wrapupTravel(n);
  18016. }.bind(this),
  18017. o = {
  18018. pano: this.warpDestPano,
  18019. lookAtPoint: null,
  18020. duration: null,
  18021. maxDistanceOverride: null,
  18022. skipWarpingCheck: !1
  18023. };
  18024. return void this.player.flyToPano(o, r);
  18025. }
  18026. this.activeTransType === WarpStyle.BLACK ? this.warpTravel_BLACK(null, i, t, n) : this.activeTransType === WarpStyle.WALK ? this.warpTravel_WALK(function () {
  18027. this._clearWarpShading(), this._warpStopFlying(), this.player.spider.draw(), this.placeCpm(), n && n();
  18028. }.bind(this)) : this.warpTravel_STD(n);
  18029. }
  18030. }, {
  18031. key: "startWarpState",
  18032. value: function startWarpState() {
  18033. this.warping = !0, this.warpInterrupted = !1, this.warpInterruptionBlackoutStyle = null, this.warpInterruptionTravelTime = null;
  18034. }
  18035. }, {
  18036. key: "endWarpState",
  18037. value: function endWarpState() {
  18038. this.warping = !1;
  18039. }
  18040. }, {
  18041. key: "warpToPano",
  18042. value: function warpToPano(e, t, i, n) {
  18043. if (this.warping) return void logger$1.warn('Cannot warp when already warping');
  18044. if (this.upcomingTransType = e, this.activeTransType = null, !this.setWarpDestPano()) return this.upcomingTransType = null, void this.warpToNonPano(n);
  18045. if (this.player.mode !== Viewmode$1.PANORAMA) return this.upcomingTransType = null, this.discardSlow(), void this.player.flyToNewMode({
  18046. mode: Viewmode$1.PANORAMA,
  18047. pano: this.warpDestPano,
  18048. duration: settings$3.warp.outsideTime,
  18049. warpDest: this.warpDestHeroLoc,
  18050. callback: n,
  18051. force: !0
  18052. });
  18053. if (!this.warpDestPano) return logger$1.warn('no warp destination, callback dropped'), void (this.upcomingTransType = null);
  18054. var r = !(this.model.panos.isNeighbour(this.player.currentPano, this.warpDestPano) && this.warpDestPano !== this.player.currentPano && this.warpDestPano.position.distanceTo(this.player.currentPano.position) < settings$3.warp.nearPanoDist),
  18055. o = this.chooseWarpPath(r);
  18056. if (o && this.upcomingTransType !== WarpStyle.WALK) {
  18057. var s = function () {
  18058. this.waitingToWarp = !1, this.warpToPano(e, t, i, n);
  18059. }.bind(this);
  18060. if (this.player.checkAndWaitForPanoLoad(this.warpDestPano, 'high', 'low', this.player.basePanoSize, s)) return void (this.waitingToWarp = !0);
  18061. }
  18062. this.player.currentPano || (logger$1.warn('Arrived at a very strange spot!'), this.player.currentPano = this.warpDestPano, this.placeCpm(), this.fadeOutCpm(settings$3.path.fadeOutTime), this.player.spider.draw()), logger$1.debug('Warping to pano ', this.warpDestPano.position);
  18063. if (this.upcomingTransType !== WarpStyle.WALK) {
  18064. this.player.emit(PlayerEvents.PanoChosen, this.player.currentPano, this.warpDestPano);
  18065. }
  18066. this.startWarpState();
  18067. var h = function () {
  18068. this.endWarpState(), n && n();
  18069. }.bind(this);
  18070. o ? this.warpCameraTravel(r, t, i, h) : this.warpCameraAim(h);
  18071. this.player.smoothZoomToDefault(settings$3.zoom.restoreTime);
  18072. }
  18073. }]);
  18074. return ShowPath;
  18075. }();
  18076. var ZoomEvents = {
  18077. ZoomIn: 'zoom.in',
  18078. ZoomOut: 'zoom.out',
  18079. ZoomMax: 'zoom.max',
  18080. ZoomMin: 'zoom.min'
  18081. };
  18082. function _createSuper$1i(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1i(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  18083. function _isNativeReflectConstruct$1i() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  18084. var _taskCache$1 = new WeakMap();
  18085. var DRACOLoader = /*#__PURE__*/function (_Loader) {
  18086. _inherits(DRACOLoader, _Loader);
  18087. var _super = _createSuper$1i(DRACOLoader);
  18088. function DRACOLoader(manager) {
  18089. var _this;
  18090. _classCallCheck(this, DRACOLoader);
  18091. _this = _super.call(this, manager);
  18092. _this.decoderPath = '';
  18093. _this.decoderConfig = {};
  18094. _this.decoderBinary = null;
  18095. _this.decoderPending = null;
  18096. _this.workerLimit = 4;
  18097. _this.workerPool = [];
  18098. _this.workerNextTaskID = 1;
  18099. _this.workerSourceURL = '';
  18100. _this.defaultAttributeIDs = {
  18101. position: 'POSITION',
  18102. normal: 'NORMAL',
  18103. color: 'COLOR',
  18104. uv: 'TEX_COORD'
  18105. };
  18106. _this.defaultAttributeTypes = {
  18107. position: 'Float32Array',
  18108. normal: 'Float32Array',
  18109. color: 'Float32Array',
  18110. uv: 'Float32Array'
  18111. };
  18112. return _this;
  18113. }
  18114. _createClass(DRACOLoader, [{
  18115. key: "setDecoderPath",
  18116. value: function setDecoderPath(path) {
  18117. this.decoderPath = path;
  18118. return this;
  18119. }
  18120. }, {
  18121. key: "setDecoderConfig",
  18122. value: function setDecoderConfig(config) {
  18123. this.decoderConfig = config;
  18124. return this;
  18125. }
  18126. }, {
  18127. key: "setWorkerLimit",
  18128. value: function setWorkerLimit(workerLimit) {
  18129. this.workerLimit = workerLimit;
  18130. return this;
  18131. }
  18132. }, {
  18133. key: "load",
  18134. value: function load(url, onLoad, onProgress, onError) {
  18135. var _this2 = this;
  18136. var loader = new THREE$1.FileLoader(this.manager);
  18137. loader.setPath(this.path);
  18138. loader.setResponseType('arraybuffer');
  18139. loader.setRequestHeader(this.requestHeader);
  18140. loader.setWithCredentials(this.withCredentials);
  18141. loader.load(url, function (buffer) {
  18142. _this2.decodeDracoFile(buffer, onLoad).catch(onError);
  18143. }, onProgress, onError);
  18144. }
  18145. }, {
  18146. key: "decodeDracoFile",
  18147. value: function decodeDracoFile(buffer, callback, attributeIDs, attributeTypes) {
  18148. var taskConfig = {
  18149. attributeIDs: attributeIDs || this.defaultAttributeIDs,
  18150. attributeTypes: attributeTypes || this.defaultAttributeTypes,
  18151. useUniqueIDs: !!attributeIDs
  18152. };
  18153. return this.decodeGeometry(buffer, taskConfig).then(callback);
  18154. }
  18155. }, {
  18156. key: "decodeGeometry",
  18157. value: function decodeGeometry(buffer, taskConfig) {
  18158. var _this3 = this;
  18159. var taskKey = JSON.stringify(taskConfig); // Check for an existing task using this buffer. A transferred buffer cannot be transferred
  18160. // again from this thread.
  18161. if (_taskCache$1.has(buffer)) {
  18162. var cachedTask = _taskCache$1.get(buffer);
  18163. if (cachedTask.key === taskKey) {
  18164. return cachedTask.promise;
  18165. } else if (buffer.byteLength === 0) {
  18166. // Technically, it would be possible to wait for the previous task to complete,
  18167. // transfer the buffer back, and decode again with the second configuration. That
  18168. // is complex, and I don't know of any reason to decode a Draco buffer twice in
  18169. // different ways, so this is left unimplemented.
  18170. throw new Error('THREE.DRACOLoader: Unable to re-decode a buffer with different ' + 'settings. Buffer has already been transferred.');
  18171. }
  18172. } //
  18173. var worker;
  18174. var taskID = this.workerNextTaskID++;
  18175. var taskCost = buffer.byteLength; // Obtain a worker and assign a task, and construct a geometry instance
  18176. // when the task completes.
  18177. var geometryPending = this._getWorker(taskID, taskCost).then(function (_worker) {
  18178. worker = _worker;
  18179. return new Promise(function (resolve, reject) {
  18180. worker._callbacks[taskID] = {
  18181. resolve,
  18182. reject
  18183. };
  18184. worker.postMessage({
  18185. type: 'decode',
  18186. id: taskID,
  18187. taskConfig,
  18188. buffer
  18189. }, [buffer]); // this.debug();
  18190. });
  18191. }).then(function (message) {
  18192. return _this3._createGeometry(message.geometry);
  18193. }); // Remove task from the task list.
  18194. // Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)
  18195. geometryPending.catch(function () {
  18196. return true;
  18197. }).then(function () {
  18198. if (worker && taskID) {
  18199. _this3._releaseTask(worker, taskID); // this.debug();
  18200. }
  18201. }); // Cache the task result.
  18202. _taskCache$1.set(buffer, {
  18203. key: taskKey,
  18204. promise: geometryPending
  18205. });
  18206. return geometryPending;
  18207. }
  18208. }, {
  18209. key: "_createGeometry",
  18210. value: function _createGeometry(geometryData) {
  18211. var geometry = new THREE$1.BufferGeometry();
  18212. if (geometryData.index) {
  18213. geometry.setIndex(new THREE$1.BufferAttribute(geometryData.index.array, 1));
  18214. }
  18215. for (var i = 0; i < geometryData.attributes.length; i++) {
  18216. var attribute = geometryData.attributes[i];
  18217. var name = attribute.name;
  18218. var array = attribute.array;
  18219. var itemSize = attribute.itemSize;
  18220. geometry.setAttribute(name, new THREE$1.BufferAttribute(array, itemSize));
  18221. }
  18222. return geometry;
  18223. }
  18224. }, {
  18225. key: "_loadLibrary",
  18226. value: function _loadLibrary(url, responseType) {
  18227. var loader = new THREE$1.FileLoader(this.manager);
  18228. loader.setPath(this.decoderPath);
  18229. loader.setResponseType(responseType);
  18230. loader.setWithCredentials(this.withCredentials);
  18231. return new Promise(function (resolve, reject) {
  18232. loader.load(url, resolve, undefined, reject);
  18233. });
  18234. }
  18235. }, {
  18236. key: "preload",
  18237. value: function preload() {
  18238. this._initDecoder();
  18239. return this;
  18240. }
  18241. }, {
  18242. key: "_initDecoder",
  18243. value: function _initDecoder() {
  18244. var _this4 = this;
  18245. if (this.decoderPending) return this.decoderPending;
  18246. var useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';
  18247. var librariesPending = [];
  18248. if (useJS) {
  18249. librariesPending.push(this._loadLibrary('draco_decoder.js', 'text'));
  18250. } else {
  18251. librariesPending.push(this._loadLibrary('draco_wasm_wrapper.js', 'text'));
  18252. librariesPending.push(this._loadLibrary('draco_decoder.wasm', 'arraybuffer'));
  18253. }
  18254. this.decoderPending = Promise.all(librariesPending).then(function (libraries) {
  18255. var jsContent = libraries[0];
  18256. if (!useJS) {
  18257. _this4.decoderConfig.wasmBinary = libraries[1];
  18258. }
  18259. var fn = DRACOWorker.toString();
  18260. var body = ['/* draco decoder */', jsContent, '', '/* worker */', fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}'))].join('\n');
  18261. _this4.workerSourceURL = URL.createObjectURL(new Blob([body]));
  18262. });
  18263. return this.decoderPending;
  18264. }
  18265. }, {
  18266. key: "_getWorker",
  18267. value: function _getWorker(taskID, taskCost) {
  18268. var _this5 = this;
  18269. return this._initDecoder().then(function () {
  18270. if (_this5.workerPool.length < _this5.workerLimit) {
  18271. var _worker2 = new Worker(_this5.workerSourceURL);
  18272. _worker2._callbacks = {};
  18273. _worker2._taskCosts = {};
  18274. _worker2._taskLoad = 0;
  18275. _worker2.postMessage({
  18276. type: 'init',
  18277. decoderConfig: _this5.decoderConfig
  18278. });
  18279. _worker2.onmessage = function (e) {
  18280. var message = e.data;
  18281. switch (message.type) {
  18282. case 'decode':
  18283. _worker2._callbacks[message.id].resolve(message);
  18284. break;
  18285. case 'error':
  18286. _worker2._callbacks[message.id].reject(message);
  18287. break;
  18288. default:
  18289. console.error('THREE.DRACOLoader: Unexpected message, "' + message.type + '"');
  18290. }
  18291. };
  18292. _this5.workerPool.push(_worker2);
  18293. } else {
  18294. _this5.workerPool.sort(function (a, b) {
  18295. return a._taskLoad > b._taskLoad ? -1 : 1;
  18296. });
  18297. }
  18298. var worker = _this5.workerPool[_this5.workerPool.length - 1];
  18299. worker._taskCosts[taskID] = taskCost;
  18300. worker._taskLoad += taskCost;
  18301. return worker;
  18302. });
  18303. }
  18304. }, {
  18305. key: "_releaseTask",
  18306. value: function _releaseTask(worker, taskID) {
  18307. worker._taskLoad -= worker._taskCosts[taskID];
  18308. delete worker._callbacks[taskID];
  18309. delete worker._taskCosts[taskID];
  18310. }
  18311. }, {
  18312. key: "debug",
  18313. value: function debug() {
  18314. console.log('Task load: ', this.workerPool.map(function (worker) {
  18315. return worker._taskLoad;
  18316. }));
  18317. }
  18318. }, {
  18319. key: "dispose",
  18320. value: function dispose() {
  18321. for (var i = 0; i < this.workerPool.length; ++i) {
  18322. this.workerPool[i].terminate();
  18323. }
  18324. this.workerPool.length = 0;
  18325. return this;
  18326. }
  18327. }]);
  18328. return DRACOLoader;
  18329. }(THREE$1.Loader);
  18330. /* WEB WORKER */
  18331. function DRACOWorker() {
  18332. var decoderConfig;
  18333. var decoderPending;
  18334. onmessage = function onmessage(e) {
  18335. var message = e.data;
  18336. switch (message.type) {
  18337. case 'init':
  18338. decoderConfig = message.decoderConfig;
  18339. decoderPending = new Promise(function (resolve
  18340. /*, reject*/
  18341. ) {
  18342. decoderConfig.onModuleLoaded = function (draco) {
  18343. // Module is Promise-like. Wrap before resolving to avoid loop.
  18344. resolve({
  18345. draco: draco
  18346. });
  18347. };
  18348. DracoDecoderModule(decoderConfig); // eslint-disable-line no-undef
  18349. });
  18350. break;
  18351. case 'decode':
  18352. var buffer = message.buffer;
  18353. var taskConfig = message.taskConfig;
  18354. decoderPending.then(function (module) {
  18355. var draco = module.draco;
  18356. var decoder = new draco.Decoder();
  18357. var decoderBuffer = new draco.DecoderBuffer();
  18358. decoderBuffer.Init(new Int8Array(buffer), buffer.byteLength);
  18359. try {
  18360. var geometry = decodeGeometry(draco, decoder, decoderBuffer, taskConfig);
  18361. var buffers = geometry.attributes.map(function (attr) {
  18362. return attr.array.buffer;
  18363. });
  18364. if (geometry.index) buffers.push(geometry.index.array.buffer);
  18365. self.postMessage({
  18366. type: 'decode',
  18367. id: message.id,
  18368. geometry
  18369. }, buffers);
  18370. } catch (error) {
  18371. console.error(error);
  18372. self.postMessage({
  18373. type: 'error',
  18374. id: message.id,
  18375. error: error.message
  18376. });
  18377. } finally {
  18378. draco.destroy(decoderBuffer);
  18379. draco.destroy(decoder);
  18380. }
  18381. });
  18382. break;
  18383. }
  18384. };
  18385. function decodeGeometry(draco, decoder, decoderBuffer, taskConfig) {
  18386. var attributeIDs = taskConfig.attributeIDs;
  18387. var attributeTypes = taskConfig.attributeTypes;
  18388. var dracoGeometry;
  18389. var decodingStatus;
  18390. var geometryType = decoder.GetEncodedGeometryType(decoderBuffer);
  18391. if (geometryType === draco.TRIANGULAR_MESH) {
  18392. dracoGeometry = new draco.Mesh();
  18393. decodingStatus = decoder.DecodeBufferToMesh(decoderBuffer, dracoGeometry);
  18394. } else if (geometryType === draco.POINT_CLOUD) {
  18395. dracoGeometry = new draco.PointCloud();
  18396. decodingStatus = decoder.DecodeBufferToPointCloud(decoderBuffer, dracoGeometry);
  18397. } else {
  18398. throw new Error('THREE.DRACOLoader: Unexpected geometry type.');
  18399. }
  18400. if (!decodingStatus.ok() || dracoGeometry.ptr === 0) {
  18401. throw new Error('THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg());
  18402. }
  18403. var geometry = {
  18404. index: null,
  18405. attributes: []
  18406. }; // Gather all vertex attributes.
  18407. for (var attributeName in attributeIDs) {
  18408. var attributeType = self[attributeTypes[attributeName]];
  18409. var attribute = void 0;
  18410. var attributeID = void 0; // A Draco file may be created with default vertex attributes, whose attribute IDs
  18411. // are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,
  18412. // a Draco file may contain a custom set of attributes, identified by known unique
  18413. // IDs. glTF files always do the latter, and `.drc` files typically do the former.
  18414. if (taskConfig.useUniqueIDs) {
  18415. attributeID = attributeIDs[attributeName];
  18416. attribute = decoder.GetAttributeByUniqueId(dracoGeometry, attributeID);
  18417. } else {
  18418. attributeID = decoder.GetAttributeId(dracoGeometry, draco[attributeIDs[attributeName]]);
  18419. if (attributeID === -1) continue;
  18420. attribute = decoder.GetAttribute(dracoGeometry, attributeID);
  18421. }
  18422. geometry.attributes.push(decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute));
  18423. } // Add index.
  18424. if (geometryType === draco.TRIANGULAR_MESH) {
  18425. geometry.index = decodeIndex(draco, decoder, dracoGeometry);
  18426. }
  18427. draco.destroy(dracoGeometry);
  18428. return geometry;
  18429. }
  18430. function decodeIndex(draco, decoder, dracoGeometry) {
  18431. var numFaces = dracoGeometry.num_faces();
  18432. var numIndices = numFaces * 3;
  18433. var byteLength = numIndices * 4;
  18434. var ptr = draco._malloc(byteLength);
  18435. decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr);
  18436. var index = new Uint32Array(draco.HEAPF32.buffer, ptr, numIndices).slice();
  18437. draco._free(ptr);
  18438. return {
  18439. array: index,
  18440. itemSize: 1
  18441. };
  18442. }
  18443. function decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute) {
  18444. var numComponents = attribute.num_components();
  18445. var numPoints = dracoGeometry.num_points();
  18446. var numValues = numPoints * numComponents;
  18447. var byteLength = numValues * attributeType.BYTES_PER_ELEMENT;
  18448. var dataType = getDracoDataType(draco, attributeType);
  18449. var ptr = draco._malloc(byteLength);
  18450. decoder.GetAttributeDataArrayForAllPoints(dracoGeometry, attribute, dataType, byteLength, ptr);
  18451. var array = new attributeType(draco.HEAPF32.buffer, ptr, numValues).slice();
  18452. draco._free(ptr);
  18453. return {
  18454. name: attributeName,
  18455. array: array,
  18456. itemSize: numComponents
  18457. };
  18458. }
  18459. function getDracoDataType(draco, attributeType) {
  18460. switch (attributeType) {
  18461. case Float32Array:
  18462. return draco.DT_FLOAT32;
  18463. case Int8Array:
  18464. return draco.DT_INT8;
  18465. case Int16Array:
  18466. return draco.DT_INT16;
  18467. case Int32Array:
  18468. return draco.DT_INT32;
  18469. case Uint8Array:
  18470. return draco.DT_UINT8;
  18471. case Uint16Array:
  18472. return draco.DT_UINT16;
  18473. case Uint32Array:
  18474. return draco.DT_UINT32;
  18475. }
  18476. }
  18477. }
  18478. var GLTFLoader$2 = new THREE.GLTFLoader();
  18479. var dracoLoader = new DRACOLoader();
  18480. dracoLoader.setDecoderPath(texture.getImageURL('images/loaders/DRACOLoader/draco/'));
  18481. GLTFLoader$2.setDRACOLoader(dracoLoader);
  18482. var loaders = {
  18483. gltf: function gltf(url, func) {
  18484. GLTFLoader$2.load(url, func);
  18485. }
  18486. };
  18487. function _createSuper$1h(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1h(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  18488. function _isNativeReflectConstruct$1h() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  18489. var bracketModels = {}; // 支架模型数据
  18490. /**
  18491. * 空间贴图边框
  18492. */
  18493. var OverlayFrame = /*#__PURE__*/function (_THREE$Object3D) {
  18494. _inherits(OverlayFrame, _THREE$Object3D);
  18495. var _super = _createSuper$1h(OverlayFrame);
  18496. function OverlayFrame(type) {
  18497. var _this;
  18498. _classCallCheck(this, OverlayFrame);
  18499. _this = _super.call(this);
  18500. _this.parts = {
  18501. body: null,
  18502. // 随overlay缩放或旋转的部分
  18503. foot: null,
  18504. // 不随overlay缩放或旋转的部分
  18505. line: null // 线框
  18506. };
  18507. /**
  18508. * 目前有:
  18509. * 边框:wall1, wall2, wall3,
  18510. * 支架:ground1, ground2
  18511. */
  18512. _this.type = type;
  18513. _this.addEventListener('createDone', function () {
  18514. _this.traverse(function (e) {
  18515. if (e.isMesh) {
  18516. e.renderOrder = RenderOrder.overlay - 1; //低于plane的,为了让plane的透明部分不会遮住画框。若要相反的效果需要保证完全重叠
  18517. e.material.transparent = true;
  18518. }
  18519. }); //xzw:遮住marker
  18520. });
  18521. if (_this.type.indexOf('ground') > -1) {
  18522. _this.createBracket();
  18523. } else {
  18524. _this.createFrame();
  18525. }
  18526. return _this;
  18527. } // // 用于TransfromControl
  18528. // get width() {
  18529. // if (this.overlay && this.type.indexOf('wall') > -1) return this.overlay.width
  18530. // else return
  18531. // }
  18532. // get height() {
  18533. // if (this.overlay && this.type.indexOf('wall') > -1) return this.overlay.height
  18534. // else return
  18535. // }
  18536. // get depth() {
  18537. // if (this.overlay && this.type.indexOf('wall') > -1) return this.overlay.depth
  18538. // else return
  18539. // }
  18540. _createClass(OverlayFrame, [{
  18541. key: "show",
  18542. value: function show() {
  18543. // overlay隐藏时不显示
  18544. if (!this.overlay.visible) {
  18545. this.visible = false;
  18546. return;
  18547. } // wall_1厚度为0时不显示
  18548. if (this.type == 'wall_1' && this.overlay.depthTemp == 0) {
  18549. this.visible = false;
  18550. return;
  18551. }
  18552. this.visible = true;
  18553. }
  18554. }, {
  18555. key: "hide",
  18556. value: function hide() {
  18557. this.visible = false;
  18558. } // 设置厚度
  18559. }, {
  18560. key: "setFrameThickness",
  18561. value: function setFrameThickness(thickness) {
  18562. if (this.type == 'wall_1') {
  18563. isNaN(thickness) && (thickness = 0);
  18564. /* settings.overlay.depth */
  18565. this.overlay.depthTemp = thickness; // 当厚度为0时隐藏frame
  18566. !!thickness ? this.show() : this.hide();
  18567. } else if (this.type.indexOf('wall') > -1) {
  18568. thickness = settings$3.overlay.depth; // 其他贴墙固定0.04
  18569. } else {
  18570. thickness = 0; // 贴地默认无厚度
  18571. }
  18572. this.overlay.depth = thickness;
  18573. this.overlay.plane.position.set(0, 0, thickness);
  18574. this.update({
  18575. mode: 'scale'
  18576. });
  18577. }
  18578. }, {
  18579. key: "setOverlay",
  18580. value: function setOverlay(overlay, isFromInfo) {
  18581. this.overlay = overlay;
  18582. overlay.frame = this;
  18583. this.visible = overlay.visible;
  18584. if (!isFromInfo) {
  18585. this.position.copy(this.overlay.position);
  18586. this.quaternion.copy(this.overlay.quaternion); // 根据overlayFrame修正overlay坐标
  18587. var _this$computeOverlayT = this.computeOverlayTransform(),
  18588. position = _this$computeOverlayT.position,
  18589. quaternion = _this$computeOverlayT.quaternion;
  18590. this.overlay.position.copy(position);
  18591. this.overlay.quaternion.copy(quaternion);
  18592. } else {
  18593. // 初始化数据库数据时,倒推出overlay修正前坐标,作为overlayFrame位置
  18594. var _this$computeOverlayT2 = this.computeOverlayTransform({
  18595. reverse: true
  18596. }),
  18597. _position = _this$computeOverlayT2.position,
  18598. _quaternion = _this$computeOverlayT2.quaternion;
  18599. this.position.copy(_position);
  18600. this.quaternion.copy(_quaternion);
  18601. }
  18602. this.update({
  18603. mode: 'scale'
  18604. });
  18605. }
  18606. /**
  18607. * 改变overlay坐标和旋转使它适应overlayFrame
  18608. * @param {*} options
  18609. * @returns
  18610. */
  18611. }, {
  18612. key: "computeOverlayTransform",
  18613. value: function computeOverlayTransform() {
  18614. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  18615. var position = this.overlay.position.clone();
  18616. var quaternion = this.overlay.quaternion.clone();
  18617. var reverse = options.reverse ? -1 : 1;
  18618. var height = settings$3.overlay.height * this.overlay.scale.y;
  18619. switch (this.type) {
  18620. case 'ground_1':
  18621. position.add(new THREE.Vector3(0, (bracketModels[this.type].height + height / 2) * reverse, 0).applyQuaternion(this.overlay.quaternion));
  18622. break;
  18623. case 'ground_2':
  18624. quaternion.multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 6 * reverse));
  18625. position.add(new THREE.Vector3(0, bracketModels[this.type].height * reverse, 0).applyQuaternion(reverse == 1 ? this.quaternion : quaternion));
  18626. break;
  18627. case 'wall_0':
  18628. case 'wall_1':
  18629. case 'wall_2':
  18630. case 'wall_3':
  18631. position.add(new THREE.Vector3(0, (height / 2 + this.getFrameModelData().border) * reverse, 0).applyQuaternion(this.quaternion)); // 边框上移
  18632. break;
  18633. }
  18634. this.setFrameThickness(this.overlay.depth);
  18635. return {
  18636. position,
  18637. quaternion
  18638. };
  18639. } // 创建支架
  18640. }, {
  18641. key: "createBracket",
  18642. value: function createBracket() {
  18643. var _this2 = this;
  18644. var hideMaterial = new THREE.MeshPhongMaterial({
  18645. color: 0x000000
  18646. });
  18647. hideMaterial.visible = false;
  18648. if (this.type == 'ground_1') {
  18649. this.parts.body = new THREE.Group(); // 背面
  18650. var plane = new THREE.Mesh(new THREE.PlaneGeometry(settings$3.overlay.width, settings$3.overlay.height), hideMaterial);
  18651. plane.scale.z = -1;
  18652. this.parts.body.backFace = plane;
  18653. var base = new THREE.Group();
  18654. this.parts.body.bottom = base;
  18655. this.parts.body.add(base, plane);
  18656. this.add(this.parts.body);
  18657. this.initBracketMeshData(function (object) {
  18658. base.add(object); // 背面替换为底座相同材质
  18659. var material = object.children[1].material;
  18660. plane.material = material;
  18661. _this2.dispatchEvent({
  18662. type: 'createDone'
  18663. });
  18664. });
  18665. } else {
  18666. // 可移动支架
  18667. this.parts.body = new THREE.Group();
  18668. this.parts.body.rotateX(-Math.PI / 6);
  18669. this.add(this.parts.body); // 竖杆
  18670. var cube = new THREE.Mesh(new THREE.BoxGeometry(0.02, settings$3.overlay.height, 0.02), hideMaterial);
  18671. cube.position.z -= 0.01; // 上横杆
  18672. var cube1 = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.01, 0.04), hideMaterial);
  18673. cube1.position.y += settings$3.overlay.height / 2 + 0.005; // 下横杆
  18674. var cube2 = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.01, 0.04), hideMaterial);
  18675. cube2.position.y -= settings$3.overlay.height / 2 + 0.005; // 背面
  18676. var _plane = new THREE.Mesh(new THREE.PlaneGeometry(settings$3.overlay.width, settings$3.overlay.height), hideMaterial);
  18677. _plane.scale.z = -1;
  18678. this.parts.body.middle = cube;
  18679. this.parts.body.top = cube1;
  18680. this.parts.body.bottom = cube2;
  18681. this.parts.body.backFace = _plane;
  18682. this.parts.body.add(cube, cube1, cube2, _plane); // 底座支架
  18683. this.parts.foot = new THREE.Group();
  18684. this.parts.foot.position.z -= 0.02;
  18685. this.add(this.parts.foot);
  18686. this.initBracketMeshData(function (object) {
  18687. _this2.parts.foot.add(object); // 可移动支架替换为底座相同材质
  18688. var material = object.children[0].material;
  18689. cube.material = cube1.material = cube2.material = _plane.material = material;
  18690. _this2.dispatchEvent({
  18691. type: 'createDone'
  18692. });
  18693. }); // bracketModels需要先init
  18694. this.parts.body.position.y += bracketModels[this.type].height;
  18695. }
  18696. } // 创建边框
  18697. }, {
  18698. key: "createFrame",
  18699. value: function createFrame() {
  18700. var body = new THREE.Mesh();
  18701. this.parts.body = body;
  18702. var _this$getFrameModelDa = this.getFrameModelData(),
  18703. vertices = _this$getFrameModelDa.vertices,
  18704. indexs = _this$getFrameModelDa.indexs,
  18705. uvs = _this$getFrameModelDa.uvs,
  18706. normals = _this$getFrameModelDa.normals;
  18707. body.geometry = new THREE.BufferGeometry();
  18708. body.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));
  18709. body.geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvs), 2));
  18710. body.geometry.setIndex(new THREE.BufferAttribute(new Uint16Array(indexs), 1));
  18711. if (normals) body.geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3));else body.geometry.computeVertexNormals();
  18712. if (this.type == 'wall_0') {
  18713. // let frameFace = new THREE.Mesh(frameGeo, new THREE.MeshBasicMaterial({ map: texture.load(texture.getImageURL('images/zzz.jpg')) }))
  18714. body.material = new THREE.MeshPhongMaterial({
  18715. color: '#eeeeee'
  18716. });
  18717. this.parts.line = new THREE.LineSegments(new THREE.EdgesGeometry(body.geometry), new THREE.LineBasicMaterial({
  18718. color: 0x000000
  18719. }));
  18720. this.add(this.parts.line);
  18721. } else if (this.type == 'wall_3') {
  18722. body.material = new THREE.MeshStandardMaterial({
  18723. color: '#222222'
  18724. });
  18725. } else if (this.type == 'wall_2' || this.type == 'wall_1') {
  18726. body.material = new THREE.MeshLambertMaterial({
  18727. color: '#cccccc'
  18728. }); // this.parts.line = new THREE.LineSegments(new THREE.EdgesGeometry(body.geometry), new THREE.LineBasicMaterial({ color: 0xcccccc, transparent: true, opacity: 0.4}))
  18729. // this.add(this.parts.line)
  18730. }
  18731. body.position.z -= 0.001; // 向后移1mm,防止和overlay以及边框重叠
  18732. this.add(body);
  18733. this.dispatchEvent({
  18734. type: 'createDone'
  18735. });
  18736. }
  18737. /**
  18738. * overlayFrame和overlay之间互相影响变换
  18739. * @param {*} data TransformControls变换数据
  18740. */
  18741. }, {
  18742. key: "update",
  18743. value: function update(data) {
  18744. var width = Math.abs(settings$3.overlay.width * this.overlay.scale.x);
  18745. var height = Math.abs(settings$3.overlay.height * this.overlay.scale.y); // ground: 更新overlay,随overlayFrame变换(因为ground_2模型需要如此)
  18746. // wall: 更新overlayFrame,随overlay变换(需要根据长宽高更新transfromControl)
  18747. if (!data || data.mode == 'translate') {
  18748. switch (this.type) {
  18749. case 'ground_1':
  18750. this.overlay.position.copy(this.position).add(new THREE.Vector3(0, height / 2 + bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
  18751. break;
  18752. case 'ground_2':
  18753. this.overlay.position.copy(this.position).add(new THREE.Vector3(0, bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
  18754. break;
  18755. case 'wall_0':
  18756. case 'wall_1':
  18757. case 'wall_2':
  18758. case 'wall_3':
  18759. this.position.copy(this.overlay.position).add(new THREE.Vector3(0, -height / 2 - this.getFrameModelData().border, 0).applyQuaternion(this.quaternion)); // 边框上移
  18760. break;
  18761. default:
  18762. this.overlay.position.copy(this.position);
  18763. break;
  18764. }
  18765. } // 更新overlay,随overlayFrame变换(因为ground_2模型需要如此)
  18766. if (!data || data.mode == 'rotate') {
  18767. switch (this.type) {
  18768. case 'ground_1':
  18769. this.overlay.rotation.copy(this.rotation);
  18770. this.overlay.position.set(0, bracketModels[this.type].height + height / 2, 0).applyQuaternion(this.quaternion).add(this.position);
  18771. break;
  18772. case 'ground_2':
  18773. this.overlay.quaternion.setFromAxisAngle(new THREE.Vector3(1, 0, 0).applyQuaternion(this.overlay.quaternion), -Math.PI / 6).multiply(this.quaternion);
  18774. this.parts.body.quaternion.copy(this.quaternion).invert().multiply(this.overlay.quaternion); // local quaternion
  18775. this.overlay.position.copy(this.position).add(new THREE.Vector3(0, bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
  18776. break;
  18777. case 'wall_0':
  18778. case 'wall_1':
  18779. case 'wall_2':
  18780. case 'wall_3':
  18781. this.overlay.rotation.copy(this.rotation);
  18782. this.overlay.position.set(0, this.getFrameModelData().border + height / 2, 0).applyQuaternion(this.quaternion).add(this.position); // 边框上移
  18783. break;
  18784. default:
  18785. this.overlay.rotation.copy(this.rotation);
  18786. break;
  18787. }
  18788. } // 更新overlayFrame,随overlay变换(因为ground_2模型需要如此)
  18789. if (!data || data.mode == 'scale') {
  18790. switch (this.type) {
  18791. case 'ground_1':
  18792. this.parts.body.bottom.scale.x = this.overlay.scale.x;
  18793. this.parts.body.backFace.scale.set(this.overlay.scale.x, this.overlay.scale.y, -this.overlay.scale.z);
  18794. this.parts.body.backFace.position.set(0, height / 2 + bracketModels[this.type].height, 0);
  18795. this.overlay.position.copy(this.position).add(new THREE.Vector3(0, height / 2 + bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
  18796. break;
  18797. case 'ground_2':
  18798. this.parts.body.middle.scale.y = this.overlay.scale.y;
  18799. this.parts.body.top.position.y = height / 2 + 0.005;
  18800. this.parts.body.bottom.position.y = -height / 2 - 0.005;
  18801. this.parts.body.backFace.scale.set(this.overlay.scale.x, this.overlay.scale.y, -this.overlay.scale.z);
  18802. break;
  18803. case 'wall_0':
  18804. case 'wall_1':
  18805. case 'wall_2':
  18806. case 'wall_3':
  18807. var _this$getFrameModelDa2 = this.getFrameModelData(width, height),
  18808. vertices = _this$getFrameModelDa2.vertices,
  18809. normals = _this$getFrameModelDa2.normals;
  18810. this.parts.body.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));
  18811. normals && this.parts.body.geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3));
  18812. this.position.set(0, -this.getFrameModelData().border - height / 2, 0).applyQuaternion(this.quaternion).add(this.overlay.position); // 边框上移
  18813. if (this.parts.line) {
  18814. this.parts.line.geometry.dispose();
  18815. this.parts.line.geometry = new THREE.EdgesGeometry(this.parts.body.geometry);
  18816. }
  18817. break;
  18818. }
  18819. }
  18820. } // 边框模型数据
  18821. }, {
  18822. key: "getFrameModelData",
  18823. value: function getFrameModelData(width, height) {
  18824. var depth = this.overlay && !isNaN(this.overlay.depth) ? this.overlay.depth : settings$3.overlay.depth;
  18825. !width && (width = settings$3.overlay.width);
  18826. !height && (height = settings$3.overlay.height);
  18827. var bufferAttributesJson = {
  18828. wall_0: {
  18829. border: 0.05,
  18830. vertices: [width / 2, height / 2, depth, // 0
  18831. width / 2 + 0.01, height / 2 + 0.01, depth + 0.02, // 1
  18832. width / 2 + 0.05, height / 2 + 0.05, depth + 0.02, // 2
  18833. width / 2, -height / 2, depth, // 3
  18834. width / 2 + 0.01, -height / 2 - 0.01, depth + 0.02, // 4
  18835. width / 2 + 0.05, -height / 2 - 0.05, depth + 0.02, // 5
  18836. -width / 2, -height / 2, depth, // 6
  18837. -width / 2 - 0.01, -height / 2 - 0.01, depth + 0.02, // 7
  18838. -width / 2 - 0.05, -height / 2 - 0.05, depth + 0.02, // 8
  18839. -width / 2, height / 2, depth, // 9
  18840. -width / 2 - 0.01, height / 2 + 0.01, depth + 0.02, // 10
  18841. -width / 2 - 0.05, height / 2 + 0.05, depth + 0.02, // 11
  18842. width / 2 + 0.05, height / 2 + 0.05, 0, // 12
  18843. width / 2 + 0.05, -height / 2 - 0.05, 0, // 13
  18844. -width / 2 - 0.05, -height / 2 - 0.05, 0, // 14
  18845. -width / 2 - 0.05, height / 2 + 0.05, 0 // 15
  18846. ],
  18847. indexs: [0, 3, 4, 0, 4, 1, 1, 4, 5, 1, 5, 2, 3, 6, 7, 3, 7, 4, 4, 7, 8, 4, 8, 5, 6, 9, 10, 6, 10, 7, 7, 10, 11, 7, 11, 8, 9, 0, 1, 9, 1, 10, 10, 1, 2, 10, 2, 11, 0, 6, 3, 0, 9, 6, 2, 13, 12, 2, 5, 13, 5, 14, 13, 5, 8, 4, 8, 15, 14, 8, 11, 15, 11, 12, 15, 11, 2, 12, 12, 13, 14, 12, 14, 15]
  18848. },
  18849. wall_1: {
  18850. border: 0,
  18851. vertices: [width / 2, height / 2, depth, // 0
  18852. width / 2, height / 2, 0, // 1
  18853. width / 2, -height / 2, depth, // 2
  18854. width / 2, -height / 2, 0, // 3
  18855. -width / 2, -height / 2, depth, // 4
  18856. -width / 2, -height / 2, 0, // 5
  18857. -width / 2, height / 2, depth, // 6
  18858. -width / 2, height / 2, 0 // 7
  18859. ],
  18860. normals: [1, 1, 1, 1, 1, -1, 1, -1, 1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, -1, 1, -1],
  18861. indexs: [0, 2, 3, 0, 3, 1, 2, 4, 5, 2, 5, 3, 4, 6, 7, 4, 7, 5, 6, 0, 1, 6, 1, 7, 0, 4, 2, 0, 6, 4, 1, 3, 5, 1, 5, 7]
  18862. },
  18863. wall_2: {
  18864. border: 0.06,
  18865. vertices: [width / 2 + 0.02, height / 2 + 0.02, depth, // 0
  18866. width / 2 + 0.02, height / 2 + 0.02, depth + 0.03, // 1
  18867. width / 2 + 0.06, height / 2 + 0.06, depth, // 2
  18868. width / 2 + 0.02, -height / 2 - 0.02, depth, // 3
  18869. width / 2 + 0.02, -height / 2 - 0.02, depth + 0.03, // 4
  18870. width / 2 + 0.06, -height / 2 - 0.06, depth, // 5
  18871. -width / 2 - 0.02, -height / 2 - 0.02, depth, // 6
  18872. -width / 2 - 0.02, -height / 2 - 0.02, depth + 0.03, // 7
  18873. -width / 2 - 0.06, -height / 2 - 0.06, depth, // 8
  18874. -width / 2 - 0.02, height / 2 + 0.02, depth, // 9
  18875. -width / 2 - 0.02, height / 2 + 0.02, depth + 0.03, // 10
  18876. -width / 2 - 0.06, height / 2 + 0.06, depth, // 11
  18877. width / 2 + 0.06, height / 2 + 0.06, 0, // 12
  18878. width / 2 + 0.06, -height / 2 - 0.06, 0, // 13
  18879. -width / 2 - 0.06, -height / 2 - 0.06, 0, // 14
  18880. -width / 2 - 0.06, height / 2 + 0.06, 0 // 15
  18881. ],
  18882. normals: [-1, -1, 0, 1, 1, 1, -1, -0.5, -1, -1, -1, 0, 1, 1, 1, -1, -0.5, -1, -1, -1, 0, 1, 1, 1, -1, -0.5, -1, -1, -1, 0, 1, 1, 1, -1, -0.5, -1, -1, 0.1, -1, 1, 0.1, -1, -1, 0.1, -1, 1, 0.1, -1],
  18883. indexs: [0, 3, 4, 0, 4, 1, 1, 4, 5, 1, 5, 2, 3, 6, 7, 3, 7, 4, 4, 7, 8, 4, 8, 5, 6, 9, 10, 6, 10, 7, 7, 10, 11, 7, 11, 8, 9, 0, 1, 9, 1, 10, 10, 1, 2, 10, 2, 11, 0, 6, 3, 0, 9, 6, 2, 13, 12, 2, 5, 13, 5, 14, 13, 5, 8, 14, 8, 15, 14, 8, 11, 15, 11, 12, 15, 11, 2, 12, 12, 13, 14, 12, 14, 15]
  18884. },
  18885. wall_3: {
  18886. border: 0.05,
  18887. vertices: [width / 2, height / 2, depth, // 0
  18888. width / 2 + 0.05, height / 2 + 0.05, depth, // 1
  18889. width / 2, -height / 2, depth, // 2
  18890. width / 2 + 0.05, -height / 2 - 0.05, depth, // 3
  18891. -width / 2, -height / 2, depth, // 4
  18892. -width / 2 - 0.05, -height / 2 - 0.05, depth, // 5
  18893. -width / 2, height / 2, depth, // 6
  18894. -width / 2 - 0.05, height / 2 + 0.05, depth, // 7
  18895. width / 2 + 0.05, height / 2 + 0.05, 0, // 8
  18896. width / 2 + 0.05, -height / 2 - 0.05, 0, // 9
  18897. -width / 2 - 0.05, -height / 2 - 0.05, 0, // 10
  18898. -width / 2 - 0.05, height / 2 + 0.05, 0 // 11
  18899. ],
  18900. normals: [1, 1, 1, 1, 1, 1, 1, -1, 1, 1, -1, 1, -1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, 1, -1],
  18901. indexs: [0, 2, 3, 0, 3, 1, 2, 4, 5, 2, 5, 3, 4, 6, 7, 4, 7, 5, 6, 0, 1, 6, 1, 7, 0, 4, 2, 0, 6, 4, 1, 9, 8, 1, 3, 9, 3, 10, 9, 3, 5, 10, 5, 11, 10, 5, 7, 11, 7, 8, 11, 7, 1, 8, 8, 9, 10, 8, 10, 11]
  18902. }
  18903. };
  18904. var attrs = bufferAttributesJson[this.type]; // 边框上移
  18905. for (var i = 1; i < attrs.vertices.length; i += 3) {
  18906. attrs.vertices[i] += height / 2 + attrs.border;
  18907. }
  18908. attrs.uvs = [];
  18909. for (var _i = 0; _i < attrs.vertices.length * (2 / 3) / 8; _i++) {
  18910. attrs.uvs.push(0, 1, 1, 1, 1, 0, 0, 0);
  18911. }
  18912. return attrs;
  18913. }
  18914. /**
  18915. * 加载支架模型
  18916. * @param {*} func
  18917. * @returns
  18918. */
  18919. }, {
  18920. key: "initBracketMeshData",
  18921. value: function initBracketMeshData(func) {
  18922. var _this3 = this;
  18923. // 使用已有模型数据,注意需要clone
  18924. if (bracketModels[this.type] && bracketModels[this.type].loaded) {
  18925. func && func(bracketModels[this.type].object.clone());
  18926. return;
  18927. }
  18928. if (this.type == 'ground_1') {
  18929. // 长度2.44m,高度0.58m
  18930. var scaleYZ = 0.2;
  18931. bracketModels[this.type] = {
  18932. object: null,
  18933. height: 0.58 * scaleYZ,
  18934. loaded: false
  18935. };
  18936. loaders.gltf(texture.getImageURL('images/brackets/bracket_1.glb'), function (model) {
  18937. var object = model.scene;
  18938. object.position.y *= scaleYZ;
  18939. object.rotateY(Math.PI / 2);
  18940. object.scale.set(scaleYZ, scaleYZ, 1 / 2.44);
  18941. object.children.forEach(function (mesh) {
  18942. if (mesh.name !== 'Plane') mesh.material.color.setRGB(0.3, 0.3, 0.3);
  18943. });
  18944. bracketModels[_this3.type].object = object;
  18945. bracketModels[_this3.type].loaded = true;
  18946. func && func(object);
  18947. });
  18948. return bracketModels[this.type];
  18949. }
  18950. if (this.type == 'ground_2') {
  18951. // 高度1.56m
  18952. var scaleXYZ = 0.5;
  18953. bracketModels[this.type] = {
  18954. object: null,
  18955. height: 1.59 * scaleXYZ,
  18956. loaded: false
  18957. };
  18958. loaders.gltf(texture.getImageURL('images/brackets/bracket_2.glb'), function (model) {
  18959. var object = model.scene;
  18960. object.children.forEach(function (mesh) {
  18961. if (mesh.name == 'dizuo001') mesh.material.opacity = 0.6;else mesh.material.color.setRGB(0.3, 0.3, 0.3);
  18962. });
  18963. object.scale.set(scaleXYZ, scaleXYZ, scaleXYZ);
  18964. object.position.y += 0.01;
  18965. bracketModels[_this3.type].object = object;
  18966. bracketModels[_this3.type].loaded = true;
  18967. func && func(object);
  18968. });
  18969. }
  18970. }
  18971. }, {
  18972. key: "switchTranformControls",
  18973. value: function switchTranformControls(controls) {
  18974. // switch (this.type) {
  18975. // case 'ground_1':
  18976. // // 只允许沿y轴旋转
  18977. // controls.filterRotateAxis(['y'])
  18978. // break
  18979. // default:
  18980. // controls.filterRotateAxis()
  18981. // break
  18982. // }
  18983. // switch (this.type) {
  18984. // case 'ground_2':
  18985. // // 沿着水平面平移
  18986. // controls.space = controls.mode == 'translate' ? 'world' : 'local'
  18987. // break
  18988. // default:
  18989. // controls.space = 'local'
  18990. // break
  18991. // }
  18992. // switch (this.type) {
  18993. // case 'ground_2':
  18994. // // y轴旋转整个支架,沿世界坐标系旋转;x轴z轴只旋转parts.body,沿本地坐标系旋转
  18995. // controls.spaceForRotate = { x: 'local', y: 'world', z: 'local' }
  18996. // break
  18997. // default:
  18998. // controls.spaceForRotate = null
  18999. // break
  19000. // }
  19001. // 变换TranformControls对象
  19002. if (controls.mode == 'scale' || controls.mode == 'translate' && this.type.indexOf('wall') > -1) {
  19003. // 缩放、边框位移:以overlay为对象
  19004. controls.attach(this.overlay);
  19005. } else {
  19006. // 旋转、支架位移:以overlayFrame为对象
  19007. controls.attach(this);
  19008. }
  19009. } // 移除
  19010. }, {
  19011. key: "remove",
  19012. value: function remove(isFromInfo) {
  19013. this.removeFromParent();
  19014. if (!isFromInfo) {
  19015. // 数据回退时,坐标已变为数据库数据,无需重新计算
  19016. // 重新计算overlay坐标
  19017. var _this$computeOverlayT3 = this.computeOverlayTransform({
  19018. reverse: true
  19019. }),
  19020. position = _this$computeOverlayT3.position,
  19021. quaternion = _this$computeOverlayT3.quaternion;
  19022. this.overlay.position.copy(position);
  19023. this.overlay.quaternion.copy(quaternion);
  19024. }
  19025. } // 销毁
  19026. }, {
  19027. key: "dispose",
  19028. value: function dispose(isFromInfo) {
  19029. this.remove(isFromInfo);
  19030. this.traverse(function (obj) {
  19031. if (obj.isMesh) {
  19032. obj.geometry.dispose();
  19033. obj.material.dispose();
  19034. }
  19035. });
  19036. }
  19037. }]);
  19038. return OverlayFrame;
  19039. }(THREE.Object3D);
  19040. function _createSuper$1g(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1g(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  19041. function _isNativeReflectConstruct$1g() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  19042. /*
  19043. 目前只有box视频一种。分为带厚度和不带厚度两种。不带厚度时只有一个plane,带厚度时要加上一个五个面的box,这样刚好组成完整的box(变换中心调整至box背部)。
  19044. */
  19045. var isEdit$1;
  19046. var Overlay = /*#__PURE__*/function (_THREE$Object3D) {
  19047. _inherits(Overlay, _THREE$Object3D);
  19048. var _super = _createSuper$1g(Overlay);
  19049. function Overlay(player, info, videoPlayer) {
  19050. var _this;
  19051. _classCallCheck(this, Overlay);
  19052. _this = _super.call(this);
  19053. isEdit$1 = !player.$app.config.view;
  19054. _this.player = player;
  19055. _this._planeGeometry = new THREE.PlaneGeometry(settings$3.overlay.width, settings$3.overlay.height, 1, 1);
  19056. _this._boxGeometry = new THREE.BoxBufferGeometry(settings$3.overlay.width, settings$3.overlay.height, settings$3.overlay.depth); //ie的mesh 加了polygonOffset也是会重叠。所以去掉前面的face: (但是突然ie又播放不了videoTexture)
  19057. var newIndex = _toConsumableArray(_this._boxGeometry.index.array);
  19058. newIndex.splice(4 * 6, 6);
  19059. _this._boxGeometry.setIndex(new THREE.BufferAttribute(new Uint16Array(newIndex), 1));
  19060. _this._boxMat = new THREE.MeshBasicMaterial({
  19061. //MeshStandardMaterial
  19062. color: '#eeeeee',
  19063. transparent: !0,
  19064. opacity: 0.8
  19065. });
  19066. _this.videoPlayer = videoPlayer;
  19067. _this.isHidden = false; // 用于标识是否设置可视
  19068. info.reverse == void 0 && (info.reverse = false);
  19069. info.limitToOnlyPano == void 0 && (info.limitToOnlyPano = false); //仅在当前点显示
  19070. _this.cornerPoints = [];
  19071. _this.info = info;
  19072. _this.sid = info.sid;
  19073. _this.build(info);
  19074. _this.name = 'overlay_' + _this.sid;
  19075. _this.floor = _this.player.model.floors.get(info.floorIndex) || _this.raycastToFindFloor();
  19076. _this.updateVisibleOnFloor();
  19077. _this.addEventListener('isVisible', function (e) {
  19078. if (_this.player.EditOverlay.editPlane != _assertThisInitialized(_this)) return;
  19079. _this.player.EditOverlay.controlSelectOverlay(e.visible ? _assertThisInitialized(_this) : null);
  19080. });
  19081. return _this;
  19082. }
  19083. _createClass(Overlay, [{
  19084. key: "show",
  19085. value: function show() {
  19086. var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  19087. //console.error('show', reason)
  19088. common.updateVisible(this, reason, true);
  19089. this.frame && this.frame.show();
  19090. if (reason == 'forceHide') {
  19091. this.isHidden = false;
  19092. }
  19093. }
  19094. }, {
  19095. key: "hide",
  19096. value: function hide() {
  19097. var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  19098. //console.error('hide', reason)
  19099. common.updateVisible(this, reason, false);
  19100. this.frame && this.frame.hide();
  19101. if (reason == 'forceHide') {
  19102. this.isHidden = true;
  19103. }
  19104. }
  19105. }, {
  19106. key: "raycastToFindFloor",
  19107. value: function raycastToFindFloor() {
  19108. //add
  19109. this.floor = convertTool.raycastToFindFloor(this.player, this.plane.getWorldPosition(new THREE.Vector3()));
  19110. if (!this.floor) {
  19111. console.error('Overlay raycastToFindFloor cannot find floor?');
  19112. this.floor = this.player.model.floors.first();
  19113. }
  19114. return this.floor;
  19115. }
  19116. }, {
  19117. key: "updateVisibleOnFloor",
  19118. value: function updateVisibleOnFloor(info) {
  19119. //仅飞出后需要按楼层显示
  19120. if (this.player.model.currentFloor != this.floor && !this.player.model.allFloorsVisible && this.player.modeTran.split('-')[1] != 'panorama' // && (!this.player.EditOverlay || this.player.EditOverlay.editPlane != this)) ||
  19121. //this.info.hide
  19122. ) {
  19123. this.hide('visiOnFloor');
  19124. } else {
  19125. this.show('visiOnFloor');
  19126. }
  19127. } //注:楼层切换时的控制写在floor.show里
  19128. }, {
  19129. key: "build",
  19130. value: function build(info) {
  19131. var _this2 = this;
  19132. this.modified = info.modified;
  19133. var plane = new THREE.Mesh(this._planeGeometry, new THREE.MeshBasicMaterial({
  19134. //MeshStandardMaterial
  19135. color: '#00c8af',
  19136. opacity: 0.4,
  19137. transparent: !0,
  19138. polygonOffset: true,
  19139. //是否开启多边形偏移 //ie不开启时blank也不会闪烁
  19140. polygonOffsetFactor: -0.9,
  19141. //多边形偏移因子
  19142. polygonOffsetUnits: -4.0 //多边形偏移单位
  19143. }));
  19144. plane.renderOrder = RenderOrder.overlay;
  19145. this.add(plane);
  19146. this.plane = plane;
  19147. this.player.OverlayManager.add(this);
  19148. if (info.media) {
  19149. // console.error(info)
  19150. if (info.media.includes('video')) {
  19151. info.type = 'video';
  19152. if (isEdit$1) {
  19153. this.loadVideo();
  19154. } else {
  19155. //展示页面延迟加载,且监控,可见才播放(如果支持多个视频,这段要去掉,改为overlayManager里addSliceListen的那段)
  19156. this.player.on('view.changed', function () {
  19157. var time = _this2.info.media instanceof HTMLVideoElement ? 1000 : 200; //加载需要时间,所以未加载时缩短判断间隔
  19158. common.intervalTool.isWaiting('overlayInsight_' + _this2.player.model.sid, function () {
  19159. //延时update,防止崩溃 , 未到时间就拦截(第一次直接执行)
  19160. if (!_this2.player.flying) {
  19161. //飞行时不判断
  19162. if (_this2.visible && _this2.inSight()) {
  19163. _this2.videoControl(true);
  19164. } else {
  19165. _this2.videoControl(false);
  19166. }
  19167. }
  19168. }, time);
  19169. });
  19170. }
  19171. } else if (info.media.includes('photo')) {
  19172. var img = new Image();
  19173. img.crossOrigin = 'anonymous';
  19174. if (this.info.isBillboard) {
  19175. img.src = this.getMapSrc();
  19176. } else {
  19177. img.src = this.player.$app.resource.getUserResourceURL(info.poster);
  19178. }
  19179. img.onload = function () {
  19180. _this2.dispatchEvent({
  19181. type: 'mapLoaded'
  19182. });
  19183. };
  19184. info.media = img;
  19185. info.type = 'photo';
  19186. }
  19187. plane.material.color = new THREE.Color(1, 1, 1);
  19188. }
  19189. if (info.width == void 0) info.width = settings$3.overlay.width;
  19190. if (info.height == void 0) info.height = settings$3.overlay.height;
  19191. this.setFromInfo(info);
  19192. }
  19193. }, {
  19194. key: "loadVideo",
  19195. value: function loadVideo() {
  19196. if (this.info.media instanceof HTMLVideoElement) return this.info.media; //已加载
  19197. this.info.media = this.videoPlayer.getVideo(this.info.sid); //注:部分视频手机播放不了
  19198. this.info.media.addEventListener('ended', function () {
  19199. info.media.play();
  19200. if (info.media.paused) ;
  19201. });
  19202. this.setFromInfo(this.info);
  19203. this.plane.material.needsUpdate = true; //console.log('loadVideo成功')
  19204. return this.info.media;
  19205. }
  19206. }, {
  19207. key: "setFromInfo",
  19208. value: function setFromInfo(info) {
  19209. var _this3 = this;
  19210. //1 恢复到编辑之前 2 初始加载
  19211. var plane = this.plane;
  19212. info.width && (this.scale.setX(info.width / settings$3.overlay.width), this.width = info.width);
  19213. info.height && (this.scale.setY(info.height / settings$3.overlay.height), this.height = info.height);
  19214. !isNaN(info.depth) && (this.depth = info.depth);
  19215. info.pos instanceof Array && (info.pos = new THREE.Vector3().fromArray(info.pos));
  19216. info.qua instanceof Array && (info.qua = new THREE.Quaternion().fromArray(info.qua));
  19217. info.pos && this.position.copy(info.pos);
  19218. info.qua && this.quaternion.copy(info.qua);
  19219. info.reverse && (this.scale.x *= -1);
  19220. this.isHidden = info.hide;
  19221. common.updateVisible(this, 'forceHide', !this.isHidden);
  19222. if (info.type) {
  19223. if (!plane.material.map) {
  19224. if (info.type == 'video') {
  19225. if (!(this.info.media instanceof HTMLVideoElement)) return;
  19226. var map = new THREE.VideoTexture(info.media);
  19227. plane.material.map = map;
  19228. if (!isEdit$1) {
  19229. var needsUpdate_ = map.needsUpdate;
  19230. Object.defineProperty(map, 'needsUpdate', {
  19231. get: function get() {
  19232. return needsUpdate_;
  19233. },
  19234. set: function set(value) {
  19235. needsUpdate_ = !_this3.info.media.paused && value; //增加判断:是否在播放,不在播放就不更新贴图
  19236. if (needsUpdate_) {
  19237. //old set needsUpdate
  19238. map.version++;
  19239. map.source.needsUpdate = true;
  19240. }
  19241. }
  19242. });
  19243. }
  19244. } else {
  19245. plane.material.map = new THREE.Texture(info.media);
  19246. plane.material.map.needsUpdate = true;
  19247. }
  19248. plane.material.map.wrapS = plane.material.map.wrapT = THREE.ClampToEdgeWrapping;
  19249. plane.material.map.minFilter = THREE.LinearFilter; //LinearMipMapLinearFilter 会被缩放到power of 2
  19250. plane.material.map.magFilter = THREE.LinearFilter;
  19251. plane.material.map.anisotropy = 4;
  19252. plane.material.map.generateMipmaps = false;
  19253. plane.material.opacity = 1;
  19254. } else {
  19255. plane.material.map.image = info.media;
  19256. plane.material.map.needsUpdate = true;
  19257. }
  19258. this.file = info.file;
  19259. }
  19260. this.overlayType = info.type;
  19261. if (!info.frameType && !this.info.isBillboard) info.frameType = 'wall_1'; // 兼容旧数据
  19262. this.info.isBillboard || this.addFrame(info.frameType, this.modified !== 'new'); // 需要区分新增数据还是数据库数据
  19263. this.limitToOnlyPano = info.limitToOnlyPano ? this.player.model.panos.index[info.limitToOnlyPano] : false;
  19264. this.limitToOnlyPano && this.limitToOnlyPano != this.player.currentPano && this.hide('limitToOnlyPano');
  19265. this.visiblePanos = convertTool.getVisiblePano(this.position, this.player.model);
  19266. }
  19267. }, {
  19268. key: "addFrame",
  19269. value: function addFrame(frameType, isFromInfo) {
  19270. // 没有边框直接添加,有不同的边框先删旧的再添加
  19271. if (!this.frame || this.frame.type !== frameType || isFromInfo) {
  19272. if (this.frame) {
  19273. this.frame.dispose(isFromInfo);
  19274. this.frame = null;
  19275. }
  19276. if (frameType) {
  19277. // 其他边框替换为wall_1时要重新赋值厚度,初始化或回退的时候不用管
  19278. if (!isFromInfo && frameType == 'wall_1') {
  19279. // depth是实际厚度,depthTemp用于暂存wall_1的厚度
  19280. this.depth = this.depthTemp;
  19281. }
  19282. var frame = new OverlayFrame(frameType);
  19283. frame.setOverlay(this, isFromInfo);
  19284. this.player.OverlayManager.frameGroup.add(frame);
  19285. }
  19286. } else {
  19287. // 相同边框 根据overlay重新计算frame
  19288. var _this$frame$computeOv = this.frame.computeOverlayTransform({
  19289. reverse: true
  19290. }),
  19291. position = _this$frame$computeOv.position,
  19292. quaternion = _this$frame$computeOv.quaternion;
  19293. this.frame.position.copy(position);
  19294. this.frame.quaternion.copy(quaternion);
  19295. }
  19296. }
  19297. }, {
  19298. key: "dispose",
  19299. value: function dispose() {
  19300. this.plane.material.dispose();
  19301. this.plane.material.map = null;
  19302. this.parent.remove(this);
  19303. }
  19304. }, {
  19305. key: "inSight",
  19306. value: function inSight() {
  19307. if (isEdit$1) return true; // 太容易move了
  19308. if (this.player.mode == 'panorama' && this.player.currentPano) {
  19309. if (this.visiblePanos && !this.visiblePanos.includes(this.player.currentPano)) return false; //最好保存下visiblePanos
  19310. if (!this.player.camera) return;
  19311. var cornerPointInfo = this.getCornerPoint();
  19312. var cornerPoint;
  19313. var min = new THREE.Vector2(2, 2);
  19314. var scaleRatio = 1 / this.player.zoomLevel; //根据media原始大小来调整阈值: media的原始大小能代表期望显示的大小,如果显示大小的远小于期望大小,就不显示(此时能感受到贴图锯齿严重,清晰度被浪费)。比如如果gif是一个很小的按钮,即使diffLon很小也要显示。缺点:需要用户根据所需上传合适清晰度的图。
  19315. var size = this.getMediaSize();
  19316. if (size.x > 0) {
  19317. scaleRatio *= Math.sqrt(size.x * size.y) / 1000;
  19318. }
  19319. min.multiplyScalar(scaleRatio);
  19320. if (cornerPointInfo.diffLon < min.x || cornerPointInfo.diffLat < min.y) {
  19321. //console.log('two far and small')
  19322. return false;
  19323. }
  19324. if (cornerPointInfo.diffLon < 15 && cornerPointInfo.diffLat < 15) {
  19325. //当很小的时候,只判断中心点即可
  19326. cornerPoint = [cornerPointInfo.cornerPoint[0]];
  19327. } else {
  19328. cornerPoint = cornerPointInfo.cornerPoint;
  19329. }
  19330. for (var i = 0, j = cornerPoint.length; i < j; i++) {
  19331. //只要有一点可见就算看见
  19332. var pos2d = convertTool.getPos2d(cornerPoint[i], this.player);
  19333. if (pos2d.trueSide && pos2d.inSight) return true;
  19334. }
  19335. } else {
  19336. //飞出 只判断在不在画面内
  19337. var frustumMatrix = new THREE.Matrix4();
  19338. frustumMatrix.multiplyMatrices(this.player.camera.projectionMatrix, this.player.camera.matrixWorldInverse);
  19339. var frustum = new THREE.Frustum();
  19340. frustum.setFromProjectionMatrix(frustumMatrix);
  19341. if (!this.plane.geometry.boundingBox) {
  19342. this.plane.geometry.computeBoundingBox();
  19343. }
  19344. var bounding = this.plane.geometry.boundingBox.clone().applyMatrix4(this.matrixWorld);
  19345. return frustum.intersectsBox(bounding);
  19346. }
  19347. }
  19348. }, {
  19349. key: "getMediaSize",
  19350. value: function getMediaSize() {
  19351. var size = new THREE.Vector2();
  19352. if (this.info.media instanceof Image) {
  19353. size.x = this.info.media.width;
  19354. size.y = this.info.media.height;
  19355. } else if (this.info.media instanceof HTMLVideoElement) {
  19356. size.x = this.info.media.videoWidth || 1000;
  19357. size.y = this.info.media.videoHeight || 1000;
  19358. } else {
  19359. size.x = 1000;
  19360. size.y = 1000;
  19361. }
  19362. return size;
  19363. }
  19364. }, {
  19365. key: "getCornerPoint",
  19366. value: function getCornerPoint() {
  19367. var _this4 = this;
  19368. //获取在每个漫游点上的视觉边界点 可以打开boxHelper和addBall来观测是否准确
  19369. if (this.cornerPoints[this.player.currentPano.id]) {
  19370. return this.cornerPoints[this.player.currentPano.id];
  19371. } else {
  19372. var boundPoint, cornerPoint;
  19373. var center; //中心点
  19374. if (this.plane) {
  19375. center = this.plane.getWorldPosition(new THREE.Vector3());
  19376. boundPoint = [new THREE.Vector3(-0.5, 0.5, 0), new THREE.Vector3(0.5, 0.5, 0), new THREE.Vector3(0.5, -0.5, 0), new THREE.Vector3(-0.5, -0.5, 0)];
  19377. }
  19378. var maxLon = -Infinity;
  19379. var minLon = +Infinity;
  19380. var maxLat = -Infinity;
  19381. var minLat = +Infinity;
  19382. var pos1 = this.player.currentPano.position.clone();
  19383. center = this.position.clone(); //模型bound的中心点已经位移到了hot中心点。 注意不能用getWorldPosition,得到的会是偏移的
  19384. var dir = center.clone().sub(pos1).normalize();
  19385. var centerDirInfo = {};
  19386. this.player.cameraControls.controls.panorama.lookAt.call(centerDirInfo, null, dir);
  19387. boundPoint.forEach(function (e) {
  19388. //lon左右
  19389. var point = e.applyMatrix4(_this4.plane.matrixWorld);
  19390. var dir = point.clone().sub(pos1).normalize();
  19391. var dirInfo = {};
  19392. _this4.player.cameraControls.controls.panorama.lookAt.call(dirInfo, null, dir);
  19393. var diffLon = (dirInfo.lon - centerDirInfo.lon) % 360;
  19394. if (Math.abs(diffLon) > 180) {
  19395. //因为有时需要根据符号判断是在中心的左边还是右边,所以限制在180内
  19396. diffLon += diffLon > 0 ? -360 : 360;
  19397. }
  19398. var diffLat = dirInfo.lat - centerDirInfo.lat;
  19399. maxLon = Math.max(diffLon, maxLon);
  19400. minLon = Math.min(diffLon, minLon);
  19401. maxLat = Math.max(diffLat, maxLat);
  19402. minLat = Math.min(diffLat, minLat);
  19403. });
  19404. var diffLon = maxLon - minLon;
  19405. var diffLat = maxLat - minLat;
  19406. if (diffLat > 180) {
  19407. //可能是到了反面。不好算,直接返回所有boundPoint
  19408. cornerPoint = boundPoint;
  19409. } else {
  19410. //读取lon lat的最大最小值,勾勒出一个没有倾斜的矩形 。它比boundPoint看起来范围更大些
  19411. maxLon = maxLon + centerDirInfo.lon;
  19412. maxLat = maxLat + centerDirInfo.lat;
  19413. minLon = minLon + centerDirInfo.lon;
  19414. minLat = minLat + centerDirInfo.lat;
  19415. var dirs = [math$1.getDirByLonLat(maxLon, maxLat), math$1.getDirByLonLat(minLon, minLat), math$1.getDirByLonLat(maxLon, minLat), math$1.getDirByLonLat(minLon, maxLat)];
  19416. cornerPoint = dirs.map(function (a) {
  19417. return a.negate().add(pos1);
  19418. });
  19419. cornerPoint = [center].concat(_toConsumableArray(cornerPoint)); //最后增加一个中心点
  19420. }
  19421. /* if(this.objObject){
  19422. cornerPoint = [pos2, ...cornerPoint]
  19423. } */
  19424. //addPoints(cornerPoint)
  19425. this.cornerPoints[this.player.currentPano.id] = {
  19426. cornerPoint,
  19427. diffLon,
  19428. diffLat
  19429. };
  19430. return this.cornerPoints[this.player.currentPano.id];
  19431. }
  19432. }
  19433. }, {
  19434. key: "videoControl",
  19435. value: function videoControl(state) {
  19436. var video = this.info.media;
  19437. this.shouldPlay = state;
  19438. if (!state || state == 'stop') {
  19439. if (video instanceof HTMLVideoElement && !video.paused) {
  19440. video.pause(); //console.log('paused ')
  19441. }
  19442. /* if(state == 'stop'){
  19443. video.currentTime = 0;
  19444. } */
  19445. } else if (state) {
  19446. if (video.paused || !(video instanceof HTMLVideoElement)) {
  19447. //console.log('videoControl play ')
  19448. video = this.loadVideo();
  19449. video.play(); //if (common.isVideoPlayed(video)) console.log('played ')
  19450. }
  19451. }
  19452. }
  19453. }]);
  19454. return Overlay;
  19455. }(THREE.Object3D);
  19456. var CursorDeal = {
  19457. priorityEvent: [//在前面的优先级高
  19458. //grab move crosshair not-allowed
  19459. {
  19460. polygonMark_move: 'move'
  19461. }, {
  19462. polygonMark_hover: 'pointer'
  19463. }, {
  19464. polygonMark_subPen: 'url(' + texture.getImageURL('images/polygon_mark/pic_pen_sub.png') + '),auto'
  19465. }, {
  19466. polygonMark_addPen: 'url(' + texture.getImageURL('images/polygon_mark/pic_pen_add.png') + '),auto'
  19467. }, {
  19468. polygonMark_pen: 'url(' + texture.getImageURL('images/polygon_mark/pic_pen.png') + '),auto'
  19469. }, {
  19470. dragOverlay: 'move'
  19471. }, {
  19472. hoverOverlay: 'pointer'
  19473. }, {
  19474. hoverMonitor: 'pointer'
  19475. }, {
  19476. addOverlay: 'url(https://4dkk.4dage.com/v3-test/img/box_video.png),auto'
  19477. }, {
  19478. addOverlay: 'url(https://4dkk.4dage.com/v3-test/img/box_video.png),auto'
  19479. }, {
  19480. hoverFootMarker: 'pointer'
  19481. }, {
  19482. hoverView: 'pointer'
  19483. }, {
  19484. dragView: 'move'
  19485. }, {
  19486. viewChoosePos: 'pointer'
  19487. }],
  19488. list: [],
  19489. //当前存在的cursor状态
  19490. currentCursorIndex: null,
  19491. init: function init(player) {
  19492. /* app.Scene.on('loaded', () => {
  19493. player = this.app.core.get('Player')
  19494. this.domElements = [player.domeElement];
  19495. }) */
  19496. this.domElements = [player.domElement];
  19497. },
  19498. add: function add(name) {
  19499. var priorityItem = this.priorityEvent.find(function (e) {
  19500. return e[name];
  19501. });
  19502. if (!priorityItem) {
  19503. console.error('CursorDeal 未定义优先级 name:' + name);
  19504. return;
  19505. }
  19506. if (!this.list.includes(name)) {
  19507. this.judge({
  19508. addItem: priorityItem,
  19509. name
  19510. });
  19511. this.list.push(name);
  19512. }
  19513. },
  19514. remove: function remove(name) {
  19515. var index = this.list.indexOf(name);
  19516. if (index > -1) {
  19517. this.list.splice(index, 1);
  19518. this.judge();
  19519. }
  19520. },
  19521. judge: function judge() {
  19522. var _this = this;
  19523. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  19524. //console.log(o,this.list)
  19525. if (o.addItem) {
  19526. var addIndex = this.priorityEvent.indexOf(o.addItem);
  19527. if (addIndex < this.currentCursorIndex || this.currentCursorIndex == void 0) {
  19528. this.domElements.forEach(function (e) {
  19529. return e.style.cursor = o.addItem[o.name];
  19530. });
  19531. this.currentCursorIndex = addIndex;
  19532. }
  19533. } else {
  19534. var levelMax = {
  19535. index: Infinity,
  19536. cursor: null
  19537. };
  19538. this.list.forEach(function (name) {
  19539. var priorityItem = _this.priorityEvent.find(function (e) {
  19540. return e[name];
  19541. });
  19542. var index = _this.priorityEvent.indexOf(priorityItem);
  19543. if (index < levelMax.index) {
  19544. levelMax.index = index;
  19545. levelMax.cursor = priorityItem[name];
  19546. }
  19547. });
  19548. this.currentCursorIndex = levelMax.index;
  19549. this.domElements.forEach(function (e) {
  19550. return e.style.cursor = levelMax.cursor || '';
  19551. });
  19552. }
  19553. }
  19554. };
  19555. function _createSuper$1f(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1f(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  19556. function _isNativeReflectConstruct$1f() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  19557. function exitFullScreen() {
  19558. if (document.fullscreenElement && document.fullscreenElement.tagName === 'VIDEO' && document.fullscreenElement.getAttribute('unfullscreen')) {
  19559. if (document.exitFullscreen) {
  19560. document.exitFullscreen();
  19561. } else if (document.msExitFullscreen) {
  19562. document.msExitFullscreen();
  19563. } else if (document.mozCancelFullScreen) {
  19564. document.mozCancelFullScreen();
  19565. } else if (document.oRequestFullscreen) {
  19566. document.oCancelFullScreen();
  19567. } else if (document.webkitExitFullscreen) {
  19568. document.webkitExitFullscreen();
  19569. } else if (document.webkitCancelFullScreen) {
  19570. document.webkitCancelFullScreen();
  19571. }
  19572. setTimeout(function () {
  19573. exitFullScreen();
  19574. }, 250);
  19575. }
  19576. }
  19577. if (browser$1.detectAndroidMobile()) {
  19578. //针对Android横屏时video会自动全屏播放的bug #39505 #43421
  19579. window.addEventListener('resize', function () {
  19580. //resize时如果全屏元素为video, 退出全屏
  19581. setTimeout(function () {
  19582. exitFullScreen();
  19583. }, 500); //太快可能检测不到document.fullscreenElement
  19584. });
  19585. window.addEventListener('orientationchange', function (e) {
  19586. // 空间视频横屏时会触发自动全屏
  19587. if (window.orientation == 0 || window.orientation == 180) {
  19588. //竖屏
  19589. var videos = document.querySelectorAll('video[box]'); //只针对有box属性的video标签(空间视频)
  19590. videos.forEach(function (item) {
  19591. item.remove();
  19592. });
  19593. setTimeout(function () {
  19594. videos.forEach(function (i) {
  19595. document.body.appendChild(i);
  19596. i.play();
  19597. });
  19598. }, 500);
  19599. } else {
  19600. // 横屏
  19601. var _videos = document.querySelectorAll('video[box]');
  19602. _videos.forEach(function (item) {
  19603. item.remove();
  19604. });
  19605. setTimeout(function () {
  19606. _videos.forEach(function (i) {
  19607. document.body.appendChild(i);
  19608. i.play();
  19609. });
  19610. }, 500);
  19611. }
  19612. });
  19613. }
  19614. var FlvVideoPlayerBase = /*#__PURE__*/function (_EventEmitter) {
  19615. _inherits(FlvVideoPlayerBase, _EventEmitter);
  19616. var _super = _createSuper$1f(FlvVideoPlayerBase);
  19617. function FlvVideoPlayerBase(player) {
  19618. var _this;
  19619. _classCallCheck(this, FlvVideoPlayerBase);
  19620. _this = _super.call(this);
  19621. _this.player = player;
  19622. _this.instances = new Map();
  19623. _this.video = null;
  19624. return _this;
  19625. } //overlay info -- [metadata.overlay]
  19626. _createClass(FlvVideoPlayerBase, [{
  19627. key: "addVideo",
  19628. value: function addVideo(sid) {
  19629. var instance = this._createVideo(this._getVideoPath(sid));
  19630. this.instances.set(sid, instance);
  19631. instance.videoElement.masters = []; //一个video可以对应多个主体,因为它们链接一样
  19632. return instance;
  19633. }
  19634. }, {
  19635. key: "getVideo",
  19636. value: function getVideo(sid, master) {
  19637. var instance = this.instances.get(sid);
  19638. if (!instance) {
  19639. instance = this.addVideo(sid);
  19640. }
  19641. master && instance.videoElement.masters.push(master);
  19642. return instance.videoElement;
  19643. }
  19644. }, {
  19645. key: "_getVideoPath",
  19646. value: function _getVideoPath(sid) {//在子类中扩展
  19647. }
  19648. }, {
  19649. key: "_createVideo",
  19650. value: function _createVideo(url) {
  19651. var _this2 = this;
  19652. var video = document.createElement('video');
  19653. video.setAttribute('crossOrigin', 'anonymous');
  19654. video.setAttribute('playsinline', 'true');
  19655. video.setAttribute('webkit-playsinline', 'true');
  19656. video.setAttribute('controls', 'true');
  19657. video.setAttribute('unfullscreen', 'true');
  19658. video.autoplay = false;
  19659. video.muted = true;
  19660. video.loop = true;
  19661. video.style.position = 'fixed';
  19662. video.style.left = '0';
  19663. video.style.top = '0';
  19664. video.style.zIndex = '0';
  19665. video.style.width = '1px'; // video.style.display = 'none'
  19666. //video.isFirstPlay = true;
  19667. video.style.opacity = '0';
  19668. document.body.appendChild(video);
  19669. video.player = this;
  19670. var player = flvjs.createPlayer({
  19671. type: 'flv',
  19672. url: url
  19673. });
  19674. player.videoElement = video;
  19675. player.attachMediaElement(video);
  19676. player.on(flvjs.Events.ERROR, function () {
  19677. _this2._onPlayerError();
  19678. console.log('尝试使用mp4链接进行播放');
  19679. video.src = url.replace('.flv', '.mp4');
  19680. });
  19681. player.load();
  19682. return player;
  19683. }
  19684. }, {
  19685. key: "_onPlayerError",
  19686. value: function _onPlayerError() {
  19687. console.warn('视频加载失败');
  19688. }
  19689. }]);
  19690. return FlvVideoPlayerBase;
  19691. }(EventEmitter);
  19692. function _createSuper$1e(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1e(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  19693. function _isNativeReflectConstruct$1e() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  19694. var FlvVideoPlayer$2 = /*#__PURE__*/function (_FlvVideoPlayerBase) {
  19695. _inherits(FlvVideoPlayer, _FlvVideoPlayerBase);
  19696. var _super = _createSuper$1e(FlvVideoPlayer);
  19697. function FlvVideoPlayer(player) {
  19698. _classCallCheck(this, FlvVideoPlayer);
  19699. return _super.call(this, player);
  19700. }
  19701. _createClass(FlvVideoPlayer, [{
  19702. key: "_createVideo",
  19703. value: function _createVideo(url) {
  19704. var video = document.createElement('video');
  19705. video.setAttribute('crossOrigin', 'anonymous');
  19706. video.setAttribute('playsinline', 'true');
  19707. video.setAttribute('webkit-playsinline', 'true');
  19708. video.setAttribute('controls', 'true');
  19709. video.setAttribute('box', 'true');
  19710. video.setAttribute('unfullscreen', 'true');
  19711. video.autoplay = false;
  19712. video.muted = true;
  19713. video.loop = true;
  19714. video.style.position = 'fixed';
  19715. video.style.left = '0';
  19716. video.style.top = '0';
  19717. video.style.zIndex = '0';
  19718. video.style.width = '1px'; // video.style.display = 'none'
  19719. //video.isFirstPlay = true;
  19720. video.style.opacity = '0';
  19721. document.body.appendChild(video);
  19722. video.player = this;
  19723. var player = flvjs.createPlayer({
  19724. type: 'flv',
  19725. url: url
  19726. });
  19727. player.videoElement = video;
  19728. player.attachMediaElement(video);
  19729. player.on(flvjs.Events.ERROR, this._onPlayerError.bind(this));
  19730. player.load();
  19731. return player;
  19732. }
  19733. }, {
  19734. key: "_getVideoPath",
  19735. value: function _getVideoPath(sid) {
  19736. // return config.getResourceImageURL(`overlay` + sid + '.flv?m=' + config.version)
  19737. return this.player.$app.resource.getUserResourceURL(sid + '.flv');
  19738. }
  19739. }]);
  19740. return FlvVideoPlayer;
  19741. }(FlvVideoPlayerBase);
  19742. function _createSuper$1d(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1d(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  19743. function _isNativeReflectConstruct$1d() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  19744. var H5VideoPlayerBase = /*#__PURE__*/function (_EventEmitter) {
  19745. _inherits(H5VideoPlayerBase, _EventEmitter);
  19746. var _super = _createSuper$1d(H5VideoPlayerBase);
  19747. function H5VideoPlayerBase(player) {
  19748. var _this;
  19749. _classCallCheck(this, H5VideoPlayerBase);
  19750. _this = _super.call(this);
  19751. _this.player = player;
  19752. _this.video = null;
  19753. _this.videos = new Map();
  19754. return _this;
  19755. } //overlay info -- [metadata.overlay]
  19756. _createClass(H5VideoPlayerBase, [{
  19757. key: "addVideo",
  19758. value: function addVideo(sid) {
  19759. var video = this._createVideoElement(this._getVideoPath(sid));
  19760. this.videos.set(sid, video);
  19761. video.masters = [];
  19762. return video;
  19763. }
  19764. }, {
  19765. key: "getVideo",
  19766. value: function getVideo(sid, master) {
  19767. var video = this.videos.get(sid);
  19768. if (!video) {
  19769. video = this.addVideo(sid);
  19770. }
  19771. master && video.masters.push(master);
  19772. return video;
  19773. }
  19774. }, {
  19775. key: "_getVideoPath",
  19776. value: function _getVideoPath(sid) {
  19777. // return config.getResourceImageURL(window.kankan.config.num + `/overlay` + sid + '.mp4?m=' + config.version)
  19778. return this.player.$app.resource.getUserResourceURL(sid + '.mp4');
  19779. }
  19780. }, {
  19781. key: "_createVideoElement",
  19782. value: function _createVideoElement(src) {
  19783. var video = document.createElement('video');
  19784. video.setAttribute('crossOrigin', 'anonymous');
  19785. video.setAttribute('playsinline', 'true');
  19786. video.setAttribute('x5-playsinline', 'true');
  19787. video.setAttribute('webkit-playsinline', 'true');
  19788. video.setAttribute('x5-video-player-type', 'h5');
  19789. video.setAttribute('controls', 'true');
  19790. video.setAttribute('x-webkit-airplay', 'allow');
  19791. video.autoplay = true;
  19792. video.muted = true;
  19793. video.loop = true;
  19794. video.src = src;
  19795. video.style.position = 'fixed';
  19796. video.style.left = '0';
  19797. video.style.top = '0';
  19798. video.style.zIndex = '1000';
  19799. video.style.width = '300px';
  19800. video.style.height = '300px'; //video.style.display = browser.urlHasValue('debug') ? 'block' : 'none'
  19801. //document.body.appendChild(video)
  19802. return video;
  19803. }
  19804. }]);
  19805. return H5VideoPlayerBase;
  19806. }(EventEmitter);
  19807. function _createSuper$1c(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1c(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  19808. function _isNativeReflectConstruct$1c() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  19809. var H5VideoPlayer$2 = /*#__PURE__*/function (_H5VideoPlayerBase) {
  19810. _inherits(H5VideoPlayer, _H5VideoPlayerBase);
  19811. var _super = _createSuper$1c(H5VideoPlayer);
  19812. function H5VideoPlayer(player) {
  19813. _classCallCheck(this, H5VideoPlayer);
  19814. return _super.call(this, player);
  19815. }
  19816. _createClass(H5VideoPlayer, [{
  19817. key: "_getVideoPath",
  19818. value: function _getVideoPath(sid) {
  19819. // return config.getResourceImageURL(window.kankan.config.num + `/overlay` + sid + '.mp4?m=' + config.version)
  19820. return this.player.$app.resource.getUserResourceURL(sid + '.mp4');
  19821. }
  19822. }]);
  19823. return H5VideoPlayer;
  19824. }(H5VideoPlayerBase);
  19825. var app$1;
  19826. var store;
  19827. function intStore() {
  19828. store = {
  19829. version: 1,
  19830. upPath: '',
  19831. // videoPath: 'https://4dkk.4dage.com/video/videot-FSVqkqQ0Bi/', //config.getPublicResource("video/video#m#/"), ${this.$app.config.num}
  19832. // videoPath: config.getResourceURL('video/video' + window.kankan.config.num + '/'),
  19833. videoPath: app$1.resource.getViewResourceURL('video/'),
  19834. // scene_view_data/t-RGjyzx4/videos/ config.getResourceURL('video/video/'),
  19835. videoInfos: new Map(),
  19836. parameters: {
  19837. inputWidth: 0,
  19838. inputHeight: 0,
  19839. outputWidth: 0,
  19840. outputHeight: 0,
  19841. focal: 0,
  19842. pixel: 0,
  19843. centerX: 0,
  19844. centerY: 0,
  19845. translateX: 0,
  19846. translateY: 0,
  19847. translateZ: 0,
  19848. lenOffsetX: 0,
  19849. lenOffsetY: 0,
  19850. videoWidth: 0,
  19851. videoHeight: 0,
  19852. mapping: 0,
  19853. //0-只对x轴做了clip 1-对中央固定区域做clip 2-动态clip
  19854. cameraType: 0,
  19855. blend_fov: 5
  19856. }
  19857. };
  19858. }
  19859. function handle(sceneMeta, sdk) {
  19860. app$1 = sdk;
  19861. if (!store) intStore();
  19862. var imagesVersion = '';
  19863. if (typeof sceneMeta.version != 'undefined') {
  19864. imagesVersion = '?imagesVersion=' + sceneMeta.version;
  19865. }
  19866. if (!sceneMeta.videos) {
  19867. sceneMeta.videos = {
  19868. version: store.version,
  19869. videos: store.videoInfos,
  19870. parameters: store.parameters
  19871. };
  19872. mergeNewPanoVideo(store, sceneMeta['videosUser'], imagesVersion);
  19873. return;
  19874. } else {
  19875. try {
  19876. var checkvideos = sceneMeta.videos;
  19877. if (!checkvideos.data || !checkvideos.data.length) {
  19878. sceneMeta.videos = {
  19879. version: store.version,
  19880. videos: store.videoInfos,
  19881. parameters: store.parameters
  19882. };
  19883. mergeNewPanoVideo(store, sceneMeta['videosUser'], imagesVersion);
  19884. return;
  19885. }
  19886. } catch (err) {
  19887. console.error(err);
  19888. }
  19889. }
  19890. var sceneFrom = sceneMeta.sceneFrom || 'pro';
  19891. if (sceneFrom == 'pro') {
  19892. //8目
  19893. var videosInfo = sceneMeta.videos;
  19894. var version = videosInfo.version || 0;
  19895. store.version = version;
  19896. store.parameters.cameraType = 8;
  19897. if (version == 1) {
  19898. videosInfo.data.forEach(function (item) {
  19899. store.videoInfos.set(item.id, {
  19900. mp4: {
  19901. url: store.videoPath + item.id + '.mp4' + imagesVersion
  19902. },
  19903. mpeg: {
  19904. url: store.videoPath + item.id + '.ts',
  19905. size: item.tsSize + imagesVersion
  19906. },
  19907. flv: {
  19908. url: store.videoPath + item.id + '.flv' + imagesVersion
  19909. },
  19910. //Test,
  19911. exposure: Number(item.value) || 1,
  19912. mapping: 0,
  19913. cameraType: 8,
  19914. blend_fov: item.blend_fov || 5
  19915. });
  19916. });
  19917. } else if (version > 1) {
  19918. videosInfo.data.forEach(function (item) {
  19919. store.videoInfos.set(item.id, {
  19920. mp4: {
  19921. url: store.videoPath + item.id + '.mp4' + imagesVersion
  19922. },
  19923. mpeg: {
  19924. url: store.videoPath + item.id + '.ts' + imagesVersion,
  19925. size: item.tsSize
  19926. },
  19927. flv: {
  19928. url: store.videoPath + item.id + '.flv' + imagesVersion
  19929. },
  19930. exposure: Number(item.value) || 1,
  19931. mapping: 1,
  19932. cameraType: 8,
  19933. blend_fov: item.blend_fov || 5
  19934. });
  19935. });
  19936. }
  19937. return loadParameterFor8Cameras(videosInfo.upPath).then(function (store) {
  19938. if (version <= 2) {
  19939. store.parameters.inputWidth = 2304;
  19940. store.parameters.inputHeight = 1728;
  19941. store.parameters.outputWidth = 2048;
  19942. store.parameters.outputHeight = 1024;
  19943. } else if (version > 2) {
  19944. store.parameters.inputWidth = 4608;
  19945. store.parameters.inputHeight = 3456;
  19946. store.parameters.outputWidth = 8192;
  19947. store.parameters.outputHeight = 4096;
  19948. store.parameters.lenOffsetX = 1235;
  19949. store.parameters.lenOffsetY = 954;
  19950. store.parameters.videoWidth = 2112;
  19951. store.parameters.videoHeight = 1584;
  19952. store.parameters.mapping = 1;
  19953. }
  19954. sceneMeta.videos = {
  19955. version: store.version,
  19956. videos: store.videoInfos,
  19957. parameters: store.parameters
  19958. }; // 将新的方案数据融合进来
  19959. mergeNewPanoVideo(store, sceneMeta['videosUser'], imagesVersion);
  19960. return store;
  19961. }).catch(function (error) {
  19962. throw error;
  19963. });
  19964. } else if (sceneFrom == 'lite') {
  19965. //2目
  19966. var _videosInfo = sceneMeta.videos;
  19967. var _version = _videosInfo.version || 0;
  19968. store.version = _version;
  19969. store.parameters.cameraType = 2;
  19970. var _imagesVersion = '';
  19971. if (typeof sceneMeta.version != 'undefined') {
  19972. _imagesVersion = '?imagesVersion=' + sceneMeta.version;
  19973. }
  19974. if (_version == 1) {
  19975. _videosInfo.data.forEach(function (item) {
  19976. store.videoInfos.set(item.id, {
  19977. mp4: {
  19978. url: store.videoPath + item.id + '.mp4' + _imagesVersion
  19979. },
  19980. mpeg: {
  19981. url: store.videoPath + item.id + '.ts',
  19982. size: item.tsSize + _imagesVersion
  19983. },
  19984. flv: {
  19985. url: store.videoPath + item.id + '.flv' + _imagesVersion
  19986. },
  19987. //Test,
  19988. exposure: Number(item.value) || 1,
  19989. mapping: 1,
  19990. cameraType: 2,
  19991. blend_fov: item.blend_fov || 5
  19992. });
  19993. });
  19994. }
  19995. return loadParameterFor2Cameras(_videosInfo.upPath).then(function (store) {
  19996. if (_version == 1) {
  19997. store.parameters.inputWidth = 3000;
  19998. store.parameters.inputHeight = 3000;
  19999. store.parameters.outputWidth = 4096;
  20000. store.parameters.outputHeight = 2048;
  20001. store.parameters.pixel = 1.12;
  20002. }
  20003. sceneMeta.videos = {
  20004. version: store.version,
  20005. videos: store.videoInfos,
  20006. parameters: store.parameters
  20007. };
  20008. return store;
  20009. }).catch(function (error) {
  20010. throw error;
  20011. });
  20012. } else if (sceneFrom == 'minion' || sceneFrom == 'laser') {
  20013. //转台双目
  20014. var _videosInfo2 = sceneMeta.videos;
  20015. var _version2 = _videosInfo2.version || 0;
  20016. store.version = _version2;
  20017. store.parameters.cameraType = 3;
  20018. var _imagesVersion2 = '';
  20019. if (typeof sceneMeta.version != 'undefined') {
  20020. _imagesVersion2 = '?imagesVersion=' + sceneMeta.version;
  20021. }
  20022. _videosInfo2.data.forEach(function (item) {
  20023. store.videoInfos.set(item.id, {
  20024. mp4: {
  20025. url: store.videoPath + item.id + '.mp4' + _imagesVersion2
  20026. },
  20027. mpeg: {
  20028. url: store.videoPath + item.id + '.ts',
  20029. size: item.tsSize + _imagesVersion2
  20030. },
  20031. flv: {
  20032. url: store.videoPath + item.id + '.flv' + _imagesVersion2
  20033. },
  20034. //Test,
  20035. exposure: Number(item.value) || 1,
  20036. mapping: 1,
  20037. cameraType: 3,
  20038. blend_fov: item.blend_fov || 5
  20039. });
  20040. });
  20041. return loadParameterForRotStereoCameras(_videosInfo2.upPath).then(function (store) {
  20042. store.parameters.inputWidth = 5472;
  20043. store.parameters.inputHeight = 3648;
  20044. store.parameters.outputWidth = 4096;
  20045. store.parameters.outputHeight = 2048;
  20046. store.parameters.lenOffsetX = 920;
  20047. store.parameters.lenOffsetY = 500;
  20048. store.parameters.videoWidth = 3630;
  20049. store.parameters.videoHeight = 2670;
  20050. store.parameters.pixel = 1.12;
  20051. sceneMeta.videos = {
  20052. version: store.version,
  20053. videos: store.videoInfos,
  20054. parameters: store.parameters
  20055. };
  20056. mergeNewPanoVideo(store, sceneMeta['videosUser'], _imagesVersion2); //add
  20057. return store;
  20058. }).catch(function (error) {
  20059. throw error;
  20060. });
  20061. } else {
  20062. console.warn('有尚不支持的相机来源:', sceneFrom);
  20063. }
  20064. }
  20065. /**
  20066. * @type Promise
  20067. */
  20068. var loadParameterPromise = null;
  20069. function loadParameterFor8Cameras(url) {
  20070. if (loadParameterPromise) return loadParameterPromise;
  20071. loadParameterPromise = new Promise(function (resolve, reject) {
  20072. if (!url) reject('找不到参数请求地址');
  20073. http.getText(url).then(function (text) {
  20074. return resolve(text);
  20075. }).catch(function (reson) {
  20076. return reject(reson);
  20077. });
  20078. }).then(function (text) {
  20079. var formatted = text.split(/\n/).filter(function (item) {
  20080. return item.trim() != '';
  20081. }) //空行分割取第一个
  20082. .map(function (item) {
  20083. return item.split(':');
  20084. });
  20085. var focal = Number(formatted[0][1]);
  20086. var pixel = Number(formatted[1][1]);
  20087. var center = formatted[2][1].trim().split(/\s+/).map(function (item) {
  20088. return Number(item);
  20089. });
  20090. var translateX = formatted[7][0].trim().split(/\s+/).map(function (item) {
  20091. return Number(item);
  20092. })[3],
  20093. translateY = formatted[8][0].trim().split(/\s+/).map(function (item) {
  20094. return Number(item);
  20095. })[3],
  20096. translateZ = formatted[9][0].trim().split(/\s+/).map(function (item) {
  20097. return Number(item);
  20098. })[3];
  20099. store.parameters.focal = focal;
  20100. store.parameters.pixel = pixel;
  20101. store.parameters.centerX = center[0];
  20102. store.parameters.centerY = center[1];
  20103. store.parameters.translateX = translateX;
  20104. store.parameters.translateY = translateY;
  20105. store.parameters.translateZ = translateZ;
  20106. return store;
  20107. }).catch(function (error) {
  20108. console.warn('球幕视频【八目】:参数文件加载失败', error);
  20109. return store;
  20110. }).finally(function () {
  20111. return store;
  20112. });
  20113. return loadParameterPromise;
  20114. }
  20115. function loadParameterFor2Cameras(url) {
  20116. if (loadParameterPromise) return loadParameterPromise;
  20117. loadParameterPromise = new Promise(function (resolve, reject) {
  20118. if (!url) reject('找不到参数请求地址');
  20119. http.getText(url, null, function (text) {
  20120. resolve(text);
  20121. }, function (reson) {
  20122. reject(reson);
  20123. });
  20124. }).then(function (text) {
  20125. var properties = {};
  20126. text.split('\n').map(function (line) {
  20127. if (line.length > 0) {
  20128. var keyValueParse = line.split(':');
  20129. var key = keyValueParse[0];
  20130. var values = keyValueParse[1].trim().split(' ');
  20131. properties[key] = Number(values[0]);
  20132. }
  20133. });
  20134. store.parameters.focal = properties['focal'];
  20135. store.parameters.centerX = properties['cx'];
  20136. store.parameters.centerY = properties['cy'];
  20137. store.parameters.translateX = properties['tx'];
  20138. store.parameters.translateY = properties['ty'];
  20139. store.parameters.translateZ = properties['tz'];
  20140. return store;
  20141. }).catch(function (error) {
  20142. console.warn('球幕视频【双目】:参数文件加载失败');
  20143. return store;
  20144. }).finally(function () {
  20145. return store;
  20146. });
  20147. return loadParameterPromise;
  20148. }
  20149. function loadParameterForRotStereoCameras(url) {
  20150. // url = url.replace('Uptxt', 'Up.txt')
  20151. if (loadParameterPromise) return loadParameterPromise;
  20152. loadParameterPromise = new Promise(function (resolve, reject) {
  20153. if (!url) reject('找不到参数请求地址');
  20154. resolve(http.getText(url));
  20155. }).then(function (text) {
  20156. var properties = {};
  20157. text.split('\n').map(function (line) {
  20158. if (line.length > 0) {
  20159. var keyValueParse = line.split(':');
  20160. var key = keyValueParse[0];
  20161. var values = keyValueParse[1].trim().split(' ');
  20162. properties[key] = Number(values[0]);
  20163. }
  20164. });
  20165. store.parameters.focal = properties['focal'];
  20166. store.parameters.centerX = properties['cx'];
  20167. store.parameters.centerY = properties['cy'];
  20168. store.parameters.translateX = properties['rx'];
  20169. store.parameters.translateY = properties['ry'];
  20170. store.parameters.translateZ = properties['rz'];
  20171. return store;
  20172. }).catch(function (error) {
  20173. console.warn('球幕视频【转台】:参数文件加载失败', error);
  20174. return store;
  20175. }).finally(function () {
  20176. return store;
  20177. });
  20178. return loadParameterPromise;
  20179. }
  20180. function mergeNewPanoVideo(store, newScheme, imagesVersion) {
  20181. // if(config.isEdit){
  20182. // return
  20183. // }
  20184. if (!newScheme) return;
  20185. var data = JSON.parse(newScheme);
  20186. data.forEach(function (item) {
  20187. store.videoInfos.set(item.panoId, {
  20188. dir: new THREE.Vector3().copy(item.dir),
  20189. hfov: parseFloat(item.hfov),
  20190. vfov: parseFloat(item.vfov),
  20191. mp4: {
  20192. url: store.videoPath + item.panoId + '-user.mp4' + imagesVersion
  20193. },
  20194. mpeg: {
  20195. url: store.videoPath + item.panoId + '-user.ts',
  20196. size: item.tsSize + imagesVersion
  20197. },
  20198. flv: {
  20199. url: store.videoPath + item.panoId + '-user.flv' + imagesVersion
  20200. },
  20201. //Test,
  20202. exposure: 1,
  20203. clipRect: item.rect,
  20204. mapping: 2
  20205. });
  20206. });
  20207. store.parameters.mapping = 2; //动态clip
  20208. store.parameters.cameraType = 8;
  20209. }
  20210. function getEnvironment() {
  20211. if (!store) intStore();
  20212. /**
  20213. * @type 'PC'|'Android'|'Ios'
  20214. */
  20215. var os = 'PC';
  20216. /**
  20217. * @type 'H5'|'WeChat'|'WeChatMiniprogram'
  20218. */
  20219. var environment = 'H5';
  20220. if (browser$1.detectAndroidMobile()) {
  20221. os = 'Android';
  20222. } else if (browser$1.detectIOS()) {
  20223. os = 'Ios';
  20224. }
  20225. if (browser$1.detectWeixin()) {
  20226. environment = 'WeChat';
  20227. if (navigator.userAgent.match('miniProgram')) {
  20228. environment = 'WeChatMiniprogram';
  20229. }
  20230. }
  20231. return {
  20232. os,
  20233. environment
  20234. };
  20235. }
  20236. var VersionControl = {
  20237. handle: handle,
  20238. getEnvironment: getEnvironment
  20239. };
  20240. function _createSuper$1b(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1b(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  20241. function _isNativeReflectConstruct$1b() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  20242. var OverlayManager = /*#__PURE__*/function (_EventEmitter) {
  20243. _inherits(OverlayManager, _EventEmitter);
  20244. var _super = _createSuper$1b(OverlayManager);
  20245. function OverlayManager(player) {
  20246. var _this;
  20247. _classCallCheck(this, OverlayManager);
  20248. _this = _super.call(this);
  20249. _this.player = player;
  20250. _this.group = new THREE.Object3D();
  20251. _this.group.name = 'OverlayGroup';
  20252. _this.frameGroup = new THREE.Object3D();
  20253. _this.frameGroup.name = 'OverlayFrameGroup';
  20254. player.OverlayManager = _assertThisInitialized(_this);
  20255. _this.withBox = true;
  20256. _this.lineMat = LineDraw.createFatLineMat({
  20257. depthTest: false,
  20258. lineWidth: 2,
  20259. color: '#4fffff',
  20260. opacity: 0.3
  20261. });
  20262. _this.model = _this.player.model;
  20263. _this.model.add(_this.group);
  20264. _this.model.add(_this.frameGroup);
  20265. _this.player.$app.core.get('SceneRenderer').addComponent(_assertThisInitialized(_this));
  20266. _this.VideoManager = _this.player.$app.VideoManager;
  20267. var metadata = _this.player.$app.store.getValue('metadata');
  20268. if (metadata.boxVideos && metadata.boxVideos.length) {
  20269. var info = metadata.boxVideos[0]; // let nonsupportH5Video = browser.detectAndroidMobile() //|| browser.detectWeixin() && !browser.detectWeixinMiniProgram() //iphoneX微信不能用flv, vivo
  20270. var _VersionControl$getEn = VersionControl.getEnvironment(),
  20271. os = _VersionControl$getEn.os,
  20272. environment = _VersionControl$getEn.environment;
  20273. if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  20274. // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
  20275. _this.overlayVideoPlayer = new FlvVideoPlayer$2(_this.player); // console.log('use FlvVideoPlayer')
  20276. } else {
  20277. // console.log('use H5VideoPlayer')
  20278. _this.overlayVideoPlayer = new H5VideoPlayer$2(_this.player);
  20279. } //if (nonsupportH5Video) console.error('nonsupportH5Video')
  20280. // this.overlayVideoPlayer = nonsupportH5Video ? new FlvVideoPlayer(this.player) : new H5VideoPlayer(this.player)
  20281. _this.add(new Overlay(_this.player, info, _this.overlayVideoPlayer));
  20282. }
  20283. if (metadata.boxPhotos && metadata.boxPhotos.length) {
  20284. metadata.boxPhotos.forEach(function (info) {
  20285. _this.add(new Overlay(_this.player, info));
  20286. });
  20287. } // let videoEdit = this.VideoManager.BoxVideo.edit
  20288. // this.player.model.on('floor.changed', (toFloor, mode) => {
  20289. // this.group.children.forEach(overlay => {
  20290. // overlay.floor == toFloor ? videoEdit.setVisible(overlay.sid, true) : videoEdit.setVisible(overlay.sid, false)
  20291. // })
  20292. // })
  20293. player.on('collectIntersectMesh', function (meshes) {
  20294. //推送要intersect的mesh
  20295. meshes.push.apply(meshes, _toConsumableArray(_this.group.children.filter(function (e) {
  20296. return e.visible;
  20297. }).map(function (overlay) {
  20298. return overlay.plane;
  20299. })));
  20300. });
  20301. player.on('judgeIntersect', function (intersect, e) {
  20302. //判断是否intersect了overlay
  20303. if (
  20304. /* e.getConsumed() || */
  20305. intersect && (intersect.object.overlayType || intersect.object.parent.overlayType)) {
  20306. _this.hoverOverlay(intersect.object);
  20307. e.consume();
  20308. } else {
  20309. _this.hoverOverlay(null);
  20310. }
  20311. });
  20312. player.on('pointerStart', function () {
  20313. /* this.intersect = player.getMouseIntersect(null, this.group.children.concat(player.model.colliders))
  20314. if (this.intersect && (this.intersect.object.overlayType || this.intersect.object.parent.overlayType)) {
  20315. this.OverlayManager.hoverOverlay(this.intersect.object)
  20316. } else this.OverlayManager.hoverOverlay(null) */
  20317. //for自动播放
  20318. _this.autoPlay();
  20319. });
  20320. player.on(PlayerEvents.FlyingStarted, function (_ref) {
  20321. var panoId = _ref.panoId;
  20322. //if (!this.player.EditOverlay.editPlane) {
  20323. // 当overlay仅限某一点位显示时,其它点位或飞出则需要隐藏.
  20324. _this.group.children.forEach(function (e) {
  20325. if (e.limitToOnlyPano) {
  20326. if (e.limitToOnlyPano.id != panoId) {
  20327. e.hide('limitToOnlyPano');
  20328. _this.player.EditOverlay.editPlane == e && _this.VideoManager.emit('videos/panel/updatePanoVisi', false);
  20329. } else {
  20330. e.show('limitToOnlyPano');
  20331. _this.player.EditOverlay.editPlane == e && _this.VideoManager.emit('videos/panel/updatePanoVisi', true);
  20332. }
  20333. }
  20334. }); //}
  20335. });
  20336. if (player.$app.config.view) {
  20337. //展示页面。 不要遮住漫游点视频
  20338. player.on(PlayerEvents.FlyingEnded, function (_ref2) {
  20339. var currentPano = _ref2.currentPano;
  20340. var panoVideoFilter;
  20341. if (player.mode == 'panorama') {
  20342. panoVideoFilter = currentPano.getVideoFilter();
  20343. }
  20344. _this.group.children.forEach(function (e) {
  20345. if (panoVideoFilter && panoVideoFilter(e.position)) {
  20346. e.hide('coveredPanoVideo');
  20347. } else {
  20348. e.show('coveredPanoVideo');
  20349. }
  20350. });
  20351. }); //展示页面延迟加载,且监控,可见才播放
  20352. _this.group.children.filter(function (e) {
  20353. return e.info.type == 'video';
  20354. }); //如果多个视频就这么写:
  20355. /* common.batchHandling.addSliceListen({
  20356. getList: () => {
  20357. return videos
  20358. },
  20359. minCount: 0,
  20360. maxCount: 1,
  20361. durBound1: 3,
  20362. durBound2: 13,
  20363. maxHistory: 3,
  20364. player: this.player,
  20365. callback: overlay => {
  20366. if (overlay.visible && overlay.inSight()) {
  20367. overlay.videoControl(true)
  20368. } else {
  20369. overlay.videoControl(false)
  20370. }
  20371. },
  20372. }) */
  20373. }
  20374. return _this;
  20375. }
  20376. _createClass(OverlayManager, [{
  20377. key: "add",
  20378. value: function add(overlay) {
  20379. this.group.add(overlay);
  20380. }
  20381. }, {
  20382. key: "show",
  20383. value: function show(floorIndex, keepHidden) {
  20384. // this.group.visible = true
  20385. this.group.children.forEach(function (overlay) {
  20386. if (keepHidden && overlay.info.hide) return;
  20387. if (floorIndex == 'all' || overlay.floor.floorIndex == floorIndex) overlay.show('visiOnFloor');
  20388. });
  20389. }
  20390. }, {
  20391. key: "hide",
  20392. value: function hide(floorIndex) {
  20393. // this.group.visible = false
  20394. this.group.children.forEach(function (overlay) {
  20395. if (floorIndex == 'all' || overlay.floor.floorIndex == floorIndex) overlay.hide('visiOnFloor');
  20396. });
  20397. }
  20398. }, {
  20399. key: "setGroupVisible",
  20400. value: function setGroupVisible(visi) {
  20401. this.group.visible = !!visi;
  20402. this.frameGroup.visible = !!visi;
  20403. }
  20404. }, {
  20405. key: "setSize",
  20406. value: function setSize(x, y) {
  20407. // this.lineMat.resolution.set( x,y );
  20408. if (this.openOverlay) {
  20409. this.resizeOverlay();
  20410. }
  20411. }
  20412. /*
  20413. hover到overlay时 创建四条fatLine 并渐变opacity由0至1;反之由1至0,最后删除
  20414. */
  20415. }, {
  20416. key: "hoverOverlay",
  20417. value: function hoverOverlay(plane, type) {
  20418. //这个plane可能是box
  20419. if (!this.group.visible) return;
  20420. var overlay;
  20421. if (this.withBox && plane) {
  20422. overlay = plane.parent;
  20423. plane = overlay.plane;
  20424. } else {
  20425. overlay = plane;
  20426. }
  20427. if (overlay && overlay.info.isBillboard && overlay.targetPano == void 0 && config$4.view) {
  20428. //无跳转点不响应
  20429. return;
  20430. }
  20431. if (!this.model.player.billboardManager.editPlane) {
  20432. //需要一直高亮所编辑的billboard
  20433. this.highlight(overlay, type);
  20434. }
  20435. if (!plane) {
  20436. if (this.hoveringPlane) {
  20437. if (this.hoveringPlane.info.isBillboard) {
  20438. this.model.player.billboardManager.emit('hoverBillboard', {
  20439. sid: this.hoveringPlane.info.sid,
  20440. state: false
  20441. });
  20442. }
  20443. this.hoveringPlane = null;
  20444. }
  20445. CursorDeal.remove('hoverOverlay');
  20446. CursorDeal.remove('dragOverlay');
  20447. return;
  20448. }
  20449. if (overlay.isEditing && overlay.info.isBillboard) {
  20450. CursorDeal.add('dragOverlay');
  20451. } else {
  20452. CursorDeal.add('hoverOverlay');
  20453. }
  20454. this.hoveringPlane = overlay;
  20455. if (overlay.info.isBillboard) {
  20456. this.model.player.billboardManager.emit('hoverBillboard', {
  20457. sid: overlay.info.sid,
  20458. state: true
  20459. });
  20460. }
  20461. }
  20462. }, {
  20463. key: "highlight",
  20464. value: function highlight(overlay, type) {
  20465. var _this2 = this;
  20466. if (this.player.$app.config.view) return; //4.12.0 新增 查看页不显示高亮边框
  20467. //同时只能有一个高亮
  20468. var changeTime = 200;
  20469. if (!overlay) {
  20470. if (this.highlightPlane) {
  20471. //console.log('cancel highlight')
  20472. var cancelFuc = function cancelFuc() {
  20473. fadePlane.border.children.forEach(function (line) {
  20474. line.geometry.dispose();
  20475. });
  20476. fadePlane.remove(fadePlane.border);
  20477. };
  20478. var fadePlane = this.withBox ? this.highlightPlane.plane : this.highlightPlane;
  20479. transitions$1.cancelById(settings$3.freeze.wallLineShine);
  20480. if (type == 'soon') {
  20481. this.lineMat.opacity = 0;
  20482. cancelFuc();
  20483. } else {
  20484. transitions$1.start(function (progress) {
  20485. this.lineMat.opacity = 1 - progress;
  20486. }.bind(this), changeTime, cancelFuc, 0, easing[settings$3.transition.blendEasing], 'wallLineShine', settings$3.freeze.wallLineShine, cancelFuc);
  20487. }
  20488. }
  20489. this.highlightPlane = null;
  20490. return;
  20491. }
  20492. if (!overlay.visible) return;
  20493. if (overlay == this.highlightPlane) return; // 非编辑状态并且指示牌没有跳转点位,设置不高亮
  20494. //if (overlay.info.isBillboard && !overlay.isEditing && !overlay.info.targetPano) return
  20495. if (this.highlightPlane) {
  20496. this.highlight(null);
  20497. } //console.log('highlight')
  20498. this.highlightPlane = overlay;
  20499. var points = overlay.plane.geometry.getAttribute('position').array;
  20500. var borders = new THREE.Object3D();
  20501. var indeces = [0, 1, 3, 2];
  20502. for (var j = 0; j < 4; j++) {
  20503. var p = [{
  20504. x: points[indeces[j] * 3],
  20505. y: points[indeces[j] * 3 + 1],
  20506. z: points[indeces[j] * 3 + 2]
  20507. }, {
  20508. x: points[indeces[(j + 1) % 4] * 3],
  20509. y: points[indeces[(j + 1) % 4] * 3 + 1],
  20510. z: points[indeces[(j + 1) % 4] * 3 + 2]
  20511. }];
  20512. borders.add(LineDraw.createFatLine(p, {
  20513. material: this.lineMat
  20514. }));
  20515. } // 显示边框前再清除一次所有边框,确保始终只有一个线框显示
  20516. this.group.children.forEach(function (overlay) {
  20517. var fadePlane = _this2.withBox ? overlay.plane : overlay;
  20518. if (fadePlane.border) {
  20519. fadePlane.border.children.forEach(function (line) {
  20520. return line.geometry.dispose();
  20521. });
  20522. fadePlane.remove(fadePlane.border);
  20523. }
  20524. });
  20525. this.lineMat.opacity = 0;
  20526. transitions$1.cancelById(settings$3.freeze.wallLineShine, true); //加true是执行消失时的cancelFun,删除border
  20527. transitions$1.start(function (opa) {
  20528. this.lineMat.opacity = opa;
  20529. }.bind(this), changeTime, null, 0, easing[settings$3.transition.blendEasing], 'wallLineShine', settings$3.freeze.wallLineShine);
  20530. overlay.plane.border = borders;
  20531. overlay.plane.add(borders);
  20532. }
  20533. }, {
  20534. key: "getMatFromCss",
  20535. value: function getMatFromCss(tran) {
  20536. if (tran.includes('matrix3d')) {
  20537. var arr = tran.slice(9, -1).split(',');
  20538. } else {
  20539. var arr = tran.slice(7, -1).split(',');
  20540. }
  20541. arr.forEach(function (v, i) {
  20542. arr[i] = parseFloat(v);
  20543. });
  20544. if (arr.length == 16) var matrix = new THREE.Matrix4().fromArray(arr);else if (arr.length == 6) var matrix = new THREE.Matrix4().fromArray([arr[0], arr[1], 0, 0, arr[2], arr[3], 0, 0, 0, 0, 1, 0, arr[4], arr[5], 0, 1]);
  20545. return matrix;
  20546. }
  20547. }, {
  20548. key: "getCssFromMatrix",
  20549. value: function getCssFromMatrix(matrix) {
  20550. return 'matrix3d(' + matrix.elements + ')';
  20551. }
  20552. }, {
  20553. key: "getOverlayOpenPos",
  20554. value: function getOverlayOpenPos(overlay) {
  20555. //除了初次获取,在player resize后也要重新获取 ,如果相机还旋转了,也要重新获取
  20556. var paddingRatio = 0.9;
  20557. var ratioW = overlay.width / ($('#player').width() * paddingRatio);
  20558. var ratioH = overlay.height / ($('#player').height() * paddingRatio);
  20559. var ratio = 1 / Math.max(ratioW, ratioH); //缩放比例
  20560. var x = -overlay.width * ratio / $('#player').width();
  20561. var camera = player.cameraControls.activeControl ? player.cameraControls.activeControl.camera : player.camera;
  20562. var pos3dLeft = new THREE.Vector3(x, 0, -1).unproject(camera); // player.camera的projectMatrix延迟了
  20563. var camToLeft = pos3dLeft.clone().sub(player.camera.position);
  20564. var cameraDir = player.getDirection(); //same as control.lookVector
  20565. var angle = cameraDir.angleTo(camToLeft);
  20566. var camDisToPlane = overlay.width / 2 / Math.tan(angle); //plane应该离相机的距离
  20567. if (this.withBox) {
  20568. var boxDepth = overlay.plane.position.length();
  20569. camDisToPlane += boxDepth;
  20570. }
  20571. var planePos = player.camera.position.clone().add(cameraDir.clone().multiplyScalar(camDisToPlane));
  20572. if (!this.useCssRender) this.updatePlaneElemStyle(ratio);
  20573. return planePos;
  20574. }
  20575. }, {
  20576. key: "updatePlaneElemStyle",
  20577. value: function updatePlaneElemStyle(ratio) {
  20578. this.openOverlay.elem.css({
  20579. width: this.openOverlay.width * ratio + 'px',
  20580. height: this.openOverlay.height * ratio + 'px'
  20581. });
  20582. }
  20583. }, {
  20584. key: "getPlanePos",
  20585. value: function getPlanePos(overlay) {
  20586. if (this.withBox) {
  20587. return new THREE.Vector3().setFromMatrixPosition(overlay.plane.matrixWorld);
  20588. } else return overlay.position.clone();
  20589. }
  20590. /*
  20591. 点击overlay时 box视频只需要飞到最佳观影点即可,根据屏幕宽度和fov,算出刚好屏幕宽度容纳下视频宽度的距离goodDistance
  20592. */
  20593. }, {
  20594. key: "clickOverlay",
  20595. value: function clickOverlay(overlay) {
  20596. var _this3 = this;
  20597. var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  20598. dontEmit = _ref3.dontEmit,
  20599. forceFlyToPlane = _ref3.forceFlyToPlane,
  20600. afterFly = _ref3.afterFly;
  20601. //如果在outside点击了,要禁止飞入,否则涉及旋转
  20602. if (overlay.info.isBillboard) {
  20603. dontEmit || this.model.player.billboardManager.emit('clickBillboard', {
  20604. //通知编辑,更新面板
  20605. sid: overlay.info.sid //modified: overlay.info.modified,
  20606. });
  20607. var firstViewPano = this.model.player.$app.core.get('Scene').firstView.pano;
  20608. if (!forceFlyToPlane) {
  20609. var pano = this.model.player.model.panos.index[overlay.targetPano];
  20610. if (pano != void 0 && (pano == firstViewPano || pano.hasNeighbor())) {
  20611. this.model.player.flyToPano({
  20612. pano
  20613. /* lookAtPoint: overlay.position, //看向的方向最好有个指定
  20614. checkAlone: true, */
  20615. });
  20616. }
  20617. return; //没有跳转点就不响应
  20618. }
  20619. if (overlay.homePanoId != void 0) {
  20620. var _pano = this.model.player.model.panos.index[overlay.homePanoId];
  20621. if (_pano != void 0 && (_pano == firstViewPano || _pano.hasNeighbor())) {
  20622. this.model.player.flyToPano({
  20623. pano: _pano,
  20624. lookAtPoint: overlay.position,
  20625. checkAlone: true
  20626. });
  20627. return; //如果能回到绑定点的话
  20628. }
  20629. }
  20630. }
  20631. if (this.openOverlay && !overlay || this.model.player.GLTFEditor.selecting) return;
  20632. CursorDeal.remove('hoverOverlay');
  20633. var plane = this.withBox && overlay ? overlay.plane : overlay;
  20634. if (overlay.overlayType == 'video') {
  20635. plane.material.map.image.play();
  20636. } //适应屏幕的最佳距离
  20637. var tanW = this.player.cameraControls.cameras.panorama.aspect * Math.tan(THREE.MathUtils.degToRad(this.model.player.zoomFov / 2));
  20638. var tanH = Math.tan(THREE.MathUtils.degToRad(this.model.player.zoomFov / 2));
  20639. var goodDistanceW = overlay.width / 2 / tanW;
  20640. var goodDistanceH = overlay.height / 2 / tanH;
  20641. var goodDistance = Math.max(goodDistanceW, goodDistanceH);
  20642. goodDistance *= goodDistance;
  20643. console.log('goodDistance ' + goodDistance);
  20644. if (overlay.limitToOnlyPano) {
  20645. this.player.flyToPano({
  20646. pano: overlay.limitToOnlyPano,
  20647. lookAtPoint: overlay.position
  20648. });
  20649. } else {
  20650. // var visiblePanos = convertTool.getVisiblePano(overlay.plane.getWorldPosition(),{model: this.model.player.mainDesign &&this.model.player.mainDesign.editing ? this.model.player.mainDesign.getMeshes(["wallMeshes","objWallMeshes","groundMeshes"]) : null});
  20651. var visiblePanos = overlay.visiblePanos; //convertTool.getVisiblePano(overlay.plane.getWorldPosition(new THREE.Vector3()), this.model)
  20652. if (visiblePanos.length == 0) console.warn('clickOverlay 找不到visiblePanos');
  20653. var coss = {};
  20654. this.player.$app.Camera.flyToPoint(overlay.position.clone(), {
  20655. rank: [function (pano) {
  20656. //寻找正对着overlay的pano
  20657. var overlayDir = new THREE.Vector3(0, 0, 1).applyQuaternion(overlay.quaternion);
  20658. var v1 = overlayDir; //.setY(0); 朝上的话set0会得到0,0,0 无法求angle
  20659. var v2 = pano.position.clone().sub(overlay.position); //.setY(0)
  20660. //var angle = v1.angleTo(v2)
  20661. var cos = v1.dot(v2.normalize());
  20662. coss[pano.id] = cos;
  20663. return cos * 200;
  20664. }, function (pano) {
  20665. var dis = pano.position.clone().distanceToSquared(overlay.position);
  20666. var goodDistance2 = goodDistance * Math.abs(coss[pano.id]); //考虑了倾斜角度后的最佳距离
  20667. var result = -1 * Math.abs(dis - goodDistance2) / goodDistance2; //dis和goodDistance2差距越大分数越低
  20668. //console.log(pano.id, dis, goodDistance2)
  20669. return result;
  20670. }, function (i) {
  20671. var n = i.position.clone().sub(overlay.position).normalize();
  20672. return n.dot(_this3.player.getDirection()) * -500;
  20673. }],
  20674. require: [function (pano) {
  20675. //不要被模型遮挡
  20676. return visiblePanos.includes(pano); //return pano.floorIndex == overlay.floor.floorIndex && pano.neighbourUUIDs.length > 0
  20677. }],
  20678. dealDistance: 5,
  20679. //超过这个距离才换pano
  20680. done: afterFly
  20681. });
  20682. }
  20683. var isEditing = !dontEmit && this.player.EditOverlay && this.player.EditOverlay.editing;
  20684. if (!isEditing) return; // 如果已有media在编辑,禁止选中其他media
  20685. if (this.player.EditOverlay.editPlane && this.player.EditOverlay.editPlane.uuid != overlay.uuid) return; // 当正在添加media plane, 但鼠标并没有停在可用位置时,禁止添加plane
  20686. if (this.player.EditOverlay.isAdding && this.player.domElement.style.cursor.indexOf('box_video.png') < 0) return; //if (this.player.EditOverlay.isAdding && this.player.OverlayManager.hoveringPlane ) return
  20687. if (isEditing && this.player.EditOverlay.editPlane != overlay) {
  20688. //console.log('videos/panel/display面板出现')
  20689. setTimeout(function () {
  20690. var infoCopy = JSON.parse(JSON.stringify(overlay.info));
  20691. infoCopy.sid = overlay.sid;
  20692. infoCopy.type = overlay.overlayType;
  20693. _this3.VideoManager.emit('videos/panel/display', infoCopy);
  20694. _this3.player.EditOverlay.updateOverlayPanel(overlay);
  20695. overlay.updateVisibleOnFloor(); //overlay.isHidden ? overlay.hide('forceHide') : overlay.show('forceHide')
  20696. }, 10); //延迟是为了等待添加overlay的这个页面 created 完,监听才加好
  20697. return;
  20698. }
  20699. }
  20700. }, {
  20701. key: "autoPlay",
  20702. value: function autoPlay(player) {
  20703. //有的设备需要和设备交互才能自动播放,如移动端。不这么写video不会播放 . (2022.11.29: 可为何加了Hot.updateHots之后又会自动播了?https有关?
  20704. this.group.children.forEach(function (overlay) {
  20705. /* if(overlay.overlayType == 'video' && overlay.shouldPlay){
  20706. console.log(1)
  20707. } */
  20708. if (!overlay.clickToPlayInited && overlay.info.media instanceof HTMLVideoElement && !common.isVideoPlayed(overlay.info.media) && overlay.shouldPlay) {
  20709. console.log('try mobileAutoPlay ');
  20710. overlay.videoControl(true);
  20711. if (common.isVideoPlayed(overlay.info.media)) {
  20712. console.log('clickToPlayInited ');
  20713. overlay.clickToPlayInited = true;
  20714. }
  20715. }
  20716. });
  20717. }
  20718. }]);
  20719. return OverlayManager;
  20720. }(EventEmitter);
  20721. function _createSuper$1a(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1a(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  20722. function _isNativeReflectConstruct$1a() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  20723. /**
  20724. * 用于3d video的编辑
  20725. */
  20726. var EditOverlay = /*#__PURE__*/function (_EventEmitter) {
  20727. _inherits(EditOverlay, _EventEmitter);
  20728. var _super = _createSuper$1a(EditOverlay);
  20729. function EditOverlay(player) {
  20730. var _this;
  20731. _classCallCheck(this, EditOverlay);
  20732. _this = _super.call(this);
  20733. _this.editing = false;
  20734. _this.overlayMaxCount = 1;
  20735. _this.meshGroup = new THREE.Object3D();
  20736. _this.player = player; // this.init()
  20737. return _this;
  20738. }
  20739. _createClass(EditOverlay, [{
  20740. key: "checkIfCanInit",
  20741. value: function checkIfCanInit() {
  20742. return this.player.model && this.player.model.chunks.length && this.player.currentPano && this.player.model.transformControls;
  20743. }
  20744. }, {
  20745. key: "waitToInit",
  20746. value: function waitToInit() {
  20747. var _this2 = this;
  20748. console.log('waitToInit');
  20749. var timer = setInterval(function () {
  20750. if (_this2.checkIfCanInit()) {
  20751. _this2.init();
  20752. clearInterval(timer);
  20753. }
  20754. }, 50);
  20755. }
  20756. }, {
  20757. key: "init",
  20758. value: function init() {
  20759. var _this3 = this;
  20760. if (!this.checkIfCanInit()) {
  20761. this.waitToInit();
  20762. return;
  20763. }
  20764. this.VideoManager = this.player.$app.VideoManager;
  20765. this.transformControls = this.player.model.transformControls;
  20766. this.transformControls.addEventListener('mousing', function (data) {
  20767. if (data.state == 'overlay') {
  20768. _this3.VideoManager.emit('VideoManager.BoxVideo.transform', data.mode);
  20769. _this3.editPlane.frame.update(data); // 拖拽轴向时实时更新overlayFrame
  20770. }
  20771. });
  20772. this.meshGroup.name = 'overlay-group';
  20773. this.player.model.add(this.meshGroup);
  20774. this.meshGroup.visible = false;
  20775. this.player.OverlayManager.group.children.forEach(function (overlay) {
  20776. //获取信息
  20777. _this3.updateOverlayInfo(overlay);
  20778. });
  20779. window.addEventListener('keydown', function (e) {
  20780. //用键盘来切换变换
  20781. var mode;
  20782. if (_this3.editing) return;
  20783. switch (e.which) {
  20784. case 87:
  20785. //w or W
  20786. mode = 'translate';
  20787. break;
  20788. /* case 69://e or E
  20789. mode = "rotate"; break; */
  20790. case 82:
  20791. //r or R
  20792. mode = 'scale';
  20793. break;
  20794. }
  20795. mode && _this3.VideoManager.emit('videos/panel/switchTclMode', mode);
  20796. e.stopPropagation();
  20797. }); // this.VideoManager.on('videos/panel/useImgRatio', this.useImgRatio.bind(this))
  20798. this.enter();
  20799. }
  20800. }, {
  20801. key: "enter",
  20802. value: function enter() {
  20803. if (this.editing) return;
  20804. this.editing = true;
  20805. this.meshGroup.visible = true; //this.transformControls.switchEditState('overlay')
  20806. this.player.cameraControls.controls.dollhouse.resetRanges(3);
  20807. this.player.cameraControls.controls.panorama.insideLookLimitDown = config$4.isMobile ? -55 : -50; // player.model.wallManager.updateRulersVisi(false);
  20808. // player.model.cadFloorPlane.changeCadVisible(false)
  20809. // player.model.cadFloorPlane.updateEntryVisi({visi:false})
  20810. // if (this.player.OverlayManager.group.children.length >= this.overlayMaxCount) {
  20811. // //当前只能加一个视频,所以进入即自动开始添加或编辑
  20812. // var overlay = this.player.OverlayManager.group.children[0]
  20813. // this.player.OverlayManager.clickOverlay(overlay)
  20814. // }
  20815. // else {
  20816. // this.beginToAddPlane()
  20817. // }
  20818. }
  20819. }, {
  20820. key: "leave",
  20821. value: function leave() {
  20822. if (!this.editing) return;
  20823. this.editing = false;
  20824. this.endAddPlane();
  20825. this.meshGroup.visible = false;
  20826. this.transformControls.switchEditState(null);
  20827. this.player.cameraControls.controls.dollhouse.resetRanges();
  20828. this.player.cameraControls.controls.panorama.insideLookLimitDown = null; // this.player.model.wallManager.updateRulersVisi()
  20829. // this.player.model.cadFloorPlane.changeCadVisible(null, { autoJudge: true })
  20830. // this.player.model.cadFloorPlane.updateEntryVisi({ autoJudge: true })
  20831. // bus.emit("videos/panel/exit")
  20832. }
  20833. }, {
  20834. key: "beginToAddPlane",
  20835. value: function beginToAddPlane() {
  20836. //开始添加
  20837. this.player.viewLinkManager.exitView();
  20838. this.player.reticule.visible = false; // setTimeout(() => {
  20839. //因为莫名会被其他页面的设置覆盖,所以延迟
  20840. //this.player.domElement.style.cursor = `url(https://4dkk.4dage.com/v3-test/img/box_video.png),auto`
  20841. // playerDiv.style.cursor = `url(${config.getResourceImageURL('img')}/box_video.png),auto`
  20842. // }, 10)
  20843. this.isAdding = true;
  20844. CursorDeal.add('addOverlay');
  20845. }
  20846. }, {
  20847. key: "endAddPlane",
  20848. value: function endAddPlane() {
  20849. //结束添加状态
  20850. this.isAdding = false; //this.player.domElement.style.cursor = ''
  20851. CursorDeal.remove('addOverlay');
  20852. this.player.reticule.visible = true;
  20853. }
  20854. }, {
  20855. key: "addOverlay",
  20856. value: function addOverlay(o) {
  20857. //调整旋转值,使贴合墙壁,且不重叠。
  20858. var normal = o.intersect.face.normal.clone();
  20859. var intersectType = Vectors$1.UP.angleTo(normal) > Math.PI / 4 ? 'wall' : 'ground';
  20860. if (this.player.getMouseDirection().angleTo(o.intersect.face.normal) < Math.PI / 2) {
  20861. normal.negate();
  20862. }
  20863. {
  20864. // v4.6.0 + 使和地面垂直
  20865. console.log('normal', normal);
  20866. if (normal.y > 0.85) {
  20867. //如果原本平行于地面的话,就使之面对相机的方向
  20868. normal = this.player.getMouseDirection().negate(); //this.player.getDirection().negate()
  20869. } // if(intersectType == "wall") {
  20870. normal.y = 0; // } else {
  20871. // normal.x = 0
  20872. // normal.z = 0
  20873. // }
  20874. normal.normalize();
  20875. }
  20876. var quaternion = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().lookAt(normal, Vectors$1.ZERO, Vectors$1.UP));
  20877. var position = o.intersect.point.add(normal.multiplyScalar(0.01)); //添加
  20878. var overlay = new Overlay(this.player, {
  20879. sid: common.getRandomSid(),
  20880. floorIndex: this.player.model.currentFloor.floorIndex,
  20881. pos: position,
  20882. qua: quaternion,
  20883. modified: 'new',
  20884. frameType: intersectType + '_1'
  20885. });
  20886. overlay.updateMatrixWorld();
  20887. this.player.OverlayManager.clickOverlay(overlay); //自动点击
  20888. this.VideoManager.emit('videos/panel/switchTclMode', 'translate');
  20889. this.endAddPlane(); //自动结束添加
  20890. }
  20891. }, {
  20892. key: "updateOverlayInfo",
  20893. value: function updateOverlayInfo(overlay) {
  20894. if (overlay.info.isBillboard) return; //获取当前overlay的信息, 用于取消时恢复
  20895. overlay.info = {
  20896. width: overlay.width,
  20897. height: overlay.height,
  20898. depth: overlay.depth,
  20899. pos: overlay.position.clone(),
  20900. qua: overlay.quaternion.clone(),
  20901. reverse: overlay.scale.x < 0,
  20902. media: overlay.plane.material.map.image,
  20903. file: overlay.file,
  20904. type: overlay.overlayType,
  20905. hide: overlay.isHidden,
  20906. frameType: overlay.frame && overlay.frame.type,
  20907. limitToOnlyPano: overlay.limitToOnlyPano && overlay.limitToOnlyPano.id
  20908. };
  20909. }
  20910. }, {
  20911. key: "undoEdit",
  20912. value: function undoEdit() {
  20913. // 恢复
  20914. if (!this.editPlane) return;
  20915. var overlay = this.editPlane;
  20916. if (overlay.modified == 'new') {
  20917. // 未保存过的video直接删除
  20918. this.disposeOverlay(overlay);
  20919. } else {
  20920. overlay.setFromInfo(overlay.info); // 如果是已删除的,则恢复
  20921. if (overlay.modified == 'delete') this.player.OverlayManager.add(overlay);
  20922. }
  20923. }
  20924. }, {
  20925. key: "updateOverlayScaleDisplay",
  20926. value: function updateOverlayScaleDisplay() {
  20927. //更新视频尺寸的数字
  20928. var overlay = this.editPlane;
  20929. var maxWidth = 190,
  20930. maxHeight = maxWidth; //maxWidth/2;
  20931. var ratioW = Math.abs(overlay.width) / maxWidth;
  20932. var ratioH = Math.abs(overlay.height) / maxHeight;
  20933. var ratio = 1 / Math.max(ratioW, ratioH); //缩放比例
  20934. var w = Math.round(Math.abs(overlay.width) * ratio);
  20935. var h = Math.round(Math.abs(overlay.height) * ratio); //console.log(overlay.width, overlay.height, overlay.depth)
  20936. this.VideoManager.emit('videos/panel/changeSize', {
  20937. wText: overlay.width.toFixed(2),
  20938. hText: overlay.height.toFixed(2),
  20939. width: w,
  20940. height: h,
  20941. depth: isNaN(overlay.depth) ? settings$3.overlay.depth : overlay.depth
  20942. });
  20943. }
  20944. }, {
  20945. key: "updateOverlayPanel",
  20946. value: function updateOverlayPanel(overlay) {
  20947. this.editPlane = overlay;
  20948. var plane = overlay.plane;
  20949. var video = plane.material.map && plane.material.map.image;
  20950. this.VideoManager.emit('videos/panel/updatePoster', video);
  20951. this.updateOverlayScaleDisplay();
  20952. this.transformControls.switchEditState('overlay');
  20953. if (overlay.frame) {
  20954. this.VideoManager.emit('videos/panel/changeDepth', overlay.depth * 100);
  20955. } else {
  20956. this.VideoManager.emit('videos/panel/changeDepth', 0);
  20957. }
  20958. this.player.emit('beginEditOverlay');
  20959. }
  20960. }, {
  20961. key: "controlSelectOverlay",
  20962. value: function controlSelectOverlay(overlay) {
  20963. //控制器的选择
  20964. if (overlay && overlay.visible) {
  20965. //this.transformControls.switchEditState('overlay')
  20966. overlay.frame ? overlay.frame.switchTranformControls(this.transformControls) : this.transformControls.attach(overlay);
  20967. } else {
  20968. this.transformControls.detach();
  20969. }
  20970. }
  20971. }, {
  20972. key: "useImgRatio",
  20973. value: function useImgRatio(o) {
  20974. //使用素材自身尺寸比例
  20975. var plane = this.editPlane.plane;
  20976. if (!plane.material.map) return;
  20977. var img = plane.material.map.image;
  20978. var mintranRatio = 200; //default is 200 , 防止图片太小时在墙上依旧很大
  20979. var width = this.editPlane.overlayType == 'video' ? img.videoWidth : img.width;
  20980. var height = this.editPlane.overlayType == 'video' ? img.videoHeight : img.height;
  20981. if (o == 'suitSize') {
  20982. var boundWidth = Math.min(Math.max(width, height) / mintranRatio, 1);
  20983. if (width > height) {
  20984. var w = boundWidth;
  20985. var h = boundWidth * height / width;
  20986. } else {
  20987. var h = boundWidth;
  20988. var w = boundWidth * width / height;
  20989. }
  20990. } else {
  20991. //假设不变总面积
  20992. var k = Math.sqrt(Math.abs(this.editPlane.width * this.editPlane.height) / (width * height));
  20993. var w = k * width * (this.editPlane.width < 0 ? -1 : 1);
  20994. var h = k * height * (this.editPlane.height < 0 ? -1 : 1);
  20995. }
  20996. this.editPlane.scale.setX(w / settings$3.overlay.width);
  20997. this.editPlane.scale.setY(h / settings$3.overlay.height);
  20998. this.editPlane.width = w;
  20999. this.editPlane.height = h;
  21000. this.updateOverlayScaleDisplay();
  21001. }
  21002. }, {
  21003. key: "overlayUploaded",
  21004. value: function overlayUploaded(file, media) {
  21005. //video上传成功后,调整overlay
  21006. var plane = this.editPlane.plane;
  21007. media.style.width = '100%';
  21008. media.style.height = '100%';
  21009. if (media instanceof HTMLVideoElement) {
  21010. plane.material.map = new THREE.VideoTexture(media);
  21011. plane.material.map.image.play();
  21012. this.editPlane.overlayType = 'video';
  21013. media.autoplay = true;
  21014. media.loop = true;
  21015. media.volume = 0;
  21016. media.muted = true;
  21017. } else {
  21018. plane.material.map = new THREE.Texture(media);
  21019. plane.material.map.needsUpdate = true;
  21020. this.editPlane.overlayType = 'photo';
  21021. }
  21022. plane.material.map.minFilter = THREE.LinearFilter;
  21023. this.useImgRatio(); //自适应比例
  21024. this.editPlane.file = file;
  21025. plane.material.opacity = 1;
  21026. plane.material.color = new THREE.Color(1, 1, 1);
  21027. plane.material.needsUpdate = true; // this.updateOverlayInfo(this.editPlane)
  21028. this.VideoManager.emit('videos/panel/updatePoster', media);
  21029. this.editPlane.frame && this.editPlane.frame.update({
  21030. mode: 'scale'
  21031. });
  21032. }
  21033. }, {
  21034. key: "getOverlaySavingInfo",
  21035. value: function getOverlaySavingInfo() {
  21036. //获取overlay保存信息
  21037. var overlay = this.editPlane;
  21038. if (!overlay.file && (!overlay.plane.material.map || !overlay.plane.material.map.image)) return; // 当设置limitToOnlyPano时,仅保存时的点位可视
  21039. //if (overlay.limitToOnlyPano == true) overlay.limitToOnlyPano = this.player.currentPano
  21040. var info = {
  21041. width: math$1.toPrecision(overlay.width, 4),
  21042. height: math$1.toPrecision(overlay.height, 4),
  21043. depth: math$1.toPrecision(overlay.depth, 4),
  21044. pos: math$1.toPrecision(overlay.position.toArray(), 4),
  21045. qua: math$1.toPrecision(overlay.quaternion.toArray(), 4),
  21046. reverse: overlay.scale.x < 0,
  21047. sid: overlay.sid,
  21048. media: [overlay.overlayType],
  21049. hide: overlay.isHidden,
  21050. floorIndex: overlay.floor.floorIndex,
  21051. frameType: overlay.frame && overlay.frame.type,
  21052. limitToOnlyPano: overlay.limitToOnlyPano && overlay.limitToOnlyPano.id
  21053. };
  21054. var _self = this;
  21055. return {
  21056. data: info,
  21057. type: overlay.modified == 'new' ? 1 : 0,
  21058. needSaveMedia: !overlay.info || overlay.file != overlay.info.file,
  21059. done: function done() {
  21060. try {
  21061. // if (overlay.modified == "delete") this.editPlane = null
  21062. overlay.modified = false;
  21063. overlay.visiblePanos = convertTool.getVisiblePano(overlay.position, _self.player.model);
  21064. _self.updateOverlayInfo(overlay);
  21065. } catch (e) {
  21066. console.error(e);
  21067. }
  21068. }
  21069. };
  21070. }
  21071. }, {
  21072. key: "disposeOverlay",
  21073. value: function disposeOverlay(overlay) {
  21074. //应用删除
  21075. if (overlay == this.player.OverlayManager.hoveringPlane) {
  21076. this.player.OverlayManager.hoverOverlay(null, 'soon');
  21077. }
  21078. if (overlay.plane.material.map) {
  21079. //清空video
  21080. var video = overlay.plane.material.map.image;
  21081. if (video && video.load) {
  21082. video.src = '';
  21083. video.load();
  21084. }
  21085. }
  21086. overlay.dispose();
  21087. overlay.modified = 'delete';
  21088. overlay.frame && overlay.frame.dispose();
  21089. }
  21090. }, {
  21091. key: "DeleteOverlay",
  21092. value: function DeleteOverlay(overlay, delFun) {
  21093. var _this4 = this;
  21094. //删除
  21095. delFun(overlay.sid, function () {
  21096. //删除成功后:
  21097. _this4.disposeOverlay(overlay);
  21098. _this4.controlSelectOverlay(null);
  21099. });
  21100. }
  21101. }]);
  21102. return EditOverlay;
  21103. }(EventEmitter);
  21104. function _createSuper$19(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$19(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  21105. function _isNativeReflectConstruct$19() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  21106. /**
  21107. * 数据存储对象
  21108. */
  21109. defineComponent('store', function () {
  21110. return /*#__PURE__*/function (_Emiter) {
  21111. _inherits(Store, _Emiter);
  21112. var _super = _createSuper$19(Store);
  21113. function Store() {
  21114. var _this;
  21115. _classCallCheck(this, Store);
  21116. _this = _super.call(this);
  21117. _this.__store = {};
  21118. return _this;
  21119. }
  21120. /**
  21121. * 获取指定key的数据
  21122. * @param {String} key 名称
  21123. * @param {Boolean} reload 是否强制重新加载
  21124. */
  21125. _createClass(Store, [{
  21126. key: "get",
  21127. value: function () {
  21128. var _get = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(key, reload) {
  21129. var data;
  21130. return regenerator.wrap(function _callee$(_context) {
  21131. while (1) {
  21132. switch (_context.prev = _context.next) {
  21133. case 0:
  21134. if (reload) {
  21135. this.$app.resource.reload = true;
  21136. }
  21137. if (!(this.__store[key] && !reload)) {
  21138. _context.next = 3;
  21139. break;
  21140. }
  21141. return _context.abrupt("return", this.__store[key]);
  21142. case 3:
  21143. data = null;
  21144. if (!(typeof this.$app.resource[key] === 'function')) {
  21145. _context.next = 8;
  21146. break;
  21147. }
  21148. _context.next = 7;
  21149. return this.$app.resource[key]();
  21150. case 7:
  21151. data = _context.sent;
  21152. case 8:
  21153. this.$app.resource.reload = false;
  21154. return _context.abrupt("return", data || this.__store[key]);
  21155. case 10:
  21156. case "end":
  21157. return _context.stop();
  21158. }
  21159. }
  21160. }, _callee, this);
  21161. }));
  21162. function get(_x, _x2) {
  21163. return _get.apply(this, arguments);
  21164. }
  21165. return get;
  21166. }()
  21167. }, {
  21168. key: "getAppImage",
  21169. value: function () {
  21170. var _getAppImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(path) {
  21171. return regenerator.wrap(function _callee2$(_context2) {
  21172. while (1) {
  21173. switch (_context2.prev = _context2.next) {
  21174. case 0:
  21175. if (!this.__store[path]) {
  21176. _context2.next = 2;
  21177. break;
  21178. }
  21179. return _context2.abrupt("return", this.__store[path]);
  21180. case 2:
  21181. _context2.next = 4;
  21182. return this.$app.resource.getAppImage(path);
  21183. case 4:
  21184. return _context2.abrupt("return", this.__store[path]);
  21185. case 5:
  21186. case "end":
  21187. return _context2.stop();
  21188. }
  21189. }
  21190. }, _callee2, this);
  21191. }));
  21192. function getAppImage(_x3) {
  21193. return _getAppImage.apply(this, arguments);
  21194. }
  21195. return getAppImage;
  21196. }()
  21197. }, {
  21198. key: "getUserImage",
  21199. value: function () {
  21200. var _getUserImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(path, reload) {
  21201. return regenerator.wrap(function _callee3$(_context3) {
  21202. while (1) {
  21203. switch (_context3.prev = _context3.next) {
  21204. case 0:
  21205. if (!(this.__store[path] && !reload)) {
  21206. _context3.next = 2;
  21207. break;
  21208. }
  21209. return _context3.abrupt("return", this.__store[path]);
  21210. case 2:
  21211. _context3.next = 4;
  21212. return this.$app.resource.getUserImage(path);
  21213. case 4:
  21214. return _context3.abrupt("return", this.__store[path]);
  21215. case 5:
  21216. case "end":
  21217. return _context3.stop();
  21218. }
  21219. }
  21220. }, _callee3, this);
  21221. }));
  21222. function getUserImage(_x4, _x5) {
  21223. return _getUserImage.apply(this, arguments);
  21224. }
  21225. return getUserImage;
  21226. }()
  21227. /**
  21228. * 获取指定key的值
  21229. * @param {String} key
  21230. * @returns any
  21231. */
  21232. }, {
  21233. key: "getValue",
  21234. value: function getValue(key) {
  21235. return this.__store[key];
  21236. }
  21237. /**
  21238. * 设置指定key的值并触发事件
  21239. * @param {String} key
  21240. * @returns any
  21241. */
  21242. }, {
  21243. key: "setValue",
  21244. value: function setValue(key, prop, value) {
  21245. if (typeof key === 'undefined' || typeof prop === 'undefined') {
  21246. return this;
  21247. }
  21248. var target = this.__store[key];
  21249. if (target) {
  21250. target[prop] = value;
  21251. this.emit(key, target, prop);
  21252. }
  21253. return this;
  21254. }
  21255. /**
  21256. * 设置指定key的数据
  21257. * @param {String} key 名称
  21258. * @param {Object} value 新数据
  21259. * @param {Boolean} isCache 是否缓存
  21260. */
  21261. }, {
  21262. key: "set",
  21263. value: function set(key, value) {
  21264. var isCache = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  21265. if (typeof key === 'undefined') {
  21266. return this;
  21267. }
  21268. if (isCache) {
  21269. this.__store[key] = value;
  21270. }
  21271. this.emit(key, value);
  21272. }
  21273. }]);
  21274. return Store;
  21275. }(tinyEmitter);
  21276. });
  21277. var DialogList3D = {
  21278. WalkManger: {
  21279. enter: "\u5355\u51FB<img src=\"".concat(texture.getImageURL('images/roam/roam_checked.png'), "\" crossorigin=\"anonymous\">\u8BBE\u7F6E\u9009\u4E2D\u70B9\u4F4D\u6F2B\u6E38\u53EF\u884C\u3002"),
  21280. firstPointLimit: '初始点位无法隐藏。',
  21281. link: '漫游到选中点位时,操作点位可以行走。',
  21282. unLink: '漫游到选中点位时,操作点位不可行走。',
  21283. show: '该点位已显示',
  21284. hide: '已隐藏该点位,漫游时将不再显示',
  21285. deactive: "\u5355\u51FB<img src=\"".concat(texture.getImageURL('images/roam/roam_visible.png'), "\" crossorigin=\"anonymous\">\u8BBE\u7F6E\u70B9\u4F4D\u6F2B\u6E38\u53EF\u884C\u3002"),
  21286. activeHidePoint: "\u8BE5\u70B9\u4F4D\u5DF2\u9690\u85CF\uFF0C\u70B9\u51FB<img src=\"".concat(texture.getImageURL('images/roam/roam_visible.png'), "\" crossorigin=\"anonymous\">\u53EF\u663E\u793A\u3002")
  21287. },
  21288. TagManger: {
  21289. unLink: '在该点位漫游时不再显示选中热点。'
  21290. }
  21291. };
  21292. function _createSuper$18(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$18(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  21293. function _isNativeReflectConstruct$18() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  21294. /*
  21295. 漫游可行 和 热点可视 都是利用连线来表示连接性。 借助线的name来判断是否是新增线或者删除的线。每次更换中心点或热点时保存临时信息,然后重新创建线(刷新状态)。
  21296. 复杂的点是要经常更新连接的footIcon的材质。不可见的pano就是没有neibourPanos的pano,所以漫游可行需要判断修改连接的两个pano的可见性的修改。
  21297. */
  21298. var panos, panoIndexes;
  21299. var Link = /*#__PURE__*/function () {
  21300. function Link(player) {
  21301. _classCallCheck(this, Link);
  21302. this.player = player;
  21303. this.setPanoVisible = false;
  21304. this.setMultiFloorPanoVisible = false;
  21305. this.setTagVisible = false;
  21306. this.footIcons;
  21307. this.actionIcons; //漫游可见性
  21308. this.activePano; //正在设置的漫游中心点
  21309. this.panoVLines = {}; //线条
  21310. this.panoVTemp; //修改后还没保存的临时数据
  21311. //热点可见性
  21312. this.tagVsetting; //正在设置的热点中心点
  21313. this.tagsVLines = {}; //线条
  21314. this.tagVTemp; //修改后还没保存的临时数据
  21315. this.linkToFloorPano; //设置楼层连接点时选择的另一层的连接点
  21316. panos = player.model.panos.list.filter(function (e) {
  21317. return e.isAligned();
  21318. });
  21319. panoIndexes = player.model.panos.index;
  21320. }
  21321. _createClass(Link, [{
  21322. key: "init",
  21323. value: function init() {
  21324. var _this = this;
  21325. if (this.inited) return;
  21326. this.footTex1 = texture.load(texture.getImageURL('images/End_256.png'));
  21327. this.footTex2 = texture.load(texture.getImageURL('images/End_unable_256.png'));
  21328. this.footTex1_v = texture.load(this.player.$app.resource.getAppURL('images/video_256.png'));
  21329. /* texture.getImageURL('images/video_256.png') */
  21330. this.footTex2_v = texture.load(this.player.$app.resource.getAppURL('images/video_unable_256.png')); // this.footTex3 = texture.load(texture.getImageURL('images/mutil_connect_normal256.png')),
  21331. // this.footTex4 = texture.load(texture.getImageURL('images/mutil_connect_unable256.png')),
  21332. this.footTex5 = texture.load(texture.getImageURL('images/mutil_connect_upper.png'));
  21333. this.footTex6 = texture.load(texture.getImageURL('images/mutil_connect_lower.png'));
  21334. this.actionVisiTex0 = texture.load(texture.getImageURL('images/roam/roam_invisible.png'));
  21335. this.actionVisiTex1 = texture.load(texture.getImageURL('images/roam/roam_visible.png'));
  21336. this.actionLinkTex0 = texture.load(texture.getImageURL('images/roam/roam_uncheck.png'));
  21337. this.actionLinkTex1 = texture.load(texture.getImageURL('images/roam/roam_checked.png'));
  21338. this.ifAllPanoNoNeighbor();
  21339. this.meshGroup = new THREE.Object3D();
  21340. this.meshGroup.name = 'setVisible-group';
  21341. this.player.model.add(this.meshGroup);
  21342. this.player.model.on('floor.changed', function (toFloor, mode) {
  21343. if (_this.setTagVisible || _this.setPanoVisible) {
  21344. //正在设置可视
  21345. _this.gotoFloor(toFloor.floorIndex);
  21346. }
  21347. });
  21348. this.player.on('collectIntersectMesh', function (meshes) {
  21349. //推送要intersect的mesh
  21350. if (_this.footIcons && (_this.setPanoVisible || _this.setTagVisible)) {
  21351. meshes.push.apply(meshes, _toConsumableArray(_this.footIcons));
  21352. }
  21353. });
  21354. this.player.on('judgeIntersect', function (intersect, e) {
  21355. //判断是否intersect了 footIcon
  21356. if (e.getConsumed() || _this.setPanoVisible || _this.setTagVisible) {
  21357. if (intersect && intersect.object.type == 'FootIcon'
  21358. /* && this.intersect.object.visible */
  21359. ) {
  21360. CursorDeal.add('hoverFootMarker');
  21361. } else {
  21362. CursorDeal.remove('hoverFootMarker');
  21363. }
  21364. e.consume();
  21365. }
  21366. });
  21367. this.inited = true;
  21368. }
  21369. }, {
  21370. key: "enterSet",
  21371. value: function enterSet(type) {
  21372. var _this2 = this;
  21373. this.init(); // toast: `单击设置选中点位漫游可行。`
  21374. this.player.$app.gui.toast({
  21375. event: 'DialogList3D.WalkManger.enter',
  21376. content: DialogList3D.WalkManger.enter,
  21377. showClose: true
  21378. });
  21379. if (type == 'panoVisible') {
  21380. if (!this.player.modeTran) {
  21381. //一开始就在这个页面
  21382. this.player.afterCModeFuc = function () {
  21383. _this2.enterSet(type);
  21384. };
  21385. return;
  21386. }
  21387. this.setPanoVisible = true;
  21388. this.player.flyoutType = 'beginSetPanoVisible'; // if (this.player.modeTran.split('-')[1] != 'floorplan') {
  21389. // setTimeout(this.beginSetPanoVisible.bind(this), 300)
  21390. // } else {
  21391. this.beginSetPanoVisible(); // }
  21392. setTimeout(function () {
  21393. //刚开始的页面就是设置漫游可行时飞出来角度很奇怪,但是延迟一下就不会,原因未知
  21394. _this2.player.flyToMode('floorplan', function () {
  21395. _this2.updateFootIconSize();
  21396. _this2.focusFloor();
  21397. });
  21398. }, 10);
  21399. } else {
  21400. this.beginSetTagVisible();
  21401. this.player.flyToMode('floorplan', function () {
  21402. _this2.focusFloor();
  21403. });
  21404. }
  21405. }
  21406. /**
  21407. * 用于选中和取消“全部漫游可行”
  21408. * @param {undefined | "all"} show
  21409. * @returns
  21410. */
  21411. }, {
  21412. key: "toggle",
  21413. value: function toggle(show) {
  21414. var _this3 = this;
  21415. //console.log('walk/Set ' + show)
  21416. var activePano = this.activePano;
  21417. if (!show) {
  21418. // 当前点位是初始点位时,禁止隐藏
  21419. var firstView = this.player.$app.core.get('Scene').firstView;
  21420. /* let p = this.getCurNeighbors(firstView.pano)-----被驳回,所以先注释
  21421. let firstViewWillHide = p.length == 1 && p.includes(activePano.id) */
  21422. if (firstView.pano == this.activePano
  21423. /* && this.checkHasNeighbor(firstView.pano, 'beforeCreateLine') */
  21424. ) {
  21425. // toast: `初始点位无法隐藏。`
  21426. this.player.$app.WalkManager.emit(this.checkLinkStatus());
  21427. this.player.$app.gui.toast({
  21428. event: 'DialogList3D.WalkManger.firstPointLimit',
  21429. content: DialogList3D.WalkManger.firstPointLimit,
  21430. showClose: true
  21431. });
  21432. return false;
  21433. } // 全部取消连接
  21434. for (var _i in this.panoVLines) {
  21435. //隐藏相当于点击所有连线的footIcon
  21436. /* if (firstViewWillHide && i == firstView.pano.id) { -----被驳回,所以先注释
  21437. this.player.$app.gui.toast({ event: 'DialogList3D.WalkManger.firstPointLimit', content: DialogList3D.WalkManger.firstPointLimit, showClose: true })
  21438. continue
  21439. } */
  21440. this.panoVLines[_i].visible && this.dealPanoVisible(_i);
  21441. }
  21442. } else {
  21443. var list = common.sortByScore(panos, [function (e) {
  21444. return e.isAligned();
  21445. }], [function (pano) {
  21446. return -pano.position.distanceTo(activePano.position);
  21447. }]);
  21448. if (list.length == 1) {
  21449. console.log('仅有一个漫游点');
  21450. return;
  21451. }
  21452. var okList = [];
  21453. var s = Math.max(-list[1].score * 2, 4); //i==1的一定显示
  21454. if (show == 'all') {
  21455. // 全部连接
  21456. okList = list.filter(function (data) {
  21457. return data.score != 0 && data.item.footIcon.visible;
  21458. }
  21459. /* || this.panoVLines[data.item.id] */
  21460. );
  21461. /* //包括原先连接的另一个楼 */
  21462. okList.forEach(function (e) {
  21463. return _this3.panoVLines[e.item.id] && _this3.panoVLines[e.item.id].visible || _this3.dealPanoVisible(e.item.id);
  21464. });
  21465. } else {
  21466. //连接周围一定距离内、到该点没有遮挡的pano
  21467. var ifBlock = function ifBlock(panoA, panoB) {
  21468. var A = panoA.position.clone();
  21469. var B = panoB.position.clone();
  21470. return convertTool.ifIntersectChunks(A, B, {});
  21471. };
  21472. for (var i = 1; i < list.length; i++) {
  21473. if (-list[i].score < s) {
  21474. if (ifBlock(activePano, list[i].item)) {
  21475. list[i].block = true; //有阻挡
  21476. }
  21477. list[i].good = true;
  21478. } else {
  21479. okList || (okList = list.filter(function (e) {
  21480. return e.good && !e.block;
  21481. })); //绝对可以使用的
  21482. if (okList.length < 2) {
  21483. if (!ifBlock(activePano, list[i].item)) {
  21484. if (okList.length == 0) {
  21485. okList.push(list[i]);
  21486. } else {
  21487. //1
  21488. var lastPos = okList[0].item.position.clone().sub(activePano.position).setY(0);
  21489. var thisPos = list[i].item.position.clone().sub(activePano.position).setY(0);
  21490. if (lastPos.angleTo(thisPos) > Math.PI / 2) {
  21491. console.log('再加一个 角度' + THREE.MathUtils.radToDeg(lastPos.angleTo(thisPos)));
  21492. break;
  21493. }
  21494. }
  21495. }
  21496. } else {
  21497. break;
  21498. }
  21499. }
  21500. }
  21501. if (okList.length == 0) {
  21502. //如果length为0,至少加一个pano, 虽然是遮挡的
  21503. okList.push(list[0]);
  21504. }
  21505. okList.forEach(function (e) {
  21506. return _this3.dealPanoVisible(e.pano.id);
  21507. });
  21508. } //console.log(okList)
  21509. }
  21510. this.checkFloorLinkStatus();
  21511. return true;
  21512. } //共同的
  21513. }, {
  21514. key: "setDisplay",
  21515. value: function setDisplay(state) {
  21516. //在设置时一直显示视频漫游点,即使它被隐藏了
  21517. //panos.forEach(pano => pano.updateMarkerVisible(true, this.player))
  21518. this.player.path.currentPanoMarker.mesh.visible = !state;
  21519. this.player.OverlayManager && this.player.OverlayManager.setGroupVisible(!state);
  21520. this.player.reticule.visible = !state;
  21521. this.player.emit('linkEditorSetVisible', state);
  21522. if (!state && this.footIcons) {
  21523. for (var i = 0; i < this.footIcons.length; i++) {
  21524. var s = this.footIcons[i].pano.label._oriScale;
  21525. if (s == void 0) break;
  21526. this.footIcons[i].pano.marker.add(this.footIcons[i].pano.label); //放回
  21527. this.footIcons[i].pano.label.scale.set(s, s, s);
  21528. delete this.footIcons[i].pano.label._oriScale;
  21529. this.footIcons[i].pano.label.sprite.material.color.set('#fff');
  21530. this.footIcons[i].pano.label.sprite.material.opacity = 1;
  21531. }
  21532. }
  21533. } //----------------漫游可见性---------------------------------
  21534. }, {
  21535. key: "beginSetPanoVisible",
  21536. value: function beginSetPanoVisible() {
  21537. this.panoVTemp = {};
  21538. if (this.player.currentPano.floor != this.player.model.currentFloor) {
  21539. //总是切到当前漫游点的楼层
  21540. this.player.gotoFloor(this.player.currentPano.floor.floorIndex);
  21541. }
  21542. this.SetOnePanoVisible(this.player.currentPano);
  21543. this.setDisplay(true); // UI根据是否emit过LinkStatus来判断是否编辑过,初次进入默认activePano时需要标明还未编辑
  21544. this.player.$app.WalkManager.emit(this.checkLinkStatus(), 'enter');
  21545. }
  21546. }, {
  21547. key: "SetOnePanoVisible",
  21548. value: function SetOnePanoVisible(pano) {
  21549. //点击某个pano后就对该pano点进行设置
  21550. if (this.activePano == pano) return;
  21551. this.activePano = pano; //记录正在修改的
  21552. this.delVisibleLines(); //删除线
  21553. this.showFootIcons(pano, true);
  21554. this.createPanoVisiLines(pano); //创线
  21555. }
  21556. }, {
  21557. key: "checkPanoVisiChange",
  21558. value: function checkPanoVisiChange() {
  21559. if (Object.keys(this.panoVTemp).length) return true;
  21560. for (var r in this.panoVLines) {
  21561. var line = this.panoVLines[r];
  21562. if (line.name.indexOf('new') > -1 && line.visible) {
  21563. //新设置为visible且没有取消
  21564. return true;
  21565. } else if (line.name.indexOf('new') == -1 && !line.visible) {
  21566. //旧的且已经取消
  21567. return true;
  21568. }
  21569. }
  21570. return false;
  21571. }
  21572. }, {
  21573. key: "saveLastPanoVi",
  21574. value: function saveLastPanoVi(pano) {
  21575. pano = pano || this.activePano; //xzw add on 2023.6.1
  21576. if (!pano) return; //保存刚设置过的pano
  21577. var change = [];
  21578. for (var r in this.panoVLines) {
  21579. //所有修改信息都藏在线里~
  21580. var line = this.panoVLines[r];
  21581. if (line.name.indexOf('new') > -1 && line.visible) {
  21582. //新设置为visible且没有取消
  21583. change.push({
  21584. type: 'add',
  21585. id: r
  21586. });
  21587. } else if (line.name.indexOf('new') == -1 && !line.visible) {
  21588. //旧的且已经取消
  21589. change.push({
  21590. type: 'sub',
  21591. id: r
  21592. });
  21593. }
  21594. }
  21595. if (change.length) {
  21596. var panoId = pano.id; //(pano && pano.id) || this.activePano.id
  21597. this.savePanoVisiChange(panoId, change);
  21598. }
  21599. }
  21600. }, {
  21601. key: "savePanoVisiChange",
  21602. value: function savePanoVisiChange(panoId, change) {
  21603. //添加双向的neighbour: 将修改写入panoVTemp数据
  21604. var self = this.searchNeib(panoId);
  21605. var seeMarkers_self = self.seeMarkers;
  21606. var neighbourUUIDs_self = self.neighbourUUIDs;
  21607. var neighbourPanos_self = self.neighbourPanos;
  21608. for (var i = 0; i < change.length; i++) {
  21609. var other = this.searchNeib(change[i].id);
  21610. var seeMarkers = other.seeMarkers;
  21611. var neighbourUUIDs = other.neighbourUUIDs;
  21612. var neighbourPanos = other.neighbourPanos;
  21613. if (change[i].type == 'add') {
  21614. seeMarkers.push(panoId);
  21615. neighbourUUIDs.push(panoId);
  21616. neighbourPanos[panoId] = true;
  21617. seeMarkers_self.push(change[i].id);
  21618. neighbourUUIDs_self.push(change[i].id);
  21619. neighbourPanos_self[change[i].id] = true;
  21620. } else {
  21621. var index = seeMarkers.indexOf(panoId);
  21622. index > -1 && seeMarkers.splice(index, 1);
  21623. var index = neighbourUUIDs.indexOf(panoId);
  21624. index > -1 && neighbourUUIDs.splice(index, 1);
  21625. neighbourPanos[panoId] = false;
  21626. var index = seeMarkers_self.indexOf(change[i].id);
  21627. index > -1 && seeMarkers_self.splice(index, 1);
  21628. var index = neighbourUUIDs_self.indexOf(change[i].id);
  21629. index > -1 && neighbourUUIDs_self.splice(index, 1);
  21630. neighbourPanos_self[change[i].id] = false;
  21631. }
  21632. this.panoVTemp[change[i].id] = {
  21633. //后面两个是作为保存到后台的数据存储,临时需要用到的是第一个
  21634. neighbourPanos: neighbourPanos,
  21635. seeMarkers: seeMarkers,
  21636. neighbourUUIDs: neighbourUUIDs
  21637. };
  21638. }
  21639. this.panoVTemp[panoId] = {
  21640. //加上自己
  21641. neighbourPanos: neighbourPanos_self,
  21642. seeMarkers: seeMarkers_self,
  21643. neighbourUUIDs: neighbourUUIDs_self
  21644. };
  21645. }
  21646. }, {
  21647. key: "pauseSetPanoVisible",
  21648. value: function pauseSetPanoVisible(type, currentFloor) {
  21649. var _this4 = this;
  21650. //暂停 因为点击了保存设置 但没有退出设置
  21651. if (!this.setPanoVisible) return;
  21652. if (type == 'unsaved') {
  21653. //中途点击pano从而停止一个热点的设置
  21654. this.saveLastPanoVi();
  21655. } else {
  21656. this.panoVTemp = {}; //清空数据
  21657. this.startEditPano = null;
  21658. }
  21659. this.delVisibleLines();
  21660. this.activePano = null;
  21661. this.showFootIcons(null, true, currentFloor); //清空选择
  21662. //这句要放在this.activePano = null后。 根据可见性更改透明度
  21663. panos.forEach(function (pano) {
  21664. return _this4.changeIconVisiState(pano.footIcon, _this4.checkHasNeighbor(pano));
  21665. });
  21666. } //按理说改变了neighbourPano,tag的初始visible也要改。但是这样还要考虑已经改过的tag。。很麻烦
  21667. }, {
  21668. key: "finishSetPanoVisible",
  21669. value: function finishSetPanoVisible() {
  21670. //结束 退出这个设置
  21671. if (!this.setPanoVisible) return; //否则会加多个侦听
  21672. this.setPanoVisible = false;
  21673. this.hideFootIcons();
  21674. this.delVisibleLines();
  21675. this.recoverAllState2();
  21676. this.activePano = null;
  21677. this.startEditPano = null;
  21678. this.panoVTemp = {};
  21679. this.player.flyoutType = null;
  21680. this.setDisplay(false);
  21681. CursorDeal.remove('hoverFootMarker');
  21682. } //最佳推荐操作顺序: 先设置pano可见性 再创建热点 这样热点的visible正确些,否则之后再设置热点可见性会改更多
  21683. }, {
  21684. key: "savePanoVisibles",
  21685. value: function savePanoVisibles(fuc) {
  21686. //保存
  21687. if (this.activePano) this.saveLastPanoVi(this.activePano); //获取最后设置的那个热点的改动
  21688. var PanoData = [];
  21689. for (var i in this.panoVTemp) {
  21690. PanoData.push({
  21691. //希望算法部不会更改index排序,或者更改后能将visible信息一并更改
  21692. panoID: i,
  21693. visibles: this.turnToPanoIndex(this.panoVTemp[i].seeMarkers),
  21694. visibles3: this.turnToPanoIndex(this.panoVTemp[i].neighbourUUIDs)
  21695. });
  21696. }
  21697. if (PanoData.length == 0) {
  21698. //没改变
  21699. console.warn('PanoLink没有改变');
  21700. return;
  21701. }
  21702. return PanoData;
  21703. }
  21704. }, {
  21705. key: "afterSavePanoVisibles",
  21706. value: function afterSavePanoVisibles() {
  21707. var _this5 = this;
  21708. //实施:
  21709. for (var i in this.panoVTemp) {
  21710. var pano = panoIndexes[i];
  21711. pano.seeMarkers = this.panoVTemp[i].seeMarkers;
  21712. pano.neighbourUUIDs = this.panoVTemp[i].neighbourUUIDs;
  21713. pano.neighbourPanos = this.panoVTemp[i].neighbourPanos;
  21714. }
  21715. var self = this;
  21716. if (!this.checkHasNeighbor(this.player.currentPano)) {
  21717. //currentPano变为孤立点 就要换一个防止飞入
  21718. var list = common.sortByScore(panos, [function (pano) {
  21719. return _this5.checkHasNeighbor(pano);
  21720. }], [function (pano) {
  21721. return -pano.position.distanceTo(self.player.currentPano.position);
  21722. }]);
  21723. if (list && list.length) {
  21724. this.player.currentPano = list[0].item; //找最近的一非孤立点
  21725. this.noPanoHasNeighbor = false; //更新状态
  21726. } else {
  21727. this.noPanoHasNeighbor = true; //更新状态
  21728. }
  21729. } else {
  21730. this.noPanoHasNeighbor = false; //更新状态
  21731. }
  21732. this.pauseSetPanoVisible();
  21733. this.player.$app.WalkManager.emit('walkManager.deactive');
  21734. this.updateFootIconSize(); //更新一下center大小 写在最后
  21735. }
  21736. }, {
  21737. key: "searchNeib",
  21738. value: function searchNeib(panoId) {
  21739. //寻找某pano的相关neighbour 可能是修改过的
  21740. var o = {};
  21741. if (this.panoVTemp[panoId]) {
  21742. o.seeMarkers = this.panoVTemp[panoId].seeMarkers;
  21743. o.neighbourUUIDs = this.panoVTemp[panoId].neighbourUUIDs;
  21744. o.neighbourPanos = this.panoVTemp[panoId].neighbourPanos;
  21745. } else {
  21746. o.seeMarkers = panoIndexes[panoId].seeMarkers.slice(0);
  21747. o.neighbourUUIDs = panoIndexes[panoId].neighbourUUIDs.slice(0);
  21748. o.neighbourPanos = common.CloneObject(panoIndexes[panoId].neighbourPanos);
  21749. }
  21750. return o;
  21751. }
  21752. }, {
  21753. key: "turnToPanoIndex",
  21754. value: function turnToPanoIndex(panoArr) {
  21755. var array = [];
  21756. for (var i = 0; i < panoArr.length; i++) {
  21757. var pano = panoIndexes[panoArr[i]];
  21758. var index = panos.indexOf(pano);
  21759. array.push(index);
  21760. }
  21761. return array;
  21762. } //========热点可见性==============
  21763. }, {
  21764. key: "beginSetTagVisible",
  21765. value: function beginSetTagVisible() {
  21766. if (this.setTagVisible) return;
  21767. this.setTagVisible = true;
  21768. this.tagVTemp = {}; //临时存储改动的tag的visible
  21769. this.setDisplay(true);
  21770. }
  21771. }, {
  21772. key: "SetOneTagVisible",
  21773. value: function SetOneTagVisible(tag) {
  21774. //点击某个热点后就对该热点进行设置,或者在热点修改时对其进行设置
  21775. if (this.tagVsetting == tag) return;
  21776. if (this.tagVsetting) {
  21777. this.saveLastTagVi(this.tagVsetting);
  21778. }
  21779. this.tagVsetting = tag; //记录正在修改的
  21780. this.delVisibleLines(); //删除线
  21781. this.showFootIcons();
  21782. this.createTagVisiLines(tag); //创线
  21783. this.updateFootIconSize(); //更新一下大小,尤其是上次换了中心点然后退出又进入但是镜头没有变化的话
  21784. this.player.$app.TagManager.emit(this.checkTagLinkStatus());
  21785. }
  21786. }, {
  21787. key: "checkTagVisiChange",
  21788. value: function checkTagVisiChange() {
  21789. if (Object.keys(this.tagVTemp).length) return true;
  21790. for (var r in this.tagsVLines) {
  21791. var line = this.tagsVLines[r];
  21792. if (line.name.indexOf('new') > -1 && line.visible) {
  21793. //新设置为visible且没有取消
  21794. return true;
  21795. } else if (line.name.indexOf('new') == -1 && !line.visible) {
  21796. //旧的且已经取消
  21797. return true;
  21798. }
  21799. }
  21800. return false;
  21801. }
  21802. }, {
  21803. key: "checkTagLinkStatus",
  21804. value: function checkTagLinkStatus() {
  21805. var visibleLines = Object.values(this.tagsVLines).filter(function (line) {
  21806. return line.visible;
  21807. });
  21808. var visibleIcon = this.footIcons.filter(function (icon) {
  21809. return icon.visible;
  21810. }); //是连接还是不连接
  21811. if (visibleIcon.length == visibleLines.length) {
  21812. // 全部连接
  21813. return 'tagManager.linkAll';
  21814. } else if (visibleLines.length == 0) {
  21815. // 没有连接
  21816. return 'tagManager.linkNone';
  21817. } else {
  21818. // 部分连接
  21819. return 'tagManager.linkSome';
  21820. }
  21821. }
  21822. }, {
  21823. key: "saveLastTagVi",
  21824. value: function saveLastTagVi() {
  21825. //保存刚设置过的tag
  21826. var change = false;
  21827. var newVPs = this.tagVTemp[this.tagVsetting.sid] || this.tagVsetting.visiblePanos.slice(0);
  21828. for (var r in this.tagsVLines) {
  21829. var line = this.tagsVLines[r];
  21830. if (line.name.indexOf('new') > -1 && line.visible) {
  21831. //新设置为visible且没有取消
  21832. newVPs.push(panoIndexes[r]);
  21833. change = true; //console.log("add: "+r)
  21834. } else if (line.name.indexOf('new') == -1 && !line.visible) {
  21835. //旧的且已经取消
  21836. var i = newVPs.map(function (pano) {
  21837. return pano.id;
  21838. }).indexOf(r);
  21839. if (i == -1) {
  21840. console.log('visiblePanos删除error');
  21841. continue;
  21842. }
  21843. newVPs.splice(i, 1);
  21844. change = true; //console.log("sub: "+r)
  21845. }
  21846. }
  21847. if (change) {
  21848. this.tagVTemp[this.tagVsetting.sid] = newVPs;
  21849. }
  21850. }
  21851. }, {
  21852. key: "pauseSetTagVisible",
  21853. value: function pauseSetTagVisible(type) {
  21854. //pc保存后删除连线 但还在继续设置 点选热点即开始
  21855. if (!this.setTagVisible || !this.tagVsetting) return;
  21856. if (type == 'unsaved') {
  21857. //中途点击pano从而停止一个热点的设置
  21858. this.saveLastTagVi(this.tagVsetting);
  21859. } else {
  21860. this.tagVTemp = {}; //清空数据
  21861. }
  21862. this.delVisibleLines();
  21863. this.hideFootIcons();
  21864. this.tagVsetting = null;
  21865. }
  21866. }, {
  21867. key: "finishSetTagVisible",
  21868. value: function finishSetTagVisible() {
  21869. if (!this.setTagVisible) return;
  21870. this.pauseSetTagVisible();
  21871. this.setTagVisible = false;
  21872. this.setDisplay(false);
  21873. }
  21874. }, {
  21875. key: "saveTagVisibles",
  21876. value: function saveTagVisibles() {
  21877. //保存到服务器
  21878. if (this.tagVsetting) this.saveLastTagVi(this.tagVsetting); //获取最后设置的那个热点的改动
  21879. //可能出现数据没变但保存的情况。比如先改变了然后切换别的热点但切换回来时又改回来。
  21880. var tags = [];
  21881. for (var i in this.tagVTemp) {
  21882. tags.push({
  21883. sid: i,
  21884. value: this.tagVTemp[i].filter(function (pano) {
  21885. return !!pano;
  21886. }).map(function (pano) {
  21887. return pano.id;
  21888. }) //turnToPanoIndex(this.tagVTemp[i])
  21889. });
  21890. }
  21891. return tags;
  21892. }
  21893. }, {
  21894. key: "afterSaveTagVisibles",
  21895. value: function afterSaveTagVisibles() {
  21896. this.finishSetTagVisible(); //还是保存完直接结束吧,因为现在热点可视不放在单独的设置页面了
  21897. } //------------visibles--------tag--------------------------------
  21898. }, {
  21899. key: "createTagVisiLines",
  21900. value: function createTagVisiLines(tag) {
  21901. var _this6 = this;
  21902. // 热点可见性线条
  21903. var visibleList = this.tagVTemp[tag.sid] || tag.visiblePanos;
  21904. visibleList.forEach(function (pano) {
  21905. /* if (pano && pano.floor.floorIndex == this.player.model.currentFloor.floorIndex) */
  21906. _this6.createTagSingleLine(pano, 'old', tag);
  21907. });
  21908. }
  21909. }, {
  21910. key: "createTagSingleLine",
  21911. value: function createTagSingleLine(pano, type, tag) {
  21912. var line = LineDraw.createLine([pano.floorPosition.clone(), tag.position.clone()], {
  21913. color: Colors.green
  21914. });
  21915. this.meshGroup.add(line);
  21916. line.name = 'tagVL-' + type + '-' + pano.id;
  21917. this.tagsVLines[pano.id] = line;
  21918. line.material.opacity = pano.floor.floorIndex == this.player.model.currentFloor.floorIndex ? 1 : 0.4;
  21919. this.changeIconLinkState(panoIndexes[pano.id].footIcon, 'linked');
  21920. }
  21921. }, {
  21922. key: "dealTagVisible",
  21923. value: function dealTagVisible(tag, panoName) {
  21924. //外部调用
  21925. if (this.tagsVLines[panoName]) {
  21926. this.tagsVLines[panoName].visible = !this.tagsVLines[panoName].visible;
  21927. this.changeIconLinkState(panoIndexes[panoName].footIcon, this.tagsVLines[panoName].visible ? 'linked' : false);
  21928. if (!this.tagsVLines[panoName].visible) this.player.$app.gui.toast({
  21929. event: 'DialogList3D.TagManger.unLink',
  21930. content: DialogList3D.TagManger.unLink,
  21931. showClose: true
  21932. });
  21933. } else {
  21934. this.createTagSingleLine(panoIndexes[panoName], 'new', tag);
  21935. }
  21936. this.player.$app.TagManager.emit(this.checkTagLinkStatus());
  21937. }
  21938. }, {
  21939. key: "setTagHideAll",
  21940. value: function setTagHideAll(tag) {
  21941. var _this7 = this;
  21942. //外部调用
  21943. Object.keys(this.tagsVLines).forEach(function (panoName) {
  21944. _this7.tagsVLines[panoName].visible = false;
  21945. _this7.changeIconLinkState(panoIndexes[panoName].footIcon, false);
  21946. });
  21947. }
  21948. }, {
  21949. key: "setTagShowAll",
  21950. value: function setTagShowAll(tag) {
  21951. var _this8 = this;
  21952. //外部调用
  21953. this.footIcons.filter(function (icon) {
  21954. return icon.visible;
  21955. }).forEach(function (icon) {
  21956. var panoName = icon.pano.id;
  21957. if (_this8.tagsVLines[panoName]) {
  21958. _this8.tagsVLines[panoName].visible = true;
  21959. _this8.changeIconLinkState(panoIndexes[panoName].footIcon, 'linked');
  21960. } else {
  21961. _this8.createTagSingleLine(panoIndexes[panoName], 'new', tag);
  21962. }
  21963. });
  21964. }
  21965. }, {
  21966. key: "delVisibleLines",
  21967. value: function delVisibleLines() {
  21968. //xzw add 所有线都删除
  21969. for (var i in this.tagsVLines) {
  21970. this.tagsVLines[i].geometry.dispose();
  21971. this.tagsVLines[i].material.dispose();
  21972. this.meshGroup.remove(this.tagsVLines[i]);
  21973. delete this.tagsVLines[i];
  21974. }
  21975. for (var i in this.panoVLines) {
  21976. this.panoVLines[i].geometry.dispose();
  21977. this.panoVLines[i].material.dispose();
  21978. this.meshGroup.remove(this.panoVLines[i]);
  21979. delete this.panoVLines[i];
  21980. }
  21981. } //--------panoVisible
  21982. }, {
  21983. key: "createPanoVisiLines",
  21984. value: function createPanoVisiLines(pano, isAllFloor) {
  21985. // pano可见性线条
  21986. var neighbours = this.panoVTemp[pano.id] && this.panoVTemp[pano.id].neighbourPanos || pano.neighbourPanos;
  21987. for (var r in neighbours) {
  21988. if (neighbours[r] && r != pano.id && !r.includes('view360_')) {
  21989. // if (panoIndexes[r].floorIndex != pano.floorIndex && !isAllFloor) continue // 多楼层连接点不显示虚线
  21990. this.createPanoSingleLine(pano, 'old', r);
  21991. }
  21992. }
  21993. }
  21994. }, {
  21995. key: "createPanoSingleLine",
  21996. value: function createPanoSingleLine(pano, type, id) {
  21997. //pano是中心
  21998. var pano2 = panoIndexes[id];
  21999. if (pano2.panoType) return; // 过滤掉场景关联pano
  22000. var p2 = pano2.floorPosition.clone();
  22001. /* .sub(objects.player.model.position) */
  22002. var line = LineDraw.createLine([pano.floorPosition.clone()
  22003. /* .sub(this.position) */
  22004. , p2], {
  22005. color: Colors.green,
  22006. deshed: pano2.floorIndex != pano.floorIndex
  22007. });
  22008. this.meshGroup.add(line);
  22009. line.name = 'PanoVL-' + type + '-' + id;
  22010. pano2.floorIndex != pano.floorIndex && (line.material.opacity = 0.5); //连接到另一楼层的pano
  22011. this.panoVLines[id] = line;
  22012. if (this.activePano) {
  22013. if (pano2.floorIndex != pano.floorIndex) this.changeIconLinkState(panoIndexes[id].footIcon, 'otherFloorLink');else this.changeIconLinkState(panoIndexes[id].footIcon, 'linked');
  22014. }
  22015. }
  22016. }, {
  22017. key: "dealPanoVisible",
  22018. value: function dealPanoVisible(panoId, icon) {
  22019. var _this9 = this;
  22020. //外部调用
  22021. if (this.setMultiFloorPanoVisible) {
  22022. // 设置多楼层连接点时(点击的icon都是要添加的,无法取消)
  22023. if (this.linkToFloorPano) {
  22024. //取消旧的
  22025. var lastIcon = this.linkToFloorPano.footIcon;
  22026. this.changeIconLinkState(lastIcon, false);
  22027. var isLinkingFloor = this.changeFloorIconState(lastIcon);
  22028. if (!isLinkingFloor) {
  22029. lastIcon.status = 'visible';
  22030. lastIcon.material.uniforms.map.value = this.linkToFloorPano.hasVideo ? this.footTex1_v : this.footTex1;
  22031. }
  22032. } else {
  22033. this.player.$app.WalkManager.emit('walkManager.multiFloorLinking', true); //解锁确定按钮
  22034. }
  22035. this.linkToFloorPano = icon.pano;
  22036. this.changeIconLinkState(icon, 'center');
  22037. if (this.setMultiFloorPanoVisible == 'upper') {
  22038. // 下楼点
  22039. icon.status = 'floor';
  22040. icon.material.uniforms.map.value = this.footTex6;
  22041. } else {
  22042. icon.status = 'floor';
  22043. icon.material.uniforms.map.value = this.footTex5;
  22044. }
  22045. } else if (icon && icon.type == 'FootIcon') {
  22046. //切换activePano
  22047. if (this.activePano) {
  22048. if (panoId == this.activePano.id) {
  22049. if (!this.startEditPano) this.startEditPano = this.activePano; // 用于撤销时激活修改之前的pano(deactive,link,unlink)
  22050. // 关闭当前pano设置
  22051. this.player.$app.WalkManager.emit('walkManager.deactive');
  22052. this.pauseSetPanoVisible('unsaved'); // 将actionIcon切换到是否可视(眼睛模式)
  22053. this.actionIcons.forEach(function (i) {
  22054. return i.material.map = i.footIcon.status == 'invisible' ? _this9.actionVisiTex0 : _this9.actionVisiTex1;
  22055. }); // toast: `单击设置点位漫游可行。`
  22056. this.player.$app.gui.toast({
  22057. event: 'DialogList3D.WalkManger.deactive',
  22058. content: DialogList3D.WalkManger.deactive
  22059. });
  22060. } else {
  22061. this.lastFloorActivePano = null;
  22062. this.pauseSetPanoVisible('unsaved');
  22063. this.SetOnePanoVisible(panoIndexes[panoId]);
  22064. this.player.$app.WalkManager.emit('walkManager.active', this.checkLinkStatus());
  22065. }
  22066. } else {
  22067. // 激活当前pano设置
  22068. this.lastFloorActivePano = null;
  22069. this.SetOnePanoVisible(panoIndexes[panoId]);
  22070. this.player.$app.WalkManager.emit('walkManager.active', this.checkLinkStatus());
  22071. }
  22072. } else if (!icon || icon.type == 'ActionIcon') {
  22073. if (this.activePano) {
  22074. // 连接 或 取消连接
  22075. var link;
  22076. if (this.panoVLines[panoId]) {
  22077. this.panoVLines[panoId].visible = !this.panoVLines[panoId].visible;
  22078. link = this.panoVLines[panoId].visible;
  22079. this.changeIconLinkState(panoIndexes[panoId].footIcon, panoIndexes[panoId].footIcon.visible ? this.panoVLines[panoId].visible ? 'linked' : false : 'otherFloorLink');
  22080. } else {
  22081. this.createPanoSingleLine(this.activePano, 'new', panoId);
  22082. link = true;
  22083. }
  22084. if (!this.startEditPano) this.startEditPano = this.activePano; // 用于撤销时激活修改之前的pano(deactive,link,unlink)
  22085. if (link) {
  22086. // 如果进行连接,直接判断该点是可见的(有附近点),(不能通过checkHasNeighbor来判断,因为新增的线条可能不在它的neighbour中
  22087. this.changeIconVisiState(panoIndexes[panoId].footIcon, true);
  22088. this.changeIconVisiState(this.activePano.footIcon, true); // 只当点击ActionIcon时才toast
  22089. if (icon && icon.type == 'ActionIcon') {
  22090. this.player.$app.WalkManager.emit(this.checkLinkStatus());
  22091. }
  22092. } else {
  22093. // 如果取消连接,则需要checkHasNeighbor
  22094. var firstViewPano = this.player.$app.core.get('Scene').firstView.pano;
  22095. if (panoIndexes[panoId].floorIndex != this.activePano.floorIndex) {
  22096. //取消楼层连接点 xzw
  22097. panoIndexes[panoId].footIcon.visible = false;
  22098. } else {
  22099. var pickPanoCheck = this.checkHasNeighbor(panoIndexes[panoId]);
  22100. this.changeIconVisiState(panoIndexes[panoId].footIcon, pickPanoCheck);
  22101. }
  22102. var activePanoCheck = this.checkHasNeighbor(this.activePano); //let activePanoCheck2 = this.checkHasNeighbor(panoIndexes[panoId]) -----被驳回,所以先注释
  22103. this.changeIconVisiState(this.activePano.footIcon, activePanoCheck);
  22104. if (icon && icon.type == 'ActionIcon') {
  22105. this.player.$app.WalkManager.emit(this.checkLinkStatus());
  22106. if (!activePanoCheck && this.activePano == firstViewPano
  22107. /* || (!activePanoCheck2 && panoIndexes[panoId] == firstViewPano)-----被驳回,所以先注释 */
  22108. ) {
  22109. // toast: `初始点位无法隐藏。`
  22110. this.player.$app.gui.toast({
  22111. event: 'DialogList3D.WalkManger.firstPointLimit',
  22112. content: DialogList3D.WalkManger.firstPointLimit
  22113. });
  22114. this.dealPanoVisible(panoId, icon); //还原
  22115. return;
  22116. }
  22117. if (!activePanoCheck) {
  22118. this.player.$app.gui.toast({
  22119. event: 'DialogList3D.WalkManger.hide',
  22120. content: DialogList3D.WalkManger.hide
  22121. });
  22122. }
  22123. }
  22124. }
  22125. } else {
  22126. // 显示 或 隐藏
  22127. // // var neighbours = (this.panoVTemp[panoIndexes[panoId].id] && this.panoVTemp[panoIndexes[panoId].id].neighbourPanos) || panoIndexes[panoId].neighbourPanos
  22128. // // let neigbIds = Object.keys(neighbours)
  22129. if (icon.footIcon.status == 'invisible') {
  22130. //变为可见点
  22131. if (this.panoVTemp[panoId]) {
  22132. // 未保存 还原保存前的neighbourPanos
  22133. var neighbourIds = Object.keys(this.panoVTemp[panoId].neighbourPanos).filter(function (id) {
  22134. return !id.includes('view360_') && id != panoId;
  22135. });
  22136. var a = neighbourIds.filter(function (id) {
  22137. return _this9.checkHasNeighbor(panoIndexes[id]);
  22138. }); //尽量不选择已经隐藏了的,否则手动隐藏了又会被显示 bugID=36883#
  22139. if (a.length) neighbourIds = a;else neighbourIds = neighbourIds.slice(0, 1);
  22140. var change = [];
  22141. neighbourIds.forEach(function (nId) {
  22142. change.push({
  22143. type: 'add',
  22144. id: nId
  22145. });
  22146. });
  22147. this.savePanoVisiChange(panoId, change);
  22148. } else {
  22149. // 已保存,自动计算neighbourPanos(有可能变为楼层连接点)
  22150. var _neighbourIds = convertTool.getVisiblePano(panoIndexes[panoId].position, this.player.model).map(function (pano) {
  22151. return pano.id;
  22152. }).filter(function (id) {
  22153. return id != panoId;
  22154. });
  22155. if (_neighbourIds.length == 0) {
  22156. //随便选一个近的点吧(没有验证过)
  22157. var list = common.sortByScore(panos, [function (e) {
  22158. return e.isAligned();
  22159. }], [function (pano) {
  22160. return -pano.position.distanceTo(panoIndexes[panoId].position);
  22161. }]);
  22162. var pano0 = list.map(function (e) {
  22163. return e.item;
  22164. }).find(function (pano) {
  22165. return _this9.checkHasNeighbor(pano);
  22166. }); //尽量不选择已经隐藏了的
  22167. if (pano0) _neighbourIds = [pano0.id];else _neighbourIds = [list[0].item.id];
  22168. } else {
  22169. var _a = _neighbourIds.filter(function (id) {
  22170. return _this9.checkHasNeighbor(panoIndexes[id]);
  22171. }); //尽量不选择已经隐藏了的,否则手动隐藏了又会被显示 bugID=36883#
  22172. if (_a.length) _neighbourIds = _a;else _neighbourIds = _neighbourIds.slice(0, 1);
  22173. }
  22174. var _change = [];
  22175. _neighbourIds.forEach(function (nId) {
  22176. return _change.push({
  22177. type: 'add',
  22178. id: nId
  22179. });
  22180. });
  22181. this.savePanoVisiChange(panoId, _change);
  22182. } // toast: '该点位已显示'
  22183. this.player.$app.gui.toast({
  22184. event: 'DialogList3D.WalkManger.show',
  22185. content: DialogList3D.WalkManger.show
  22186. });
  22187. } else {
  22188. //变为不可见点
  22189. var firstView = this.player.$app.core.get('Scene').firstView;
  22190. var isHideFirstView = firstView.pano.footIcon == icon.footIcon;
  22191. if (isHideFirstView) {
  22192. // toast: `初始点位无法隐藏。`
  22193. this.player.$app.gui.toast({
  22194. event: 'DialogList3D.WalkManger.firstPointLimit',
  22195. content: DialogList3D.WalkManger.firstPointLimit
  22196. });
  22197. return false;
  22198. }
  22199. /* let p = this.getCurNeighbors(firstView.pano) -----被驳回,所以先注释
  22200. let firstViewWillHide = p.length == 1 && p.includes(panoId) */
  22201. this.createPanoVisiLines(panoIndexes[panoId], true);
  22202. Object.values(this.panoVLines).forEach(function (line) {
  22203. /* if (firstViewWillHide && line.name.split('-')[2] == firstView.pano.id) {-----被驳回,所以先注释
  22204. this.player.$app.gui.toast({ event: 'DialogList3D.WalkManger.firstPointLimit', content: DialogList3D.WalkManger.firstPointLimit })
  22205. return
  22206. } */
  22207. line.visible = false;
  22208. }); // toast: '已隐藏该点位,漫游时将不再显示'
  22209. /* firstViewWillHide || */
  22210. this.player.$app.gui.toast({
  22211. event: 'DialogList3D.WalkManger.hide',
  22212. content: DialogList3D.WalkManger.hide
  22213. });
  22214. this.saveLastPanoVi(panoIndexes[panoId]); // this.pauseSetPanoVisible('unsaved')
  22215. this.delVisibleLines();
  22216. }
  22217. panos.forEach(function (pano) {
  22218. return _this9.changeIconVisiState(pano.footIcon, _this9.checkHasNeighbor(pano));
  22219. });
  22220. }
  22221. }
  22222. this.updateFootIconSize();
  22223. }
  22224. }, {
  22225. key: "showFootIcons",
  22226. value: function showFootIcons(centerPano, isPanovisible, currentFloor) {
  22227. var _this10 = this;
  22228. if (!this.footIcons) {
  22229. this.footIcons = [];
  22230. this.actionIcons = [];
  22231. var scale = 0.4;
  22232. scale *= 40 / Math.sqrt(Math.min(this.player.domElement.clientWidth, this.player.domElement.clientHeight)); //屏幕越小,放得越大
  22233. scale = THREE.MathUtils.clamp(scale, 0.3, 0.7); // console.error("scale"+scale)
  22234. var geo = new THREE.PlaneGeometry(scale, scale, 1, 1);
  22235. var actionGeo = geo.clone();
  22236. actionGeo.scale(0.5, 0.5, 0.5);
  22237. panos.forEach(function (pano) {
  22238. var foot = new FootIcon(geo, pano);
  22239. foot.material.uniforms.map.value = pano.hasVideo ? _this10.footTex1_v : _this10.footTex1;
  22240. foot.visible = false;
  22241. pano.footIcon = foot;
  22242. var actionIcon = new ActionIcon(foot, actionGeo, pano);
  22243. actionIcon.material.map = _this10.actionLinkTex0;
  22244. foot.actionIcon = actionIcon;
  22245. _this10.meshGroup.add(foot);
  22246. foot.add(actionIcon);
  22247. _this10.footIcons.push(foot);
  22248. _this10.actionIcons.push(actionIcon);
  22249. });
  22250. }
  22251. currentFloor = currentFloor || this.player.model.currentFloor;
  22252. panos.forEach(function (pano) {
  22253. if (pano.label.parent != pano.footIcon) {
  22254. pano.label._oriScale = pano.label.scale.x;
  22255. var numS = 1.65 * pano.label.scale.x;
  22256. pano.label.scale.set(numS, numS, numS);
  22257. pano.footIcon.add(pano.label);
  22258. pano.footIcon.label = pano.label;
  22259. }
  22260. if (pano.floor == currentFloor) {
  22261. pano.footIcon.visible = true;
  22262. _this10.changeIconLinkState(pano.footIcon, false);
  22263. if (isPanovisible) {
  22264. _this10.changeIconVisiState(pano.footIcon, _this10.checkHasNeighbor(panoIndexes[pano.id], 'beforeCreateLine'));
  22265. }
  22266. if (centerPano && pano == centerPano) {
  22267. //pano为中心 或者 currentPano 所以放大一点
  22268. pano.footIcon.oriScale = new THREE.Vector3(1.5, 1.5, 1.5);
  22269. if (isPanovisible) {
  22270. //currentPano特殊些:
  22271. _this10.changeIconLinkState(pano.footIcon, 'center');
  22272. }
  22273. } else {
  22274. pano.footIcon.oriScale = new THREE.Vector3(1, 1, 1);
  22275. pano.footIcon.actionIcon.visible = true;
  22276. }
  22277. } else {
  22278. var neighbourUUIDs = _this10.panoVTemp && _this10.panoVTemp[pano.id] ? _this10.panoVTemp[pano.id].neighbourUUIDs : pano.neighbourUUIDs;
  22279. var linkToActivePano = neighbourUUIDs.filter(function (id) {
  22280. return centerPano && id == centerPano.id;
  22281. });
  22282. pano.footIcon.oriScale = new THREE.Vector3(1, 1, 1);
  22283. if (linkToActivePano.length > 0) {
  22284. if (isPanovisible) {
  22285. _this10.changeFloorIconState(pano.footIcon);
  22286. }
  22287. _this10.changeIconLinkState(pano.footIcon, 'otherFloorLink');
  22288. } else {
  22289. pano.footIcon.visible = false;
  22290. }
  22291. }
  22292. });
  22293. }
  22294. }, {
  22295. key: "checkHasNeighbor",
  22296. value: function checkHasNeighbor(pano, state) {
  22297. //检查当前状态pano点是否有可通行点
  22298. var neighbours = this.panoVTemp && this.panoVTemp[pano.id] ? this.panoVTemp[pano.id].neighbourPanos : pano.neighbourPanos;
  22299. if (state != 'beforeCreateLine' && pano == this.activePano) {
  22300. //是中心点的话。state == "beforeCreateLine"代表是showFootIcon时, 这时候线还没创建,无法用线判断中心点有几个相邻点,直接用neighbourPanos
  22301. for (var i in this.panoVLines) {
  22302. if (this.panoVLines[i].visible) {
  22303. return true; //有一条线即可
  22304. }
  22305. }
  22306. return;
  22307. }
  22308. for (var i in neighbours) {
  22309. if (i == pano.id || isNaN(parseInt(i))) continue;
  22310. if (neighbours[i]) {
  22311. if (this.activePano && this.activePano.id == i && this.panoVLines[pano.id] && !this.panoVLines[pano.id].visible) continue;else if (this.activePano == pano && this.panoVLines[i] && !this.panoVLines[i].visible) continue;
  22312. return true;
  22313. }
  22314. }
  22315. return false;
  22316. }
  22317. }, {
  22318. key: "getCurNeighbors",
  22319. value: function getCurNeighbors(pano) {
  22320. //检查当前状态pano点是否有可通行点
  22321. var neighbours = this.panoVTemp && this.panoVTemp[pano.id] ? this.panoVTemp[pano.id].neighbourPanos : pano.neighbourPanos;
  22322. var neighbourIds = [];
  22323. for (var i in neighbours) {
  22324. if (i == pano.id || isNaN(parseInt(i))) continue;
  22325. if (neighbours[i]) {
  22326. if (this.activePano && this.activePano.id == i && this.panoVLines[pano.id] && !this.panoVLines[pano.id].visible) continue;else if (this.activePano == pano && this.panoVLines[i] && !this.panoVLines[i].visible) continue;else neighbourIds.push(i);
  22327. }
  22328. }
  22329. return neighbourIds;
  22330. }
  22331. }, {
  22332. key: "ifAllPanoNoNeighbor",
  22333. value: function ifAllPanoNoNeighbor() {
  22334. //检查是否全是孤立点
  22335. for (var i in panoIndexes) {
  22336. if (!panoIndexes[i].isAligned()) continue;
  22337. if (this.checkHasNeighbor(panoIndexes[i])) {
  22338. return false;
  22339. }
  22340. }
  22341. this.noPanoHasNeighbor = true;
  22342. return true; //是全部没有neighbour
  22343. }
  22344. }, {
  22345. key: "changeIconLinkState",
  22346. value: function changeIconLinkState(footIcon, state) {
  22347. if (!footIcon) return;
  22348. var color;
  22349. footIcon.otherFloorLink = false;
  22350. if (state == 'linked') {
  22351. color = Colors.green;
  22352. footIcon.actionIcon.material.map = this.actionLinkTex1;
  22353. }
  22354. if (state == 'otherFloorLink') {
  22355. color = Colors.yellow;
  22356. footIcon.actionIcon.visible = false;
  22357. footIcon.material.uniforms.opacity.value = 0.5;
  22358. footIcon.label.sprite.material.opacity = 0.5;
  22359. footIcon.visible = true; //xzw add
  22360. footIcon.otherFloorLink = true;
  22361. }
  22362. if (state == 'center') {
  22363. color = Colors.yellow;
  22364. footIcon.actionIcon.visible = false;
  22365. }
  22366. if (state == false) {
  22367. color = '#fff';
  22368. footIcon.actionIcon.material.map = this.actionLinkTex0;
  22369. } // footIcon.status = state
  22370. try {
  22371. footIcon.material.uniforms.color.value.set(color);
  22372. footIcon.label.sprite.material.color.set(color);
  22373. } catch (e) {
  22374. console.log(e);
  22375. }
  22376. }
  22377. }, {
  22378. key: "checkLinkStatus",
  22379. value: function checkLinkStatus() {
  22380. this.checkFloorLinkStatus();
  22381. var visibleLines = Object.values(this.panoVLines).filter(function (line) {
  22382. return line.visible;
  22383. });
  22384. var visibleIcon = this.footIcons.filter(function (icon) {
  22385. return icon.visible;
  22386. }); //是连接还是不连接
  22387. if (visibleIcon.length == visibleLines.length + 1) {
  22388. // 全部连接
  22389. return 'walkManager.linkAll';
  22390. } else if (visibleLines.length == 0) {
  22391. // 没有连接
  22392. return 'walkManager.linkNone';
  22393. } else {
  22394. // 部分连接
  22395. return 'walkManager.linkSome';
  22396. }
  22397. }
  22398. }, {
  22399. key: "changeIconVisiState",
  22400. value: function changeIconVisiState(footIcon, state) {
  22401. if (!footIcon) return; // 初始点位永远可见
  22402. if (footIcon.pano == this.player.$app.core.get('Scene').firstView.pano) state = true; //是可见点还是不可见点
  22403. if (state) {
  22404. footIcon.status = 'visible';
  22405. footIcon.material.uniforms.map.value = footIcon.pano.hasVideo ? this.footTex1_v : this.footTex1; // 眼睛变亮
  22406. if (!this.activePano) footIcon.actionIcon.material.map = this.actionVisiTex1;
  22407. footIcon.otherFloorLink || (footIcon.material.uniforms.opacity.value = 1, footIcon.label.sprite.material.opacity = 1);
  22408. this.changeFloorIconState(footIcon);
  22409. } else {
  22410. //不可见
  22411. footIcon.status = 'invisible';
  22412. var footIconMap = footIcon.material.uniforms.map;
  22413. footIconMap.value = footIcon.pano.hasVideo ? this.footTex2_v : this.footTex2; // 眼睛变暗
  22414. if (!this.activePano) footIcon.actionIcon.material.map = this.actionVisiTex0;
  22415. if (!this.activePano || this.activePano.id != footIcon.name) {
  22416. //非中心点时
  22417. footIcon.material.uniforms.opacity.value = 0.5;
  22418. footIcon.label.sprite.material.opacity = 0.5;
  22419. } else {
  22420. //变为中心点时
  22421. footIcon.material.uniforms.opacity.value = 1;
  22422. footIcon.label.sprite.material.opacity = 1; // toast: `该点位已隐藏,点击可显示。`
  22423. this.player.$app.gui.toast({
  22424. event: 'DialogList3D.WalkManger.activeHidePoint',
  22425. content: DialogList3D.WalkManger.activeHidePoint
  22426. });
  22427. }
  22428. }
  22429. }
  22430. }, {
  22431. key: "changeFloorIconState",
  22432. value: function changeFloorIconState(footIcon) {
  22433. var _this11 = this;
  22434. if (!footIcon) return; //是否为楼层连接点
  22435. var pano = panoIndexes[footIcon.name];
  22436. var neighbourUUIDs = this.panoVTemp && this.panoVTemp[pano.id] ? this.panoVTemp[pano.id].neighbourUUIDs : pano.neighbourUUIDs;
  22437. var linkToOtherFloor = neighbourUUIDs.filter(function (id) {
  22438. return panoIndexes[id].floorIndex != pano.floorIndex && (!_this11.activePano || !_this11.panoVLines[id] || _this11.panoVLines[id].visible);
  22439. }).map(function (id) {
  22440. return panoIndexes[id].floor;
  22441. });
  22442. if (linkToOtherFloor.length) {
  22443. // 因为负楼层的问题,不能使用floorIndex
  22444. if (this.getFloorOrder(linkToOtherFloor[0]) > this.getFloorOrder(pano.floor)) {
  22445. //(linkToOtherFloor[0].center.y > pano.floor.center.y) {
  22446. // 上楼点
  22447. footIcon.status = 'floor';
  22448. footIcon.material.uniforms.map.value = this.footTex5;
  22449. } else if (this.getFloorOrder(linkToOtherFloor[0]) < this.getFloorOrder(pano.floor)) {
  22450. // 下楼点
  22451. footIcon.status = 'floor';
  22452. footIcon.material.uniforms.map.value = this.footTex6;
  22453. }
  22454. return true;
  22455. } else {
  22456. // 不是楼层连接点
  22457. return false;
  22458. }
  22459. } // 获取离指定pano最近的上一层或下一层的pano(dir: "up"|"down")
  22460. }, {
  22461. key: "getClosestOtherFloorPano",
  22462. value: function getClosestOtherFloorPano(pano, dir) {
  22463. return this.player.model.panos.closestPanoTowardPoint({
  22464. point: pano.position,
  22465. getAll: true
  22466. }).map(function (p) {
  22467. return p.pano;
  22468. }).filter(function (p) {
  22469. return dir == 'up' ? p.floorIndex > pano.floorIndex : p.floorIndex < pano.floorIndex;
  22470. })[0];
  22471. } //xzw改 2023.6.7和ui一致,根据floorplan.json 中的id来定楼顺序-------
  22472. }, {
  22473. key: "checkFloorLinkStatus",
  22474. value: function checkFloorLinkStatus() {
  22475. var _this12 = this;
  22476. var linkFloorStatus = 'walkManager.unlinkFloor';
  22477. var neighbours = this.panoVTemp[this.activePano.id] && this.panoVTemp[this.activePano.id].neighbourUUIDs || panoIndexes[this.activePano.id].neighbourUUIDs;
  22478. var otherFloorPano = neighbours.map(function (pId) {
  22479. return panoIndexes[pId];
  22480. }).filter(function (pano) {
  22481. return pano.floorIndex != _this12.activePano.floorIndex && (!_this12.activePano || !_this12.panoVLines[pano.id] || _this12.panoVLines[pano.id].visible);
  22482. })[0]; // 目前只检测单对单连接
  22483. if (otherFloorPano && this.getFloorOrder(otherFloorPano.floor) > this.getFloorOrder(this.activePano.floor)) linkFloorStatus = 'walkManager.linkUpperFloor';
  22484. if (otherFloorPano && this.getFloorOrder(otherFloorPano.floor) < this.getFloorOrder(this.activePano.floor)) linkFloorStatus = 'walkManager.linkLowerFloor'; //暂时不考虑两种都存在的情况
  22485. this.player.$app.WalkManager.emit(linkFloorStatus);
  22486. }
  22487. }, {
  22488. key: "getFloorOrder",
  22489. value: function getFloorOrder(floor) {
  22490. var floorsData = this.player.$app.store.getValue('flooruser').floors;
  22491. var curInfo = floorsData.find(function (e) {
  22492. return e.subgroup == floor.floorIndex;
  22493. });
  22494. return curInfo.id;
  22495. }
  22496. }, {
  22497. key: "getFloor",
  22498. value: function getFloor(floorIndex, type) {
  22499. //获取上一层或下一层
  22500. var floors = this.player.model.floors;
  22501. floors.index[floorIndex];
  22502. var floorsData = this.player.$app.store.getValue('flooruser').floors;
  22503. var curInfo = floorsData.find(function (e) {
  22504. return e.subgroup == floorIndex;
  22505. });
  22506. var id = type == 'upper' ? curInfo.id + 1 : curInfo.id - 1;
  22507. var upperInfo = floorsData.find(function (e) {
  22508. return e.id == id;
  22509. }); //id代表楼层
  22510. console.log('getFloor', type, floorIndex, upperInfo.subgroup);
  22511. return upperInfo.subgroup; //subgroup就是floorIndex
  22512. } //--------------------------------------------
  22513. /* getUpperFloor(floorIndex) {
  22514. let floors = this.player.model.floors
  22515. let currentFloor = floors.index[floorIndex]
  22516. let upperFloor = {
  22517. index: floorIndex,
  22518. height: 9999,
  22519. }
  22520. floors.list.forEach(floor => {
  22521. if (
  22522. floor.center.y > currentFloor.center.y && // 上面的楼层
  22523. Math.abs(floor.center.y - currentFloor.center.y) < Math.abs(upperFloor.height - currentFloor.center.y) // 最近
  22524. ) {
  22525. upperFloor.index = floor.floorIndex
  22526. upperFloor.height = floor.center.y
  22527. }
  22528. })
  22529. return upperFloor.index
  22530. }
  22531. getLowerFloor(floorIndex) {
  22532. let floors = this.player.model.floors
  22533. let currentFloor = floors.index[floorIndex]
  22534. let upperFloor = {
  22535. index: floorIndex,
  22536. height: 9999,
  22537. }
  22538. floors.list.forEach(floor => {
  22539. if (
  22540. floor.center.y < currentFloor.center.y && // 下面的楼层
  22541. Math.abs(floor.center.y - currentFloor.center.y) < Math.abs(upperFloor.height - currentFloor.center.y) // 最近
  22542. ) {
  22543. upperFloor.index = floor.floorIndex
  22544. upperFloor.height = floor.center.y
  22545. }
  22546. })
  22547. return upperFloor.index
  22548. }
  22549. checkFloorLinkStatus() {
  22550. let linkFloorStatus = 'walkManager.unlinkFloor'
  22551. let neighbours = (this.panoVTemp[this.activePano.id] && this.panoVTemp[this.activePano.id].neighbourUUIDs) || panoIndexes[this.activePano.id].neighbourUUIDs
  22552. let othe rFloorPano = neighbours
  22553. .map(pId => panoIndexes[pId])
  22554. .filter(pano => pano.floorIndex != this.activePano.floorIndex && (!this.activePano || !this.panoVLines[pano.id] || this.panoVLines[pano.id].visible))[0] // 目前只检测单对单连接
  22555. if (otherFloorPano && otherFloorPano.floor.center.y > this.activePano.floor.center.y) linkFloorStatus = 'walkManager.linkUpperFloor'
  22556. if (otherFloorPano && otherFloorPano.floor.center.y < this.activePano.floor.center.y) linkFloorStatus = 'walkManager.linkLowerFloor'
  22557. this.player.$app.WalkManager.emit(linkFloorStatus)
  22558. }
  22559. */
  22560. }, {
  22561. key: "recoverAllState2",
  22562. value: function recoverAllState2() {
  22563. //为了热点可视恢复成pano全部可见
  22564. for (var i = 0; i < this.footIcons.length; i++) {
  22565. this.footIcons[i].material.uniforms.opacity.value = 1;
  22566. this.footIcons[i].label.sprite.material.opacity = 1;
  22567. this.footIcons[i].material.uniforms.map.value = this.footIcons[i].pano.hasVideo ? this.footTex1_v : this.footTex1;
  22568. }
  22569. }
  22570. }, {
  22571. key: "hideFootIcons",
  22572. value: function hideFootIcons() {
  22573. if (!this.footIcons) return;
  22574. for (var i = 0; i < this.footIcons.length; i++) {
  22575. this.footIcons[i].visible = false;
  22576. this.footIcons[i].actionIcon.visible = true;
  22577. }
  22578. }
  22579. }, {
  22580. key: "updateFootIconSize",
  22581. value: function updateFootIconSize() {
  22582. if (!this.footIcons) return;
  22583. var s = math$1.getScaleForConstantSize({
  22584. width2d: 240,
  22585. position: new THREE.Vector3(),
  22586. camera: this.player.camera,
  22587. dom: this.player.$app.dom
  22588. }); //无论任何设备大小,呈现的icon大小一致
  22589. var player = this.player;
  22590. s = THREE.MathUtils.clamp(s, 0.6, 2.5); // 最大值不可太大,否则场景缩小后容易重叠
  22591. this.footIcons.forEach(function (f) {
  22592. f.visible && f.scale.copy(f.oriScale).multiplyScalar(s); // 使footIcons随相机逆旋转,保证其角度不变
  22593. f.quaternion.copy(player.quaternion);
  22594. });
  22595. }
  22596. }, {
  22597. key: "resetTagVisiByModel",
  22598. value: function resetTagVisiByModel() {
  22599. //自动计算所有热点的可视 当模型修改后所有的热点可视都会重新自动计算(用户的设置将被覆盖)
  22600. var visiTags = [];
  22601. for (var i in objects.tagManager.tags) {
  22602. var tag = objects.tagManager.tags[i];
  22603. if (tag.state == 'videoPanoFlag') continue;
  22604. var visiblePanos = tag.getVisiblePanos();
  22605. visiTags.push({
  22606. sid: tag.sid,
  22607. value: visiblePanos
  22608. });
  22609. }
  22610. return visiTags;
  22611. }
  22612. }, {
  22613. key: "afterResetTagVisibles",
  22614. value: function afterResetTagVisibles(visiTags) {
  22615. visiTags.forEach(function (info) {
  22616. objects.tagManager.tags[info.sid].setVisiblePanos(info.value);
  22617. });
  22618. if (objects.player.mode == 'panorama') objects.tagManager.updateVisible('panorama');
  22619. }
  22620. }, {
  22621. key: "resetVisiblesByModel",
  22622. value: function resetVisiblesByModel() {
  22623. //自动计算所有热点和漫游点的可视
  22624. this.resetTagVisiByModel();
  22625. }
  22626. }, {
  22627. key: "gotoFloor",
  22628. value: function gotoFloor(index) {
  22629. var _this13 = this;
  22630. if (this.player.model.currentFloor.floorIndex != index) return;
  22631. var floor = this.player.model.floors.index[index]; // 记录跳转楼层前的activePano,用于跳回时再激活
  22632. // 跳转其他floor后没有新activepano,则在跳转回该floor时激活lastFloorActivePano
  22633. // 跳转其他floor后有新activepano,则lastFloorActivePano赋值为null
  22634. if (this.activePano) this.lastFloorActivePano = this.activePano;
  22635. if (this.setTagVisible) {
  22636. //this.pauseSetTagVisible('unsaved', floor)
  22637. if (this.tagVsetting) {
  22638. this.hideFootIcons();
  22639. this.showFootIcons();
  22640. for (var id in this.tagsVLines) {
  22641. if (panoIndexes[id].floor.floorIndex == this.player.model.currentFloor.floorIndex && this.tagsVLines[id].visible) {
  22642. this.tagsVLines[id].material.opacity = 1;
  22643. this.changeIconLinkState(panoIndexes[id].footIcon, 'linked');
  22644. } else {
  22645. this.tagsVLines[id].material.opacity = 0.4;
  22646. }
  22647. }
  22648. }
  22649. } else if (this.setPanoVisible) {
  22650. this.pauseSetPanoVisible('unsaved', floor);
  22651. setTimeout(function () {
  22652. if (_this13.lastFloorActivePano && _this13.lastFloorActivePano.floorIndex == index) {
  22653. _this13.SetOnePanoVisible(_this13.lastFloorActivePano);
  22654. _this13.player.$app.WalkManager.emit('walkManager.active', _this13.checkLinkStatus());
  22655. } else {
  22656. _this13.player.$app.WalkManager.emit('walkManager.deactive');
  22657. }
  22658. }, 1);
  22659. } //var size = this.getFitBoundSize(floor)
  22660. this.focusFloor(floor);
  22661. }
  22662. }, {
  22663. key: "focusFloor",
  22664. value: function focusFloor(floor) {
  22665. floor = floor || this.player.model.currentFloor;
  22666. var bound = floor.boundingBox.clone();
  22667. if (this.setTagVisible) {
  22668. this.player.$app.TagManager.tags.forEach(function (tag) {
  22669. if (tag.floorIndex == floor.floorIndex) {
  22670. bound.expandByPoint(tag.position);
  22671. }
  22672. });
  22673. }
  22674. var center = bound.getCenter(new THREE.Vector3());
  22675. var size = bound.getSize(new THREE.Vector3());
  22676. this.player.focusPoint({
  22677. modelSize: size,
  22678. aim: center
  22679. });
  22680. }
  22681. /* getFitBoundSize(floor, size_) {
  22682. if (!size_) {
  22683. size_ = floor.size
  22684. }
  22685. var MinWidth = (this.player.domElement.clientWidth + this.player.domElement.clientHeight) / 160 //size的x和z不小于MinWidth是为了防止当bound很小时放太大 根据屏幕大小,如果屏幕小会被缩小所以放大些
  22686. var w = size_.x
  22687. var h = size_.y
  22688. var size = new THREE.Vector3(
  22689. w < MinWidth ? (MinWidth + floor.size.x) / 2 : Math.min(w + floor.size.x * 0.3, floor.size.x),
  22690. 1,
  22691. h < MinWidth ? (MinWidth + floor.size.z) / 2 : Math.min(h + floor.size.z * 0.3, floor.size.z)
  22692. )
  22693. return size
  22694. } */
  22695. }]);
  22696. return Link;
  22697. }();
  22698. var FootIcon = /*#__PURE__*/function (_THREE$Mesh) {
  22699. _inherits(FootIcon, _THREE$Mesh);
  22700. var _super = _createSuper$18(FootIcon);
  22701. function FootIcon(geo, pano) {
  22702. var _this14;
  22703. _classCallCheck(this, FootIcon);
  22704. _this14 = _super.call(this);
  22705. _this14.geometry = geo;
  22706. _this14.material = new THREE.RawShaderMaterial({
  22707. vertexShader: shaders.waypoint.vertexShader,
  22708. fragmentShader: shaders.waypoint.fragmentShader,
  22709. uniforms: THREE.UniformsUtils.clone(shaders.waypoint.uniforms),
  22710. // side: THREE.DoubleSide,
  22711. transparent: !0,
  22712. depthWrite: !1,
  22713. depthTest: false,
  22714. name: 'footIcon'
  22715. });
  22716. _this14.material.uniforms.color.value.set('#ffffff');
  22717. _this14.renderOrder = RenderOrder.footIcon;
  22718. _this14.type = 'FootIcon';
  22719. _this14.name = pano.id;
  22720. _this14.pano = pano;
  22721. _this14.status = '';
  22722. _this14.position.copy(pano.floorPosition.clone());
  22723. _this14.position.y /= 100; //使之集体小于action的高度
  22724. _this14.lookAt(_this14.position.clone().add(new THREE.Vector3(0, 1, 0)));
  22725. return _this14;
  22726. }
  22727. return FootIcon;
  22728. }(THREE.Mesh);
  22729. /**
  22730. * 勾图标
  22731. */
  22732. var ActionIcon = /*#__PURE__*/function (_THREE$Mesh2) {
  22733. _inherits(ActionIcon, _THREE$Mesh2);
  22734. var _super2 = _createSuper$18(ActionIcon);
  22735. function ActionIcon(footIcon, geo, pano) {
  22736. var _this15;
  22737. _classCallCheck(this, ActionIcon);
  22738. _this15 = _super2.call(this);
  22739. _this15.geometry = geo;
  22740. _this15.material = new THREE.MeshPhongMaterial({
  22741. // side: THREE.DoubleSide,
  22742. transparent: !0,
  22743. depthTest: false,
  22744. name: 'footIcon'
  22745. });
  22746. _this15.footIcon = footIcon;
  22747. _this15.renderOrder = RenderOrder.footIcon + 1;
  22748. _this15.type = 'ActionIcon';
  22749. _this15.name = pano.id;
  22750. _this15.pano = pano;
  22751. _this15.position.set(0.2, 0.2, 1); //z是高度,抬高是为了点击时优先于footIcon被选中. 为了遮住所有高低不等的footicon,z需要设置高一些
  22752. return _this15;
  22753. }
  22754. return ActionIcon;
  22755. }(THREE.Mesh);
  22756. function _createSuper$17(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$17(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  22757. function _isNativeReflectConstruct$17() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  22758. var DollLabel = /*#__PURE__*/function (_THREE$EventDispatche) {
  22759. _inherits(DollLabel, _THREE$EventDispatche);
  22760. var _super = _createSuper$17(DollLabel);
  22761. function DollLabel(player, o) {
  22762. var _this;
  22763. _classCallCheck(this, DollLabel);
  22764. _this = _super.call(this);
  22765. _this.player = player;
  22766. _this.position = o.pos;
  22767. _this.sid = o.sid;
  22768. _this.text = o.text || '';
  22769. _this.toPano = o.toPano;
  22770. _this.clickFun = o.clickFun;
  22771. _this.noLine = o.noLine;
  22772. _this.driftDir = o.driftDir;
  22773. _this.floorIndex = o.floorIndex;
  22774. _this.elem = document.createElement('div');
  22775. _this.elem.className = 'room-label';
  22776. _this.elem.style.display = 'none';
  22777. _this.elem.innerHTML = "<a><p><span>".concat(_this.text, "</span></p></a>");
  22778. o.container ? o.container.append(_this.elem) : document.querySelector('.widgets-doll-labels').append(_this.elem);
  22779. _this.player.dollLabels.push(_assertThisInitialized(_this));
  22780. _this.elem.addEventListener('click', _this.clickFuc.bind(_assertThisInitialized(_this)));
  22781. _this.enable = true;
  22782. _this.type = 'doll';
  22783. _this.pos2d = new THREE.Vector3();
  22784. if (_this.noLine) _this.elem.className += ' noLine'; //去掉线的话
  22785. _this.visible = true; //2023.6新增 用于控制多原因隐藏
  22786. player.on('beginShowMonitor', function () {
  22787. common.updateVisible(_assertThisInitialized(_this), 'showMonitor', false);
  22788. });
  22789. player.on('leavedShowMonitor', function () {
  22790. common.updateVisible(_assertThisInitialized(_this), 'showMonitor', true);
  22791. });
  22792. return _this;
  22793. }
  22794. _createClass(DollLabel, [{
  22795. key: "changeText",
  22796. value: function changeText(t) {
  22797. this.elem.querySelector('span').innerHTML = this.text = t;
  22798. }
  22799. }, {
  22800. key: "update",
  22801. value: function update() {
  22802. //enable只和是否有cad图相关
  22803. if (this.player.mode !== 'dollhouse' || !this.enable || !this.visible || !this.text || this.player.model.currentFloor.floorIndex != this.floorIndex && !this.player.model.allFloorsVisible || this.player.EditOverlay && this.player.EditOverlay.editing || this.player.linkEditor && (this.player.linkEditor.setPanoVisible || this.player.linkEditor.setTagVisible) // ))
  22804. ) {
  22805. this.elem.style.display = 'none';
  22806. return;
  22807. }
  22808. var p = convertTool.getPos2d(this.position, this.player);
  22809. if (!p.trueSide) {
  22810. this.elem.style.display = 'none';
  22811. return;
  22812. } //判断label是否被模型遮挡,遮挡则消失
  22813. if (convertTool.ifShelter(this.position, this.player, {
  22814. x: p.vector.x,
  22815. y: p.vector.y
  22816. }, null, this.player.model.allFloorsVisible ? null : this.floorIndex)) {
  22817. this.elem.style.display = 'none';
  22818. return;
  22819. }
  22820. this.elem.style.display = ''; //先显示,driftDir才能计算位置
  22821. if (this.driftDir) {
  22822. //针对入户门标识。 label位置相对position向外偏移一段(driftDir为箭头方向),保证label的外沿相对position距离spaceDis个像素,这样看上去就会贴近箭头且距离稳定。
  22823. var driftPoint = convertTool.getPos2d(this.position.clone().add(this.driftDir), this.player); //先将label置于position的位置,然后求从箭头开始到position的这条射线在label的rect中的二维交点(向外的那个交点)
  22824. var rect = this.elem.children[0].getBoundingClientRect();
  22825. var crossPos2d = math$1.getCrossPointAtRect(driftPoint.pos, p.pos, rect.width, rect.height, p.pos.x - rect.width / 2, p.pos.y - rect.height / 2);
  22826. var driftVec = crossPos2d.sub(p.pos.clone()); //得到二维偏移方向
  22827. var dis = this.position.distanceTo(this.player.camera.position);
  22828. var spaceDis = 100 / dis; //边距(距离position) 为了防止离远时看起来似乎较远,除以一下相机距离
  22829. //将label的二维位置向外偏移 长度为label的中心到label边缘(crossPos2d)的距离 外加一小段spaceDis
  22830. var result = p.pos.clone().add(driftVec.multiplyScalar((spaceDis + driftVec.length()) / driftVec.length()));
  22831. this.elem.style.left = result.x + 'px';
  22832. this.elem.style.top = result.y + 'px';
  22833. } else {
  22834. this.elem.style.left = p.pos.x + 'px';
  22835. this.elem.style.top = p.pos.y + 'px';
  22836. }
  22837. this.pos2d = p.vector;
  22838. }
  22839. }, {
  22840. key: "clickFuc",
  22841. value: function clickFuc() {
  22842. if (this.toPano) this.player.flyToPano({
  22843. pano: this.toPano
  22844. });else if (this.clickFun) this.clickFun();
  22845. }
  22846. }, {
  22847. key: "remove",
  22848. value: function remove() {
  22849. var parentElem = this.elem.parentElement; // document.querySelector('.widgets-doll-labels')
  22850. parentElem && parentElem.removeChild(this.elem);
  22851. var a = this.player.dollLabels.indexOf(this);
  22852. if (a > -1) this.player.dollLabels.splice(a, 1);
  22853. }
  22854. }]);
  22855. return DollLabel;
  22856. }(THREE.EventDispatcher);
  22857. function _createSuper$16(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$16(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  22858. function _isNativeReflectConstruct$16() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  22859. var arrowHeight = 0.4;
  22860. var arrowLength = 1.6;
  22861. var arrowSpace = 1.8;
  22862. var _scale$1 = 0.2;
  22863. var oriVec = new THREE.Vector3(0, 0, -1); //箭头初始朝向
  22864. var matDefault = new THREE.MeshStandardMaterial({
  22865. //默认材质
  22866. transparent: true,
  22867. color: new THREE.Color(1, 1, 1),
  22868. opacity: 0.45,
  22869. metalness: 1,
  22870. //太低没有光照效果, 需要比emissive高一丢丢
  22871. emissive: new THREE.Color(0.85, 0.85, 0.85)
  22872. });
  22873. var matHighLight = matDefault.clone(); //高亮材质
  22874. matHighLight.opacity = 0.9;
  22875. var arrowGeo; //入户门的箭头动画
  22876. var EntryArrow = /*#__PURE__*/function (_THREE$Object3D) {
  22877. _inherits(EntryArrow, _THREE$Object3D);
  22878. var _super = _createSuper$16(EntryArrow);
  22879. function EntryArrow(player, entryInfo) {
  22880. var _this;
  22881. _classCallCheck(this, EntryArrow);
  22882. _this = _super.call(this);
  22883. _this.player = player;
  22884. var count = 4;
  22885. var arrow = _this.createArrow();
  22886. _this.add(arrow);
  22887. arrow.oriPosition = arrow.position.clone();
  22888. for (var i = 1; i < count; i++) {
  22889. var arrow_ = arrow.clone();
  22890. arrow_.position.setZ(i * arrowSpace);
  22891. arrow_.oriPosition = arrow_.position.clone();
  22892. _this.add(arrow_);
  22893. }
  22894. _this.name = 'entryArrow';
  22895. player.model.add(_assertThisInitialized(_this));
  22896. _this.scale.set(_scale$1, _scale$1, _scale$1); //this.scale.set(0.25,0.25,0.18)
  22897. _this.setPosition(entryInfo);
  22898. _this.currentHighLight = 0; //当前高亮的index
  22899. _this.traverse(function (e) {
  22900. e.renderOrder = RenderOrder.entryArrow;
  22901. });
  22902. console.log('create entryArrow');
  22903. return _this;
  22904. }
  22905. _createClass(EntryArrow, [{
  22906. key: "createArrow",
  22907. value: function createArrow() {
  22908. if (!arrowGeo) {
  22909. var points = [{
  22910. x: 0,
  22911. y: 0
  22912. }, {
  22913. x: 1,
  22914. y: arrowLength / 2
  22915. }, {
  22916. x: 1,
  22917. y: arrowLength
  22918. }, {
  22919. x: 0,
  22920. y: arrowLength / 2
  22921. }, {
  22922. x: -1,
  22923. y: arrowLength
  22924. }, {
  22925. x: -1,
  22926. y: arrowLength / 2
  22927. }];
  22928. var arrowShape = new THREE.Shape(); //先画一个二维的箭头顶视图
  22929. arrowShape.moveTo(points[0].x, points[0].y);
  22930. for (var i = 1, len = points.length; i < len; i++) {
  22931. arrowShape.lineTo(points[i].x, points[i].y);
  22932. }
  22933. arrowShape.lineTo(points[0].x, points[0].y);
  22934. arrowGeo = new THREE.ExtrudeBufferGeometry(arrowShape, {
  22935. depth: arrowHeight,
  22936. bevelEnabled: false
  22937. }); //挤出成模型
  22938. }
  22939. var arrow = new THREE.Mesh(arrowGeo, matDefault);
  22940. arrow.rotation.x = Math.PI / 2; //水平放置
  22941. return arrow;
  22942. }
  22943. }, {
  22944. key: "setPosition",
  22945. value: function setPosition(entryInfo) {
  22946. //设置入户门方位
  22947. //if(!metadata.cadInfo || (typeof metadata.cadInfo == "string" ? metadata.cadInfo.includes('"bound"') : metadata.cadInfo.bound))return;//代表是新版,cad图里的文字直接被planLabel取代,因此不用该函数
  22948. var left = new THREE.Vector3(entryInfo.points2d[0].x, entryInfo.bottom + arrowHeight * _scale$1, -entryInfo.points2d[0].y);
  22949. var right = new THREE.Vector3(entryInfo.points2d[1].x, entryInfo.bottom + arrowHeight * _scale$1, -entryInfo.points2d[1].y);
  22950. var entryPos = left.clone().add(right).multiplyScalar(0.5); //箭头就设定在门底部中央
  22951. var doorTangent = left.clone().sub(right).normalize();
  22952. var leftMat4 = new THREE.Matrix4();
  22953. leftMat4.set(0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1);
  22954. doorTangent.applyMatrix4(leftMat4);
  22955. var dir = entryInfo.openSide == 'LEFT' ? doorTangent.multiplyScalar(-1) : doorTangent;
  22956. if (entryInfo.enter == 'reverse') {
  22957. //翻转
  22958. entryPos.add(dir.clone().multiplyScalar(left.distanceTo(right)));
  22959. dir.multiplyScalar(-1);
  22960. }
  22961. this.enterDir = dir;
  22962. this.position.copy(entryPos);
  22963. var qua = math$1.getQuaBetween2Vector(oriVec, dir, new THREE.Vector3(0, 1, 0));
  22964. this.quaternion.copy(qua);
  22965. this.addLabel(entryPos, dir, entryInfo.floorIndex);
  22966. this.entryPos = entryPos;
  22967. }
  22968. }, {
  22969. key: "addLabel",
  22970. value: function addLabel(entryPos, dir, floorIndex) {
  22971. //创建入户门标识
  22972. var closetPano = this.player.model.panos.closestPanoTowardPoint({
  22973. point: entryPos
  22974. });
  22975. if (!closetPano) {
  22976. console.error('what!!! no closetPano');
  22977. } //pos为箭头末端位置, driftDir偏移反方向
  22978. var arrowWholeLen = (arrowSpace * 3 + arrowLength) * _scale$1; //总长度
  22979. this.dollLabelOriPos = entryPos.clone().sub(dir.clone().multiplyScalar(arrowWholeLen)); // TODO text 多语言
  22980. var dollLabel = new DollLabel(this.player, {
  22981. sid: 'entry',
  22982. pos: this.dollLabelOriPos,
  22983. driftDir: dir,
  22984. noLine: true,
  22985. text: config$4.i18n('model.enter'),
  22986. toPano: closetPano,
  22987. floorIndex
  22988. });
  22989. this.player.defaultRoomLabels.push(dollLabel);
  22990. this.dollLabel = dollLabel;
  22991. }
  22992. }, {
  22993. key: "moveCloseToWall",
  22994. value: function moveCloseToWall(shift) {
  22995. //移动到户型图墙壁边缘 和cadFloorPlane有关
  22996. this.children.forEach(function (mesh) {
  22997. mesh.position.z = mesh.oriPosition.z + shift;
  22998. });
  22999. this.dollLabel.position = this.dollLabelOriPos.clone().sub(this.enterDir.clone().multiplyScalar(shift * _scale$1));
  23000. }
  23001. }, {
  23002. key: "reSetHeight",
  23003. value: function reSetHeight(y) {
  23004. this.position.setY(y);
  23005. this.dollLabel.position.y = y;
  23006. this.dollLabelOriPos.y = y;
  23007. } //----暂时是private------
  23008. }, {
  23009. key: "animate",
  23010. value: function animate() {
  23011. var _this2 = this;
  23012. this.children.forEach(function (mesh, index) {
  23013. if (index == _this2.currentHighLight) {
  23014. mesh.material = matHighLight;
  23015. } else {
  23016. mesh.material = matDefault;
  23017. }
  23018. });
  23019. this.currentHighLight = (this.currentHighLight - 1 + this.children.length) % this.children.length;
  23020. this.stopAnimation(); //防止重复启动animate
  23021. this.animation = setTimeout(this.animate.bind(this), 200);
  23022. }
  23023. }, {
  23024. key: "stopAnimation",
  23025. value: function stopAnimation() {
  23026. clearTimeout(this.animation);
  23027. this.animation = null;
  23028. } //-----------------------
  23029. }, {
  23030. key: "dispose",
  23031. value: function dispose() {
  23032. this.parent.remove(this);
  23033. this.stopAnimation();
  23034. }
  23035. }, {
  23036. key: "show",
  23037. value: function show() {
  23038. this.visible = true;
  23039. this.animate();
  23040. }
  23041. }, {
  23042. key: "hide",
  23043. value: function hide() {
  23044. this.visible = false;
  23045. this.stopAnimation();
  23046. }
  23047. }], [{
  23048. key: "switchDepthTest",
  23049. value: function switchDepthTest(state) {
  23050. matDefault.depthTest = state;
  23051. matHighLight.depthTest = state;
  23052. }
  23053. }]);
  23054. return EntryArrow;
  23055. }(THREE.Object3D);
  23056. var axis = {
  23057. forward: new THREE.Vector3(0, 0, -1),
  23058. back: new THREE.Vector3(0, 0, 1),
  23059. left: new THREE.Vector3(-1, 0, 0),
  23060. right: new THREE.Vector3(1, 0, 0)
  23061. };
  23062. var DoorLabel = /*#__PURE__*/function () {
  23063. function DoorLabel(player, o) {
  23064. _classCallCheck(this, DoorLabel);
  23065. this.player = player;
  23066. this.position = o.pos; //大约在门的位置
  23067. this.text = o.text || '';
  23068. this.aim = o.aim; //tagging的位置
  23069. this.toPano = o.toPano;
  23070. this.door = o.door;
  23071. this.visiblePanos = o.visiblePanos;
  23072. this.sameRoomPanos = o.sameRoomPanos;
  23073. this.doorDir = o.doorDir;
  23074. this.floorIndex = o.floorIndex;
  23075. this.enable = o.enable == void 0 ? true : o.enable;
  23076. this.elem = document.createElement('div');
  23077. this.elem.className = 'door show-arrow';
  23078. this.elem.style.display = 'none';
  23079. this.elem.innerHTML = "<a>".concat(this.text, "</a>");
  23080. o.container ? o.container.append(this.elem) : document.querySelector('.widgets-doors').append(this.elem);
  23081. this.player.doorLabels.push(this);
  23082. this.elem.addEventListener('pointerup', this.clickFuc.bind(this));
  23083. this.type = 'door';
  23084. this.pos2d = new THREE.Vector3();
  23085. this.getDirection(); //初始化朝向
  23086. this.updateVisible();
  23087. }
  23088. _createClass(DoorLabel, [{
  23089. key: "updateVisible",
  23090. value: function updateVisible(toPano) {
  23091. if (toPano) {
  23092. //飞之前,判断目的地是否是该房间内的,若不是,就直接隐藏;否则等到飞到之后再判断
  23093. if (this.sameRoomPanos.includes(toPano)) ; else {
  23094. this.enable = false;
  23095. }
  23096. } else {
  23097. if (this.visiblePanos.includes(this.player.currentPano)) {
  23098. this.enable = true;
  23099. } else {
  23100. this.enable = false;
  23101. }
  23102. }
  23103. }
  23104. }, {
  23105. key: "update",
  23106. value: function update() {
  23107. if (this.player.mode !== 'panorama' || !this.enable || !this.text || settings$3.vrEnabled && settings$3.vrSplitScreen || this.player.linkEditor && (this.player.linkEditor.setPanoVisible || this.player.linkEditor.setTagVisible) // ||
  23108. // store.getters.page == 'cad' ||
  23109. // store.getters.page == 'data'
  23110. // ))
  23111. ) {
  23112. this.elem.style.display = 'none';
  23113. return;
  23114. }
  23115. var p = convertTool.getPos2d(this.position, this.player);
  23116. if (!p.trueSide) {
  23117. this.elem.style.display = 'none';
  23118. return;
  23119. }
  23120. /* if(convertTool.ifShelter(this.position, {x:p.vector.x, y: p.vector.y} )){
  23121. this.elem.css('display','none'); return;
  23122. } */
  23123. this.elem.style.left = p.pos.x + 'px';
  23124. this.elem.style.top = p.pos.y + 'px';
  23125. if (settings$3.vrEnabled) {
  23126. this.elem.style.transform = 'rotate(' + window.screenFaceOrient + 'deg)';
  23127. } else {
  23128. this.elem.style.transform = '';
  23129. }
  23130. this.elem.style.display = '';
  23131. this.pos2d = p.vector;
  23132. }
  23133. }, {
  23134. key: "getDirection",
  23135. value: function getDirection() {
  23136. //初始化doorLabel箭头朝向。决定了每个label的className (箭头朝向门内,不朝向tagging,因为tagging的位置会在房间任意地方,导致可能箭头指向门外)
  23137. var toward = DoorLabel.getToward(this.doorDir);
  23138. this.elem.className += ' ' + toward;
  23139. }
  23140. }, {
  23141. key: "clickFuc",
  23142. value: function clickFuc(e) {
  23143. if (this.toPano) {
  23144. //看向tagging
  23145. e.stopPropagation();
  23146. this.player.flyToPano({
  23147. pano: this.toPano,
  23148. lookAtPoint: this.aim.clone().setY(this.toPano.position.y),
  23149. duration: 1800
  23150. });
  23151. } else {
  23152. console.error('doorlabel没有toPano');
  23153. }
  23154. }
  23155. }, {
  23156. key: "remove",
  23157. value: function remove() {
  23158. var parentElem = this.elem.parentElement;
  23159. parentElem.removeChild(this.elem);
  23160. var a = this.player.doorLabels.indexOf(this);
  23161. if (a > -1) this.player.doorLabels.splice(a, 1);
  23162. }
  23163. }], [{
  23164. key: "getToward",
  23165. value: function getToward(dir) {
  23166. //传入方向后,归类四种朝向
  23167. for (var u in axis) {
  23168. var a = axis[u].clone().dot(dir.setY(0).normalize());
  23169. var angle = Math.acos(a);
  23170. if (angle < Math.PI / 4) {
  23171. return u;
  23172. }
  23173. }
  23174. console.warn('没有找到朝向..');
  23175. }
  23176. }, {
  23177. key: "updateCameraDir",
  23178. value: function updateCameraDir(player) {
  23179. if (player.mode != 'panorama' || player.doorLabels.length == 0) return;
  23180. var dir = player.getDirection();
  23181. var toward = DoorLabel.getToward(dir);
  23182. document.querySelector('.widgets-doors').setAttribute('data-camera-toward', toward);
  23183. }
  23184. }]);
  23185. return DoorLabel;
  23186. }();
  23187. var css$2 = "#compass {\n display: none;\n position: absolute;\n width: 90px;\n height: 90px;\n pointer-events: none;\n}\n\n#compass .north {\n color: #02a0e9;\n top: 0;\n}\n#compass .south {\n color: #ff1414;\n bottom: 0;\n}\n\n#compass .dirText {\n text-align: center;\n font-size: 10px;\n position: absolute;\n line-height: 25px;\n\n color: rgb(255, 255, 255);\n top: 50%;\n left: 50%;\n width: 45%;\n height: 0px;\n transform-origin: left center;\n}\n\n#compass #dirTextX {\n color: rgb(255, 0, 0);\n}\n\n#compass #dirTextY {\n color: rgb(0, 255, 0);\n}\n\n#compass #dirTextZ {\n color: rgb(0, 0, 255);\n}\n\n#compass .dirText span {\n display: block;\n position: absolute;\n right: 5px;\n top: 0;\n width: 20px;\n height: 20px;\n line-height: 20px;\n margin-top: -10px;\n}\n\n#compass .center {\n width: 50px;\n height: 50px;\n background-size: contain;\n background-position: center;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n position: absolute;\n}\n#compass .center canvas{\n position: relative;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n display: block;\n background-color: transparent;\n}\n\n.widgets-doll-labels a, .widgets-plan-labels a, .widgets-doors a {\n color: #fff;\n font-size: 14px;\n line-height: normal;\n font-family: OpenSans,sans-serif;\n user-select: none;\n}\n\n.widgets-doll-labels .room-label {\n position: absolute;\n width: 0;\n height: 0;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n -webkit-animation: room-label 0.3s ease 0.1s;\n animation: room-label 0.3s ease 0.1s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n cursor: pointer;\n}\n\n.widgets-doll-labels .room-label:not(.noLine):after {\n content: \"\";\n display: block;\n position: absolute;\n width: 4px;\n height: 68px;\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABQCAYAAADYxx/bAAAASElEQVQYlY2QwQoAIAhDR///x6Z2CCaGSpfHNoegcHdfAGwBCKVUMdAMK7IKm2Wh2oSOdkaUhVbG3u++x7aqPbX9lWVEdn9/AGvVUp4wTpLmAAAAAElFTkSuQmCC\");\n background-size: contain;\n background-repeat: no-repeat;\n bottom: 0;\n left: 50%;\n -webkit-transform: translate(-50%);\n transform: translate(-50%);\n}\n.widgets-doll-labels .room-label a {\n display: block;\n position: absolute;\n line-height: 22px;\n top: -66px;\n transform: translate(-50%, -100%);\n text-align: center;\n white-space: nowrap;\n font-size: 12px;\n font-style: normal;\n pointer-events: auto;\n \n background-repeat: no-repeat;\n background-size: 100% 100%;\n background: rgba(210, 210, 210, 0.7);\n border: 1px solid rgba(255, 255, 255, 0.4);\n border-radius: 3px; \n text-shadow: 0px 1px 3px rgb(0,0, 0, 0.5);\n}\n .widgets-doll-labels .room-label a::before {\n content: \"\";\n position: absolute;\n left: -1px;\n top: -1px;\n width: 10px;\n height: 10px;\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNnB4IiBoZWlnaHQ9IjZweCIgdmlld0JveD0iMCAwIDYgNiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5tYXBfY29ybmVyICA8L3RpdGxlPgogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i5bGV56S655WM6Z2iLeS4iee7tCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU2LjAwMDAwMCwgLTI3MC4wMDAwMDApIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0i57yW57uELTE1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMS4wMDAwMDAsIDI3MC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgtKy3lvaLnirbnu5PlkIgt6JKZ54mIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNS4wMDAwMDAsIDAuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYsNiBMNSw2IEw1LDIuNzA1IEwzLjMwMSwxIEwwLDEgTDAsMCBMMy43MTUyMjY0MSwwIEw2LDIuMjkzNDQ3OTUgTDYsNiBaIiBpZD0ibWFwX2Nvcm5lci0tIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjAwMDAwMCwgMy4wMDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTMuMDAwMDAwLCAtMy4wMDAwMDApICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=);\n background-repeat: no-repeat;\n background-position: top left;\n }\n .widgets-doll-labels .room-label a::after {\n content: \"\";\n position: absolute;\n left: -1px;\n bottom: -1px;\n width: 10px;\n height: 10px;\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNnB4IiBoZWlnaHQ9IjZweCIgdmlld0JveD0iMCAwIDYgNiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5tYXBfY29ybmVyICA8L3RpdGxlPgogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i5bGV56S655WM6Z2iLeS4iee7tCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU2LjAwMDAwMCwgLTI3MC4wMDAwMDApIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0i57yW57uELTE1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMS4wMDAwMDAsIDI3MC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgtKy3lvaLnirbnu5PlkIgt6JKZ54mIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNS4wMDAwMDAsIDAuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYsNiBMNSw2IEw1LDIuNzA1IEwzLjMwMSwxIEwwLDEgTDAsMCBMMy43MTUyMjY0MSwwIEw2LDIuMjkzNDQ3OTUgTDYsNiBaIiBpZD0ibWFwX2Nvcm5lci0tIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjAwMDAwMCwgMy4wMDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTMuMDAwMDAwLCAtMy4wMDAwMDApICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=);\n background-repeat: no-repeat;\n background-position: top left;\n transform: rotate(270deg);\n }\n .widgets-doll-labels .room-label a > p {\n margin: 0;\n padding: 2px 10px;\n height: 100%;\n line-height: 1.5;\n }\n .widgets-doll-labels .room-label a > p::before {\n content: \"\";\n position: absolute;\n right: -1px;\n top: -1px;\n width: 10px;\n height: 10px;\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNnB4IiBoZWlnaHQ9IjZweCIgdmlld0JveD0iMCAwIDYgNiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5tYXBfY29ybmVyICA8L3RpdGxlPgogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i5bGV56S655WM6Z2iLeS4iee7tCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU2LjAwMDAwMCwgLTI3MC4wMDAwMDApIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0i57yW57uELTE1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMS4wMDAwMDAsIDI3MC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgtKy3lvaLnirbnu5PlkIgt6JKZ54mIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNS4wMDAwMDAsIDAuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYsNiBMNSw2IEw1LDIuNzA1IEwzLjMwMSwxIEwwLDEgTDAsMCBMMy43MTUyMjY0MSwwIEw2LDIuMjkzNDQ3OTUgTDYsNiBaIiBpZD0ibWFwX2Nvcm5lci0tIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjAwMDAwMCwgMy4wMDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTMuMDAwMDAwLCAtMy4wMDAwMDApICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=);\n background-repeat: no-repeat;\n background-position: top left;\n transform: rotate(90deg);\n }\n .widgets-doll-labels .room-label a > p::after {\n content: \"\";\n position: absolute;\n right: -1px;\n bottom: -1px;\n width: 10px;\n height: 10px;\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNnB4IiBoZWlnaHQ9IjZweCIgdmlld0JveD0iMCAwIDYgNiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KICAgIDx0aXRsZT5tYXBfY29ybmVyICA8L3RpdGxlPgogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i5bGV56S655WM6Z2iLeS4iee7tCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTU2LjAwMDAwMCwgLTI3MC4wMDAwMDApIiBmaWxsPSIjRkZGRkZGIiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0i57yW57uELTE1IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMS4wMDAwMDAsIDI3MC4wMDAwMDApIj4KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgtKy3lvaLnirbnu5PlkIgt6JKZ54mIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNS4wMDAwMDAsIDAuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYsNiBMNSw2IEw1LDIuNzA1IEwzLjMwMSwxIEwwLDEgTDAsMCBMMy43MTUyMjY0MSwwIEw2LDIuMjkzNDQ3OTUgTDYsNiBaIiBpZD0ibWFwX2Nvcm5lci0tIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjAwMDAwMCwgMy4wMDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTMuMDAwMDAwLCAtMy4wMDAwMDApICI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8L2c+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4=);\n background-repeat: no-repeat;\n background-position: top left;\n transform: rotate(180deg);\n }\n\n.widgets-doll-labels .room-label.noLine a {\n top: 16px;\n}\n\n.widgets-doll-labels .room-label a span {\n white-space: nowrap;\n user-select: none;\n}\n\n.widgets-doll-labels .room-label.with-entrance:after {\n display: none;\n}\n\n.widgets-doll-labels .room-label.with-entrance a {\n top: 50%;\n width: 38.5px;\n height: 15.75px;\n background-size: 38.5px 15.75px;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n}\n\n.widgets-doll-labels .room-label.with-entrance a span {\n margin-left: -0.875px;\n margin-top: -0.875px;\n}\n\n.widgets-plan-labels .room-label {\n position: absolute;\n -webkit-animation: room-label 0.3s ease 0.1s;\n animation: room-label 0.3s ease 0.1s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n}\n\n.widgets-plan-labels .room-label a {\n display: block;\n position: absolute;\n line-height: 24px;\n -webkit-transform: translate(-50%);\n transform: translate(-50%, -50%);\n text-align: center;\n white-space: nowrap;\n font-size: 14px;\n font-style: normal;\n}\n\n.widgets-doors {\n position: absolute;\n pointer-events: none;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n}\n\n.widgets-doors[data-camera-toward=right] .door.show-arrow.right a:before,\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.right a:before {\n margin-right: 3.5px;\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.widgets-doors[data-camera-toward=right] .door.show-arrow.right a:before,\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.forward a:before,\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.left a:after,\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.right a:before {\n content: \"\";\n position: relative;\n display: inline-block;\n width: 10.5px;\n height: 10.5px;\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4KICA8ZyBpZD0iaW1nX2Fycm93IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzIxIC01OTMpIj4KICAgIDxwYXRoIGlkPSLot6/lvoRfMTQ0NSIgZGF0YS1uYW1lPSLot6/lvoQgMTQ0NSIgZD0iTTUyNS41OCw1MTAuNzczbC00LjczOC00LjU4OGEuNjIyLjYyMiwwLDAsMC0uNDM0LS4xNzNINTE3LjdhLjYyNS42MjUsMCwwLDEsLjQzNS4xNzNsNC43MzgsNC41ODhhLjM3LjM3LDAsMCwxLDAsLjU0bC00LjczOSw0LjUzMmEuNjIxLjYyMSwwLDAsMS0uNDMyLjE2N2gyLjcxMWEuNjIxLjYyMSwwLDAsMCwuNDMxLS4xNjdsNC43MzktNC41MzJBLjM3LjM3LDAsMCwwLDUyNS41OCw1MTAuNzczWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjA5LjMwMyA4Ni45ODkpIiBmaWxsPSIjZmZmIi8+CiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgPC9nPgo8L3N2Zz4K) no-repeat 50%;\n background-size: 100% 100%;\n vertical-align: middle;\n}\n\n.widgets-doors[data-camera-toward=\"forward\"] .door.show-arrow.left a:after {\n margin-left: 4px;\n}\n\n.widgets-doors[data-camera-toward=\"forward\"] .door.show-arrow.back a:after,\n.widgets-doors[data-camera-toward=\"right\"] .door.show-arrow.left a:after {\n content: \"\";\n display: inline-block;\n vertical-align: middle;\n width: 10.5px;\n height: 10.5px;\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4KICA8ZyBpZD0iaW1nX2Fycm93IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzIxIC01OTMpIj4KICAgIDxwYXRoIGlkPSLot6/lvoRfMTQ0NSIgZGF0YS1uYW1lPSLot6/lvoQgMTQ0NSIgZD0iTTUyNS41OCw1MTAuNzczbC00LjczOC00LjU4OGEuNjIyLjYyMiwwLDAsMC0uNDM0LS4xNzNINTE3LjdhLjYyNS42MjUsMCwwLDEsLjQzNS4xNzNsNC43MzgsNC41ODhhLjM3LjM3LDAsMCwxLDAsLjU0bC00LjczOSw0LjUzMmEuNjIxLjYyMSwwLDAsMS0uNDMyLjE2N2gyLjcxMWEuNjIxLjYyMSwwLDAsMCwuNDMxLS4xNjdsNC43MzktNC41MzJBLjM3LjM3LDAsMCwwLDUyNS41OCw1MTAuNzczWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjA5LjMwMyA4Ni45ODkpIiBmaWxsPSIjZmZmIi8+CiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgPC9nPgo8L3N2Zz4K) no-repeat 50%;\n background-size: 100% 100%;\n margin-left: 4px;\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n}\n\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.forward a:before ,\n.widgets-doors[data-camera-toward=right] .door.show-arrow.back a:before {\n margin-right: 3.5px;\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.widgets-doors[data-camera-toward=\"right\"] .door.show-arrow.back a:before,\n.widgets-doors[data-camera-toward=\"right\"] .door.show-arrow.forward a:after {\n content: \"\";\n position: relative;\n display: inline-block;\n width: 10.5px;\n height: 10.5px;\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4KICA8ZyBpZD0iaW1nX2Fycm93IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzIxIC01OTMpIj4KICAgIDxwYXRoIGlkPSLot6/lvoRfMTQ0NSIgZGF0YS1uYW1lPSLot6/lvoQgMTQ0NSIgZD0iTTUyNS41OCw1MTAuNzczbC00LjczOC00LjU4OGEuNjIyLjYyMiwwLDAsMC0uNDM0LS4xNzNINTE3LjdhLjYyNS42MjUsMCwwLDEsLjQzNS4xNzNsNC43MzgsNC41ODhhLjM3LjM3LDAsMCwxLDAsLjU0bC00LjczOSw0LjUzMmEuNjIxLjYyMSwwLDAsMS0uNDMyLjE2N2gyLjcxMWEuNjIxLjYyMSwwLDAsMCwuNDMxLS4xNjdsNC43MzktNC41MzJBLjM3LjM3LDAsMCwwLDUyNS41OCw1MTAuNzczWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjA5LjMwMyA4Ni45ODkpIiBmaWxsPSIjZmZmIi8+CiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgPC9nPgo8L3N2Zz4K) no-repeat 50%;\n background-size: 100% 100%;\n vertical-align: middle;\n}\n\n.widgets-doors[data-camera-toward=\"right\"] .door.show-arrow.forward a:after {\n margin-left: 4px;\n}\n\n.widgets-doors[data-camera-toward=\"left\"] .door.show-arrow.right a:after {\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n}\n\n.widgets-doors[data-camera-toward=back] .door.show-arrow.back a:after,\n.widgets-doors[data-camera-toward=left] .door.show-arrow.left a:after,\n.widgets-doors[data-camera-toward=left] .door.show-arrow.back a:after,\n.widgets-doors[data-camera-toward=left] .door.show-arrow.right a:after {\n content: \"\";\n display: inline-block;\n vertical-align: middle;\n width: 10.5px;\n height: 10.5px;\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4KICA8ZyBpZD0iaW1nX2Fycm93IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzIxIC01OTMpIj4KICAgIDxwYXRoIGlkPSLot6/lvoRfMTQ0NSIgZGF0YS1uYW1lPSLot6/lvoQgMTQ0NSIgZD0iTTUyNS41OCw1MTAuNzczbC00LjczOC00LjU4OGEuNjIyLjYyMiwwLDAsMC0uNDM0LS4xNzNINTE3LjdhLjYyNS42MjUsMCwwLDEsLjQzNS4xNzNsNC43MzgsNC41ODhhLjM3LjM3LDAsMCwxLDAsLjU0bC00LjczOSw0LjUzMmEuNjIxLjYyMSwwLDAsMS0uNDMyLjE2N2gyLjcxMWEuNjIxLjYyMSwwLDAsMCwuNDMxLS4xNjdsNC43MzktNC41MzJBLjM3LjM3LDAsMCwwLDUyNS41OCw1MTAuNzczWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjA5LjMwMyA4Ni45ODkpIiBmaWxsPSIjZmZmIi8+CiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgPC9nPgo8L3N2Zz4K) no-repeat 50%;\n background-size: 100% 100%;\n margin-left: 4px;\n}\n\n.widgets-doors[data-camera-toward=\"left\"] .door.show-arrow.back a:after {\n position: relative;\n}\n\n.widgets-doors[data-camera-toward=\"left\"] .door.show-arrow.forward a:before {\n position: relative;\n margin-right: 3.5px;\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.forward a:after,\n.widgets-doors[data-camera-toward=\"left\"] .door.show-arrow.forward a:before {\n content: \"\";\n display: inline-block;\n width: 10.5px;\n height: 10.5px;\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4KICA8ZyBpZD0iaW1nX2Fycm93IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzIxIC01OTMpIj4KICAgIDxwYXRoIGlkPSLot6/lvoRfMTQ0NSIgZGF0YS1uYW1lPSLot6/lvoQgMTQ0NSIgZD0iTTUyNS41OCw1MTAuNzczbC00LjczOC00LjU4OGEuNjIyLjYyMiwwLDAsMC0uNDM0LS4xNzNINTE3LjdhLjYyNS42MjUsMCwwLDEsLjQzNS4xNzNsNC43MzgsNC41ODhhLjM3LjM3LDAsMCwxLDAsLjU0bC00LjczOSw0LjUzMmEuNjIxLjYyMSwwLDAsMS0uNDMyLjE2N2gyLjcxMWEuNjIxLjYyMSwwLDAsMCwuNDMxLS4xNjdsNC43MzktNC41MzJBLjM3LjM3LDAsMCwwLDUyNS41OCw1MTAuNzczWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjA5LjMwMyA4Ni45ODkpIiBmaWxsPSIjZmZmIi8+CiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgPC9nPgo8L3N2Zz4K) no-repeat 50%;\n background-size: 100% 100%;\n vertical-align: middle;\n}\n\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.forward a:after {\n margin-left: 4px;\n -webkit-transform: rotate(-90deg);\n transform: rotate(-90deg);\n}\n\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.right a:after {\n margin-left: 4px;\n}\n\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.left a:before,\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.right a:after {\n content: \"\";\n position: relative;\n display: inline-block;\n width: 10.5px;\n height: 10.5px;\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4KICA8ZyBpZD0iaW1nX2Fycm93IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNzIxIC01OTMpIj4KICAgIDxwYXRoIGlkPSLot6/lvoRfMTQ0NSIgZGF0YS1uYW1lPSLot6/lvoQgMTQ0NSIgZD0iTTUyNS41OCw1MTAuNzczbC00LjczOC00LjU4OGEuNjIyLjYyMiwwLDAsMC0uNDM0LS4xNzNINTE3LjdhLjYyNS42MjUsMCwwLDEsLjQzNS4xNzNsNC43MzgsNC41ODhhLjM3LjM3LDAsMCwxLDAsLjU0bC00LjczOSw0LjUzMmEuNjIxLjYyMSwwLDAsMS0uNDMyLjE2N2gyLjcxMWEuNjIxLjYyMSwwLDAsMCwuNDMxLS4xNjdsNC43MzktNC41MzJBLjM3LjM3LDAsMCwwLDUyNS41OCw1MTAuNzczWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjA5LjMwMyA4Ni45ODkpIiBmaWxsPSIjZmZmIi8+CiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+CiAgPC9nPgo8L3N2Zz4K) no-repeat 50%;\n background-size: 100% 100%;\n vertical-align: middle;\n}\n\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.left a:before {\n margin-right: 3.5px;\n -webkit-transform: rotate(180deg);\n transform: rotate(180deg);\n}\n\n.widgets-doors .door {\n position: absolute;\n width: 0;\n height: 0;\n /* display: none; */\n -webkit-animation: viewport-door-label 0.3s ease 1s;\n animation: viewport-door-label 0.3s ease 1s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n cursor: pointer;\n}\n\n.widgets-doors .door a {\n display: block;\n position: absolute;\n top: 50%;\n left: 50%;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n border-radius: 1.75px;\n background: rgba(0, 0, 0, 0.5);\n line-height: 14px;\n padding: 8px 8px;\n border-radius: 4px;\n white-space: nowrap;\n font-size: 14px;\n font-style: normal;\n pointer-events: auto;\n -webkit-transition: background 0.3s ease, color 0.3s ease, -webkit-transform 1s ease;\n transition: background 0.3s ease, color 0.3s ease, -webkit-transform 1s ease;\n transition: transform 1s ease, background 0.3s ease, color 0.3s ease;\n transition: transform 1s ease, background 0.3s ease, color 0.3s ease, -webkit-transform 1s ease;\n}\n\n.widgets-doors .door a:after {\n -webkit-transition: opacity 0.3s ease;\n transition: opacity 0.3s ease;\n}\n\n.widgets-doors .door a:active {\n background: rgba(0, 0, 0, 0.5);\n color: hsla(0, 0%, 100%, 0.5);\n}\n\n.widgets-doors .door a:active:after {\n opacity: 0.5;\n}\n\n\n.polygonMark-label {\n position: absolute;\n max-width: 340px;\n max-height: 125px;\n min-width: 45px;\n\n -webkit-animation: mark-label 0.3s ease 0.1s;\n animation: mark-label 0.3s ease 0.1s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n}\n.polygonMark-label .line{\n width: 100%;\n height: 0px;\n background-color: rgba(255, 255, 255, 0.75);\n box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.5);\n border: 1px solid rgba(255, 255, 255, 0.75);\n\n}\n.polygonMark-label .point{\n position: relative;\n top: -4px;\n left: -8px;\n opacity: 1;\n\n width: 8px;\n height: 8px;\n background-color: #ffffff; \n box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.5);\n border-radius: 100%;\n}\n.polygonMark-label .name {\n margin: 0;\n padding: 0;\n max-width: 320px;\n max-height: 63px;\n min-width: auto;\n\n margin-left: 20px;\n padding-bottom: 2.5px;\n word-break:normal;\n word-break: break-all;\n\n font-family: Microsoft YaHei;\n font-weight: bold;\n font-size: 16px;\n color: #FFFFFF;\n line-height: 19px;\n text-shadow: 0px 0px 4px rgba(0,0,0,0.8);\n text-align: left;\n font-style: normal;\n}\n.polygonMark-label .type{\n margin: 0;\n padding: 0;\n max-width: 320px;\n max-height: 63px;\n min-width: auto;\n\n margin-left: 20px;\n padding-top: 2.5px;\n word-break:normal;\n word-break: break-all;\n\n\n font-family: Microsoft YaHei;\n font-weight: 400;\n font-size: 14px;\n color: #FFFFFF;\n line-height: 16px;\n text-shadow: 0px 0px 4px rgba(0,0,0,0.8);\n text-align: left;\n font-style: normal;\n\n}\n\n@-webkit-keyframes mark-label {\n 0% {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes mark-label {\n 0% {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n\n@-webkit-keyframes room-label {\n 0% {\n opacity: 0;\n margin-top: 8.75px;\n }\n\n to {\n opacity: 1;\n margin-top: 0;\n }\n}\n\n@keyframes room-label {\n 0% {\n opacity: 0;\n margin-top: 8.75px;\n }\n\n to {\n opacity: 1;\n margin-top: 0;\n }\n}\n\n@-webkit-keyframes door-label {\n 0% {\n opacity: 0;\n margin-top: 8.75px;\n }\n\n to {\n opacity: 1;\n margin-top: 0;\n }\n}\n\n@keyframes door-label {\n 0% {\n opacity: 0;\n margin-top: 8.75px;\n }\n\n to {\n opacity: 1;\n margin-top: 0;\n }\n}";
  23188. n$4(css$2,{});
  23189. function _createSuper$15(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$15(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  23190. function _isNativeReflectConstruct$15() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  23191. /*#__PURE__*/(function (_THREE$EventDispatche) {
  23192. _inherits(PlanLabel, _THREE$EventDispatche);
  23193. var _super = _createSuper$15(PlanLabel);
  23194. function PlanLabel(player, o) {
  23195. var _this;
  23196. _classCallCheck(this, PlanLabel);
  23197. _this = _super.call(this);
  23198. console.log(PlanLabel);
  23199. _this.player = player;
  23200. _this.position = o.pos;
  23201. _this.sid = o.sid;
  23202. _this.text = o.text || '';
  23203. _this.toPano = o.toPano;
  23204. _this.enable = o.enable == void 0 ? true : o.enable;
  23205. _this.elem = document.createElement('div');
  23206. _this.elem.className = 'room-label';
  23207. _this.elem.style.display = 'none';
  23208. _this.elem.innerHTML = "<a>".concat(_this.text, "</a>");
  23209. o.container ? o.container.append(_this.elem) : document.querySelector('.widgets-plan-labels').append(_this.elem);
  23210. player.planLabels.push(_assertThisInitialized(_this));
  23211. _this.type = 'plan';
  23212. _this.floorIndex = o.floorIndex;
  23213. return _this;
  23214. }
  23215. _createClass(PlanLabel, [{
  23216. key: "changeText",
  23217. value: function changeText(t) {
  23218. this.elem.querySelector('a').innerHTML = this.text = t;
  23219. }
  23220. }, {
  23221. key: "update",
  23222. value: function update() {
  23223. //enable只和是否有cad图相关
  23224. if (this.player.mode !== 'floorplan' || !this.enable || !this.text || this.player.model.currentFloor.floorIndex != this.floorIndex && !this.player.model.allFloorsVisible || this.player.linkEditor && (this.player.linkEditor.setPanoVisible || this.player.linkEditor.setTagVisible) // ||
  23225. // store.getters.page == 'cad' ||
  23226. // store.getters.page == 'data'
  23227. // ))
  23228. ) {
  23229. this.elem.style.display = 'none';
  23230. return;
  23231. }
  23232. var p = convertTool.getPos2d(this.position, this.player);
  23233. if (!p.trueSide) {
  23234. this.elem.style.display = 'none';
  23235. return;
  23236. } //使之随着模型缩放,就像贴图一样。缺陷1:当不显示户型图时,ImgRatio为null;缺陷2:当模型很大时,每个房间看起来很小,可能字会超出边缘。
  23237. // var s = ( document.getElementsByClassName('player')[0].clientWidth * (this.player.model.cadFloorPlane.ImgRatio || 1 / 50) )
  23238. var s = this.player.domElement.clientWidth * (1 / 50) / Math.abs(this.player.cameraControls.activeControl.camera.left); //乘上app.model.floorplanCadImg.ImgRatio是为了让字相对于图片的像素不变。(否则就是根据模型尺寸) 防止图片覆盖的模型范围大的字也跟着被缩小。
  23239. s = THREE.MathUtils.clamp(s, 0.4, 3); //限定范围,主要是防止字太大,也可去除
  23240. this.elem.style.left = p.pos.x + 'px';
  23241. this.elem.style.top = p.pos.y + 'px';
  23242. this.elem.style.transform = 'scale(' + s + ')';
  23243. this.elem.style.display = '';
  23244. }
  23245. }, {
  23246. key: "remove",
  23247. value: function remove() {
  23248. var parentElem = this.elem.parentElement;
  23249. parentElem.removeChild(this.elem);
  23250. var a = this.player.planLabels.indexOf(this);
  23251. if (a > -1) this.player.planLabels.splice(a, 1);
  23252. }
  23253. }]);
  23254. return PlanLabel;
  23255. })(THREE.EventDispatcher);
  23256. /*
  23257. 判断遮挡方式:当户型和模型相差较大时的问题(尽力使户型贴准模型)
  23258. 1 用模型: 会有被遮挡然后看不见的情况,尤其是从斜侧面看,门容易被其他墙挡住。因为此外还有门没打洞的情况,加上该功能基于户型,所以不使用此方案。
  23259. 2 用数据: 会有看上去被墙遮挡但却还看得见的情况。
  23260. */
  23261. var LabelManager = /*#__PURE__*/function () {
  23262. function LabelManager(player) {
  23263. _classCallCheck(this, LabelManager);
  23264. this.player = player;
  23265. var dollElem = document.createElement('div');
  23266. dollElem.className = 'widgets-doll-labels';
  23267. player.domElement.append(dollElem);
  23268. var planElem = document.createElement('div');
  23269. planElem.className = 'widgets-plan-labels';
  23270. player.domElement.append(planElem);
  23271. var doorElem = document.createElement('div');
  23272. doorElem.className = 'widgets-doors';
  23273. player.domElement.append(doorElem); // let isAllFloor = false // 因为单楼层和全部楼层都会触发floor.changed, 以此来做区分
  23274. // this.player.model.on('floor.changed', (toFloor, mode) => {
  23275. // if (!isAllFloor) {
  23276. // this.gotoFloor(toFloor.floorIndex)
  23277. // } else {
  23278. // isAllFloor = false
  23279. // }
  23280. // })
  23281. // this.player.model.on('allfloors.toggled', (floors, currentFloor) => {
  23282. // if (floors) {
  23283. // this.gotoFloor()
  23284. // isAllFloor = true
  23285. // }
  23286. // })
  23287. if (this.player.$app.store.getValue('flooruser')) {
  23288. this.init();
  23289. }
  23290. this.player.$app.store.on('flooruser', this.init.bind(this));
  23291. }
  23292. _createClass(LabelManager, [{
  23293. key: "init",
  23294. value: function init() {
  23295. var _this = this;
  23296. //开户门箭头
  23297. // if (this.initedLabel) return
  23298. var floorJson = this.player.$app.store.getValue('flooruser'); // floorJson = common.compatiblev2(floorJson)
  23299. // 导入平面图后传入的就是空数据,且需要清空原先数据,所以不能这样判断
  23300. // var voidValue = true //可能还没得到数据,都是空的
  23301. // for (let i = 0; i < floorJson.floors.length; i++) {
  23302. // for (let j in floorJson.floors[i]) {
  23303. // if (floorJson.floors[i][j] instanceof Array && floorJson.floors[i][j].length > 0) {
  23304. // voidValue = false
  23305. // break
  23306. // }
  23307. // }
  23308. // }
  23309. // if (voidValue) return //空的
  23310. // // console.error(floorJson)
  23311. common.timeMeasuring.addTimeMark('initLabels', 'start');
  23312. this.player.defaultRoomLabels.forEach(function (label) {
  23313. return label.remove();
  23314. });
  23315. this.player.defaultRoomLabels = [];
  23316. floorJson.floors.forEach(function (floorData0, index) {
  23317. // const index = this.player.model.floors.list.length > 1 ? (floorData.subgroup != void 0 ? floorData.subgroup : floorData.id) : this.player.model.floors.list[0].floorIndex //旧版单层model的id和json不对应,使用model的
  23318. index = _this.player.model.floors.list.length > 1 ? floorData0.subgroup != void 0 ? floorData0.subgroup : floorData0.id : index; //旧版单层model的id和json不对应,使用model的
  23319. var floor = _this.player.model.floors.index[index];
  23320. if (!floor) {
  23321. logger$1.warn("floor[".concat(index, "] is empty"));
  23322. return;
  23323. }
  23324. floor.entryArrow = [];
  23325. var bottom = floor.boundingBox.min.y; // 变换floorJson里的所有坐标
  23326. var floorData = JSON.parse(JSON.stringify(floorData0));
  23327. var modelCenter = JSON.parse(JSON.stringify(_this.player.model.center));
  23328. modelCenter.z = -1 * modelCenter.z; //let modelCenter = floorData.boundingBox && new THREE.Vector3((floorData.boundingBox.minX + floorData.boundingBox.maxX) / 2, 0, -(floorData.boundingBox.minY + floorData.boundingBox.maxY) / 2)
  23329. floorData.symbols && Object.keys(floorData.symbols).forEach(function (key) {
  23330. var symbol = floorData.symbols[key];
  23331. symbol.endPoint = getPointForRevRotate(symbol.endPoint, floorJson.angle, modelCenter);
  23332. symbol.startPoint = getPointForRevRotate(symbol.startPoint, floorJson.angle, modelCenter);
  23333. symbol.points2d = (symbol.points2d || []).map(function (point) {
  23334. return getPointForRevRotate(point, floorJson.angle, modelCenter);
  23335. });
  23336. });
  23337. floorData.tags && Object.keys(floorData.tags).forEach(function (key) {
  23338. var tag = floorData.tags[key];
  23339. tag.center = getPointForRevRotate(tag.center, floorJson.angle, modelCenter);
  23340. tag.points2d = tag.points2d.map(function (point) {
  23341. return getPointForRevRotate(point, floorJson.angle, modelCenter);
  23342. });
  23343. });
  23344. floorData.rooms && Object.keys(floorData.rooms).forEach(function (key) {
  23345. var room = floorData.rooms[key];
  23346. room.center = getPointForRevRotate(room.center, floorJson.angle, modelCenter);
  23347. });
  23348. floorData.points && Object.keys(floorData.points).forEach(function (key) {
  23349. var point = floorData.points[key];
  23350. var pointpos = getPointForRevRotate({
  23351. x: point.x,
  23352. y: point.y
  23353. }, floorJson.angle, modelCenter);
  23354. point.x = pointpos.x;
  23355. point.y = pointpos.y;
  23356. });
  23357. if (floorData.symbols) {
  23358. var entry;
  23359. var symbolKeys = Object.keys(floorData.symbols);
  23360. for (var i = 0; i < symbolKeys.length; i++) {
  23361. if (floorData.symbols[symbolKeys[i]].enter) {
  23362. entry = JSON.parse(JSON.stringify(floorData.symbols[symbolKeys[i]]));
  23363. entry.bottom = bottom + 0.1; //根据模型
  23364. entry.floorIndex = index; // entry.endPoint = getPointForRevRotate(entry.endPoint, floorJson.angle, this.player.model.center)
  23365. // entry.startPoint = getPointForRevRotate(entry.startPoint, floorJson.angle, this.player.model.center)
  23366. // entry.points2d = entry.points2d.map(point => getPointForRevRotate(point, floorJson.angle, this.player.model.center))
  23367. floor.entryArrow.push(new EntryArrow(_this.player, entry));
  23368. if (_this.player.model.currentFloor.floorIndex == index) _this.updateEntryVisi(true, index);else _this.updateEntryVisi(false, index);
  23369. }
  23370. }
  23371. _this.moveEntryArrow(index);
  23372. } //添加label 房间名
  23373. floorData.tags = floorData.tags || {};
  23374. _this.hasPlaneLabels = floorData.tags.length > 0;
  23375. var labelHeight = floor.center.y; //.panoHeightAve
  23376. Object.keys(floorData.tags).forEach(function (index_) {
  23377. var info = floorData.tags[index_];
  23378. var des = info.des && parseFloat(info.des).toFixed(2);
  23379. var title = info.title;
  23380. var area = des + info.unit + '<sup>2</sup>';
  23381. var content = info.des ? '约' + area : '';
  23382. if (!title && !content) return;
  23383. var text = title && content ? title + '<br>' + area // 如果name是空或只有空格,视若showArea == false; trim:去除字符串的头尾空格
  23384. : title ? title : content; // y方向有差异
  23385. var rayDir = _this.player.modeTran.split('-')[1] == 'floorplan' ? new THREE.Vector3(0, -1, 0) : new THREE.Vector3(0, 1, 0); // let center = getPointForRevRotate(info.center, floorJson.angle, this.player.model.center)
  23386. var center = info.center;
  23387. var pos = new THREE.Vector3(center.x, -999 * rayDir.y, -center.y); // 检测当前pos在模型底部的映射坐标,确认标签高度
  23388. var ray = new THREE.Raycaster(pos, rayDir, 0.001, 9999);
  23389. var rayInfo = ray.intersectObject(floor.children[0]);
  23390. if (rayInfo[0]) {
  23391. pos = rayInfo[0].point;
  23392. pos.y += 0.5;
  23393. } else {
  23394. pos.y = labelHeight;
  23395. }
  23396. var closetPano = _this.player.model.panos.closestPanoTowardPoint({
  23397. point: pos,
  23398. floor
  23399. });
  23400. if (!closetPano) {
  23401. console.error('what!!! no closetPano');
  23402. }
  23403. var dollLabel = new DollLabel(_this.player, {
  23404. sid: index_,
  23405. pos: pos.clone(),
  23406. text: text,
  23407. toPano: closetPano,
  23408. floorIndex: index
  23409. });
  23410. _this.player.defaultRoomLabels.push(dollLabel); // var planLabel = new PlanLabel(this.player, { sid: 'pl_' + index_, pos: pos.clone(), text: text, floorIndex: index })
  23411. // this.player.defaultRoomLabels.push(planLabel)
  23412. _this.player.defaultRoomLabels.forEach(function (label) {
  23413. label.update();
  23414. });
  23415. });
  23416. _this.initDoorLabels(index, JSON.parse(JSON.stringify(floorData)));
  23417. });
  23418. this.initedLabel = true; //-------initedLabel之后------
  23419. this.setPlanLabelVisi();
  23420. common.timeMeasuring.addTimeMark('initLabels', 'end', true);
  23421. }
  23422. }, {
  23423. key: "initDoorLabels",
  23424. value: function initDoorLabels(floorIndex, floorJson) {
  23425. var _this2 = this;
  23426. var doors = [];
  23427. if (!floorJson.rooms || !floorJson.rooms[0] || !floorJson.rooms[0].wallPointIDs) {
  23428. console.log('没有room or 数据不标准 得不到doorlabels');
  23429. return;
  23430. }
  23431. var floor = this.player.model.floors.index[floorIndex];
  23432. var bottom = floor.boundingBox.min.y;
  23433. Object.keys(floorJson.tags).forEach(function (tagKey) {
  23434. var tag = floorJson.tags[tagKey];
  23435. tag.__panos = []; //for taggingTables
  23436. if (!tag.title) delete floorJson.tags[tagKey];
  23437. });
  23438. var doorJson = {};
  23439. Object.keys(floorJson.symbols).forEach(function (symKey) {
  23440. var symbol = floorJson.symbols[symKey];
  23441. if (symbol.geoType == 'SingleDoor' || symbol.geoType == 'SlideDoor' || symbol.geoType == 'DoubleDoor') doorJson[symKey] = symbol;
  23442. });
  23443. floorJson.rooms.forEach(function (room, index) {
  23444. room.name = '';
  23445. room.doors = Object.values(doorJson).filter(function (door) {
  23446. return room.wallIds.indexOf(door.parent) > -1;
  23447. }) || [];
  23448. room.taggings = [];
  23449. room.panos = [];
  23450. });
  23451. Object.keys(doorJson).forEach(function (doorKey) {
  23452. var door = doorJson[doorKey];
  23453. door.doorLabels = [];
  23454. doors.push(door);
  23455. door.center = {
  23456. x: (door.points2d[0].x + door.points2d[1].x) / 2,
  23457. y: (door.points2d[0].y + door.points2d[1].y) / 2
  23458. }; //中心位置
  23459. //正常一个门对应两个atRooms,但数据却可能多个,冗余的都是没有tagging的room,但没有tagging不代表是冗余的房间
  23460. door.atRooms = [];
  23461. floorJson.rooms.forEach(function (room) {
  23462. var door_ = room.doors.find(function (door_) {
  23463. return door_.vectorId == door.vectorId;
  23464. });
  23465. if (door_) {
  23466. //room.doors.push(door)
  23467. door.atRooms.push(room);
  23468. }
  23469. });
  23470. }); //保险起见,统一删除rooms里没对应上的门
  23471. floorJson.rooms.forEach(function (room) {
  23472. room.doors = room.doors.filter(function (door) {
  23473. return door.atRooms;
  23474. });
  23475. }); //找完了所有门和房间的对应关系
  23476. floor.panos.forEach(function (pano) {
  23477. pano._atRoom = null;
  23478. }); //查找房间中的tagging和pano
  23479. floorJson.rooms.forEach(function (room) {
  23480. room.points = room.wallPointIDs.map(function (pointId) {
  23481. return floorJson.points[pointId];
  23482. });
  23483. if (room.closetParent == void 0) {
  23484. //只从非内环找起,内环在searchTagRoom找
  23485. floor.panos.forEach(function (pano) {
  23486. if (pano._atRoom || !pano.isAligned()) return;
  23487. _this2.searchAtRoom(floorJson, room, pano, {
  23488. x: pano.position.x,
  23489. y: -pano.position.z
  23490. }, function (atRoom) {
  23491. pano._atRoom = atRoom;
  23492. atRoom.panos.push(pano);
  23493. });
  23494. });
  23495. Object.keys(floorJson.tags).forEach(function (tagKey) {
  23496. var tagging = floorJson.tags[tagKey];
  23497. if (tagging._atRoom) return;
  23498. _this2.searchAtRoom(floorJson, room, tagging, {
  23499. x: tagging.center.x,
  23500. y: tagging.center.y
  23501. }, function (atRoom) {
  23502. tagging._atRoom = atRoom;
  23503. atRoom.taggings.push(tagging);
  23504. atRoom.name += tagging.title + ' '; //将tagging收集到name中
  23505. });
  23506. });
  23507. }
  23508. room.taggings.length && room.panos.forEach(function (pano) {
  23509. //可能有pano不属于任何一个房间或tagging、也可能有tagging没有一个pano
  23510. var score = common.sortByScore(room.taggings, [], [function (tagging) {
  23511. //取距离最近的tagging作为pano的tagging
  23512. var panoPos = new THREE.Vector2(pano.position.x, pano.position.z);
  23513. var labelPos = new THREE.Vector2(tagging.center.x, -tagging.center.y);
  23514. return -panoPos.distanceTo(labelPos);
  23515. }]);
  23516. if (score && score.length) {
  23517. var noShelter = score.slice(0, 3).find(function (e) {
  23518. //当前点位看向tagging的视线不能被墙挡住
  23519. var tagging = e.item;
  23520. var panoPos = new THREE.Vector2(pano.position.x, pano.position.z);
  23521. var labelPos = new THREE.Vector2(tagging.center.x, -tagging.center.y);
  23522. return !_this2.isShelter(floorJson, labelPos, panoPos);
  23523. });
  23524. var tagging = (noShelter || score[0]).item;
  23525. tagging.__panos.push(pano);
  23526. }
  23527. });
  23528. });
  23529. Object.keys(floorJson.tags).forEach(function (tagKey) {
  23530. var tagging = floorJson.tags[tagKey];
  23531. var panos = tagging.__panos.filter(function (pano) {
  23532. return pano.neighbourUUIDs.length > 0;
  23533. }); //排除孤立的pano (是否要排除在当前楼层无其他连接的pano,这样的话最好漫游可行中也更改相关设置,及checkHasNeighbor
  23534. if (!panos.length) return;
  23535. tagging.clickToPano = common.sortByScore(panos, [], [function (pano) {
  23536. var panoPos = new THREE.Vector2(pano.position.x, pano.position.z);
  23537. var labelPos = new THREE.Vector2(tagging.center.x, -tagging.center.y);
  23538. return -panoPos.distanceTo(labelPos);
  23539. }])[0].item;
  23540. });
  23541. floor.taggingTables = Object.values(floorJson.tags).filter(function (tagging) {
  23542. return tagging.clickToPano;
  23543. }); //去掉没有pano的
  23544. //---------------end---------------------------------
  23545. var log = "floor".concat(floorIndex, "(").concat(floorJson.name || 'no name', ") \u5171\u6709").concat(floorJson.rooms.length, "\u4E2A\u623F\u95F4\uFF0C\u5206\u522B\u662F ");
  23546. floorJson.rooms.forEach(function (room) {
  23547. log += "\n\u623F\u95F4".concat(room.roomId, " : ").concat(room.name, " ");
  23548. }); //如果从0开始 说明没有外墙
  23549. //建立doorLabel
  23550. floorJson.rooms.forEach(function (room) {
  23551. if (room.taggings.length == 0) return;
  23552. var isClockWise = math$1.getArea(room.points) > 0; //是否顺时针
  23553. room.doors.forEach(function (door) {
  23554. //if (door.atRooms.length < 2) return //忽略atRooms只有一个的门,因为它在墙边上,不通两个房间,比如入户门//2023.7.20发现有时候外围区域没闭合就算不了房间,这样客厅就看不到其他房间了,所以单向门还是要加上
  23555. //获取门朝向(朝房间内的那个法线)
  23556. var points = [];
  23557. if (room.closetChilds) {
  23558. //可能在子环
  23559. var atRoom = door.atRooms.find(function (e) {
  23560. return door.startPoint && door.endPoint;
  23561. });
  23562. isClockWise = math$1.getArea(atRoom.points) > 0; //是否顺时针
  23563. atRoom != room && (isClockWise = !isClockWise); //如果在子环上,判断方向相反
  23564. points = atRoom.points;
  23565. } else {
  23566. points = room.points;
  23567. } //var normal = math.getNormal({ points: [door.startPoint, door.endPoint] })
  23568. var atWall = floorJson.walls[door.parent];
  23569. var point1 = floorJson.points[atWall.start]; //this.searchItemById(atWall.start, Object.values(floorJson.points))
  23570. var point2 = floorJson.points[atWall.end]; //this.searchItemById(atWall.end, Object.values(floorJson.points))
  23571. var pointOrder = _this2.order(point1, point2, points); //p1是否在p2前
  23572. var normal = math$1.getNormal({
  23573. points: [point1, point2]
  23574. });
  23575. var doorDir = new THREE.Vector3(normal.x, 0, -normal.y); //门朝向为:垂直于线条、朝房间内
  23576. if (pointOrder == isClockWise) doorDir.negate();
  23577. var roomOutside = false;
  23578. var panos = room.panos.filter(function (pano) {
  23579. return pano.neighbourUUIDs.length > 0;
  23580. }); //排除孤立的pano
  23581. if (panos.length == 0) {
  23582. //如果该房间没有,选择门外侧一点,范围不可过大
  23583. roomOutside = true;
  23584. panos = floor.panos.filter(function (pano) {
  23585. if (pano.neighbourUUIDs.length == 0) return;
  23586. var pos1 = new THREE.Vector2(door.center.x, -door.center.y);
  23587. var pos2 = new THREE.Vector2(pano.position.x, pano.position.z);
  23588. if (pos1.distanceTo(pos2) > 5) return;
  23589. var panoDir = pano.position.clone().sub(new THREE.Vector3(door.center.x, 0, -door.center.y));
  23590. if (doorDir.angleTo(panoDir) < Math.PI / 2) return true; //在门外这一侧,否则可能到隔壁房间
  23591. });
  23592. }
  23593. var toPano = common.sortByScore(panos, [], [function (pano) {
  23594. var score0 = 0;
  23595. if (roomOutside) {
  23596. //在房间外
  23597. var panoDir = pano.position.clone().sub(new THREE.Vector3(door.center.x, 0, -door.center.y));
  23598. score0 = -doorDir.angleTo(panoDir) * 2; //尽量垂直于门
  23599. }
  23600. var pos1 = new THREE.Vector2(door.center.x, -door.center.y);
  23601. var pos2 = new THREE.Vector2(pano.position.x, pano.position.z);
  23602. return -pos1.distanceTo(pos2) + score0;
  23603. }]); //寻找离该门最近的pano
  23604. toPano = toPano.length ? toPano[0].item : null;
  23605. var forTag = common.sortByScore(room.taggings, [], [function (tagging) {
  23606. var pos1 = toPano ? new THREE.Vector2(toPano.position.x, toPano.position.z) : new THREE.Vector2(door.center.x, door.center.y);
  23607. var pos2 = new THREE.Vector2(tagging.center.x, -tagging.center.y);
  23608. return -pos1.distanceTo(pos2);
  23609. }])[0].item; //如果当前房间有多个tagging,寻找离toPano最近的tagging, 或离该门最近的tagging,作为该门的标签
  23610. var labelPos = new THREE.Vector3(door.center.x, bottom + 0.3, -door.center.y);
  23611. var anotherRoom = door.atRooms.find(function (r) {
  23612. return r != room && r.name;
  23613. }); //先排除没有tagging的,因为可能是冗余room
  23614. if (!anotherRoom) anotherRoom = door.atRooms.find(function (r) {
  23615. return r != room;
  23616. }); //如果没找到,说明对面的房间就是没有tagging
  23617. var minDis1 = 1.5,
  23618. minDis2 = 4,
  23619. maxDis = 15,
  23620. minAngle = Math.PI / 6; //"前方"的判定角度
  23621. var visiPanos1 = anotherRoom ? anotherRoom.panos : _this2.player.model.panos.list.filter(function (e) {
  23622. return !e._atRoom;
  23623. });
  23624. var visiPanos = visiPanos1.filter(function (pano) {
  23625. var distance = pano.position.clone().setY(0).distanceTo(labelPos.clone().setY(0));
  23626. if (distance < minDis1 || distance > maxDis) return; //必要条件
  23627. if (distance > minDis2) return !_this2.isShelter(floorJson, labelPos, pano.position, door.parent); //充分条件
  23628. //门没有打洞的话就会被挡住 没有pano了
  23629. //如果在此pano前方有别的pano,也可见
  23630. var frontPano = visiPanos1.find(function (anotherPano) {
  23631. return Panorama.filters.isInFanAngle(labelPos, pano.position.clone().sub(labelPos).setY(0), minAngle)(anotherPano.position);
  23632. });
  23633. if (frontPano) return !_this2.isShelter(floorJson, labelPos, pano.position, door.parent); //convertTool.ifIntersectChunks(labelPos, pano.position);
  23634. });
  23635. if (visiPanos.length) {
  23636. var doorLabel = new DoorLabel(_this2.player, {
  23637. doorDir,
  23638. text: forTag.title,
  23639. pos: labelPos,
  23640. visiblePanos: visiPanos,
  23641. sameRoomPanos: visiPanos1,
  23642. toPano,
  23643. aim: new THREE.Vector3(forTag.center.x, 0, -forTag.center.y),
  23644. floorIndex
  23645. });
  23646. doorLabel.door = door;
  23647. doorLabel.forRoom = room;
  23648. doorLabel.forTag = forTag;
  23649. door.doorLabels.push(doorLabel);
  23650. _this2.player.defaultRoomLabels.push(doorLabel);
  23651. } else {
  23652. console.log("\u56E0\u65E0visiblePanos\u53D6\u6D88\u521B\u5EFAdoorlabel\u7684\u95E8\uFF1A ".concat(anotherRoom ? anotherRoom.name : '(未闭合区域) ', "\u901A\u5F80 ").concat(forTag.title, " "));
  23653. }
  23654. });
  23655. }); //doors = doors.filter(door => door.atRooms.length > 1)
  23656. log += "\n\u95E8\u5171\u6709".concat(doors.length, "\u6247\uFF1A \n"); //其中仍包括一些无效门,连通的是冗余房间
  23657. doors.forEach(function (door, index) {
  23658. log += "\u95E8".concat(door.vectorId, "\u5728 ");
  23659. door.atRooms.forEach(function (room) {
  23660. log += "\u623F\u95F4".concat(room.roomId, "(").concat(room.name, ")\u3001 ");
  23661. });
  23662. log += "\u7684\u8FB9\u4E0A \n";
  23663. }); //门一定要真的放在当前线上(因为门可以游走,所以很难判断是否真的是当前的线)
  23664. console.log("%c".concat(log), 'color:#13f');
  23665. this.player.doorLabels.forEach(function (label) {
  23666. label.update();
  23667. });
  23668. this.player.updateLabelZIndex(['doorLabels']);
  23669. DoorLabel.updateCameraDir(this.player);
  23670. }
  23671. }, {
  23672. key: "setPlanLabelVisi",
  23673. value: function setPlanLabelVisi(show, floorIndex) {
  23674. var metadata = this.player.$app.store.getValue('metadata') || {};
  23675. if (metadata.floorPlanAngle != void 0) return; //代表是新版,cad图里的文字直接被planLabel取代,因此不用该函数
  23676. if (!this.initedLabel) return;
  23677. if (show == void 0) {
  23678. show = this.player.model.floorplanCadImg.getVisible();
  23679. }
  23680. var planLabels = this.player.planLabels;
  23681. if (floorIndex != void 0) {
  23682. planLabels = planLabels.filter(function (label) {
  23683. return label.floorIndex == floorIndex;
  23684. });
  23685. }
  23686. planLabels.forEach(function (label) {
  23687. label.enable = show;
  23688. label.update();
  23689. }); //dontShow完全和cad是否该显示有关 而labelEnable则还要额外考虑其他
  23690. }
  23691. }, {
  23692. key: "setDoorLabelVisi",
  23693. value: function setDoorLabelVisi(show, floorIndex) {
  23694. var metadata = this.player.$app.store.getValue('metadata') || {};
  23695. if (metadata.floorPlanAngle != void 0) return;
  23696. if (!this.initedLabel) return;
  23697. var doorLabels = this.player.doorLabels;
  23698. if (floorIndex != void 0) {
  23699. doorLabels = doorLabels.filter(function (label) {
  23700. return label.floorIndex == floorIndex;
  23701. });
  23702. }
  23703. doorLabels.forEach(function (label) {
  23704. label.enable = show;
  23705. label.update();
  23706. });
  23707. }
  23708. }, {
  23709. key: "setDollLabelVisi",
  23710. value: function setDollLabelVisi(show, floorIndex) {
  23711. var metadata = this.player.$app.store.getValue('metadata') || {};
  23712. if (metadata.floorPlanAngle != void 0) return;
  23713. if (!this.initedLabel) return;
  23714. var dollLabels = this.player.dollLabels;
  23715. if (floorIndex != void 0) {
  23716. dollLabels = dollLabels.filter(function (label) {
  23717. return label.floorIndex == floorIndex;
  23718. });
  23719. }
  23720. dollLabels.forEach(function (label) {
  23721. label.enable = show;
  23722. label.update();
  23723. });
  23724. }
  23725. }, {
  23726. key: "updateEntryVisi",
  23727. value: function updateEntryVisi(show, floorIndex) {
  23728. var _this3 = this;
  23729. // 更改楼层的entryArrow显示
  23730. // “平面图”和“漫游可行”不显示entryArrow
  23731. var visi = !(this.player.model.floorplanCadImg && this.player.model.floorplanCadImg.isEdit) && !(this.player.linkEditor && this.player.linkEditor.setPanoVisible); // console.log('updateEntryVisi', show)
  23732. var floors = this.player.model.floors;
  23733. if (floorIndex != void 0) {
  23734. floors = floors.filter(function (floor) {
  23735. return floor.floorIndex == floorIndex;
  23736. });
  23737. }
  23738. floors.forEach(function (floor) {
  23739. if (!floor.entryArrow.length) return;
  23740. if (visi) {
  23741. if (show == false) visi = false;
  23742. /*if (show == true)*/
  23743. else {
  23744. //需要额外判断一下
  23745. var mode = _this3.player.modeTran.split('-')[1];
  23746. if (mode == 'floorplan') visi = true; //visi = floor.plane && floor.plane.visible
  23747. else if (mode == 'panorama') visi = false;else if (mode == 'dollhouse') visi = true;else visi = false; // if(visi && this.player.model.currentFloor.floorIndex != floor.floorIndex) visi = false
  23748. }
  23749. }
  23750. floor.entryArrow.forEach(function (arrow) {
  23751. return visi ? arrow.show() : arrow.hide();
  23752. });
  23753. });
  23754. }
  23755. }, {
  23756. key: "moveEntryArrow",
  23757. value: function moveEntryArrow(index) {
  23758. var floor = this.player.model.floors.index[index];
  23759. if (floor.entryArrow.length && floor.cadImgRatio) {
  23760. var wallDepth = 24; // 墙壁厚度恒定24px (2880*1620图时测得)
  23761. var shiftY = wallDepth * this.player.model.floors.index[index].cadImgRatio; //得到墙壁真实厚度 按理说应该除以2的,但是不除以2却刚好
  23762. floor.entryArrow.forEach(function (arrow) {
  23763. return arrow.moveCloseToWall(shiftY);
  23764. });
  23765. }
  23766. } //广度搜索
  23767. }, {
  23768. key: "searchAtRoom",
  23769. value: function searchAtRoom(floorJson, room, object, pos, callback) {
  23770. var _this4 = this;
  23771. var inside = math$1.isPointInArea(room.points, pos);
  23772. if (inside) {
  23773. if (room.closetChilds) {
  23774. var finded = room.closetChilds.find(function (roomId) {
  23775. return _this4.searchAtRoom(floorJson, floorJson.rooms.find(function (e) {
  23776. return e.roomId == roomId;
  23777. }), object, pos, callback);
  23778. });
  23779. if (!finded) {
  23780. callback(room);
  23781. }
  23782. } else {
  23783. callback(room);
  23784. }
  23785. return true;
  23786. }
  23787. }
  23788. }, {
  23789. key: "order",
  23790. value: function order(p1, p2, points) {
  23791. //wall的p1 p2在ground中是否p1在前一个
  23792. /* var p1 = points.find(point => point.vectorId == p1ID)
  23793. var p2 = points.find(point => point.vectorId == p2ID) */
  23794. var index1 = points.indexOf(p1);
  23795. var index2 = points.indexOf(p2);
  23796. return (index2 - index1 + points.length) % points.length === 1;
  23797. }
  23798. }, {
  23799. key: "isShelter",
  23800. value: function isShelter(floorJson, labelPos, panoPos, atWall) {
  23801. //performance.mark('isShelter-start')
  23802. var line1 = [new THREE.Vector2(labelPos.x, -labelPos.z), new THREE.Vector2(panoPos.x, -panoPos.z)];
  23803. var isIntersect = Object.values(floorJson.walls).find(function (wall) {
  23804. if (atWall != void 0 && wall.vectorId != void 0 && wall.vectorId === atWall) return;
  23805. var point1 = floorJson.points[wall.start]; //this.searchItemById(wall.start, Object.values(floorJson.points))
  23806. var point2 = floorJson.points[wall.end]; //this.searchItemById(wall.end, Object.values(floorJson.points))
  23807. var line2 = [point1, point2];
  23808. return math$1.isLineIntersect(line1, line2);
  23809. });
  23810. /* performance.mark('isShelter-end')
  23811. let measure = performance.measure('isShelter', "isShelter-start", "isShelter-end");
  23812. console.log('isShelter', measure.duration.toFixed(3))
  23813. */
  23814. return isIntersect;
  23815. }
  23816. /* searchItemById(id, arr) {
  23817. for (let i = 0, len = arr.length; i < len; i++) {
  23818. if (arr[i].vectorId == id) {
  23819. return arr[i]
  23820. }
  23821. }
  23822. } */
  23823. /* sortByScore = function(list, request, rank) {
  23824. var i = common.filterAll(list, request)
  23825. return 0 === i.length
  23826. ? null
  23827. : (i = i
  23828. .map(function(e) {
  23829. return {
  23830. item: e,
  23831. score: rank.reduce(function(t, i) {
  23832. return t + i(e)
  23833. }, 0)
  23834. }
  23835. })
  23836. .sort(function(e, t) {
  23837. return t.score - e.score
  23838. }))
  23839. } */
  23840. }, {
  23841. key: "show",
  23842. value: function show(floorIndex) {
  23843. this.updateEntryVisi(true, floorIndex);
  23844. this.setPlanLabelVisi(true, floorIndex);
  23845. this.setDoorLabelVisi(true, floorIndex);
  23846. this.setDollLabelVisi(true, floorIndex);
  23847. }
  23848. }, {
  23849. key: "hide",
  23850. value: function hide(floorIndex) {
  23851. this.updateEntryVisi(false, floorIndex);
  23852. this.setPlanLabelVisi(false, floorIndex);
  23853. this.setDoorLabelVisi(false, floorIndex);
  23854. this.setDollLabelVisi(false, floorIndex);
  23855. }
  23856. }, {
  23857. key: "reset",
  23858. value: function reset() {
  23859. this.player.defaultRoomLabels.forEach(function (label) {
  23860. return label.remove();
  23861. });
  23862. this.player.model.floors.forEach(function (floor) {
  23863. floor.entryArrow.forEach(function (arrow) {
  23864. return arrow.dispose();
  23865. });
  23866. });
  23867. }
  23868. }, {
  23869. key: "gotoFloor",
  23870. value: function gotoFloor(index) {
  23871. this.hide();
  23872. this.show(index);
  23873. }
  23874. }]);
  23875. return LabelManager;
  23876. }();
  23877. function getPointForRevRotate(vec2, angle, modelCenter) {
  23878. // let modelCenter = new THREE.Vector3(0, 0, 0)
  23879. var point = new THREE.Vector2(vec2.x, vec2.y);
  23880. if (Math.abs(angle) < 0.01 || Math.abs(angle - 2 * Math.PI) < 0.01) {
  23881. return point;
  23882. } else {
  23883. var x = (point.x - modelCenter.x) * Math.cos(angle) - (point.y - modelCenter.z) * Math.sin(angle) + modelCenter.x;
  23884. var y = (point.y - modelCenter.z) * Math.cos(angle) + (point.x - modelCenter.x) * Math.sin(angle) + modelCenter.z;
  23885. point.x = x;
  23886. point.y = y;
  23887. return point;
  23888. }
  23889. }
  23890. var ModelSide = {
  23891. side: null //空为自动,有值锁定side
  23892. };
  23893. ModelSide.setSide = function (side) {
  23894. if (side === THREE.FrontSide || side === THREE.BackSide || side === THREE.DoubleSide) {
  23895. this.side = side;
  23896. } else {
  23897. this.side = null;
  23898. }
  23899. };
  23900. var ModelSideManager = function ModelSideManager(player) {
  23901. var _this = this;
  23902. _classCallCheck(this, ModelSideManager);
  23903. this.tempAuto = function () {
  23904. _this.recoverSide = ModelSide.side;
  23905. ModelSide.setSide(null);
  23906. _this.updateSide();
  23907. };
  23908. this.recover = function () {
  23909. ModelSide.setSide(_this.recoverSide);
  23910. _this.recoverSide = null;
  23911. _this.updateSide();
  23912. };
  23913. this.updateSide = function () {
  23914. if (_this.player.mode === Viewmode$1.FLOORPLAN) {
  23915. _this.player.model.setMode('floorplan');
  23916. } else if (_this.player.mode === Viewmode$1.DOLLHOUSE) {
  23917. _this.player.model.setMode('dollhouse');
  23918. }
  23919. };
  23920. this.player = player;
  23921. this.recoveSide = null;
  23922. };
  23923. var initDir = new THREE.Vector3(0, 0, -1); //指南针模型的北方向
  23924. /**
  23925. * 指南针
  23926. * 相关css在 ./label/static/label.css
  23927. */
  23928. var Compass = /*#__PURE__*/function () {
  23929. function Compass(player) {
  23930. _classCallCheck(this, Compass);
  23931. this.angle = 0;
  23932. this.quar = new THREE.Quaternion();
  23933. this.player = player;
  23934. this.config = player.$app.config;
  23935. this.init();
  23936. this.show = false;
  23937. this.force = false;
  23938. this.switch('direction');
  23939. }
  23940. _createClass(Compass, [{
  23941. key: "switch",
  23942. value: function _switch(type) {
  23943. this.type = type;
  23944. if (type == 'direction') {
  23945. this.dirTextNDiv.style.display = 'block';
  23946. this.dirTextXDiv.style.display = 'none';
  23947. this.dirTextYDiv.style.display = 'none';
  23948. this.dirTextZDiv.style.display = 'none';
  23949. this.lines.visible = false;
  23950. this.cones.visible = true;
  23951. }
  23952. if (type == 'axis') {
  23953. this.dirTextNDiv.style.display = 'none';
  23954. this.dirTextXDiv.style.display = 'block';
  23955. this.dirTextYDiv.style.display = 'block';
  23956. this.dirTextZDiv.style.display = 'block';
  23957. this.lines.visible = true;
  23958. this.cones.visible = false;
  23959. }
  23960. this.autoJudgeDisplay();
  23961. }
  23962. }, {
  23963. key: "init",
  23964. value: function init() {
  23965. var _this = this;
  23966. var width = 50,
  23967. height = 50;
  23968. this.dom = document.createElement('div');
  23969. this.dom.id = 'compass';
  23970. this.dom.innerHTML = "\n <div class=\"dirText north\"> <span>N</span> </div>\n\n <div id=\"dirTextX\" class=\"dirText\"> <span>X</span> </div>\n <div id=\"dirTextY\" class=\"dirText\"> <span>Y</span> </div>\n <div id=\"dirTextZ\" class=\"dirText\"> <span>Z</span> </div>\n <div class=\"center\"></div>\n ";
  23971. this.player.domElement.append(this.dom);
  23972. this.dirTextNDiv = this.dom.querySelector('.north');
  23973. this.dirTextXDiv = this.dom.querySelector('#dirTextX');
  23974. this.dirTextYDiv = this.dom.querySelector('#dirTextY');
  23975. this.dirTextZDiv = this.dom.querySelector('#dirTextZ');
  23976. this.centerDiv = this.dom.querySelector('.center');
  23977. if (this.config.view) {
  23978. this.dom.style.right = this.config.mobile ? '1%' : '2%';
  23979. this.dom.style.top = this.config.mobile ? '10%' : '4%';
  23980. } else {
  23981. this.dom.style.right = this.config.mobile ? '1%' : '277px';
  23982. this.dom.style.top = this.config.mobile ? '10%' : '55px';
  23983. }
  23984. this.centerDiv.style.width = width + 'px';
  23985. this.centerDiv.style.height = height + 'px';
  23986. if (this.config.mobile) {
  23987. var _this$player$getSize = this.player.getSize(),
  23988. clientWidth = _this$player$getSize.clientWidth,
  23989. clientHeight = _this$player$getSize.clientHeight;
  23990. var minWidth = Math.min(clientWidth, clientHeight);
  23991. if (minWidth < 450) {
  23992. var initScale = Math.round(minWidth / 450 * 1000) / 1000;
  23993. this.dom.transform = " scale(".concat(initScale, ")");
  23994. }
  23995. }
  23996. try {
  23997. ;
  23998. this.renderer = new THREE.WebGLRenderer({
  23999. antialias: this.config.antialias,
  24000. alpha: true
  24001. }), this.renderer.autoClear = !0, this.renderer.setPixelRatio(window.devicePixelRatio ? window.devicePixelRatio : 1), this.renderer.domElement.setAttribute('name', 'compass');
  24002. this.renderer.setClearAlpha(0.0);
  24003. this.renderer.setSize(width, height, false, window.devicePixelRatio ? window.devicePixelRatio : 1);
  24004. } catch (e) {
  24005. throw new RendererCreationException('Unable to create a WebGL rendering context');
  24006. }
  24007. this.centerDiv.appendChild(this.renderer.domElement);
  24008. this.camera = new THREE.PerspectiveCamera();
  24009. this.camera.fov = 70;
  24010. this.scene = new THREE.Scene(), this.scene.add(this.camera);
  24011. this.createCompass();
  24012. /* this.player.on('scene/LoadHouseFloor', () => {
  24013. this.setNorth()
  24014. })
  24015. this.player.on('changeDir', () => {
  24016. this.setNorth()
  24017. }) //点击旋转户型图按钮 */
  24018. var floorUserData = this.player.$app.store.getValue('flooruser');
  24019. this.angle = (floorUserData.compass - THREE.MathUtils.radToDeg(floorUserData.angle) + 360) % 360 || 0;
  24020. this.player.$app.store.on('flooruser', function (data) {
  24021. //在cad页面 点击保存后,更新cad和指南针的旋转
  24022. _this.angle = (data.compass - THREE.MathUtils.radToDeg(data.angle) + 360) % 360 || 0;
  24023. });
  24024. }
  24025. /* setNorth() {
  24026. //设置北方向,这决定了自身的朝向。
  24027. const floors = this.player.$app.store.getValue('flooruser').floors
  24028. if (!floors || !floors.length) {
  24029. return
  24030. }
  24031. const floor = floors[0]
  24032. const metadata = this.player.$app.store.getValue('metadata') || {}
  24033. this.angle = ((floor && floor.dire) || 0) + THREE.MathUtils.radToDeg(parseFloat(metadata.floorPlanAngle || 0)) //基础朝向
  24034. this.cones.rotation.y = Math.PI / 2 - THREE.MathUtils.degToRad(this.angle)
  24035. console.log('dir:' + floor.dire + ', floorPlanAngle:' + metadata.floorPlanAngle)
  24036. this.update()
  24037. this.player.model.floorLogos.setDir(this.angle)
  24038. } */
  24039. }, {
  24040. key: "createCompass",
  24041. value: function createCompass() {
  24042. //ConeBufferGeometry(radius : Float, height : Float, radialSegments : Integer, heightSegments : Integer, openEnded : Boolean, thetaStart : Float, thetaLength : Float)
  24043. var height = 2;
  24044. var geometry1 = new THREE.ConeBufferGeometry(0.7, height, 4, true);
  24045. var geometry2 = new THREE.ConeBufferGeometry(0.7, height, 4, true);
  24046. var material = new THREE.MeshBasicMaterial({
  24047. vertexColors: true
  24048. }); //指南针由两个四棱锥拼成,为了渐变颜色,采用指定vertexColor的方式。
  24049. var setColor = function setColor(geometry, color1, color2) {
  24050. var colors = [];
  24051. for (var i = 0, n = geometry.attributes.position.count; i < n; ++i) {
  24052. colors.push(1, 1, 1);
  24053. }
  24054. var set = function set(index, color) {
  24055. //设置第index个点的颜色
  24056. colors[index * 3 + 0] = color[0];
  24057. colors[index * 3 + 1] = color[1];
  24058. colors[index * 3 + 2] = color[2];
  24059. };
  24060. var mid = [(color1[0] + color2[0]) / 2, (color1[1] + color2[1]) / 2, (color1[2] + color2[2]) / 2];
  24061. set(1, color1);
  24062. set(5, color1);
  24063. set(6, color1);
  24064. set(2, mid);
  24065. set(3, mid);
  24066. set(7, mid);
  24067. set(4, color2);
  24068. set(8, color2);
  24069. set(9, color2);
  24070. geometry.setAttribute('color', new THREE.BufferAttribute(new Float32Array(colors), 3));
  24071. };
  24072. var blue1 = [1 / 255, 238 / 255, 245 / 255]; //逐渐变深
  24073. var blue2 = [20 / 255, 146 / 255, 170 / 255];
  24074. var blue3 = [40 / 255, 60 / 255, 103 / 255];
  24075. setColor(geometry1, blue1, blue2);
  24076. setColor(geometry2, blue2, blue3);
  24077. /* 朝箭头方向看点构成如下 虽然geometry.attributes.position.count = 19 只有1-9设置的颜色是有效的 另外为什么7决定了上下两边的颜色呢…… 5、9可将其分成上下两个颜色
  24078. 6
  24079. /|\
  24080. / | \
  24081. 7 /_2|1_\ 5
  24082. \ 3|4 / 9
  24083. \ | /
  24084. \|/
  24085. 8
  24086. */
  24087. var cone = new THREE.Mesh(geometry1, material);
  24088. cone.position.setY(height / 2);
  24089. geometry1.computeVertexNormals(); //computeFaceNormals
  24090. geometry2.computeVertexNormals();
  24091. var cones = new THREE.Object3D();
  24092. cones.add(cone);
  24093. var cone2 = new THREE.Mesh(geometry2, material);
  24094. cone2.rotation.x = Math.PI;
  24095. cone2.position.setY(-height / 2);
  24096. cones.add(cone2);
  24097. cones.rotation.z = Math.PI / 2;
  24098. cones.rotation.y = Math.PI / 2; //转向initDir的方向
  24099. cones.scale.set(0.7, 0.7, 0.7);
  24100. this.scene.add(cones);
  24101. this.cones = cones;
  24102. var lines = new THREE.Object3D();
  24103. var lineX = new THREE.Line(new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, 10)]), new THREE.LineBasicMaterial({
  24104. color: 0x0000ff
  24105. }));
  24106. lines.add(lineX);
  24107. var lineY = new THREE.Line(new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 10, 0)]), new THREE.LineBasicMaterial({
  24108. color: 0x00ff00
  24109. }));
  24110. lines.add(lineY);
  24111. var lineZ = new THREE.Line(new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0, 0, 0), new THREE.Vector3(10, 0, 0)]), new THREE.LineBasicMaterial({
  24112. color: 0xff0000
  24113. }));
  24114. lines.add(lineZ);
  24115. this.lines = lines;
  24116. this.scene.add(lines);
  24117. }
  24118. }, {
  24119. key: "update",
  24120. value: function update(quaternion) {
  24121. if (!this.show) return;
  24122. if (!quaternion) quaternion = this.player.camera.quaternion.clone();
  24123. this.cones.rotation.y = Math.PI / 2 - this.angle / 180 * Math.PI; // 指南针基础方向
  24124. this.updateCamera(quaternion);
  24125. this.updateLabel(quaternion);
  24126. this.render();
  24127. }
  24128. }, {
  24129. key: "updateLabel",
  24130. value: function updateLabel(quaternion) {
  24131. //更新北标签
  24132. var dir = this.player.getDirection();
  24133. var oriDir = initDir.clone(); //指南针最初始时的北方向
  24134. var extraQua;
  24135. if (this.player.mode == 'transitioning') {
  24136. //当transitioning时,相机的quaternion不是用control的lookAt算出来,而是直接由一个quaternion过渡到另一个,这样相机将会是歪的,投影面也就不会是原先的水平面。
  24137. var tempCamera = new THREE.Camera(); //借用camera的lookAt算出如果正视同样的target, quaternion会是什么值。 将它乘以当前相机quaternion,得到的就是相机歪的旋转值。
  24138. tempCamera.position.copy(this.camera.position);
  24139. tempCamera.lookAt(tempCamera.position.clone().add(dir));
  24140. var q = tempCamera.quaternion.invert();
  24141. extraQua = q.premultiply(quaternion); //歪掉的额外旋转值
  24142. } //北标签的方向为指南针轮盘方向,也就是要将camera的方向投影到水平面上。 但是如果相机歪了,看到的世界都会歪一定角度,投影面也要歪一定角度。
  24143. var up = new THREE.Vector3(0, 1, 0); //投影水平面的法线,也是相机的摆正的up方向
  24144. extraQua && up.applyQuaternion(extraQua);
  24145. dir.projectOnPlane(up); //将方向投影到水平面上; 如果相机不是正视(extraQua不为0001),就要将水平面也转动
  24146. oriDir.projectOnPlane(up); //为什么initDir投影了和没有投影angle结果一样
  24147. var angle = dir.angleTo(oriDir);
  24148. if (dir.cross(oriDir).y > 0) angle = -angle;
  24149. var deg = this.angle - 90 + THREE.MathUtils.radToDeg(angle); //因为css写的样式初始是指向右方,和initDir差了90°,所以减去。
  24150. if (this.type == 'axis') {
  24151. this.dirTextXDiv.style.transform = 'rotate(' + (deg + 90 - this.angle) + 'deg)';
  24152. this.dirTextXDiv.querySelector('span').style.transform = 'rotate(' + -(deg + 90 - this.angle) + 'deg)';
  24153. this.dirTextYDiv.style.transform = 'rotate(' + -90 + 'deg)';
  24154. this.dirTextYDiv.querySelector('span').style.transform = 'rotate(' + 90 + 'deg)';
  24155. this.dirTextZDiv.style.transform = 'rotate(' + (deg + 90 + 90 - this.angle) + 'deg)';
  24156. this.dirTextZDiv.querySelector('span').style.transform = 'rotate(' + -(deg + 90 + 90 - this.angle) + 'deg)';
  24157. } else {
  24158. this.dirTextNDiv.style.transform = 'rotate(' + deg + 'deg)';
  24159. this.dirTextNDiv.querySelector('span').style.transform = 'rotate(' + -deg + 'deg)';
  24160. }
  24161. }
  24162. }, {
  24163. key: "updateCamera",
  24164. value: function updateCamera(quaternion) {
  24165. //更新canvas中的指南针表现,也就是更新相机,和场景中的相机朝向一致。
  24166. var radius = 5; //相机距离
  24167. this.camera.quaternion.copy(quaternion);
  24168. var dir = this.player.getDirection(); //相机朝向
  24169. this.camera.position.copy(dir.multiplyScalar(radius).negate()); //相机绕着指南针中心(000)转动
  24170. }
  24171. }, {
  24172. key: "render",
  24173. value: function render() {
  24174. this.renderer.render(this.scene, this.camera);
  24175. }
  24176. }, {
  24177. key: "setDisplay",
  24178. value: function setDisplay(state, force) {
  24179. if (this.force && force == void 0) {
  24180. return;
  24181. }
  24182. if (force != void 0) {
  24183. this.force = force;
  24184. }
  24185. this.show = !!state;
  24186. if (this.show) {
  24187. this.update(); // this.dom.fadeIn(100)
  24188. this.dom.style.display = 'block';
  24189. } else {
  24190. // this.dom.fadeOut(100)
  24191. this.dom.style.display = 'none';
  24192. }
  24193. }
  24194. }, {
  24195. key: "autoJudgeDisplay",
  24196. value: function autoJudgeDisplay() {
  24197. // if(this.player.modeTran.split("-")[1] != "panorama" && store.getters.page != 'cad' && store.getters.page != 'data') {
  24198. if (this.player.modeTran.split('-')[1] != 'panorama' || this.type == 'axis') {
  24199. this.setDisplay(true);
  24200. } else {
  24201. this.setDisplay(false);
  24202. }
  24203. }
  24204. }, {
  24205. key: "setDomLeft",
  24206. value: function setDomLeft() {
  24207. this.dom.css({
  24208. right: 'none',
  24209. left: this.config.mobile ? '1%' : '2%'
  24210. });
  24211. }
  24212. }]);
  24213. return Compass;
  24214. }();
  24215. function _createSuper$14(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$14(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  24216. function _isNativeReflectConstruct$14() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  24217. var player$8, sceneRenderer$2, app;
  24218. var planeGeo1, planeGeo2, balloonMap, balloonMap2, defaultCircleMap, defaultExitMap, camera, scene, mesh, isEdit;
  24219. var viewLinkEdit = {};
  24220. var fishEyeRadius = 10; //使用鱼眼尽量提高清晰度。即渲染出相机在接近球边缘的地方看向球心的画面,球上是全景图。
  24221. /*
  24222. 将全景图渲染成某个漫游视角的贴图 renderTarget的作用是直接将渲染结果作为贴图
  24223. */
  24224. var render = function render(renderTarget, unDealTex, enterQuaternion) {
  24225. mesh.material.uniforms.tDiffuse.value = unDealTex;
  24226. var rot90 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI / 2);
  24227. camera.quaternion.copy(new THREE.Quaternion().multiplyQuaternions(rot90, enterQuaternion)); //改 为球目全景照片而改
  24228. var target = new THREE.Vector3(0, 0, -fishEyeRadius * 0.8).applyQuaternion(camera.quaternion);
  24229. camera.position.copy(target.clone().negate());
  24230. var V = sceneRenderer$2.renderer.autoClear;
  24231. sceneRenderer$2.renderer.autoClear = !1; // sceneRenderer.renderer.render(scene, camera, renderTarget, !1)
  24232. sceneRenderer$2.renderer.setRenderTarget(renderTarget); // sceneRenderer.renderer.clear()
  24233. sceneRenderer$2.renderer.render(scene, camera);
  24234. sceneRenderer$2.renderer.setRenderTarget(null);
  24235. sceneRenderer$2.renderer.autoClear = V;
  24236. };
  24237. var dealURL = function dealURL(url) {
  24238. console.log(url);
  24239. if (url &&
  24240. /* url.slice(0, 5) != 'blob:' && url.slice(0, 4) != 'http') || */
  24241. !url.includes('/')) {
  24242. var src = app.resource.getUserResourceURL(url);
  24243. return src;
  24244. } else return url;
  24245. };
  24246. var ViewLinkManager = /*#__PURE__*/function (_THREE$EventDispatche) {
  24247. _inherits(ViewLinkManager, _THREE$EventDispatche);
  24248. var _super = _createSuper$14(ViewLinkManager);
  24249. function ViewLinkManager(app_, player_) {
  24250. var _this;
  24251. _classCallCheck(this, ViewLinkManager);
  24252. _this = _super.call(this);
  24253. app = app_;
  24254. isEdit = !app.config.view;
  24255. player$8 = player_;
  24256. sceneRenderer$2 = app.core.get('SceneRenderer');
  24257. _this.loaded = false;
  24258. _this.enabled = true;
  24259. _this.views = {};
  24260. _this.ViewLinkCircles = new THREE.Object3D();
  24261. _this.ViewLinkCircles.name = 'ViewLinkCircles';
  24262. _this.ViewLinkBalloons = new THREE.Object3D();
  24263. _this.ViewLinkBalloons.name = 'ViewLinkBalloons';
  24264. _this.ViewLinkExits = new THREE.Object3D();
  24265. _this.ViewLinkExits.name = 'ViewLinkExits';
  24266. _this.ViewTitles = new THREE.Object3D();
  24267. _this.ViewTitles.name = 'ViewTitles';
  24268. _this.addEventListener('getViewLinkEdit', function (e) {
  24269. viewLinkEdit = e.v;
  24270. });
  24271. app.Scene.on('loadeddata', function () {
  24272. var data = app.store.getValue('links');
  24273. if (!data) {
  24274. _this.init();
  24275. return;
  24276. }
  24277. if (!player$8.model.builded) {
  24278. //floor需要
  24279. return player$8.model.addEventListener('builded', _this.init.bind(_assertThisInitialized(_this), data));
  24280. }
  24281. _this.init(data);
  24282. });
  24283. return _this;
  24284. }
  24285. _createClass(ViewLinkManager, [{
  24286. key: "init",
  24287. value: function init(data) {
  24288. var _this2 = this;
  24289. ViewLink.init();
  24290. this.createViews(data);
  24291. player$8.model.add(this.ViewLinkCircles);
  24292. player$8.model.add(this.ViewLinkBalloons);
  24293. player$8.model.add(this.ViewLinkExits);
  24294. player$8.model.add(this.ViewTitles);
  24295. this.inited = true; //if(isEdit)viewLinkEdit.init();
  24296. if (player$8.currentPano && player$8.currentPano.hasVideo) {
  24297. //初始画面是有视频点的地方,延迟出现。因为circle容易闪烁,可能是被视频遮盖。
  24298. this.ViewLinkCircles.visible = false;
  24299. this.ViewLinkBalloons.visible = false;
  24300. this.ViewLinkExits.visible = false;
  24301. setTimeout(function () {
  24302. if (_this2.enabled) {
  24303. _this2.ViewLinkCircles.visible = true;
  24304. _this2.ViewLinkBalloons.visible = true;
  24305. _this2.ViewLinkExits.visible = true;
  24306. }
  24307. }, 1000);
  24308. }
  24309. var intersectMesh,
  24310. viewMeshes = [];
  24311. player$8.on('collectIntersectMesh', function (meshes, e) {
  24312. //推送要intersect的mesh
  24313. if (!_this2.inited || !_this2.enabled
  24314. /* || (isEdit && store.getters.page == 'videos') */
  24315. ) return;
  24316. var detectChunk = true;
  24317. if (player$8.isOutsideMode()) {
  24318. if (viewLinkEdit.markView) {
  24319. viewMeshes = [viewLinkEdit.markView.balloon.mesh];
  24320. } else {
  24321. viewMeshes = _this2.ViewLinkBalloons.children;
  24322. }
  24323. } else if (player$8.is360View(player$8.mode, player$8.currentPano)) {
  24324. if (viewLinkEdit.settingEntry) viewMeshes = []; //设置进入画面
  24325. else if (viewLinkEdit.settingVisibles) {
  24326. viewMeshes = _this2.ViewLinkCircles.children;
  24327. } else {
  24328. viewMeshes = _this2.ViewLinkExits.children.concat(_this2.ViewLinkCircles.children);
  24329. }
  24330. detectChunk = false;
  24331. } else {
  24332. if (viewLinkEdit.markView) {
  24333. //可以拖拽
  24334. viewMeshes = [viewLinkEdit.markView.circle.mesh];
  24335. detectChunk = false;
  24336. } else {
  24337. viewMeshes = _this2.ViewLinkCircles.children;
  24338. }
  24339. }
  24340. if (detectChunk) {
  24341. meshes.push.apply(meshes, _toConsumableArray(viewMeshes));
  24342. } else {
  24343. //非detectChunk状态下intersect到的话,直接dealwithIntersect, 将不会执行下面judgeIntersect的
  24344. var intersect = convertTool.getMouseIntersect(player$8.camera, viewMeshes, player$8.mouse);
  24345. if (intersect && viewMeshes.includes(intersect.object)) {
  24346. intersectMesh = intersect;
  24347. _this2.dealwithIntersect(intersect);
  24348. e.consume();
  24349. }
  24350. }
  24351. });
  24352. player$8.on('judgeIntersect', function (intersect, e) {
  24353. //判断是否intersect了overlay
  24354. if (e.getConsumed()) return;
  24355. if (intersect && viewMeshes.includes(intersect.object)) {
  24356. intersectMesh = intersect;
  24357. e.consume();
  24358. } else {
  24359. intersectMesh = null;
  24360. }
  24361. _this2.dealwithIntersect(intersectMesh);
  24362. });
  24363. player$8.on('click', function (e) {
  24364. //判断是否intersect了overlay
  24365. if (e.getConsumed()) return;
  24366. if (_this2.dealWithClick()) {
  24367. e.consume();
  24368. }
  24369. });
  24370. player$8.on('update', function (e) {
  24371. if (e.hasChanged.cameraChanged) {
  24372. _this2.update();
  24373. }
  24374. });
  24375. player$8.on('mode.changing', function (fromMode, toMode, pano, dur) {
  24376. //转换前
  24377. if (fromMode == 'panorama') {
  24378. setTimeout(function () {
  24379. for (var i in _this2.views) {
  24380. _this2.views[i].balloon.showOrHide(true, dur / 2, 'auto');
  24381. _this2.views[i].circle.setVisible(false);
  24382. }
  24383. viewLinkEdit.markView && viewLinkEdit.markView.circle.setVisible(true);
  24384. }, dur || 500);
  24385. } else if (fromMode == 'floorplan') {
  24386. for (var i in _this2.views) {
  24387. _this2.views[i].balloon.mesh.material.depthTest = true; //防止其他楼层遮挡
  24388. }
  24389. }
  24390. if (toMode == 'floorplan') {
  24391. setTimeout(function () {
  24392. for (var _i in _this2.views) {
  24393. _this2.views[_i].balloon.mesh.material.depthTest = false; //防止其他楼层遮挡
  24394. }
  24395. }, dur);
  24396. }
  24397. if (toMode == 'panorama') {
  24398. for (var _i2 in _this2.views) {
  24399. _this2.views[_i2].balloon.showOrHide(false);
  24400. _this2.views[_i2].circle.setVisible(true);
  24401. }
  24402. viewLinkEdit.cancelPos && viewLinkEdit.cancelPos();
  24403. }
  24404. }); //let floorsVisi = {}
  24405. player$8.model.on('floor.changed', function (currentFloor, toMode, oldFloor) {
  24406. if (player$8.mode == 'panorama' && toMode != 'panorama') return; //使用mode.changing
  24407. var isAll = player$8.model.allFloorsVisible;
  24408. player$8.model.floors.forEach(function (floor) {
  24409. if (floor == currentFloor || isAll) {
  24410. //floorsVisi[floor.floorIndex] = true
  24411. if (toMode == 'floorplan' || toMode == 'dollhouse') {
  24412. floor.views.forEach(function (view) {
  24413. view.balloon.showOrHide(true, 500);
  24414. });
  24415. }
  24416. } else {
  24417. floor.views.forEach(function (view) {
  24418. viewLinkEdit.markView != view && view.balloon.showOrHide(false, 500);
  24419. });
  24420. }
  24421. });
  24422. });
  24423. if (player$8.$app.config.view) {
  24424. //展示页面。 不要遮住漫游点视频
  24425. player$8.on(PlayerEvents.FlyingEnded, function (_ref) {
  24426. var currentPano = _ref.currentPano;
  24427. var panoVideoFilter;
  24428. if (player$8.mode == 'panorama') {
  24429. panoVideoFilter = currentPano.getVideoFilter();
  24430. }
  24431. _this2.ViewLinkCircles.children.forEach(function (e) {
  24432. if (currentPano == _this2.views[e.name.split('circle_')[1]].nearestPano) {
  24433. return common.updateVisible(e, 'coveredPanoVideo', true); //如果是其最近点就不隐藏。否则点击列表跳转过来后又找不到图标
  24434. }
  24435. if (panoVideoFilter && panoVideoFilter(e.position)) {
  24436. common.updateVisible(e, 'coveredPanoVideo', false);
  24437. } else {
  24438. common.updateVisible(e, 'coveredPanoVideo', true);
  24439. }
  24440. });
  24441. });
  24442. }
  24443. if (!app.store.getValue('metadata').controls.showLinkTitle) {
  24444. this.changeTitlesShow(false);
  24445. }
  24446. }
  24447. }, {
  24448. key: "createViews",
  24449. value: function createViews(data) {
  24450. if (!data) return; // 无
  24451. var views = common.CloneJson(data.tags || data);
  24452. views.forEach(function (item) {
  24453. if (this.views[item.sid]) {
  24454. console.log('有重复的view sid' + item.sid);
  24455. return;
  24456. }
  24457. var view = new ViewLink(item);
  24458. this.addView(view);
  24459. }.bind(this));
  24460. if (player$8.getToMode() != 'panorama') {
  24461. for (var i in this.views) {
  24462. this.views[i].balloon.showOrHide(true, 0);
  24463. }
  24464. }
  24465. this.dispatchEvent({
  24466. type: 'loaded'
  24467. });
  24468. this.loaded = true;
  24469. }
  24470. /*
  24471. 判断鼠标移动到哪个view mesh上
  24472. */
  24473. /* getIntersectView() {
  24474. var viewMeshes
  24475. if (!this.inited || !this.enabled || (isEdit && store.getters.page == 'videos')) return
  24476. var detectChunk = true,
  24477. meshes
  24478. if (player.isOutsideMode()) {
  24479. viewMeshes = this.ViewLinkBalloons.children
  24480. } else if (player.is360View(player.mode, player.currentPano)) {
  24481. if (viewLinkEdit.settingEntry) viewMeshes = []
  24482. else if (viewLinkEdit.settingVisibles) {
  24483. viewMeshes = this.ViewLinkCircles.children
  24484. } else {
  24485. viewMeshes = this.ViewLinkExits.children.concat(this.ViewLinkCircles.children)
  24486. }
  24487. detectChunk = false
  24488. } else {
  24489. if (viewLinkEdit.markView) {
  24490. //可以拖拽
  24491. viewMeshes = [viewLinkEdit.markView.circle.mesh]
  24492. detectChunk = false
  24493. } else {
  24494. viewMeshes = this.ViewLinkCircles.children
  24495. }
  24496. }
  24497. if (detectChunk) {
  24498. meshes = this.model.floors.reduce(function (e, t) {
  24499. return t.hidden ? e : e.concat(t.collider.children)
  24500. }, viewMeshes)
  24501. } else meshes = viewMeshes
  24502. var origin = new THREE.Vector3(player.mouse.x, player.mouse.y, -1).unproject(player.camera)
  24503. player.raycaster.set(origin, player.getMouseDirection(player.mouse))
  24504. var results = player.raycaster.intersectObjects(meshes)
  24505. if (results && results.length && viewMeshes.includes(results[0].object)) {
  24506. return results[0]
  24507. }
  24508. } */
  24509. /*
  24510. 根据上面那个函数得到的mesh来判断是哪个view被pick到了,并且记下来,且触发setSelect、 更改鼠标cursor
  24511. */
  24512. }, {
  24513. key: "dealwithIntersect",
  24514. value: function dealwithIntersect(intersect) {
  24515. if (!this.enabled) return;
  24516. var mesh = intersect && intersect.object;
  24517. if (this.hoverCircle && this.hoverCircle.mesh != mesh && (!viewLinkEdit.markView || viewLinkEdit.markView.circle != this.hoverCircle)) {
  24518. this.dispatchEvent({
  24519. type: 'changeIntersect',
  24520. hovered: null
  24521. });
  24522. this.hoverCircle.setSelect(false);
  24523. }
  24524. if (this.hoverBalloon && this.hoverBalloon.mesh != mesh && (!viewLinkEdit.markView || viewLinkEdit.markView.balloon != this.hoverBalloon)) {
  24525. this.dispatchEvent({
  24526. type: 'changeIntersect',
  24527. hovered: null
  24528. });
  24529. this.hoverBalloon.setSelect(false);
  24530. }
  24531. if (this.hoverExit && this.hoverExit.mesh != mesh
  24532. /* && (!viewLinkEdit.markView || viewLinkEdit.markView.exitDoor != this.hoverExit) */
  24533. ) {
  24534. //bus.emit('link/tag/active', null)
  24535. this.hoverExit.setSelect(false);
  24536. }
  24537. this.clickEnable = false;
  24538. this.hoverBalloon = null;
  24539. this.hoverCircle = null;
  24540. this.hoverExit = null;
  24541. if (!intersect) {
  24542. //$('#player').css('cursor', '')
  24543. CursorDeal.remove('hoverView');
  24544. CursorDeal.remove('dragView');
  24545. return true;
  24546. }
  24547. var view;
  24548. if (mesh.name.includes('balloon')) {
  24549. view = this.views[mesh.name.split('balloon_')[1]];
  24550. view.balloon.setSelect(true);
  24551. this.hoverBalloon = view.balloon;
  24552. this.dispatchEvent({
  24553. type: 'changeIntersect',
  24554. hovered: view.sid
  24555. });
  24556. } else if (mesh.name.includes('exit')) {
  24557. view = this.views[mesh.name.split('circle_exitDoor')[1]];
  24558. view.exitDoor.setSelect(true);
  24559. this.hoverExit = view.exitDoor;
  24560. } else {
  24561. view = this.views[mesh.name.split('circle_')[1]];
  24562. if (!view) {
  24563. return console.error('找不到view?', mesh.name);
  24564. }
  24565. this.hoverCircle = view.circle;
  24566. view.circle.setSelect(true);
  24567. this.dispatchEvent({
  24568. type: 'changeIntersect',
  24569. hovered: view.sid
  24570. });
  24571. }
  24572. if (viewLinkEdit.markView == view && (player$8.currentPano != view.pano || viewLinkEdit.settingExit || viewLinkEdit.settingVisibles)) {
  24573. CursorDeal.add('dragView');
  24574. } else {
  24575. CursorDeal.add('hoverView');
  24576. this.clickEnable = true;
  24577. }
  24578. /* if (viewLinkEdit.markView) {
  24579. if (viewLinkEdit.markView == view || viewLinkEdit.settingVisibles) {
  24580. CursorDeal.add('dragView')
  24581. }
  24582. } else {
  24583. CursorDeal.add('hoverView')
  24584. } */
  24585. }
  24586. /*
  24587. and如果点击了鼠标,就触发相应的点击的事件
  24588. */
  24589. }, {
  24590. key: "dealWithClick",
  24591. value: function dealWithClick() {
  24592. if (this.clickEnable) {
  24593. var hovered = this.hoverCircle || this.hoverBalloon || this.hoverExit;
  24594. var view = this.views[hovered.sid];
  24595. if (hovered == this.hoverExit) {
  24596. /* if(viewLinkEdit.settingExit){
  24597. }else */
  24598. view.backToPanorama();
  24599. return true;
  24600. } else {
  24601. if (view.linkType == 'url') {
  24602. /* if (browser.urlHasValue('scene-link')) { //??
  24603. bus.emit('link/tag/click', view.url)
  24604. } else { */
  24605. if (app.config.link && typeof app.config.link === 'object') {
  24606. var url = view.url;
  24607. if (typeof app.config.link.onAction === 'function') {
  24608. url = app.config.link.onAction(url);
  24609. }
  24610. if (url) {
  24611. if (app.config.link.target == 'blank') {
  24612. window.open(url);
  24613. } else {
  24614. window.location.href = url;
  24615. }
  24616. }
  24617. } else if (view.url) {
  24618. window.location.href = view.url;
  24619. } //}
  24620. } else if (view.linkType == 'pano' && view.pano) {
  24621. view.enter360Pano();
  24622. }
  24623. return true;
  24624. }
  24625. }
  24626. }
  24627. }, {
  24628. key: "addView",
  24629. value: function addView(view) {
  24630. this.views[view.sid] = view;
  24631. this.ViewLinkCircles.add(view.circle.mesh);
  24632. this.ViewLinkBalloons.add(view.balloon.mesh);
  24633. view.exitDoor && this.ViewLinkExits.add(view.exitDoor.mesh);
  24634. this.ViewTitles.add(view.titleLabel);
  24635. }
  24636. }, {
  24637. key: "removeView",
  24638. value: function removeView(view) {
  24639. this.ViewLinkCircles.remove(view.circle.mesh);
  24640. this.ViewLinkBalloons.remove(view.balloon.mesh);
  24641. this.ViewLinkExits.remove(view.exitDoor.mesh);
  24642. delete this.views[view.sid];
  24643. }
  24644. }, {
  24645. key: "update",
  24646. value: function update(camera) {
  24647. for (var r in this.views) {
  24648. this.views[r].update();
  24649. }
  24650. }
  24651. }, {
  24652. key: "showAllViews",
  24653. value: function showAllViews() {
  24654. if (this.enabled) return; //直接更改parent的visible
  24655. this.ViewLinkCircles.visible = true;
  24656. this.ViewLinkBalloons.visible = true;
  24657. this.ViewLinkExits.visible = true;
  24658. this.changeTitlesShow(true, 'showAll');
  24659. this.enabled = true;
  24660. }
  24661. }, {
  24662. key: "hideAllViews",
  24663. value: function hideAllViews() {
  24664. if (!this.enabled) return;
  24665. if (player$8.is360View(player$8.mode, player$8.currentPano)) {
  24666. //先退出全景
  24667. player$8.currentPano.view.backToPanorama();
  24668. } else if (player$8.enteringView) {
  24669. /* player.waitFlytoItemFuc = ()=>{
  24670. player.currentPano.view.backToPanorama()
  24671. } */
  24672. player$8.once(PlayerEvents.FlyingEnded, function () {
  24673. player$8.currentPano.view.backToPanorama();
  24674. });
  24675. } //直接更改parent的visible
  24676. this.ViewLinkCircles.visible = false;
  24677. this.ViewLinkBalloons.visible = false;
  24678. this.ViewLinkExits.visible = false;
  24679. this.changeTitlesShow(false, 'showAll');
  24680. this.dealwithIntersect(null); //清除所有hover
  24681. this.enabled = false;
  24682. }
  24683. }, {
  24684. key: "changeTitlesShow",
  24685. value: function changeTitlesShow(state) {
  24686. var cause = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'onShow';
  24687. common.updateVisible(this.ViewTitles, cause, !!state);
  24688. if (state) {
  24689. this.ViewTitles.children.forEach(function (e) {
  24690. return e.updatePos();
  24691. });
  24692. }
  24693. }
  24694. }, {
  24695. key: "setViewsVisible",
  24696. value: function setViewsVisible(type, visi) {
  24697. //根据类型显示隐藏
  24698. if (!this.enabled) return;
  24699. for (var i in this.views) {
  24700. if (this.views[i].linkType == type) {
  24701. this.views[i].setVisible(visi);
  24702. }
  24703. }
  24704. }
  24705. /*
  24706. 主要是在编辑状态下,focus on某个view,让用户知道自己正在编辑的view在画布中是哪个mesh。
  24707. 如果是漫游模式就飞向其入口、 如果是ouside模式,就让相机移近气球,以气球为target。
  24708. */
  24709. }, {
  24710. key: "focusOn",
  24711. value: function focusOn(view) {
  24712. var _this3 = this;
  24713. if (player$8.flying) {
  24714. return player$8.once(PlayerEvents.FlyingEnded, function () {
  24715. _this3.focusOn(view);
  24716. });
  24717. }
  24718. if (player$8.mode == 'panorama') {
  24719. player$8.flyToPano({
  24720. pano: view.nearestPano,
  24721. lookAtPoint: view.circle.mesh.position,
  24722. checkAlone: true
  24723. });
  24724. } else player$8.focusPoint({
  24725. aim: view.balloon.mesh.position
  24726. });
  24727. }
  24728. }, {
  24729. key: "updateCirclesWhenFade",
  24730. value: function updateCirclesWhenFade(state, o) {
  24731. if (state == 'enter') {
  24732. for (var i in this.views) {
  24733. //更新此view中的其他view的circle的表现
  24734. if (i in o.pano.view.visibleViews) {
  24735. var info = {};
  24736. info.viewDir = new THREE.Vector3().fromArray(o.pano.view.visibleViews[i]);
  24737. this.views[i].circle.updatePos('at360View', info);
  24738. this.views[i].circle.setVisible(true);
  24739. } else {
  24740. this.views[i].circle.setVisible(false);
  24741. }
  24742. }
  24743. } else {
  24744. for (var _i3 in this.views) {
  24745. if (this.views[_i3].circle.at360View) {
  24746. this.views[_i3].circle.updatePos('normal');
  24747. }
  24748. o.flyOut || this.views[_i3].circle.setVisible(true);
  24749. }
  24750. o.flyOut && viewLinkEdit.markView && viewLinkEdit.markView.circle.setVisible(true);
  24751. }
  24752. }
  24753. }, {
  24754. key: "exitView",
  24755. value: function exitView() {
  24756. var deferred = new Deferred$1();
  24757. if (player$8.is360View(player$8.mode, player$8.currentPano)) {
  24758. player$8.currentPano.view.backToPanorama();
  24759. player$8.once(PlayerEvents.FlyingEnded, function () {
  24760. deferred.resolve();
  24761. });
  24762. } else {
  24763. deferred.resolve();
  24764. }
  24765. return deferred.promise();
  24766. }
  24767. }]);
  24768. return ViewLinkManager;
  24769. }(THREE.EventDispatcher); //-----------------------------------------------------------------
  24770. //全景 or 超链接
  24771. var ViewLink = /*#__PURE__*/function (_THREE$EventDispatche2) {
  24772. _inherits(ViewLink, _THREE$EventDispatche2);
  24773. var _super2 = _createSuper$14(ViewLink);
  24774. function ViewLink(data) {
  24775. var _this4;
  24776. _classCallCheck(this, ViewLink);
  24777. _this4 = _super2.call(this); //console.log(data)
  24778. _this4.sid = data.sid;
  24779. _this4.pano = null; //对应的pano
  24780. _this4.balloon = new ViewLinkBalloon(data, _assertThisInitialized(_this4));
  24781. _this4.circle = new ViewLinkCircle(data, _assertThisInitialized(_this4)); //this.quaternion = data.quaternion ? new THREE.Quaternion().fromArray(data.quaternion) : new THREE.Quaternion; //全景图的旋转
  24782. _this4.linkType = data.type; //'url' or 'pano'
  24783. _this4.enterQuaternion = data.enterQuaternion ? new THREE.Quaternion().fromArray(data.enterQuaternion) : new THREE.Quaternion(); //进入时的朝向
  24784. _this4.exitDirection = data.exitDirection ? new THREE.Vector3().fromArray(data.exitDirection) : new THREE.Vector3(0, 0, settings$3.view360.circleDisToCenter); //出口的位置
  24785. _this4.url = data.url;
  24786. if (isEdit || _this4.linkType == 'pano') _this4.exitDoor = new ViewLinkCircle(Object.assign({}, data, {
  24787. circleType: 'exitDoor',
  24788. exitDirection: _this4.exitDirection
  24789. }), _assertThisInitialized(_this4));
  24790. {
  24791. _this4.titleLabel = new viewTitle(data.title, _assertThisInitialized(_this4));
  24792. _this4.addEventListener('updatePose', function (e) {
  24793. if (e.target.circleType == 'exitDoor') return;
  24794. _this4.titleLabel.updatePos();
  24795. });
  24796. _this4.circle.addEventListener('move', function () {
  24797. _this4.titleLabel.bindTo == 'circle' && _this4.titleLabel.updatePos();
  24798. });
  24799. } //处理图片缓存 version有bug,所以用scene.json里的 且scene.json和getinfo里的version还不太同步,getinfo要发布后才改变
  24800. //data.version = app.store.get('metadata').version
  24801. if (data.thumb) {
  24802. _this4.imgSid = data.thumb.split('.jpg')[0]; //data.thumb = `https://4dkankan.oss-cn-shenzhen.aliyuncs.com/${isEdit ? 'scene_edit_data' : 'scene_view_data'}/${player.model.sid}/images/panorama/${this.imgSid}/low/${data.thumb}`
  24803. data.thumb = app.resource.getUserImagesURL("panorama/".concat(_this4.imgSid, "/low/").concat(data.thumb));
  24804. _this4.resolution = data.resolution; // '2k' or '4k'
  24805. }
  24806. _this4.nearestPano = data.nearestPano && player$8.model.panos.index[data.nearestPano];
  24807. if (_this4.nearestPano) {
  24808. _this4.floor = _this4.nearestPano.floor;
  24809. _this4.floor.addView(_assertThisInitialized(_this4));
  24810. }
  24811. _this4.setPano(data);
  24812. _this4.visibleViews = data.visibleViews || {};
  24813. _this4._data = data;
  24814. return _this4;
  24815. }
  24816. _createClass(ViewLink, [{
  24817. key: "update",
  24818. value: function update(force) {
  24819. //this.mesh.quaternion.copy(camera.quaternion);
  24820. this.balloon.update(force);
  24821. this.circle.update(force);
  24822. this.exitDoor && this.exitDoor.update(force);
  24823. }
  24824. }, {
  24825. key: "dispose",
  24826. value: function dispose() {
  24827. var _this5 = this;
  24828. this.balloon.dispose();
  24829. this.circle.dispose();
  24830. this.exitDoor.dispose();
  24831. this.deleteOldPano();
  24832. this.titleLabel.dispose();
  24833. if (player$8.currentPano == this.pano) this.backToPanorama();else if (this.entering) {
  24834. player$8.once(PlayerEvents.FlyingEnded, function () {
  24835. _this5.backToPanorama();
  24836. }); //player.waitFlytoItemFuc = ()=>{this.backToPanorama()}
  24837. }
  24838. this.floor && this.floor.removeView(this);
  24839. }
  24840. /*
  24841. 删除旧的pano在tile贴图上留下的残留
  24842. (可能还有bug)
  24843. */
  24844. }, {
  24845. key: "deleteOldPano",
  24846. value: function deleteOldPano() {
  24847. var _this6 = this;
  24848. if (!this.pano) return;
  24849. this.pano.floor.removePano(this.pano);
  24850. this.pano.exit();
  24851. delete this.pano.panoRenderer.activeRenderTargetDescriptors[this.sid];
  24852. delete this.pano.panoRenderer.panoDescriptors[this.sid];
  24853. if (this.pano.tiled) {
  24854. delete this.pano.panoRenderer.tileTrees[this.sid];
  24855. delete this.pano.panoRenderer.tileDirectory[this.sid];
  24856. delete this.pano.tileDownloader.downloadDescriptors[this.sid];
  24857. this.pano.tileDownloader.priorityQueue = this.pano.tileDownloader.priorityQueue.filter(function (item) {
  24858. return item.pano != _this6.pano;
  24859. });
  24860. this.pano.tileDownloader.activeDownloads = this.pano.tileDownloader.activeDownloads.filter(function (item) {
  24861. return item.pano != _this6.pano;
  24862. });
  24863. } //cleanupActiveDownloads
  24864. var M = this.pano.panoRenderer.M;
  24865. for (var i = 0; i < M.length; i++) {
  24866. if (M[i].pano == this.pano) {
  24867. M.splice(i, 1);
  24868. break;
  24869. }
  24870. }
  24871. var u = player$8.model.panos.list.indexOf(this.pano);
  24872. player$8.model.panos.list.splice(u, 1);
  24873. }
  24874. /*
  24875. 绑定对应pano, 以及全景图
  24876. */
  24877. }, {
  24878. key: "setPano",
  24879. value: function setPano() {
  24880. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  24881. if (this.linkType == 'pano') {
  24882. if (o.thumb || o.thumbPanoTex) {
  24883. //o.thumb是上传贴图后的src, o.thumbPanoTex是点击取消时恢复的;相同点是都换图了,要重新创建pano
  24884. var rebuild = !!this.pano;
  24885. if (this.pano) {
  24886. this.deleteOldPano();
  24887. }
  24888. var pano = new Panorama(player$8.$app, this.sid, {
  24889. panoType: '360view',
  24890. position: new THREE.Vector3(),
  24891. quaternion: new THREE.Quaternion(),
  24892. //this.enterQuaternion,
  24893. puck: new THREE.Vector3(0, -1.6, 0),
  24894. seeMarkers: [],
  24895. subgroup: this.nearestPano.floor.floorIndex,
  24896. tiled: !o.mapSrc
  24897. });
  24898. pano.mapSrc = o.mapSrc; //编辑时临时的整张贴图src
  24899. pano.attachToPanoRenderer(player$8.$app.core.get('PanoRenderer'));
  24900. pano.qualityManager = player$8.$app.core.get('QualityManager');
  24901. if (pano.tiled) {
  24902. pano.tileDownloader = player$8.$app.core.get('TileDownloader');
  24903. }
  24904. pano.build1();
  24905. pano.view = this;
  24906. player$8.model.panos.add(pano); //加载tiles需要
  24907. this.panoImgVersion = o.version; //防止缓存的后缀
  24908. /* if(rebuild){
  24909. if(player.model.projectedPano0 == this.pano)player.model.projectedPano0 = pano;
  24910. if(player.model.projectedPano1 == this.pano)player.model.projectedPano1 = pano;
  24911. } */
  24912. if (rebuild && player$8.currentPano == this.pano) {
  24913. //重新加载贴图
  24914. var retryCallback = function retryCallback() {
  24915. if (!player$8.checkAndWaitForPanoLoad(pano, 'high', 'low', player$8.basePanoSize, retryCallback)) {
  24916. player$8.model.setProjectedPanos(pano, pano);
  24917. pano.enter();
  24918. }
  24919. };
  24920. player$8.currentPano = pano;
  24921. retryCallback();
  24922. }
  24923. this.pano = pano;
  24924. if (o.thumbPanoTex) {
  24925. this.thumbPanoTex = o.thumbPanoTex;
  24926. } else {
  24927. this.thumbPanoTex = this.renderToGetMap(o.thumb);
  24928. }
  24929. this.circle.setMapIn(this.thumbPanoTex);
  24930. this.balloon.setMapIn(this.thumbPanoTex);
  24931. }
  24932. if (this.thumbPanoTex) {
  24933. //没传图时changeMap仍为0
  24934. this.circle.mesh.material.uniforms.changeMap.value = 1;
  24935. this.balloon.mesh.material.uniforms.changeMap.value = 1;
  24936. }
  24937. } else {
  24938. this.circle.mesh.material.uniforms.changeMap.value = 0;
  24939. this.balloon.mesh.material.uniforms.changeMap.value = 0;
  24940. }
  24941. } //将全景图渲染成某个漫游视角的贴图
  24942. }, {
  24943. key: "renderToGetMap",
  24944. value: function renderToGetMap(src) {
  24945. var _this7 = this;
  24946. var renderTarget = new THREE.WebGLRenderTarget(256, 256, {
  24947. stencilBuffer: !1
  24948. });
  24949. /* if(!isEdit){ //咋写
  24950. src = config.getPublicResource(src)
  24951. src = src.replace("results","pan")
  24952. src = src.replace("scene/","")
  24953. } */
  24954. var tex = texture.load(src, function () {
  24955. isEdit && (_this7.unDealTex = tex);
  24956. render(renderTarget, tex, _this7.enterQuaternion);
  24957. });
  24958. tex.flipY = false;
  24959. tex.minFilter = THREE.LinearFilter;
  24960. this.renderTarget = renderTarget;
  24961. return renderTarget.texture;
  24962. }
  24963. }, {
  24964. key: "mapChangeRot",
  24965. value: function mapChangeRot() {
  24966. //修改初始视角后重新渲染贴图
  24967. render(this.renderTarget, this.unDealTex, this.enterQuaternion);
  24968. }
  24969. /* updateMap(fov){
  24970. camera.fov = fov;
  24971. camera.updateProjectionMatrix()
  24972. var V = sceneRenderer.renderer.autoClear;
  24973. sceneRenderer.renderer.autoClear = !1
  24974. sceneRenderer.renderer.render(scene, camera, this.renderTarget, !1)
  24975. sceneRenderer.renderer.autoClear = V
  24976. //renderTarget.texture.needsUpdate = true;
  24977. } */
  24978. }, {
  24979. key: "enter360Pano",
  24980. value: function enter360Pano(fun) {
  24981. //进入全景
  24982. /* if (player.isOutsideMode()) {
  24983. player.flyToNewMode({ mode: 'panorama', pano: this.pano, callback: fun })
  24984. } else {
  24985. if (player.cameraControls.activeControl) {
  24986. player.cameraControls.activeControl.insideLookLimitUp = 89.9
  24987. player.cameraControls.activeControl.insideLookLimitDown = -89.9
  24988. player.cameraControls.activeControl.limitAngleIsBound = false
  24989. }
  24990. player.flyToPano({ pano: this.pano }, () => {
  24991. if (typeof fun === 'function') {
  24992. fun()
  24993. }
  24994. player.model.floorLogos.changefloorLogoOpa({//隐藏
  24995. dur: 0,
  24996. index: 0,
  24997. opa: 0,
  24998. })
  24999. })
  25000. } */
  25001. player$8.flyToPano({
  25002. pano: this.pano
  25003. }, function () {
  25004. if (typeof fun === 'function') {
  25005. fun();
  25006. }
  25007. });
  25008. }
  25009. }, {
  25010. key: "backToPanorama",
  25011. value: function backToPanorama() {
  25012. /* if (player.cameraControls.activeControl) {
  25013. player.cameraControls.activeControl.insideLookLimitUp = null
  25014. player.cameraControls.activeControl.insideLookLimitDown = null
  25015. player.cameraControls.activeControl.limitAngleIsBound = true
  25016. } */
  25017. //出来到漫游点
  25018. player$8.flyToPano({
  25019. pano: player$8.lastPano || this.nearestPano,
  25020. lookAtPoint: this.circle.mesh.position
  25021. });
  25022. }
  25023. }, {
  25024. key: "setVisible",
  25025. value: function setVisible(v) {
  25026. if (!v == this.disabled) return;
  25027. if (v) {
  25028. this.balloon.disabled = false;
  25029. this.balloon.showOrHide(true, 0, 'auto');
  25030. } else {
  25031. this.balloon.showOrHide(false, 0);
  25032. this.balloon.disabled = true;
  25033. if (player$8.currentPano == this.pano || player$8.enteringView == this) {
  25034. //注:enteringView时其实不会退出,所以这句其实需要改为callback后,以后再改
  25035. this.backToPanorama();
  25036. }
  25037. }
  25038. this.disabled = !v;
  25039. this.circle.disabled = !v;
  25040. this.circle.setVisible();
  25041. }
  25042. }, {
  25043. key: "setSelect",
  25044. value: function setSelect(state) {
  25045. if (this.selected == state) return;
  25046. this.selected = !!state;
  25047. this.circle.setSelect(state);
  25048. this.balloon.setSelect(state);
  25049. }
  25050. }]);
  25051. return ViewLink;
  25052. }(THREE.EventDispatcher);
  25053. ViewLink.init = function () {
  25054. if (ViewLink.inited) return;
  25055. planeGeo1 = new THREE.PlaneBufferGeometry(0.4, 0.4);
  25056. planeGeo2 = new THREE.PlaneBufferGeometry(1.5, 1.5);
  25057. balloonMap = texture.load(texture.getImageURL('images/img_pamove.png')
  25058. /* ,null,null,{antialias:true} */
  25059. );
  25060. balloonMap2 = texture.load(texture.getImageURL('images/img_pamove_normal.png')); //分区
  25061. defaultCircleMap = texture.load(texture.getImageURL('images/img_panorama_dot.png'));
  25062. defaultExitMap = texture.load(texture.getImageURL('images/img_exit_dot.png'));
  25063. balloonMap2.minFilter = THREE.LinearMipmapNearestFilter; //1007 //可能缩小锯齿更弱一些
  25064. balloonMap2.needsUpdate = true;
  25065. /* defaultCircleMap.anisotropy = 4
  25066. defaultCircleMap.needsUpdate = true */
  25067. //用于渲染出贴图的一些工具:
  25068. camera = new THREE.PerspectiveCamera();
  25069. camera.fov = 80;
  25070. camera.aspect = 1;
  25071. camera.updateProjectionMatrix();
  25072. scene = new THREE.Scene();
  25073. scene.add(camera);
  25074. mesh = new THREE.Mesh(new THREE.SphereBufferGeometry(fishEyeRadius, 25, 25), new THREE.RawShaderMaterial({
  25075. //new THREE.BoxBufferGeometry(1,1)
  25076. uniforms: THREE.UniformsUtils.clone(sphereRenderToCube.uniforms),
  25077. vertexShader: sphereRenderToCube.vertexShader,
  25078. fragmentShader: sphereRenderToCube.fragmentShader,
  25079. depthWrite: !1,
  25080. depthTest: !1,
  25081. side: THREE.DoubleSide
  25082. }));
  25083. scene.add(mesh);
  25084. ViewLink.inited = true;
  25085. };
  25086. /*
  25087. 整体 360view 本质是全景pano 和 入口出口等mesh集合
  25088. 默认对应的pano的位置都是Vector3(0,0,0)
  25089. exitDoor: 全景图内exit图标
  25090. enterQuaternion: 进入全景图时的初始角度
  25091. exitDirection: 全景图内exit图标的方向。
  25092. linkType: 全景或者超链接
  25093. nearestPano: 最近的pano, 退出全景后到达的pano。 (因为是在编辑时确定的,所以干脆保存下来。)
  25094. visibleViews:在该全景图中可以看到的 别的全景的circle集合, 每个全景包含了它在该全景内的位置信息
  25095. */
  25096. //----------------------------------------
  25097. var ViewLinkBase = /*#__PURE__*/function (_THREE$EventDispatche3) {
  25098. _inherits(ViewLinkBase, _THREE$EventDispatche3);
  25099. var _super3 = _createSuper$14(ViewLinkBase);
  25100. function ViewLinkBase(data, view) {
  25101. var _this8;
  25102. _classCallCheck(this, ViewLinkBase);
  25103. _this8 = _super3.call(this);
  25104. _this8.view = view;
  25105. _this8.sid = data.sid; //this.state = 'sprite'
  25106. return _this8;
  25107. }
  25108. _createClass(ViewLinkBase, [{
  25109. key: "update",
  25110. value: function update(force) {
  25111. var changed = false;
  25112. if (this.state == 'sprite' && this.mesh.visible && (force || (this.mesh.material.uniforms.opacity ? this.mesh.material.uniforms.opacity.value > 0 : true))) {
  25113. this.mesh.quaternion.copy(player$8.camera.quaternion);
  25114. changed = true;
  25115. }
  25116. if (this.strictScale) {
  25117. //通过限定二维大小,防止看起来过小。
  25118. var _camera = player$8.mode == 'floorplan' ? player$8.cameraControls.activeControl.camera : player$8.camera; //floorplan 时要用到OrthographicCamera
  25119. var s = math$1.getScaleForConstantSize({
  25120. dom: player$8.$app.dom,
  25121. maxSize: 100,
  25122. minSize: 40,
  25123. nearBound: 2,
  25124. farBound: 80,
  25125. camera: _camera,
  25126. position: this.mesh.position
  25127. });
  25128. this.mesh.scale.set(s, s, s);
  25129. changed = true;
  25130. }
  25131. changed && this.view.dispatchEvent({
  25132. type: 'updatePose'
  25133. });
  25134. }
  25135. }, {
  25136. key: "setStrictScale",
  25137. value: function setStrictScale(state) {
  25138. //设定是否限定二维大小
  25139. this.strictScale = state;
  25140. if (state) this.update();else this.mesh.scale.set(1, 1, 1);
  25141. this.view.dispatchEvent({
  25142. type: 'updatePose'
  25143. });
  25144. }
  25145. }, {
  25146. key: "setMapIn",
  25147. value: function setMapIn(map) {
  25148. this.mesh.material.uniforms.mapIn.value = map;
  25149. }
  25150. }, {
  25151. key: "dispose",
  25152. value: function dispose() {}
  25153. }]);
  25154. return ViewLinkBase;
  25155. }(THREE.EventDispatcher);
  25156. /*
  25157. 在漫游模式下看到的圆圈部分: 分为入口和出口
  25158. 入口分为两种状态:1 普通状态 2 在别的全景内时
  25159. 出口和在别的全景内的入口都是billboardSprite状态 即其quaternion同相机quaternion,在画面上看就是标准的圆。只是大小会在屏幕边缘更大些。
  25160. */
  25161. var ViewLinkCircle = /*#__PURE__*/function (_ViewLinkBase) {
  25162. _inherits(ViewLinkCircle, _ViewLinkBase);
  25163. var _super4 = _createSuper$14(ViewLinkCircle);
  25164. //飞入后
  25165. function ViewLinkCircle(data, view) {
  25166. var _this9;
  25167. _classCallCheck(this, ViewLinkCircle);
  25168. _this9 = _super4.call(this, data, view);
  25169. _this9.circleType = data.circleType;
  25170. _this9.position = new THREE.Vector3(); //记录在普通状态下的位置
  25171. _this9.quaternion = new THREE.Quaternion(); //记录在普通状态下的旋转
  25172. _this9.build(data);
  25173. return _this9;
  25174. }
  25175. _createClass(ViewLinkCircle, [{
  25176. key: "build",
  25177. value: function build(data) {
  25178. var uniforms = THREE.UniformsUtils.clone(linkSpotInside.uniforms);
  25179. var mesh = new THREE.Mesh(planeGeo1, new THREE.RawShaderMaterial({
  25180. uniforms: uniforms,
  25181. vertexShader: linkSpotInside.vertexShader,
  25182. fragmentShader: linkSpotInside.fragmentShader,
  25183. transparent: true,
  25184. side: THREE.DoubleSide
  25185. }));
  25186. mesh.renderOrder = RenderOrder.view;
  25187. mesh.name = 'circle_' + (this.circleType ? this.circleType : '') + this.sid;
  25188. this.mesh = mesh;
  25189. this.setMapOut(data);
  25190. if (this.circleType == 'exitDoor') {
  25191. this.mesh.visible = false;
  25192. this.mesh.material.depthTest = false;
  25193. data.exitDirection && this.mesh.position.copy(data.exitDirection);
  25194. this.state = 'sprite';
  25195. } else {
  25196. if (data.circle) {
  25197. data.circle.pos && this.position.fromArray(data.circle.pos);
  25198. data.circle.qua && this.quaternion.fromArray(data.circle.qua);
  25199. var s = data.circle.scale / 100;
  25200. data.circle.scale && this.mesh.scale.set(s, s, s);
  25201. this.state = '3D';
  25202. this.updatePos();
  25203. }
  25204. if (player$8.isOutsideMode()) this.setVisible(false);
  25205. }
  25206. }
  25207. /*
  25208. circle在全景之内需要转换位置
  25209. */
  25210. }, {
  25211. key: "updatePos",
  25212. value: function updatePos(type, o) {
  25213. if (type == 'at360View') {
  25214. //在别的view内显示时
  25215. //var dir = this.position.clone().sub(o.viewPos).normalize()
  25216. new THREE.Vector3();
  25217. var dir = o.viewDir.clone().normalize();
  25218. this.mesh.position.copy(dir.multiplyScalar(settings$3.view360.circleDisToCenter)); //this.mesh.lookAt(center)
  25219. this.at360View = true;
  25220. this.state = 'sprite'; //console.log("changeTosprite :"+this.sid)
  25221. } else {
  25222. if (o) {
  25223. o.position && this.position.copy(o.position);
  25224. o.quaternion && this.quaternion.copy(o.quaternion);
  25225. }
  25226. this.mesh.position.copy(this.position);
  25227. this.mesh.quaternion.copy(this.quaternion);
  25228. this.at360View = false;
  25229. this.state = '3D'; //console.log("changeTo3D :"+this.sid)
  25230. this.judgeDepthTest();
  25231. this.dispatchEvent({
  25232. type: 'move'
  25233. });
  25234. }
  25235. }
  25236. }, {
  25237. key: "state",
  25238. get: function get() {
  25239. return this._state;
  25240. },
  25241. set: function set(v) {
  25242. this._state = v; //console.log('state', v, this.name)
  25243. this.mesh && this.update();
  25244. }
  25245. }, {
  25246. key: "judgeDepthTest",
  25247. value: function judgeDepthTest() {
  25248. this.mesh.material.depthTest = !(this.state == 'sprite' || this.selected);
  25249. }
  25250. }, {
  25251. key: "update",
  25252. value: function update() {
  25253. _get(_getPrototypeOf(ViewLinkCircle.prototype), "update", this).call(this);
  25254. this.judgeDepthTest();
  25255. }
  25256. /*
  25257. 选中后材质渐变
  25258. */
  25259. }, {
  25260. key: "setSelect",
  25261. value: function setSelect(state) {
  25262. if (state == this.selected) return;
  25263. this.selected = state;
  25264. var fadeTime = 500;
  25265. this.judgeDepthTest();
  25266. transitions$1.cancelById('circlePro');
  25267. transitions$1.start(lerp.uniform(this.mesh, 'progress', state ? 1 : 0), fadeTime, function () {}, 0, easing[settings$3.transition.blendEasing], 'circlePro'
  25268. /* , settings.freeze.FlyToPano */
  25269. );
  25270. }
  25271. /*
  25272. 使用用户设置的贴图或者默认
  25273. */
  25274. }, {
  25275. key: "setMapOut",
  25276. value: function setMapOut(data) {
  25277. var map;
  25278. if (this.circleType == 'exitDoor') {
  25279. if (!data) map = defaultExitMap;else if (data instanceof THREE.Texture) map = data;else if (typeof data == 'string') {
  25280. map = texture.load(data);
  25281. } else {
  25282. /* if (data.style && data.style.exit.url) map = texture.load(dealURL(data.style.exit.url))
  25283. else map = defaultExitMap //name:out, exit-style-${name}.jpg */
  25284. if (data.style) {
  25285. var url;
  25286. if (data.style.exit.name && data.style.exit.name != 'custom') {
  25287. url = app.resource.getAppURL("images/link/exit-style-".concat(data.style.exit.name, ".png")); //console.log('circle 使用默认图片', data.style.exit.name, url)
  25288. } else {
  25289. if (data.style.exit.url) url = dealURL(data.style.exit.url);
  25290. }
  25291. map = texture.load(url);
  25292. } else map = defaultExitMap;
  25293. }
  25294. } else {
  25295. if (!data) map = defaultCircleMap;else if (data instanceof THREE.Texture) map = data;else if (typeof data == 'string') {
  25296. map = texture.load(dealURL(data));
  25297. } else {
  25298. if (data.style) {
  25299. var _url;
  25300. if (data.style.enter.name && data.style.enter.name != 'custom') {
  25301. _url = app.resource.getAppURL("images/link/enter-style-".concat(data.style.enter.name, ".png")); //console.log('circle 使用默认图片', data.style.enter.name, url)
  25302. } else {
  25303. if (data.style.enter.url) _url = dealURL(data.style.enter.url);
  25304. }
  25305. map = texture.load(_url);
  25306. } else map = defaultCircleMap;
  25307. }
  25308. }
  25309. this.mesh.material.uniforms.mapOut.value = map;
  25310. }
  25311. }, {
  25312. key: "setVisible",
  25313. value: function setVisible(v) {
  25314. if (v == void 0) {
  25315. //使用历史值
  25316. v = this._visible;
  25317. }
  25318. common.updateVisible(this.mesh, 'setVisible', !this.disabled && v); //this.mesh.visible = !this.disabled && v
  25319. this._visible = v;
  25320. }
  25321. }]);
  25322. return ViewLinkCircle;
  25323. }(ViewLinkBase);
  25324. /*
  25325. 在空中的气球部分
  25326. */
  25327. var ViewLinkBalloon = /*#__PURE__*/function (_ViewLinkBase2) {
  25328. _inherits(ViewLinkBalloon, _ViewLinkBase2);
  25329. var _super5 = _createSuper$14(ViewLinkBalloon);
  25330. //飞出后
  25331. function ViewLinkBalloon(data, view) {
  25332. var _this10;
  25333. _classCallCheck(this, ViewLinkBalloon);
  25334. _this10 = _super5.call(this, data, view);
  25335. _this10.state = 'sprite';
  25336. _this10.build(data);
  25337. return _this10;
  25338. }
  25339. _createClass(ViewLinkBalloon, [{
  25340. key: "build",
  25341. value: function build(data) {
  25342. var uniforms = THREE.UniformsUtils.clone(linkSpot.uniforms);
  25343. uniforms.mapOut.value = balloonMap;
  25344. uniforms.mapOut2.value = balloonMap2;
  25345. uniforms.opacity.value = 0;
  25346. var mesh = new THREE.Mesh(planeGeo2, new THREE.RawShaderMaterial({
  25347. uniforms: uniforms,
  25348. vertexShader: linkSpot.vertexShader,
  25349. fragmentShader: linkSpot.fragmentShader,
  25350. transparent: true,
  25351. side: THREE.DoubleSide,
  25352. depthTest: false //飞出后再变为true
  25353. }));
  25354. mesh.renderOrder = RenderOrder.view;
  25355. mesh.name = 'balloon_' + this.sid;
  25356. this.mesh = mesh;
  25357. if (data.balloon) {
  25358. data.balloon.pos && this.mesh.position.fromArray(data.balloon.pos);
  25359. }
  25360. this.mesh.visible = false; //因为一开始在panorama模式
  25361. }
  25362. /*
  25363. 从外飞到漫游模式时气球会渐渐消失,反之渐渐出现
  25364. */
  25365. }, {
  25366. key: "showOrHide",
  25367. value: function showOrHide(state, fadeTime, type) {
  25368. var _this11 = this;
  25369. //console.log('showOrHide ', state , this.sid, type)
  25370. if (this.disabled) return;
  25371. if (type == 'auto') {
  25372. //自动判断是否可见 飞出后,在别的楼层不可见
  25373. state = player$8.getToMode() != 'panorama' && (player$8.model.allFloorsVisible || !this.view.floor || this.view.floor == player$8.model.currentFloor);
  25374. }
  25375. var fadeTime = fadeTime != void 0 ? fadeTime : 500;
  25376. var opa = state ? 1 : 0;
  25377. transitions$1.cancelById('balloonOpa_' + this.sid);
  25378. if (this.mesh.material.uniforms.opacity.value == opa) return;
  25379. state && (this.mesh.visible = true);
  25380. this.update(true);
  25381. transitions$1.start(lerp.uniform(this.mesh, 'opacity', opa), fadeTime, function (e) {
  25382. _this11.mesh.material.depthTest = player$8.modeTran.split('-')[1] != 'floorplan';
  25383. _this11.mesh.visible = !!state; //消失时防止遮住其他mesh 如circle
  25384. _this11.view.titleLabel.switchBind(state ? 'balloon' : 'circle');
  25385. }, 0, easing[settings$3.transition.blendEasing], null, 'balloonOpa_' + this.sid);
  25386. }
  25387. /*
  25388. hover and click
  25389. */
  25390. }, {
  25391. key: "setSelect",
  25392. value: function setSelect(state) {
  25393. //this.mesh.material.uniforms.isActive.value = state ? 1 : 0
  25394. if (state == this.selected) return;
  25395. this.selected = state;
  25396. var fadeTime = 300;
  25397. transitions$1.cancelById('balloonPro');
  25398. transitions$1.start(lerp.uniform(this.mesh, 'activeProgress', state ? 1 : 0), fadeTime, function () {}, 0, easing[settings$3.transition.blendEasing], 'balloonPro'
  25399. /* , settings.freeze.FlyToPano */
  25400. );
  25401. }
  25402. }]);
  25403. return ViewLinkBalloon;
  25404. }(ViewLinkBase);
  25405. var viewTitle = /*#__PURE__*/function (_TextSprite) {
  25406. _inherits(viewTitle, _TextSprite);
  25407. var _super6 = _createSuper$14(viewTitle);
  25408. function viewTitle(text, view) {
  25409. var _this12;
  25410. _classCallCheck(this, viewTitle);
  25411. _this12 = _super6.call(this, {
  25412. text,
  25413. backgroundColor: {
  25414. r: 255,
  25415. g: 255,
  25416. b: 255,
  25417. a: 0
  25418. },
  25419. textColor: {
  25420. r: 255,
  25421. g: 255,
  25422. b: 255,
  25423. a: 1
  25424. },
  25425. textshadowColor: '#888',
  25426. borderRadius: 2,
  25427. fontsize: 34,
  25428. renderOrder: 5,
  25429. margin: {
  25430. x: 12,
  25431. y: 10
  25432. },
  25433. player: player$8,
  25434. fixOrient: true,
  25435. sizeInfo: {
  25436. scale: 0.4,
  25437. nearBound: 3
  25438. }
  25439. });
  25440. _this12.sprite.material.depthTest = _this12.sprite.material.depthWrite = true;
  25441. _this12.view = view;
  25442. _this12.visible = false;
  25443. setTimeout(function () {
  25444. _this12.visible = true;
  25445. _this12.switchBind(view.balloon.mesh.visible ? 'balloon' : 'circle');
  25446. }, 1);
  25447. /* const s = 0.3
  25448. this.scale.set(s, s, s) */
  25449. return _this12;
  25450. }
  25451. _createClass(viewTitle, [{
  25452. key: "switchBind",
  25453. value: function switchBind(bindTo) {
  25454. //console.error('bindTo', bindTo)
  25455. this.bindTo = bindTo;
  25456. if (bindTo == 'circle') {
  25457. this.fixOrient = true;
  25458. this.quaternion.copy(this.view.circle.mesh.quaternion);
  25459. } else {
  25460. this.fixOrient = false;
  25461. this.view.balloon;
  25462. }
  25463. this.updatePos();
  25464. }
  25465. }, {
  25466. key: "updatePos",
  25467. value: function updatePos() {
  25468. if (!common.realVisible(this)) return;
  25469. var mesh,
  25470. margin,
  25471. localPos = new THREE.Vector3(0, -1, 0);
  25472. if (this.bindTo == 'circle') {
  25473. mesh = this.view.circle.mesh;
  25474. margin = 0.08;
  25475. this.quaternion.copy(this.view.circle.mesh.quaternion);
  25476. } else {
  25477. mesh = this.view.balloon.mesh;
  25478. mesh.scale.x * 0.8, margin = 0.2;
  25479. }
  25480. mesh.updateMatrix();
  25481. localPos.multiplyScalar(margin + Math.abs(mesh.geometry.attributes.position.array[0]));
  25482. localPos.applyMatrix4(mesh.matrix); //this.scale.set(s, s, s)
  25483. this.position.copy(localPos);
  25484. this.updatePose(); //scale
  25485. //console.log('updatepos')
  25486. }
  25487. }]);
  25488. return viewTitle;
  25489. }(TextSprite);
  25490. function _createSuper$13(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$13(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  25491. function _isNativeReflectConstruct$13() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  25492. /**
  25493. * 马赛克效果
  25494. * 注:原本的马赛克效果产品经理不太满意,因此现在的马赛克其实是高斯模糊
  25495. */
  25496. var Paint$1 = /*#__PURE__*/function (_Emiter) {
  25497. _inherits(Paint, _Emiter);
  25498. var _super = _createSuper$13(Paint);
  25499. function Paint(app, player) {
  25500. var _this;
  25501. _classCallCheck(this, Paint);
  25502. _this = _super.call(this);
  25503. _this.app = app;
  25504. _this.player = player; // app.core.get('Player')
  25505. _this.sceneRenderer = app.core.get('SceneRenderer');
  25506. _this.sceneNum = app.config.num;
  25507. _this.painting = false; // 进入/结束涂抹
  25508. _this.pause = false; // 是否暂停涂抹
  25509. _this.mousePosition = new THREE.Vector4();
  25510. _this.currentPaintUrl = null; // 当前马赛克图片路径
  25511. var metadata = app.store.getValue('metadata');
  25512. if (!metadata) {
  25513. app.store.on('metadata', function (data) {
  25514. _this.paintData = data.mosaicList; // 涂抹贴图的大小
  25515. _this.width = 1024 * (data.sceneFrom == 'pro' ? 2 : 4); // window.innerWidth;
  25516. _this.height = 1024 * (data.sceneFrom == 'pro' ? 1 : 2); // window.innerHeight
  25517. });
  25518. } else {
  25519. _this.paintData = metadata.mosaicList;
  25520. _this.width = 1024 * (metadata.sceneFrom == 'pro' ? 2 : 4);
  25521. _this.height = 1024 * (metadata.sceneFrom == 'pro' ? 1 : 2);
  25522. }
  25523. return _this;
  25524. }
  25525. _createClass(Paint, [{
  25526. key: "init",
  25527. value: function init() {
  25528. var _this2 = this;
  25529. // 准备离屏渲染的render和shader
  25530. var resolution = new THREE.Vector3(this.width, this.height, window.devicePixelRatio);
  25531. this.bufferRenderer = new BufferRenderer(this.sceneRenderer.renderer, {
  25532. width: this.width,
  25533. height: this.height
  25534. });
  25535. this.bufferShader = new BufferShader({
  25536. iResolution: {
  25537. value: resolution
  25538. },
  25539. iMouse: {
  25540. value: this.mousePosition
  25541. },
  25542. iChannel0: {
  25543. value: null
  25544. },
  25545. // 马赛克
  25546. iChannel1: {
  25547. value: null
  25548. },
  25549. // 全景图
  25550. iBrushType: {
  25551. value: 1
  25552. },
  25553. iBrushSize: {
  25554. value: 5
  25555. },
  25556. iAngle: {
  25557. value: 0
  25558. },
  25559. iPitch: {
  25560. value: 0
  25561. },
  25562. iIsBrush: {
  25563. value: 0
  25564. }
  25565. }); // 同时更新skybox和chunk的相关uniforms,因为还要在model.js里渲染笔刷
  25566. Object.assign(this.player.model.skybox.material.uniforms, this.bufferShader.uniforms);
  25567. this.player.model.chunks.forEach(function (chunk) {
  25568. return Object.assign(chunk.materialInside.uniforms, _this2.bufferShader.uniforms);
  25569. });
  25570. } // 开始涂抹
  25571. }, {
  25572. key: "start",
  25573. value: function start(isPause) {
  25574. var _this3 = this;
  25575. this.player.reticule.visible = false;
  25576. this.player.cameraControls.activeControl.enabled = false;
  25577. this.mousePosition.setZ(0); // z用于标识是否mousedown
  25578. // 计算相机角度--------------------------------
  25579. var lookAt = this.player.camera.getWorldDirection(new THREE.Vector3()); // 上下转角
  25580. var projectVec = lookAt.clone().projectOnPlane(new THREE.Vector3(0, 1, 0));
  25581. var pitch = lookAt.angleTo(projectVec) * Math.sign(-lookAt.y); // 左右转角
  25582. var lookAtXZ = lookAt.clone().setY(0);
  25583. var skyRota = new THREE.Euler().setFromQuaternion(this.player.currentPano.quaternion); //this.player.currentPano.skyboxMesh.rotation
  25584. var skyDir = new THREE.Vector3(1, 0, 0).applyEuler(skyRota).setY(0);
  25585. var skyDirCross = new THREE.Vector3(0, 0, 1).applyEuler(skyRota).setY(0);
  25586. var angle = lookAtXZ.angleTo(skyDir) * Math.sign(lookAtXZ.dot(skyDirCross));
  25587. this.bufferShader.uniforms['iAngle'].value = angle;
  25588. this.bufferShader.uniforms['iPitch'].value = pitch; // -------------------------------------------
  25589. if (isPause) {
  25590. // 恢复暂停
  25591. this.showBrush(true);
  25592. this.pause = false;
  25593. } else {
  25594. // 将已有马赛克数据放入到离屏渲染
  25595. var startPaint = function startPaint(texture) {
  25596. // 不重置readBuffer的话,保存一次后将不再能涂抹
  25597. _this3.bufferRenderer.readBuffer = new THREE.WebGLRenderTarget(_this3.width, _this3.height, _this3.bufferRenderer.bufferOptions);
  25598. texture && (_this3.bufferRenderer.readBuffer.texture = texture);
  25599. _this3.bufferRenderer.writeBuffer = new THREE.WebGLRenderTarget(_this3.width, _this3.height, _this3.bufferRenderer.bufferOptions); // 将全景图马赛克设置为离屏渲染texture,使涂抹实时更新
  25600. _this3.setPaintTexture('paint0Map', _this3.bufferRenderer.readBuffer.texture);
  25601. _this3.setPaintTexture('paint1Map', _this3.bufferRenderer.readBuffer.texture);
  25602. _this3.painting = true;
  25603. if (_this3.pause) _this3.cancel(true);
  25604. };
  25605. if (this.currentPaintUrl) {
  25606. // 这里必须load一个新texture,否则会形成readbuffer和texture的反馈环
  25607. new THREE.TextureLoader().load(this.currentPaintUrl, function (texture) {
  25608. texture.minFilter = THREE.LinearFilter;
  25609. texture.magFilter = THREE.LinearFilter;
  25610. texture.type = THREE.FloatType; // 和readbuffer一致
  25611. texture.needsUpdate = true;
  25612. startPaint(texture);
  25613. });
  25614. } else {
  25615. startPaint();
  25616. }
  25617. this.player.locked = true;
  25618. this.hasEdit = false; // 标明start后有没有涂抹过
  25619. this.defineHasPaint(true); // 设置hasPaint为true,否则涂抹相关shader将被ifelse判断跳过
  25620. // 加载一张全景图作为涂抹的底图(高斯模糊必须用pan/high/,马赛克用pan/low/就可以)
  25621. texture.load(this.app.resource.getViewImagesURL("pan/high/".concat(this.player.currentPano.id, ".jpg")), function (panoTexture) {
  25622. _this3.bufferShader.uniforms['iChannel1'].value = panoTexture; // 给离屏shader设置底图
  25623. _this3.showBrush(true); // 显示笔刷
  25624. _this3.emit('start');
  25625. });
  25626. }
  25627. } // 停止涂抹
  25628. }, {
  25629. key: "cancel",
  25630. value: function cancel(isPause) {
  25631. this.player.reticule.visible = true;
  25632. this.player.cameraControls.activeControl.enabled = true;
  25633. this.showBrush(false); // 隐藏笔刷
  25634. if (isPause) {
  25635. // 暂停,只停下来转视角
  25636. this.pause = true;
  25637. } else {
  25638. this.painting = false;
  25639. this.hasEdit = false;
  25640. this.player.locked = false;
  25641. this.setPaintImage(this.currentPaintUrl, this.currentPaintUrl); // 更新马赛克图片到全景图,替换离屏渲染texture
  25642. this.bufferRenderer.readBuffer.dispose();
  25643. this.bufferRenderer.writeBuffer.dispose();
  25644. }
  25645. } // 保存涂抹数据
  25646. }, {
  25647. key: "save",
  25648. value: function save() {
  25649. var self = this;
  25650. var panoId = this.player.currentPano.id;
  25651. return {
  25652. panoId: panoId,
  25653. data: this.bufferRenderer.save(),
  25654. // base64
  25655. func: function func() {
  25656. // 把base64当做链接存起来,就不用等后端返回png路径了
  25657. self.currentPaintUrl = self.bufferRenderer.base64; // 更新panoPaint
  25658. if (!self.paintData) self.paintData = [];
  25659. var panoPaint = self.paintData.find(function (data) {
  25660. return data.panoId == panoId;
  25661. });
  25662. if (panoPaint) {
  25663. panoPaint.data = self.bufferRenderer.base64;
  25664. } else {
  25665. self.paintData.push({
  25666. panoId: panoId,
  25667. data: self.bufferRenderer.base64
  25668. });
  25669. }
  25670. }
  25671. };
  25672. }
  25673. }, {
  25674. key: "update",
  25675. value: function update() {
  25676. // 涂抹实时更新
  25677. if (this.painting && !this.pause) {
  25678. this.bufferShader.uniforms['iChannel0'].value = this.bufferRenderer.readBuffer.texture; // 每次渲染出马赛克都更新到bufferShader保存下来
  25679. this.bufferRenderer.render(this.bufferShader.scene, this.bufferShader.camera); // 渲染bufferShader场景,得到新马赛克
  25680. }
  25681. }
  25682. /**
  25683. * 笔刷
  25684. */
  25685. // 笔刷显隐
  25686. }, {
  25687. key: "showBrush",
  25688. value: function showBrush(show) {
  25689. this.sceneRenderer.renderer.domElement.style.cursor = show ? 'none' : 'default'; // 如果显示笔刷的话,就要隐藏鼠标
  25690. this.player.model.skybox && (this.player.model.skybox.material.uniforms['iShowBrush'].value = show ? 1 : 0);
  25691. this.player.model.chunks.forEach(function (chunk) {
  25692. return chunk.materialInside.uniforms['iShowBrush'].value = show ? 1 : 0;
  25693. });
  25694. } // 笔刷切换
  25695. }, {
  25696. key: "changeBrush",
  25697. value: function changeBrush(type) {
  25698. if (parseInt(type) == -1) {
  25699. this.cancel(true); // 暂停涂抹
  25700. } else {
  25701. this.pause && this.start(true); // 从暂停恢复
  25702. this.bufferShader.uniforms['iBrushType'].value = parseInt(type);
  25703. }
  25704. } // 调整笔刷大小
  25705. }, {
  25706. key: "setBrushSize",
  25707. value: function setBrushSize(size) {
  25708. this.bufferShader.uniforms['iBrushSize'].value = parseFloat(size);
  25709. }
  25710. /**
  25711. * 涂抹贴图更新
  25712. */
  25713. // 外部调用,用于pano跳转
  25714. }, {
  25715. key: "updatePanoPaint",
  25716. value: function updatePanoPaint(pano0Id, pano1Id) {
  25717. if (!this.paintData) return;
  25718. var pano0Paint = this.paintData.find(function (data) {
  25719. return data.panoId == pano0Id;
  25720. });
  25721. var path0 = pano0Paint && (pano0Paint.data || this.app.resource.getUserResourceURL(pano0Paint.fileName));
  25722. var pano1Paint = this.paintData.find(function (data) {
  25723. return data.panoId == pano1Id;
  25724. });
  25725. var path1 = pano1Paint && (pano1Paint.data || this.app.resource.getUserResourceURL(pano1Paint.fileName));
  25726. this.currentPaintUrl = pano1Id != null ? path1 : path0;
  25727. this.setPaintImage(path0, path1);
  25728. } // 用于非涂抹时更新贴图
  25729. }, {
  25730. key: "setPaintImage",
  25731. value: function setPaintImage(path0, path1) {
  25732. var _this4 = this;
  25733. this.defineHasPaint(!!path1 || !!path0); // 考虑到过渡效果,pano1和pano0都要判断
  25734. path0 ? texture.loadWithoutUpdate(path0, function (t) {
  25735. return _this4.setPaintTexture('paint0Map', t);
  25736. }, function () {} // 给个空函数catch error
  25737. ) : this.setPaintTexture('paint0Map', null);
  25738. path1 ? texture.loadWithoutUpdate(path1, function (t) {
  25739. return _this4.setPaintTexture('paint1Map', t);
  25740. }, function () {}) : this.setPaintTexture('paint1Map', null);
  25741. } // 设置涂抹贴图 mapName: 'paint0Map' | 'paint1Map'
  25742. }, {
  25743. key: "setPaintTexture",
  25744. value: function setPaintTexture(mapName, texture) {
  25745. if (texture) {
  25746. texture.minFilter = THREE.LinearFilter;
  25747. texture.magFilter = THREE.LinearFilter;
  25748. }
  25749. this.app.core.get('QuickstartManager').skybox.material.uniforms[mapName].value = texture;
  25750. this.player.model.skybox && (this.player.model.skybox.material.uniforms[mapName].value = texture);
  25751. this.player.model.chunks.forEach(function (chunk) {
  25752. return chunk.materialInside.uniforms[mapName].value = texture;
  25753. });
  25754. this.player.model.highMapCube && this.player.model.highMapCube.tiles.forEach(function (tile) {
  25755. tile.material.uniforms[mapName].value = texture;
  25756. });
  25757. } // 设置HasPaint,为true时才运行马赛克相关shader,减少显存占用
  25758. }, {
  25759. key: "defineHasPaint",
  25760. value: function defineHasPaint(isDefine) {
  25761. var materials = [];
  25762. materials.push(this.app.core.get('QuickstartManager').skybox.material);
  25763. this.player.model.skybox && materials.push(this.player.model.skybox.material);
  25764. this.player.model.chunks.forEach(function (chunk) {
  25765. return materials.push(chunk.materialInside);
  25766. });
  25767. this.player.model.highMapCube && materials.push.apply(materials, _toConsumableArray(this.player.model.highMapCube.tiles.map(function (e) {
  25768. return e.material;
  25769. })));
  25770. if (isDefine) {
  25771. materials.forEach(function (mat) {
  25772. return mat.defines['HasPaint'] = true, mat.needsUpdate = true;
  25773. });
  25774. } else {
  25775. materials.forEach(function (mat) {
  25776. return delete mat.defines['HasPaint'], mat.needsUpdate = true;
  25777. });
  25778. }
  25779. }
  25780. /**
  25781. * 涂抹鼠标事件处理
  25782. */
  25783. }, {
  25784. key: "dealPointerDown",
  25785. value: function dealPointerDown() {
  25786. if (this.player.locked) {
  25787. this.hasEdit = true;
  25788. this.mousePosition.setZ(1);
  25789. } else {
  25790. // 保证start完再mousedown,防止底图还未加载好
  25791. this.once('start', this.dealPointerDown.bind(this));
  25792. }
  25793. }
  25794. }, {
  25795. key: "dealPointerMove",
  25796. value: function dealPointerMove(mouse) {
  25797. // 适应zoom和校准
  25798. mouse.x = (mouse.x - window.innerWidth / 2) / (this.player.zoomLevel + (this.player.zoomLevel - 1) * 0.2) + window.innerWidth / 2;
  25799. mouse.y = (mouse.y - window.innerHeight / 2) / (this.player.zoomLevel + (this.player.zoomLevel - 1) * 0.2) + window.innerHeight / 2;
  25800. this.mousePosition.setX(mouse.x / window.innerWidth * this.width);
  25801. this.mousePosition.setY((1 - mouse.y / window.innerHeight) * this.height);
  25802. }
  25803. }, {
  25804. key: "dealPointerUp",
  25805. value: function dealPointerUp() {
  25806. this.mousePosition.setZ(0);
  25807. }
  25808. }]);
  25809. return Paint;
  25810. }(tinyEmitter); // 离屏渲染场景
  25811. var BufferShader = function BufferShader() {
  25812. var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  25813. _classCallCheck(this, BufferShader);
  25814. this.uniforms = uniforms; // 涂抹材质
  25815. this.material = new THREE.RawShaderMaterial({
  25816. fragmentShader: shaders['model'].fragmentBufferShader,
  25817. vertexShader: shaders['model'].vertexShader,
  25818. uniforms: uniforms,
  25819. side: THREE.DoubleSide
  25820. });
  25821. this.scene = new THREE.Scene();
  25822. this.scene.add(new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), this.material)); // 涂抹Plane
  25823. this.camera = new THREE.PerspectiveCamera(90, 1, 0.01, 1000); // Camera
  25824. this.camera.position.set(0, 0, 1);
  25825. }; // 离屏渲染renderer
  25826. var BufferRenderer = /*#__PURE__*/function () {
  25827. function BufferRenderer(renderer, size) {
  25828. _classCallCheck(this, BufferRenderer);
  25829. this.renderer = renderer;
  25830. this.width = size.width;
  25831. this.height = size.height;
  25832. this.bufferOptions = {
  25833. minFilter: THREE.LinearFilter,
  25834. magFilter: THREE.LinearFilter,
  25835. format: THREE.RGBAFormat,
  25836. type: THREE.FloatType,
  25837. stencilBuffer: false
  25838. }; // 在start()的时候初始化
  25839. this.readBuffer = null; // 一般用于从该buffer读取先前的渲染结果:this.readBuffer.texture
  25840. this.writeBuffer = null; // 一般用于将渲染结果写入该buffer:render()
  25841. }
  25842. _createClass(BufferRenderer, [{
  25843. key: "render",
  25844. value: function render(scene, camera) {
  25845. var toScreen = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  25846. if (toScreen) {
  25847. this.renderer.render(scene, camera);
  25848. } else {
  25849. // 离屏渲染
  25850. var V = this.renderer.autoClear;
  25851. this.renderer.autoClear = !1; // 暂时关闭autoClear
  25852. this.renderer.setRenderTarget(this.writeBuffer);
  25853. this.renderer.render(scene, camera); // 将BufferShader场景的渲染结果存储到writeBuffer里
  25854. this.renderer.setRenderTarget(null);
  25855. this.renderer.autoClear = V;
  25856. } // 每次render都要交换readBuffer/writeBuffer的值
  25857. var _ref = [this.writeBuffer, this.readBuffer];
  25858. this.readBuffer = _ref[0];
  25859. this.writeBuffer = _ref[1];
  25860. } // 将涂抹数据保存为base64,之后发给后端转成png格式并存入数据库
  25861. }, {
  25862. key: "save",
  25863. value: function save() {
  25864. var bufferArray = new Float32Array(this.width * this.height * 4); // 宽像素 * 高像素 * rgba四个值
  25865. // 把readBuffer里的涂抹贴图按像素存入bufferArray
  25866. this.renderer.readRenderTargetPixels(this.readBuffer, 0, 0, this.width, this.height, bufferArray);
  25867. this.outputCanvas = document.createElement('canvas');
  25868. this.outputCanvas.width = this.width;
  25869. this.outputCanvas.height = this.height;
  25870. var ctx = this.outputCanvas.getContext('2d');
  25871. var rowBytes = this.width * 4;
  25872. for (var row = 0; row < this.height; row++) {
  25873. var srow = this.height - 1 - row;
  25874. var imageData = ctx.createImageData(this.width, 1);
  25875. var start = srow * this.width * 4;
  25876. for (var i = 0; i < rowBytes; i++) {
  25877. imageData.data[i] = bufferArray[start + i] * 255;
  25878. } // 把bufferArray画到outputCanvas上
  25879. ctx.putImageData(imageData, 0, row);
  25880. } // outputCanvas转存为base64
  25881. this.base64 = this.outputCanvas.toDataURL('image/png'); // let img = document.createElement("img")
  25882. // img.src = this.base64
  25883. // document.querySelector("body").appendChild(img)
  25884. // console.error(this.base64)
  25885. return this.base64;
  25886. }
  25887. }]);
  25888. return BufferRenderer;
  25889. }();
  25890. function _createSuper$12(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$12(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  25891. function _isNativeReflectConstruct$12() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  25892. /**
  25893. * 空间模型
  25894. */
  25895. var GLTFDecoration = /*#__PURE__*/function (_THREE$Group) {
  25896. _inherits(GLTFDecoration, _THREE$Group);
  25897. var _super = _createSuper$12(GLTFDecoration);
  25898. function GLTFDecoration(manager, info) {
  25899. var _this;
  25900. _classCallCheck(this, GLTFDecoration);
  25901. _this = _super.call(this);
  25902. _this.manager = manager;
  25903. _this.version = 0;
  25904. _this.axisAngle = {
  25905. x: 0,
  25906. y: 0,
  25907. z: 0
  25908. };
  25909. if (!info) {
  25910. // 新增
  25911. _this.sid = common.getRandomSid();
  25912. _this.panoId = _this.manager.player.currentPano.id;
  25913. _this.isNew = true;
  25914. _this.position.setY(1000);
  25915. var BoxMaterial = new THREE.MeshBasicMaterial({
  25916. color: '#00c8af',
  25917. opacity: 0.4,
  25918. transparent: !0,
  25919. polygonOffset: true,
  25920. //是否开启多边形偏移
  25921. polygonOffsetFactor: -0.9,
  25922. //多边形偏移因子
  25923. polygonOffsetUnits: -4.0 //多边形偏移单位
  25924. });
  25925. var BoxGeometry = new THREE.BoxGeometry(0.5, 0.5, 0.5);
  25926. BoxGeometry.translate(0, 0.25, 0);
  25927. var box = new THREE.Mesh(BoxGeometry, BoxMaterial);
  25928. _this.add(box);
  25929. } else {
  25930. // 数据库数据
  25931. _this.setFromInfo(info);
  25932. _this.updateInfo(true);
  25933. }
  25934. return _this;
  25935. }
  25936. /**
  25937. * 加载模型
  25938. * @param {*} url 模型名称
  25939. */
  25940. _createClass(GLTFDecoration, [{
  25941. key: "load",
  25942. value: function load(url) {
  25943. this.children.forEach(function (mesh) {
  25944. mesh.geometry.dispose();
  25945. mesh.material.dispose();
  25946. });
  25947. this.children = [];
  25948. if (url) {
  25949. this.url = url;
  25950. loaders.gltf("".concat(this.manager.player.$app.resource.getUserModelResourceURL(url), "&v=").concat(this.version), // `${url}?v=${this.manager.player.$app.store.getValue('metadata').version}_${this.version}`,
  25951. function (gltf) {
  25952. var _this2 = this;
  25953. var meshes = [];
  25954. gltf.scene.traverse(function (obj) {
  25955. return obj.type == 'Mesh' && meshes.push(obj);
  25956. });
  25957. meshes.forEach(function (mesh) {
  25958. // mesh.material.color.setRGB(3, 3, 3)
  25959. _this2.add(mesh);
  25960. mesh.renderOrder = RenderOrder.overlay; //xzw add
  25961. mesh.material.transparent = true; //xzw add 否则会被marker遮住
  25962. });
  25963. this.version++;
  25964. this.dispatchEvent({
  25965. type: 'loaded'
  25966. });
  25967. }.bind(this));
  25968. }
  25969. } // 删除模型
  25970. }, {
  25971. key: "remove",
  25972. value: function remove() {
  25973. this.removeFromParent();
  25974. this.children.forEach(function (mesh) {
  25975. mesh.geometry.dispose();
  25976. mesh.material.dispose();
  25977. });
  25978. } // 通过info初始化或回退
  25979. }, {
  25980. key: "setFromInfo",
  25981. value: function setFromInfo(info) {
  25982. this.sid = info.sid;
  25983. this.panoId = info.panoId;
  25984. this.url != info.url && this.load(info.url);
  25985. this.zipName = info.zipName;
  25986. this.visible = info.visible;
  25987. this.setTransformFromInfo(info);
  25988. }
  25989. }, {
  25990. key: "setTransformFromInfo",
  25991. value: function setTransformFromInfo(info) {
  25992. var position = info.position,
  25993. rotation = info.rotation,
  25994. scale = info.scale,
  25995. quaternion = info.quaternion;
  25996. this.position.set(parseFloat(position.x), parseFloat(position.y), parseFloat(position.z));
  25997. if (quaternion) {
  25998. this.setRotationFromQuaternion(new THREE.Quaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w));
  25999. } else {
  26000. // this.rotation.set(THREE.MathUtils.degToRad(rotation.x), THREE.MathUtils.degToRad(rotation.y), THREE.MathUtils.degToRad(rotation.z))
  26001. this.setAxisAngle('x', THREE.MathUtils.degToRad(rotation.x));
  26002. this.setAxisAngle('y', THREE.MathUtils.degToRad(rotation.y));
  26003. this.setAxisAngle('z', THREE.MathUtils.degToRad(rotation.z));
  26004. }
  26005. this.scale.set(parseFloat(scale.x), parseFloat(scale.y), parseFloat(scale.z));
  26006. }
  26007. /**
  26008. * 旋转
  26009. * @param {'x' | 'y' | 'z'} axisName 旋转轴
  26010. * @param {*} angle 旋转角
  26011. */
  26012. }, {
  26013. key: "setAxisAngle",
  26014. value: function setAxisAngle(axisName, angle) {
  26015. var axis = axisName == 'x' ? Vectors$1.RIGHT : axisName == 'y' ? axis = Vectors$1.UP : Vectors$1.BACK;
  26016. this.rotateOnAxis(axis, angle - this.axisAngle[axisName]);
  26017. this.axisAngle[axisName] = angle;
  26018. }
  26019. /**
  26020. * 返回空间模型数据
  26021. * @param {*} isSave 是否保存当前数据
  26022. * @returns
  26023. */
  26024. }, {
  26025. key: "updateInfo",
  26026. value: function updateInfo(isSave) {
  26027. var info = {
  26028. sid: this.sid,
  26029. panoId: this.panoId,
  26030. url: this.url,
  26031. zipName: this.zipName,
  26032. position: {
  26033. x: parseFloat(this.position.x.toFixed(2)),
  26034. y: parseFloat(this.position.y.toFixed(2)),
  26035. z: parseFloat(this.position.z.toFixed(2))
  26036. },
  26037. rotation: {
  26038. x: parseInt(THREE.MathUtils.radToDeg(this.axisAngle.x)),
  26039. y: parseInt(THREE.MathUtils.radToDeg(this.axisAngle.y)),
  26040. z: parseInt(THREE.MathUtils.radToDeg(this.axisAngle.z))
  26041. },
  26042. scale: {
  26043. x: parseFloat(this.scale.x.toFixed(1)),
  26044. y: parseFloat(this.scale.y.toFixed(1)),
  26045. z: parseFloat(this.scale.z.toFixed(1))
  26046. },
  26047. visible: this.visible
  26048. };
  26049. if (isSave) this.info = info;
  26050. return info;
  26051. }
  26052. }]);
  26053. return GLTFDecoration;
  26054. }(THREE.Group);
  26055. var GLTFAddManager = /*#__PURE__*/function () {
  26056. function GLTFAddManager(player) {
  26057. _classCallCheck(this, GLTFAddManager);
  26058. this.player = player;
  26059. this.editing = false;
  26060. this.adding = null; // 添加后确认位置前的状态
  26061. this.selecting = null; // 选中出现轴向时的状态
  26062. this.group = new THREE.Group();
  26063. this.group.name = 'GLTFDecorations';
  26064. player.model.add(this.group);
  26065. this.bindEvents();
  26066. }
  26067. _createClass(GLTFAddManager, [{
  26068. key: "show",
  26069. value: function show(floorIndex, keepHidden) {
  26070. var _this = this;
  26071. this.group.children.forEach(function (gltf) {
  26072. if (gltf === _this.adding || gltf === _this.selecting) return; // 忽略编辑中模型的显隐计算
  26073. if (keepHidden && !gltf.info.visible) return;
  26074. if (floorIndex == 'all' || _this.player.model.panos.get(gltf.panoId).floorIndex == floorIndex) gltf.visible = true;
  26075. });
  26076. }
  26077. }, {
  26078. key: "hide",
  26079. value: function hide(floorIndex) {
  26080. var _this2 = this;
  26081. this.group.children.forEach(function (gltf) {
  26082. if (gltf === _this2.adding || gltf === _this2.selecting) return;
  26083. if (floorIndex == 'all' || _this2.player.model.panos.get(gltf.panoId).floorIndex == floorIndex) gltf.visible = false;
  26084. });
  26085. }
  26086. /**
  26087. * 事件
  26088. */
  26089. }, {
  26090. key: "bindEvents",
  26091. value: function bindEvents() {
  26092. var _this3 = this;
  26093. this.player.on('pointerUp', this.onMouseUp.bind(this));
  26094. this.player.on('pointerMove', this.onMouseMove.bind(this));
  26095. var axisAngleTemp;
  26096. this.player.model.transformControls.addEventListener('mouseDown', function () {
  26097. if (_this3.selecting) {
  26098. axisAngleTemp = JSON.parse(JSON.stringify(_this3.selecting.axisAngle));
  26099. }
  26100. });
  26101. this.player.model.transformControls.addEventListener('mousing', function (e) {
  26102. if (_this3.selecting) {
  26103. // 移动模型轴向
  26104. if (e.mode == 'rotate') {
  26105. var axis = e.axis.toLowerCase();
  26106. var angle = axisAngleTemp[axis] + e.angle;
  26107. _this3.selecting.axisAngle[axis] = ((angle + Math.PI) % (Math.PI * 2) - Math.PI * 2) % (Math.PI * 2) + Math.PI; // 限制在-179到180
  26108. }
  26109. _this3.player.$app.Scene.Decoration.emit('Decoration.GLTF.select', _this3.selecting.updateInfo());
  26110. }
  26111. });
  26112. this.player.model.transformControls.addEventListener('mouseUp', function () {
  26113. if (_this3.selecting) ;
  26114. });
  26115. }
  26116. }, {
  26117. key: "onMouseUp",
  26118. value: function onMouseUp(e) {
  26119. if (this.player.EditOverlay.isAdding || this.player.EditOverlay.editPlane) return;
  26120. if (this.selecting || !this.editing) return;
  26121. if (this.adding) {
  26122. e.consume(); // 确认位置
  26123. this.adding.updateInfo(true);
  26124. this.select(this.adding);
  26125. this.adding = null;
  26126. } else if (this.player.mouseCouldBeClickToMove) {
  26127. var intersect = this.player.getMouseIntersect(null, this.group.children.filter(function (d) {
  26128. return d.visible;
  26129. }));
  26130. if (intersect) {
  26131. // 点击选中
  26132. e.consume();
  26133. var decoration = intersect.object.parent;
  26134. this.select(decoration);
  26135. this.player.flyToPano({
  26136. pano: this.player.model.panos.get(decoration.panoId),
  26137. lookAtPoint: decoration.position,
  26138. checkAlone: true
  26139. });
  26140. }
  26141. }
  26142. }
  26143. }, {
  26144. key: "onMouseMove",
  26145. value: function onMouseMove() {
  26146. if (this.adding) {
  26147. var intersect = this.player.getMouseIntersect(null, this.player.model.colliders);
  26148. if (intersect) {
  26149. this.adding.position.copy(intersect.point);
  26150. }
  26151. }
  26152. }
  26153. /**
  26154. * 选中
  26155. */
  26156. }, {
  26157. key: "select",
  26158. value: function select(decoration) {
  26159. this.selecting = decoration;
  26160. this.player.model.transformControls.switchEditState('decoration');
  26161. this.player.model.transformControls.attach(decoration);
  26162. this.player.$app.Scene.Decoration.emit('Decoration.GLTF.select', decoration.updateInfo());
  26163. this.player.compass.switch('axis');
  26164. }
  26165. }, {
  26166. key: "unselect",
  26167. value: function unselect() {
  26168. this.selecting = null;
  26169. this.player.model.transformControls.detach();
  26170. this.player.compass.switch('direction');
  26171. }
  26172. /**
  26173. * 增删
  26174. */
  26175. }, {
  26176. key: "add",
  26177. value: function add(info) {
  26178. var decoration = new GLTFDecoration(this, info);
  26179. this.group.add(decoration);
  26180. if (!info) this.adding = decoration;
  26181. return decoration;
  26182. }
  26183. }, {
  26184. key: "delete",
  26185. value: function _delete(decoration) {
  26186. if (decoration == this.selecting) this.unselect();
  26187. decoration.remove();
  26188. }
  26189. /**
  26190. * 保存
  26191. */
  26192. }, {
  26193. key: "save",
  26194. value: function save(func) {
  26195. // let data = this.group.children.map(decoration => decoration.updateInfo())
  26196. var data = this.selecting.updateInfo(); // let data = {}
  26197. // this.group.children.forEach((decoration, index) => {
  26198. // data[index] = decoration.updateInfo()
  26199. // })
  26200. return {
  26201. // data: JSON.stringify(data),
  26202. data,
  26203. successCallBack: function () {
  26204. try {
  26205. this.selecting.isNew = false;
  26206. this.selecting.updateInfo(true);
  26207. this.unselect(); // this.group.children.forEach(decoration => {
  26208. // decoration.isNew = false
  26209. // decoration.updateInfo(true)
  26210. // })
  26211. func && func();
  26212. } catch (e) {
  26213. console.error(e);
  26214. }
  26215. }.bind(this)
  26216. };
  26217. }
  26218. }]);
  26219. return GLTFAddManager;
  26220. }();
  26221. function _createSuper$11(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$11(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  26222. function _isNativeReflectConstruct$11() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  26223. var log = function log() {
  26224. };
  26225. /* const _camereChangeLazyTime = 80 */
  26226. defineComponent('Player', function () {
  26227. return /*#__PURE__*/function (_EventEmitter) {
  26228. _inherits(Player, _EventEmitter);
  26229. var _super = _createSuper$11(Player);
  26230. function Player() {
  26231. var _this;
  26232. _classCallCheck(this, Player);
  26233. _this = _super.call(this);
  26234. _this.setupCustomProperties = function (e) {
  26235. var t = e || Viewmode$1.PANORAMA;
  26236. Object.defineProperty(this, 'mode', {
  26237. get: function get() {
  26238. return t;
  26239. },
  26240. set: function set(e) {
  26241. var i = t;
  26242. t = e, this.onModeUpdated(i, t);
  26243. }
  26244. });
  26245. };
  26246. _this.isOutsideMode = function (mode) {
  26247. mode = mode || this.mode;
  26248. return mode === Viewmode$1.DOLLHOUSE || mode === Viewmode$1.FLOORPLAN;
  26249. };
  26250. _this.is360View = function (e, t) {
  26251. return e === Viewmode$1.PANORAMA && t && t.panoType == '360view';
  26252. };
  26253. _this.setScene = function () {
  26254. var scene = this.$app.core.get('SceneRenderer').scene;
  26255. this.sceneIntersectionPlane = scene.plane;
  26256. this.path.setScene(scene);
  26257. this.moveReticuleToScene(scene);
  26258. };
  26259. _this.moveReticuleToScene = function (e) {
  26260. this.reticule.parent && this.reticule.parent.remove(this.reticule), e.add(this.reticule);
  26261. };
  26262. _this.updateModel = function () {
  26263. var _this2 = this;
  26264. // function updateCamera(centerY) {
  26265. // var camera = this.cameraControls.cameras[Viewmode.DOLLHOUSE]
  26266. // , control = this.cameraControls.controls[Viewmode.DOLLHOUSE]
  26267. // , positionY = camera.position.y + (centerY - control.target.y)
  26268. // , duration = settings.showFloorDuration + settings.showFloorDelay;
  26269. // transitions.start(lerp.property(control.target, "y", centerY), duration, null, settings.flydown.movementDelay, easing[settings.flydown.movementEasing], null, settings.freeze.FlyToViewFloor);
  26270. // transitions.start(lerp.property(camera.position, "y", positionY), duration, null, settings.flydown.movementDelay, easing[settings.flydown.movementEasing], null, settings.freeze.FlyToViewFloor);
  26271. // }
  26272. this.model = this.modelManager.getActiveModel();
  26273. this.model.player = this; // this.model.on("floor.changed", function(newFloor, t, oldFloor) {
  26274. // this.mode === Viewmode.DOLLHOUSE && newFloor !== oldFloor && updateCamera.call(this, newFloor.center.y)
  26275. // }
  26276. // .bind(this));
  26277. // this.model.on("allfloors.toggled", function(flag, floor) {
  26278. // if (this.mode === Viewmode.DOLLHOUSE) {
  26279. // var centerY = flag ? this.model.center.y : centerY = floor.center.y;
  26280. // updateCamera.call(this, centerY)
  26281. // }
  26282. // }
  26283. // .bind(this));
  26284. this.paintEditor.init();
  26285. this.on(PlayerEvents.PanoChosen, function (pano0, pano1, flag) {
  26286. _this2.model.setProjectedPanos(pano0, pano1, flag);
  26287. _this2.paintEditor && _this2.paintEditor.updatePanoPaint(pano0.id, pano1.id);
  26288. _this2.$app.FilterManager && _this2.$app.FilterManager.updatePanoFilters(pano0, pano1);
  26289. });
  26290. this.on(PlayerEvents.FlyingStarted, this.model.resetHighMap.bind(this.model));
  26291. };
  26292. _this.updateModelDependentData = function () {
  26293. this.cameraControls.setModelForControls(this.model);
  26294. this.getPanoMarkersFromModel(this.model);
  26295. };
  26296. _this.getPanoMarkersFromModel = function (e) {
  26297. this.panoMarkers = e.panos.list.reduce(function (e, t) {
  26298. return t.marker ? e.concat(t.marker) : e;
  26299. }, []);
  26300. };
  26301. _this.handleControlMove = function (e) {
  26302. this.emit(PlayerEvents.Move, e);
  26303. if (this.mode === Viewmode$1.PANORAMA) {
  26304. this.emit(PlayerEvents.Rotate, {
  26305. quaternion: this.cameraControls.activeControl.camera.quaternion,
  26306. mode: Viewmode$1.PANORAMA,
  26307. currentPanoId: this.nextPano ? this.nextPano.id : this.currentPano ? this.currentPano.id : null,
  26308. type: 'rotate'
  26309. });
  26310. }
  26311. };
  26312. _this.handleControlInputStart = function (e) {
  26313. this.emit(PlayerEvents.InputStart, e);
  26314. };
  26315. _this.onModeUpdated = function (fromMode, toMode) {
  26316. this.cameraControls.activateControls(toMode);
  26317. this.emit(PlayerEvents.ModeChanged, fromMode, toMode); //add:
  26318. //beforechangeMode
  26319. if (toMode == 'transitioning') {
  26320. fromMode = this.modeTran.split('-')[0]; //按钮active改变
  26321. //this.store.commit('SetPlayerOptions',{mode:toMode == "panorama" ? "pano" : toMode == "dollhouse" ? "3d" : "2d",modeCanSwitch:false})
  26322. if (fromMode == Viewmode$1.PANORAMA) {
  26323. this.flyingToTag = this.flyRotate = this.flyingWithRot = false; //有出现过如果还没校准好热点就飞出的话会是true
  26324. /* this.model.chunks.forEach(chunk=>{//4.6.0 xzw 改写
  26325. common.updateVisible(chunk,'atPano',true) //恢复漫游点处隐藏的chunk
  26326. }) */
  26327. }
  26328. } else {
  26329. //afterChangeMode
  26330. toMode = this.modeTran.split('-')[1];
  26331. if (!(this.isOutsideMode(fromMode) && this.isOutsideMode(toMode))) this.model.fadePanoMarkers(null, 0);
  26332. if (toMode == Viewmode$1.PANORAMA) ;
  26333. }
  26334. };
  26335. _this.isWarping = function () {
  26336. //return this.path.warping
  26337. return false;
  26338. };
  26339. _this.isWaitingToWarp = function () {
  26340. //return this.path.waitingToWarp
  26341. return false;
  26342. };
  26343. _this.bindEvents = function (e) {
  26344. e !== document && e.setAttribute('tabindex', -1), e.addEventListener('mousedown', this.onMouseDown.bind(this)), e.addEventListener('mousemove', this.onMouseMove.bind(this)), e.addEventListener('mouseover', this.onMouseOver.bind(this)), e.addEventListener('mouseout', this.onMouseOut.bind(this)), e.addEventListener('mouseup', this.onMouseUp.bind(this)), //this.$app.core.get('ModelManager').on(ModelManagerEvents.ActiveModelChanged, this.onModelChanged.bind(this)),
  26345. e.addEventListener('touchstart', this.onTouchStart.bind(this), {
  26346. passive: false
  26347. }), e.addEventListener('touchmove', this.onTouchMove.bind(this), {
  26348. passive: false
  26349. }), e.addEventListener('touchend', this.onTouchEnd.bind(this)), e.addEventListener('pointerdown', this.onPointerDown.bind(this)), e.addEventListener('pointermove', this.onPointerMove.bind(this)), e.addEventListener('pointerup', this.onPointerUp.bind(this)), e.addEventListener('pointerout', this.onPointerOut.bind(this)), e.addEventListener('pointercancel', this.onPointerCancel.bind(this)), document.addEventListener('keydown', this.onKeyDown.bind(this)), this.cameraControls.on(ControlEvents.Move, this.handleControlMove.bind(this)), this.cameraControls.on(ControlEvents.InputStart, this.handleControlInputStart.bind(this)), this.cameraControls.on(ControlEvents.Pinch, this.handleControlPinch.bind(this)), this.cameraControls.on(ControlEvents.Scroll, this.handleControlScroll.bind(this));
  26350. };
  26351. _this.onMouseDown = function (e) {
  26352. e.currentTarget !== document && e.currentTarget.focus(), 0 === e.button && (this.handleInputStart.call(this, e.clientX, e.clientY, !1), this.updateIntersect()); //this.distanceToCamera(2)
  26353. };
  26354. _this.onMouseMove = function (e) {
  26355. (this.isTouchEvent = !1, this.containsMouse = !0), this.handleInputMove.call(this, e.clientX, e.clientY, !1);
  26356. };
  26357. _this.onMouseOver = function (e) {
  26358. this.containsMouse = !0, !this.mouseDown || 0 !== e.which && 0 !== e.buttons || (this.mouseDown = !1);
  26359. };
  26360. _this.onMouseOut = function (e) {
  26361. this.containsMouse = !1;
  26362. };
  26363. _this.onMouseUp = function (e) {
  26364. this.handleInputEnd.call(this, e.clientX, e.clientY, !1);
  26365. this.emit(PlayerEvents.EndRotation, {
  26366. rotationSpeed: this.cameraControls.activeControl ? this.cameraControls.activeControl.rotationSpeed : null,
  26367. type: 'endRotation'
  26368. });
  26369. };
  26370. _this.onTouchStart = function (e) {
  26371. if (e.currentTarget !== document && e.currentTarget.focus(), !this.mouseDown) {
  26372. this.couldBeLongTap = !0;
  26373. var t = common.average(e.changedTouches, 'clientX'),
  26374. i = common.average(e.changedTouches, 'clientY');
  26375. this.handleInputStart.call(this, t, i, !0), this.mouseDownTimer = setTimeout(function () {
  26376. this.updateIntersect(), this.handleInputEnd.call(this, t, i, !0);
  26377. }.bind(this), settings$3.input.longTapThreshold);
  26378. } //ios safari 球幕视频无法自动播放,必须静音才能播放,播放后关闭静音会导致视频暂停 #43676
  26379. //需要用户交互才能播放带声音的视频 the request is not allowed by the user agent or the platform in thre current context, possibly because the user denied permission
  26380. if (browser$1.detectIOS()) {
  26381. var panoVideoRenderer = this.$app.core.get('PanoVideoRenderer');
  26382. panoVideoRenderer.setMuted(false);
  26383. }
  26384. };
  26385. _this.onTouchMove = function (e) {
  26386. var t = common.average(e.changedTouches, 'clientX'),
  26387. i = common.average(e.changedTouches, 'clientY');
  26388. this.handleInputMove.call(this, t, i, !0);
  26389. };
  26390. _this.onTouchEnd = function (e) {
  26391. if (clearTimeout(this.mouseDownTimer), this.mouseDown) {
  26392. this.couldBeLongTap = !1, this.updateIntersect();
  26393. var t = common.average(e.changedTouches, 'clientX'),
  26394. i = common.average(e.changedTouches, 'clientY');
  26395. this.handleInputEnd.call(this, t, i, !0);
  26396. this.emit(PlayerEvents.EndRotation, {
  26397. rotationSpeed: this.cameraControls.activeControl ? this.cameraControls.activeControl.rotationSpeed : null,
  26398. type: 'endRotation'
  26399. });
  26400. }
  26401. };
  26402. _this.onPointerDown = function (e) {
  26403. e.currentTarget !== document && e.currentTarget.focus();
  26404. if (this.mouseDown || 'mouse' === e.pointerType) {
  26405. return this.onMouseDown(e);
  26406. } else {
  26407. this.couldBeLongTap = !0;
  26408. this.handleInputStart.call(this, e.clientX, e.clientY, !0);
  26409. return void (this.mouseDownTimer = setTimeout(function () {
  26410. this.updateIntersect(), this.handleInputEnd.call(this, e.clientX, e.clientY, !0);
  26411. }.bind(this), settings$3.input.longTapThreshold));
  26412. }
  26413. };
  26414. _this.onPointerMove = function (e) {
  26415. 'mouse' !== e.pointerType ? this.handleInputMove.call(this, e.clientX, e.clientY, !0) : this.onMouseMove(e);
  26416. };
  26417. _this.onPointerUp = function (e) {
  26418. if (this.mouseDown && 'mouse' !== e.pointerType) {
  26419. if (this.mouseDownTimer) {
  26420. clearTimeout(this.mouseDownTimer);
  26421. }
  26422. this.couldBeLongTap = !1;
  26423. this.updateIntersect();
  26424. void this.handleInputEnd.call(this, e.clientX, e.clientY, !0);
  26425. this.emit(PlayerEvents.EndRotation, {
  26426. rotationSpeed: this.cameraControls.activeControl ? this.cameraControls.activeControl.rotationSpeed : null,
  26427. type: 'endRotation'
  26428. });
  26429. } else {
  26430. this.onMouseUp(e);
  26431. }
  26432. };
  26433. _this.onPointerOut = function (e) {
  26434. this.mouseDown = !1;
  26435. };
  26436. _this.onPointerCancel = function (e) {
  26437. this.mouseDown = !1;
  26438. };
  26439. _this.onKeyDown = function (e) {
  26440. if (!this.$app.config.useShortcutKeys) {
  26441. return;
  26442. }
  26443. var t = function () {
  26444. this.cameraControls.activeControl && this.cameraControls.activeControl.emit(ControlEvents.Move, 'key');
  26445. }.bind(this),
  26446. i = e.which;
  26447. switch (i) {
  26448. case Keys.F:
  26449. t(), this.changeFloor(-1);
  26450. break;
  26451. case Keys.R:
  26452. t(), this.changeFloor(1);
  26453. }
  26454. if (this.mode === Viewmode$1.PANORAMA) switch (i) {
  26455. case Keys.UPARROW:
  26456. case Keys.W:
  26457. this.flyLocalDirection(Vectors$1.FORWARD.clone());
  26458. break;
  26459. case Keys.DOWNARROW:
  26460. case Keys.S:
  26461. this.flyLocalDirection(Vectors$1.BACK.clone());
  26462. break;
  26463. case Keys.A:
  26464. this.flyLocalDirection(Vectors$1.LEFT.clone());
  26465. break;
  26466. case Keys.D:
  26467. this.flyLocalDirection(Vectors$1.RIGHT.clone());
  26468. }
  26469. if (this.started
  26470. /* && ( !viewEditLink.markView && !editSpot.setSpotPos && (!this.linkEditor || !this.linkEditor.setPanoVisible && !this.linkEditor.setTagVisible)) */
  26471. ) {
  26472. switch (i) {
  26473. case Keys.ONE:
  26474. //i.isInMode(_e.TRANSITIONING) || (t.changeMode(_e.PANORAMA));
  26475. this.insideMode();
  26476. break;
  26477. case Keys.TWO:
  26478. //this.model.outsideAllowed() && !this.isInMode(_e.FLOORPLAN, _e.TRANSITIONING) && (t.changeMode(_e.FLOORPLAN));
  26479. this.flyToNewMode({
  26480. mode: Viewmode$1.DOLLHOUSE
  26481. });
  26482. break;
  26483. case Keys.THREE:
  26484. //this.model.outsideAllowed() && !this.isInMode(_e.DOLLHOUSE, _e.TRANSITIONING) && (t.changeMode(_e.DOLLHOUSE));
  26485. this.flyToNewMode({
  26486. mode: Viewmode$1.FLOORPLAN
  26487. });
  26488. break;
  26489. }
  26490. }
  26491. };
  26492. _this.handleScrollPinchZoom = function () {
  26493. return function (e) {
  26494. var t = e,
  26495. i = this.zoomLevel;
  26496. this.zoomBy(t), this.currentPano && this.zoomStats.addZoomAction(i, this.zoomLevel, this.currentPano.id);
  26497. };
  26498. }();
  26499. _this.handleControlPinch = function (e) {
  26500. if (settings$3.zoom.enabled) {
  26501. this.handleScrollPinchZoom(1 - e);
  26502. } else if (this.$app.config.useShortcutKeys) {
  26503. this.flyLocalDirection(new THREE.Vector3(0, 0, e).normalize());
  26504. }
  26505. };
  26506. _this.handleControlScroll = function (e) {
  26507. if (settings$3.zoom.enabled) {
  26508. if (e > 0) {
  26509. e = 1 + this.scrollZoomSpeed;
  26510. } else {
  26511. e < 0 && (e = 1 - this.scrollZoomSpeed);
  26512. }
  26513. 0 !== e && this.handleScrollPinchZoom(e);
  26514. this.emit(PlayerEvents.Zoom, {
  26515. zoom: e,
  26516. type: 'zoom',
  26517. zoomLevel: this.zoomLevel
  26518. });
  26519. } else if (this.$app.config.useShortcutKeys) {
  26520. this.flyLocalDirection(new THREE.Vector3(0, 0, -e).normalize());
  26521. }
  26522. };
  26523. _this.handleInputStart = function (e, t, i, ignorePad) {
  26524. var mouse = {
  26525. x: e,
  26526. y: t
  26527. };
  26528. if (
  26529. /* !config.mobile && */
  26530. !ignorePad) {
  26531. mouse = math$1.handelPadding(e, t, this.domElement);
  26532. }
  26533. math$1.convertScreenPositionToNDC(mouse.x, mouse.y, this.mouse, this.domElement);
  26534. math$1.convertScreenPositionToNDC(mouse.x, mouse.y, this.mouseAtMouseDown, this.domElement);
  26535. this.mouseCouldBeClickToMove = !0;
  26536. this.mouseDown = !0;
  26537. this.updateIntersect(); //为了触屏版,在点击时立刻checkIntersect
  26538. //add---------------------------------
  26539. var consumed;
  26540. var consume = function consume() {
  26541. consumed = true;
  26542. };
  26543. var getConsumed = function getConsumed() {
  26544. return consumed;
  26545. }; //被使用
  26546. this.emit('pointerStart', {
  26547. consume,
  26548. getConsumed
  26549. });
  26550. if (consumed) {
  26551. return;
  26552. } // 有被事件作用到,且需要阻止后续进行
  26553. //------------------------------------
  26554. if (this.EditPanoVideo && this.EditPanoVideo.editing) {
  26555. this.EditPanoVideo.dealPointerDown();
  26556. } else if (this.EditPanoMosaic && this.EditPanoMosaic.editing) {
  26557. this.EditPanoMosaic.dealPointerDown();
  26558. } else {
  26559. this.model.transformControls && this.model.transformControls.handleDragStart();
  26560. }
  26561. if (this.paintEditor && this.paintEditor.painting) {
  26562. this.paintEditor.dealPointerDown();
  26563. } // this.setQuaternionTransition(null)
  26564. this.aimQuaternion = null;
  26565. };
  26566. _this.handleInputMove = function (e, t, i) {
  26567. this.isTouchEvent = i;
  26568. var mouse = math$1.handelPadding(e, t, this.domElement);
  26569. math$1.convertScreenPositionToNDC(mouse.x, mouse.y, this.mouse, this.domElement); // 不能给0,三星手机在pointmove上非常敏感,需要一定容错才能触发click
  26570. if (this.mouseAtMouseDown.distanceTo(this.mouse) > 0.01
  26571. /*settings.input.moveToleranceNDC*/
  26572. ) {
  26573. this.mouseCouldBeClickToMove = !1;
  26574. this.couldBeLongTap = !1;
  26575. clearTimeout(this.mouseDownTimer);
  26576. this.model.transformControls && this.model.transformControls.handleDragging();
  26577. }
  26578. if (this.EditPanoMosaic && this.EditPanoMosaic.editing) {
  26579. this.EditPanoMosaic.dealPointerMove();
  26580. }
  26581. if (this.paintEditor && this.paintEditor.painting) {
  26582. this.paintEditor.dealPointerMove(mouse);
  26583. } //add---------------------------------
  26584. var consumed;
  26585. var consume = function consume() {
  26586. consumed = true;
  26587. };
  26588. var getConsumed = function getConsumed() {
  26589. return consumed;
  26590. }; //被使用
  26591. this.emit('pointerMove', {
  26592. consume,
  26593. getConsumed
  26594. });
  26595. if (consumed) {
  26596. return;
  26597. } // pointerDown 有被事件作用到,且需要阻止后续进行
  26598. //------------------------------------
  26599. this.mouseLastMoveTime = Date.now();
  26600. this.reticule.move(e, t, i);
  26601. };
  26602. _this.handleInputEnd = function (e, t, i) {
  26603. var _this3 = this;
  26604. if (this.isTouchEvent = i, this.mouseDown = !1, this.cameraControls.controls[Viewmode$1.PANORAMA].emit('interaction.direct'), !i && this.couldBeLongTap) return !0;
  26605. this.model.transformControls && this.model.transformControls.handleDragEnd();
  26606. this.EditPanoVideo && this.EditPanoVideo.dealPointerUp();
  26607. this.EditPanoMosaic && this.EditPanoMosaic.dealPointerUp();
  26608. if (this.paintEditor && this.paintEditor.painting) {
  26609. this.paintEditor.dealPointerUp();
  26610. } //add---------------------------------
  26611. var consumed;
  26612. var consume = function consume() {
  26613. consumed = true;
  26614. }; //被使用
  26615. var getConsumed = function getConsumed() {
  26616. return consumed;
  26617. };
  26618. this.emit('pointerUp', {
  26619. consume,
  26620. getConsumed
  26621. });
  26622. if (consumed) {
  26623. return;
  26624. } // 有被事件作用到,且需要阻止后续进行
  26625. //------------------------------------
  26626. if (this.handleLongTap()) return !0;
  26627. if (this.mouseCouldBeClickToMove) {
  26628. if (this.flying) {
  26629. //this.path.activeTransType === WarpStyle.WALK && this.emit(PlayerEvents.WarpInterruptedWithFlyTo, this.path.activeTransType);
  26630. return this.flyToPanoClosestToMouse(); //!0; 改for panoTask
  26631. } // if (this.checkMattertagClick())
  26632. // return !0;
  26633. if (this.chosenMeasureRuler) {
  26634. //取消“删除”显示
  26635. this.chosenMeasureRuler.showOptionLabel(false);
  26636. }
  26637. if (this.linkEditor && this.linkEditor.setPanoVisible) {
  26638. //正在设置漫游可行
  26639. var currentFloorIcons = [].concat(_toConsumableArray(this.linkEditor.actionIcons), _toConsumableArray(this.linkEditor.footIcons)).filter(function (icon) {
  26640. return icon.pano.floorIndex == _this3.model.currentFloor.floorIndex;
  26641. });
  26642. this.intersect = this.getMouseIntersect(null, currentFloorIcons
  26643. /* .concat(this.measureRulers.map(ruler => ruler.boldLine)) */
  26644. );
  26645. if (this.intersect && this.intersect.object.visible) {
  26646. var icon = this.intersect.object;
  26647. if (icon.type == 'ActionIcon' && !this.linkEditor.activePano && icon.footIcon.status == 'floor') {
  26648. // 设置楼层连接点隐藏需要做二次确认提示
  26649. var self = this;
  26650. this.$app.WalkManager.emit('walkManager.floorPointHide', function () {
  26651. self.linkEditor.dealPanoVisible(self.intersect.object.name, self.intersect.object);
  26652. });
  26653. } else {
  26654. this.linkEditor.dealPanoVisible(this.intersect.object.name, this.intersect.object);
  26655. }
  26656. }
  26657. return;
  26658. }
  26659. if (this.linkEditor && this.linkEditor.setTagVisible) {
  26660. //正在设置热点可视
  26661. this.linkEditor.tagVsetting && this.intersect && this.intersect.object.visible && this.linkEditor.dealTagVisible(this.linkEditor.tagVsetting, this.intersect.object.name);
  26662. return;
  26663. }
  26664. var measureIntersect = this.getMouseIntersect(null, this.measureRulers.filter(function (e) {
  26665. return e.state == 'active';
  26666. }).map(function (ruler) {
  26667. return ruler.boldLine;
  26668. }));
  26669. if (measureIntersect && measureIntersect.object.parentRuler) {
  26670. //点击测距标尺 以删除
  26671. measureIntersect.object.parentRuler.showOptionLabel(true, measureIntersect.point);
  26672. return;
  26673. }
  26674. if (this.EditOverlay && this.EditOverlay.isAdding) {
  26675. this.intersect && this.EditOverlay.addOverlay({
  26676. intersect: this.intersect
  26677. });
  26678. return;
  26679. }
  26680. if (this.OverlayManager.hoveringPlane) {
  26681. this.OverlayManager.clickOverlay(this.OverlayManager.hoveringPlane);
  26682. return;
  26683. }
  26684. if (this.intersect && this.billboardManager && this.billboardManager.isAdding) {
  26685. return this.billboardManager.startInsertion({
  26686. intersect: this.intersect
  26687. });
  26688. } //add---------------------------------
  26689. var _consumed;
  26690. var _consume = function _consume() {
  26691. _consumed = true;
  26692. }; //被使用
  26693. var _getConsumed = function _getConsumed() {
  26694. return _consumed;
  26695. };
  26696. this.emit('click', {
  26697. intersect: this.intersect,
  26698. consume: _consume,
  26699. getConsumed: _getConsumed,
  26700. raycaster: this.raycaster
  26701. });
  26702. if (_consumed) {
  26703. return;
  26704. } // 有被事件作用到,且需要阻止后续进行
  26705. //------------------------------------
  26706. if (this.currentPano && this.is360View(this.mode, this.currentPano)) return;
  26707. this.cameraControls.activeControl && this.cameraControls.activeControl.emit(ControlEvents.Move, this.isTouchEvent ? 'touch' : 'mouse');
  26708. this.history.invalidate();
  26709. if (this.intersect) {
  26710. return this.flyToPanoClosestToMouse();
  26711. }
  26712. if (this.mode === Viewmode$1.PANORAMA) {
  26713. var pano = this.closestPanoInDirection(this.getMouseDirection());
  26714. if (pano) {
  26715. return this.flyToPano({
  26716. pano: pano
  26717. });
  26718. } else {
  26719. return this.bump(this.getMouseDirection());
  26720. }
  26721. }
  26722. }
  26723. this.intersect && this.closestPano && this.closestPano.hoverOff(this.mode);
  26724. };
  26725. _this.handleLongTap = function () {
  26726. if (this.couldBeLongTap && (!this.isPanoHover || this.mode !== Viewmode$1.PANORAMA)) {
  26727. this.cameraControls.activeControl && this.cameraControls.activeControl.emit(ControlEvents.LongTap, 'touch');
  26728. return !0;
  26729. }
  26730. };
  26731. _this.start = function (initialPanoInfo) {
  26732. var _this4 = this;
  26733. var mode = initialPanoInfo.mode,
  26734. pano = initialPanoInfo.pano,
  26735. position = initialPanoInfo.position,
  26736. quaternion = initialPanoInfo.quaternion,
  26737. tag = initialPanoInfo.tag,
  26738. quickstart = initialPanoInfo.quickstart,
  26739. deferred = Deferred$1();
  26740. this.updateModelDependentData();
  26741. this.updateFromControls(); //this.findDefaultViews();
  26742. var is360 = this.is360View(mode, pano);
  26743. var done = function done(e) {
  26744. _this4.emit(PlayerEvents.Ready, is360, e, tag);
  26745. _this4.started = true;
  26746. };
  26747. if (!this.model.outsideAllowed() || is360 || quickstart) {
  26748. this.startInside(pano, position, quaternion, tag, deferred);
  26749. } else {
  26750. this.startOutside(initialPanoInfo, deferred);
  26751. this.once(PlayerEvents.FlyingEnded, done); //add
  26752. }
  26753. this.compass = new Compass(this);
  26754. this.linkEditor = new Link(this);
  26755. this.labelManager = new LabelManager(this);
  26756. return deferred;
  26757. };
  26758. _this.startOutside = function (initialPanoInfo, deferred) {
  26759. var mode = initialPanoInfo.mode,
  26760. pano = initialPanoInfo.pano,
  26761. position = initialPanoInfo.position,
  26762. quaternion = initialPanoInfo.quaternion,
  26763. zoom = initialPanoInfo.zoom,
  26764. floorVisibility = initialPanoInfo.floorVisibility,
  26765. tag = initialPanoInfo.tag;
  26766. this.emit(PlayerEvents.StartOutside, settings$3[mode].transitionTime);
  26767. if (this.isOutsideMode(mode)) {
  26768. this.model.warpDestFloors(floorVisibility, !0);
  26769. transitions$1.cancelById(settings$3.freeze.FlyToViewFloor);
  26770. if (mode === Viewmode$1.FLOORPLAN) {
  26771. this.floorplanMode(position, quaternion, zoom);
  26772. } else {
  26773. this.dollhouseMode(position, quaternion);
  26774. }
  26775. deferred.resolve(!1);
  26776. } else {
  26777. this.startInsideWithFlyin(pano, position, quaternion, tag, deferred);
  26778. }
  26779. this.beforeChangeMode(null, mode);
  26780. };
  26781. _this.startInside = function (pano, position, quaternion, tag, deferred) {
  26782. deferred = deferred || Deferred$1();
  26783. this.currentPano = pano;
  26784. var o = pano && !pano.isAligned();
  26785. position = o ? pano.position : position || pano.position;
  26786. quaternion = quaternion || pano.quaternion;
  26787. if (pano) {
  26788. //这里开始加载第一个点的全景图。如果未加载好,等加载好以后还会执行一遍此startInside函数。
  26789. var a = this.startInside.bind(this, pano, position, quaternion, tag, deferred);
  26790. if (this.checkAndWaitForPanoLoad(pano, 'high', 'low', this.basePanoSize, a)) return;
  26791. } //add:--------
  26792. this.modeTran = 'panorama-panorama'; //modeTran要比mode先设置,因mode修改会触发onModeUpdated,需要用到modeTran
  26793. this.beforeChangeMode(null, Viewmode$1.PANORAMA, this.currentPano, 0); //xzw add
  26794. this.afterChangeMode(null, Viewmode$1.PANORAMA);
  26795. pano.enter(); //------------
  26796. this.mode = Viewmode$1.PANORAMA;
  26797. pano.floor.enter(this.mode);
  26798. this.emit(PlayerEvents.PanoChosen, this.currentPano, this.currentPano);
  26799. this.switchCameraMode(this.mode, quaternion);
  26800. this.emit(PlayerEvents.StartInside, o); // 初始点位球幕视频静音播放
  26801. var panoVideoRenderer = this.$app.core.get('PanoVideoRenderer');
  26802. panoVideoRenderer.setMuted(true);
  26803. panoVideoRenderer.activatePanorama(this.currentPano);
  26804. deferred.resolve(!0);
  26805. return deferred;
  26806. };
  26807. _this.startInsideWithFlyin = function (initPano, initPosition, initQuaternion, tag, deferred) {
  26808. deferred = deferred || Deferred$1();
  26809. this.dollhouseMode();
  26810. if (!initPano) {
  26811. logger$1.warn('Player.startInsideWithFlyin() -> targetPano is invalid.');
  26812. deferred.resolve(!1);
  26813. return deferred;
  26814. }
  26815. initPosition = initPosition || initPano.position;
  26816. var quaternion = initQuaternion || this.cameraControls.activeControl.camera.quaternion,
  26817. position = initPano.position; //这个作用是加载完数据,模型第一次出现的位置
  26818. this.fitDollhouse(position, initPosition, quaternion);
  26819. setTimeout(function (t) {
  26820. this.cameraControls.activeControl && (this.cameraControls.activeControl.maxDistance = t);
  26821. var newMode = {
  26822. mode: Viewmode$1.PANORAMA,
  26823. pano: initPano,
  26824. quaternion: initQuaternion,
  26825. callback: function () {
  26826. this.emit(PlayerEvents.FlyinFinished);
  26827. deferred.resolve(!0);
  26828. }.bind(this)
  26829. };
  26830. this.flyToNewMode(newMode);
  26831. }.bind(this, this.cameraControls.activeControl.maxDistance), settings$3.startupFlyinDelay);
  26832. return deferred;
  26833. };
  26834. _this.checkAndWaitForPanoLoad = function () {
  26835. var loadingPanos = {},
  26836. LoadedTimePanos = {},
  26837. loadedCallback = {},
  26838. //add
  26839. maxTime = 5e3;
  26840. /* var withinTime = function () {//5秒之内还在加载的话,直接返回仍在加载状态,否则重新判断
  26841. for (var panoId in loadingPanos)
  26842. if (loadingPanos.hasOwnProperty(panoId) && loadingPanos[panoId]) {//还在加载
  26843. var differTime = performance.now() - LoadedTimePanos[panoId]
  26844. if (differTime < maxTime) return !0
  26845. }
  26846. return !1
  26847. } */
  26848. //xzw withinTime 改为只判断当前请求的点。原始代码的callback是针对任意pano的,所以遍历所有漫游点,只要有在加载的就返回,但已不满足需求。
  26849. var withinTime = function withinTime(pano) {
  26850. //5秒之内还在加载的话,直接返回仍在加载状态,否则重新判断
  26851. if (loadingPanos.hasOwnProperty(pano.id) && loadingPanos[pano.id]) {
  26852. //还在加载
  26853. var differTime = performance.now() - LoadedTimePanos[pano.id];
  26854. if (differTime < maxTime) return !0;
  26855. }
  26856. };
  26857. return function (pano, imgQuality1, imgQuality2, basePanoSize, successCallbackFunc1, successCallbackFunc2, progressCallback, iswait, isclear, p) {
  26858. if (withinTime(pano)) {
  26859. log('loadedCallback re add', pano.id);
  26860. loadedCallback[pano.id] = successCallbackFunc1; //add 更新 因为有可能之前请求的没加successCallbackFunc1
  26861. return !0; //距离上次请求时间很近
  26862. }
  26863. /*
  26864. withinTime的原因: 多次重复飞向一个点,withinTime()为true 。如修改热点位置时
  26865. */
  26866. var callback1 = function (panoId, param1, param2) {
  26867. common.delayOneFrame(function () {
  26868. loadingPanos[panoId] = !1; //console.log('loadedCallback consume:', pano.id)
  26869. loadedCallback[pano.id] && loadedCallback[pano.id](param1, param2);
  26870. loadedCallback[pano.id] = null;
  26871. }.bind(this));
  26872. }.bind(this, pano.id);
  26873. var callback2 = function (panoId, param) {
  26874. common.delayOneFrame(function () {
  26875. this.clearPanosTaskList(); // 加载tile失败后清掉task
  26876. loadingPanos[panoId] = !1;
  26877. successCallbackFunc2 && successCallbackFunc2(param);
  26878. }.bind(this));
  26879. }.bind(this, pano.id);
  26880. try {
  26881. ;
  26882. null !== iswait && void 0 !== iswait || (iswait = !0);
  26883. if (pano.tiled) {
  26884. loadingPanos[pano.id] = this.checkAndWaitForTiledPanoLoad(pano, basePanoSize, callback1, callback2, progressCallback, iswait, isclear, p);
  26885. } else {
  26886. loadingPanos[pano.id] = this.checkAndWaitForWholePanoLoad(pano, imgQuality1, imgQuality2, callback1, iswait);
  26887. }
  26888. if (loadingPanos[pano.id]) {
  26889. LoadedTimePanos[pano.id] = performance.now(); //console.log('loadedCallback add', pano.id)
  26890. loadedCallback[pano.id] = successCallbackFunc1; //add 如果加载好就执行最新的successCallbackFunc1
  26891. }
  26892. return loadingPanos[pano.id]; //false 代表加载好了
  26893. } catch (msg) {
  26894. loadingPanos[pano.id] = !1;
  26895. LoadedTimePanos[pano.id] = performance.now() - maxTime;
  26896. throw msg;
  26897. }
  26898. };
  26899. }();
  26900. _this.checkAndWaitForWholePanoLoad = function (pano, imgQuality1, imgQuality2, callbackFunc, iswait) {
  26901. if (!pano) {
  26902. throw new BasicException('Player.checkAndWaitForWholePanoLoad() -> Cannot load texture for null pano.');
  26903. }
  26904. if (iswait) {
  26905. this.model.waitForLoad(pano, function () {
  26906. return pano.isLoaded(imgQuality2);
  26907. });
  26908. }
  26909. if (!pano.isLoaded(imgQuality1)) {
  26910. pano.loadCube(imgQuality1).done(callbackFunc);
  26911. return true;
  26912. } else {
  26913. return false;
  26914. }
  26915. };
  26916. _this.checkAndWaitForTiledPanoLoad = function () {
  26917. var vectorForward = new THREE.Vector3();
  26918. return function (pano, basePanoSize, callback1, callback2, progressCallback, iswait, isclear, l) {
  26919. if (!pano) {
  26920. throw new BasicException('Player.checkAndWaitForTiledPanoLoad() -> Cannot load texture for null pano.');
  26921. }
  26922. vectorForward.copy(Vectors$1.FORWARD);
  26923. this.getDirection(vectorForward);
  26924. if (!pano.isLoaded(basePanoSize)) {
  26925. iswait && this.model.waitForLoad(pano, function () {
  26926. return pano.isLoaded(basePanoSize);
  26927. });
  26928. pano.loadTiledPano(basePanoSize, vectorForward, null, isclear, l
  26929. /* , undefined, quality */
  26930. ).done(function (e, t) {
  26931. callback1 && callback1(e, t);
  26932. }.bind(this)).fail(function (msg) {
  26933. callback2 && callback2(msg);
  26934. }.bind(this)).progress(function (e, t, i) {
  26935. progressCallback && progressCallback(e, t, i);
  26936. }.bind(this));
  26937. return !0;
  26938. }
  26939. };
  26940. }();
  26941. _this.switchCameraMode = function (mode, quaternion, target, position, currentScale) {
  26942. var o = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
  26943. var control = this.cameraControls.controls[mode],
  26944. camera = control.camera;
  26945. if (mode == Viewmode$1.PANORAMA) {
  26946. camera.position.copy(this.currentPano.position);
  26947. var direction;
  26948. if (quaternion) {
  26949. direction = Vectors$1.FORWARD.clone().applyQuaternion(quaternion);
  26950. } else {
  26951. direction = this.getDirection().setY(0).normalize();
  26952. }
  26953. control.lookAt(direction.add(camera.position));
  26954. } else {
  26955. if (target) {
  26956. control.target.copy(target);
  26957. }
  26958. if (position) {
  26959. camera.position.copy(position);
  26960. }
  26961. if (mode == Viewmode$1.DOLLHOUSE) {
  26962. //////////////////
  26963. if (!position && !target) {
  26964. if (o.dontFitScreen && this.mode === Viewmode$1.PANORAMA) {
  26965. //当前位置的抬升
  26966. position = this.position.clone();
  26967. if (this.mode === Viewmode$1.PANORAMA) {
  26968. position.add(new THREE.Vector3(0, 6, 0)).add(this.getDirection().multiplyScalar(-10));
  26969. } else {
  26970. position.add(Vectors$1.DOWN.clone().applyQuaternion(this.quaternion).multiplyScalar(6)).setY(6);
  26971. }
  26972. } else {
  26973. //fitScreen 居中 . by xzw
  26974. var vec;
  26975. if (this.mode === Viewmode$1.PANORAMA) {
  26976. control.target.copy(this.model.center).setY(this.model.boundingBox.min.y + 2);
  26977. vec = this.getDirection().negate().setY(1).normalize(); //获得朝向
  26978. } else {
  26979. control.target.copy(this.target.clone().setY(this.model.boundingBox.min.y + 2));
  26980. vec = Vectors$1.DOWN.clone().applyQuaternion(this.quaternion).setY(1).normalize();
  26981. }
  26982. var distance = control.suitableDistance;
  26983. vec.multiplyScalar(distance);
  26984. position = control.target.clone().add(vec);
  26985. }
  26986. camera.position.copy(position);
  26987. }
  26988. } else if (mode == Viewmode$1.FLOORPLAN) {
  26989. ////////////////////
  26990. if (!target) {
  26991. control.target.copy(this.model.center).setY(0);
  26992. }
  26993. if (!position) {
  26994. var y = this.mode == 'panorama' ? this.cameraControls.controls.dollhouse.suitableDistance * 0.7 : THREE.MathUtils.clamp(this.camera.position.y, 1, settings$3.floorplan.cameraHeight); //尽量和dollhouse的高度一致,渐变才不突兀
  26995. y = Math.max(y, this.model.boundingBox.max.y + constants$4.orthoNear + constants$4.planeHeightShift + 1);
  26996. camera.position.copy(this.model.center).setY(y);
  26997. control.rotateToView(this.model.size, this.getDirection());
  26998. }
  26999. if (currentScale) {
  27000. control.currentScale = control.absoluteScale = currentScale;
  27001. } else if (o.fitBoundSize) {
  27002. control.zoomToContain(this.fitBoundSize);
  27003. } else {
  27004. control.zoomToContain(this.model.size);
  27005. }
  27006. }
  27007. }
  27008. control.update(0);
  27009. };
  27010. _this.update = function () {
  27011. var e = {},
  27012. maxDelayCount_ = 15,
  27013. //最大延迟帧数
  27014. waitUpdateCount = 2,
  27015. //先延迟两帧
  27016. needsDelayUpdate;
  27017. return function (i) {
  27018. this.updatePersistentZooming(i), this.updateFromControls(i); //this.getCurrentNodePanos(t);
  27019. this.lastFrameChanged = false;
  27020. if (this.hasChanged(e)) {
  27021. //相机、鼠标等是否有变化
  27022. this.lastFrameChanged = e.cameraChanged3 ? 'level3' : e.cameraChanged2 ? 'level2' : e.cameraChanged ? 'level1' : false;
  27023. this.lastChangeTime = Date.now();
  27024. !this.mouseDown && this.containsMouse && this.updateIntersect();
  27025. this.emit(PlayerEvents.ViewChanged, e);
  27026. if (e.cameraChanged) {
  27027. if (this.compass) this.compass.update(this.quaternion);
  27028. this.model.floorLogos.updateFloorlogo(this.camera && this.camera.quaternion, this);
  27029. if (this.linkEditor && (this.linkEditor.setTagVisible || this.linkEditor.setPanoVisible)) this.linkEditor.updateFootIconSize();
  27030. this.updateLabelZIndex(['dollLabels', 'doorLabels']); //更新"删除测量线"的标签所在位置
  27031. if (this.chosenMeasureRuler) {
  27032. this.chosenMeasureRuler.updateOptionPos();
  27033. }
  27034. needsDelayUpdate = true;
  27035. } //----cameraChanged end
  27036. if (e.cameraChanged || e.floorChanged || e.allFlVisiChanged) {
  27037. this.dollLabels.concat(this.planLabels).concat(this.doorLabels).concat(this.measureRulers).concat(this.polygonmarkLabels).forEach(function (label) {
  27038. label.update();
  27039. });
  27040. }
  27041. } //----hasChanged end----------
  27042. if (needsDelayUpdate) {
  27043. //延时update,防止崩溃
  27044. if (waitUpdateCount-- == 0) {
  27045. //console.log('update1', waitUpdateCount)
  27046. DoorLabel.updateCameraDir(this);
  27047. this.setAnimateMakerPano();
  27048. waitUpdateCount = maxDelayCount_;
  27049. needsDelayUpdate = false;
  27050. } else if (waitUpdateCount % Math.round(maxDelayCount_ / 3) == 0) {
  27051. //更频繁点的更新(和上一个错开 )
  27052. //console.log('update2', waitUpdateCount )
  27053. if (this.model.supportsTiles) {
  27054. var upcomingPanos = this.panosTaskList.length > 1 ? this.panosTaskList.map(function (e) {
  27055. return e.pano;
  27056. }) : []; //add
  27057. this.updateTileDownloader(upcomingPanos); //提前加载好512图,否则持续漫游会延迟1ms而卡顿
  27058. this.updatePanoRenderer();
  27059. this.updateZoomPano();
  27060. }
  27061. }
  27062. }
  27063. if (this.paintEditor && this.paintEditor.painting) this.paintEditor.update();
  27064. this.reticule.update(); //this.path.update();
  27065. //this.spider.update();
  27066. this.cachedPanoCandidates && settings$3.navigation.panoScores && this.model.panos.showPanoScores(this.cachedPanoCandidates);
  27067. this.updateControlLocks();
  27068. this.emit('update', {
  27069. x: this.position.x,
  27070. y: this.position.z,
  27071. lon: this.cameraControls.controls.panorama.lon,
  27072. hasChanged: e,
  27073. mode: this.mode,
  27074. lastFrameChanged: this.lastFrameChanged
  27075. });
  27076. };
  27077. }();
  27078. _this.updateLabelZIndex = function (types) {
  27079. var _this5 = this;
  27080. //更新labels的z-index
  27081. types.forEach(function (type) {
  27082. if (type == 'dollLabels' && _this5.mode != 'dollhouse' || type == 'doorLabels' && _this5.mode != 'panorama') return;
  27083. var labels = _this5[type].sort(function (a, b) {
  27084. return b.pos2d.z - a.pos2d.z;
  27085. });
  27086. labels.forEach(function (label, index) {
  27087. label.elem.style.zIndex = index;
  27088. });
  27089. });
  27090. };
  27091. _this.updatePersistentZooming = function (e) {
  27092. if (1 === this.zooming) {
  27093. this.zoomBy(1 + this.zoomSpeed * e);
  27094. } else if (this.zooming === -1) {
  27095. this.zoomBy(1 - this.zoomSpeed * e);
  27096. }
  27097. };
  27098. _this.updateControlLocks = function () {
  27099. if (this.currentPano && this.model.supportsTiles) {
  27100. var ctl = this.cameraControls.controls[Viewmode$1.PANORAMA];
  27101. ctl.locked = ctl.lockedForce || settings$3.vrEnabled || !this.currentPano.highestFullTileRenderOpCompleted && this.currentPano.lockUntilRenderingComplete; //xzw add lockedForce
  27102. }
  27103. };
  27104. _this.updatePanoRenderer = function () {
  27105. var vectorForward = new THREE.Vector3();
  27106. return function (t) {
  27107. var i = this.nextPano || this.currentPano;
  27108. vectorForward.copy(Vectors$1.FORWARD);
  27109. this.getDirection(vectorForward);
  27110. if (this.$app.core.get('PanoRenderer').hasQueuedTiles() && i) {
  27111. this.$app.core.get('PanoRenderer').updateDirection(vectorForward);
  27112. }
  27113. };
  27114. }();
  27115. _this.updatePreRendering = function () {
  27116. var e = {};
  27117. return function (t) {
  27118. if (1 === settings$3.tiling.preRenderTourPanos && this.preRenderingEnabled) {
  27119. var i = this.nextPano || this.currentPano;
  27120. if (i && t && t.length > 1) {
  27121. var n = t.findIndex(function (e) {
  27122. if (e.id === i.id) return !0;
  27123. });
  27124. if (n >= 0 && n + 1 < t.length) {
  27125. var r = t[n + 1];
  27126. r.isLoaded(this.basePanoSize) || e[r.id] || (window.setTimeout(function (t) {
  27127. this.checkAndWaitForPanoLoad(t, 'high', 'low', this.basePanoSize, null, null, null, !1, !1, !1), window.setTimeout(function (t) {
  27128. e[t.id] = !1;
  27129. }.bind(this, t), settings$3.tiling.panoPreRenderRepeatDelay);
  27130. }.bind(this, r), settings$3.tiling.panoPreRenderDelay), e[r.id] = !0);
  27131. }
  27132. }
  27133. }
  27134. };
  27135. }();
  27136. _this.enablePreRendering = function () {
  27137. this.preRenderingEnabled = !0;
  27138. };
  27139. _this.updateTileDownloader = function () {
  27140. var e = new THREE.Vector3();
  27141. return function (upcomingPanos) {
  27142. var i = this.nextPano || this.currentPano;
  27143. if (i) {
  27144. var loopTime = common.timeMeasuring.collection['loop'].median;
  27145. /* let quality = 1024
  27146. let lowQuality = this.$app.config.mobile && (this.flying || Date.now() - this.lastFlyPanoDoneTime < camereChangeLazyTime - 1) //手机漫游时(尤其无缝漫游时)不要加载2048,停止后再加载
  27147. if (lowQuality) {
  27148. if ((this.panosTaskList.length > 1 && (loopTime > 3 || this.model.texSizeBlock * loopTime > 80)) || loopTime > 6 || this.model.texSizeBlock * loopTime > 240) {
  27149. quality = 512
  27150. }
  27151. this.curTileQuality = quality
  27152. } else this.curTileQuality = this.$app.core.get('QualityManager').getMaxNavPanoSize()
  27153. //if(lowQuality)console.log('lowQuality2', quality, loopTime, this.model.texSizeBlock * loopTime)
  27154. */
  27155. this.lowTile = this.$app.config.mobile && 'level1';
  27156. if (this.lowTile) {
  27157. if (loopTime > 10 || this.model.texSizeBlock * loopTime > 500) {
  27158. //尽量不要使用,非常模糊
  27159. this.lowTile = 'level2'; //this.flying && console.log('lowTile level2')
  27160. }
  27161. }
  27162. e.copy(Vectors$1.FORWARD);
  27163. this.getDirection(e);
  27164. this.$app.core.get('TileDownloader').tilePrioritizer.updateCriteria(i, this.position, e, upcomingPanos.length > 0 ? upcomingPanos : null), this.$app.core.get('TileDownloader').processPriorityQueue = !0;
  27165. }
  27166. };
  27167. }();
  27168. _this.updateFromControls = function (e) {
  27169. null !== e && void 0 !== e || (e = 0);
  27170. var activeControl = this.cameraControls.activeControl;
  27171. if (activeControl) {
  27172. activeControl.update(e);
  27173. this.quaternion.copy(activeControl.camera.quaternion);
  27174. this.position.copy(activeControl.camera.position);
  27175. this.target.copy(activeControl.target);
  27176. activeControl.camera.updateProjectionMatrix();
  27177. this.camera.projectionMatrix.copy(activeControl.camera.projectionMatrix);
  27178. this.camera.projectionMatrixInverse.copy(activeControl.camera.projectionMatrixInverse);
  27179. this.emit('updateFromControls', this, e); //add
  27180. } //activeControl.camera是不更新matrixWorld的
  27181. this.camera.position.copy(this.position);
  27182. this.camera.quaternion.copy(this.quaternion);
  27183. this.camera.updateMatrix();
  27184. this.camera.updateMatrixWorld();
  27185. };
  27186. _this.updateIntersect = function () {
  27187. var _this6 = this;
  27188. //console.log('updateIntersect')
  27189. var e = this.flying,
  27190. t = this.isOutsideMode() && this.cameraControls.controls[this.mode].isEngaged(),
  27191. i = transitions$1.getById(settings$3.freeze.LookTransition);
  27192. !(e || t || this.isTouchEvent || i.length && i[0].running);
  27193. if (this.linkEditor && this.linkEditor.footIcons && (this.linkEditor.setPanoVisible || this.linkEditor.setTagVisible)) {
  27194. this.intersect = this.getMouseIntersect(null, this.linkEditor.footIcons.filter(function (e) {
  27195. return e.visible && !e.otherFloorLink;
  27196. }));
  27197. if (this.intersect) {
  27198. CursorDeal.add('hoverFootMarker');
  27199. } else {
  27200. CursorDeal.remove('hoverFootMarker');
  27201. }
  27202. return;
  27203. }
  27204. if (this.$app.Camera.monitor.control.cameras.find(function (e) {
  27205. return e.isWatching;
  27206. })) {
  27207. return; //观看监控中不能点击场景物体
  27208. }
  27209. {
  27210. //xzw
  27211. var consumed;
  27212. var consume = function consume() {
  27213. consumed = true;
  27214. }; //被使用
  27215. var getConsumed = function getConsumed() {
  27216. return consumed;
  27217. };
  27218. var meshes = [];
  27219. this.emit('collectIntersectMesh', meshes, {
  27220. consume,
  27221. getConsumed
  27222. }); //搜集要intersect的mesh
  27223. if (consumed) {
  27224. return; //有不加collider情况下获得了intersect且需要阻断的情况
  27225. }
  27226. var markers = this.panoMarkers.filter(function (e) {
  27227. return e.visible && Panorama.filters.isNeighbourPanoTo(_this6.currentPano)(e.pano);
  27228. });
  27229. var videoTags = this.model.panos.list.filter(function (pano) {
  27230. return pano.flagSpot && !pano.flagSpot.hidden;
  27231. }).map(function (pano) {
  27232. return pano.flagSpot.disc;
  27233. });
  27234. this.intersect = this.getMouseIntersect(null, markers.concat(videoTags));
  27235. if (!this.intersect) {
  27236. meshes.push.apply(meshes, _toConsumableArray(this.getColliders()));
  27237. common.timeMeasuring.addTimeMark('getMouseIntersect', 'start');
  27238. this.intersect = this.getMouseIntersect(null, meshes);
  27239. common.timeMeasuring.addTimeMark('getMouseIntersect', 'end', true);
  27240. this.emit('judgeIntersect', this.intersect, {
  27241. consume,
  27242. getConsumed
  27243. });
  27244. if (consumed) return;
  27245. }
  27246. /* if (!this.is360View(this.mode, this.currentPano)) {
  27247. meshes = this.model.floors.reduce(function (e, t) {
  27248. return t.hidden ? e : e.concat(t.collider.children)
  27249. }, meshes)
  27250. if (this.mode == 'panorama') meshes.push(this.model.skybox)
  27251. } */
  27252. //this.intersect = this.getMouseIntersect(null, null)
  27253. }
  27254. this.intersect && this.updateClosestPano(this.intersect);
  27255. if (this.intersectLabel && this.intersect) {
  27256. var text = ['pos: ' + math$1.toPrecision(this.intersect.point.toArray(), 3), 'nor: ' + math$1.toPrecision(this.intersect.normal.toArray(), 2), 'dis: ' + math$1.toPrecision(this.intersect.distance, 2)];
  27257. this.intersectLabel.setText(text);
  27258. this.intersectLabel.setPos(this.intersect.point);
  27259. }
  27260. if (this.closestPano || this.closestPanoInDirection(this.getMouseDirection()) || this.reticule.alwaysShow) {
  27261. this.reticule.updatePosition(this.position, this.intersect);
  27262. if (settings$3.navigation.panoScores && !settings$3.navigation.mouseDirection) {
  27263. this.closestPanoInDirection(this.getDirection());
  27264. }
  27265. } else {
  27266. this.reticule.hide();
  27267. }
  27268. };
  27269. _this.getMouseDirection = function (e) {
  27270. e = e || this.mouse;
  27271. var t = new THREE.Vector3(e.x, e.y, -1).unproject(this.camera),
  27272. i = new THREE.Vector3(e.x, e.y, 1).unproject(this.camera);
  27273. return i.sub(t).normalize();
  27274. };
  27275. _this.getColliders = function () {
  27276. var colliders = [];
  27277. if (!this.is360View(this.mode, this.currentPano)) {
  27278. if (!this.$app.config.mobile || this.mode != Viewmode$1.PANORAMA) {
  27279. //xzw:手机漫游时不intersect模型,因为有的模型很大,八千个mesh用时3ms。但可能导致问题:方向不准
  27280. colliders = this.model.floors.reduce(function (e, t) {
  27281. return t.hidden ? e : e.concat(t.collider.children);
  27282. }, [] //this.mode === Viewmode.PANORAMA ? this.panoMarkers : []
  27283. );
  27284. }
  27285. if (this.mode === Viewmode$1.PANORAMA) colliders.push(this.model.skybox);
  27286. }
  27287. return colliders;
  27288. };
  27289. _this.getMouseIntersect = function (mouse, colliders) {
  27290. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  27291. _ref$recursive = _ref.recursive,
  27292. recursive = _ref$recursive === void 0 ? false : _ref$recursive,
  27293. type = _ref.type;
  27294. mouse = mouse || this.mouse.clone();
  27295. if (!colliders) {
  27296. colliders = this.getColliders();
  27297. } //performance.mark('intersect-start')
  27298. var origin = new THREE.Vector3(mouse.x, mouse.y, -1).unproject(this.camera);
  27299. this.raycaster.set(origin, this.getMouseDirection(mouse));
  27300. this.raycaster.camera = this.camera;
  27301. var objects3d = this.raycaster.intersectObjects(colliders, recursive); //加了个true遍历子集
  27302. // console.log(this.raycaster)
  27303. /* performance.mark('intersect-end')
  27304. let measure = performance.measure('intersect','intersect-start','intersect-end');
  27305. colliders.length> 0 && console.log('getMouseIntersect',measure.duration.toFixed(4))
  27306. */
  27307. if (0 === objects3d.length) {
  27308. return null;
  27309. }
  27310. if (type == 'getAll') return objects3d;
  27311. var object3d = objects3d[0];
  27312. if (object3d.face) {
  27313. object3d.normal = object3d.face.normal.applyQuaternion(object3d.object.quaternion);
  27314. var point = this.position.clone().sub(object3d.point);
  27315. if (point.dot(object3d.normal) < 0) {
  27316. //x,y,z全部反向
  27317. object3d.normal.negate();
  27318. }
  27319. if (this.currentPano) {
  27320. object3d.onFloor = object3d.point.y < this.position.y - 0.5 * this.currentPano.height;
  27321. } else {
  27322. object3d.onFloor = object3d.point.y < this.position.y - 0.5;
  27323. }
  27324. object3d.horizontal = object3d.normal.y > 0.8;
  27325. }
  27326. return object3d;
  27327. };
  27328. _this.updateClosestPano = function (intersect) {
  27329. var _this7 = this;
  27330. // 如果在fly过程中hover到marker时会使本该隐藏的marker显示出来
  27331. if (this.mode === Viewmode$1.TRANSITIONING) return;
  27332. var filterFuncs = [Panorama.filters.isPanoAligned()];
  27333. var pano;
  27334. if (!this.flying) {
  27335. //为了避免飞的过程中还能hover到原先currentPano的邻居点,飞的时候禁止onHover
  27336. if (intersect && (this.panoMarkers.includes(intersect.object) || //是marker . xzw add
  27337. this.model.panos.list.find(function (pano) {
  27338. return pano.flagSpot && pano.flagSpot.disc == intersect.object;
  27339. })) // 是videoTag
  27340. ) {
  27341. pano = intersect.object.pano; //console.log('pano = intersect.object.pano', pano.id)
  27342. }
  27343. if (!pano) {
  27344. if (this.mode === Viewmode$1.PANORAMA) {
  27345. if (!this.currentPano) {
  27346. return;
  27347. }
  27348. filterFuncs.push(Panorama.filters.not(this.currentPano));
  27349. filterFuncs.push(Panorama.filters.isNeighbourPanoTo(this.currentPano));
  27350. filterFuncs.push(Panorama.filters.inFloorDirection(this.currentPano.floorPosition, this.getDirection(), 0.25));
  27351. filterFuncs.push(Panorama.filters.isCloseEnoughTo(intersect.point, settings$3.panoFloorClickRadius)); //如果在地面下很远,由于先识别到地面,intersect就离floorPosition很远,识别不到。所以改为先单独识别marker。
  27352. filterFuncs.push(Panorama.filters.isNotBehindNormal(intersect.point, intersect.normal));
  27353. } else {
  27354. // 避开孤立点,但初始点一定可进入
  27355. filterFuncs.push(function (pano) {
  27356. return _this7.linkEditor.checkHasNeighbor(pano) || pano == _this7.$app.core.get('Scene').firstView.pano;
  27357. });
  27358. filterFuncs.push(Panorama.filters.isOnVisibleFloor());
  27359. this.mode !== Viewmode$1.FLOORPLAN && filterFuncs.push(Panorama.filters.inDirection(this.position, this.getDirection(), 0.25));
  27360. }
  27361. pano = this.model.panos.find(filterFuncs, [Panorama.sortFunctions.floorDistanceToPoint(intersect.point)]);
  27362. }
  27363. }
  27364. if (pano !== this.closestPano) {
  27365. pano && (this.isPanoHover = !0); //触发事件,导致地面的marker变清晰
  27366. this.emit(PlayerEvents.ClosestPanoChanging, this.closestPano, pano, this.mode);
  27367. this.closestPano = pano;
  27368. } else {
  27369. this.isPanoHover = !1;
  27370. }
  27371. };
  27372. _this.dollhouseMode = function (position, quaternion) {
  27373. this.modeTran = 'dollhouse-panorama';
  27374. this.emit(PlayerEvents.ModeChanging, this.mode, Viewmode$1.DOLLHOUSE);
  27375. this.mode = Viewmode$1.DOLLHOUSE;
  27376. this.cameraControls.controls[Viewmode$1.DOLLHOUSE].reset();
  27377. var center = new THREE.Vector3(this.model.center.x, 0, this.model.center.z),
  27378. cameraPosition = new THREE.Vector3(15, 10, 15);
  27379. if (position && quaternion) {
  27380. var direction = Vectors$1.FORWARD.clone().applyQuaternion(quaternion),
  27381. position = this.model.center.clone().sub(position),
  27382. s = position.dot(direction);
  27383. if (s > 0) {
  27384. center = direction.clone().multiplyScalar(s).add(position); //cameraPosition.copy(position)
  27385. } else {
  27386. logger$1.warn("Tried to initiate dollhouse mode that wasn'quaternion looking at the model", position, quaternion);
  27387. }
  27388. }
  27389. this.cameraControls.controls[Viewmode$1.DOLLHOUSE].resetRanges(0, !0);
  27390. this.cameraControls.controls[Viewmode$1.DOLLHOUSE].target.copy(center);
  27391. this.cameraControls.cameras[Viewmode$1.DOLLHOUSE].position.copy(cameraPosition);
  27392. this.updateFromControls();
  27393. this.model.alpha = 1;
  27394. this.model.skybox.material.uniforms.opacity.value = 0;
  27395. };
  27396. _this.insideMode = function (pano, callback) {
  27397. var deferred = Deferred$1(),
  27398. callbackFunc = callback || null;
  27399. if (this.mode !== Viewmode$1.PANORAMA && this.mode !== Viewmode$1.TRANSITIONING) {
  27400. if (!pano) {
  27401. if (!this.currentPano || this.model.currentFloor && this.currentPano.floor != this.model.currentFloor) {
  27402. pano = this.getFloorPanoByScore(null, this.model.currentFloor); //到当前所在楼层
  27403. }
  27404. if (!pano) {
  27405. pano = this.currentPano;
  27406. }
  27407. }
  27408. this.flyToNewMode({
  27409. mode: Viewmode$1.PANORAMA,
  27410. pano: pano,
  27411. callback: callbackFunc
  27412. }).done(deferred.resolve.bind(deferred)).fail(deferred.reject.bind(deferred));
  27413. } else {
  27414. var msg = 'Cannot change mode during mode transition';
  27415. if (this.mode === Viewmode$1.PANORAMA) {
  27416. msg = 'Already in panorama mode';
  27417. }
  27418. deferred.reject(msg);
  27419. }
  27420. return deferred.promise();
  27421. };
  27422. _this.fitDollhouse = function (initPosition1, initPosition2, initQuaternion) {
  27423. var maxY = this.model.boundingBox.max.y;
  27424. var n = Vectors$1.FORWARD.clone().applyQuaternion(initQuaternion);
  27425. initQuaternion = n.clone().add(initPosition1);
  27426. this.cameraControls.activeControl.target.copy(initQuaternion);
  27427. this.cameraControls.activeControl.camera.position.set(0, maxY * 2.4, 0).add(initPosition1).add(n.multiplyScalar(-10));
  27428. /*
  27429. var n = Vectors.FORWARD.clone().applyQuaternion(initQuaternion)
  27430. this.cameraControls.activeControl.target.copy(n).add(initPosition1)
  27431. var o = Vectors.RIGHT.clone().applyQuaternion(initQuaternion),
  27432. a = Vectors.UP.clone(),
  27433. s = o.clone().applyAxisAngle(a, Math.PI / 2),
  27434. boundingBoxMax = this.model.boundingBox.max.clone(),
  27435. boundingBoxMin = this.model.boundingBox.min.clone(),
  27436. h = [
  27437. new THREE.Vector3(boundingBoxMax.x, 0, boundingBoxMax.z).sub(initPosition1),
  27438. new THREE.Vector3(boundingBoxMax.x, 0, boundingBoxMin.z).sub(initPosition1),
  27439. new THREE.Vector3(boundingBoxMin.x, 0, boundingBoxMax.z).sub(initPosition1),
  27440. new THREE.Vector3(boundingBoxMin.x, 0, boundingBoxMin.z).sub(initPosition1)
  27441. ],
  27442. u = 0,
  27443. p = 0,
  27444. g = 0
  27445. h.forEach(function(e, t, i) {
  27446. var n = Math.abs(e.dot(o)),
  27447. r = e.dot(s)
  27448. n > u && ((u = n), (p = r)), r > g && (g = r)
  27449. })
  27450. var m = Math.max(Math.abs(new THREE.Vector3(0, boundingBoxMax.y, 0).sub(initPosition1).dot(a)), Math.abs(new THREE.Vector3(0, boundingBoxMin.y, 0).sub(initPosition1).dot(a))),
  27451. v = s
  27452. .clone()
  27453. .multiplyScalar(p)
  27454. .add(initPosition2),
  27455. A = s
  27456. .clone()
  27457. .multiplyScalar(g)
  27458. .add(initPosition2)
  27459. ;(p = u / Math.tan((this.cameraControls.activeControl.camera.fov / 2) * this.cameraControls.activeControl.camera.aspect * (Math.PI / 180))),
  27460. (g = m / Math.tan((this.cameraControls.activeControl.camera.fov / 2) * (Math.PI / 180))),
  27461. (p = Math.max(p, 10)),
  27462. (g = Math.max(g, 10))
  27463. var y = n
  27464. .clone()
  27465. .multiplyScalar(-p)
  27466. .add(v)
  27467. .sub(initPosition2)
  27468. .length(),
  27469. C = n
  27470. .clone()
  27471. .multiplyScalar(-g)
  27472. .add(v)
  27473. .sub(initPosition2)
  27474. .length()
  27475. this.cameraControls.activeControl.maxDistance = settings.skyboxRadius - 1
  27476. if (y >= C) {
  27477. this.cameraControls.activeControl.camera.position
  27478. .set(0, 6, 0)
  27479. .add(v)
  27480. .add(n.multiplyScalar(1.1 * -p))
  27481. } else {
  27482. this.cameraControls.activeControl.camera.position
  27483. .set(0, 6, 0)
  27484. .add(A)
  27485. .add(n.multiplyScalar(1.1 * -g))
  27486. }
  27487. */
  27488. };
  27489. _this.floorplanMode = function (position, quaternion, zoom, ratio) {
  27490. this.mode = Viewmode$1.FLOORPLAN;
  27491. var control = this.cameraControls.controls[Viewmode$1.FLOORPLAN];
  27492. control.reset();
  27493. var cameraPosition = position ? position : this.model.center;
  27494. control.target.copy(cameraPosition).setY(0);
  27495. control.camera.position.copy(cameraPosition).setY(settings$3.floorplan.cameraHeight);
  27496. if (zoom) {
  27497. control.currentScale = zoom / (this.domElement.clientWidth / this.domElement.clientHeight);
  27498. control.absoluteScale = control.currentScale;
  27499. } else {
  27500. control.zoomToContain(this.model.size, ratio);
  27501. }
  27502. if (quaternion) {
  27503. var direction = Vectors$1.LEFT.clone().applyQuaternion(quaternion);
  27504. control.rotateLeft(-Math.atan2(direction.x, direction.z));
  27505. } else {
  27506. control.rotateToView(this.model.size, this.getDirection());
  27507. }
  27508. control.update(0);
  27509. };
  27510. _this.getAimToNextPano = function (pano, aim, aimQua) {
  27511. //flyToPano 获取quaternion
  27512. var hasVideo;
  27513. if (!aim && !aimQua) {
  27514. var askAim = {
  27515. importance: 0,
  27516. aim: null
  27517. }; //发送请求看看是否需要强制focus的点(比如热点添加时)
  27518. this.emit('ifFocusPoint', askAim);
  27519. if (askAim.aim) {
  27520. if (askAim.importance >= 3) {
  27521. //importance判断权重
  27522. aim = askAim.aim;
  27523. }
  27524. }
  27525. }
  27526. if (!aim) {
  27527. if (pano.panoVideo) {
  27528. hasVideo = true;
  27529. aim = pano.position.clone().add(pano.panoVideo.dir);
  27530. } else {
  27531. hasVideo = !aim && pano.hasVideo && this.$app.core.get('PanoVideoRenderer') && this.$app.core.get('PanoVideoRenderer').ifEnable();
  27532. if (hasVideo) {
  27533. // if(!objects.mainDesign || !objects.mainDesign.editing){
  27534. if (pano.videoInfo.dir) {
  27535. //同panoVideo 展示页
  27536. aim = pano.position.clone().add(pano.videoInfo.dir);
  27537. } else {
  27538. var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(this.model.supportsTiles ? 90 : 180));
  27539. aim = Vectors$1.FORWARD.clone().applyQuaternion(qua.multiply(pano.quaternion)).add(pano.position);
  27540. } // }
  27541. }
  27542. }
  27543. }
  27544. if (aim) aimQua = convertTool.getQuaByAim(aim, pano.position);else aimQua = aimQua;
  27545. return {
  27546. aimQua,
  27547. hasVideo
  27548. };
  27549. };
  27550. _this.flyToPano = function (toPano, callbackFunc) {
  27551. var _this8 = this;
  27552. /* toPano.callback = callbackFunc
  27553. return this.fastToPano(toPano ) */
  27554. //-----测试瞬间过渡
  27555. if (this.locked) {
  27556. return;
  27557. } //if (this.unableChangePano) return
  27558. if (typeof toPano == 'number' || typeof toPano == 'string') toPano = {
  27559. pano: this.model.panos.index[toPano]
  27560. };
  27561. var pano = toPano.pano,
  27562. aim = toPano.lookAtPoint,
  27563. //优先级比quaternion 高
  27564. aimQua = toPano.quaternion,
  27565. duration = toPano.duration,
  27566. aimDuration = toPano.aimDuration,
  27567. rotSpeed = toPano.rotSpeed;
  27568. //xzw
  27569. toPano.maxDistanceOverride;
  27570. toPano.skipWarpingCheck;
  27571. //constantMoveSpeed = toPano.constantMoveSpeed,
  27572. toPano.easeType;
  27573. var //如果为'constant'代表一直保持某个速度,一般是导览,直到最后一个点减速
  27574. newPano = null,
  27575. retryCallback = null,
  27576. zoomLevel = toPano.zoomLevel || (settings$3.zoom.zoomToDefaultWhenToPano ? 1 : this.zoomLevel),
  27577. //add
  27578. cancelLookFun = toPano.cancelLookFun,
  27579. checkAlone = toPano.checkAlone;
  27580. callbackFunc = callbackFunc || toPano.callback;
  27581. toPano.quaOri = this.quaternion.clone(); //记录一下
  27582. if (typeof pano == 'number') pano = toPano.pano = this.model.panos.index[pano];
  27583. if (this.EditPanoMosaic && this.EditPanoMosaic.editVideo && this.EditPanoMosaic.editVideo.pano != pano) {
  27584. return;
  27585. } // checkAlone 如果pano是孤立点,则根据aim跳转到最近的非孤立点
  27586. if (checkAlone && aim && pano.neighbourUUIDs.filter(function (id) {
  27587. return id != pano.id;
  27588. }).length == 0) {
  27589. var notAlonePano = this.model.panos.closestPanoTowardPoint({
  27590. point: aim,
  27591. require: [function (pano) {
  27592. return pano.neighbourUUIDs.filter(function (id) {
  27593. return id != pano.id;
  27594. }).length > 0;
  27595. }]
  27596. });
  27597. if (notAlonePano) {
  27598. pano = notAlonePano;
  27599. toPano.pano = pano;
  27600. }
  27601. }
  27602. if (!toPano.gotQua) {
  27603. var _this$getAimToNextPan = this.getAimToNextPano(pano, aim, aimQua),
  27604. aimQua = _this$getAimToNextPan.aimQua;
  27605. _this$getAimToNextPan.hasVideo;
  27606. toPano.quaternion = aimQua;
  27607. toPano.gotQua = true;
  27608. } //this.updateLastView();
  27609. //飞入
  27610. if (this.mode !== Viewmode$1.PANORAMA) {
  27611. return void this.flyToNewMode({
  27612. mode: Viewmode$1.PANORAMA,
  27613. pano: pano,
  27614. duration: duration,
  27615. quaternion: aimQua,
  27616. callback: callbackFunc
  27617. });
  27618. }
  27619. /*
  27620. toPano.callback = callbackFunc
  27621. return this.fastToPano(toPano ) //-----测试瞬间过渡
  27622. */
  27623. //console.log('this.flying',this.flying, this.panosTaskList.length)
  27624. var isFade360 = this.is360View(this.mode, pano) || this.is360View(this.mode, this.currentPano);
  27625. if (!this.judgePanoTask(toPano, isFade360)) {
  27626. //console.log('judgePanoTask return',this.panosTaskList )
  27627. callbackFunc && callbackFunc(false);
  27628. return;
  27629. } //处理panosTaskList
  27630. //this.$app.core.get('PanoVideoRenderer').activatePanorama(pano)
  27631. if (pano) {
  27632. newPano = common.deepExtend(toPano);
  27633. retryCallback = function () {
  27634. common.delayOneFrame(function () {
  27635. if (this.panosTaskList[0] != newPano) {
  27636. //非最新任务
  27637. //checkAndWaitForPanoLoad可能有点问题,isLoaded和callback不同步?导致add了没及时 consume
  27638. return log();
  27639. }
  27640. newPano.retry = true; //add
  27641. this.flyToPano(newPano, callbackFunc);
  27642. }.bind(this));
  27643. }.bind(this);
  27644. }
  27645. if (config$4.mobile) {
  27646. //手机端的终点出发时使用1024,直到到达终点(也就是高了要降, 低了不升)
  27647. this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  27648. size: 1024
  27649. });
  27650. if (this.lowTile == 'level2') {
  27651. if (!pano.tiledPanoRenderTarget) {
  27652. //非快速漫游时降当前的漫游点
  27653. this.$app.core.get('PanoRenderer').switchPanoQuality(this.currentPano, {
  27654. size: 1024
  27655. });
  27656. }
  27657. }
  27658. } else {
  27659. if (!pano.tiledPanoRenderTarget) this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  27660. size: 2048
  27661. }); //pc在非无缝过渡的出发时, 终点要使用2048. 无缝时还保留之前半路加载的1024
  27662. }
  27663. if (!pano || !this.checkAndWaitForPanoLoad(pano, 'high', 'low', this.basePanoSize, retryCallback)) {
  27664. // logger.time(`[fly to pano] ${pano && pano.id}`)
  27665. console.log("[flytopano]", pano && pano.id);
  27666. var callback = toPano.finalCallback = function (flyDone) {
  27667. //console.log('飞callback', this.currentPano.id )
  27668. this.nextPanoTask(toPano, flyDone); //继续执行panosTaskList的下一个pano
  27669. callbackFunc && callbackFunc(flyDone); //xzw 2022.7.8移动到最后。 万一callbackFunc中包含要飞向下一个,就需要先执行 nextPanoTask。但是万一又需要这个先怎么办
  27670. }.bind(this);
  27671. if (!this.currentPano) {
  27672. this.currentPano = pano;
  27673. } //this.adjustFlySpeed(this.currentPano, pano)
  27674. var _duration = duration;
  27675. if (typeof duration != 'number') {
  27676. _duration = this.computeDuration(toPano);
  27677. } // 加载3dtiles会拖长跳转时间,减去150ms比较合适 //无缝过渡不允许修改
  27678. //if (this.model._3dTilesRuntime) _duration = Math.max(_duration - 150, 1)
  27679. toPano.duration = _duration;
  27680. log('flytopano', toPano.pano.id, toPano, this.panosTaskList.map(function (e) {
  27681. return e.pano.id;
  27682. }));
  27683. /* if( this.panosTaskList[0] != toPano ){
  27684. console.error('?')
  27685. } */
  27686. if (this.zoomLevel !== zoomLevel) {
  27687. switch (settings$3.zoom.transitionStyle) {
  27688. case 1:
  27689. this.smoothZoomLevelTo(zoomLevel, _duration / 2);
  27690. break;
  27691. case 2:
  27692. newPano = common.deepExtend(toPano);
  27693. retryCallback = this.flyToPano.bind(this, newPano, callbackFunc);
  27694. return void this.smoothZoomLevelTo(zoomLevel, settings$3.zoom.restoreTime * (this.zoomLevel - zoomLevel), retryCallback);
  27695. }
  27696. }
  27697. if (aimQua
  27698. /* && !isFade360 */
  27699. ) {
  27700. var quaNow = toPano.quaOri.clone();
  27701. var M = new THREE.Vector3();
  27702. transitions$1.cancelById(settings$3.freeze.LookTransition); //_duration *= settings.transition.aimSlowFactor
  27703. if (pano === this.currentPano) {
  27704. var R = Vectors$1.FORWARD.clone().applyQuaternion(toPano.quaOri),
  27705. P = Vectors$1.FORWARD.clone().applyQuaternion(aimQua),
  27706. O = R.angleTo(P);
  27707. var callback2 = function callback2() {
  27708. callback(true);
  27709. _this8.emit('flytopano.rotateEnd', {});
  27710. };
  27711. this.flyRotate = true; //许钟文 add 在原地旋转,看向某一点
  27712. return void 0 != aimDuration || (aimDuration = 1 * Math.sqrt(O) / (rotSpeed ? rotSpeed : settings$3.tags.navigate.rotateSpeedFactor) * 1e3), void transitions$1.start(function (ee) {
  27713. if (this.mode != Viewmode$1.PANORAMA) {
  27714. //xzw
  27715. transitions$1.cancelById(settings$3.freeze.LookTransition);
  27716. callback2();
  27717. return;
  27718. }
  27719. quaNow.copy(toPano.quaOri);
  27720. lerp.quaternion(quaNow, aimQua)(ee);
  27721. M.copy(convertTool.getAimByQua(quaNow, this.cameraControls.activeControl.camera.position));
  27722. this.cameraControls.activeControl.lookAt(M);
  27723. }.bind(this), aimDuration, callback2, 0, easing[settings$3.transition.movementEasing], null, settings$3.freeze.LookTransition, cancelLookFun);
  27724. }
  27725. }
  27726. if (pano === this.currentPano || this.flying) {
  27727. log('flytopano return ', pano === this.currentPano, this.flying);
  27728. return void callback();
  27729. }
  27730. this.flying = !0;
  27731. this.position.clone();
  27732. var currentPano = this.currentPano;
  27733. this.nextPano = pano; // logger.debug('Flying to pano ', pano.position)
  27734. this.emit(PlayerEvents.PanoChosen, this.currentPano, pano); // this.emit(PlayerEvents.FlyingStarted, {
  27735. // targetPosition: pano.position,
  27736. // currentPosition: position,
  27737. // targetPano: pano,
  27738. // currentPano: currentPano,
  27739. // type: 'flyToPano',
  27740. // })
  27741. // currentPano必须加上,否则球幕视频挂起失效
  27742. this.emit(PlayerEvents.FlyingStarted, {
  27743. panoId: pano.id,
  27744. quaternion: aimQua,
  27745. lastPanoId: currentPano.id,
  27746. type: 'flyToPano',
  27747. duration: toPano.duration,
  27748. isTagFlying: toPano.isTagFlying // 飞向热点
  27749. });
  27750. this.model.currentFloor = pano.floor;
  27751. this.doorLabels.forEach(function (label) {
  27752. return label.updateVisible(pano);
  27753. });
  27754. this.model.fadePanoMarkers(0, 0, {
  27755. hideVideoFlag: true
  27756. }); //过渡时先隐藏, 因marker可能飘
  27757. if (isFade360) {
  27758. this.fade360View(this.cameraControls.activeControl.camera, {
  27759. pano: pano,
  27760. aim: aim,
  27761. aimQua: aimQua
  27762. }, function () {
  27763. _this8.afterFlyToPano(toPano);
  27764. });
  27765. return;
  27766. } //地标变化
  27767. this.model.floorLogos.changefloorLogoOpa({
  27768. index: 0,
  27769. opa: 0,
  27770. dur: _duration,
  27771. delay: 0.7
  27772. }); //this.model.floorLogoFade(0, _duration*0.5, 0.7);
  27773. this.model.floorLogos.secondLogo.position.copy(pano.floorPosition.clone().sub(this.model.position)); //this.model.floorLogos.adjustfloorLogoHeight();
  27774. common.updateVisible(this.model.floorLogos.secondLogo, 'flyToPano', true); //第二个地标只在过渡时显示
  27775. this.model.floorLogos.changefloorLogoOpa({
  27776. index: 1,
  27777. opa: 1,
  27778. dur: 250
  27779. }); //this.model.floorLogoShow(1,250);
  27780. //flyingWithRot边飞边旋转 (许钟文)
  27781. if (aimQua && !isFade360) {
  27782. this.flyingWithRot = true;
  27783. toPano.aimQua = aimQua;
  27784. }
  27785. toPano.chunkProgress = this.judgeHideWall(pano); //穿墙判断
  27786. //console.log('执行过渡:' + _duration)
  27787. this.startTransition(toPano); // // 虚拟人物导览对象
  27788. // const roleAnimation = this.$app.TourManager.roleAnimation
  27789. // //离toPano 3米距离
  27790. // if (roleAnimation && roleAnimation.model && this.$app.TourManager.playing && aimQua) {
  27791. // let newRolePosition = roleAnimation.getTarget2(toPano.pano.position.clone(), aimQua.clone(), 0, 3)
  27792. // const roleStartPosition = roleAnimation.model.position.clone()
  27793. // //人物到目的地的方向
  27794. // const direction = new THREE.Vector3().subVectors(newRolePosition, roleStartPosition)
  27795. // if (toPano.duration != 0) {
  27796. // //let speed = this.currentPano.position.distanceTo(toPano.pano.position) / toPano.duration
  27797. // let speed = roleStartPosition.distanceTo(newRolePosition) / toPano.duration
  27798. // roleAnimation.setModifyTimeScale(speed * 500)
  27799. // //console.log('speed:' + speed)
  27800. // }
  27801. // transitions.start(
  27802. // progress => {
  27803. // if (progress != 0 && progress != 1 && roleAnimation.getVisible()) {
  27804. // //累加并更新人物坐标
  27805. // let _newRolePosition = new THREE.Vector3().addVectors(roleStartPosition, new THREE.Vector3(direction.x * progress, 0, direction.z * progress))
  27806. // roleAnimation.setWalkingToTarget(_newRolePosition)
  27807. // roleAnimation.model.position.set(_newRolePosition.x, this.model.currentFloor.boundingBox.min.y, _newRolePosition.z)
  27808. // //console.log('RoleAnimation-setWalkingToTarget1:' + roleAnimation.model.rotation.y + '&&' + progress)
  27809. // }
  27810. // },
  27811. // toPano.duration,
  27812. // null,
  27813. // 0,
  27814. // null,
  27815. // null,
  27816. // 'roleWalk'
  27817. // )
  27818. // }
  27819. }
  27820. };
  27821. _this.startTransition = function (toPano) {
  27822. var _this9 = this;
  27823. //this.model.chunks.forEach(e => common.updateVisible(e, 'force', false))
  27824. if (!toPano.easeFun) toPano.easeFun = easing.linearTween;
  27825. var startProgress = toPano.progress || 0; // 同屏时过渡transitionsId必须做区分
  27826. var transitionsId = this.$app.resource.num + settings$3.freeze.FlyToPano;
  27827. transitions$1.cancelById(transitionsId);
  27828. var dis = this.currentPano.position.distanceTo(toPano.pano.position);
  27829. var loadNextProgress = THREE.MathUtils.clamp(1 - 2 / dis, 0, 0.9);
  27830. var quaNow = toPano.quaOri.clone();
  27831. var M = new THREE.Vector3();
  27832. /* console.log(
  27833. 'startTransition ',
  27834. toPano.pano.id,
  27835. toPano.easeFun == easing.easeOutSine ? '减速' : '匀速',
  27836. (toPano.easeFun == easing.linearTween && toPano.flySpeed) ? '目标速度' + toPano.flySpeed.toFixed(5) : '',
  27837. 'dur', toPano.duration.toFixed(2),
  27838. 'pgs',toPano.progress.toFixed(3),
  27839. toPano.easeFun == easing.linearTween ? 'loadNextP '+ loadNextProgress.toFixed(2):''
  27840. ) */
  27841. transitions$1.start(function (progress_, delta) {
  27842. var item = transitions$1.getById(transitionsId)[0];
  27843. var progress = startProgress + progress_ * (1 - startProgress);
  27844. var currentSpeed;
  27845. if (progress_ != 1 && progress_ != 0) {
  27846. // 1的时候不准,往往偏小, 0的时候速度为0,也不记录
  27847. currentSpeed = toPano.currentSpeed = (progress - toPano.progress) * dis / delta; //记录下当前速度,当变为匀速时可以过渡到flySpeed
  27848. //console.log('currentSpeed',currentSpeed, progress_, progress)
  27849. } else {
  27850. currentSpeed = toPano.currentSpeed || 0;
  27851. } //console.log('progress',progress, delta)
  27852. toPano.progress = progress;
  27853. if (progress_ > 0 && progress_ < 1 && delta) {
  27854. var adjustSpeed = function adjustSpeed(ratio, cause) {
  27855. var maxChange = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.08;
  27856. //调速
  27857. var change = Math.abs(ratio - 1);
  27858. if (change > maxChange) {
  27859. if (ratio > 1) ratio = 1 + maxChange;else ratio = 1 - maxChange;
  27860. }
  27861. transitions$1.adjustSpeed(transitionsId, ratio); //改速
  27862. transitions$1.adjustSpeed(settings$3.freeze.LookTransition, ratio); //把旋转的也改速下
  27863. //console.log(cause, 'ratio', ratio.toFixed(4), 'speed', currentSpeed.toFixed(5), 'progress', progress.toFixed(4), 'dur',item.duration.toFixed(3))
  27864. };
  27865. if (toPano.easeFun == easing.linearTween && toPano.flySpeed) {
  27866. //调整速度向期望速度靠近(匀速时的flySpeed是期望速度)
  27867. if (currentSpeed > 0 && !math$1.closeTo(currentSpeed, toPano.flySpeed) && toPano.flySpeed) {
  27868. var ratio = toPano.flySpeed / currentSpeed;
  27869. var maxChange = toPano.easeType == 'constant' ? ratio - 1 : 0.01; //改变幅度小的话,有惰性,可以保持接近匀速但整体又能保持平均标准速度。 导览不限制最大变速
  27870. adjustSpeed(ratio, '渐变匀速', maxChange);
  27871. }
  27872. }
  27873. if (progress > loadNextProgress && toPano.flyCount == 1 && toPano.easeFun == easing.linearTween
  27874. /* && toPano.easeType != 'constant' */
  27875. && _this9.panosTaskList.length == 1) {
  27876. //匀速行走超过一半时,若还是最后一个,就减速(之后若又按下,还会变为匀速)
  27877. toPano.easeFun = easing.easeOutSine;
  27878. var restDis = (1 - progress) * dis;
  27879. toPano.duration = Math.PI / 2 * restDis / currentSpeed;
  27880. /* settings.transition.flySpeed */
  27881. // 这样能保证初始速度为flySpeed
  27882. toPano.duration = Math.max(toPano.duration, settings$3.transition.flyTime - item.duration * progress); //避免停止过于迅速
  27883. toPano.ignoreFirstFrame = false;
  27884. _this9.startTransition(toPano);
  27885. }
  27886. if (progress > 0.2 && _this9.panosTaskList.length > 1 && !_this9.panosTaskList[1].pano.tiledPanoRenderTarget) {
  27887. //无缝过渡中途 提前加载下一个, 防止停顿
  27888. _this9.$app.core.get('PanoRenderer').switchPanoQuality(_this9.panosTaskList[1].pano, {
  27889. useIdel: true,
  27890. size: _this9.lowTile == 'level2' ? 512 : 1024
  27891. }); //该质量将会一直持续到到达它
  27892. _this9.checkAndWaitForPanoLoad(_this9.panosTaskList[1].pano, 'low', 'low', _this9.basePanoSize, function () {}); //'low', 'low'
  27893. }
  27894. /* if(toPano.easeFun != easing.linearTween && progress > 0.1 && progress < 0.9 && currentSpeed > 0.001 && item.duration < settings.transition.flyTime){
  27895. let r = THREE.MathUtils.clamp(item.duration * 2.3 / settings.transition.flyTime, 0.9, 0.95)
  27896. adjustSpeed(r, '降速') //防止停止的最后一段因太短而迅速停止
  27897. } */
  27898. }
  27899. _this9.model.skybox.material.uniforms.progress.value = progress;
  27900. _this9.emit('updataProgress', progress); //别的模块借用一下透明度
  27901. if (toPano.chunkProgress) {
  27902. _this9.model.chunks.forEach(function (e) {
  27903. return e.materialInside.uniforms.progress.value = progress;
  27904. });
  27905. }
  27906. if (isNaN(progress)) {
  27907. console.error('progress isNaN', progress, progress_, startProgress, delta, toPano.duration, toPano);
  27908. transitions$1.cancelById(transitionsId);
  27909. }
  27910. var position = _this9.currentPano.position.clone();
  27911. var endPos = toPano.pano.position.clone();
  27912. lerp.vector(position, endPos)(progress);
  27913. _this9.cameraControls.cameras[Viewmode$1.PANORAMA].position.copy(position); //过渡的同时旋转镜头
  27914. if (toPano.aimQua) {
  27915. quaNow.copy(toPano.quaOri);
  27916. lerp.quaternion(quaNow, toPano.aimQua)(progress);
  27917. M.copy(convertTool.getAimByQua(quaNow, _this9.cameraControls.activeControl.camera.position));
  27918. _this9.cameraControls.activeControl.lookAt(M);
  27919. }
  27920. }, toPano.duration, this.afterFlyToPano.bind(this, toPano), 0, toPano.easeFun, 'chunkFly', transitionsId, function () {
  27921. //cancelById
  27922. _this9.afterFlyToPano(toPano, true);
  27923. }, toPano.ignoreFirstFrame);
  27924. toPano.flyCount++;
  27925. };
  27926. _this.nextPanoTask = function (lastToPano, dealTask) {
  27927. if (lastToPano == this.panosTaskList[0]) this.panosTaskList.splice(0, 1); //this.off('makeConstantSpeed', startTransition)
  27928. if (dealTask && this.panosTaskList.length) {
  27929. //继续处理下一个任务
  27930. var next = this.panosTaskList[0];
  27931. next.dealingTask = true; //log('准备执行下一个任务', this.panosTaskList[0].pano.id)
  27932. var dis = next.pano.position.distanceTo(lastToPano.pano.position);
  27933. var currentSpeed = lastToPano.currentSpeed;
  27934. var hopeDur = this.computeDuration(next);
  27935. currentSpeed = Math.max(0.002, currentSpeed);
  27936. next.duration = dis / currentSpeed; //初始速度,为了衔接。即将被使用
  27937. if (next.quaternion) {
  27938. next.duration = hopeDur; //next.duration = Math.max(hopeDur/3, next.duration) //防止过小,导致后期追不上标准速度,尤其是有转向时
  27939. }
  27940. next.flySpeed = dis / hopeDur; //期待速度, 是标准速度
  27941. //console.log('上一个的速度', currentSpeed, '期待速度', next.flySpeed)
  27942. this.flyToPano(next);
  27943. }
  27944. };
  27945. _this.judgePanoTask = function (toPano, isFade360) {
  27946. //处理panosTaskList
  27947. toPano.progress = toPano.progress || 0;
  27948. toPano.flyCount = 0;
  27949. var length = this.panosTaskList.length;
  27950. var last = this.panosTaskList[length - 1];
  27951. if (this.dontInterruptPanoTask) {
  27952. return !!toPano.dealingTask;
  27953. }
  27954. if (!toPano.retry && !toPano.dealingTask) {
  27955. var currentTask = this.panosTaskList[0];
  27956. /* if (currentTask && !currentTask.canConstantlyWalk) {
  27957. return console.log('当前执行的是非canConstantlyWalk,不允许加入')
  27958. } */
  27959. if (toPano.quaternion || isFade360) {
  27960. //遇到特殊的toPano,在这之后不能继续添加
  27961. toPano.canConstantlyWalk = false; //是否可以一直点击一直走。(是否允许添加下一个)
  27962. } // 如果上个点位tile加载有问题卡住,就直接清空panosTaskList
  27963. if (last && last.pano.tileError) {
  27964. this.clearPanosTaskList();
  27965. length = 0;
  27966. last = undefined;
  27967. }
  27968. if (length == 0 || last.canConstantlyWalk || toPano.pano == this.currentPano) {
  27969. if (length > 0) {
  27970. if (this.panosTaskList.some(function (e) {
  27971. var _e$lookAtPoint;
  27972. return e.pano == toPano.pano && (!e.lookAtPoint && !toPano.lookAtPoint || ((_e$lookAtPoint = e.lookAtPoint) === null || _e$lookAtPoint === void 0 ? void 0 : _e$lookAtPoint.equals(toPano.lookAtPoint)));
  27973. })) {
  27974. //去除重复的
  27975. return;
  27976. }
  27977. /* let wholeDur = this.panosTaskList.reduce((w, c) => {
  27978. return w + c.duration
  27979. }, 0)
  27980. if (length > 4 || (wholeDur > 2500 && length > 1)) {
  27981. //console.log('过多',length, wholeDur)
  27982. return
  27983. } */
  27984. if (length > 1) return;
  27985. if (currentTask.flyCount == 0
  27986. /* && currentTask.easeType != 'constant' */
  27987. ) {
  27988. return;
  27989. }
  27990. }
  27991. this.panosTaskList.push(toPano); //只要通过都加入列表,包括 == currentPano的
  27992. length++;
  27993. log('panosTaskList加入', toPano.pano.id);
  27994. } else {
  27995. return log();
  27996. }
  27997. if (length > 1) {
  27998. //等待上一个任务完成
  27999. //log('增加任务', toPano.pano.id)
  28000. /* let {k, easeFun } = easing.getEaseOut( 2 / dis + 1)
  28001. toPano.easeFun = easeFun
  28002. toPano.duration = k * dis / settings.transition.flySpeed */
  28003. //当前任务如果不是匀速,要变成匀速, 且重新执行:
  28004. if (currentTask.easeFun != easing.linearTween) {
  28005. var dis = this.currentPano.position.distanceTo(currentTask.pano.position);
  28006. var restDis = (1 - currentTask.progress) * dis; //console.log('currentSpeed', currentTask.currentSpeed)
  28007. var currentSpeed = Math.max(currentTask.currentSpeed, 0.002); //避免起步过慢
  28008. var newDur = restDis / currentSpeed; //初始速度和原先一致, 为了衔接。
  28009. if (isNaN(newDur)) {
  28010. console.error('newDur isNaN', currentSpeed, currentTask.progress, currentTask);
  28011. }
  28012. currentTask.easeFun = easing.linearTween;
  28013. currentTask.flySpeed = dis / this.computeDuration(currentTask); //渐变加速到标准速度
  28014. currentTask.duration = newDur;
  28015. this.startTransition(currentTask);
  28016. }
  28017. return;
  28018. }
  28019. }
  28020. return true;
  28021. };
  28022. _this.judgeHideWall = function (pano) {
  28023. var chunkProgress = true;
  28024. /* if(objects.mainDesign && objects.mainDesign.editing){
  28025. chunkProgress = false; editModel = true;
  28026. } */
  28027. //var metadata = this.store.getters['scene/metadata'];
  28028. //if(metadata.sceneSource != 12){//123永远要显示模型
  28029. this.model.chunks.forEach(function (e) {
  28030. return common.updateVisible(e, 'isBlock', true);
  28031. }); //先显示
  28032. if (this.currentPano.noBlockPanos.includes(pano.id)) ; else {
  28033. //4.6.0 xzw
  28034. //console.log('judgeHideWall', pano.id)
  28035. //在算法部将有门的地方更改为不隐藏模型之前,先这么写: 判断走过的路中是否真的穿墙。
  28036. if (this.currentPano.blocks[pano.id]) {
  28037. this.hideWalls = this.currentPano.blocks[pano.id];
  28038. this.hideWalls.forEach(function (hideWall) {
  28039. common.updateVisible(hideWall, 'isBlock', false);
  28040. });
  28041. } else {
  28042. var safeDepth = 0.1; //向前后延伸一些,为了防止刚好墙壁在眼前
  28043. var A = this.currentPano.origin.clone();
  28044. var B = pano.origin.clone();
  28045. var AB_ = B.clone().sub(A).normalize().multiplyScalar(safeDepth);
  28046. var A_ = A.clone().sub(AB_); //延长A到A_ 延长长度为safeDepth
  28047. var B_ = B.clone().add(AB_); //延长B到B_ 延长长度为safeDepth
  28048. var intersects = convertTool.ifIntersectChunks(A_, B_, this.model, {
  28049. throughWidth: 0.08,
  28050. meshes: this.model.chunks
  28051. });
  28052. if (intersects) {
  28053. //throughWidth是为了防止刚好从缝隙中穿过,感觉和穿墙近似
  28054. this.hideWalls = intersects.map(function (intersect) {
  28055. intersect.object.visible = false;
  28056. return intersect.object;
  28057. });
  28058. {
  28059. //非编辑页面要记录下,下次不用判断
  28060. this.currentPano.blocks[pano.id] = this.hideWalls.slice(0);
  28061. }
  28062. } else {
  28063. {
  28064. //非编辑页面要记录下,下次不用判断
  28065. this.currentPano.noBlockPanos.push(pano.id);
  28066. }
  28067. }
  28068. }
  28069. }
  28070. return chunkProgress;
  28071. };
  28072. _this.afterFlyToPano = function (toPano, cancel) {
  28073. this.currentPano.isAligned() && (this.lastPano = this.currentPano); //add
  28074. if (this.currentPano !== toPano.pano) {
  28075. this.currentPano.exit();
  28076. toPano.pano.enter();
  28077. this.currentPano = toPano.pano;
  28078. this.nextPano = null;
  28079. this.path.placeCpm();
  28080. if (this.mode == Viewmode$1.PANORAMA) {
  28081. this.path.fadeOutCpm(settings$3.path.fadeOutTime);
  28082. this.paintEditor && this.paintEditor.updatePanoPaint(this.currentPano.id, this.currentPano.id);
  28083. }
  28084. }
  28085. if (!cancel) {
  28086. if (this.mode == Viewmode$1.PANORAMA) {
  28087. this.flying = !1;
  28088. this.emit(PlayerEvents.FlyingEnded, {
  28089. targetPosition: toPano.pano.position,
  28090. currentPosition: toPano.pano.position,
  28091. targetPano: toPano.pano,
  28092. currentPano: this.currentPano
  28093. });
  28094. this.model.floorLogos.firstLogo.position.copy(this.model.floorLogos.secondLogo.position); //this.model.floorLogos.adjustfloorLogoHeight()
  28095. this.model.floorLogos.changefloorLogoOpa({
  28096. index: 0,
  28097. opa: 1,
  28098. dur: 0
  28099. }); //this.model.floorLogos[0].material.uniforms.opacity.value = 1;
  28100. common.updateVisible(this.model.floorLogos.secondLogo, 'flyToPano', false);
  28101. this.model.chunks.forEach(function (chunk) {
  28102. chunk.materialInside.uniforms.progress.value = 1; //chunk.visible = true // 需要显示因穿墙而隐藏的模型
  28103. common.updateVisible(chunk, 'isBlock', true); //vr模式下似乎不能隐藏?settings.vrEnabled 因为改变chunks显示会让画面分离度改变,可能和眼睛看物体远近不同的夹角有关?????
  28104. });
  28105. this.panosTaskList.length == 1 && this.$app.core.get('PanoRenderer').switchPanoQuality(this.currentPano, {
  28106. size: 2048
  28107. }); //非无缝过渡时 升quality
  28108. }
  28109. this.model.fadePanoMarkers();
  28110. this.doorLabels.forEach(function (label) {
  28111. return label.updateVisible();
  28112. });
  28113. this.lastFlyPanoDoneTime = Date.now(); //logger.timeEnd(`[fly to pano] ${this.currentPano.id}`)
  28114. toPano.finalCallback && toPano.finalCallback(true);
  28115. }
  28116. };
  28117. _this.fastToPano = function () {
  28118. var _this10 = this;
  28119. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  28120. //瞬间过渡(支持同点过渡,支持角度)
  28121. if (this.flying || this.isWarping()) return;
  28122. var pano = o.pano || this.model.panos.index[o.panoId];
  28123. if (!pano) return console.error('fastToPano pano 无');
  28124. this.position.clone();
  28125. var oldPano = this.currentPano;
  28126. var duration = o.duration || 1500;
  28127. this.path.warpDestPano = pano;
  28128. var retry = function retry() {
  28129. _this10.waitingToWarp = !1, _this10.fastToPano(o);
  28130. };
  28131. if (config$4.mobile) {
  28132. //手机端的终点出发时使用1024,直到到达终点
  28133. this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  28134. size: 1024
  28135. });
  28136. } else {
  28137. if (!pano.tiledPanoRenderTarget) this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  28138. size: 2048
  28139. }); //pc在非无缝过渡的出发时, 终点要使用2048. 无缝时还保留之前半路加载的1024
  28140. }
  28141. if (this.checkAndWaitForPanoLoad(pano, 'high', 'low', this.basePanoSize, retry)) return void (this.waitingToWarp = !0);
  28142. this.emit('pano.chosen', oldPano, pano); // 用于暂停oldPano的球幕视频播放
  28143. this.emit(PlayerEvents.FlyingStarted, {
  28144. panoId: pano.id,
  28145. lastPanoId: oldPano.id,
  28146. type: 'flyToPano'
  28147. });
  28148. this.flying = true;
  28149. this.nextPano = pano; //提前加载高清图片
  28150. this.path.warpDestHeroLoc = {
  28151. panoId: o.panoId,
  28152. position: pano.position,
  28153. quaternion: o.quaternion || this.quaternion.clone()
  28154. }; //console.log('fastToPano', pano && pano.id )
  28155. logger$1.time("[fly to pano] ".concat(pano && pano.id));
  28156. this.path.warpTravel_BLACK(null, duration, 1, function () {
  28157. /* pano != this.currentPano && this.currentPano.exit()
  28158. pano.enter()
  28159. this.currentPano = pano
  28160. this.flying = false */
  28161. //this.emit("flying.ended", pano.position, oldPos, pano, oldPano)
  28162. o.finalCallback = o.callback;
  28163. _this10.afterFlyToPano(o);
  28164. });
  28165. };
  28166. _this.fade360View = function (currentCamera, o, fuc) {
  28167. var _this11 = this;
  28168. //这个其实可以用fastToPano
  28169. var transitionTime = o.transitionTime || 400;
  28170. if (o.pano && o.pano.view) {
  28171. if (!this.viewLinkManager.views[o.pano.view.sid]) {
  28172. fuc && fuc();
  28173. return;
  28174. } //已经删除
  28175. if (this.enteringView) {
  28176. console.log('重复进入360');
  28177. fuc && fuc();
  28178. return;
  28179. }
  28180. if (o.pano == this.currentPano && !o.flyIn) {
  28181. console.log('已经在此360漫游点');
  28182. fuc && fuc();
  28183. return;
  28184. }
  28185. o.pano.view.entering = true;
  28186. this.enteringView = o.pano.view; //从开始直到doAfterFlying这段时间标记player的状态是正在fade360View
  28187. } //热点直接利用updateVisible
  28188. //this.model.wallManager.updateRulersVisi(false);
  28189. this.domElement.style.opacity = 1; //init value
  28190. transitions$1.start(lerp.property(this.domElement.style, 'opacity', 0), transitionTime, function () {
  28191. !o.flyIn && config$4.mobile && _this11.$app.core.get('PanoRenderer').switchPanoQuality(_this11.currentPano, {
  28192. size: 1024
  28193. }); //降旧的。其实也可以直接exit,但shader里要确保用不到tex
  28194. o.pano && _this11.$app.core.get('PanoRenderer').switchPanoQuality(o.pano, {
  28195. size: 2048
  28196. });
  28197. _this11.model.skybox.material.uniforms.opacity.value = o.skyboxOpacity != void 0 ? o.skyboxOpacity : 1;
  28198. _this11.model.alpha = o.modelAlpha != void 0 ? o.modelAlpha : 0;
  28199. o.pano && (currentCamera.position.copy(o.pano.position), currentCamera.quaternion.copy(o.pano.quaternion));
  28200. var enterView = !!(o.pano && o.pano.view),
  28201. leaveView = !!(_this11.is360View(_this11.mode, _this11.currentPano) && !o.flyIn || o.flyOut); //console.log('fade360View : ', enterView, leaveView)
  28202. if (enterView) {
  28203. //进入360view
  28204. o.pano.view.exitDoor.mesh.visible = true; //console.log("exitDoor.mesh.show "+o.pano.view.sid)
  28205. //this.tagManager.hideShowTagsForBlackoutStyle(BlackoutStyle.END, transitionTime)
  28206. _this11.viewLinkManager.updateCirclesWhenFade('enter', o);
  28207. o.pano.view.balloon.showOrHide(false);
  28208. o.pano.view.entering = false;
  28209. var lookAtPoint = o.aim || new THREE.Vector3(0, 0, -1).applyQuaternion(o.pano.view.enterQuaternion || o.pano.quaternion).add(currentCamera.position);
  28210. _this11.cameraControls.controls.panorama.lookAt(lookAtPoint);
  28211. _this11.cameraControls.controls.panorama.update(0);
  28212. _this11.OverlayManager.setGroupVisible(false);
  28213. _this11.GLTFEditor.group.visible = false; // 隐藏空间模型
  28214. _this11.viewLinkManager.changeTitlesShow(false, 'enterView360');
  28215. _this11.$app.Camera.monitor.changeTitlesShow(false, 'enterView360'); //去除角度限制
  28216. _this11.cameraControls.controls.panorama.insideLookLimitUp = 89.9;
  28217. _this11.cameraControls.controls.panorama.insideLookLimitDown = -89.9;
  28218. _this11.cameraControls.controls.panorama.limitAngleIsBound = false;
  28219. common.updateVisible(_this11.model.floorLogos.firstLogo, 'inView360', false); //隐藏
  28220. common.updateVisible(_this11.model.floorLogos.secondLogo, 'inView360', false); //隐藏
  28221. }
  28222. if (leaveView) {
  28223. //从360view出来
  28224. var view = _this11.currentPano.view;
  28225. view.exitDoor.mesh.visible = false; //console.log("exitDoor.mesh.fade "+this.currentPano.view.sid)
  28226. if (o.flyOut) {
  28227. if (o.toMode == 'dollhouse') {
  28228. //相机方向与着balloon到circle一致
  28229. var dir = new THREE.Vector3().subVectors(view.circle.mesh.position, view.balloon.mesh.position).setY(0).normalize();
  28230. _this11.cameraControls.controls.dollhouse.target.copy(view.circle.mesh.position);
  28231. _this11.cameraControls.cameras.dollhouse.position.copy(view.balloon.mesh.position).add(new THREE.Vector3(0, 4, 0)).add(dir.multiplyScalar(-10));
  28232. _this11.cameraControls.controls.dollhouse.update(0);
  28233. }
  28234. view.balloon.visible = false; //因为在beforeChangeMode里
  28235. setTimeout(function () {
  28236. view.balloon.visible = true;
  28237. }, 500); //延迟出现
  28238. }
  28239. if (!enterView) {
  28240. _this11.viewLinkManager.updateCirclesWhenFade('leave', o);
  28241. _this11.viewLinkManager.changeTitlesShow(true, 'enterView360');
  28242. _this11.$app.Camera.monitor.changeTitlesShow(true, 'enterView360'); //this.tagManager.hideShowTagsForBlackoutStyle(BlackoutStyle.FADEIN, transitionTime) //热点出现
  28243. }
  28244. if (o.aim && !o.flyIn && !o.flyOut) {
  28245. //出来是漫游模式
  28246. _this11.cameraControls.controls.panorama.lookAt(o.aim);
  28247. _this11.cameraControls.controls.panorama.update(0);
  28248. }
  28249. _this11.OverlayManager.setGroupVisible(true);
  28250. _this11.GLTFEditor.group.visible = true; // 显示空间模型
  28251. _this11.cameraControls.controls.panorama.insideLookLimitUp = null;
  28252. _this11.cameraControls.controls.panorama.insideLookLimitDown = null;
  28253. _this11.cameraControls.controls.panorama.limitAngleIsBound = true;
  28254. common.updateVisible(_this11.model.floorLogos.firstLogo, 'inView360', true);
  28255. common.updateVisible(_this11.model.floorLogos.secondLogo, 'inView360', true);
  28256. }
  28257. if (o.pano) {
  28258. _this11.emit(PlayerEvents.PanoChosen, _this11.currentPano, o.pano); //触发 setProjectedPanos
  28259. _this11.model.chunks.concat([_this11.model.skybox]).forEach(function (mesh) {
  28260. mesh.material.uniforms.progress.value = 1;
  28261. }); //地标变化(在这里不需要显示)
  28262. _this11.model.floorLogos.changefloorLogoOpa({
  28263. index: 0,
  28264. opa: 0,
  28265. dur: 0,
  28266. delay: 0
  28267. }); //this.model.floorLogoFade(0, _duration*0.5, 0.7);
  28268. _this11.model.floorLogos.secondLogo.position.copy(o.pano.floorPosition.clone().sub(_this11.model.position));
  28269. enterView || common.updateVisible(_this11.model.floorLogos.secondLogo, 'flyToPano', true);
  28270. enterView || _this11.model.floorLogos.changefloorLogoOpa({
  28271. index: 1,
  28272. opa: 1,
  28273. dur: 250
  28274. });
  28275. }
  28276. transitions$1.start(lerp.property(_this11.domElement.style, 'opacity', 1), transitionTime, function () {
  28277. _this11.enteringView = null;
  28278. fuc && fuc(); //this.model.wallManager.updateRulersVisi();
  28279. _this11.reticule.hide(); //隐藏. 如果是离开 会自动updatePosition()后显示
  28280. if (enterView) {
  28281. _this11.emit('enteredView');
  28282. } else _this11.emit('leavedView');
  28283. }, 0, null
  28284. /* easing[settings.flydown.movementEasing] */
  28285. , null, 'fade360');
  28286. }, 0, null
  28287. /* easing[settings.flydown.movementEasing] */
  28288. , null, 'fade360');
  28289. };
  28290. _this.flyToPanoClosestToMouse = function () {
  28291. if (Date.now() - this.mouseLastMoveTime > 50) {
  28292. /* this.intersect = this.getMouseIntersect()
  28293. this.intersect && this.updateClosestPano(this.intersect) */
  28294. this.updateIntersect(); //这个才准确
  28295. }
  28296. if (this.closestPano) {
  28297. return this.flyToPano({
  28298. pano: this.closestPano,
  28299. checkAlone: true
  28300. });
  28301. }
  28302. var direction = this.getMouseDirection();
  28303. if (!this.flyDirection(direction)) {
  28304. this.flyToPano({
  28305. pano: this.currentPano
  28306. });
  28307. }
  28308. };
  28309. _this.flyLocalDirection = function (playerDirection) {
  28310. if (this.panosTaskList.length > 1 || this.panosTaskList.length == 1 && this.panosTaskList[0].progress < 0.3) {
  28311. //比0.5少一点,因0.5时会判断个数
  28312. //按键行走。在当前任务执行超过一定比率后才允许添加下一个任务
  28313. return;
  28314. }
  28315. var direction = this.getDirection(playerDirection),
  28316. playerDirectionZ = 1 === playerDirection.z ? 0.4 : 0.75,
  28317. playerDirectionX = 1 === Math.abs(playerDirection.x);
  28318. return this.flyDirection(direction, playerDirectionZ, playerDirectionX, true);
  28319. };
  28320. _this.flyDirection = function (direction, playerDirectionZ, playerDirectionX, byKey) {
  28321. if (this.locked) return;
  28322. var deferred = Deferred$1();
  28323. this.history.invalidate();
  28324. var panoSet = this.closestPanoInDirection(direction, playerDirectionZ, playerDirectionX);
  28325. if (panoSet) {
  28326. this.flyToPano({
  28327. pano: panoSet,
  28328. canConstantlyWalk: this.canConstantlyWalk,
  28329. // add
  28330. byKey
  28331. }, deferred.resolve.bind(deferred, !0));
  28332. } else if (this.panosTaskList.length == 0) {
  28333. this.bump(direction);
  28334. deferred.resolve(!1);
  28335. }
  28336. return deferred.promise();
  28337. };
  28338. _this.closestPanoInDirection = function (direction, playerDirectionZ, playerDirectionX) {
  28339. return this.rankedPanoInDirection(0, direction, playerDirectionZ, playerDirectionX);
  28340. };
  28341. _this.rankedPanoInDirection = function () {
  28342. var panoSet = {
  28343. pano: null,
  28344. candidates: []
  28345. };
  28346. return function (t, direction, PlayerDirectionZ, PlayerDirectionX) {
  28347. t || (t = 0);
  28348. PlayerDirectionZ = void 0 !== PlayerDirectionZ ? PlayerDirectionZ : 0.75;
  28349. var o = PlayerDirectionX ? 'angle' : 'direction'; //add 相对于即将达到的目标点 或当前点
  28350. var currentPano = this.panosTaskList.length ? this.panosTaskList[this.panosTaskList.length - 1].pano : this.currentPano;
  28351. var request = [//必要条件
  28352. Panorama.filters.not(currentPano), Panorama.filters.isPanoAligned(), Panorama.filters.isNeighbourPanoTo(currentPano), Panorama.filters.inPanoDirection(currentPano.position, direction, PlayerDirectionZ)];
  28353. var list = [//决胜项目
  28354. Panorama.scoreFunctions.distanceSquared(currentPano), Panorama.scoreFunctions[o](currentPano.position, direction)];
  28355. /* if (editSpot.setSpotPos){
  28356. if(editSpot.editType == "tag" || editSpot.editType == "measure"){
  28357. request.push(function(pano){
  28358. return pano.assistPano != editSpot.spotPosInfo.panoB && pano != editSpot.spotPosInfo.panoB;//不允许走回到和右侧相同的位置
  28359. })
  28360. }else if(editSpot.editType == "designWall"){
  28361. request.push(function(pano){
  28362. return pano != editSpot.spotPosInfo.panoB//不允许走回到和右侧相同的位置
  28363. })
  28364. }
  28365. } */
  28366. //performance.mark('rankedPano-start')
  28367. this.model.panos.findRankedByScore(t, request, list, panoSet);
  28368. /* performance.mark('rankedPano-end')
  28369. let measure = performance.measure('rankedPano','rankedPano-start','rankedPano-end');
  28370. console.log('rankedPano', measure.duration.toFixed(4)) */
  28371. this.cachedPanoCandidates = panoSet.candidates;
  28372. return panoSet.pano;
  28373. };
  28374. }();
  28375. _this.bump = function (direction) {
  28376. var _this12 = this;
  28377. if (this.mode === Viewmode$1.PANORAMA && !this.flying && !this.isWarping()) {
  28378. var t,
  28379. i,
  28380. n,
  28381. r = settings$3.transition,
  28382. o = (r.flytimeMaxDistanceThreshold * r.flytimeDistanceMultiplier + r.flyTime) / 10,
  28383. a = this.camera.getWorldDirection(new THREE.Vector3()).dot(direction),
  28384. s = Math.abs(a) > 0.5;
  28385. if (s) t = function () {
  28386. transitions$1.start(lerp.property(this.cameraControls.cameras[Viewmode$1.PANORAMA], 'zoom', a > 0 ? 1.04 : 0.96), o, i, 0, easing.easeInOutSine, 'bumpZStart');
  28387. }.bind(this), i = function () {
  28388. transitions$1.start(lerp.property(this.cameraControls.cameras[Viewmode$1.PANORAMA], 'zoom', 1), 3 * o, n, 0, easing.easeInOutSine, 'bumpZRelax');
  28389. }.bind(this);else {
  28390. var l = this.camera.position.clone(),
  28391. c = direction.clone();
  28392. this.raycaster.set(l, c);
  28393. var h = this.model.floors.reduce(function (e, t) {
  28394. return e.concat(t.collider.children);
  28395. }, []),
  28396. d = this.raycaster.intersectObjects(h),
  28397. p = d.length > 0 ? d[0].distance / 25 : 0.04,
  28398. g = l.clone().add(c.multiplyScalar(p));
  28399. t = function () {
  28400. transitions$1.start(lerp.vector(this.cameraControls.cameras[Viewmode$1.PANORAMA].position, g), o, i, 0, easing.easeInOutSine, 'bumpTStart');
  28401. }.bind(this), i = function () {
  28402. transitions$1.start(lerp.vector(this.cameraControls.cameras[Viewmode$1.PANORAMA].position, l), 5 * o, n, 0, easing.easeInOutSine, 'bumpTRelax');
  28403. }.bind(this);
  28404. }
  28405. n = function n() {
  28406. if (_this12.mode == 'panorama') {
  28407. //add
  28408. _this12.flying = !1;
  28409. _this12.emit(PlayerEvents.FlyingEnded, {
  28410. /* targetPosition: this.position, currentPosition: this.position, */
  28411. targetPano: _this12.currentPano,
  28412. currentPano: _this12.currentPano
  28413. }); //add
  28414. }
  28415. /* if (this.waitFlytoItemFuc) {
  28416. //手动加的函数
  28417. var cf = this.waitFlytoItemFuc;
  28418. this.waitFlytoItemFuc = null;//因为可能在执行afterCModeFuc时需要再添加afterCModeFuc所以要置空的话提前
  28419. cf();
  28420. }
  28421. //直接使用
  28422. player.once('flying.ended',()=>{ })
  28423. */
  28424. };
  28425. this.flying = !0, t();
  28426. }
  28427. };
  28428. _this.changeFloor = function (e) {
  28429. if (!this.is360View(this.mode, this.currentPano)) {
  28430. if (this.mode === Viewmode$1.PANORAMA) {
  28431. var t = this.history.reversePano(e);
  28432. if (t) {
  28433. this.flyToPano({
  28434. pano: t
  28435. });
  28436. } else {
  28437. var pano = this.getFloorPanoByScore(e);
  28438. if (pano) {
  28439. this.cachedPanoCandidates = e.candidates;
  28440. this.history.push(t, this.currentPano);
  28441. this.flyToPano({
  28442. pano
  28443. });
  28444. }
  28445. } // t && t.isAligned() ? this.flyToPano({
  28446. // pano: t
  28447. // }) : this.changeFloorByScore(e)
  28448. } else {
  28449. this.model.setFloor(this.model.nextFloor(e) || this.model.currentFloor);
  28450. }
  28451. }
  28452. };
  28453. _this.getFloorPanoByScore = function () {
  28454. var e = {
  28455. pano: null,
  28456. candidates: []
  28457. };
  28458. return function (t, floor) {
  28459. var i = floor || this.model.nextFloor(t);
  28460. return i ? (this.model.panos.lowestByScore([Panorama.filters.atFloor(i), Panorama.filters.isPanoAligned(), function (pano) {
  28461. return pano.hasNeighbor();
  28462. }], [Panorama.scoreFunctions.distance(this.currentPano), Panorama.scoreFunctions.direction(this.position, new THREE.Vector3(0, t, 0)), Panorama.scoreFunctions.penalizeHeightDifferenceUnder(this.position, 0.5)], e), e.pano) :
  28463. /* void (e.pano
  28464. ? ((this.cachedPanoCandidates = e.candidates),
  28465. this.history.push(t, this.currentPano),
  28466. this.flyToPano({
  28467. pano: e.pano
  28468. }))
  28469. : logger.warn('No pano found on selected floor, not moving there.')))*/
  28470. void logger$1.debug('player.changeFloor(' + t + '): no such floor');
  28471. };
  28472. }();
  28473. _this.gotoFloor = function (e) {
  28474. var t = e - this.model.currentFloor.floorIndex;
  28475. this.changeFloor(t);
  28476. };
  28477. _this.getDirection = function (e) {
  28478. return e = e ? e : new THREE.Vector3().copy(Vectors$1.FORWARD), e.applyQuaternion(this.camera.quaternion);
  28479. };
  28480. _this.flyToNewMode = function (newModeInfo, deferred) {
  28481. var _this13 = this;
  28482. newModeInfo = newModeInfo || {};
  28483. var mode = newModeInfo.mode,
  28484. pano = newModeInfo.pano,
  28485. duration = newModeInfo.duration;
  28486. newModeInfo.warpDest;
  28487. var callback = newModeInfo.callback;
  28488. newModeInfo.force;
  28489. var quaternion = newModeInfo.quaternion,
  28490. target = newModeInfo.target,
  28491. //add
  28492. position = newModeInfo.position,
  28493. //add
  28494. currentScale = newModeInfo.currentScale,
  28495. //add
  28496. floor = newModeInfo.floor,
  28497. //add
  28498. fitBoundSize = newModeInfo.fitBoundSize;
  28499. deferred = deferred || Deferred$1();
  28500. if (this.isWarping()) {
  28501. logger$1.warn('Player.flyToNewMode() -> Cannot fly when warping');
  28502. callback && callback(!1);
  28503. return deferred.reject('Cannot change mode during tour transition');
  28504. }
  28505. if (this.mode === Viewmode$1.TRANSITIONING) {
  28506. callback && callback(!1);
  28507. return deferred.reject('Cannot change mode during mode transition');
  28508. }
  28509. if (mode === this.mode) {
  28510. //return callback && callback(!1), deferred.reject('Already in ' + mode + ' mode')
  28511. callback && callback(!1);
  28512. deferred.resolve();
  28513. return deferred;
  28514. } // 进入PANORAMA, 要在下载panotiles前先清掉正在加载的3dtiles
  28515. if (mode == Viewmode$1.PANORAMA && this.model._3dTilesRuntime) {
  28516. this.model._3dTilesRuntime.pauseTilesetUpdate(true);
  28517. this.model._3dTilesRuntime.clearLoadingTiles();
  28518. }
  28519. logger$1.debug('Switching mode to ' + mode);
  28520. var successCallbackFunc = function () {
  28521. common.delayOneFrame(function () {
  28522. this.flyToNewMode(newModeInfo, deferred);
  28523. }.bind(this));
  28524. }.bind(this);
  28525. if (pano && this.checkAndWaitForPanoLoad(pano, 'low', 'low', this.basePanoSize, successCallbackFunc)) {
  28526. //'low', 'low'
  28527. return deferred.promise();
  28528. }
  28529. if (!this.model.mesh3dTilesLoaded && !this.model.meshTexturesLoaded && this.isOutsideMode(mode)) {
  28530. logger$1.info('Waiting for model 3dTiles or damTextures to be loaded before going out to dollhouse');
  28531. this.model.waitForLoad(this.model, function () {
  28532. return false;
  28533. }.bind(this));
  28534. successCallbackFunc();
  28535. return deferred.promise();
  28536. }
  28537. this.history.invalidate(); //this.updateLastView();
  28538. var currentMode = this.mode;
  28539. var currentCamera = this.cameraControls.cameras[mode];
  28540. var switchingParams = common.deepExtend({}, settings$3[mode], settings$3[currentMode + '-' + mode]); //许钟文------------
  28541. this.modeTran = this.mode + '-' + mode; //------------------
  28542. var transitionTime = switchingParams.transitionTime;
  28543. if (void 0 !== duration) {
  28544. transitionTime = duration;
  28545. }
  28546. this.emit(PlayerEvents.ModeChanging, currentMode, mode, pano, transitionTime);
  28547. pano && (this.currentPano = pano);
  28548. transitions$1.cancelById(settings$3.freeze.LookTransition);
  28549. transitions$1.cancelById(this.$app.resource.num + settings$3.freeze.FlyToPano);
  28550. if (mode === Viewmode$1.PANORAMA) {
  28551. this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  28552. size: 2048
  28553. });
  28554. this.emit(PlayerEvents.PanoChosen, pano, pano);
  28555. setTimeout(function () {
  28556. pano.floor.enter(mode);
  28557. }.bind(this), transitionTime / 2);
  28558. this.path.fadeOutCpm(settings$3.path.fadeOutTime); //当前站点logo消失
  28559. } else {
  28560. this.path.placeCpm(); //设置当前站点logo位置
  28561. this.path.fadeInCpm(settings$3.path.fadeInTime); //当前站点logo出现
  28562. //console.log('floor',floor)
  28563. if (floor != void 0) {
  28564. if (floor == 'all' && mode != Viewmode$1.FLOORPLAN) this.model.toggleAllFloors(!0); //默认floorplan没有all的可能
  28565. else if (typeof floor == 'number') {
  28566. floor = this.model.floors.list[floor];
  28567. floor.enter(mode);
  28568. }
  28569. } else if (mode === Viewmode$1.FLOORPLAN) {
  28570. this.model.currentFloor.enter(mode);
  28571. } else if (mode == Viewmode$1.DOLLHOUSE) {
  28572. this.model.toggleAllFloors(!0);
  28573. }
  28574. }
  28575. this.switchCameraMode(mode, quaternion, target, position, currentScale, {
  28576. fitBoundSize
  28577. });
  28578. var currentPosition = new THREE.Vector3().copy(this.position);
  28579. var currentPano = this.currentPano,
  28580. playerPosition = this.position.clone();
  28581. this.emit(PlayerEvents.FlyingStarted, {
  28582. mode: newModeInfo.mode,
  28583. duration: newModeInfo.duration,
  28584. target: newModeInfo.target,
  28585. position: newModeInfo.position,
  28586. quaternion: newModeInfo.quaternion ? new THREE.Quaternion().set(newModeInfo.quaternion._x, newModeInfo.quaternion._y, newModeInfo.quaternion._z, newModeInfo.quaternion._w) : null,
  28587. zoom: newModeInfo.zoom,
  28588. panoId: newModeInfo.pano ? newModeInfo.pano.id : null,
  28589. lastPanoId: currentPano && currentPano.id,
  28590. type: 'flyToNewMode'
  28591. });
  28592. this.flying = !0;
  28593. var startChange = function startChange() {
  28594. //360全景:
  28595. if (_this13.isOutsideMode(mode) && _this13.is360View(currentMode, currentPano)) {
  28596. //飞出
  28597. switchingParams.blackoutStyle = BlackoutStyle$1.FADEIN;
  28598. transitionTime = settings$3.show360Views.transitionTime;
  28599. switchingParams.transitionTime = transitionTime;
  28600. switchingParams.skyboxOpacity = 0;
  28601. switchingParams.modelAlpha = 1;
  28602. switchingParams.flyOut = true;
  28603. switchingParams.toMode = mode;
  28604. _this13.fade360View(currentCamera, switchingParams);
  28605. } else if (_this13.isOutsideMode(currentMode) && _this13.is360View(mode, pano)) {
  28606. //飞入
  28607. _this13.mode = mode;
  28608. switchingParams.pano = pano; //this.currentPano
  28609. switchingParams.blackoutStyle = BlackoutStyle$1.END;
  28610. transitionTime = settings$3.show360Views.transitionTime;
  28611. switchingParams.transitionTime = transitionTime;
  28612. switchingParams.flyIn = true;
  28613. _this13.fade360View(currentCamera, switchingParams, _this13.afterchangeMode);
  28614. } else {
  28615. //普通情况:
  28616. transitions$1.start(lerp.property(_this13.model, 'alpha', switchingParams.modelAlpha, null), transitionTime * switchingParams.modelAlphaLength, null, switchingParams.modelAlphaDelay, null, settings$3.freeze.FlyToNewMode);
  28617. transitions$1.start(lerp.vector(_this13.position, currentCamera.position), transitionTime, null, settings$3.flydown.movementDelay, easing[settings$3.flydown.movementEasing], null, settings$3.freeze.FlyToNewMode);
  28618. transitions$1.start(lerp.quaternion(_this13.quaternion, currentCamera.quaternion), transitionTime * switchingParams.rotationDuration, null, switchingParams.rotationDelay, easing[settings$3.flydown.rotationEasing], null, settings$3.freeze.FlyToNewMode);
  28619. transitions$1.start(lerp.matrix4(_this13.camera.projectionMatrix, currentCamera.projectionMatrix), transitionTime * switchingParams.cameraMatrixDuration, null, switchingParams.cameraMatrixDelay, switchingParams.cameraMatrixEase, null, settings$3.freeze.FlyToNewMode);
  28620. transitions$1.start(function () {
  28621. _this13.camera.projectionMatrixInverse.copy(_this13.camera.projectionMatrix).invert();
  28622. }, transitionTime * switchingParams.cameraMatrixDuration, null, switchingParams.cameraMatrixDelay, switchingParams.cameraMatrixEase, null, settings$3.freeze.FlyToNewMode);
  28623. transitions$1.start(lerp.uniform(_this13.model.skybox, 'opacity', switchingParams.skyboxOpacity), transitionTime * switchingParams.skyboxOpacityLength, null, switchingParams.skyboxOpacityDelay, null, settings$3.freeze.FlyToNewMode);
  28624. transitions$1.start(lerp.property(_this13.reticule.material.uniforms.opacity, 'value', 0), transitionTime, null, settings$3.freeze.FlyToNewMode);
  28625. }
  28626. transitions$1.setTimeout(function () {
  28627. this.flying = !1;
  28628. if (currentMode === Viewmode$1.PANORAMA && mode !== Viewmode$1.PANORAMA) {
  28629. this.currentPano.exit();
  28630. } else if (currentMode !== Viewmode$1.PANORAMA && mode === Viewmode$1.PANORAMA) {
  28631. this.currentPano !== currentPano && currentPano.exit();
  28632. this.currentPano.enter();
  28633. }
  28634. currentMode === Viewmode$1.DOLLHOUSE && this.cameraControls.controls[Viewmode$1.DOLLHOUSE].resetRanges();
  28635. this.mode = mode;
  28636. this.afterChangeMode(currentMode, mode); //this.emit(PlayerEvents.FlyingEnded, currentPosition, playerPosition, this.currentPano, currentPano)
  28637. this.emit(PlayerEvents.FlyingEnded, {
  28638. targetPosition: currentPosition,
  28639. currentPosition: playerPosition,
  28640. targetPano: this.currentPano,
  28641. currentPano: currentPano
  28642. });
  28643. callback && callback();
  28644. deferred.resolve();
  28645. }.bind(_this13), transitionTime, settings$3.freeze.FlyToNewMode);
  28646. _this13.mode = Viewmode$1.TRANSITIONING;
  28647. };
  28648. if (this.mode == 'panorama' && !(this.isOutsideMode(mode) && this.is360View(currentMode, currentPano))) {
  28649. this.$app.core.get('SceneRenderer').once(SceneRendererEvents.AfterRender, function () {
  28650. //console.log('等待时间', Date.now() - startTime)
  28651. startChange(); //300block 的需要近1秒才能飞出,最好加个提示 如KJ-t-ThxGwmC91Z0
  28652. });
  28653. } else {
  28654. startChange();
  28655. }
  28656. /* ----若要显示loading条换这块代码 一点点变换modelAlpha
  28657. let startIndex = 0, curCount, maxUpdateBlock = 100, len=this.model.chunks.length
  28658. let startTime = Date.now()
  28659. let update = {
  28660. update:()=>{
  28661. curCount = 0
  28662. for(let i=startIndex; i<len;i++){
  28663. let mat = this.model.chunks[i].materialInside
  28664. let image = mat.uniforms.map.value.image
  28665. let blockCount = image.width * image.height / (512*512);
  28666. if(!('useModelMap' in mat.defines)){
  28667. mat.defines.useModelMap = '';
  28668. mat.needsUpdate = true
  28669. }
  28670. startIndex++;
  28671. console.log(startIndex)
  28672. curCount = curCount + blockCount
  28673. if(curCount > maxUpdateBlock)return
  28674. }
  28675. console.log('cost', Date.now()-startTime)
  28676. this.$app.core.get('SceneRenderer').removeComponent(update)
  28677. startChange()
  28678. }
  28679. }
  28680. this.$app.core.get('SceneRenderer').addComponent(update)
  28681. */
  28682. this.beforeChangeMode(currentMode, mode, pano, transitionTime);
  28683. return deferred.promise();
  28684. };
  28685. _this.setSize = function (width, height) {
  28686. var aspect = width / height;
  28687. this.baseFov = cameraLight.clampVFOV(settings$3.insideFOV, settings$3.insideFOVMax, width, height);
  28688. var fov = cameraLight.getHFOVFromVFOV(settings$3.insideFOV, width, height);
  28689. if (fov > settings$3.insideFOVMax) {
  28690. this.baseFov = cameraLight.getVFOVFromHFOV(settings$3.insideFOVMax, width, height);
  28691. } else {
  28692. this.baseFov = settings$3.insideFOV;
  28693. }
  28694. for (var cameraType in this.cameraControls.cameras) {
  28695. var camera = this.cameraControls.cameras[cameraType];
  28696. camera.fov = camera.staticFov ? camera.staticFov : this.baseFov * (1 / this.zoomLevel); //许钟文 加camera.staticFov
  28697. camera.updateAspect(aspect);
  28698. }
  28699. this.emit('setSize', width, height);
  28700. };
  28701. _this.toJSON = function () {
  28702. var e = {};
  28703. if (this.cameraControls.activeControl) {
  28704. e = this.cameraControls.activeControl.toJSON();
  28705. e.camera_mode = Viewmode$1.toInt(this.mode);
  28706. if (this.isOutsideMode()) {
  28707. if (this.model.allFloorsVisible) {
  28708. e.floor_visibility = [];
  28709. } else {
  28710. e.floor_visibility = this.model.floors.list.map(function (e) {
  28711. return e.hidden ? 0 : 1;
  28712. });
  28713. }
  28714. } else if (Viewmode$1.PANORAMA) {
  28715. e.scan_id = this.currentPano.id;
  28716. } // this.isOutsideMode() ? this.model.allFloorsVisible ? e.floor_visibility = [] : e.floor_visibility = this.model.floors.list.map(function(e) {
  28717. // return e.hidden ? 0 : 1
  28718. // }) : Viewmode.PANORAMA && (e.scan_id = this.currentPano.id);
  28719. return e;
  28720. } else {
  28721. return e;
  28722. } // return this.cameraControls.activeControl ? (e = this.cameraControls.activeControl.toJSON(),
  28723. // e.camera_mode = Viewmode.toInt(this.mode),
  28724. // this.isOutsideMode() ? this.model.allFloorsVisible ? e.floor_visibility = [] : e.floor_visibility = this.model.floors.list.map(function(e) {
  28725. // return e.hidden ? 0 : 1
  28726. // }) : Viewmode.PANORAMA && (e.scan_id = this.currentPano.id),
  28727. // e) : e
  28728. };
  28729. _this.zoomBy = function (e) {
  28730. this.zoomTo(this.zoomLevel * e);
  28731. };
  28732. _this.zoomIn = function () {
  28733. this.zoomBy(1 + this.zoomSpeed);
  28734. };
  28735. _this.zoomOut = function () {
  28736. this.zoomBy(1 - this.zoomSpeed);
  28737. };
  28738. _this.zoomTo = function (zoomLevel, flag) {
  28739. if (flag || settings$3.zoom.enabled && this.mode === Viewmode$1.PANORAMA && this.zoomEnabled) {
  28740. zoomLevel < settings$3.zoom.min && (zoomLevel = settings$3.zoom.min);
  28741. zoomLevel > settings$3.zoom.max && (zoomLevel = settings$3.zoom.max);
  28742. if (zoomLevel > this.zoomLevel) {
  28743. this.emit(ZoomEvents.ZoomIn);
  28744. zoomLevel === settings$3.zoom.max && this.emit(ZoomEvents.ZoomMax);
  28745. } else if (zoomLevel < this.zoomLevel) {
  28746. this.emit(ZoomEvents.ZoomOut);
  28747. zoomLevel === settings$3.zoom.min && this.emit(ZoomEvents.ZoomMin);
  28748. }
  28749. if (this.cameraControls.activeControl) {
  28750. var camera = this.cameraControls.activeControl.camera;
  28751. this.zoomLevel = zoomLevel;
  28752. camera.fov = this.baseFov * (1 / this.zoomLevel);
  28753. camera.updateProjectionMatrix();
  28754. this.zoomFov = camera.fov;
  28755. this.emit('zoomTo', zoomLevel);
  28756. }
  28757. }
  28758. };
  28759. _this.zoomDefault = function () {
  28760. this.zoomTo(1, !0);
  28761. };
  28762. _this.smoothZoomToDefault = function (e, t) {
  28763. var i,
  28764. n = this.zoomLevel,
  28765. r = function (e) {
  28766. e > 1 && (e = 1), i = n * (1 - e) + e, this.zoomTo(i, !0);
  28767. }.bind(this),
  28768. o = function () {
  28769. this.zoomDefault(), t && window.setTimeout(t, 50);
  28770. }.bind(this);
  28771. transitions$1.start(r, e, o, null, 0, easing[settings$3.transition.blendEasing]);
  28772. };
  28773. _this.smoothZoomFovTo = function (fov, dur, callback) {
  28774. //add
  28775. var aimLevel = this.baseFov / fov;
  28776. this.smoothZoomLevelTo(aimLevel, dur, callback);
  28777. };
  28778. _this.smoothZoomLevelTo = function (level, dur, callback) {
  28779. //add
  28780. if (this.zoomLevel == level) return;
  28781. var oldLevel = this.zoomLevel;
  28782. var currentLevel;
  28783. var fun = function (e) {
  28784. e > 1 && (e = 1), currentLevel = oldLevel * (1 - e) + e * level, this.zoomTo(currentLevel, !0);
  28785. }.bind(this);
  28786. transitions$1.start(fun, dur, callback, null, 0, easing[settings$3.transition.blendEasing]);
  28787. };
  28788. _this.updateZoomPano = function () {
  28789. var _this14 = this;
  28790. var qualityManager = this.$app.core.get('QualityManager');
  28791. var panoRenderer = this.$app.core.get('PanoRenderer');
  28792. var currentPano = this.currentPano;
  28793. if (!panoRenderer.zoomPanoRenderingDisabled && this.mode === Viewmode$1.PANORAMA && currentPano.tiled) {
  28794. //xzw add tiled
  28795. if (currentPano) {
  28796. var threshold4k = 1.8;
  28797. var activationThreshold = qualityManager.navTileClass == '2k' && qualityManager.tileClass == '4k' ? threshold4k : settings$3.zoom.activationThreshold; //1.1
  28798. var t = settings$3.highestQualityTile || this.zoomLevel > activationThreshold,
  28799. i = this.flying && this.nextPano && this.nextPano !== this.currentPano,
  28800. n = !i && !this.isWarping(),
  28801. r = t && n;
  28802. this.$app.core.get('TileDownloader').tilePrioritizer.setZoomingActive(r);
  28803. panoRenderer.setZoomingActive(r, currentPano, !0);
  28804. var o = function (pano, zoomedFlag) {
  28805. panoRenderer.resetRenderStatus(pano.id, !1, !0, qualityManager.getMaxNavPanoSize());
  28806. panoRenderer.clearAllQueuedUploadsForPano(pano.id);
  28807. panoRenderer.renderPanoTiles(pano.id, null, !1, !1);
  28808. pano.setZoomed(zoomedFlag);
  28809. }.bind(this);
  28810. if (r && (!currentPano.zoomed || qualityManager.zoomLevelResolution && qualityManager.zoomLevelResolution != '4k')) {
  28811. currentPano.zoomed || o(currentPano, !0);
  28812. if (qualityManager.navTileClass == '1k' && qualityManager.tileClass != '1k' && this.zoomLevel < 2) {
  28813. panoRenderer.enableHighQuality(function () {
  28814. //开启2k
  28815. if (qualityManager.tileClass != '4k') o(currentPano, !0);
  28816. }.bind(this));
  28817. } else {
  28818. panoRenderer.enableUltraHighQualityMode(function () {
  28819. //开启4k getMaxZoomPanoSize
  28820. qualityManager.useUltraHighResolutionPanos && !settings$3.zoom.overridemax && (settings$3.zoom.max = settings$3.ultraHighQualityMaxZoom);
  28821. o(currentPano, !0);
  28822. }.bind(this));
  28823. }
  28824. } else {
  28825. !t && currentPano.zoomed && o(currentPano, !1);
  28826. }
  28827. if (r && qualityManager.navTileClass == '1k' && qualityManager.tileClass == '4k') {
  28828. //目前只有手机端navTileClass == '1k'
  28829. var change = function change(zoomedFlag) {
  28830. qualityManager.updateMaximums(); //更新maxZoomPanoSize
  28831. panoRenderer.setupZoomRenderTarget(); //更新renderTarget
  28832. //currentPano.setZoomed(t);//更新uniforms贴图
  28833. if (qualityManager.zoomLevelResolution == '4k') {
  28834. _this14.model.showHighMap();
  28835. } else {
  28836. _this14.model.hideHighMap();
  28837. }
  28838. };
  28839. qualityManager.zoomLevelResolution = this.zoomLevel >= threshold4k ? '4k' : this.zoomLevel > settings$3.zoom.activationThreshold ? '2k' : '1k';
  28840. if (this.oldZoomLevel < threshold4k && this.zoomLevel >= threshold4k) {
  28841. //1k/2k-4k
  28842. change();
  28843. o(currentPano, t);
  28844. } else if (this.oldZoomLevel <= settings$3.zoom.activationThreshold && this.zoomLevel > settings$3.zoom.activationThreshold) {
  28845. //1k-2k
  28846. change();
  28847. } else if (this.oldZoomLevel > threshold4k && this.zoomLevel <= threshold4k) {
  28848. //4k-2k/1k
  28849. change();
  28850. o(currentPano, t);
  28851. } else if (this.oldZoomLevel > settings$3.zoom.activationThreshold && this.zoomLevel <= settings$3.zoom.activationThreshold) {
  28852. //2k-1k
  28853. change();
  28854. }
  28855. this.oldZoomLevel = this.zoomLevel;
  28856. }
  28857. /* if (r && !currentPano.zoomed) {
  28858. o(currentPano, !0);
  28859. panoRenderer.enableUltraHighQualityMode(function() {//开启4k getMaxZoomPanoSize
  28860. qualityManager.useUltraHighResolutionPanos && !settings.zoom.overridemax && (settings.zoom.max = settings.ultraHighQualityMaxZoom);
  28861. o(currentPano, !0)
  28862. }.bind(this));
  28863. } else {
  28864. !t && currentPano.zoomed && o(currentPano, !1);
  28865. } */
  28866. }
  28867. }
  28868. };
  28869. _this.hasChanged = function (e) {
  28870. if (!this.previousState) {
  28871. this.previousState = {
  28872. allFloorsVisible: this.model.allFloorsVisible,
  28873. position: this.position.clone(),
  28874. quaternion: this.quaternion.clone(),
  28875. mouse: this.mouse.clone(),
  28876. //labelScaleFactor: this.getLabelScaleFactor(),
  28877. currentFloor: this.model.currentFloor,
  28878. projectionMatrix: this.camera.projectionMatrix.clone(),
  28879. worldMatrix: this.camera.matrixWorld.clone(),
  28880. mode: this.mode,
  28881. modelPosition: this.model.position.clone(),
  28882. modelCenter: this.model.center.clone(),
  28883. zoomLevel: this.zoomLevel
  28884. };
  28885. e.cameraChanged = true, (e.cameraChanged2 = true, e.cameraChanged3 = true);
  28886. return !0;
  28887. } //许钟文改 分成相机是否改变cameraChanged 和其他
  28888. var a = this.position.equals(this.previousState.position) && this.quaternion.equals(this.previousState.quaternion) && this.camera.matrixWorld.equals(this.previousState.worldMatrix) && this.camera.projectionMatrix.equals(this.previousState.projectionMatrix) && this.mode === this.previousState.mode && this.zoomLevel === this.previousState.zoomLevel && this.model.center.equals(this.previousState.modelCenter) && this.model.position.equals(this.previousState.modelPosition);
  28889. var t = a && this.mouse.equals(this.previousState.mouse) && this.model.allFloorsVisible === this.previousState.allFloorsVisible
  28890. /* && this.getLabelScaleFactor() === this.previousState.labelScaleFactor */
  28891. && this.model.currentFloor === this.previousState.currentFloor && null === this.nextPano;
  28892. e.cameraChanged = !a || e.cameraProjectionChanged;
  28893. e.allFlVisiChanged = this.model.allFloorsVisible !== this.previousState.allFloorsVisible, e.moved = !this.position.equals(this.previousState.position), e.rotated = !this.quaternion.equals(this.previousState.quaternion), e.mouseMoved = !this.mouse.equals(this.previousState.mouse), e.floorChanged = this.model.currentFloor !== this.previousState.currentFloor, e.cameraProjectionChanged = !this.camera.projectionMatrix.equals(this.previousState.projectionMatrix), e.cameraWorldMatrixChanged = !this.camera.matrixWorld.equals(this.previousState.worldMatrix), e.modeChanged = this.mode !== this.previousState.mode, e.modelPositionChanged = !this.model.position.equals(this.previousState.modelPosition), e.modelCenterChanged = !this.model.center.equals(this.previousState.modelCenter), e.nextPanoActive = null !== this.nextPano, e.zoomLevel = this.zoomLevel !== this.previousState.zoomLevel;
  28894. if (!t) {
  28895. //主要判断相机是否旋转
  28896. e.cameraChanged2 = e.cameraProjectionChanged || !MathLight.closeTo(this.quaternion, this.previousState.quaternion, 5) || !MathLight.closeTo(this.position, this.previousState.position, 4);
  28897. e.cameraChanged3 = e.cameraProjectionChanged || !MathLight.closeTo(this.quaternion, this.previousState.quaternion, 3) || !MathLight.closeTo(this.position, this.previousState.position, 3);
  28898. } else {
  28899. e.cameraChanged2 = false;
  28900. e.cameraChanged3 = false;
  28901. }
  28902. this.previousState.allFloorsVisible = this.model.allFloorsVisible, this.previousState.position.copy(this.position), this.previousState.quaternion.copy(this.quaternion), this.previousState.mouse.copy(this.mouse), this.previousState.currentFloor = this.model.currentFloor, this.previousState.projectionMatrix.copy(this.camera.projectionMatrix), this.previousState.worldMatrix.copy(this.camera.matrixWorld), this.previousState.mode = this.mode, this.previousState.modelPosition.copy(this.model.position), this.previousState.modelCenter.copy(this.model.center), this.previousState.zoomLevel = this.zoomLevel; //console.log('cameraChanged3 ' + e.cameraChanged3 + ', mouseMoved ' + e.mouseMoved)
  28903. return !t;
  28904. };
  28905. _this.getToMode = function () {
  28906. return this.modeTran.split('-')[1];
  28907. };
  28908. _this.flyToMode = function (mode, f1, duration) {
  28909. var _this15 = this;
  28910. if (this.mode == mode) {
  28911. f1 && f1();
  28912. } else {
  28913. if (this.mode == 'transitioning') {
  28914. //先飞完然后再执行一遍
  28915. this.once(PlayerEvents.FlyingEnded, function () {
  28916. _this15.flyToMode(mode, f1, duration);
  28917. });
  28918. } else {
  28919. f1 && this.once(PlayerEvents.FlyingEnded, function () {
  28920. f1();
  28921. });
  28922. try {
  28923. //在场景刚开始加载 control还没建好时这句可能会报错所以用try。 不用callback而用 afterCModeFuc也是这个原因,因为会有别的函数可以飞入然后执行它
  28924. this.flyToNewMode({
  28925. mode: mode,
  28926. pano: mode == 'panorama' && this.currentPano,
  28927. duration: duration
  28928. });
  28929. } catch (e) {
  28930. console.log('flyToMode遇到问题?', e);
  28931. }
  28932. }
  28933. }
  28934. };
  28935. _this.vrModeChange = function () {
  28936. if (settings$3.vrEnabled) {
  28937. //关闭
  28938. settings$3.vrEnabled = false;
  28939. /* if (!window.VRScreenNotFull) {
  28940. browser.exitFullscreen()
  28941. } */
  28942. } else {
  28943. //开启:
  28944. settings$3.vrEnabled = true;
  28945. /* if (!window.VRScreenNotFull) {
  28946. browser.requestFullscreen(document.body)
  28947. } */
  28948. }
  28949. };
  28950. _this.focusPoint = function () {
  28951. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  28952. console.log('focusPoint');
  28953. if (this.mode == 'floorplan') {
  28954. var modelSize = o.modelSize || new THREE.Vector3(5, 5, 5); //可视范围
  28955. var control = this.cameraControls.controls.floorplan;
  28956. var absoluteScale = control.getDefaultAbsoluteScale(modelSize);
  28957. var currentScale = control.absoluteScale;
  28958. var currentTarget = control.target.clone();
  28959. var lowest = this.model.boundingBox.max.y + constants$4.orthoNear + constants$4.planeHeightShift + 1;
  28960. var aim = o.aim.clone().setY(lowest);
  28961. transitions$1.cancelById(settings$3.freeze.outsideFocus, true);
  28962. transitions$1.start(function (progress) {
  28963. control.absoluteScale = absoluteScale * progress + currentScale * (1 - progress);
  28964. control.target = aim.clone().multiplyScalar(progress).add(currentTarget.clone().multiplyScalar(1 - progress));
  28965. control.camera.position.copy(control.target.clone().add(control.offset)); //维持角度
  28966. }.bind(this), o.dur || 600, null
  28967. /* cancelFuc */
  28968. , 0, easing[settings$3.transition.blendEasing], 'outsideFocus', settings$3.freeze.outsideFocus, null
  28969. /* cancelFuc */
  28970. );
  28971. } else if (this.mode == 'dollhouse') {
  28972. var control = this.cameraControls.controls.dollhouse;
  28973. var radius = o.radius || 10;
  28974. var currentTarget = control.target.clone();
  28975. var dir = control.offset.clone().normalize();
  28976. var currentRadius = control.offset.length();
  28977. transitions$1.cancelById(settings$3.freeze.outsideFocus, true);
  28978. transitions$1.start(function (progress) {
  28979. control.target = o.aim.clone().multiplyScalar(progress).add(currentTarget.clone().multiplyScalar(1 - progress));
  28980. var radius_ = radius * progress + currentRadius * (1 - progress);
  28981. control.camera.position.copy(control.target.clone().add(dir.clone().multiplyScalar(radius_)));
  28982. }.bind(this), o.dur || 600, null
  28983. /* cancelFuc */
  28984. , 0, easing[settings$3.transition.blendEasing], 'outsideFocus', settings$3.freeze.outsideFocus, null
  28985. /* cancelFuc */
  28986. );
  28987. }
  28988. };
  28989. _this.getSnapAngleInfo = function () {
  28990. //得到截图的位置和视角
  28991. var info = {
  28992. metadata: {}
  28993. };
  28994. var q = this.camera.quaternion.clone();
  28995. switch (this.mode) {
  28996. case 'panorama':
  28997. info.metadata.scan_id = this.currentPano.id;
  28998. break;
  28999. case 'floorplan':
  29000. var _this$getSize = this.getSize(),
  29001. clientWidth = _this$getSize.clientWidth,
  29002. clientHeight = _this$getSize.clientHeight;
  29003. q = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(90));
  29004. q.multiply(this.camera.quaternion);
  29005. info.metadata.camera_mode = 1;
  29006. info.metadata.ortho_zoom = math$1.toPrecision(this.cameraControls.activeControl.currentScale / (clientWidth / clientHeight), 4);
  29007. break;
  29008. case 'dollhouse':
  29009. info.metadata.camera_mode = 2;
  29010. break;
  29011. }
  29012. info.metadata.camera_position = this.camera.position.clone();
  29013. info.metadata.camera_quaternion = q;
  29014. info.metadata.lon = this.cameraControls.activeControl.lon; //兼容旧版
  29015. info.metadata.lat = this.cameraControls.activeControl.lat;
  29016. info.sid = '4dkk' + new Date().getTime();
  29017. info.name = '';
  29018. info.mode = this.mode; //暂时需要用到
  29019. return info;
  29020. };
  29021. _this.model = new Model(_this.$app);
  29022. _this.currentPano = null;
  29023. _this.nextPano = null;
  29024. _this.camera = null;
  29025. _this.paused = !1;
  29026. _this.flying = !1;
  29027. _this.sceneIntersectionPlane = null;
  29028. _this.target = new THREE.Vector3();
  29029. _this.mouse = new THREE.Vector3(1.1, 1.1, 0.5);
  29030. _this.mouseAtMouseDown = new THREE.Vector2();
  29031. _this.mouseCouldBeClickToMove = !1;
  29032. _this.mouseLastMoveTime = Date.now();
  29033. _this.mouseDown = !1;
  29034. _this.mouseDownTimer = null;
  29035. _this.couldBeLongTap = !1;
  29036. _this.containsMouse = !1; //!0 //xzw改为false,否则触屏一直是true
  29037. _this.isTouchEvent = !1;
  29038. _this.isPanoHover = !1;
  29039. _this.reticule = new Reticule(_assertThisInitialized(_this));
  29040. _this.panoMarkers = []; //this.spider = new NSpider(this);
  29041. _this.quaternion = new THREE.Quaternion();
  29042. _this.position = new THREE.Vector3(15, 10, 15);
  29043. _this.previousState = null;
  29044. _this.lastInsideView = new View();
  29045. _this.last360View = new View();
  29046. _this.raycaster = new THREE.Raycaster();
  29047. _this.raycaster.params.Line.threshold = 0.01;
  29048. _this.raycaster.layers.enable(RenderLayers.PANOMARKERS);
  29049. _this.intersect = null;
  29050. _this.lastChangeTime = Date.now();
  29051. _this.history = new History();
  29052. _this.cameraControls = null; //this.path = null,
  29053. _this.domElement = null;
  29054. _this.cachedPanoCandidates = null;
  29055. _this.basePanoSize = 0;
  29056. _this.standardPanoSize = 0;
  29057. _this.highPanoSize = 0;
  29058. _this.ultraHighPanoSize = 0;
  29059. _this.zoomLevel = 1;
  29060. _this.zooming = 0;
  29061. _this.zoomSpeed = 0.5;
  29062. _this.scrollZoomSpeed = 0.06;
  29063. _this.zoomSpeedAdjust = 0.05;
  29064. _this.defaultZoomIncrement = 0.2;
  29065. _this.baseFov = settings$3.insideFOV;
  29066. _this.zoomFov = _this.baseFov;
  29067. _this.zoomEnabled = !0;
  29068. _this.measureRulers = []; //测距
  29069. _this.cornerRulers = []; //标尺
  29070. _this.planLabels = []; //floorplan时的label
  29071. _this.dollLabels = []; //dollhouse时的label
  29072. _this.doorLabels = [];
  29073. _this.defaultRoomLabels = []; //非编辑墙时的
  29074. _this.polygonmarkLabels = []; //多边形标记模块label
  29075. _this.modeTran = '';
  29076. _this.preRenderingEnabled = !1;
  29077. _this.setupCustomProperties(Viewmode$1.PANORAMA);
  29078. _this.zoomStats = new ZoomStats();
  29079. _this.lastFrameChanged = true;
  29080. /* this.afterCModeFuc = {
  29081. //Flytonewmode后需要执行的
  29082. unique: null, //唯一的,新的会替代旧的,适用于只允许选择其中一项执行的函数
  29083. multi: [], //可多个, 到时候都执行
  29084. } */
  29085. _this.cameraControls = _this.$app.core.get('CameraControls');
  29086. _this.modelManager = _this.$app.core.get('ModelManager'); //this.imagePanos = this.listImagePanos()
  29087. //是否开启(键盘上1,2,3分别对应飞入,飞出dollhouse,飞出floorplan)
  29088. _this.started = false; //xst
  29089. _this._locked = false;
  29090. _this._flying = false;
  29091. _this.clearPanosTaskList(); //持续行走的任务
  29092. _this.setPanoTaskEnable(true);
  29093. _this.viewLinkManager = new ViewLinkManager(_this.$app, _assertThisInitialized(_this));
  29094. _this.paintEditor = new Paint$1(_this.$app, _assertThisInitialized(_this));
  29095. _this.modelSideManager = new ModelSideManager(_assertThisInitialized(_this)); //this.createIntersectLabel()
  29096. return _this;
  29097. }
  29098. _createClass(Player, [{
  29099. key: "init",
  29100. value: function init() {
  29101. this.domElement = this.$app.dom.querySelector('.player');
  29102. this.camera = this.$app.core.get('SceneRenderer').camera;
  29103. this.path = new ShowPath(this.director, this, this.cameraControls);
  29104. this.basePanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.BASE);
  29105. this.standardPanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.STANDARD);
  29106. this.highPanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.HIGH);
  29107. this.ultraHighPanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.ULTRAHIGH);
  29108. this.$app.core.get('TileDownloader').processPriorityQueue = !1;
  29109. this.$app.core.get('TileDownloader').tilePrioritizer = new TilePrioritizer(this.$app.core.get('QualityManager'), this.basePanoSize, this.standardPanoSize, this.highPanoSize, this.ultraHighPanoSize);
  29110. this.bindEvents(this.domElement);
  29111. this.updateModel();
  29112. CursorDeal.init(this);
  29113. LineMaterial.init(this.$app);
  29114. this.model.createTranControl(this);
  29115. }
  29116. }, {
  29117. key: "locked",
  29118. get: function get() {
  29119. return this._locked;
  29120. },
  29121. set: function set(value) {
  29122. // customer时marker隐藏
  29123. // let role = location.search
  29124. // .replace('?', '')
  29125. // .split('&')
  29126. // .find(arg => arg.split('=')[0] == 'role')
  29127. // role = role && role.split('=')[1]
  29128. // this.model.panos.forEach(item => {
  29129. // item.marker && (item.marker.visible = role == 'customer' ? false : !value)
  29130. // })
  29131. this._locked = value;
  29132. if (this._locked) {
  29133. this.model.fadePanoMarkers(0, 0, {
  29134. vrCustomer: true,
  29135. hideVideoFlag: true
  29136. });
  29137. } else if (!this.$app.VRScreenSYNC) {
  29138. this.model.fadePanoMarkers(1, 0, {
  29139. vrCustomer: true,
  29140. hideVideoFlag: false
  29141. });
  29142. }
  29143. if (value) {
  29144. this.clearPanosTaskList(); //清空
  29145. }
  29146. }
  29147. }, {
  29148. key: "flying",
  29149. get: function get() {
  29150. return this._flying;
  29151. },
  29152. set: function set(v) {
  29153. this._flying = v; //console.log('flying',v)
  29154. }
  29155. }, {
  29156. key: "setPanoTaskEnable",
  29157. value: //canConstantlyWalk 当加入一个可以持续性行走的任务时,当前未走完的任务变为匀速,任务中最后一个还是easeOut。时间重新计算。
  29158. //若当前任务是带转向的,不允许加入可以持续性行走的任务。否则转向要更改时间麻烦。
  29159. function setPanoTaskEnable(state) {
  29160. this.canConstantlyWalk = state;
  29161. state || this.clearPanosTaskList();
  29162. }
  29163. /*
  29164. let player = __sdk.core.get('Player')
  29165. player.addTourPanoTask({
  29166. panoList:[
  29167. {pano:player.model.panos.index[168], }, //quaternion:new THREE.Quaternion(), lookAtPoint:new THREE.Vector3()
  29168. ],
  29169. flySpeed: 0.003,
  29170. })
  29171. */
  29172. //导览连续匀速漫游
  29173. }, {
  29174. key: "setTourPanoTask",
  29175. value: function setTourPanoTask(_ref2, fastFirstPano) {
  29176. var _ref2$panoList = _ref2.panoList,
  29177. panoList = _ref2$panoList === void 0 ? [] : _ref2$panoList,
  29178. flySpeed = _ref2.flySpeed,
  29179. callback = _ref2.callback;
  29180. if (panoList.length == 0) return;
  29181. this.panosTaskList.length = 0;
  29182. this.addTourPanoTask({
  29183. panoList,
  29184. flySpeed,
  29185. callback
  29186. }, fastFirstPano); //console.log('setTourPanoTask')
  29187. } //导览连续匀速漫游
  29188. }, {
  29189. key: "addTourPanoTask",
  29190. value: function addTourPanoTask(_ref3, fastFirstPano) {
  29191. var _this16 = this;
  29192. var _ref3$panoList = _ref3.panoList,
  29193. panoList = _ref3$panoList === void 0 ? [] : _ref3$panoList,
  29194. _ref3$flySpeed = _ref3.flySpeed,
  29195. flySpeed = _ref3$flySpeed === void 0 ? settings$3.transition.flySpeed : _ref3$flySpeed,
  29196. callback = _ref3.callback;
  29197. //panoList存储的是下一个终点
  29198. this.dontInterruptPanoTask = true; //期间不允许打扰(飞向其他点),如果要立即停止再说
  29199. var panosTaskList = panoList.map(function (e, i) {
  29200. var toPano = Object.assign({
  29201. flySpeed,
  29202. easeType: 'constant',
  29203. gotQua: true
  29204. }, e, {
  29205. sid: Math.random(),
  29206. dealingTask: true,
  29207. callback: i == panoList.length - 1 ? function (flydone) {
  29208. //到最后一个点时要执行:
  29209. flydone = flydone || e.pano == _this16.currentPano;
  29210. if (flydone) {
  29211. _this16.dontInterruptPanoTask = false;
  29212. e.callback && e.callback();
  29213. callback && callback(); //console.log('playForFlyToPano最后的点:' + e.pano.id)
  29214. }
  29215. } : e.callback
  29216. });
  29217. var _this16$getAimToNextP = _this16.getAimToNextPano(e.pano, e.lookAtPoint, e.quaternion),
  29218. aimQua = _this16$getAimToNextP.aimQua;
  29219. _this16$getAimToNextP.hasVideo; //提前获取以计算时间
  29220. toPano.quaternion = aimQua;
  29221. return toPano;
  29222. }); //const len = this.panosTaskList.length
  29223. //还是需要执行回调的,所以得注释
  29224. //len > 0 && delete this.panosTaskList[len - 1].callback
  29225. console.log('addTourPanoTask', panosTaskList.map(function (e) {
  29226. return [e.pano.id
  29227. /* , e.flySpeed */
  29228. ];
  29229. }) + '');
  29230. if (fastFirstPano) {
  29231. //非匀速到第一个点
  29232. panosTaskList[0].easeType = null;
  29233. }
  29234. this.panosTaskList = this.panosTaskList.concat(panosTaskList);
  29235. this.flying || this.flyToPano(this.panosTaskList[0]);
  29236. }
  29237. }, {
  29238. key: "stopTourPanoTask",
  29239. value: function stopTourPanoTask() {
  29240. var stopTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 400;
  29241. if (this.panosTaskList.length) {
  29242. var currentTask = this.panosTaskList[0];
  29243. if (currentTask.flyCount) {
  29244. //正在执行
  29245. //迅速停止:
  29246. var restDis = this.position.distanceTo(currentTask.pano.position);
  29247. if (restDis > 0) {
  29248. currentTask.flySpeed = Math.max(restDis / stopTime, currentTask.flySpeed || 0);
  29249. currentTask.aimQua = null; //停止旋转
  29250. currentTask.forceStop = true;
  29251. if (currentTask.easeFun != easing.linearTween) {
  29252. currentTask.easeFun = easing.linearTween;
  29253. var currentSpeed = Math.max(currentTask.currentSpeed || 0, 0.002); //避免起步过慢
  29254. currentTask.duration = restDis / currentSpeed; //初始速度和原先一致, 为了衔接。
  29255. this.startTransition(currentTask);
  29256. }
  29257. }
  29258. }
  29259. }
  29260. this.clearPanosTaskList();
  29261. this.dontInterruptPanoTask = false;
  29262. }
  29263. }, {
  29264. key: "clearPanosTaskList",
  29265. value: function clearPanosTaskList() {
  29266. this.panosTaskList = [];
  29267. }
  29268. }, {
  29269. key: "computeDuration",
  29270. value: function computeDuration(toPano) {
  29271. var dis = this.currentPano.position.distanceTo(toPano.pano.position);
  29272. var dur;
  29273. if (toPano.flySpeed && toPano.easeType == 'constant') {
  29274. //导览不根据距离来调速度,但需要防止转弯速度过快
  29275. dur = dis / toPano.flySpeed;
  29276. } else {
  29277. var maxDistance = toPano.maxDistanceOverride || settings$3.transition.flytimeMaxDistanceThreshold;
  29278. dis = Math.min(dis, maxDistance);
  29279. dur = dis * settings$3.transition.flytimeDistanceMultiplier + settings$3.transition.flyTime;
  29280. }
  29281. if (toPano.quaternion) {
  29282. var rotSpeed = toPano.maxRotSpeed || settings$3.transition.maxRotSpeed;
  29283. if (toPano.flySpeed && toPano.easeType == 'constant') {
  29284. rotSpeed *= toPano.flySpeed / 0.002; //根据导览速度调整
  29285. }
  29286. var quaOri = this.cameraControls.activeControl.camera.quaternion.clone();
  29287. var vec1 = Vectors$1.FORWARD.clone().applyQuaternion(quaOri);
  29288. var vec2 = Vectors$1.FORWARD.clone().applyQuaternion(toPano.quaternion);
  29289. var angle = vec1.angleTo(vec2); //不能直接用quaterniion求angleTo,因为要排除绕着Vectors.FORWARD轴转的角度。
  29290. var time = Math.pow(angle, 0.3) / rotSpeed * 1e3; // for videoPano、导览、热点等
  29291. //console.log('最小旋转时间', time)
  29292. dur = Math.max(time, dur);
  29293. if (toPano.flySpeed && toPano.easeType == 'constant') {
  29294. toPano.flySpeed = dis / dur; //修改速度,以免过后一直变速
  29295. }
  29296. }
  29297. return dur;
  29298. }
  29299. /*
  29300. 飞向下一个pano
  29301. */
  29302. }, {
  29303. key: "getSize",
  29304. value: function getSize() {
  29305. var _this$$app$dom$queryS = this.$app.dom.querySelector('.player[name="main"]'),
  29306. clientWidth = _this$$app$dom$queryS.clientWidth,
  29307. clientHeight = _this$$app$dom$queryS.clientHeight;
  29308. return {
  29309. clientWidth,
  29310. clientHeight
  29311. };
  29312. }
  29313. }, {
  29314. key: "beforeChangeMode",
  29315. value: function beforeChangeMode(fromMode, toMode, toPano, dur) {
  29316. var _this17 = this;
  29317. if (fromMode == Viewmode$1.PANORAMA) {
  29318. this.labelManager && this.labelManager.updateEntryVisi(true, this.model.currentFloor.floorIndex);
  29319. this.chosenMeasureRuler && this.chosenMeasureRuler.showOptionLabel(false);
  29320. common.updateVisible(this.model.floorLogos.firstLogo, 'outside', false);
  29321. common.updateVisible(this.model.floorLogos.secondLogo, 'outside', false);
  29322. this.model.skybox.material.depthTest = false; //防止飞出后遮住别的mesh xzw add
  29323. this.model.skybox.material.transparent = true;
  29324. this.$app.core.get('PanoRenderer').disposeIdelTargets(); //提前把不需要的dispose防止崩溃
  29325. setTimeout(function () {
  29326. if (_this17.panosTaskList.length) {
  29327. //如果还在flyToPano
  29328. //还没到终点就飞出时的toPano、以及无缝过渡途中加载的下一个点 都要dispose
  29329. var transitionsId = _this17.$app.resource.num + settings$3.freeze.FlyToPano;
  29330. transitions$1.cancelById(transitionsId, true);
  29331. _this17.panosTaskList.forEach(function (e) {
  29332. e.pano.exit();
  29333. });
  29334. }
  29335. }, 1);
  29336. } else if (fromMode == Viewmode$1.FLOORPLAN) {
  29337. EntryArrow.switchDepthTest(true);
  29338. } else if (fromMode == Viewmode$1.DOLLHOUSE) ;
  29339. if (toMode == Viewmode$1.PANORAMA) {
  29340. this.model.floorLogos.firstLogo.position.copy(toPano.floorPosition.clone().sub(this.model.position)); //改
  29341. this.model.floorLogos.secondLogo.position.copy(this.model.floorLogos.firstLogo.position); //for floorIcon position
  29342. //this.model.floorLogos.adjustfloorLogoHeight();
  29343. this.compass && this.compass.autoJudgeDisplay();
  29344. this.labelManager && this.labelManager.updateEntryVisi(false, this.model.currentFloor.floorIndex);
  29345. } else if (toMode == Viewmode$1.FLOORPLAN) {
  29346. setTimeout(EntryArrow.switchDepthTest.bind(this, false), dur * 0.5);
  29347. this.labelManager && this.labelManager.setPlanLabelVisi(true, this.model.currentFloor.floorIndex);
  29348. } else if (toMode == Viewmode$1.DOLLHOUSE) ;
  29349. this.$app.Camera.emit('mode.beforeChange', {
  29350. fromMode,
  29351. toMode,
  29352. floorIndex: this.model.currentFloor.floorIndex,
  29353. allVisible: this.model.allFloorsVisible
  29354. });
  29355. }
  29356. }, {
  29357. key: "afterChangeMode",
  29358. value: function afterChangeMode(fromMode, toMode, toPano, dur) {
  29359. if (fromMode == Viewmode$1.PANORAMA) {
  29360. this.compass && this.compass.autoJudgeDisplay();
  29361. this.$app.core.get('PanoRenderer').disposeIdelTargets();
  29362. } else if (fromMode == Viewmode$1.FLOORPLAN) {
  29363. this.labelManager && this.labelManager.setPlanLabelVisi(false, this.model.currentFloor.floorIndex);
  29364. } else if (fromMode == Viewmode$1.DOLLHOUSE) ;
  29365. if (toMode == Viewmode$1.PANORAMA) {
  29366. common.updateVisible(this.model.floorLogos.firstLogo, 'outside', true);
  29367. common.updateVisible(this.model.floorLogos.secondLogo, 'outside', true);
  29368. this.model.floorLogos.changefloorLogoOpa({
  29369. index: 0,
  29370. from: 0,
  29371. opa: 1,
  29372. dur: 150
  29373. }); //this.model.floorLogoShow(0,150);
  29374. this.doorLabels.forEach(function (label) {
  29375. return label.updateVisible();
  29376. });
  29377. this.model.skybox.material.depthTest = true; //防止飞出后遮住别的mesh的恢复 xzw add
  29378. this.model.skybox.material.transparent = false; //透明时vr模式某些角度圆圈看不见;
  29379. this.model.showLowestTile(true);
  29380. /* this.model.chunks.forEach(chunk=>{//4.6.0 xzw
  29381. common.updateVisible(chunk,'atPano',false) //在漫游点处隐藏chunk///无法隐藏模型,因为需要遮挡其他物体。虽然考虑过使用copyCubeMap渲染深度图,但没准这样也耗gpu。15个chunk的损耗1-2毫秒,当降4倍性能之后。
  29382. }) */
  29383. } else if (toMode == Viewmode$1.FLOORPLAN) {
  29384. this.model.showLowestTile(false);
  29385. } else if (toMode == Viewmode$1.DOLLHOUSE) {
  29386. this.model.floors.forEach(function (floor) {
  29387. floor.entryArrow.forEach(function (arrow) {
  29388. return arrow.dollLabel.update();
  29389. }); //提前更新下,elem.getBoundingClientRect才有效
  29390. });
  29391. this.model.showLowestTile(false);
  29392. }
  29393. this.$app.Camera.emit('mode.afterChange', {
  29394. fromMode,
  29395. toMode,
  29396. floorIndex: this.model.currentFloor.floorIndex,
  29397. allVisible: this.model.allFloorsVisible
  29398. });
  29399. this.clearPanosTaskList(); //清空
  29400. }
  29401. /**
  29402. * 获取截图位置和视角
  29403. * @returns
  29404. */
  29405. }, {
  29406. key: "setAnimateMakerPano",
  29407. value: //xst,获得需要带动画marker的pano
  29408. function setAnimateMakerPano() {
  29409. var _this18 = this;
  29410. if (!this.currentPano) {
  29411. return;
  29412. }
  29413. var pano;
  29414. if (this.mode === Viewmode$1.PANORAMA && !this.flying && !this.enteringView && this.currentPano.isAligned()) {
  29415. var filterFuncs = [Panorama.filters.isPanoAligned()];
  29416. var direction = this.getDirection();
  29417. filterFuncs.push(Panorama.filters.not(this.currentPano));
  29418. filterFuncs.push(Panorama.filters.isNeighbourPanoTo(this.currentPano)); //filterFuncs.push(Panorama.filters.inFloorDirection_2d(this.currentPano.floorPosition, direction, 0.7))
  29419. filterFuncs.push(Panorama.filters.inFloorDirection(this.currentPano.position, direction, 0.707)); //45度范围内
  29420. filterFuncs.push(Panorama.filters.isClampDisSquaredTo(this.currentPano.floorPosition, 0.5, 16));
  29421. /* const pano = this.model.panos.find(filterFuncs, [
  29422. Panorama.sortFunctions.floorDistanceToPoint(this.currentPano.floorPosition),
  29423. ]) */
  29424. var sorts = common.sortByScore(this.model.panos.list, filterFuncs, [Panorama.scoreFunctions.distanceSquared(this.currentPano, -0.6), Panorama.scoreFunctions.directionFloor(this.currentPano.position, direction)]);
  29425. if (sorts.length > 1) {
  29426. //最后计算下保证 尽量选择在屏幕范围内的
  29427. var p = sorts.slice(0, 4).find(function (e) {
  29428. //最多只计算头几个,多了会卡
  29429. var r = convertTool.getPos2d(e.item.floorPosition, _this18);
  29430. return r.inSight;
  29431. });
  29432. if (p) {
  29433. pano = p.item;
  29434. }
  29435. }
  29436. if (!pano) {
  29437. pano = sorts[0] && sorts[0].item;
  29438. }
  29439. }
  29440. if (pano && pano.id != this.model.panos.animatePanoId) {
  29441. this.model.panos.animatePanoId != void 0 && this.model.panos.get(this.model.panos.animatePanoId).updateMakerStyle();
  29442. pano.updateMakerStyle('animate');
  29443. this.model.panos.animatePanoId = pano.id;
  29444. } else if (!pano && this.model.panos.animatePanoId != void 0) {
  29445. this.model.panos.get(this.model.panos.animatePanoId).updateMakerStyle();
  29446. this.model.panos.animatePanoId = null;
  29447. }
  29448. }
  29449. }, {
  29450. key: "createIntersectLabel",
  29451. value: function createIntersectLabel() {
  29452. this.intersectLabel = new TextSprite({
  29453. text: 'intersectLabel',
  29454. textColor: {
  29455. r: 255,
  29456. g: 255,
  29457. b: 255,
  29458. a: 1
  29459. },
  29460. backgroundColor: {
  29461. r: 0,
  29462. g: 0,
  29463. b: 0,
  29464. a: 0.1
  29465. },
  29466. borderColor: {
  29467. r: 255,
  29468. g: 255,
  29469. b: 255,
  29470. a: 1
  29471. },
  29472. //textBorderColor: { r: bgcolor.r * 255, g: bgcolor.g * 255, b: bgcolor.b * 250, a: a || 0.9 },
  29473. //textBorderThick: 2,
  29474. margin: {
  29475. x: 10,
  29476. y: 10
  29477. },
  29478. borderRadius: 10,
  29479. rectBorderThick: 2,
  29480. player: this,
  29481. sizeInfo: {
  29482. width2d: 180
  29483. },
  29484. fontsize: 25
  29485. });
  29486. this.intersectLabel.sprite.position.set(0, 2, 0);
  29487. this.model.add(this.intersectLabel);
  29488. }
  29489. }]);
  29490. return Player;
  29491. }(EventEmitter);
  29492. });
  29493. defineComponent('QualityManager', function () {
  29494. return /*#__PURE__*/function () {
  29495. function QualityManager(e, t, i) {
  29496. _classCallCheck(this, QualityManager);
  29497. this.maxNavPanoSize = -1;
  29498. this.maxZoomPanoSize = -1;
  29499. this.devicePixelDensity = e;
  29500. this.deviceScreenSize = t;
  29501. this.clientBandwidth = i;
  29502. this.panoSizeClassMap = {};
  29503. this.useHighResolutionPanos = !0;
  29504. this.useUltraHighResolutionPanos = !1;
  29505. this.modelHasUltraHighPanos = !1;
  29506. this.maxRenderTargetSize = config$4.mobile ? 2048 : 4096; //add
  29507. }
  29508. _createClass(QualityManager, [{
  29509. key: "init",
  29510. value: function init() {
  29511. this.buildPanoSizeClassMap(this.devicePixelDensity, this.deviceScreenSize, this.clientBandwidth);
  29512. this.ultraHighSize = this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  29513. this.highSize = this.getPanoSize(PanoSizeClass.HIGH);
  29514. this.standardSize = this.getPanoSize(PanoSizeClass.STANDARD);
  29515. this.baseSize = this.getPanoSize(PanoSizeClass.BASE);
  29516. if (settings$3.tiling.maxZoomPanoQuality && this.ultraHighSize <= settings$3.tiling.maxZoomPanoQuality) {
  29517. settings$3.tiling.allowUltraHighResolution = !0;
  29518. }
  29519. this.highQualityThreshold = browser$1.valueFromHash('threshold2k', constants$4.windowHeightHighQualityThreshold);
  29520. this.updateMaximums();
  29521. this.$app.core.get('ModelManager').on(ModelManagerEvents.ActiveModelChanged, this.onModelChanged.bind(this));
  29522. var metadata = this.$app.store.getValue('metadata');
  29523. var resolution = metadata.sceneResolution || '2k';
  29524. if (resolution.indexOf('/') != -1) {
  29525. this.tileClass = resolution.split('/')[1];
  29526. } else {
  29527. this.tileClass = resolution;
  29528. }
  29529. this.navTileClass = '2k';
  29530. if (this.tileClass == '1k') {
  29531. this.navTileClass = '1k';
  29532. this.useHighResolutionPanos = false; // 只加载1k
  29533. }
  29534. if (browser$1.urlHasValue('1k')) {
  29535. this.navTileClass = '1k';
  29536. }
  29537. this.limitQuality = true; //this.navTileClass = '1k'
  29538. }
  29539. }, {
  29540. key: "updateFromModel",
  29541. value: function updateFromModel(e) {
  29542. this.updateUltraHighResolutionSettings(e);
  29543. }
  29544. }, {
  29545. key: "updateHighResolutionSettings",
  29546. value: function updateHighResolutionSettings(e) {
  29547. showcase.modelDataPromisesTiles(e.data) ? this.useHighResolutionPanos = !0 : this.useHighResolutionPanos = !1, this.updateMaximums();
  29548. }
  29549. }, {
  29550. key: "updateUltraHighResolutionSettings",
  29551. value: function updateUltraHighResolutionSettings(e) {
  29552. if (settings$3.tiling.allowUltraHighResolution && this.modelHasUltraHighPanos) {
  29553. this.useUltraHighResolutionPanos = !0;
  29554. } else {
  29555. this.useUltraHighResolutionPanos = !1;
  29556. }
  29557. this.updateMaximums();
  29558. }
  29559. }, {
  29560. key: "enableUltraHighQualityMode",
  29561. value: function enableUltraHighQualityMode() {
  29562. this.modelHasUltraHighPanos = !0;
  29563. this.updateUltraHighResolutionSettings(null);
  29564. }
  29565. }, {
  29566. key: "ultraHighQualityModeEnabled",
  29567. value: function ultraHighQualityModeEnabled() {
  29568. return this.modelHasUltraHighPanos;
  29569. }
  29570. }, {
  29571. key: "onModelChanged",
  29572. value: function onModelChanged(e) {
  29573. this.updateFromModel(e.model), this.updateMaximums();
  29574. }
  29575. }, {
  29576. key: "updateMaximums",
  29577. value: function updateMaximums() {
  29578. this.maxNavPanoSize = settings$3.tiling.maxNavPanoQuality || this.detectMaxNavPanoSize();
  29579. this.maxZoomPanoSize = settings$3.tiling.maxZoomPanoQuality || this.detectMaxZoomPanoSize();
  29580. this.maxZoomPanoSize < this.maxNavPanoSize && (this.maxNavPanoSize = this.maxZoomPanoSize);
  29581. }
  29582. }, {
  29583. key: "buildPanoSizeClassMap",
  29584. value: function buildPanoSizeClassMap() {
  29585. this.panoSizeClassMap[PanoSizeClass.BASE] = 512;
  29586. this.panoSizeClassMap[PanoSizeClass.STANDARD] = 1024;
  29587. this.panoSizeClassMap[PanoSizeClass.HIGH] = 2048;
  29588. this.panoSizeClassMap[PanoSizeClass.ULTRAHIGH] = 4096;
  29589. }
  29590. }, {
  29591. key: "getPanoSize",
  29592. value: function getPanoSize(e) {
  29593. return this.panoSizeClassMap[e];
  29594. }
  29595. }, {
  29596. key: "getMaxPossiblePanoSize",
  29597. value: function getMaxPossiblePanoSize() {
  29598. return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  29599. }
  29600. }, {
  29601. key: "getMaxPanoSize",
  29602. value: function getMaxPanoSize() {
  29603. return this.maxZoomPanoSize;
  29604. }
  29605. }, {
  29606. key: "getMaxNavPanoSize",
  29607. value: function getMaxNavPanoSize() {
  29608. return this.maxNavPanoSize;
  29609. }
  29610. }, {
  29611. key: "getMaxZoomPanoSize",
  29612. value: function getMaxZoomPanoSize() {
  29613. return this.maxZoomPanoSize;
  29614. }
  29615. }, {
  29616. key: "detectMaxNavPanoSizeClass",
  29617. value: function detectMaxNavPanoSizeClass() {
  29618. /* return this.useHighResolutionPanos
  29619. ? browser.isMobile()
  29620. ? PanoSizeClass.STANDARD
  29621. : window.innerHeight < this.highQualityThreshold
  29622. ? PanoSizeClass.STANDARD
  29623. : PanoSizeClass.HIGH
  29624. : PanoSizeClass.STANDARD */
  29625. switch (this.navTileClass) {
  29626. case '1k':
  29627. return PanoSizeClass.STANDARD;
  29628. case '512':
  29629. return PanoSizeClass.BASE;
  29630. case '2k':
  29631. default:
  29632. return PanoSizeClass.HIGH;
  29633. }
  29634. }
  29635. }, {
  29636. key: "detectMaxNavPanoSize",
  29637. value: function detectMaxNavPanoSize() {
  29638. var e = this.detectMaxNavPanoSizeClass();
  29639. return this.getPanoSize(e);
  29640. }
  29641. }, {
  29642. key: "detectMaxZoomPanoSize",
  29643. value: function detectMaxZoomPanoSize() {
  29644. if (this.zoomLevelResolution) {
  29645. if (this.zoomLevelResolution == '4k' && this.useUltraHighResolutionPanos) {
  29646. return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  29647. } else if (this.zoomLevelResolution == '1k' || !this.useHighResolutionPanos) {
  29648. return this.getPanoSize(PanoSizeClass.STANDARD);
  29649. } else {
  29650. return this.getPanoSize(PanoSizeClass.HIGH);
  29651. }
  29652. } else {
  29653. if (this.useHighResolutionPanos) {
  29654. /* if (browser.isMobile()) {//手机版如果要2k的将这里去掉
  29655. if (settings.tiling.mobileHighQualityOverride) {
  29656. return this.getPanoSize(PanoSizeClass.HIGH);
  29657. } else {
  29658. return this.getPanoSize(PanoSizeClass.STANDARD);
  29659. }
  29660. } else */
  29661. if (this.useUltraHighResolutionPanos) {
  29662. return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  29663. } else {
  29664. return this.getPanoSize(PanoSizeClass.HIGH);
  29665. }
  29666. } else {
  29667. return this.getPanoSize(PanoSizeClass.STANDARD);
  29668. }
  29669. }
  29670. }
  29671. }]);
  29672. return QualityManager;
  29673. }();
  29674. });
  29675. var panorama = {};
  29676. panorama.getCubemapUrls = function (e, t, i) {
  29677. var a = [0, 1, 2, 3, 4, 5];
  29678. return a.map(function (n, o) {
  29679. return e.get('pan/' + i + '/' + t + '_skybox' + r(n) + '.jpg');
  29680. }.bind(this));
  29681. };
  29682. panorama.mapFaceToCubemapFace = function (e) {
  29683. var s = {
  29684. 0: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
  29685. 1: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
  29686. 2: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
  29687. 3: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
  29688. 4: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
  29689. 5: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
  29690. };
  29691. return s[e];
  29692. };
  29693. var TileDownloaderEvents = {
  29694. TileDownloadSuccess: 'tiledownloader.download.success',
  29695. TileDownloadFailure: 'tiledownloader.download.failure',
  29696. PanoDownloadComplete: 'tiledownloader.pano.download.complete'
  29697. };
  29698. function _createSuper$10(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$10(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  29699. function _isNativeReflectConstruct$10() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  29700. defineComponent('TileDownloader', function () {
  29701. var _class, _temp;
  29702. return _temp = _class = /*#__PURE__*/function (_EventEmitter) {
  29703. _inherits(TileDownloader, _EventEmitter);
  29704. var _super = _createSuper$10(TileDownloader);
  29705. function TileDownloader(_e) {
  29706. var _this;
  29707. _classCallCheck(this, TileDownloader);
  29708. _this = _super.call(this);
  29709. _this.forceQueueTilesForPano = function () {
  29710. var e = [],
  29711. t = [];
  29712. return function (i, n, r, o, a, s) {
  29713. e.length = 0;
  29714. for (var u = this.getTileDownloadDescriptors(i, n), d = 0; d < u.length; d++) {
  29715. var p = u[d];
  29716. p.status !== DownloadStatus.None && p.status !== DownloadStatus.Queued || e.push(p);
  29717. }
  29718. if (r && e.length > 0) {
  29719. TilePrioritizer.sortPanoTiles(e, i, r), t.length = 0, TileUtils.matchingTilesInDirection(i, n, r, o, a, t);
  29720. for (var f = 0, g = function g(e) {
  29721. return e.face === m.face && e.faceTileIndex === m.faceTileIndex;
  29722. }; f < e.length;) {
  29723. var m = e[f],
  29724. v = t.findIndex(g);
  29725. v < 0 ? e.splice(f, 1) : f++;
  29726. }
  29727. }
  29728. for (var A = 0; A < e.length; A++) {
  29729. this.forceQueue.push(e[A]);
  29730. }
  29731. this.setStatusForAllDescriptors(this.forceQueue, DownloadStatus.ForceQueued), this.clearFromQueue(this.priorityQueue, DownloadStatus.ForceQueued, !1), s && this.processQueueForDownloading(this.forceQueue, !0);
  29732. };
  29733. }();
  29734. _this.cleanupActiveDownloads = function () {
  29735. var e = [];
  29736. return function () {
  29737. e.length = 0;
  29738. for (var t = 0; t < this.activeDownloads.length; t++) {
  29739. var i = this.activeDownloads[t];
  29740. i.status !== DownloadStatus.Downloaded && i.status !== DownloadStatus.Failed && e.push(i);
  29741. }
  29742. this.activeDownloads.length = 0, this.activeDownloads.push.apply(this.activeDownloads, e);
  29743. };
  29744. }();
  29745. _this.getTileUrl = function () {
  29746. var e = {
  29747. 256: '256',
  29748. 512: '512',
  29749. 1024: '1k',
  29750. 2048: '2k',
  29751. 4096: '4k'
  29752. },
  29753. t = {
  29754. face: -1,
  29755. faceTileIndex: -1,
  29756. tileX: -1,
  29757. tileY: -1
  29758. };
  29759. return function (pano, n, r, a, panoType) {
  29760. TileUtils.getTileLocation(n, a, t);
  29761. var s = Math.floor(n / r),
  29762. l = s * s,
  29763. h = Math.floor(a / l),
  29764. d = '';
  29765. 1 === settings$3.tiling.customCompression && ('_' + settings$3.tiling['q' + e[n]]); //8目
  29766. //else if (metadata.sceneScheme == 11) {
  29767. //阿里云oss的规则
  29768. //let tileClass = settings.tileClass
  29769. var metadata = this.$app.store.getValue('metadata');
  29770. var tileClass = metadata.sceneKind || 'tiles';
  29771. var resolution = metadata.sceneResolution || '2k';
  29772. if (resolution.indexOf('/') != -1) {
  29773. var temp = resolution.split('/');
  29774. tileClass = temp[0];
  29775. resolution = temp[1];
  29776. } // let tileClass = metadata.sceneKind
  29777. // let resolution = metadata.sceneResolution
  29778. // let temp = resolution.split('/')
  29779. // // 临时方案
  29780. // if (temp.length == 1) {
  29781. // tileClass = resolution
  29782. // } else {
  29783. // tileClass = temp[0]
  29784. // resolution = temp[1]
  29785. // }
  29786. // if (pano.panoType == '360view') {
  29787. // if (this.$app.config.deploy === 'local' || tileClass === 'face') {
  29788. // d = this.getTiles('tiles/' + i + '/' + e[n] + '_face' + h + '_' + t.tileX + '_' + t.tileY + '.jpg')
  29789. // g = '?'
  29790. // } else {
  29791. // d = `tiles/${pano.view.resolution}/${pano.view.imgSid}`
  29792. // }
  29793. // } else {
  29794. // if (this.$app.config.deploy === 'local' || tileClass === 'face') {
  29795. // } else {
  29796. // d = tileClass + '/' + resolution + '/' + pano.id
  29797. // }
  29798. // }
  29799. if (this.$app.config.deploy === 'local' || tileClass === 'face') {
  29800. if (pano.panoType == '360view') {
  29801. d = 'tiles/' + pano.view.imgSid + '/' + e[n] + '_face' + h + '_' + t.tileX + '_' + t.tileY + '.jpg';
  29802. } else {
  29803. d = 'tiles/' + pano.id + '/' + e[n] + '_face' + h + '_' + t.tileX + '_' + t.tileY + '.jpg';
  29804. }
  29805. } else {
  29806. if (pano.panoType == '360view') {
  29807. d = "tiles/".concat(pano.view.resolution, "/").concat(pano.view.imgSid);
  29808. } else {
  29809. d = tileClass + '/' + resolution + '/' + pano.id;
  29810. }
  29811. d += '_skybox' + h + '.jpg?x-oss-process=';
  29812. if (e[n] == '512') {
  29813. d += 'image/resize,h_512';
  29814. } else {
  29815. //移动端是1k,pc端是2k
  29816. if (e[n] == '1k' || e[n] == '2k') {
  29817. d += 'image/resize,m_lfit,w_' + n + '/crop,w_512,h_512,';
  29818. } else {
  29819. d += 'image/crop,w_512,h_512,';
  29820. }
  29821. if (t.tileX == 0) {
  29822. d += 'x_0,';
  29823. } else {
  29824. d += 'x_' + 512 * t.tileX
  29825. /* - 1 */
  29826. + ','; //2022.12.12去掉了 -1, 否则https://www.4dkankan.com/spg.html?m=KJ-2HnN97rU51&lang=zh点位18的 18_skybox0 和 18_skybox3对不上
  29827. }
  29828. if (t.tileY == 0) {
  29829. d += 'y_0';
  29830. } else {
  29831. d += 'y_' + 512 * t.tileY;
  29832. /* - 1 */
  29833. }
  29834. }
  29835. /* 腾讯云适配 */
  29836. // d += '_skybox' + h + '.jpg?imageMogr2/'
  29837. // if (e[n] == '512') {
  29838. // d += 'thumbnail/512x'
  29839. // } else {
  29840. // if (e[n] == '1k' || e[n] == '2k') {
  29841. // d += `crop/${n}x${n}/cut/512x512x${t.tileX == 0 ? 0 : 512 * t.tileX}x${t.tileY == 0 ? 0 : 512 * t.tileY}`
  29842. // } else {
  29843. // d += `cut/512x512x${t.tileX == 0 ? 0 : 512 * t.tileX}x${t.tileY == 0 ? 0 : 512 * t.tileY}`
  29844. // }
  29845. // }
  29846. }
  29847. if (pano.panoType == '360view') {
  29848. if (!this.$app.core.get('Player').viewLinkManager.views[pano.id]) return;
  29849. d = this.$app.resource.getUserImagesURL("panorama/".concat(pano.view.imgSid, "/").concat(d));
  29850. } else {
  29851. d = this.getTiles(d);
  29852. }
  29853. return d;
  29854. };
  29855. }();
  29856. _this.panos = null;
  29857. _this.retryMinimumTime = 1e4;
  29858. _this.urls = null;
  29859. _this.panoLoadCallbacks = {};
  29860. _this.downloadDescriptors = {};
  29861. _this.priorityQueue = [];
  29862. _this.forceQueue = [];
  29863. _this.activeDownloads = [];
  29864. _this.tilePrioritizer = null;
  29865. _this.refreshInterval = null;
  29866. _this.processPriorityQueue = !1;
  29867. _this.concurrentDownloads = _e.concurrentDownloads || 1;
  29868. _this.downloadTestResults = {};
  29869. _this.freeze = Object.freeze({
  29870. Testing: 1,
  29871. Success: 2,
  29872. Fail: 3
  29873. });
  29874. _this.$app = _e.$app;
  29875. return _this;
  29876. }
  29877. _createClass(TileDownloader, [{
  29878. key: "init",
  29879. value: function init() {// Todo
  29880. }
  29881. }, {
  29882. key: "setUrls",
  29883. value: function setUrls(e) {
  29884. this.urls = e;
  29885. }
  29886. }, {
  29887. key: "setPanoData",
  29888. value: function setPanoData(e, t, i) {
  29889. //xzw 改。不直接使用model.panos,因为要去掉其中非tiled的pano
  29890. this.panos = e.clone();
  29891. this.panos.filter(function (e) {
  29892. return e.tiled;
  29893. });
  29894. this.imagePanos = t; //没什么用?heroLocation的
  29895. this.panoGroupId = i;
  29896. }
  29897. /*start() {
  29898. this.refreshUpdateInterval(0)
  29899. }
  29900. stop() {
  29901. window.cancel(this.refreshInterval)
  29902. }
  29903. */
  29904. }, {
  29905. key: "refreshUpdateInterval",
  29906. value: function refreshUpdateInterval(e) {
  29907. //还未加入sceneRenderer的component时使用
  29908. e || (e = 0), this.refreshInterval = window.setTimeout(function () {
  29909. var e = this.update();
  29910. e ? this.refreshUpdateInterval(TileDownloader.ACTIVE_REFRESH_DELAY) : this.refreshUpdateInterval(TileDownloader.IDLE_REFRESH_DELAY);
  29911. }.bind(this), e);
  29912. } //xzw 改
  29913. }, {
  29914. key: "start",
  29915. value: function start() {
  29916. this.started = true;
  29917. if (this.refreshEveryFrame) this.$app.core.get('SceneRenderer').addComponent(this, true);else this.refreshUpdateInterval(0);
  29918. }
  29919. }, {
  29920. key: "useComponent",
  29921. value: function useComponent() {
  29922. this.refreshEveryFrame = true;
  29923. window.clearTimeout(this.refreshInterval);
  29924. this.start();
  29925. }
  29926. }, {
  29927. key: "stop",
  29928. value: function stop() {
  29929. window.clearTimeout(this.refreshInterval);
  29930. this.$app.core.get('SceneRenderer').removeComponent(this);
  29931. }
  29932. }, {
  29933. key: "update",
  29934. value: function update() {
  29935. var _this2 = this;
  29936. var e = this.forceQueue.length > 0;
  29937. this.processQueueForDownloading(this.forceQueue);
  29938. if (this.processPriorityQueue) {
  29939. common.intervalTool.isWaiting('processPriorityQueue_' + this.$app.resource.num, function () {
  29940. //延时update,防止崩溃 , 未到时间就拦截(第一次直接执行)
  29941. _this2.queuePrioritizedTilesForPanos(_this2.panos); //这句比较耗时 降四倍时大概1-2毫秒
  29942. }, this.$app.config.mobile ? 120 : 66);
  29943. this.priorityQueue.length > 0 && (e = !0);
  29944. this.processQueueForDownloading(this.priorityQueue);
  29945. }
  29946. return e;
  29947. }
  29948. }, {
  29949. key: "clearForceQueue",
  29950. value: function clearForceQueue() {
  29951. this.clearQueue(this.forceQueue);
  29952. }
  29953. }, {
  29954. key: "queuePrioritizedTilesForPanos",
  29955. value: function queuePrioritizedTilesForPanos(e) {
  29956. if (this.tilePrioritizer) {
  29957. var player = this.$app.core.get('Player');
  29958. var maxLoadTileCount = player.lowTile == 'level2' ? 6 : player.lowTile == 'level1' ? 10 : 30;
  29959. this.clearQueue(this.priorityQueue);
  29960. this.tilePrioritizer.filterAndPrioritize(this.priorityQueue, e, this, maxLoadTileCount);
  29961. this.clearFromQueue(this.priorityQueue, DownloadStatus.None, !0);
  29962. this.setStatusOrRemoveForAllDescriptors(this.priorityQueue, DownloadStatus.Queued);
  29963. }
  29964. }
  29965. }, {
  29966. key: "clearQueue",
  29967. value: function clearQueue(e) {
  29968. this.setStatusForAllDescriptors(e, DownloadStatus.None), e.length = 0;
  29969. }
  29970. }, {
  29971. key: "clearFromQueue",
  29972. value: function clearFromQueue(e, t, i) {
  29973. for (var n = 0; n < e.length; n++) {
  29974. var r = e[n];
  29975. r && (t === r.status && !i || t !== r.status && i) && (e[n] = null);
  29976. }
  29977. }
  29978. }, {
  29979. key: "setStatusForAllDescriptors",
  29980. value: function setStatusForAllDescriptors(e, t) {
  29981. for (var i = 0; i < e.length; i++) {
  29982. var n = e[i];
  29983. n && (n.status = t);
  29984. }
  29985. }
  29986. }, {
  29987. key: "setStatusOrRemoveForAllDescriptors",
  29988. value: function setStatusOrRemoveForAllDescriptors(e, t) {
  29989. for (var i = 0; i < e.length; i++) {
  29990. var n = e[i];
  29991. n && (n.status !== t ? n.status = t : e[i] = null);
  29992. }
  29993. }
  29994. }, {
  29995. key: "getTileDownloadDescriptors",
  29996. value: function getTileDownloadDescriptors(e, t) {
  29997. var i = this.getAllTileDownloadDescriptorsForPano(e),
  29998. n = i[t];
  29999. return n || (n = this.buildDownloadDescriptorArray(t), i[t] = n, this.initTileDownloadDescriptors(n, e, t)), n;
  30000. }
  30001. }, {
  30002. key: "getAllTileDownloadDescriptorsForPano",
  30003. value: function getAllTileDownloadDescriptorsForPano(e) {
  30004. var t = this.downloadDescriptors[e.id];
  30005. return t || (t = {}, this.downloadDescriptors[e.id] = t), t;
  30006. }
  30007. }, {
  30008. key: "processQueueForDownloading",
  30009. value: function processQueueForDownloading(e, t) {
  30010. this.cleanupActiveDownloads();
  30011. /* let flying = this.$app.core.get('Player').flying
  30012. let isMobile = this.$app.config.mobile */
  30013. // xzw 改 4.6.0
  30014. if (e.length) {
  30015. //let concurrentDownloads = common.getBestCount('concurrentDownloads', 1, 6) //flying ? (isMobile ? 2 : 3) : 6
  30016. var concurrentDownloads = common.getBestCount({
  30017. name: 'concurrentDownloads',
  30018. minCount: 0,
  30019. maxCount: 6,
  30020. durBound1: 1,
  30021. durBound2: 12,
  30022. //8以下太小,模型大的场景加载慢
  30023. ifLog: false,
  30024. maxHistory: 4,
  30025. isMobile: this.$app.config.mobile
  30026. }); //最小值设置为0,否则4k放大快速过渡会崩溃,之前v3不会崩是因为用setTimeout加载慢
  30027. if (this.activeDownloads.length < concurrentDownloads || t) {
  30028. var i = t ? e.length : concurrentDownloads - this.activeDownloads.length;
  30029. for (var n = 0, r = 0; n < i && e.length > 0; r++) {
  30030. var o = e.shift();
  30031. o && (this.startDownload(o), n++);
  30032. }
  30033. }
  30034. }
  30035. }
  30036. }, {
  30037. key: "testDownload",
  30038. value: function testDownload(e, t, i) {
  30039. var n = this.downloadTestResults[e];
  30040. if (n) return void (n === this.freeze.Success ? i(!0) : n === this.freeze.Fail && i(!1));
  30041. this.downloadTestResults[e] = this.freeze.Testing;
  30042. var r = this.panos.list[0],
  30043. o = this.getTileUrl(r, e, t, 0),
  30044. a = function (t) {
  30045. this.downloadTestResults[e] = this.freeze.Success, i(!0);
  30046. }.bind(this),
  30047. s = function () {
  30048. this.downloadTestResults[e] = this.freeze.Fail, i(!1);
  30049. }.bind(this);
  30050. this.loadImage(o, 0, a, s);
  30051. }
  30052. }, {
  30053. key: "startDownload",
  30054. value: function startDownload(e) {
  30055. //开始下载啦
  30056. e.status = DownloadStatus.Downloading;
  30057. var t = this.getTileUrl(e.pano, e.panoSize, e.tileSize, e.tileIndex);
  30058. this.activeDownloads.push(e);
  30059. this.loadImage(t, TileDownloader.DOWNLOAD_RETRIES, this.downloadComplete.bind(this, e), this.downloadFailed.bind(this, e)); //console.log('begin Download ',e.pano.id,e.panoSize, e.tileSize, e.tileIndex)
  30060. } // //xst,加载一个点的所有图片
  30061. // loadAllImgsForOnePano(pano,size){
  30062. // if(!size){
  30063. // size = 2048
  30064. // }
  30065. // //是否存在
  30066. // this.downloadDescriptor
  30067. // let queue = this.getTileDownloadDescriptors(pano, size)
  30068. // for(let i=0;i<queue.length;++i){
  30069. // this.forceQueue.push(queue[i]);
  30070. // }
  30071. // this.processQueueForDownloading(this.forceQueue, !0)
  30072. // //默认情况,显示2k图片
  30073. // //是否下载了
  30074. // const flag = isPanoDownloaded(pano,2048)
  30075. // if(!flag){
  30076. // //没有的话,开始下载
  30077. // e.status = DownloadStatus.Downloading
  30078. // var t = this.getTileUrl(e.pano.id, e.panoSize, e.tileSize, e.tileIndex, e.pano.alignmentType) //xzw add alignmentType
  30079. // this.activeDownloads.push(e)
  30080. // this.loadImage(t, TileDownloader.DOWNLOAD_RETRIES, this.downloadComplete.bind(this, e), this.downloadFailed.bind(this, e))
  30081. // }
  30082. // }
  30083. }, {
  30084. key: "downloadFailed",
  30085. value: function downloadFailed(e, t) {
  30086. e.pano.tileError = true;
  30087. console.warn(t);
  30088. this.emit(TileDownloaderEvents.TileDownloadFailure);
  30089. }
  30090. }, {
  30091. key: "downloadComplete",
  30092. value: function downloadComplete(e, t) {
  30093. if (e.panoGroupId === this.panoGroupId) {
  30094. var i = this.getPanoLoadCallbacks(e.pano, e.panoSize);
  30095. e.status = DownloadStatus.Downloaded, i && i.onProgress && i.onProgress(e.pano, e.panoSize);
  30096. var n = {
  30097. panoId: e.pano.id,
  30098. image: t,
  30099. tileSize: e.tileSize,
  30100. panoSize: e.panoSize,
  30101. tileIndex: e.tileIndex,
  30102. faceTileIndex: e.faceTileIndex,
  30103. totalTiles: e.totalTiles,
  30104. face: e.face,
  30105. tileX: e.tileX,
  30106. tileY: e.tileY,
  30107. direction: e.direction
  30108. };
  30109. e.image = t, this.emit(TileDownloaderEvents.TileDownloadSuccess, n), this.isPanoDownloaded(e.pano, e.panoSize) && (n = {
  30110. panoId: e.pano.id,
  30111. tileSize: e.tileSize,
  30112. panoSize: e.panoSize
  30113. }, this.emit(TileDownloaderEvents.PanoDownloadComplete, n), i && i.onLoad && i.onLoad(e.pano, e.panoSize)); //console.log('下载成功')
  30114. }
  30115. }
  30116. }, {
  30117. key: "isPanoDownloaded",
  30118. value: function isPanoDownloaded(e, t) {
  30119. var i = this.getTileDownloadDescriptors(e, t);
  30120. if (i.length <= 0) return !1;
  30121. for (var n = 0; n < i.length; n++) {
  30122. var r = i[n];
  30123. if (r.status !== DownloadStatus.Downloaded) return !1;
  30124. }
  30125. return !0;
  30126. }
  30127. }, {
  30128. key: "setPanoLoadCallbacks",
  30129. value: function setPanoLoadCallbacks(e, t, i, n, r) {
  30130. var o = e.id + ':' + this.$app.core.get('QualityManager').getPanoSize(t);
  30131. this.panoLoadCallbacks[o] = {
  30132. onLoad: i,
  30133. onFail: n,
  30134. onProgress: r
  30135. };
  30136. }
  30137. }, {
  30138. key: "getPanoLoadCallbacks",
  30139. value: function getPanoLoadCallbacks(e, t) {
  30140. var i = e.id + ':' + t;
  30141. return this.panoLoadCallbacks[i];
  30142. }
  30143. }, {
  30144. key: "buildDownloadDescriptorArray",
  30145. value: function buildDownloadDescriptorArray(e) {
  30146. for (var t = TileUtils.getTileCountForSize(e), i = [], n = 0; n < t; n++) {
  30147. var r = this.buildDownloadDescriptor();
  30148. i.push(r);
  30149. }
  30150. return i;
  30151. }
  30152. }, {
  30153. key: "buildDownloadDescriptor",
  30154. value: function buildDownloadDescriptor() {
  30155. var e = {
  30156. panoGroupId: null,
  30157. pano: null,
  30158. panoSize: -1,
  30159. tileSize: -1,
  30160. tileIndex: -1,
  30161. totalTiles: -1,
  30162. faceTileIndex: -1,
  30163. status: DownloadStatus.None,
  30164. url: null,
  30165. image: null,
  30166. direction: new THREE.Vector3(),
  30167. face: -1,
  30168. cubeFace: -1,
  30169. tileX: -1,
  30170. tileY: -1
  30171. };
  30172. return e;
  30173. }
  30174. }, {
  30175. key: "initTileDownloadDescriptors",
  30176. value: function initTileDownloadDescriptors(e, t, i) {
  30177. for (var n = 0; n < e.length; n++) {
  30178. var r = e[n];
  30179. this.initTileDownloadDescriptor(r, t, i, n);
  30180. }
  30181. }
  30182. }, {
  30183. key: "initTileDownloadDescriptor",
  30184. value: function initTileDownloadDescriptor(e, t, i, n) {
  30185. var r = i >= TileUtils.TILE_SIZE ? TileUtils.TILE_SIZE : i;
  30186. e.face = TileUtils.getFaceForTile(i, n);
  30187. e.cubeFace = panorama.mapFaceToCubemapFace(e.face);
  30188. e.panoGroupId = this.panoGroupId;
  30189. e.pano = t;
  30190. e.panoSize = i;
  30191. e.tileSize = r;
  30192. e.tileIndex = n;
  30193. e.totalTiles = TileUtils.getTileCountForSize(i);
  30194. e.status = DownloadStatus.None;
  30195. e.image = null;
  30196. TileUtils.getTileLocation(e.panoSize, e.tileIndex, e);
  30197. TileUtils.getTileVector(e.panoSize, e.tileSize, e.cubeFace, e.tileX, e.tileY, TileUtils.LocationOnTile.Center, 0, e.direction);
  30198. }
  30199. }, {
  30200. key: "loadImage",
  30201. value: function loadImage(e, t, i, n) {
  30202. http.getImage(e, t).then(function (e) {
  30203. i(e);
  30204. }).fail(n);
  30205. }
  30206. }, {
  30207. key: "getTiles",
  30208. value: function getTiles(d) {
  30209. return this.urls.get(d); //config.urls.tileImgPath+d;
  30210. }
  30211. }]);
  30212. return TileDownloader;
  30213. }(EventEmitter), _class.IDLE_REFRESH_DELAY = 500, _class.ACTIVE_REFRESH_DELAY = 16, _class.DOWNLOAD_RETRIES = 4, _temp;
  30214. });
  30215. window.TileTree = function (e, t) {
  30216. this.levels = t, this.tileSize = e, this.root = null, this.allNodes = [], a$3(this);
  30217. };
  30218. function r$3(e, t) {
  30219. this.tree = e, this.parent = t, this.children = [], this.id = ++u;
  30220. }
  30221. function o$2(e, t, i, r, a, s, l, h) {
  30222. if (e) {
  30223. l = l || TileTree.TraversalType.PreOrder;
  30224. var u = r * c$1 + i;
  30225. if (l === TileTree.TraversalType.PreOrder && (a && a(e, t, u, i, r), s && s.push(e)), e.children && 0 !== e.children.length) {
  30226. for (var d = r * c$1, p = i * c$1, f = 0; f < c$1; f++) {
  30227. for (var g = 0; g < c$1; g++) {
  30228. o$2(e.children[g * c$1 + f], t + 1, p + f, d + g, a, s, l);
  30229. }
  30230. }
  30231. l === TileTree.TraversalType.PostOrder && (a && a(e, t, u, i, r), s && s.push(e));
  30232. }
  30233. }
  30234. }
  30235. function a$3(e) {
  30236. e.root = s$3(e, null, 0);
  30237. }
  30238. function s$3(e, t, i) {
  30239. if (i > e.levels) return null;
  30240. var n = new r$3(e, t);
  30241. e.allNodes.push(n);
  30242. for (var o = 0; o < h; o++) {
  30243. n.children[o] = s$3(e, n, i + 1);
  30244. }
  30245. return n;
  30246. }
  30247. function l$2(e, t, i, n, r) {
  30248. if (!e) return null;
  30249. if (0 === i) return e;
  30250. if (!e.children || 0 === e.children.length) return null;
  30251. var o = Math.pow(c$1, i),
  30252. a = o / c$1,
  30253. s = n % a,
  30254. h = r % a,
  30255. u = Math.floor(r / a),
  30256. d = Math.floor(n / a),
  30257. p = u * c$1 + d,
  30258. f = e.children[p];
  30259. return l$2(f, t + 1, i - 1, s, h);
  30260. }
  30261. var c$1 = 2,
  30262. h = c$1 * c$1;
  30263. TileTree.TraversalType = Object.freeze({
  30264. PreOrder: 0,
  30265. PostOrder: 1
  30266. });
  30267. var u = 0;
  30268. TileTree.getLevelCountForSize = function (e, t) {
  30269. var i = 0;
  30270. for (t < e && (t = e);;) {
  30271. if (t /= c$1, t < e) break;
  30272. i++;
  30273. }
  30274. return i;
  30275. }, TileTree.getSizeForLevel = function (e, t) {
  30276. return Math.pow(c$1, t) * e;
  30277. }, TileTree.prototype.getSubNode = function (e, t, i) {
  30278. (!t || e < this.tileSize) && (t = 0), (!i || e < this.tileSize) && (i = 0), e < this.tileSize && (e = this.tileSize);
  30279. var r = TileTree.getLevelCountForSize(this.tileSize, e),
  30280. o = l$2(this.root, 0, r, t, i);
  30281. return o;
  30282. }, TileTree.prototype.breadthFirst = function (e) {
  30283. e = e || {};
  30284. var t = !!e.nullLevelEnd,
  30285. i = e.maxLevel,
  30286. n = e.minLevel,
  30287. r = e.callback,
  30288. o = e.saveVisited,
  30289. a = [],
  30290. s = {},
  30291. l = 0;
  30292. for (a.push(this.root), a.push(s); a.length > 0 && !(i != void 0 && l > i);) {
  30293. var h = a.shift();
  30294. if (h === s) (!n || l >= n) && (r && t && r(null), o && t && o.push(null)), a.length > 0 && a.push(s), l++;else {
  30295. if (h.children) for (var u = 0; u < h.children.length; u++) {
  30296. var d = h.children[u];
  30297. d && a.push(h.children[u]);
  30298. }
  30299. var p = this.getFaceIndexFromNode(h);
  30300. (!n || l >= n) && (r && r(h, l, p), o && o.push(h));
  30301. }
  30302. }
  30303. }, TileTree.prototype.getFaceIndexFromNode = function (e) {
  30304. if (!e) return -1;
  30305. for (var t = 1, i = e, n = 0, r = 0;;) {
  30306. var o = i.parent;
  30307. if (!o) break;
  30308. for (var a = -1, s = 0; s < o.children.length; s++) {
  30309. o.children[s] === i && (a = s);
  30310. }
  30311. var l = a % c$1,
  30312. h = Math.floor(a / c$1);
  30313. n = l * t + n, r = h * t + r, t *= c$1, i = o;
  30314. }
  30315. return r * t + n;
  30316. }, TileTree.prototype.depthFirst = function (e, t, i) {
  30317. o$2(this.root, 0, 0, 0, e, t, i, this.tileSize);
  30318. };
  30319. var TileTree$1 = TileTree;
  30320. function _createSuper$$(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$$(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  30321. function _isNativeReflectConstruct$$() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  30322. function createDescriptor() {
  30323. var e = {
  30324. renderTarget: null,
  30325. inUse: !1,
  30326. size: -1,
  30327. pano: null
  30328. };
  30329. return e;
  30330. }
  30331. /*
  30332. 测试崩溃时,最好每次都清除缓存,因为清除后不容易崩溃了
  30333. */
  30334. function getMaxCount($app) {
  30335. var isMobile = $app.config.mobile,
  30336. maxCount;
  30337. if (isMobile) {
  30338. //手机的gpu相比cpu可能弱的多,个数要降低
  30339. maxCount = common.getBestCount({
  30340. name: 'maxTileRender',
  30341. minCount: 0,
  30342. maxCount: 4,
  30343. durBound1: 1,
  30344. durBound2: 4,
  30345. ifLog: false,
  30346. maxHistory: 3
  30347. });
  30348. } else {
  30349. maxCount = common.getBestCount({
  30350. name: 'maxTileRender',
  30351. minCount: 0,
  30352. maxCount: 6,
  30353. durBound1: 1,
  30354. durBound2: 6,
  30355. ifLog: false,
  30356. maxHistory: 2
  30357. });
  30358. }
  30359. return maxCount;
  30360. }
  30361. function upload() {
  30362. if (!this.uploadIntervalCancelled) {
  30363. b$1 = !0;
  30364. /* let flying = this.$app.core.get('Player').flying
  30365. let isMobile = this.$app.config.mobile
  30366. let maxNonBaseUploadsPerFrame = (flying || isMobile) ? 1 : 2 //this.maxNonBaseUploadsPerFrame //原先2。这是每帧uploadTile非512的瓦片tex的数量。之前的2太卡了,降为1。(检测卡顿方法:在一个pano点旋转至所有2048的tile都加载完,然后之后到这个点看看卡不卡。因为该点tiles都下载完了所以会在飞过来时陆续都加载,所以容易卡)
  30367. let maxBaseUploadsPerFrame = flying ? (isMobile ? 1 : 3) : 6//this.maxBaseUploadsPerFrame //原先6. 但持续前进过程中会请求加载下一个漫游图,一次加6张会卡的。
  30368. this.updateUploadQueue(maxNonBaseUploadsPerFrame, maxBaseUploadsPerFrame)
  30369. let time = flying ? 20 : 15 //w // 飞行有时候会卡,增长间隔 */
  30370. var maxCount = getMaxCount(this.$app);
  30371. this.updateUploadQueue(2, 6, maxCount);
  30372. var time = 16;
  30373. this.peekNextFromUploadQueue() ? this.refreshUploadInterval(time) : this.uploadInterval = null; //定时下一次更新
  30374. /* this.updateUploadQueue(this.maxNonBaseUploadsPerFrame, this.maxBaseUploadsPerFrame),
  30375. this.peekNextFromUploadQueue() ? this.refreshUploadInterval(w) : (this.uploadInterval = null)
  30376. */
  30377. }
  30378. }
  30379. var b$1 = !1,
  30380. w = settings$3.tiling.uploadIntervalDelay,
  30381. _ = settings$3.tiling.initialIntervalDelay,
  30382. T$1 = settings$3.tiling.maxNonBaseUploadsPerFrame,
  30383. x$2 = settings$3.tiling.maxBaseUploadsPerFrame,
  30384. S = {
  30385. Base: 0,
  30386. Remaining: 1
  30387. };
  30388. /* ,
  30389. M = []; */
  30390. defineComponent('PanoRenderer', function () {
  30391. return /*#__PURE__*/function (_EventEmitter) {
  30392. _inherits(PanoRenderer, _EventEmitter);
  30393. var _super = _createSuper$$(PanoRenderer);
  30394. function PanoRenderer(index) {
  30395. var _this;
  30396. _classCallCheck(this, PanoRenderer);
  30397. _this = _super.call(this);
  30398. _this.updateActivePanos = function () {
  30399. var e = [];
  30400. return function (t, i) {
  30401. e.length = 0;
  30402. for (var n = 0; n < this.activePanos.length; n++) {
  30403. t && e.length === i && e.push(t);
  30404. var r = this.activePanos[n],
  30405. o = this.getActiveRenderTargetDescriptor(r.id);
  30406. t && r.id === t.id || !this.isRenderTargetDescriptorValid(o) || e.push(r);
  30407. }
  30408. t && i >= e.length && e.push(t), this.activePanos.length = 0, this.activePanos.push.apply(this.activePanos, e);
  30409. };
  30410. }();
  30411. _this.renderPanoTiles = function () {
  30412. var e = [];
  30413. return function (panoId, i, n, r, quality) {
  30414. this.zoomRenderTarget && this.zoomRenderTarget.width === this.$app.core.get('QualityManager').getMaxZoomPanoSize() || this.zoomPanoRenderingDisabled || this.setupZoomRenderTarget(), i = i || this.direction || Vectors.FORWARD;
  30415. var o = this.getActiveRenderTargetDescriptor(panoId);
  30416. if (!this.isRenderTargetDescriptorValid(o)) console.error('PanoRenderer.renderPanoTiles() -> Cannot render to a pano that is not activated.');
  30417. for (var a = 0; a < TileUtils.FACES_PER_PANO; a++) {
  30418. var s = this.getTileTree(panoId, a);
  30419. e.length = 0;
  30420. s.breadthFirst({
  30421. //获取所有node, 从512到4096的共85个tiles
  30422. saveVisited: e,
  30423. maxLevel: quality ? quality == 512 ? 0 : quality == 1024 ? 1 : quality == 2048 ? 2 : 3 : 3
  30424. });
  30425. var dontDraw = this.$app.config.mobile && this.$app.core.get('Player').mode == 'panorama'; //从外面飞入时似乎不容易崩溃,直接加载吧否则等很久
  30426. for (var l = 0; l < e.length; l++) {
  30427. var c = e[l];
  30428. this.queueTileUpload(c.tile, !1, !dontDraw && (r || 0 === l && n)); //isMobile手机端不直接uploadTile base的6张贴图, 容易卡甚至崩溃
  30429. }
  30430. }
  30431. this.updateDirection(i);
  30432. };
  30433. }();
  30434. _this.getNextFromUploadQueue = function () {
  30435. //获取第一项并在列表中删除它
  30436. var e = function e(_e) {
  30437. var t = _e.shift();
  30438. return t.uploadQueued = !1, t;
  30439. };
  30440. return function () {
  30441. if (this.forceQueue.length > 0) return e(this.forceQueue);
  30442. var t = this.getTopUploadQueue();
  30443. return t && t.length > 0 ? e(t) : null;
  30444. };
  30445. }();
  30446. _this.refreshUploadInterval = function () {
  30447. var e = null;
  30448. return function (t) {
  30449. if (!this.uploadIntervalCancelled) {
  30450. e || (e = upload.bind(this));
  30451. null !== t && void 0 !== t || (t = w);
  30452. b$1 || (t = _);
  30453. this.uploadInterval = window.setTimeout(e, t);
  30454. this.uploadIntervalDelay = t;
  30455. }
  30456. };
  30457. }();
  30458. _this.update = function () {
  30459. this.uploadIntervalCancelled = true; //不使用setTimeout,而是在sceneRenderer每帧都update
  30460. this.$app.core.get('Player').lastFrameChanged;
  30461. var maxCount = getMaxCount(this.$app); //注:静止时看不出卡顿所以全速加载
  30462. this.updateUploadQueue(2, 6, maxCount);
  30463. };
  30464. _this.uploadTile = function () {
  30465. var collection = {},
  30466. overlayStyle = settings$3.tiling.overlayStyle;
  30467. var failHistory = {};
  30468. return function (info, n) {
  30469. var _this2 = this;
  30470. var sceneRenderer = this.index == 1 ? this.sceneRenderer2 : this.$app.core.get('SceneRenderer');
  30471. var id = info.panoId,
  30472. img = info.image,
  30473. tileSize = info.tileSize,
  30474. panoSize = info.panoSize,
  30475. tileIndex = info.tileIndex,
  30476. totalTiles = info.totalTiles,
  30477. tileX = info.tileX,
  30478. tileY = info.tileY,
  30479. p = !0,
  30480. g = !1,
  30481. ignore = false,
  30482. //add
  30483. LodDescripor = (this.getPanoDescriptor(id), this.getPanoLODDescriptor(id, panoSize)),
  30484. activeDescripor = this.getActiveRenderTargetDescriptor(id),
  30485. renderTarget = activeDescripor.renderTarget,
  30486. size = activeDescripor.size; //当前要渲染的面的分辨率,也就是MaxNavPanoSize
  30487. if (this.isPanoZoomed(id) && this.zoomRenderTarget) {
  30488. renderTarget = this.zoomRenderTarget;
  30489. size = this.zoomRenderTarget.width; //this.qualityManager.getMaxZoomPanoSize(); //放大后可能2048或4096
  30490. }
  30491. var done = function done() {
  30492. if (!LodDescripor.uploaded.includes(tileIndex)) {
  30493. //已经upload过(本来这时候直接返回,但发现缩放后这不会归零,导致清晰度不更新,所以还是redraw且emit吧)
  30494. //console.log('try to reupload and return',tileIndex)
  30495. LodDescripor.uploaded.push(tileIndex);
  30496. LodDescripor.uploadCount++;
  30497. }
  30498. _this2.emit(PanoRendererEvents.TileRenderSuccess, id, panoSize, tileIndex, totalTiles);
  30499. LodDescripor.uploadCount === totalTiles && _this2.emit(PanoRendererEvents.PanoRenderComplete, id, panoSize, totalTiles);
  30500. _this2.setUploaded(info, !0);
  30501. _this2.addCoverageForNode(info.node);
  30502. };
  30503. {
  30504. this.isRenderTargetDescriptorValid(activeDescripor) || (p = !1, g = !1);
  30505. if (!n) {
  30506. if (this.anyUploaded(info.node)) {
  30507. p = !1, g = !0;
  30508. ignore = true;
  30509. }
  30510. this.isTileUploaded(info) && (p = !1, g = !1, ignore = true);
  30511. }
  30512. }
  30513. if (p) {
  30514. /* if(failHistory[id+':'+ panoSize+ ':' +tileIndex]){
  30515. console.log('uploadTile retry',id, panoSize, tileIndex)
  30516. } */
  30517. // console.log('uploadTile 成功', id, panoSize, tileIndex)
  30518. var C = tileX * tileSize,
  30519. I = tileY * tileSize,
  30520. E = tileSize / panoSize * size,
  30521. // tile在renderTarget上渲染出的宽度
  30522. b = C / panoSize * size,
  30523. // tile在renderTarget上渲染的startX
  30524. w = I / panoSize * size; // tile在renderTarget上渲染的startY
  30525. if (panoSize > this.$app.core.get('QualityManager').maxRenderTargetSize) {
  30526. //4096 改
  30527. //var tex = sceneRenderer.initSizedTexture2D(tileSize, THREE.ClampToEdgeWrapping)
  30528. //var loaded = this.$app.core.get('Player').model.isHighMapLoaded(info.cubeFace, tileX, tileY)
  30529. this.$app.core.get('Player').model.getHighImage(img, info.cubeFace, tileX, tileY);
  30530. } else {
  30531. collection[tileSize] || (collection[tileSize] = sceneRenderer.initSizedTexture2D(tileSize, THREE.ClampToEdgeWrapping));
  30532. var tex = collection[tileSize];
  30533. sceneRenderer.uploadTexture2D(img, tex, 0, 0, tileSize, tileSize); //只替换tex对应的img,不新建
  30534. if (1 === overlayStyle || 2 === overlayStyle) {
  30535. var T = 1 === overlayStyle ? this.overlayTilesBasic : this.overlayTilesEnhanced;
  30536. sceneRenderer.renderToCubeMap(tex, renderTarget, tileSize, tileSize, 0, 0, tileSize, tileSize, b, w, E, E, info.cubeFace);
  30537. sceneRenderer.renderToCubeMap(T[panoSize], renderTarget, tileSize, tileSize, 0, 0, tileSize, tileSize, b, w, E, E, info.cubeFace, THREE.NormalBlending, !0, 0.5);
  30538. } else {
  30539. sceneRenderer.renderToCubeMap(tex, renderTarget, tileSize, tileSize, 0, 0, tileSize, tileSize, b, w, E, E, info.cubeFace);
  30540. }
  30541. }
  30542. done();
  30543. } else if (ignore) {
  30544. //console.log('finish because anyUploaded',id,panoSize,tileIndex)
  30545. done(); //改: 如果因为这部分更高清的贴图已加载所以才不绘制的话,直接完成
  30546. } else {
  30547. /* console.log('uploadTile 失败', id, panoSize, tileIndex)
  30548. if(panoSize == 512){
  30549. console.log("!!!!!!!!!!!!!")
  30550. } */
  30551. failHistory[id + ':' + panoSize + ':' + tileIndex] = true;
  30552. this.setUploaded(info, !1);
  30553. }
  30554. info.uploadAttempted || (LodDescripor.uploadAttempts++, this.emit(PanoRendererEvents.TileUploadAttempted, id, panoSize, tileIndex, totalTiles)), info.uploadAttempted = !0;
  30555. LodDescripor.uploadAttempts === totalTiles && this.emit(PanoRendererEvents.UploadAttemptedForAllTiles, id, panoSize, totalTiles);
  30556. return g;
  30557. };
  30558. }();
  30559. _this.tileDirectory = {};
  30560. _this.activeRenderTargetDescriptors = {};
  30561. _this.activePanos = [];
  30562. _this.panoLODDescriptors = {};
  30563. _this.panoDescriptors = {};
  30564. _this.tileTrees = {};
  30565. _this.forceQueue = [];
  30566. _this.uploadQueues = {};
  30567. _this.uploadInterval = null;
  30568. _this.uploadIntervalCancelled = !1;
  30569. _this.usingTileOverlay = !1;
  30570. _this.overlayTilesLoaded = !1;
  30571. _this.overlayTileBase = null;
  30572. _this.overlayTilesBasic = {};
  30573. _this.overlayTilesEnhanced = {};
  30574. _this.zoomRenderTarget = null; //用于缩放的rendertarget
  30575. _this.zoomPano = null;
  30576. _this.zoomingActive = !1;
  30577. _this.zoomPanoId = null;
  30578. _this.zoomPanoRenderingDisabled = !1;
  30579. _this.direction = new THREE.Vector3();
  30580. _this.initTime = -1;
  30581. _this.maxBaseUploadsPerFrame = x$2;
  30582. _this.maxNonBaseUploadsPerFrame = T$1;
  30583. _this.M = []; //move M to here 似乎列表里会有两个
  30584. _this.index = index || 0; //改
  30585. return _this;
  30586. }
  30587. _createClass(PanoRenderer, [{
  30588. key: "init",
  30589. value: function init(e, t, i) {
  30590. if (this.index == 1) {
  30591. this.sceneRenderer2 = e;
  30592. this.tileDownloader2 = t;
  30593. }
  30594. this.initTime = performance.now();
  30595. this.bindEvents();
  30596. }
  30597. }, {
  30598. key: "getActivePanoTextures",
  30599. value: function getActivePanoTextures(e) {
  30600. e = e || [];
  30601. for (var t = 0; t < M.length; t++) {
  30602. var i = M[t];
  30603. i.renderTarget && i.renderTarget.texture && e.push(i.renderTarget.texture);
  30604. }
  30605. }
  30606. }, {
  30607. key: "hasQueuedTiles",
  30608. value: function hasQueuedTiles() {
  30609. var e = this.peekNextFromUploadQueue();
  30610. return null !== e && void 0 !== e;
  30611. }
  30612. }, {
  30613. key: "getActiveRenderTargetDescriptor",
  30614. value: function getActiveRenderTargetDescriptor(e) {
  30615. return this.activeRenderTargetDescriptors[e];
  30616. }
  30617. }, {
  30618. key: "setActiveRenderTargetDescriptor",
  30619. value: function setActiveRenderTargetDescriptor(e, t) {
  30620. this.activeRenderTargetDescriptors[e] = t;
  30621. }
  30622. }, {
  30623. key: "bindEvents",
  30624. value: function bindEvents() {
  30625. this.index == 1 ? this.tileDownloader2.on(TileDownloaderEvents.TileDownloadSuccess, this.onTileDownloaded.bind(this)) : this.$app.core.get('TileDownloader').on(TileDownloaderEvents.TileDownloadSuccess, this.onTileDownloaded.bind(this));
  30626. }
  30627. }, {
  30628. key: "setupZoomRenderTarget",
  30629. value: function setupZoomRenderTarget() {
  30630. var QualityManager = this.$app.core.get('QualityManager');
  30631. if (QualityManager.maxRenderTargetSize == 2048 && QualityManager.getMaxNavPanoSize() == 2048) return; //不使用zoomTarget 直接用pano的tiledPanoRenderTarget,防崩溃
  30632. //if (QualityManager.getMaxZoomPanoSize() >= QualityManager.getMaxNavPanoSize() && (QualityManager.tileClass != '2k' || QualityManager.tileClass != '1k')) {
  30633. if (QualityManager.tileClass > QualityManager.navTileClass) {
  30634. //如果tileClass=='4k'即使还没加载出4k也先创建2k的Target
  30635. //部分手机2k时copyCubeMap会重载 , 所以如果没有超出当前分辨率,就不使用zoomRenderTarget。但在微信依旧会重载,只是优化了些,safari几乎不会。
  30636. var sceneRenderer = this.index == 1 ? this.sceneRenderer2 : this.$app.core.get('SceneRenderer');
  30637. if (this.zoomRenderTarget && this.zoomRenderTarget.width === QualityManager.getMaxZoomPanoSize()) return;
  30638. var e = this.zoomRenderTarget;
  30639. var size = QualityManager.getMaxZoomPanoSize();
  30640. if (size > QualityManager.maxRenderTargetSize) {
  30641. return;
  30642. }
  30643. this.zoomRenderTarget = this.initTiledPano(QualityManager.getMaxZoomPanoSize(), !1);
  30644. if (e) {
  30645. //将旧的zoomRenderTarget渲染到新zoomRenderTarget上
  30646. var t = e.width,
  30647. i = this.zoomRenderTarget.width;
  30648. sceneRenderer.copyCubeMap(e.texture, this.zoomRenderTarget, t, t, i, i);
  30649. e.texture.dispose();
  30650. e.texture.loaded = !1;
  30651. e.texture.version = 0;
  30652. sceneRenderer.deallocateCubeTexture(e.texture);
  30653. e.texture = null;
  30654. }
  30655. this.zoomPanoRenderingDisabled = !1;
  30656. } else this.zoomPanoRenderingDisabled = !0;
  30657. }
  30658. }, {
  30659. key: "enableHighQuality",
  30660. value: function enableHighQuality(e) {
  30661. //xzw add 如果最多只要2k图的话enableUltraHighQualityMode替换成这个
  30662. if (!this.$app.core.get('QualityManager').highQualityModeStarted) {
  30663. this.setupZoomRenderTarget();
  30664. e();
  30665. this.$app.core.get('QualityManager').highQualityModeStarted = true;
  30666. }
  30667. }
  30668. }, {
  30669. key: "enableUltraHighQualityMode",
  30670. value: function enableUltraHighQualityMode(e) {
  30671. var QualityManager = this.$app.core.get('QualityManager');
  30672. if (QualityManager.tileClass == '2k' || QualityManager.tileClass == '1k') return this.enableHighQuality(e); //xzw add
  30673. if (!QualityManager.ultraHighQualityModeEnabled()) {
  30674. var t = QualityManager.getPanoSize(PanoSizeClass.ULTRAHIGH);
  30675. this.$app.core.get('TileDownloader').testDownload(t, TileUtils.TILE_SIZE, function (t) {
  30676. if (t) {
  30677. this.$app.core.get('QualityManager').enableUltraHighQualityMode();
  30678. this.setupZoomRenderTarget();
  30679. e();
  30680. }
  30681. }.bind(this));
  30682. }
  30683. }
  30684. }, {
  30685. key: "activateTiledPano",
  30686. value: function activateTiledPano(pano, size, i, dontReSetTree) {
  30687. i && this.clearAllQueuedUploads();
  30688. if (!dontReSetTree) {
  30689. //重新initTileTree会重新uploadTile
  30690. for (var n = 0; n < TileUtils.FACES_PER_PANO; n++) {
  30691. this.initTileTree(pano.id, n, this.$app.core.get('QualityManager').getMaxPossiblePanoSize());
  30692. } //得到this.tileTrees[pano.id],arr[6]
  30693. this.linkAllTilesAndNodes(pano);
  30694. }
  30695. var r = this.getActiveRenderTargetDescriptor(pano.id),
  30696. l = size;
  30697. l > this.$app.core.get('QualityManager').getMaxNavPanoSize() && (l = this.$app.core.get('QualityManager').getMaxNavPanoSize());
  30698. if (!r || l !== r.size) {
  30699. r && this.deactiveDescripor(r.renderTarget);
  30700. r = this.activeDescripor(l);
  30701. if (!r) {
  30702. //console.log('创建cubeRenderTarget', size)
  30703. var ren = this.initTiledPano(l, !this.$app.config.mobile
  30704. /* !1 */
  30705. ); //xzw 但是有发现某个win7 ram4G的电脑会因抗锯齿在封面加载多3秒以上的时间。
  30706. r = this.initDescriptor(ren.width);
  30707. r.renderTarget = ren;
  30708. }
  30709. r.pano = pano;
  30710. this.resetPanoDescriptor(pano.id);
  30711. if (!dontReSetTree) {
  30712. this.resetPanoLODDescriptors(pano.id);
  30713. this.resetRenderStatus(pano.id, !0, !0);
  30714. }
  30715. }
  30716. this.setActiveRenderTargetDescriptor(pano.id, r);
  30717. var h = i ? 0 : 1;
  30718. this.updateActivePanos(pano, h); //console.log(`index:${this.viewer.index} ${r.renderTarget.texture.id} ${pano.id}`)
  30719. return r.renderTarget;
  30720. }
  30721. }, {
  30722. key: "deactivateTiledPano",
  30723. value: function deactivateTiledPano(e) {
  30724. var t = this.getActiveRenderTargetDescriptor(e.id);
  30725. if (this.isRenderTargetDescriptorValid(t)) {
  30726. this.deactiveDescripor(t.renderTarget);
  30727. this.setActiveRenderTargetDescriptor(e.id, null);
  30728. }
  30729. var i = this.getUploadQueueForPano(e.id);
  30730. this.clearUploadQueue(i);
  30731. this.updateActivePanos();
  30732. }
  30733. }, {
  30734. key: "getActivePanoCount",
  30735. value: function getActivePanoCount() {
  30736. return this.activePanos.length;
  30737. }
  30738. }, {
  30739. key: "resetRenderStatus",
  30740. value: function resetRenderStatus(e, t, i, n) {
  30741. var r = null;
  30742. n && (r = TileTree$1.getLevelCountForSize(TileUtils.TILE_SIZE, n) + 1);
  30743. for (var o = function o(e, n, r, _o) {
  30744. i && (n.tile.zoomUploaded = !1), t && (n.tile.uploaded = !1);
  30745. }, a = 0; a < TileUtils.FACES_PER_PANO; a++) {
  30746. var s = this.getTileTree(e, a);
  30747. s.breadthFirst({
  30748. callback: o.bind(this, a),
  30749. minLevel: r
  30750. });
  30751. }
  30752. }
  30753. }, {
  30754. key: "copyBaseRenderStatusToZoomed",
  30755. value: function copyBaseRenderStatusToZoomed(e) {
  30756. for (var t = TileTree$1.getLevelCountForSize(TileUtils.TILE_SIZE, this.$app.core.get('QualityManager').getMaxNavPanoSize()), i = function i(e, t, _i, n) {
  30757. t.tile.zoomUploaded = t.tile.uploaded, t.zoomCovered = t.covered; //标记
  30758. }, n = 0; n < TileUtils.FACES_PER_PANO; n++) {
  30759. var r = this.getTileTree(e, n);
  30760. r.breadthFirst({
  30761. callback: i.bind(this, n),
  30762. maxLevel: t
  30763. });
  30764. }
  30765. }
  30766. }, {
  30767. key: "isRenderTargetDescriptorValid",
  30768. value: function isRenderTargetDescriptorValid(e) {
  30769. return e && e.renderTarget;
  30770. }
  30771. }, {
  30772. key: "isPanoActive",
  30773. value: function isPanoActive(e) {
  30774. var t = this.getActiveRenderTargetDescriptor(e);
  30775. return this.isRenderTargetDescriptorValid(t);
  30776. }
  30777. }, {
  30778. key: "isPanoZoomed",
  30779. value: function isPanoZoomed(e) {
  30780. return this.zoomingActive && this.zoomPanoId === e;
  30781. }
  30782. }, {
  30783. key: "initTileTree",
  30784. value: function initTileTree(e, t, i) {
  30785. var n = this.tileTrees[e];
  30786. n || (n = [], this.tileTrees[e] = n);
  30787. var r = n[t];
  30788. if (!r) {
  30789. var o = TileTree$1.getLevelCountForSize(TileUtils.TILE_SIZE, i);
  30790. r = new TileTree$1(TileUtils.TILE_SIZE, o), n[t] = r;
  30791. }
  30792. }
  30793. }, {
  30794. key: "getTileTree",
  30795. value: function getTileTree(e, t) {
  30796. var i = this.tileTrees[e];
  30797. if (!i) console.error('PanoRenderer.getTileTree() -> Tree array not yet initialized!');
  30798. var n = i[t];
  30799. if (!n) console.error('PanoRenderer.getTileTree() -> Tree not yet initialized!');
  30800. return n;
  30801. }
  30802. /*
  30803. * 创建tile的renderTarget, 包括pano.tiledPanoRenderTarget和zoomRenderTarget
  30804. * @param {number} size 当前的panoSize,每个面的分辨率
  30805. */
  30806. }, {
  30807. key: "initTiledPano",
  30808. value: function initTiledPano(size, antialias) {
  30809. //创建 RenderTargetCube
  30810. var renderTarget = new THREE.WebGLCubeRenderTarget(size, {
  30811. stencilBuffer: !1,
  30812. //xzw add antialias , 手机可false
  30813. generateMipmaps: antialias,
  30814. minFilter: antialias ? THREE.LinearMipMapLinearFilter : THREE.LinearFilter
  30815. }); //antialias: 如果抗锯齿的话,采用mipmap,会增加一倍的存储消耗。原版本都是不抗锯齿的。但是抗锯齿效果更柔和
  30816. //console.log('initTiledPano', size, antialias)
  30817. return renderTarget;
  30818. }
  30819. }, {
  30820. key: "getUploadQueueForPano",
  30821. value: function getUploadQueueForPano(e) {
  30822. var t = this.uploadQueues[e];
  30823. if (!t) t = [], this.uploadQueues[e] = t;
  30824. return t; //return t || ((t = []), (this.uploadQueues[e] = t)), t
  30825. }
  30826. }, {
  30827. key: "isTileUploaded",
  30828. value: function isTileUploaded(e) {
  30829. return this.isPanoZoomed(e.panoId) ? e.zoomUploaded : e.uploaded;
  30830. }
  30831. }, {
  30832. key: "setUploaded",
  30833. value: function setUploaded(e, t) {
  30834. this.isPanoZoomed(e.panoId) ? e.zoomUploaded = t : e.uploaded = t; //console.log('setUploaded', e.panoId,e.tileIndex, e.uploaded, t )
  30835. }
  30836. }, {
  30837. key: "queueTileUpload",
  30838. value: function queueTileUpload(e, t, i) {
  30839. var n = this.getActiveRenderTargetDescriptor(e.panoId);
  30840. if (this.isRenderTargetDescriptorValid(n) && e.downloaded && !this.isTileUploaded(e) && (!e.uploadQueued || i) && (!(e.panoSize > this.$app.core.get('QualityManager').getMaxNavPanoSize()) || this.zoomingActive)) {
  30841. var r = this.getUploadQueueForPano(e.panoId);
  30842. i ? this.uploadTile(e, !1) : (this.shoulPushToFrontOfQueue(e) ? this.forceQueue.push(e) : t && this.direction ? TilePrioritizer.insertSortedPanoTile(r, e, n.pano, this.direction) : r.push(e), e.uploadQueued = !0, this.uploadInterval || this.uploadIntervalCancelled || this.refreshUploadInterval(0));
  30843. }
  30844. }
  30845. }, {
  30846. key: "shoulPushToFrontOfQueue",
  30847. value: function shoulPushToFrontOfQueue(e) {
  30848. return 0 === TileTree$1.getLevelCountForSize(TileUtils.TILE_SIZE, e.panoSize);
  30849. }
  30850. }, {
  30851. key: "getTopUploadQueue",
  30852. value: function getTopUploadQueue() {
  30853. for (var e = null, t = null, i = S.Base; i <= S.Remaining; i++) {
  30854. for (var n = 0; n < this.activePanos.length; n++) {
  30855. e = this.activePanos[n];
  30856. t = this.getUploadQueueForPano(e.id);
  30857. if (t.length > 0) {
  30858. switch (i) {
  30859. case S.Base:
  30860. if (0 === t[0].level) return t;
  30861. break;
  30862. case S.Remaining:
  30863. return t;
  30864. }
  30865. }
  30866. }
  30867. }
  30868. return null;
  30869. }
  30870. }, {
  30871. key: "peekNextFromUploadQueue",
  30872. value: function peekNextFromUploadQueue() {
  30873. //获取第一项
  30874. if (this.forceQueue.length > 0) return this.forceQueue[0];
  30875. var e = this.getTopUploadQueue();
  30876. return e && e.length > 0 ? e[0] : null;
  30877. }
  30878. }, {
  30879. key: "clearAllQueuedUploads",
  30880. value: function clearAllQueuedUploads() {
  30881. this.clearAllUploadQueues(null, 0);
  30882. }
  30883. }, {
  30884. key: "clearAllQueuedUploadsForPano",
  30885. value: function clearAllQueuedUploadsForPano(e) {
  30886. this.clearAllUploadQueues(e, 0);
  30887. }
  30888. }, {
  30889. key: "clearAllUploadQueues",
  30890. value: function clearAllUploadQueues(e, t) {
  30891. if (e) this.clearUploadQueue(this.getUploadQueueForPano(e), t), this.clearUploadQueue(this.forceQueue, t, e);else {
  30892. for (var i = 0; i < this.activePanos.length; i++) {
  30893. var n = this.activePanos[i];
  30894. this.clearUploadQueue(this.getUploadQueueForPano(n.id), t);
  30895. }
  30896. this.clearUploadQueue(this.forceQueue, t);
  30897. }
  30898. }
  30899. /* clearUploadQueue(e, t, i) {
  30900. ;(void 0 !== t && null !== t) || (t = 0)
  30901. for (var n = 0; n < e.length; ) {
  30902. var r = e[n]
  30903. ;(!i || (i && i === r.tile.panoId)) && r.level >= t ? ((r.uploadQueued = !1), e.splice(n, 1)) : n++
  30904. }
  30905. } */
  30906. }, {
  30907. key: "clearUploadQueue",
  30908. value: function clearUploadQueue(e, t, i) {
  30909. void 0 !== t && null !== t || (t = 0);
  30910. for (var n = 0; n < e.length;) {
  30911. var r = e[n];
  30912. (!i || i && i === r.panoId) && r.level >= t ? (r.uploadQueued = !1, //(!i || i && i === r.tile.panoId) && r.level >= t ? (r.uploadQueued = !1, //上传下载页面刚上传后刷新会报错。原因未知。
  30913. e.splice(n, 1)) : n++;
  30914. }
  30915. }
  30916. }, {
  30917. key: "updateUploadQueue",
  30918. value: function updateUploadQueue(e, t, maxCount) {
  30919. for (var i = 0, n = 0, sum = 0;;) {
  30920. /* var r = this.peekNextFromUploadQueue()
  30921. if (!r) break
  30922. if ((n >= t || i >= e || sum >= maxCount) && !(r.level == 0 && sum == 0) ) break
  30923. */
  30924. if (n >= t || i >= e || sum >= maxCount) break;
  30925. var r = this.getNextFromUploadQueue(); //获取并从列表中删除, 和前面的r一样的
  30926. if (!r) break;
  30927. 0 !== r.level ? i++ : n++; //if(0 == r.level)console.log('0000000', sum, maxCount)
  30928. sum++;
  30929. if (!(r.panoSize > this.$app.core.get('QualityManager').getMaxNavPanoSize()) || this.zoomingActive) {
  30930. var o = this.getActiveRenderTargetDescriptor(r.panoId);
  30931. this.isRenderTargetDescriptorValid(o) && this.uploadTile(r, r.forceUpload);
  30932. }
  30933. }
  30934. }
  30935. /* updateUploadQueue(e, t) {
  30936. //e || (e = 1) //啊啊啊啊啊
  30937. for (var i = 0, n = 0; ; ) {
  30938. if (n >= t || i >= e) break
  30939. var r = this.getNextFromUploadQueue()
  30940. if (!r) break
  30941. 0 !== r.level ? i++ : n++
  30942. if (!(r.panoSize > this.$app.core.get('QualityManager').getMaxNavPanoSize()) || this.zoomingActive) {
  30943. var o = this.getActiveRenderTargetDescriptor(r.panoId)
  30944. this.isRenderTargetDescriptorValid(o) && this.uploadTile(r, r.forceUpload)
  30945. }
  30946. }
  30947. } */
  30948. }, {
  30949. key: "updateDirection",
  30950. value: function updateDirection(e) {
  30951. if (e = e || this.direction) {
  30952. this.direction = e;
  30953. for (var t = 0; t < this.activePanos.length; t++) {
  30954. var i = this.activePanos[t],
  30955. n = this.getUploadQueueForPano(i.id);
  30956. TilePrioritizer.sortPanoTiles(n, i, this.direction);
  30957. }
  30958. }
  30959. }
  30960. }, {
  30961. key: "linkTileAndNode",
  30962. value: function linkTileAndNode(e, t) {
  30963. t.tile = e, e.node = t;
  30964. }
  30965. }, {
  30966. key: "linkAllTilesAndNodes",
  30967. value: function linkAllTilesAndNodes(e) {
  30968. var t = function t(_t, i, n, r, o) {
  30969. var a = this.getTileDirectoryEntry(e.id, i, r, o);
  30970. this.linkTileAndNode(a, n);
  30971. };
  30972. for (var i = 0; i < TileUtils.FACES_PER_PANO; i++) {
  30973. var n = this.getTileTree(e.id, i);
  30974. n.breadthFirst({
  30975. callback: t.bind(this, n, i)
  30976. });
  30977. }
  30978. }
  30979. }, {
  30980. key: "anyUploaded",
  30981. value: function anyUploaded(e) {
  30982. if (!e) return !1;
  30983. if (e.tile && this.isTileUploaded(e.tile)) return !0;
  30984. if (e.children) for (var t = 0; t < e.children.length; t++) {
  30985. var i = e.children[t];
  30986. if (this.anyUploaded(i)) return !0;
  30987. }
  30988. return !1;
  30989. }
  30990. }, {
  30991. key: "setNodeCovered",
  30992. value: function setNodeCovered(e, t) {
  30993. this.isPanoZoomed(e.tile.panoId) ? e.zoomCovered = t : e.covered = t;
  30994. }
  30995. }, {
  30996. key: "isNodeCovered",
  30997. value: function isNodeCovered(e) {
  30998. return !!e && (this.isPanoZoomed(e.tile.panoId) ? e.zoomCovered : e.covered);
  30999. }
  31000. }, {
  31001. key: "addCoverageForNode",
  31002. value: function addCoverageForNode(e) {
  31003. if (this.setNodeCovered(e, !0), e.parent && e.covered) {
  31004. var t = e.parent;
  31005. this.nodeSubcovered(t) && this.addCoverageForNode(t, !0);
  31006. }
  31007. }
  31008. }, {
  31009. key: "calcFullCoverage",
  31010. value: function calcFullCoverage(e) {
  31011. var t = !1;
  31012. if (e.children) for (var i = 0; i < e.children.length; i++) {
  31013. var n = e.children[i];
  31014. t = t || this.calcFullCoverage(n);
  31015. }
  31016. e.covered = e.tile.uploaded || t;
  31017. }
  31018. }, {
  31019. key: "nodeSubcovered",
  31020. value: function nodeSubcovered(e) {
  31021. if (!e.children) return !1;
  31022. for (var t = 0; t < e.children.length; t++) {
  31023. if (!e.children[t] || !this.isNodeCovered(e.children[t])) return !1;
  31024. }
  31025. return !0;
  31026. }
  31027. }, {
  31028. key: "resetPanoDescriptor",
  31029. value: function resetPanoDescriptor(e) {
  31030. this.getPanoDescriptor(e);
  31031. }
  31032. }, {
  31033. key: "getPanoDescriptor",
  31034. value: function getPanoDescriptor(e) {
  31035. var t = this.panoDescriptors[e];
  31036. return t || (t = {}, this.panoDescriptors[e] = t), t;
  31037. }
  31038. }, {
  31039. key: "resetPanoLODDescriptors",
  31040. value: function resetPanoLODDescriptors(e) {
  31041. var t = this.getPanoLODDescriptors(e);
  31042. for (var i in t) {
  31043. if (t.hasOwnProperty(i)) {
  31044. var n = t[i];
  31045. n.uploadCount = 0, n.uploadAttempts = 0;
  31046. n.uploaded = [];
  31047. }
  31048. }
  31049. }
  31050. }, {
  31051. key: "getPanoLODDescriptor",
  31052. value: function getPanoLODDescriptor(e, t) {
  31053. var i = this.getPanoLODDescriptors(e),
  31054. n = i[t];
  31055. return n || (n = {
  31056. uploadCount: 0,
  31057. uploadAttempts: 0,
  31058. uploaded: [] //add
  31059. }, i[t] = n), n;
  31060. }
  31061. }, {
  31062. key: "getPanoLODDescriptors",
  31063. value: function getPanoLODDescriptors(e) {
  31064. var t = this.panoLODDescriptors[e];
  31065. return t || (t = {}, this.panoLODDescriptors[e] = t), t;
  31066. }
  31067. }, {
  31068. key: "onTileDownloaded",
  31069. value: function onTileDownloaded(e) {
  31070. var t = TileTree$1.getLevelCountForSize(TileUtils.TILE_SIZE, e.panoSize),
  31071. i = this.getTileDirectoryEntry(e.panoId, e.face, t, e.faceTileIndex);
  31072. i.downloaded = !0;
  31073. i.image = e.image;
  31074. i.panoSize = e.panoSize;
  31075. i.tileX = e.tileX;
  31076. i.tileY = e.tileY;
  31077. i.totalTiles = e.totalTiles;
  31078. i.tileIndex = e.tileIndex;
  31079. i.faceTileIndex = e.faceTileIndex;
  31080. i.face = e.face;
  31081. i.cubeFace = panorama.mapFaceToCubemapFace(e.face);
  31082. i.panoId = e.panoId;
  31083. i.tileSize = e.tileSize;
  31084. i.direction = new THREE.Vector3().copy(e.direction);
  31085. i.node = null;
  31086. i.level = TileTree$1.getLevelCountForSize(TileUtils.TILE_SIZE, i.panoSize);
  31087. if (this.isPanoActive(i.panoId)) {
  31088. var n = this.getTileTree(i.panoId, i.face);
  31089. var r = n.getSubNode(i.panoSize, i.tileX, i.tileY);
  31090. this.linkTileAndNode(i, r);
  31091. this.queueTileUpload(i, !0);
  31092. }
  31093. }
  31094. }, {
  31095. key: "getTileDirectoryEntry",
  31096. value: function getTileDirectoryEntry(panoId, t, i, n) {
  31097. var r = this.tileDirectory[panoId];
  31098. r || (r = {}, this.tileDirectory[panoId] = r);
  31099. var o = 16384 * t + 1024 * i + n,
  31100. //t:4096级别
  31101. a = r[o];
  31102. return a || (a = {
  31103. downloaded: !1,
  31104. uploaded: !1,
  31105. zoomUploaded: !1
  31106. }, r[o] = a), a._key = panoId + ':' + t + ':' + i + ':' + n, a._tileKey = o, a;
  31107. }
  31108. }, {
  31109. key: "setZoomingActive",
  31110. value: function setZoomingActive(active, pano, i) {
  31111. //设置当前正在zoom的pano
  31112. this.zoomPanoRenderingDisabled || active === this.zoomingActive && this.zoomPanoId === pano.id || (this.zoomingActive = active, this.zoomPanoId = pano.id, this.zoomingActive && (this.zoomPanoId !== pano.id || i) && this.updateZoomedPanoFromBase(pano));
  31113. }
  31114. }, {
  31115. key: "updateZoomedPanoFromBase",
  31116. value: function updateZoomedPanoFromBase(pano) {
  31117. //因更换pano所以将pano的rendertarget渲染到panoRenderer的zoomRenderTarget上
  31118. if (!this.zoomPanoRenderingDisabled) {
  31119. var QualityManager = this.$app.core.get('QualityManager');
  31120. var sceneRenderer = this.index == 1 ? this.sceneRenderer2 : this.$app.core.get('SceneRenderer');
  31121. var t = this.getActiveRenderTargetDescriptor(pano.id);
  31122. if (t && t.renderTarget) {
  31123. if (this.zoomRenderTarget) {
  31124. var i = Math.min(QualityManager.maxRenderTargetSize, QualityManager.getMaxZoomPanoSize()),
  31125. //change
  31126. n = t.renderTarget,
  31127. r = t.size;
  31128. sceneRenderer.copyCubeMap(n.texture, this.zoomRenderTarget, r, r, i, i);
  31129. }
  31130. this.copyBaseRenderStatusToZoomed(pano.id);
  31131. }
  31132. }
  31133. } //xzw add 转换pano加载的tile的质量。 为了降低总的renderTarget的size, 尤其手机的2048cube个数只能存在一个
  31134. }, {
  31135. key: "switchPanoQuality",
  31136. value: function switchPanoQuality(pano, _ref) {
  31137. var useIdel = _ref.useIdel,
  31138. size = _ref.size;
  31139. if (useIdel) {
  31140. var rt;
  31141. if (size) rt = this.activeDescripor(size, true); //使用空闲的,优先使用此size的
  31142. if (!rt) rt = this.activeDescripor(null, true); //任何size都可以
  31143. if (rt) {
  31144. size = rt.size;
  31145. }
  31146. }
  31147. pano.updateTileQuality(size);
  31148. if (!pano.tiledPanoRenderTarget) return;
  31149. var oldSize = pano.tiledPanoRenderTarget.width;
  31150. if (size != oldSize) {
  31151. //console.log('switchPanoQuality', pano.id, oldSize, size)
  31152. this.deactiveDescripor(this.tiledPanoRenderTarget);
  31153. var newTarget = this.activateTiledPano(pano, size, false, true); //第三个参数决定是否clearAllQueuedUploads, clear的话会造成tiles加载不全
  31154. this.$app.core.get('SceneRenderer').copyCubeMap(pano.tiledPanoRenderTarget.texture, newTarget, oldSize, oldSize, size, size); //这一句后台耗时高
  31155. pano.tiledPanoRenderTarget = newTarget;
  31156. this.renderPanoTiles(pano.id, null, null, null, size
  31157. /* , dir, a */
  31158. );
  31159. pano.updateSkyboxForZoomLevel(); //材质更新
  31160. }
  31161. }
  31162. /* 注意 由于copyCubeMap耗时大,所以不能在无缝过渡中执行。 综合考虑下最佳组合:
  31163. pc:2048两个, 1024一个
  31164. mobile:2048一个, 1024两个 (lowTile为level2时多一个512)
  31165. 其中无缝过渡时在中途加载的首选1024(除非1024用完了),直到无缝过渡结束后才会提升。
  31166. */
  31167. }, {
  31168. key: "add",
  31169. value: function add(e) {
  31170. this.M.push(e);
  31171. }
  31172. }, {
  31173. key: "initDescriptor",
  31174. value: function initDescriptor(size) {
  31175. var t = createDescriptor();
  31176. t.inUse = !0;
  31177. t.size = size;
  31178. this.add(t);
  31179. return t;
  31180. }
  31181. }, {
  31182. key: "activeDescripor",
  31183. value: function activeDescripor(e, onlyCheck) {
  31184. for (var t = 0; t < this.M.length; t++) {
  31185. var i = this.M[t];
  31186. if (!i.inUse && (!e || i.size === e)) {
  31187. //xzw改
  31188. if (!onlyCheck) i.inUse = !0; //console.log('activeDescripor', onlyCheck, this.M.map(e=>e.inUse))
  31189. return i;
  31190. }
  31191. }
  31192. return null;
  31193. }
  31194. }, {
  31195. key: "deactiveDescripor",
  31196. value: function deactiveDescripor(e) {
  31197. for (var t = 0; t < this.M.length; t++) {
  31198. var i = this.M[t];
  31199. if (i.renderTarget === e) {
  31200. i.inUse = !1; //console.log('deactiveDescripor', this.M.map(e=>e.inUse))
  31201. return !0;
  31202. }
  31203. }
  31204. return !1;
  31205. } //xzw add: 飞出后dispose所有cubeRenderTarget,避免因模型贴图较多而造成的崩溃
  31206. }, {
  31207. key: "disposeIdelTargets",
  31208. value: function disposeIdelTargets() {
  31209. for (var t = 0; t < this.M.length; t++) {
  31210. var i = this.M[t];
  31211. if (!i.inUse) {
  31212. i.renderTarget.dispose();
  31213. }
  31214. } //console.log('disposeIdelTargets ', disposeCount, 'of', this.M.length)
  31215. }
  31216. }]);
  31217. return PanoRenderer;
  31218. }(EventEmitter);
  31219. });
  31220. var PanoVideoRendererEvents = {
  31221. ParamsUpdated: 'panorama.videorenderer.paramsupdated',
  31222. SuspendRender: 'panorama.videorenderer.suspendrender',
  31223. ResumeRender: 'panorama.videorenderer.resumerender',
  31224. TextureUpdate: 'panorama.videorenderer.textured',
  31225. CanPlayVideo: 'panorama.videorenderer.canplayvideo',
  31226. StartPlayVideo: 'panorama.videorenderer.startvideo'
  31227. };
  31228. function _createSuper$_(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$_(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  31229. function _isNativeReflectConstruct$_() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  31230. defineComponent('ModelManager', function () {
  31231. return /*#__PURE__*/function (_EventEmitter) {
  31232. _inherits(ModelManager, _EventEmitter);
  31233. var _super = _createSuper$_(ModelManager);
  31234. function ModelManager() {
  31235. var _this;
  31236. _classCallCheck(this, ModelManager);
  31237. _this = _super.call(this);
  31238. _this.modelMap = {};
  31239. _this.activeModel = null;
  31240. _this.modelCount = 0;
  31241. return _this;
  31242. }
  31243. _createClass(ModelManager, [{
  31244. key: "init",
  31245. value: function init() {
  31246. this.bindEvents();
  31247. }
  31248. }, {
  31249. key: "bindEvents",
  31250. value: function bindEvents() {
  31251. this.$app.core.get('PanoRenderer').on(PanoRendererEvents.TileRenderSuccess, this.onTileRendered.bind(this));
  31252. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.TextureUpdate, this.onVideoTextureUpdate.bind(this));
  31253. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.SuspendRender, this.onSuspendVideoRender.bind(this));
  31254. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.ResumeRender, this.onResumeVideoRender.bind(this));
  31255. }
  31256. }, {
  31257. key: "onTileRendered",
  31258. value: function onTileRendered(e, t, i, n) {}
  31259. }, {
  31260. key: "onVideoTextureUpdate",
  31261. value: function onVideoTextureUpdate(texture) {
  31262. this.activeModel && this.activeModel.updateVideoTexture(texture);
  31263. }
  31264. }, {
  31265. key: "onSuspendVideoRender",
  31266. value: function onSuspendVideoRender() {
  31267. this.activeModel && this.activeModel.suspendVideoRender();
  31268. }
  31269. }, {
  31270. key: "onResumeVideoRender",
  31271. value: function onResumeVideoRender() {
  31272. this.activeModel && this.activeModel.resumeVideoRender();
  31273. }
  31274. }, {
  31275. key: "addModel",
  31276. value: function addModel(model) {
  31277. this.modelMap[model.sid] = model;
  31278. 0 === this.modelCount && this.activateModel(model.sid);
  31279. this.modelCount++;
  31280. this.emit(ModelManagerEvents.ModelAdded);
  31281. }
  31282. }, {
  31283. key: "activateModel",
  31284. value: function activateModel(projectNum) {
  31285. var model = this.modelMap[projectNum];
  31286. if (!model) {
  31287. throw new BasicException('Tried to activate invalid model!');
  31288. }
  31289. var oldModel = this.activeModel;
  31290. this.activeModel = model, this.$app.core.get('TileDownloader').setPanoData(model.panos, []
  31291. /* model.listImagePanos() */
  31292. , model.sid), this.$app.core.get('TileDownloader').setUrls(model.urls), model.panos.forEach(function (e) {
  31293. e.attachToPanoRenderer(this.$app.core.get('PanoRenderer')), e.attachToPanoVideoRenderer(this.$app.core.get('PanoVideoRenderer')), e.tileDownloader = this.$app.core.get('TileDownloader'), e.qualityManager = this.$app.core.get('QualityManager');
  31294. }.bind(this)), this.emit(ModelManagerEvents.ActiveModelChanged, {
  31295. oldModel: oldModel,
  31296. model: model
  31297. });
  31298. }
  31299. }, {
  31300. key: "getActiveModel",
  31301. value: function getActiveModel() {
  31302. return this.activeModel;
  31303. }
  31304. }]);
  31305. return ModelManager;
  31306. }(EventEmitter);
  31307. });
  31308. function _createSuper$Z(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$Z(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  31309. function _isNativeReflectConstruct$Z() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  31310. var PanoramaCamera = /*#__PURE__*/function (_THREE$PerspectiveCam) {
  31311. _inherits(PanoramaCamera, _THREE$PerspectiveCam);
  31312. var _super = _createSuper$Z(PanoramaCamera);
  31313. function PanoramaCamera(dom) {
  31314. var _this;
  31315. _classCallCheck(this, PanoramaCamera);
  31316. _this = _super.call(this, cameraLight.clampVFOV(settings$3.insideFOV), window.innerWidth / window.innerHeight, settings$3.insideNear, settings$3.insideFar);
  31317. _this.controls = null;
  31318. return _this;
  31319. }
  31320. _createClass(PanoramaCamera, [{
  31321. key: "updateAspect",
  31322. value: function updateAspect(aspect) {
  31323. this.aspect = aspect;
  31324. this.updateProjectionMatrix();
  31325. }
  31326. }]);
  31327. return PanoramaCamera;
  31328. }(THREE.PerspectiveCamera);
  31329. function _createSuper$Y(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$Y(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  31330. function _isNativeReflectConstruct$Y() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  31331. var DollhouseCamera = /*#__PURE__*/function (_THREE$PerspectiveCam) {
  31332. _inherits(DollhouseCamera, _THREE$PerspectiveCam);
  31333. var _super = _createSuper$Y(DollhouseCamera);
  31334. function DollhouseCamera(dom) {
  31335. var _this;
  31336. _classCallCheck(this, DollhouseCamera);
  31337. _this = _super.call(this, cameraLight.clampVFOV(constants$4.dollhouseFOV), window.innerWidth / window.innerHeight, constants$4.dollhouseNear, constants$4.dollhouseFar);
  31338. _this.controls = null;
  31339. return _this;
  31340. }
  31341. _createClass(DollhouseCamera, [{
  31342. key: "updateAspect",
  31343. value: function updateAspect(aspect) {
  31344. if (isNaN(aspect)) aspect = 1; //xzw add
  31345. this.aspect = aspect;
  31346. this.controls.updateDistance(aspect);
  31347. this.updateProjectionMatrix();
  31348. }
  31349. /* updateFov() {
  31350. //add
  31351. if (this.aspect < this.suitModelAspect) {
  31352. //屏宽缩小时,不变hFov, 改变vHov
  31353. this.fov = cameraLight.getVFOVFromHFOV(this.suitModelAspectHFov, this.aspect, 1)
  31354. } else this.fov = constants.dollhouseFOV
  31355. } */
  31356. }]);
  31357. return DollhouseCamera;
  31358. }(THREE.PerspectiveCamera);
  31359. function _createSuper$X(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$X(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  31360. function _isNativeReflectConstruct$X() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  31361. var FloorplanCamera = /*#__PURE__*/function (_THREE$OrthographicCa) {
  31362. _inherits(FloorplanCamera, _THREE$OrthographicCa);
  31363. var _super = _createSuper$X(FloorplanCamera);
  31364. function FloorplanCamera(dom) {
  31365. var _this;
  31366. _classCallCheck(this, FloorplanCamera);
  31367. _this = _super.call(this);
  31368. var aspect = window.innerWidth / window.innerHeight;
  31369. _this = _super.call(this, -constants$4.orthoBase, constants$4.orthoBase, constants$4.orthoBase / aspect, -constants$4.orthoBase / aspect, constants$4.orthoNear, constants$4.orthoFar);
  31370. _this.controls = null;
  31371. _this.updateAspect(aspect);
  31372. return _this;
  31373. } //xzw 修改
  31374. _createClass(FloorplanCamera, [{
  31375. key: "updateAspect",
  31376. value: function updateAspect(aspect) {
  31377. if (isNaN(aspect)) aspect = 1;
  31378. this.aspect = aspect; // this.top = constants.orthoBase / aspect
  31379. // this.bottom = -constants.orthoBase / aspect
  31380. // this.updateProjectionMatrix()
  31381. }
  31382. }]);
  31383. return FloorplanCamera;
  31384. }(THREE.OrthographicCamera);
  31385. var MouseButton = {
  31386. LEFT: 0,
  31387. MIDDLE: 1,
  31388. RIGHT: 2
  31389. };
  31390. function _createSuper$W(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$W(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  31391. function _isNativeReflectConstruct$W() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  31392. var PanoramaControls = /*#__PURE__*/function (_EventEmitter) {
  31393. _inherits(PanoramaControls, _EventEmitter);
  31394. var _super = _createSuper$W(PanoramaControls);
  31395. function PanoramaControls(camera, dom, player) {
  31396. var _this;
  31397. _classCallCheck(this, PanoramaControls);
  31398. _this = _super.call(this);
  31399. _this.camera = camera; //被控制的相机
  31400. _this.camera.controls = _assertThisInitialized(_this);
  31401. _this.player = player;
  31402. _this.config = player.$app.config;
  31403. _this.dom = dom;
  31404. _this.target = new THREE.Vector3(0, 0, 0); //相机视点,鼠标交互主要影响的对象
  31405. _this.lookVector = new THREE.Vector3(); //相机方向,以单位向量表示
  31406. _this.lookSpeed = 0.05; //没发现下文用到???
  31407. _this.rotationAcc = new THREE.Vector2(); //旋转角加速度
  31408. _this.rotationSpeed = new THREE.Vector2(); //旋转角速度
  31409. _this.speed = 1; // 相机拖拽旋转速度
  31410. /**
  31411. * 球坐标系的相关参数lat,lon 与 phi,theta 两种表示形式
  31412. * 注:少了半径参数,因为是用于约束相机的方向,半径长短在此没有意义,单位1即可,体现在方向向量lookVector上
  31413. */
  31414. _this.lat = 0; //纬度,角度表示,直观
  31415. _this.lon = 0; //经度,角度表示,直观
  31416. _this.phi = 0; //phi,标准球坐标系的参数,弧度表示,用于进行直接计算
  31417. _this.theta = 0; //theta,标准球坐标系的参数,弧度表示,用于进行直接计算
  31418. _this.enabled = !1; //是否启用
  31419. _this.locked = !1; //是否锁定
  31420. /**
  31421. * 交互行为相关,有鼠标点击与触摸,点击或触摸的地方在此约定统称为交互点
  31422. */
  31423. _this.pointer = new THREE.Vector2(0, 0); //交互点的屏幕坐标,有别于DOM坐标,在此存放NDC坐标。(NDC,三维常用坐标系,二维坐标,整个屏幕映射范围(-1,1),屏幕中心为原点,+Y朝上,+X朝右)
  31424. _this.pointersLimit = 2; //触摸事件的触摸点的限制个数
  31425. _this.pointers = []; //存储交互点的坐标
  31426. _this.rotationDifference = new THREE.Vector2(); //记录帧之间的要进行的旋转量
  31427. _this.rotationHistory = []; //记录一次拖拽过程中每帧产生的rotationDifference,用于拖拽完成后计算平均值进而得到惯性角速度
  31428. _this.pointerDragOn = !1; //拖拽的标记,用于处理各种交互行为下的冲突问题
  31429. _this.pointerDragStart = new THREE.Vector2(0, 0); //拖拽开始位置,也作为两帧之间前一帧的坐标位置
  31430. _this.pinchDistance = 0; //触控下,“捏合”交互下,两触摸点的距离
  31431. _this.moveStart = new THREE.Vector2(); //交互点移动行为开始的最表
  31432. _this.moveTolerance = 0.01; //产生拖拽行为的鼠标移动最小阈值,用于解决点击,和其他行为的误触操作
  31433. _this.limitAngleIsBound = true; // 配置俯仰角
  31434. if (_this.config.camera && _this.config.camera.lookLimitUp != null && _this.config.camera.lookLimitDown != null) {
  31435. _this.limitAngleIsBound = false;
  31436. _this.insideLookLimitUp = _this.config.camera.lookLimitUp;
  31437. _this.insideLookLimitDown = _this.config.camera.lookLimitDown;
  31438. }
  31439. return _this;
  31440. }
  31441. /**
  31442. * 启用状态
  31443. */
  31444. _createClass(PanoramaControls, [{
  31445. key: "usable",
  31446. value: function usable() {
  31447. return this.enabled && !this.locked;
  31448. }
  31449. /**
  31450. * 根据新的方向向量计算所指向的球面坐标(lat,lon),用到了笛卡尔坐标系转球面坐标系的数学方法
  31451. * 注:THREE 的 Vector3 与 Spherical 两个数学类有互转的方法
  31452. * @param {THREE.Vector3} aim 目标点
  31453. */
  31454. }, {
  31455. key: "lookAt",
  31456. value: function lookAt(aim, dir) {
  31457. var t = dir || this.camera.position.clone().sub(aim); //aim所指相反点的笛卡尔坐标系
  31458. /**
  31459. * 以下全为笛卡尔坐标->球座标,不多赘述
  31460. */
  31461. var i = Math.atan(t.z / t.x);
  31462. i += t.x < 0 ? Math.PI : 0;
  31463. i += t.x > 0 && t.z < 0 ? 2 * Math.PI : 0;
  31464. this.lon = THREE.MathUtils.radToDeg(i) + 180;
  31465. var n = Math.sqrt(t.x * t.x + t.z * t.z),
  31466. o = Math.atan(t.y / n);
  31467. this.lat = -THREE.MathUtils.radToDeg(o);
  31468. }
  31469. /**
  31470. * 记录一次拖拽旋转开始时的一些状态
  31471. * @param {number} clientX 屏幕坐标
  31472. * @param {number} clientY 屏幕坐标
  31473. */
  31474. }, {
  31475. key: "startRotationFrom",
  31476. value: function startRotationFrom(clientX, clientY) {
  31477. //以屏幕中心为原点,得到pointer在屏幕的百分比
  31478. var mouse = math$1.handelPadding(clientX, clientY, this.dom);
  31479. math$1.convertScreenPositionToNDC(mouse.x, mouse.y, this.pointer, this.dom);
  31480. this.pointerDragOn = !0;
  31481. this.pointerDragStart.copy(this.pointer);
  31482. this.moveStart.copy(this.pointer);
  31483. this.rotationHistory = [];
  31484. this.rotationSpeed.set(0, 0);
  31485. }
  31486. }, {
  31487. key: "onMouseOver",
  31488. value: function onMouseOver(mouseEvent) {
  31489. !this.pointerDragOn || 0 !== mouseEvent.which && 0 !== mouseEvent.buttons || this.onMouseUp(mouseEvent);
  31490. }
  31491. }, {
  31492. key: "onTouchStart",
  31493. value: function onTouchStart(pointerEvent) {
  31494. if (this.usable()) {
  31495. pointerEvent.preventDefault();
  31496. pointerEvent.stopPropagation();
  31497. switch (pointerEvent.touches.length) {
  31498. case 1:
  31499. this.startRotationFrom(pointerEvent.touches[0].clientX, pointerEvent.touches[0].clientY);
  31500. break;
  31501. case 2:
  31502. var t = (pointerEvent.touches[0].clientX - pointerEvent.touches[1].clientX) / window.innerWidth,
  31503. i = (pointerEvent.touches[0].clientY - pointerEvent.touches[1].clientY) / window.innerHeight;
  31504. this.pinchDistance = Math.sqrt(t * t + i * i);
  31505. }
  31506. this.emit(ControlEvents.InputStart, 'touch');
  31507. }
  31508. }
  31509. }, {
  31510. key: "onPointerDown",
  31511. value: function onPointerDown(pointerEvent) {
  31512. if (this.usable() && 'touch' === pointerEvent.pointerType) {
  31513. if (this.pointers.length < this.pointersLimit) {
  31514. this.pointers.push({
  31515. id: pointerEvent.pointerId,
  31516. clientX: pointerEvent.clientX,
  31517. clientY: pointerEvent.clientY
  31518. });
  31519. }
  31520. pointerEvent.touches = this.pointers;
  31521. this.onTouchStart(pointerEvent);
  31522. this.emit(ControlEvents.InputStart, 'pointer');
  31523. }
  31524. }
  31525. }, {
  31526. key: "onMouseDown",
  31527. value: function onMouseDown(mouseEvent) {
  31528. if (this.usable()) {
  31529. mouseEvent.preventDefault();
  31530. mouseEvent.stopPropagation();
  31531. switch (mouseEvent.button) {
  31532. case MouseButton.LEFT:
  31533. this.startRotationFrom(mouseEvent.clientX, mouseEvent.clientY);
  31534. }
  31535. this.emit(ControlEvents.InputStart, 'mouse');
  31536. }
  31537. }
  31538. /**
  31539. * 根据两帧交互点坐标之间的差值,计算两帧角度差值(rotationDifference)用于旋转
  31540. * 1.将两次交互点坐标分别映射到3D空间
  31541. * 2.通过两坐标在XY平面上投影,分别计算与X轴夹角,再求差值作为竖直方向角度差值(rotationDifference.y)
  31542. * 3.通过两坐标在XZ平面上投影,分别计算与X轴夹角,再求差值作为水平方向角度差值(rotationDifference.x)
  31543. */
  31544. }, {
  31545. key: "updateRotation",
  31546. value: function updateRotation() {
  31547. if (this.usable() && this.pointerDragOn) {
  31548. this.camera.matrixWorld = new THREE.Matrix4(); //许钟文加 unproject前先把相机置于原点 (player的cameras里的panorama是不更新matrixworld的,只有player的camera才更新。 为了其他的camera加)
  31549. //两交互点在3D空间的坐标
  31550. var pointerDragStart3D = new THREE.Vector3(this.pointerDragStart.x, this.pointerDragStart.y, -1).unproject(this.camera),
  31551. pointer3D = new THREE.Vector3(this.pointer.x, this.pointer.y, -1).unproject(this.camera),
  31552. //两交互点分别到原点的长度
  31553. pointerDragStart3DLength = Math.sqrt(pointerDragStart3D.x * pointerDragStart3D.x + pointerDragStart3D.z * pointerDragStart3D.z),
  31554. pointer3DLength = Math.sqrt(pointer3D.x * pointer3D.x + pointer3D.z * pointer3D.z),
  31555. //通过Math.atan2计算在XY面上与X轴的夹角弧度。
  31556. //注:因为 z = -1,所以两者到原点的长度近似为x分量(数值的大小也不需要绝对对应)
  31557. anglePointerDragStart3DToX = Math.atan2(pointerDragStart3D.y, pointerDragStart3DLength),
  31558. //近似为 anglePointerDragStart3DToX = Math.atan2( pointerDragStart3D.y, pointerDragStart3D.x )
  31559. anglePointer3DToX = Math.atan2(pointer3D.y, pointer3DLength); //近似为 anglePointer3DToX = Math.atan2( pointer3D.y, pointer3D.x )
  31560. this.camera.updateMatrix();
  31561. this.camera.updateMatrixWorld(); //算出两者角度差,作为竖直方向角度差值(rotationDifference.y)
  31562. this.rotationDifference.y = THREE.MathUtils.radToDeg(anglePointerDragStart3DToX - anglePointer3DToX); //y分量清零,原向量等价于在XZ轴上的投影向量
  31563. pointerDragStart3D.y = 0;
  31564. pointer3D.y = 0; //归一化(/length),求两者夹角作为
  31565. //判断方向,最后记为水平方向角度差值(rotationDifference.x)
  31566. var anglePointerDragStart3DToPointer3D = Math.acos(pointerDragStart3D.dot(pointer3D) / pointerDragStart3D.length() / pointer3D.length()); // isNaN(s) || (this.rotationDifference.x = THREE.MathUtils.radToDeg(s),
  31567. // this.pointerDragStart.x < this.pointer.x && (this.rotationDifference.x *= -1)),
  31568. if (!isNaN(anglePointerDragStart3DToPointer3D)) {
  31569. this.rotationDifference.x = THREE.MathUtils.radToDeg(anglePointerDragStart3DToPointer3D);
  31570. if (this.pointerDragStart.x < this.pointer.x) {
  31571. this.rotationDifference.x *= -1;
  31572. }
  31573. }
  31574. this.rotationDifference.multiplyScalar(this.speed); //更新pointerDragStart记录当前帧坐标,用于下一帧求帧差值
  31575. this.pointerDragStart.copy(this.pointer); //console.log(pointerDragStart3DLength,pointer3DLength)
  31576. }
  31577. }
  31578. /**
  31579. * 处理鼠标移动事件
  31580. * 1.计算鼠标的NDC坐标
  31581. * 2.判断是否是拖拽来决定拖拽行为的执行
  31582. * 3.通过预定义的防误触偏差(moveTolerance),来防止一定的误触
  31583. */
  31584. }, {
  31585. key: "onMouseMove",
  31586. value: function onMouseMove(mouseEvent) {
  31587. if (this.usable()) {
  31588. var mouse = math$1.handelPadding(mouseEvent.clientX, mouseEvent.clientY, this.dom);
  31589. math$1.convertScreenPositionToNDC(mouse.x, mouse.y, this.pointer, this.dom);
  31590. if (this.pointerDragOn) {
  31591. if (Math.abs(this.pointer.x - this.moveStart.x) > this.moveTolerance || Math.abs(this.pointer.y - this.moveStart.y) > this.moveTolerance) {
  31592. this.emit(ControlEvents.Move, 'mouse');
  31593. }
  31594. }
  31595. }
  31596. }
  31597. /**
  31598. * 处理触摸移动事件
  31599. * 1.单点触控记录NDC坐标
  31600. * 2.双点触控记录两触摸点距离(映射到[0-1]范围)
  31601. */
  31602. }, {
  31603. key: "onTouchMove",
  31604. value: function onTouchMove(pointerEvent) {
  31605. if (this.usable()) {
  31606. this.emit(ControlEvents.Move, 'touch');
  31607. switch (pointerEvent.touches.length) {
  31608. case 1:
  31609. var mouse = math$1.handelPadding(pointerEvent.touches[0].clientX, pointerEvent.touches[0].clientY, this.dom);
  31610. math$1.convertScreenPositionToNDC(mouse.x, mouse.y, this.pointer, this.dom);
  31611. break;
  31612. case 2:
  31613. var offsetX = (pointerEvent.touches[0].clientX - pointerEvent.touches[1].clientX) / window.innerWidth,
  31614. offsetY = (pointerEvent.touches[0].clientY - pointerEvent.touches[1].clientY) / window.innerHeight,
  31615. n = this.pinchDistance - Math.sqrt(offsetX * offsetX + offsetY * offsetY);
  31616. if (Math.abs(n) > 0.01) {
  31617. this.emit(ControlEvents.InteractionDirect);
  31618. this.emit(ControlEvents.Pinch, n);
  31619. this.pinchDistance -= n;
  31620. }
  31621. }
  31622. }
  31623. }
  31624. }, {
  31625. key: "onPointerMove",
  31626. value: function onPointerMove(pointerEvent) {
  31627. if (this.usable() && 'touch' === pointerEvent.pointerType) {
  31628. this.pointers.forEach(function (t) {
  31629. if (pointerEvent.pointerId === t.id) {
  31630. t.clientX = pointerEvent.clientX;
  31631. t.clientY = pointerEvent.clientY;
  31632. }
  31633. });
  31634. pointerEvent.touches = this.pointers;
  31635. this.onTouchMove(pointerEvent);
  31636. }
  31637. }
  31638. /**
  31639. * 旋转终止后的行为
  31640. * 1.通过已记录的一组帧旋转量(rotationDifference)求平均值作为停止后惯性速度参考值。
  31641. * 2.通过设置的rotationAfterMoveMultiplier(惯性速度决定因子,用于手动指定影响惯性速度大小),来计算最后的的惯性速度
  31642. */
  31643. }, {
  31644. key: "endRotation",
  31645. value: function endRotation() {
  31646. this.pointerDragOn = !1;
  31647. var averageVector = common.averageVectors(this.rotationHistory);
  31648. if (this.player.$app.VRScreenSYNC) {
  31649. // 不使用惯性
  31650. //this.rotationSpeed.set(0,0)
  31651. this.rotationSpeed.set(averageVector.x * settings$3.rotationAfterMoveMultiplierX / 6, averageVector.y * settings$3.rotationAfterMoveMultiplierY / 6);
  31652. } else {
  31653. this.rotationSpeed.set(averageVector.x * settings$3.rotationAfterMoveMultiplierX, averageVector.y * settings$3.rotationAfterMoveMultiplierY);
  31654. }
  31655. }
  31656. /**
  31657. * 触摸结束触发endRotation行为
  31658. */
  31659. }, {
  31660. key: "onTouchEnd",
  31661. value: function onTouchEnd(pointerEvent) {
  31662. if (this.usable()) {
  31663. pointerEvent.preventDefault();
  31664. pointerEvent.stopPropagation();
  31665. this.endRotation();
  31666. }
  31667. }
  31668. /**
  31669. * 鼠标抬起触发endRotation行为
  31670. */
  31671. }, {
  31672. key: "onMouseUp",
  31673. value: function onMouseUp(mouseEvent) {
  31674. if (this.usable()) {
  31675. mouseEvent.preventDefault();
  31676. mouseEvent.stopPropagation();
  31677. this.endRotation();
  31678. }
  31679. }
  31680. }, {
  31681. key: "onPointerUp",
  31682. value: function onPointerUp(pointerEvent) {
  31683. if (this.usable() && 'touch' === pointerEvent.pointerType) {
  31684. this.pointers.forEach(function (t, i) {
  31685. pointerEvent.pointerId === t.id && this.pointers.splice(i, 1);
  31686. }.bind(this));
  31687. pointerEvent.touches = this.pointers;
  31688. this.onTouchEnd(pointerEvent);
  31689. }
  31690. }
  31691. /**
  31692. * 主循环更新,主要通过物理上的刚体旋转行为(角位移,角速度,角加速度,摩擦等)计算得到新的相机视点target,主要是每帧瞬时的状态
  31693. *
  31694. * updateRotation()计算每帧对应的旋转量 rotationDifference
  31695. *
  31696. * 角位移:rotationDifference与原本lon,lat (等价于phi,theta)累加,得到新的角位移
  31697. * 角速度:(rotationDifference数组的平均值 * 速度因子rotationAccelerationInside + 角加速度) - 摩擦rotationFriction。
  31698. *
  31699. * target坐标:新的角位移计算出新的球坐标,转换计算后的球坐标到笛卡尔坐标系
  31700. *
  31701. * @param { number } deltaTime 帧间隔时间。 注:关于帧间隔时间,是个有关物理计算的很重要的值,用于保持物理量与绝对时间的对应而不受帧率的的干扰,下文计算角速度用到。更多请见 https://blog.csdn.net/ChinarCSDN/article/details/82914420
  31702. */
  31703. }, {
  31704. key: "update",
  31705. value: function update(deltaTime) {
  31706. if (this.locked) return; //if(settings.vrEnabled) return;
  31707. // 求出新的rotationDifference
  31708. this.updateRotation(); //记录一组rotationDifference 用于求角速度 rotationSpeed。注:见 endRotation()
  31709. for (this.rotationHistory.push(this.rotationDifference.clone()); this.rotationHistory.length > settings$3.rotationAfterMoveHistoryCount;) {
  31710. this.rotationHistory.shift();
  31711. } //计算角位移(交互影响下的)
  31712. this.lon += this.rotationDifference.x;
  31713. this.lat += this.rotationDifference.y;
  31714. this.rotationDifference.set(0, 0); //计算角速度(实际上deltaTime增大时,角速度下降幅度也应增大)
  31715. var friction = Math.min(1, settings$3.rotationFriction * deltaTime * 60); //如果deltaTime > 1/ 60 (比较卡),就增加rotationFriction, 以防止转动过久
  31716. this.rotationSpeed.x = this.rotationSpeed.x * (1 - friction) + this.rotationAcc.x * settings$3.rotationAccelerationInside;
  31717. this.rotationSpeed.y = this.rotationSpeed.y * (1 - friction) + this.rotationAcc.y * settings$3.rotationAccelerationInside; //计算角位移(交互后,物理定律影响下的)
  31718. this.lon += this.rotationSpeed.x * deltaTime;
  31719. this.lat += this.rotationSpeed.y * deltaTime; //this.lat = Math.max(constants.insideLookLimitDown, Math.min(settings.insideLookLimitUp, this.lat)) //通过预定义的俯仰角最大最小范围(insideLookLimitUp、insideLookLimitDown)来限制俯仰角。 注:这种数学计算很常见,因此API也很常见(clamp),等价于 this.lat = THREE.MathUtils.clamp( this.lat, constants.insideLookLimitDown, settings.insideLookLimitUp );
  31720. //许钟文
  31721. if (this.limitDownAngel == null) {
  31722. //许钟文 在手机编辑墙壁时俯视角度可以增大
  31723. var insideLookLimitDown, insideLookLimitUp;
  31724. if (this.limitAngleIsBound) {
  31725. //根据fov调整insideLookLimitDown 以使得能看到的边界不变。此时insideLookLimitDown为边界而不是看的角度了
  31726. insideLookLimitDown = settings$3.insideLookLimitDown - settings$3.insideFOV / 2 + this.camera.fov / 2;
  31727. insideLookLimitUp = settings$3.insideLookLimitUp + settings$3.insideFOV / 2 - this.camera.fov / 2;
  31728. } else {
  31729. insideLookLimitDown = this.insideLookLimitDown != void 0 ? this.insideLookLimitDown : settings$3.insideLookLimitDown;
  31730. insideLookLimitUp = this.insideLookLimitUp != void 0 ? this.insideLookLimitUp : settings$3.insideLookLimitUp;
  31731. }
  31732. this.lat = Math.max(insideLookLimitDown, Math.min(insideLookLimitUp, this.lat)); //通过预定义的俯仰角最大最小范围(insideLookLimitUp、insideLookLimitDown)来限制俯仰角。 注:这种数学计算很常见,因此API也很常见(clamp),等价于 this.lat = THREE.Math.clamp( this.lat, settings.insideLookLimitDown, settings.insideLookLimitUp );
  31733. } else {
  31734. this.lat = this.limitDownAngel; //固定垂直视角
  31735. } //转换为标准球坐标参数形式,并最终转换为笛卡尔坐标系下
  31736. this.phi = THREE.MathUtils.degToRad(90 - this.lat);
  31737. this.theta = THREE.MathUtils.degToRad(this.lon);
  31738. this.lookVector.x = Math.sin(this.phi) * Math.cos(this.theta);
  31739. this.lookVector.y = Math.cos(this.phi);
  31740. this.lookVector.z = Math.sin(this.phi) * Math.sin(this.theta); //求taget坐标: 当前相机位置 + 方向向量(对于此处旋转来说距离并无意义,方向向量的1即可)
  31741. this.target.copy(this.lookVector).add(this.camera.position); //THREE的API来更新相机旋转。注:lookAt是四阶矩阵比较常见的API,因此此PanoramaControls计算流程,不算与THREE耦合
  31742. this.camera.lookAt(this.target);
  31743. }
  31744. /**
  31745. * 滚轮行为: 触发自定义事件
  31746. */
  31747. }, {
  31748. key: "onMouseWheel",
  31749. value: function onMouseWheel(wheelEvent) {
  31750. if (this.usable()) {
  31751. var t = wheelEvent.wheelDelta || -wheelEvent.detail;
  31752. this.emit(ControlEvents.InteractionDirect);
  31753. this.emit(ControlEvents.Scroll, t);
  31754. }
  31755. }
  31756. /**
  31757. * 键盘按下:触发自定义事件
  31758. */
  31759. }, {
  31760. key: "onKeyDown",
  31761. value: function onKeyDown(keyboardEvent) {
  31762. if (!this.player.$app.config.useShortcutKeys) {
  31763. return;
  31764. }
  31765. if (this.usable()) {
  31766. if (keyboardEvent.metaKey || keyboardEvent.ctrlKey) ; else {
  31767. keyboardEvent.preventDefault();
  31768. this.handleKeyDown(keyboardEvent.which);
  31769. }
  31770. }
  31771. }
  31772. }, {
  31773. key: "handleKeyDown",
  31774. value: function handleKeyDown(keyValue) {
  31775. var t = function (e, t) {
  31776. this.rotationAcc[e] = t;
  31777. }.bind(this);
  31778. this.emit(ControlEvents.InteractionKey);
  31779. var i = !0;
  31780. switch (keyValue) {
  31781. case Keys.LEFTARROW:
  31782. case Keys.J:
  31783. t('x', -1);
  31784. break;
  31785. case Keys.RIGHTARROW:
  31786. case Keys.L:
  31787. t('x', 1);
  31788. break;
  31789. case Keys.I:
  31790. t('y', 1);
  31791. break;
  31792. case Keys.K:
  31793. t('y', -1);
  31794. break;
  31795. default:
  31796. i = !1;
  31797. }
  31798. i && this.emit(ControlEvents.Move, 'key');
  31799. }
  31800. }, {
  31801. key: "onKeyUp",
  31802. value: function onKeyUp(keyboardEvent) {
  31803. if (this.usable()) {
  31804. keyboardEvent.preventDefault();
  31805. keyboardEvent.stopPropagation();
  31806. this.handleKeyUp(keyboardEvent.which);
  31807. }
  31808. }
  31809. }, {
  31810. key: "handleKeyUp",
  31811. value: function handleKeyUp(keyValue) {
  31812. switch (keyValue) {
  31813. case Keys.LEFTARROW:
  31814. case Keys.J:
  31815. case Keys.RIGHTARROW:
  31816. case Keys.L:
  31817. this.rotationAcc.x = 0;
  31818. break;
  31819. case Keys.I:
  31820. case Keys.K:
  31821. this.rotationAcc.y = 0;
  31822. }
  31823. }
  31824. /**
  31825. * 给定角加速度,使开始旋转。 注:类似给定力推
  31826. */
  31827. }, {
  31828. key: "startRotating",
  31829. value: function startRotating(e, t) {
  31830. e && (this.rotationAcc.x = e);
  31831. t && (this.rotationAcc.y = t);
  31832. }
  31833. /**
  31834. * 通过物理定律来终止旋转
  31835. */
  31836. }, {
  31837. key: "stopRotating",
  31838. value: function stopRotating(e) {
  31839. e && (this.rotationSpeed.x = this.rotationSpeed.y = 0);
  31840. this.rotationAcc.set(0, 0);
  31841. }
  31842. }, {
  31843. key: "reset",
  31844. value: function reset() {
  31845. this.pointerDragOn = !1;
  31846. this.rotationAcc.set(0, 0);
  31847. this.rotationSpeed.set(0, 0);
  31848. this.pointers = [];
  31849. }
  31850. /**
  31851. * 序列化,用于保存状态。
  31852. */
  31853. }, {
  31854. key: "toJSON",
  31855. value: function toJSON() {
  31856. var cameraSpatialInfo = {
  31857. camera_position: {
  31858. x: math$1.toPrecision(this.camera.position.x, 4),
  31859. y: math$1.toPrecision(this.camera.position.y, 4),
  31860. z: math$1.toPrecision(this.camera.position.z, 4)
  31861. },
  31862. camera_quaternion: {
  31863. x: math$1.toPrecision(this.camera.quaternion.x, 4),
  31864. y: math$1.toPrecision(this.camera.quaternion.y, 4),
  31865. z: math$1.toPrecision(this.camera.quaternion.z, 4),
  31866. w: math$1.toPrecision(this.camera.quaternion.w, 4)
  31867. }
  31868. };
  31869. return cameraSpatialInfo;
  31870. }
  31871. /**
  31872. * 反序列化,用于读取状态
  31873. */
  31874. }, {
  31875. key: "setStateFromJSON",
  31876. value: function setStateFromJSON(cameraSpatialInfo) {
  31877. this.camera.position.copy(cameraSpatialInfo.camera_position);
  31878. this.camera.quaternion.copy(cameraSpatialInfo.camera_quaternion);
  31879. }
  31880. /**
  31881. * 3D图形变换的坐标系 https://blog.csdn.net/CALL_LKC/article/details/81411034
  31882. */
  31883. /**
  31884. * 许钟文 加 看向某个位置
  31885. * 逐渐看向某个位置 通过改变lon和lat
  31886. * @param {THREE.Vector3} aim
  31887. * @param {THREE.Vector3} cameraPos
  31888. * @param {JSON} option
  31889. */
  31890. }, {
  31891. key: "startLookAt",
  31892. value: function startLookAt(aim, cameraPos, option) {
  31893. var useLonLat = option && (option.lon != void 0 || option.lat != void 0);
  31894. if (!useLonLat) {
  31895. var e = cameraPos ? cameraPos.clone().sub(aim) : this.camera.position.clone().sub(aim),
  31896. o = Math.atan(e.z / e.x);
  31897. o += e.x < 0 ? Math.PI : 0, o += e.x > 0 && e.z < 0 ? 2 * Math.PI : 0;
  31898. var lon = THREE.MathUtils.radToDeg(o) + 180;
  31899. var n = Math.sqrt(e.x * e.x + e.z * e.z),
  31900. i = Math.atan(e.y / n);
  31901. var lat = -THREE.MathUtils.radToDeg(i);
  31902. var add = (lon - this.lon) % 360;
  31903. Math.abs(add) > 180 && (add > 0 ? add -= 360 : add += 360);
  31904. lon = this.lon + add;
  31905. var add = (lat - this.lat) % 360;
  31906. Math.abs(add) > 180 && (add > 0 ? add -= 360 : add += 360);
  31907. lat = this.lat + add;
  31908. }
  31909. var time = 1200,
  31910. speedFuc = easing['easeInOutQuad'];
  31911. if (option != void 0) {
  31912. if (option.soon) {
  31913. this.lon = lon;
  31914. this.lat = lat;
  31915. return;
  31916. }
  31917. if (option.speed) {
  31918. /* var a = Math.abs(lon - this.lon) * Math.PI /180;
  31919. var b = Math.abs(lat - this.lat) * Math.PI /180;
  31920. var c0 = Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.pow(Math.sin(b/2),2));
  31921. var c = Math.asin(c0) * 2; //得到旋转角度 cos(c/2)的方 = cos(a/2)的方 + cos(b/2)的方
  31922. time = c / option.speed; */
  31923. if (useLonLat) {
  31924. var c1 = option.lon ? Math.abs(option.lon - this.lon) : 0;
  31925. var c2 = option.lat ? Math.abs(option.lat - this.lat) : 0;
  31926. var c = c1 + c2;
  31927. } else var c = Math.abs(lon - this.lon) + Math.abs(lat - this.lat);
  31928. time = c / option.speed; //总角度除以速度
  31929. if (option.time) time = Math.min(option.time, time);
  31930. } else if (option.time) time = option.time;
  31931. option.fuc && setTimeout(option.fuc, time); //匀速:
  31932. option.constantSpeed && (speedFuc = null);
  31933. }
  31934. if (useLonLat) {
  31935. if (option.lon) transitions$1.start(lerp.property(this, 'lon', option.lon), time, null, 0, speedFuc);
  31936. if (option.lat) transitions$1.start(lerp.property(this, 'lat', option.lat), time, null, 0, speedFuc);
  31937. } else {
  31938. transitions$1.start(lerp.property(this, 'lon', lon), time, null, 0, speedFuc);
  31939. transitions$1.start(lerp.property(this, 'lat', lat), time, null, 0, speedFuc);
  31940. }
  31941. }
  31942. }]);
  31943. return PanoramaControls;
  31944. }(EventEmitter);
  31945. var ControlActions = {
  31946. NONE: -1,
  31947. ROTATE: 0,
  31948. DOLLY: 1,
  31949. PAN: 2,
  31950. ROTATE_DOLLY: 3,
  31951. PAN_DOLLY: 4
  31952. };
  31953. function _createSuper$V(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$V(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  31954. function _isNativeReflectConstruct$V() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  31955. /** 注:
  31956. * 1.球坐标:更方便计算球面位置 https://en.wikipedia.org/wiki/Spherical_coordinate_system
  31957. * 2.轨道视角OrbitView: 常见的相机视图,相机绕一点(通常为3D模型中心)做球面运动,视点锁定球心 。参见THREE.OrbitControls https://threejs.org/examples/?q=controls#misc_controls_orbit
  31958. * 3.刚体对象:刚体是图形应用物理引擎中重要的物理模型对象,只考虑平移,旋转的物理量。更多参见 Unity Rigibody类 https://docs.unity3d.com/Manual/class-Rigidbody.html
  31959. */
  31960. /**
  31961. * 功能:漫游场景之外视角控制,主要是实现了常见的轨道视角(OrbitView),即拖拽旋转(Rotate),平移(Pan),放大缩小(Zoom),PanoramaControls和FloorplanControls的父类,两个子类的视角是基于轨道视角进行不同的限制实现的
  31962. * 原理:实现轨道视角(通过球坐标计算相机位置,使相机绕一点做球面运动,相机视角保持锁定球心)
  31963. * 注: Rotate 行为是改变相机位于球坐标的位置,引发的旋转,因为视角是锁定球心的
  31964. * Zoom 行为是改变球半径,使相机距不同位置得到不同视图大小,达到缩放
  31965. * Pan 行为是改变球心位置,使轨道偏移达到视图平移效果
  31966. */
  31967. var OutsideControls = /*#__PURE__*/function (_EventEmitter) {
  31968. _inherits(OutsideControls, _EventEmitter);
  31969. var _super = _createSuper$V(OutsideControls);
  31970. function OutsideControls(camera, dom, player) {
  31971. var _this;
  31972. _classCallCheck(this, OutsideControls);
  31973. _this = _super.call(this);
  31974. _this.setAutoPanPosition = function (e, t) {
  31975. var i = new THREE.Vector3(),
  31976. n = new THREE.Vector3();
  31977. return function (e, t) {
  31978. i.copy(this.camera.position), void 0 === e && null === e || i.setX(e), void 0 === t && null === t || i.setZ(t);
  31979. var r = this.camera.position.distanceTo(this.target),
  31980. settings = Vector3.FORWARD.clone().applyQuaternion(this.camera.quaternion);
  31981. this.targetClamped = !1, n.copy(i).addScaledVector(settings, r), this.targetBounds.containsPoint(n) || (this.targetBounds.clampPoint(n, n), i.copy(n).addScaledVector(settings, -r), this.targetClamped = !0), this.autoPanPosition.x = i.x, this.autoPanPosition.z = i.z, this.autoPan && this.stopAutoPanning();
  31982. };
  31983. }();
  31984. _this.camera = camera;
  31985. _this.camera.controls = _assertThisInitialized(_this);
  31986. _this.player = player;
  31987. _this.enabled = !1;
  31988. _this.target = new THREE.Vector3(); //相机视点,轨道视角下也始终是相机轨道所处球坐标的球心
  31989. //Zoom
  31990. _this.targetBounds = new THREE.Box3(); //包围盒,通过碰撞检测用于限定相机的远近范围
  31991. _this.zoomSpeed =
  31992. /* config.isEdit ? 2.3 : */
  31993. 1; //视角缩放的速率
  31994. _this.minDistance = 0; //最小距离,相机离球心的最小距离
  31995. _this.maxDistance = 1 / 0; //最大距离,相机离球心的最大距离
  31996. _this.scale = 1; //缩放比率,zoom操作下的相机轨道半径与正常轨道半径的比率
  31997. _this.dollyStart = new THREE.Vector2(); //推拉镜头操作下记录前一帧的交互点
  31998. _this.dollyEnd = new THREE.Vector2(); //推拉镜头操作下记录当前帧的交互点
  31999. _this.dollyDelta = new THREE.Vector2(); //推拉镜头操作下相机当前帧的瞬时位移
  32000. //Rotate
  32001. _this.noRotateUpDown = !1; //禁用竖直方向的旋转,此处即为禁止相机纬度上的移动,用于俯视视角FloorplanControls
  32002. _this.rotateSpeed = 1; //相机绕球心旋转速率
  32003. _this.keyboardZoomSpeed = 0; //键盘控制下的视角缩放速率
  32004. _this.keyPanSpeed = 7; //键盘控制下的平移速率
  32005. _this.autoRotate = !1; //自动旋转
  32006. _this.autoRotateSpeed = 2; //自动旋转速率
  32007. _this.minPolarAngle = THREE.MathUtils.degToRad(25); //最小纬度,用于限时相机的视角
  32008. _this.maxPolarAngle = THREE.MathUtils.degToRad(65); //最大纬度,用于限时相机的视角
  32009. _this.rotationAcceleration = new THREE.Vector2(); //旋转角加速度
  32010. _this.rotationSpeed = new THREE.Vector2(); //旋转角速度
  32011. _this.rotateStart = new THREE.Vector2(); //旋转操作下记录上次交互事件产生的交互点坐标
  32012. _this.rotateEnd = new THREE.Vector2(); //旋转操作下记录本次交互事件产生的交互点坐标
  32013. _this.rotateDelta = new THREE.Vector2(); //旋转操作下最近两次交互事件之间的瞬时角位移
  32014. _this.phiDelta = 0; //每帧瞬时水平角位移,由rotateDelta.x累加得到
  32015. _this.thetaDelta = 0; //每帧瞬时竖直角位移,由rotateDelta.y累加得到
  32016. _this.rotateCenter = new THREE.Vector2();
  32017. _this.rotateStartVec = new THREE.Vector2();
  32018. _this.rotateEndVec = new THREE.Vector2(); //Pan
  32019. _this.autoPan = !1; //自动平移
  32020. _this.autoPanPosition = new THREE.Vector3(); //自动平移的球心位置
  32021. _this.panAcceleration = new THREE.Vector2(); //平移加速度
  32022. _this.panSpeed = new THREE.Vector2(); //平移速度
  32023. _this.panStart = new THREE.Vector2(); //平移操作下上次交互事件产生的交互点坐标
  32024. _this.panEnd = new THREE.Vector2(); //平移操作下本次交互事件产生的交互点坐标
  32025. _this.panDelta = new THREE.Vector2(); //平移操作下最近两次交互事件之间的瞬时位移
  32026. _this.panOffset = new THREE.Vector3(); //panLeft(), panUp() 用到的瞬时位移
  32027. _this.panVector = new THREE.Vector3(); //每帧平移的总偏移量(交互产生的偏移量),由panDelta累加得到
  32028. _this.offset = new THREE.Vector3(); //每帧最终的有效偏移量(panVector 经过 clamp 操作限制范围后的偏移)
  32029. //注:交互事件瞬时位移(delta)与 帧瞬时位移(offset),产生的原因是事件交互的频率与帧更新的频率不同,eg:mousemove 约8ms < deltaTime 16.6ms
  32030. _this.lastPosition = new THREE.Vector3(); //记录当前帧相机位置
  32031. _this.state = ControlActions.NONE; //当前控制器的模式,决定了mouseAction
  32032. //鼠标行为 在子类中定义
  32033. _this.mouseActions = {};
  32034. _this.touchActions = {};
  32035. _this.lastMoveTime = 0;
  32036. _this.pointersLimit = 2;
  32037. _this.pointers = [];
  32038. _this.angle = 1e-6;
  32039. return _this;
  32040. }
  32041. /**
  32042. * 设定tagetBound
  32043. * @param {THREE.Box3} bound
  32044. */
  32045. _createClass(OutsideControls, [{
  32046. key: "setBounds",
  32047. value: function setBounds(bound) {
  32048. this.targetBounds = bound;
  32049. }
  32050. /**
  32051. * 判断控制器空闲状态
  32052. */
  32053. }, {
  32054. key: "isEngaged",
  32055. value: function isEngaged() {
  32056. return this.state !== ControlActions.NONE;
  32057. }
  32058. /**
  32059. * 水平旋转,通过改变相机球坐标的经度
  32060. * @param {number} angle 旋转的角度(degree)
  32061. */
  32062. }, {
  32063. key: "rotateLeft",
  32064. value: function rotateLeft(angle) {
  32065. void 0 === angle && (angle = this.getAutoRotationAngle());
  32066. this.thetaDelta -= angle; //计算每帧瞬时角位移,与鼠标移动方向相反
  32067. }
  32068. /**
  32069. * 竖直旋转,通过改变相机球坐标的纬度
  32070. * @param {number} angle 旋转的角度(degree)
  32071. */
  32072. }, {
  32073. key: "rotateUp",
  32074. value: function rotateUp(angle) {
  32075. if (!this.noRotateUpDown) {
  32076. void 0 === angle && (angle = this.getAutoRotationAngle());
  32077. this.phiDelta -= angle;
  32078. }
  32079. }
  32080. /**
  32081. * 水平平移,通过改变相机轨道的球心使轨道平移
  32082. */
  32083. }, {
  32084. key: "panLeft",
  32085. value: function panLeft(e) {
  32086. if (isNaN(e)) e = 0; //防止floorplan模式屏幕宽度为0过后黑屏
  32087. var t = this.camera.matrix.elements; //从相机矩阵提取计算相机方向向量于XZ平面的投影
  32088. this.panOffset.set(t[0], 0, t[2]).normalize(), this.panOffset.multiplyScalar(-e), this.panVector.add(this.panOffset);
  32089. }
  32090. }, {
  32091. key: "panUp",
  32092. value: function panUp(e) {
  32093. if (isNaN(e)) e = 0; //防止floorplan模式屏幕宽度为0过后黑屏
  32094. var t = this.camera.matrix.elements;
  32095. this.panOffset.set(t[4], 0, t[6]).normalize(), this.panOffset.multiplyScalar(-e), this.panVector.add(this.panOffset);
  32096. }
  32097. }, {
  32098. key: "stopAutoPanning",
  32099. value: function stopAutoPanning() {
  32100. var e = this.autoPan;
  32101. this.autoPan = !1, this.emit(this.targetClamped ? ControlEvents.AutoPanClamped : e ? ControlEvents.AutoPanInterrupt : ControlEvents.AutoPanComplete);
  32102. }
  32103. /**
  32104. * 俯视视角下的缩小
  32105. */
  32106. }, {
  32107. key: "dollyIn",
  32108. value: function dollyIn(e) {
  32109. void 0 === e && (e = this.getZoomScale()), this.scale /= e;
  32110. }
  32111. /**
  32112. * 俯视视角下的放大
  32113. */
  32114. }, {
  32115. key: "dollyOut",
  32116. value: function dollyOut(e) {
  32117. void 0 === e && (e = this.getZoomScale()); //e<1时是放大 反之缩小
  32118. this.scale *= e;
  32119. }
  32120. /**
  32121. * 更新Pan操作,主要是用刚体运动规则计算每一帧的瞬时球心坐标
  32122. */
  32123. }, {
  32124. key: "updatePan",
  32125. value: function updatePan(e) {
  32126. this.panSpeed.multiplyScalar(1 - settings$3.panFriction).addScaledVector(this.panAcceleration, settings$3.panAccelerationOutside * e); //计算球心移动的瞬时速度
  32127. this.pan(-this.panSpeed.x, this.panSpeed.y); //球心移动的瞬时坐标
  32128. //自动Pan到一个设定的位置
  32129. if (this.autoPan) {
  32130. var offset = new THREE.Vector3().copy(this.autoPanPosition).sub(this.camera.position); //根据当前位置算出偏移矢量
  32131. offset.setY(0).clampLength(0, 50 * e); //位移忽略Y轴
  32132. this.target.add(offset); //得到新的球心target
  32133. this.camera.position.add(offset); //相应地相机的平移量与球心一致,于是相机移到新的球面轨道
  32134. if (this.autoPanPosition.x === this.camera.position.x && this.autoPanPosition.z === this.camera.position.z) {
  32135. //如果相机位置与要Pan的位置一致,没必要进行自动Pan
  32136. this.autoPan = !1;
  32137. this.stopAutoPanning();
  32138. }
  32139. }
  32140. }
  32141. /**
  32142. * 主循环更新,更新轨道视角OrbitView 的 Roatate, Pan, Zoom 行为参数,根本上是计算球坐标下相机的球面轨道坐标,球心位置,运动规律符合刚体运动的物理法则
  32143. * 注:刚体是图形应用物理引擎中重要的物理模型对象,借助牛顿第二定律进行计算。更多参见 Unity Rigibody类 https://docs.unity3d.com/Manual/class-Rigidbody.html
  32144. */
  32145. }, {
  32146. key: "update",
  32147. value: function update(e, type) {
  32148. if (this.updateForCad && !this.screenshot) {
  32149. return;
  32150. }
  32151. e || (e = 1 / 60); // e 即是 帧间隔时间deltaTime 用于稳定物理运动而不受帧率影响,更多请见 https://blog.csdn.net/ChinarCSDN/article/details/82914420 或 搜索Unity Time类
  32152. var friction = Math.min(1, settings$3.rotationFriction * e * 60); //add 如果deltaTime > 1/ 60 (比较卡),就增加rotationFriction, 以防止转动过久
  32153. this.rotationSpeed.multiplyScalar(1 - friction).addScaledVector(this.rotationAcceleration, settings$3.rotationAccelerationOutside * e); //计算瞬时角速度
  32154. this.rotateLeft(-this.rotationSpeed.x); //根据角速度进行角位移
  32155. this.noRotateUpDown || this.rotateUp(this.rotationSpeed.y);
  32156. this.updatePan(e); //计算 球心坐标(target)到 相机坐标(cameraPosition)的向量(offset),包含方向和距离信息
  32157. var cameraPosition = this.camera.position;
  32158. this.offset.copy(cameraPosition).sub(this.target); //Rotate
  32159. var lon = Math.atan2(this.offset.x, this.offset.z),
  32160. //根据offset与z轴夹角算出经度lon,
  32161. lat = Math.atan2(Math.sqrt(this.offset.x * this.offset.x + this.offset.z * this.offset.z), this.offset.y); //与y轴夹角算出纬度lat
  32162. this.autoRotate && this.rotateLeft(this.getAutoRotationAngle()); //计算自动旋转的每帧角位移thetaDelta
  32163. lon += this.thetaDelta; //原本角位移与每帧角位移累加
  32164. lat += this.phiDelta; //原本角位移与每帧角位移累加
  32165. lat = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, lat)); //纬度限制在预定义的范围内,进而限制轨道相机的俯仰角
  32166. lat = Math.max(this.angle, Math.min(Math.PI - this.angle, lat));
  32167. this.lon = lon, this.lat = lat; //xzw add for cad compass
  32168. //Zoom
  32169. var radius = this.updateZoom(); //获取Zoom操作后的球半径
  32170. radius = Math.max(this.minDistance, Math.min(this.maxDistance, radius)); //半径限制在自定义范围内
  32171. //Pan 更新球轨道球心位置
  32172. this.target.add(this.panVector); //球心位置加上Pan操作后球心的偏移向量panVector
  32173. this.targetBounds.clampPoint(this.target, this.target); //最终球心坐标限制在自定义BoudingBox的立方体范围内。
  32174. //新的半径求新的offset(球心->相机),用于得到新轨道下相机的位置。
  32175. //注:相机位置为什么不直接加上panVector? 因为此情况下相机偏移不等于panVector
  32176. //1.Zoom改变球半径
  32177. //2.Pan操作被限制在自定义范围,球心偏移可能小于panVector
  32178. this.offset.x = radius * Math.sin(lat) * Math.sin(lon);
  32179. this.offset.y = radius * Math.cos(lat);
  32180. this.offset.z = radius * Math.sin(lat) * Math.cos(lon); //根据新的offset与球心得到相机新的轨道坐标 //Position
  32181. cameraPosition.copy(this.target).add(this.offset); //轨道视角下相机视点锁定球心 //Rotation
  32182. this.camera.lookAt(this.target); //重置 防止干扰其他地方的引用
  32183. this.thetaDelta = 0;
  32184. this.phiDelta = 0;
  32185. this.scale = 1;
  32186. this.panVector.set(0, 0, 0); //记录当前帧相机的位置
  32187. if (this.lastPosition.distanceTo(this.camera.position) > 0) {
  32188. this.lastPosition.copy(this.camera.position);
  32189. }
  32190. }
  32191. /**
  32192. * 角速度 角度转弧度
  32193. */
  32194. }, {
  32195. key: "getAutoRotationAngle",
  32196. value: function getAutoRotationAngle() {
  32197. return 2 * Math.PI / 60 / 60 * this.autoRotateSpeed;
  32198. }
  32199. }, {
  32200. key: "getZoomScale",
  32201. value: function getZoomScale() {
  32202. return Math.pow(0.95, this.zoomSpeed);
  32203. }
  32204. /**
  32205. * 鼠标点击行为
  32206. */
  32207. }, {
  32208. key: "onMouseDown",
  32209. value: function onMouseDown(mouseEvent) {
  32210. if (this.enabled) {
  32211. mouseEvent.preventDefault(); // this.player.model._3dTilesRuntime.pauseTilesetUpdate(true)
  32212. // this.player.model._3dTilesRuntime.clearLoadingTiles()
  32213. this.stopAutoPanning();
  32214. this.mouseDown = !0;
  32215. this.state = this.mouseActions[mouseEvent.button];
  32216. switch (this.state) {
  32217. case ControlActions.ROTATE:
  32218. this.rotateStart.set(mouseEvent.clientX, mouseEvent.clientY); //this.rotateStart.set(mouseEvent.clientX, this.noRotateUpDown ? 0 : mouseEvent.clientY);
  32219. this.rotationSpeed.set(0, 0);
  32220. if (this.noRotateUpDown) {
  32221. //floorplan
  32222. this.rotateCenter = convertTool.getPos2d(this.target, this.player).pos;
  32223. this.rotateStartVec.subVectors(this.rotateStart, this.rotateCenter);
  32224. }
  32225. break;
  32226. case ControlActions.DOLLY:
  32227. this.dollyStart.set(mouseEvent.clientX, mouseEvent.clientY);
  32228. break;
  32229. case ControlActions.PAN:
  32230. this.panStart.set(mouseEvent.clientX, mouseEvent.clientY);
  32231. }
  32232. this.emit(ControlEvents.InputStart, 'mouse');
  32233. }
  32234. } //控制模型
  32235. }, {
  32236. key: "onMouseMove",
  32237. value: function onMouseMove(mouseEvent) {
  32238. if (this.enabled && this.mouseDown && 0 !== mouseEvent.buttons) {
  32239. mouseEvent.preventDefault();
  32240. switch (this.state) {
  32241. case ControlActions.ROTATE:
  32242. this.rotateEnd.set(mouseEvent.clientX, mouseEvent.clientY);
  32243. if (this.noRotateUpDown) {
  32244. //floorplan
  32245. this.rotateEndVec.subVectors(this.rotateEnd, this.rotateCenter);
  32246. var angle = math$1.getVec2Angle(this.rotateStartVec, this.rotateEndVec);
  32247. var rotateEndVec_ = new THREE.Vector3(this.rotateEndVec.x, this.rotateEndVec.y, 0);
  32248. var rotateStartVec_ = new THREE.Vector3(this.rotateStartVec.x, this.rotateStartVec.y, 0);
  32249. if (rotateEndVec_.clone().cross(rotateStartVec_).z < 0) {
  32250. angle *= -1;
  32251. }
  32252. this.rotateLeft(angle);
  32253. this.rotateStartVec.copy(this.rotateEndVec);
  32254. } else {
  32255. //dollhouse
  32256. this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart);
  32257. this.rotateLeft(2 * Math.PI * this.rotateDelta.x / this.player.domElement.clientWidth * this.rotateSpeed);
  32258. this.rotateUp(2 * Math.PI * this.rotateDelta.y / this.player.domElement.clientHeight * this.rotateSpeed);
  32259. this.rotateStart.copy(this.rotateEnd);
  32260. }
  32261. break;
  32262. case ControlActions.DOLLY:
  32263. this.dollyEnd.set(mouseEvent.clientX, mouseEvent.clientY), this.dollyDelta.subVectors(this.dollyEnd, this.dollyStart);
  32264. var t = this.dollyDelta.y > 0 ? this.dollyIn : this.dollyOut;
  32265. t.call(this), this.dollyStart.copy(this.dollyEnd);
  32266. break;
  32267. case ControlActions.PAN:
  32268. this.panEnd.set(mouseEvent.clientX, mouseEvent.clientY);
  32269. this.panDelta.subVectors(this.panEnd, this.panStart);
  32270. this.pan(this.panDelta.x, this.panDelta.y);
  32271. this.panStart.copy(this.panEnd);
  32272. }
  32273. this.emit(ControlEvents.Move, 'mouse');
  32274. this.lastMoveTime = mouseEvent.timeStamp;
  32275. this.update(); //同步
  32276. var info = {};
  32277. info.quaternion = {
  32278. _w: this.camera.quaternion._w,
  32279. _x: this.camera.quaternion._x,
  32280. _y: this.camera.quaternion._y,
  32281. _z: this.camera.quaternion._z
  32282. };
  32283. info.position = {
  32284. x: this.camera.position.x,
  32285. y: this.camera.position.y,
  32286. z: this.camera.position.z
  32287. };
  32288. info.target = {
  32289. x: this.target.x,
  32290. y: this.target.y,
  32291. z: this.target.z
  32292. };
  32293. this.player.emit(PlayerEvents.MoveModel, {
  32294. info: info,
  32295. mode: this.player.mode,
  32296. type: 'moveModel'
  32297. });
  32298. }
  32299. }
  32300. }, {
  32301. key: "onMouseUp",
  32302. value: function onMouseUp(mouseEvent) {
  32303. if (this.enabled) {
  32304. this.mouseDown = !1;
  32305. this.state = ControlActions.NONE;
  32306. if ('mouseover' !== mouseEvent.type) {
  32307. if (mouseEvent.timeStamp > this.lastMoveTime + 100) {
  32308. this.rotationSpeed.set(0, 0);
  32309. this.rotationAcceleration.set(0, 0);
  32310. } else {
  32311. this.rotationAcceleration.set(-this.rotateDelta.x, this.rotateDelta.y);
  32312. }
  32313. this.update();
  32314. this.rotationAcceleration.set(0, 0);
  32315. this.rotateDelta.set(0, 0);
  32316. }
  32317. }
  32318. }
  32319. }, {
  32320. key: "onMouseOver",
  32321. value: function onMouseOver(mouseEvent) {
  32322. 0 !== mouseEvent.which && 0 !== mouseEvent.buttons || this.onMouseUp(mouseEvent);
  32323. }
  32324. }, {
  32325. key: "onMouseWheel",
  32326. value: function onMouseWheel(wheelEvent) {
  32327. if (this.enabled && settings$3.useWheel) {
  32328. this.emit(ControlEvents.Move, 'wheel');
  32329. var t = wheelEvent.wheelDelta || -wheelEvent.detail;
  32330. var func = this.dollyIn;
  32331. if (t > 0) {
  32332. func = this.dollyOut;
  32333. }
  32334. func.call(this);
  32335. this.update(); //同步
  32336. var info = {}; //俯视图情况
  32337. if (this.player.mode === Viewmode$1.FLOORPLAN) {
  32338. info.scale = this.absoluteScale;
  32339. this.player.emit(PlayerEvents.MoveModel, {
  32340. info: info,
  32341. mode: Viewmode$1.FLOORPLAN,
  32342. type: 'moveModel'
  32343. });
  32344. } //dollhouse情况
  32345. else if (this.player.mode === Viewmode$1.DOLLHOUSE) {
  32346. info.quaternion = this.camera.quaternion;
  32347. info.position = this.camera.position;
  32348. info.target = this.target;
  32349. this.player.emit(PlayerEvents.MoveModel, {
  32350. info: info,
  32351. mode: Viewmode$1.DOLLHOUSE,
  32352. type: 'moveModel'
  32353. });
  32354. }
  32355. }
  32356. }
  32357. }, {
  32358. key: "onKeyDown",
  32359. value: function onKeyDown(keyboardEvent) {
  32360. if (this.enabled) {
  32361. if (keyboardEvent.metaKey || keyboardEvent.ctrlKey) ; else {
  32362. keyboardEvent.preventDefault();
  32363. this.handleKeyDown(keyboardEvent.which);
  32364. }
  32365. }
  32366. }
  32367. }, {
  32368. key: "navRotationAcc",
  32369. value: function navRotationAcc(e, t) {
  32370. 'y' === e ? this.noRotateUpDown ? this.keyboardZoomSpeed = t : this.rotationAcceleration.y = t : this.rotationAcceleration.x = t;
  32371. }
  32372. }, {
  32373. key: "navPanAcc",
  32374. value: function navPanAcc(e, t) {
  32375. this.stopAutoPanning(), this.panAcceleration[e] = t;
  32376. }
  32377. }, {
  32378. key: "handleKeyDown",
  32379. value: function handleKeyDown(keyValue) {
  32380. var t = !0;
  32381. switch (keyValue) {
  32382. case Keys.UPARROW:
  32383. case Keys.I:
  32384. this.navRotationAcc('y', 1);
  32385. break;
  32386. case Keys.DOWNARROW:
  32387. case Keys.K:
  32388. this.navRotationAcc('y', -1);
  32389. break;
  32390. case Keys.LEFTARROW:
  32391. case Keys.J:
  32392. this.navRotationAcc('x', -1);
  32393. break;
  32394. case Keys.RIGHTARROW:
  32395. case Keys.L:
  32396. this.navRotationAcc('x', 1);
  32397. break;
  32398. case Keys.W:
  32399. this.navPanAcc('y', 1);
  32400. break;
  32401. case Keys.S:
  32402. this.navPanAcc('y', -1);
  32403. break;
  32404. case Keys.A:
  32405. this.navPanAcc('x', -1);
  32406. break;
  32407. case Keys.D:
  32408. this.navPanAcc('x', 1);
  32409. break;
  32410. default:
  32411. t = !1;
  32412. }
  32413. t && this.emit(ControlEvents.Move, 'key');
  32414. }
  32415. }, {
  32416. key: "onKeyUp",
  32417. value: function onKeyUp(keyboardEvent) {
  32418. if (this.enabled) {
  32419. keyboardEvent.preventDefault();
  32420. keyboardEvent.stopPropagation();
  32421. this.handleKeyUp(keyboardEvent.which);
  32422. }
  32423. }
  32424. }, {
  32425. key: "handleKeyUp",
  32426. value: function handleKeyUp(keyValue) {
  32427. switch (keyValue) {
  32428. case Keys.I:
  32429. case Keys.K:
  32430. case Keys.UPARROW:
  32431. case Keys.DOWNARROW:
  32432. this.keyboardZoomSpeed = 0, this.rotationAcceleration.y = 0;
  32433. break;
  32434. case Keys.J:
  32435. case Keys.L:
  32436. case Keys.LEFTARROW:
  32437. case Keys.RIGHTARROW:
  32438. this.rotationAcceleration.x = 0;
  32439. break;
  32440. case Keys.S:
  32441. case Keys.W:
  32442. this.panAcceleration.y = 0;
  32443. break;
  32444. case Keys.A:
  32445. case Keys.D:
  32446. this.panAcceleration.x = 0;
  32447. }
  32448. }
  32449. }, {
  32450. key: "onTouchStart",
  32451. value: function onTouchStart(pointerEvent) {
  32452. if (this.enabled || this.state === ControlActions.NONE) {
  32453. pointerEvent.preventDefault();
  32454. pointerEvent.stopPropagation();
  32455. this.stopAutoPanning();
  32456. var dolly = function () {
  32457. if (2 === pointerEvent.touches.length) {
  32458. var t = pointerEvent.touches[0].pageX - pointerEvent.touches[1].pageX,
  32459. i = pointerEvent.touches[0].pageY - pointerEvent.touches[1].pageY;
  32460. this.dollyStart.set(t, i);
  32461. }
  32462. }.bind(this),
  32463. pan = function () {
  32464. this.panStart.set(common.average(pointerEvent.touches, 'pageX'), common.average(pointerEvent.touches, 'pageY'));
  32465. }.bind(this),
  32466. rotate = function () {
  32467. if (this.noRotateUpDown) {
  32468. //floorplan
  32469. if (!pointerEvent.touches[1]) {
  32470. console.error('!pointerEvent.touches[0]11');
  32471. }
  32472. var touch0 = new THREE.Vector2(pointerEvent.touches[0].pageX, pointerEvent.touches[0].pageY);
  32473. var touch1 = new THREE.Vector2(pointerEvent.touches[1].pageX, pointerEvent.touches[1].pageY);
  32474. this.rotateStartVec.subVectors(touch0, touch1);
  32475. this.rotateStart = touch0; //上次的touch0
  32476. this.rotateCenter = convertTool.getPos2d(this.target, this.player).pos; //target在二维上的位置, 是旋转和缩放的中心
  32477. } else {
  32478. //dollhouse
  32479. this.rotateStart.set(common.average(pointerEvent.touches, 'pageX'), common.average(pointerEvent.touches, 'pageY'));
  32480. }
  32481. }.bind(this);
  32482. this.state = this.touchActions[pointerEvent.touches.length];
  32483. switch (this.state) {
  32484. case ControlActions.PAN_DOLLY:
  32485. //switch语句原理是跳转到caseX位置执行剩下的语句,直到最后或者遇见break为止
  32486. dolly();
  32487. case ControlActions.PAN:
  32488. pan();
  32489. break;
  32490. case ControlActions.ROTATE_DOLLY:
  32491. dolly();
  32492. case ControlActions.ROTATE:
  32493. rotate();
  32494. //floorplan 单指会执行 2 双指34
  32495. //dollhouse 单指会执行 4 双指1
  32496. }
  32497. this.rotationSpeed.set(0, 0);
  32498. this.emit(ControlEvents.InputStart, 'touch');
  32499. }
  32500. }
  32501. }, {
  32502. key: "onTouchMove",
  32503. value: function onTouchMove(pointerEvent) {
  32504. if (!pointerEvent.changedTouches) return; //#43188 测试发现有时候pointEvent会卡住,暂时只处理touchEvent对象
  32505. if (this.enabled && this.state !== ControlActions.NONE) {
  32506. var stateNow = this.touchActions[pointerEvent.touches.length];
  32507. if (stateNow != this.state) {
  32508. //iphoneX 在touchmove到别的ui时的时touches个数会与touchstart时不一样
  32509. return; //console.error('state更改')
  32510. }
  32511. pointerEvent.preventDefault();
  32512. pointerEvent.stopPropagation(); //console.log('onTouchMove',pointerEvent.touches)
  32513. //缩放直接修改相机projectionMatrix (currentScale), 平移和旋转则修改相机modelMatrix
  32514. var scale = function () {
  32515. //根据双指距离直接缩放(假定手指所在的三维位置在缩放后应该不变,所以缩放比率为手指在屏幕上的距离变化)
  32516. var t = pointerEvent.touches[0].pageX - pointerEvent.touches[1].pageX,
  32517. i = pointerEvent.touches[0].pageY - pointerEvent.touches[1].pageY;
  32518. this.dollyEnd.set(t, i);
  32519. var scale = this.dollyEnd.length() / this.dollyStart.length();
  32520. if (scale > 1) {
  32521. //放大
  32522. //this.dollyOut(1/scale);
  32523. this.dollyIn(scale); //console.log("放大"+scale)
  32524. } else {
  32525. //this.dollyIn(scale);
  32526. this.dollyOut(1 / scale); //console.log("缩小"+scale)
  32527. } //dollyLen > 0 ? this.dollyOut(1 + dollyLen / 500) : this.dollyIn(1 - dollyLen / 500),
  32528. this.dollyStart.copy(this.dollyEnd);
  32529. return scale;
  32530. }.bind(this),
  32531. pan = function () {
  32532. // 平移
  32533. if (pointerEvent.touches.length == 0) return; //手机从按钮处滑动到canvas时会有这种情况
  32534. this.panEnd.set(common.average(pointerEvent.touches, 'pageX'), common.average(pointerEvent.touches, 'pageY'));
  32535. this.panDelta.subVectors(this.panEnd, this.panStart);
  32536. window.logEnable && console.log('delta', Array.from(pointerEvent.touches).map(function (e) {
  32537. return [e.pageX.toFixed(1), e.pageY.toFixed(1)];
  32538. }), pointerEvent.touches instanceof Array, pointerEvent.currentTarget.className + pointerEvent.currentTarget.nodeName);
  32539. this.pan(this.panDelta.x, this.panDelta.y);
  32540. this.panStart.copy(this.panEnd);
  32541. this.rotateDelta.set(0, 0);
  32542. }.bind(this),
  32543. panTwoPointers = function (scale, angle) {
  32544. // 双指平移。 平移向量为 上次的touch0到旋转中心的向量 加上 旋转中心到绕中心旋转后的新的touch0的向量的scale分之一。 (先把相机平移到上次的touch0然后旋转后退到合适的位置,将位移量的逆和上述几个向量作比较得出)
  32545. //获取touch0在按照scale, angle的方式改变后的位置到实际手指移动到的新的位置的位移量
  32546. var touch0 = new THREE.Vector2(pointerEvent.touches[0].pageX, pointerEvent.touches[0].pageY);
  32547. var rotResult = touch0.clone().rotateAround(this.rotateCenter, angle);
  32548. var Op0 = rotResult.clone().sub(this.rotateCenter).multiplyScalar(1 / scale);
  32549. var Op1 = this.rotateCenter.clone().sub(this.rotateStart);
  32550. this.panDelta.addVectors(Op0, Op1);
  32551. this.pan(this.panDelta.x, this.panDelta.y);
  32552. this.rotateStart = touch0;
  32553. }.bind(this),
  32554. rot = function () {
  32555. if (this.noRotateUpDown) {
  32556. //floorplan
  32557. var touch0 = new THREE.Vector2(pointerEvent.touches[0].pageX, pointerEvent.touches[0].pageY);
  32558. var touch1 = new THREE.Vector2(pointerEvent.touches[1].pageX, pointerEvent.touches[1].pageY);
  32559. this.rotateEndVec.subVectors(touch0, touch1); //当前双指角度
  32560. var angle = math$1.getVec2Angle(this.rotateStartVec, this.rotateEndVec); //和上次的双指角度求夹角,即为旋转角度
  32561. var rotateEndVec_ = new THREE.Vector3(this.rotateEndVec.x, this.rotateEndVec.y, 0);
  32562. var rotateStartVec_ = new THREE.Vector3(this.rotateStartVec.x, this.rotateStartVec.y, 0);
  32563. if (rotateEndVec_.clone().cross(rotateStartVec_).z < 0) {
  32564. angle *= -1;
  32565. }
  32566. this.rotateLeft(angle);
  32567. this.rotateStartVec.copy(this.rotateEndVec);
  32568. return angle;
  32569. } else {
  32570. //dollhouse还是之前的方式:单指旋转,根据滑动距离来旋转
  32571. this.rotateEnd.set(common.average(pointerEvent.touches, 'pageX'), common.average(pointerEvent.touches, 'pageY'));
  32572. this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart);
  32573. this.rotateLeft(2 * Math.PI * this.rotateDelta.x / this.player.domElement.clientWidth * this.rotateSpeed);
  32574. this.rotateUp(2 * Math.PI * this.rotateDelta.y / this.player.domElement.clientHeight * this.rotateSpeed);
  32575. this.rotateStart.copy(this.rotateEnd);
  32576. }
  32577. }.bind(this);
  32578. /* rotOrScale = function() {
  32579. console.log('rotOrScale')
  32580. if (2 === pointerEvent.touches.length) {
  32581. var i = window.devicePixelRatio || 1
  32582. , r = pointerEvent.touches[1].pageX - pointerEvent.touches[0].pageX
  32583. , s = pointerEvent.touches[1].pageY - pointerEvent.touches[0].pageY
  32584. , l = Math.sqrt(r * r + s * s)
  32585. , h = Math.abs(this.dollyStart.length() - l);
  32586. //修改为可以同时缩放平移旋转
  32587. if (h > settings.input.touchMoveThreshold * i)
  32588. this.state = ControlActions.DOLLY,
  32589. scale();
  32590. else {
  32591. var u = common.average(pointerEvent.touches, "pageX")
  32592. , d = common.average(pointerEvent.touches, "pageY")
  32593. , p = this.rotateDelta.set(u, d).sub(this.rotateStart).length();
  32594. if(p > settings.input.touchMoveThreshold)
  32595. {
  32596. this.state = ControlActions.ROTATE;
  32597. this.rotateStart.set(u, d);
  32598. rot();
  32599. }
  32600. }
  32601. }
  32602. }.bind(this); */
  32603. switch (this.state //floorplan会执行23,dollhouse会执行125
  32604. ) {
  32605. case ControlActions.PAN_DOLLY:
  32606. scale();
  32607. case ControlActions.PAN:
  32608. pan();
  32609. break;
  32610. case ControlActions.ROTATE_DOLLY:
  32611. //floorplan双指改为可以缩放、旋转、 平移
  32612. //rotOrScale();
  32613. var s = scale();
  32614. var angle = rot();
  32615. panTwoPointers(s, angle);
  32616. break;
  32617. case ControlActions.DOLLY:
  32618. scale();
  32619. break;
  32620. case ControlActions.ROTATE:
  32621. rot();
  32622. break;
  32623. default:
  32624. this.state = ControlActions.NONE;
  32625. } //floorplan 单指会执行 2 双指3
  32626. //dollhouse 单指会执行 5 双指12
  32627. this.lastMoveTime = pointerEvent.timeStamp;
  32628. this.emit(ControlEvents.Move, 'touch'); //同步
  32629. var info = {
  32630. scale: this.absoluteScale
  32631. };
  32632. info.quaternion = {
  32633. _w: this.camera.quaternion._w,
  32634. _x: this.camera.quaternion._x,
  32635. _y: this.camera.quaternion._y,
  32636. _z: this.camera.quaternion._z
  32637. };
  32638. info.position = {
  32639. x: this.camera.position.x,
  32640. y: this.camera.position.y,
  32641. z: this.camera.position.z
  32642. };
  32643. info.target = {
  32644. x: this.target.x,
  32645. y: this.target.y,
  32646. z: this.target.z
  32647. };
  32648. this.player.emit(PlayerEvents.MoveModel, {
  32649. info: info,
  32650. mode: this.player.mode,
  32651. type: 'moveModel'
  32652. });
  32653. }
  32654. }
  32655. }, {
  32656. key: "onTouchEnd",
  32657. value: function onTouchEnd(pointerEvent) {
  32658. if (this.enabled) {
  32659. if (this.state === ControlActions.ROTATE) {
  32660. if (pointerEvent.timeStamp > this.lastMoveTime + 100) {
  32661. this.rotationSpeed.set(0, 0);
  32662. this.rotationAcceleration.set(0, 0);
  32663. } else {
  32664. this.rotationAcceleration.set(-this.rotateDelta.x, this.rotateDelta.y);
  32665. }
  32666. }
  32667. this.state = ControlActions.NONE;
  32668. this.update();
  32669. this.rotationAcceleration.set(0, 0);
  32670. this.rotateDelta.set(0, 0);
  32671. }
  32672. }
  32673. }, {
  32674. key: "onPointerDown",
  32675. value: function onPointerDown(pointerEvent) {
  32676. if (this.enabled) {
  32677. if ('touch' === pointerEvent.pointerType) {
  32678. if (this.pointers.length < this.pointersLimit && !this.pointers.find(function (pointer) {
  32679. return pointer.id == pointerEvent.pointerId;
  32680. })) {
  32681. this.pointers.push({
  32682. id: pointerEvent.pointerId,
  32683. pageX: pointerEvent.pageX,
  32684. pageY: pointerEvent.pageY
  32685. });
  32686. }
  32687. pointerEvent.touches = this.pointers;
  32688. this.onTouchStart(pointerEvent);
  32689. }
  32690. this.emit(ControlEvents.InputStart, 'pointer');
  32691. }
  32692. }
  32693. }, {
  32694. key: "onPointerMove",
  32695. value: function onPointerMove(pointerEvent) {
  32696. if (this.enabled && 'touch' === pointerEvent.pointerType) {
  32697. this.pointers.forEach(function (t) {
  32698. if (pointerEvent.pointerId === t.id) {
  32699. t.pageX = pointerEvent.pageX;
  32700. t.pageY = pointerEvent.pageY;
  32701. t.pressed = pointerEvent.pressed;
  32702. }
  32703. });
  32704. pointerEvent.touches = this.pointers; //转化为onTouchMove的touches
  32705. //console.log('onPointerMove',pointerEvent.touches)
  32706. this.onTouchMove(pointerEvent);
  32707. }
  32708. }
  32709. }, {
  32710. key: "onPointerUp",
  32711. value: function onPointerUp(pointerEvent) {
  32712. if (this.enabled && 'touch' === pointerEvent.pointerType) {
  32713. /* this.pointers.forEach(function(t, i) {
  32714. pointerEvent.pointerId === t.id && this.pointers.splice(i, 1)//这样肯定bug
  32715. }
  32716. .bind(this)); */
  32717. this.pointers = this.pointers.filter(function (pointer) {
  32718. return pointer.id != pointerEvent.pointerId;
  32719. });
  32720. pointerEvent.touches = this.pointers;
  32721. this.onTouchEnd(pointerEvent);
  32722. }
  32723. }
  32724. }, {
  32725. key: "reset",
  32726. value: function reset() {
  32727. this.state = ControlActions.NONE, this.stopAutoPanning(), this.rotationSpeed.set(0, 0), this.rotationAcceleration.set(0, 0), this.panSpeed.set(0, 0), this.panAcceleration.set(0, 0);
  32728. }
  32729. }, {
  32730. key: "toJSON",
  32731. value: function toJSON() {
  32732. var cameraSpatialInfo = {
  32733. camera_position: {
  32734. x: math$1.toPrecision(this.camera.position.x, 4),
  32735. y: math$1.toPrecision(this.camera.position.y, 4),
  32736. z: math$1.toPrecision(this.camera.position.z, 4)
  32737. },
  32738. camera_quaternion: {
  32739. x: math$1.toPrecision(this.camera.quaternion.x, 4),
  32740. y: math$1.toPrecision(this.camera.quaternion.y, 4),
  32741. z: math$1.toPrecision(this.camera.quaternion.z, 4),
  32742. w: math$1.toPrecision(this.camera.quaternion.w, 4)
  32743. }
  32744. };
  32745. return cameraSpatialInfo;
  32746. }
  32747. }]);
  32748. return OutsideControls;
  32749. }(EventEmitter);
  32750. function _createSuper$U(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$U(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  32751. function _isNativeReflectConstruct$U() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  32752. /**
  32753. * 迷你模式相机控制器
  32754. * 主要是在轨道视角的基础上限制Pan操作的范围
  32755. */
  32756. var DollhouseControls = /*#__PURE__*/function (_OutsideControls) {
  32757. _inherits(DollhouseControls, _OutsideControls);
  32758. var _super = _createSuper$U(DollhouseControls);
  32759. function DollhouseControls(camera, dom, player) {
  32760. var _this;
  32761. _classCallCheck(this, DollhouseControls);
  32762. //OutsideControls.call(this, camera);
  32763. _this = _super.call(this, camera, dom, player);
  32764. _this.minPolarAngle = settings$3.dollhouseDefault.minPolarAngle; //最小纬度
  32765. _this.maxPolarAngle = settings$3.dollhouseDefault.maxPolarAngle; //最大纬度
  32766. _this.minDistance = settings$3.dollhouseDefault.minDistance; //最小球半径
  32767. _this.maxDistance = settings$3.dollhouseDefault.maxDistance; //最大球半径
  32768. _this.adjustedMinDistance = _this.minDistance;
  32769. _this.adjustedMaxDistance = _this.maxDistance; //鼠标所交互的界面元素
  32770. _this.dom = dom;
  32771. _this.mode = 'model'; // "security"
  32772. //鼠标、触点行为
  32773. _this.mouseActions[MouseButton.LEFT] = ControlActions.ROTATE;
  32774. _this.mouseActions[MouseButton.MIDDLE] = ControlActions.DOLLY;
  32775. _this.mouseActions[MouseButton.RIGHT] = ControlActions.PAN;
  32776. _this.touchActions[1] = ControlActions.ROTATE;
  32777. _this.touchActions[2] = ControlActions.PAN_DOLLY;
  32778. return _this;
  32779. }
  32780. /**
  32781. * 平移操作
  32782. */
  32783. _createClass(DollhouseControls, [{
  32784. key: "pan",
  32785. value: function pan(panSpeedX, panSpeedY) {
  32786. this.camera.updateMatrix();
  32787. var len = Math.max(this.camera.position.clone().sub(this.target).length(), this.mode == 'security' ? 1 : 0);
  32788. len *= Math.tan(this.camera.fov / 2 * Math.PI / 180);
  32789. this.panLeft(2 * panSpeedX * len / this.player.domElement.clientWidth);
  32790. this.panUp(-2 * panSpeedY * len / this.player.domElement.clientHeight);
  32791. }
  32792. /**
  32793. * 缩放,更改轨道半径
  32794. */
  32795. }, {
  32796. key: "updateZoom",
  32797. value: function updateZoom() {
  32798. var offsetLen = this.offset.length(); //当前轨道半径,见父类OutsideControls
  32799. return offsetLen * this.scale;
  32800. }
  32801. /**
  32802. * 设置Zoom的碰撞范围,使相机在合适的范围内缩放
  32803. * 理论上的合理范围:[模型边界半径, 世界最大范围] 与 自定义范围:[settings.dollhouseDefault.minDistance, settings.dollhouseDefault.maxDistance] 的交集
  32804. */
  32805. }, {
  32806. key: "setZoomBounds",
  32807. value: function setZoomBounds(boundingBox) {
  32808. boundingBox.min.distanceTo(boundingBox.max); //计算(模型)包围盒对角,得到模型的外边界范围
  32809. //this.suitableDistance = distance/2 / Math.tan(THREE.Math.degToRad(70/2))
  32810. var distanceHorizon = boundingBox.min.distanceTo(boundingBox.max.clone().setY(boundingBox.min.y)); //模型橫向最大距离
  32811. //var distanceVerti = (boundingBox.max.y - boundingBox.min.y) *1.1 //模型纵向最大距离 *1.1 是假定, 因为飞出后有一定俯视角度
  32812. var distanceVerti = (boundingBox.max.y - boundingBox.min.y) * 0.5 + distanceHorizon * 0.5; //模型纵向最大距离 + distanceHorizon: 飞出后有一定俯视角度
  32813. this.camera.suitModelAspect = distanceHorizon / distanceVerti; //模型比例。 用于和界面比例作比较
  32814. //this.camera.suitModelAspect = Math.min(this.camera.suitModelAspect, 1.7) //这个太大会导致fov太大,导致倾斜角度太大,然后距离很近,外侧被遮挡。 手动缩小后的损失是当屏幕宽度比大于该值时,横向不会占满,但是无大碍。
  32815. //假定飞出后当camera.aspect == camera.suitModelAspect时,刚好camera.vHov(也就是camera.fov)为默认值settings.dollhouseFOV,存储这时候的hFov(suitModelAspectHFov), 当界面宽度缩小时,模型的hFov不变,按比例变化vHov;当界面宽度放大时,fov则不变。 目的是防止模型缩得太小,自适应屏幕
  32816. this.distanceHorizon = distanceHorizon;
  32817. this.distanceVerti = distanceVerti;
  32818. this.updateDistance(this.camera.aspect);
  32819. /* var distance = boundingBox.min.distanceTo(boundingBox.max)
  32820. this.adjustedMinDistance = Math.max(Math.min(distance / 2, settings.dollhouseDefault.minDistance), 0)
  32821. this.adjustedMaxDistance = Math.min(Math.max(distance, settings.dollhouseDefault.maxDistance), settings.skyboxRadius)
  32822. this.minDistance = this.adjustedMinDistance
  32823. this.maxDistance = this.adjustedMaxDistance */
  32824. }
  32825. }, {
  32826. key: "updateDistance",
  32827. value: function updateDistance(aspect) {
  32828. var oldDistance = this.suitableDistance;
  32829. if (!this.player.model || isNaN(this.camera.suitModelAspect) || this.forbitSetRanges) return;
  32830. var boundingBox = this.player.model.boundingBox;
  32831. if (aspect <= this.camera.suitModelAspect) {
  32832. var HFov = cameraLight.getHFOVFromVFOV(this.camera.fov, aspect, 1);
  32833. this.suitableDistance = this.distanceHorizon / 2 / Math.tan(THREE.MathUtils.degToRad(HFov / 2)); //飞出时模型宽度占满屏宽时的距离
  32834. this.suitableDistance += Math.min(boundingBox.max.x - boundingBox.min.x, boundingBox.max.z - boundingBox.min.z) * 0.5; //console.log('w '+ this.suitableDistance)
  32835. } else {
  32836. this.suitableDistance = this.distanceVerti / 2 / Math.tan(THREE.MathUtils.degToRad(this.camera.fov / 2));
  32837. this.suitableDistance += Math.min(boundingBox.max.x - boundingBox.min.x, boundingBox.max.z - boundingBox.min.z) * 0.5; //console.log('h '+ this.suitableDistance)
  32838. }
  32839. this.adjustedMaxDistance = this.suitableDistance * 10; //1.2 //主要为了防止缩得太小
  32840. this.adjustedMinDistance = this.suitableDistance * 0.1; //设置为0会卡住
  32841. this.resetRanges();
  32842. if (this.enabled) {
  32843. this.scale = this.suitableDistance / oldDistance; //this.updateZoom()
  32844. }
  32845. }
  32846. /**
  32847. * 重置轨道半径,纬度的取值范围。有参按参数取值否则为全局自定义值
  32848. */
  32849. }, {
  32850. key: "resetRanges",
  32851. value: function resetRanges(e, t) {
  32852. if (this.forbitSetRanges) return;
  32853. if (e) {
  32854. this.minDistance = Math.min(e, this.minDistance);
  32855. this.maxDistance = Math.max(e, this.maxDistance);
  32856. } else {
  32857. this.minDistance = this.adjustedMinDistance;
  32858. this.maxDistance = this.adjustedMaxDistance;
  32859. }
  32860. if (t) {
  32861. this.minPolarAngle = THREE.MathUtils.degToRad(-15);
  32862. this.maxPolarAngle = THREE.MathUtils.degToRad(89.9);
  32863. } else {
  32864. this.minPolarAngle = settings$3.dollhouseDefault.minPolarAngle;
  32865. this.maxPolarAngle = settings$3.dollhouseDefault.maxPolarAngle;
  32866. }
  32867. }
  32868. }, {
  32869. key: "toJSON",
  32870. value: function toJSON() {
  32871. return OutsideControls.prototype.toJSON.call(this);
  32872. }
  32873. }]);
  32874. return DollhouseControls;
  32875. }(OutsideControls);
  32876. function _createSuper$T(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$T(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  32877. function _isNativeReflectConstruct$T() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  32878. var FloorplanControls = /*#__PURE__*/function (_OutsideControls) {
  32879. _inherits(FloorplanControls, _OutsideControls);
  32880. var _super = _createSuper$T(FloorplanControls);
  32881. function FloorplanControls(camera, dom, player) {
  32882. var _this;
  32883. _classCallCheck(this, FloorplanControls);
  32884. _this = _super.call(this, camera, dom, player);
  32885. _this.minDistance = 5; //最小球半径
  32886. _this.maxDistance = 100; //最大球半径
  32887. _this.noRotateUpDown = !0; //是否禁止竖直方向的旋转,即禁用纬度上的角位移
  32888. _this.minPolarAngle = 0; //最小纬度 (0度在北极往下看,180度在南极往上看) 对应lat
  32889. _this.maxPolarAngle = 0; //最大纬度
  32890. _this.absoluteScale = 1; //当前控制器下的默认缩放
  32891. _this.currentScale = 1; //鼠标所交互的界面元素
  32892. _this.dom = dom;
  32893. _this.$app = player.$app;
  32894. _this.plane = null;
  32895. _this.cadSize = null;
  32896. _this.floorTexture = null; //鼠标、触点行为
  32897. _this.mouseActions[MouseButton.LEFT] = ControlActions.PAN;
  32898. _this.mouseActions[MouseButton.MIDDLE] = ControlActions.DOLLY;
  32899. _this.mouseActions[MouseButton.RIGHT] = ControlActions.ROTATE;
  32900. _this.touchActions[1] = ControlActions.PAN;
  32901. _this.touchActions[2] = ControlActions.ROTATE_DOLLY;
  32902. return _this;
  32903. }
  32904. /**
  32905. * 屏幕大小变化后,相应的也要调整
  32906. */
  32907. /* updateFloorCad() {
  32908. if (this.plane != null && this.plane != 'nofile')
  32909. {
  32910. var planeWidth = this.plane.geometry.parameters.width;
  32911. var planeHeight = this.plane.geometry.parameters.height;
  32912. var modelWidth = this.player.model.boundingBox.max.x - this.player.model.boundingBox.min.x;
  32913. var modelHeight = this.player.model.boundingBox.max.z - this.player.model.boundingBox.min.z;
  32914. var width = this.camera.right - this.camera.left;
  32915. var height = this.camera.top - this.camera.bottom;
  32916. let scale = app.player.domElement.clientWidth / (this.camera.right - this.camera.left);
  32917. this.plane.scale.x = (modelWidth + (this.cadSize.left + this.cadSize.right) / scale) / planeWidth;
  32918. this.plane.scale.z = (modelHeight + (this.cadSize.left + this.cadSize.right) / scale) / planeHeight;
  32919. }
  32920. } */
  32921. /**
  32922. * 相机通过缩放Zoom,使模型适当充满视口。
  32923. * 1.得到模型平面(XZ)尺寸
  32924. * 2.分别计算视口宽高比 大于1,小于1 两种情况下模型所占最大的视口尺寸
  32925. * 3.以模型所占最大视口尺寸为基准,调整绝对缩放比
  32926. * @param {Vector3} modelSize
  32927. */
  32928. _createClass(FloorplanControls, [{
  32929. key: "zoomToContain",
  32930. value: function zoomToContain(modelSize, ratio) {
  32931. var absoluteScale = this.getDefaultAbsoluteScale(modelSize, ratio); //改
  32932. this.absoluteScale = absoluteScale;
  32933. this.currentScale = this.absoluteScale;
  32934. }
  32935. /**
  32936. *
  32937. * @param {Vector3} modelSize
  32938. */
  32939. }, {
  32940. key: "getDefaultAbsoluteScale",
  32941. value: function getDefaultAbsoluteScale(modelSize, ratio, angle) {
  32942. //const metadata = app.store.getters['scene/metadata'] || {}
  32943. var absoluteScale;
  32944. /* if(metadata.floorPlanAngle || config.floorPlanNoRotate ){//指定了角度的话,就和browser.aspectRatio()无关,总使用纵向
  32945. var angle = 0;
  32946. if(metadata.floorPlanAngle ){//规定了cadImage旋转值的话
  32947. angle = parseFloat(metadata.floorPlanAngle)
  32948. }
  32949. else if ( config.floorPlanNoRotate )//为了让cadImage的字是正的,所以当有labels的时候恒定这个方向
  32950. {
  32951. angle = 0;
  32952. }
  32953. modelSize = modelSize.clone().applyEuler(new THREE.Euler(0, angle, 0))
  32954. var n = Math.max(Math.abs(modelSize.x), Math.abs(modelSize.z) * this.camera.aspect) //视口宽高比 >= 1 情况下,模型所占最大视口尺寸
  32955. var screenSize = Math.min($("#player").width(), $("#player").height())
  32956. var maxSize = 800;//模型最大占据像素
  32957. ratio = ratio != void 0 ? ratio : Math.max(screenSize * 1.2 / maxSize, 1.2) ;
  32958. absoluteScale = n / 2 / settings.orthoBase * ratio; //根据模型所占最大视口尺寸调整缩放
  32959. }else{ */
  32960. /* xst
  32961. var maxModelSize = Math.max(modelSize.x, modelSize.z),
  32962. minModelSize = Math.min(modelSize.x, modelSize.z),
  32963. n = Math.max(maxModelSize, minModelSize * this.camera.aspect), //视口宽高比 >= 1 情况下,模型所占最大视口尺寸
  32964. r = Math.max(minModelSize, maxModelSize * this.camera.aspect) //视口宽高比 < 1 情况下,模型所占最大视口尺寸
  32965. absoluteScale = ((browser.aspectRatio() < 1 ? r : n) / 2 / settings.orthoBase) * (ratio != void 0 ? ratio : 1.2) //根据模型所占最大视口尺寸调整缩放
  32966. */
  32967. //}
  32968. //xst
  32969. if (angle == null || typeof angle == 'undefined') {
  32970. angle = this.$app.store.getValue('metadata').floorPlanAngle;
  32971. if (typeof angle == 'undefined') {
  32972. angle = 0;
  32973. }
  32974. angle = parseFloat(angle);
  32975. }
  32976. modelSize = modelSize.clone().applyEuler(new THREE.Euler(0, angle, 0));
  32977. var n = Math.max(Math.abs(modelSize.x), Math.abs(modelSize.z) * this.camera.aspect); //视口宽高比 >= 1 情况下,模型所占最大视口尺寸
  32978. var player = this.$app.core.get('Player');
  32979. var screenSize = Math.min(player.domElement.clientWidth - 400, player.domElement.clientHeight - 200);
  32980. var maxSize = 800; //模型最大占据像素
  32981. var maxRatio = player.linkEditor && (player.linkEditor.setTagVisible || player.linkEditor.setPanoVisible) ? 1.2 : 2;
  32982. ratio = ratio != void 0 ? ratio : Math.max(screenSize * maxRatio / maxSize, maxRatio);
  32983. absoluteScale = n / 2 / settings$3.orthoBase * ratio; //根据模型所占最大视口尺寸调整缩放
  32984. return absoluteScale;
  32985. }
  32986. /**
  32987. * 相机通过旋转Rotate,使模型尺寸长宽比匹配相机视野宽高比
  32988. * @param {Vector3} modelSize
  32989. * @param {Vector3} direction
  32990. */
  32991. }, {
  32992. key: "rotateToView",
  32993. value: function rotateToView(modelSize, direction) {
  32994. var i = 0,
  32995. n = browser$1.aspectRatio() < 1,
  32996. //是否模型尺寸显“细长”
  32997. r = modelSize.x < modelSize.z; //是否视口为“窄屏”
  32998. var metadata = this.$app.store.getValue('metadata');
  32999. if (metadata.floorPlanAngle !== void 0) {
  33000. //规定了cadImage旋转值的话
  33001. i = 2 * Math.PI - 1 * parseFloat(metadata.floorPlanAngle); //i = parseFloat(metadata.floorPlanAngle)
  33002. } else if (n === r
  33003. /* || config.floorPlanNoRotate */
  33004. ) {
  33005. //为了让cadImage的字是正的,所以当有labels的时候恒定这个方向
  33006. i = 0;
  33007. } else {
  33008. i = Math.PI / 2;
  33009. } //i = Math.PI / 2
  33010. this.rotateLeft(i);
  33011. this.update(0);
  33012. }
  33013. /**
  33014. * 平移操作,相对相机的本地坐标
  33015. * @param {Number} panSpeedX
  33016. * @param {Number} panSpeedY
  33017. */
  33018. }, {
  33019. key: "pan",
  33020. value: function pan(panSpeedX, panSpeedY) {
  33021. this.camera.updateMatrix();
  33022. this.panLeft(panSpeedX * (this.camera.right - this.camera.left) / this.player.domElement.clientWidth); //括号内是移动模型的距离,单位米
  33023. this.panUp(-panSpeedY * (this.camera.top - this.camera.bottom) / this.player.domElement.clientHeight);
  33024. }
  33025. /**
  33026. * 缩放操作,与透视相机不同,此模式下采用正交相机,通过改变相机轨道半径从而改变相机距离无意义,缩放是通过调整相机投影视口大小的方式
  33027. */
  33028. }, {
  33029. key: "updateZoom",
  33030. value: function updateZoom() {
  33031. //计算缩放比
  33032. this.absoluteScale *= this.scale - 0.03 * this.keyboardZoomSpeed; //滚轮缩放
  33033. this.absoluteScale = Math.max(settings$3.zoomNearLimit, Math.min(this.absoluteScale, settings$3.zoomFarLimit)); //if(this.farestScale) this.absoluteScale = Math.min(this.farestScale, this.absoluteScale);//add for cadImg
  33034. this.currentScale = 0.8 * this.currentScale + 0.2 * this.absoluteScale; //----许钟文------------------------------------
  33035. //默认根据屏幕宽度变化大小。当截取俯视图时,保留截取时绝对大小,无论截取什么比例,房子都不会被缩放。
  33036. //而后导览时,无论什么比例下飞到这个导览点,房子都是这个大小。
  33037. //本意是如果想设置在某窗口比例下的房子大小时,比如手机大小,当截取成功后缩略图和满屏时房子都不会变化大小。
  33038. //在满屏时截取,缩小宽度后点击房子也不会变小。缺点:当窗口很窄时,房子会略大。
  33039. var s = this.snapshotTopAspect ? this.camera.aspect / this.snapshotTopAspect : 1; //通过相机视口参数来调整相机投影视口大小
  33040. this.camera.left = -settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
  33041. this.camera.right = settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
  33042. this.camera.top = settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
  33043. this.camera.bottom = -settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
  33044. this.camera.updateProjectionMatrix();
  33045. return this.offset.length();
  33046. } //===========================================
  33047. /*
  33048. * 通过传参直接控制camera,不通过update里那些参数。 用于cad控制模型
  33049. */
  33050. }, {
  33051. key: "updateDirect",
  33052. value: function updateDirect(info) {
  33053. //相机视口大小,如left为最左侧看到的三维边界坐标到视口中心的距离
  33054. // var height = info.width / this.camera.aspect
  33055. // this.camera.left = -info.width / 2
  33056. // this.camera.right = info.width / 2
  33057. // this.camera.top = height / 2
  33058. // this.camera.bottom = -height / 2
  33059. // this.camera.updateProjectionMatrix()
  33060. if (!info.floorPlanAngle) {
  33061. info.floorPlanAngle = 0;
  33062. } //console.log('updateDirect' + JSON.stringify(info))
  33063. this.camera.left = -info.width / 2;
  33064. this.camera.right = info.width / 2;
  33065. this.camera.top = info.height / 2;
  33066. this.camera.bottom = -info.height / 2;
  33067. this.camera.updateProjectionMatrix(); //相机中心,若相机有旋转,需要把相机位置也旋转下:
  33068. this.camera.rotation.set(-Math.PI / 2, 0, info.floorPlanAngle);
  33069. var center = new THREE.Vector2(info.center.x, -info.center.y); //旋转中心 (和CAD那边一致就行)
  33070. var pos = new THREE.Vector2().copy(center).rotateAround(new THREE.Vector2(info.defaultCenter.x, -info.defaultCenter.y), -info.floorPlanAngle);
  33071. this.camera.position.setX(pos.x);
  33072. this.camera.position.setZ(pos.y); //let model = this.$app.core.get('Player').model
  33073. //if(info.floorPlanAngle!=0){
  33074. // this.absoluteScale = this.getDefaultAbsoluteScale(model.size, null,info.floorPlanAngle) //改
  33075. // this.currentScale = this.absoluteScale
  33076. // var s = this.snapshotTopAspect ? this.camera.aspect / this.snapshotTopAspect : 1
  33077. // //通过相机视口参数来调整相机投影视口大小
  33078. // this.camera.left = -settings.orthoBase * this.currentScale * s //* this.camera.aspect;
  33079. // this.camera.right = settings.orthoBase * this.currentScale * s //* this.camera.aspect;
  33080. // this.camera.top = (settings.orthoBase * this.currentScale * s) / this.camera.aspect
  33081. // this.camera.bottom = (-settings.orthoBase * this.currentScale * s) / this.camera.aspect
  33082. //}
  33083. this.updateForCad = true;
  33084. }
  33085. }, {
  33086. key: "updateForRotateCad",
  33087. value: function updateForRotateCad(info) {
  33088. if (!info.floorPlanAngle) {
  33089. info.floorPlanAngle = 0;
  33090. } //console.log('updateForRotateCad' + JSON.stringify(info))
  33091. //相机中心,若相机有旋转,需要把相机位置也旋转下:
  33092. this.camera.rotation.set(-Math.PI / 2, 0, info.floorPlanAngle);
  33093. var center = new THREE.Vector2(info.center.x, -info.center.y); //旋转中心 (和CAD那边一致就行)
  33094. //var pos = new THREE.Vector2().copy(center).rotateAround(center, -info.floorPlanAngle)
  33095. var pos = new THREE.Vector2().copy(center).rotateAround(new THREE.Vector2(info.defaultCenter.x, -info.defaultCenter.y), -info.floorPlanAngle);
  33096. this.camera.position.setX(pos.x);
  33097. this.camera.position.setZ(pos.y);
  33098. var model = this.$app.core.get('Player').model;
  33099. this.absoluteScale = this.getDefaultAbsoluteScale(model.size, null, info.floorPlanAngle); //改
  33100. this.currentScale = this.absoluteScale;
  33101. var s = this.snapshotTopAspect ? this.camera.aspect / this.snapshotTopAspect : 1; //通过相机视口参数来调整相机投影视口大小
  33102. this.camera.left = -settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
  33103. this.camera.right = settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
  33104. this.camera.top = settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
  33105. this.camera.bottom = -settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
  33106. this.camera.updateProjectionMatrix();
  33107. this.updateForCad = true;
  33108. }
  33109. /*
  33110. * 恢复使用update, 并使俯视图看起来和cad时一样。
  33111. */
  33112. }, {
  33113. key: "recoverToUpdate",
  33114. value: function recoverToUpdate() {
  33115. this.updateForCad = false; //旋转(target、thetaDelta)
  33116. //通过计算target恢复到旋转角度为0的状态(得到的dir都是一样的)
  33117. /* var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(this.camera.quaternion)
  33118. this.target = this.camera.position.clone().add(dir) */
  33119. this.target.copy(this.camera.position); //通过rotateLeft来旋转,保持刚才的角度:
  33120. var metadata = this.$app.store.getValue('metadata');
  33121. var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0);
  33122. this.thetaDelta = floorPlanAngle; //console.log("recoverToUpdate "+floorPlanAngle)
  33123. //缩放
  33124. this.absoluteScale = this.currentScale = this.camera.right / settings$3.orthoBase;
  33125. this.update(1); //立即应用thetaDelta
  33126. } //===========================================
  33127. }, {
  33128. key: "toJSON",
  33129. value: function toJSON() {
  33130. var e = new THREE.Quaternion(),
  33131. t = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(90)),
  33132. i = new THREE.Quaternion();
  33133. var func = function func() {
  33134. var n = OutsideControls.prototype.toJSON.call(this);
  33135. e.copy(n.camera_quaternion);
  33136. i.copy(t);
  33137. i.multiply(e);
  33138. n.camera_quaternion.x = math.toPrecision(i.x, 4);
  33139. n.camera_quaternion.y = math.toPrecision(i.y, 4);
  33140. n.camera_quaternion.z = math.toPrecision(i.z, 4);
  33141. n.camera_quaternion.w = math.toPrecision(i.w, 4);
  33142. n.ortho_zoom = math.toPrecision(this.currentScale * this.camera.aspect, 4);
  33143. return n;
  33144. };
  33145. return func;
  33146. }
  33147. }, {
  33148. key: "setZoomBounds",
  33149. value: function setZoomBounds(bound) {
  33150. //根据模型大小修改zoom的边界. 和模型大小成正比
  33151. //settings.zoomNearLimit, Math.min(this.absoluteScale, settings.zoomFarLimit)
  33152. var size = bound.getSize(new THREE.Vector3());
  33153. var max = Math.max(size.x, size.z) / 2 / settings$3.orthoBase; //top最大值可能是
  33154. max = Math.max(0.1, max); //avoid 0
  33155. settings$3.zoomFarLimit = parseInt(max * 10);
  33156. settings$3.zoomNearLimit = settings$3.zoomFarLimit / 100;
  33157. settings$3.floorplan.cameraHeight = THREE.MathUtils.clamp(Math.ceil(2.4 * size.length()), 5, 5000); //小模型如果高度太高,dollhouse和floorplan互转时动态过大
  33158. this.maxDistance = Math.max(settings$3.floorplan.cameraHeight + 1, this.maxDistance);
  33159. }
  33160. }]);
  33161. return FloorplanControls;
  33162. }(OutsideControls);
  33163. function _createSuper$S(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$S(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  33164. function _isNativeReflectConstruct$S() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  33165. defineComponent('CameraControls', function () {
  33166. return /*#__PURE__*/function (_EventEmitter) {
  33167. _inherits(CameraControls, _EventEmitter);
  33168. var _super = _createSuper$S(CameraControls);
  33169. function CameraControls() {
  33170. var _this;
  33171. _classCallCheck(this, CameraControls);
  33172. _this = _super.call(this);
  33173. _this.activeControl = null;
  33174. _this.controls = {};
  33175. _this.cameras = {};
  33176. return _this;
  33177. }
  33178. _createClass(CameraControls, [{
  33179. key: "init",
  33180. value: function init(dom, modes) {
  33181. this.setUpControls(dom, modes);
  33182. this.bindEvents(dom);
  33183. }
  33184. }, {
  33185. key: "activateControls",
  33186. value: function activateControls(mode) {
  33187. if (this.activeControl) {
  33188. this.activeControl.reset();
  33189. this.activeControl.enabled = !1;
  33190. }
  33191. this.controls[mode] && (this.controls[mode].enabled = !0);
  33192. this.activeControl = this.controls[mode];
  33193. }
  33194. }, {
  33195. key: "setUpControls",
  33196. value: function setUpControls(dom, modes) {
  33197. //许钟文改 支持control加在其他dom上
  33198. var cameras = {},
  33199. controls = {};
  33200. var modes = modes || [Viewmode$1.PANORAMA, Viewmode$1.DOLLHOUSE, Viewmode$1.FLOORPLAN],
  33201. cameraClasses = [PanoramaCamera, DollhouseCamera, FloorplanCamera],
  33202. controlClasses = [PanoramaControls, DollhouseControls, FloorplanControls];
  33203. modes.forEach(function (mode, index) {
  33204. cameras[mode] = new cameraClasses[index](dom);
  33205. controls[mode] = new controlClasses[index](cameras[mode], dom, this.$app.core.get('Player'));
  33206. controls[mode].on(ControlEvents.Move, this.emit.bind(this, ControlEvents.Move));
  33207. controls[mode].on(ControlEvents.InputStart, this.emit.bind(this, ControlEvents.InputStart));
  33208. controls[mode].on(ControlEvents.InteractionDirect, this.emit.bind(this, ControlEvents.InteractionDirect));
  33209. controls[mode].on(ControlEvents.InteractionKey, this.emit.bind(this, ControlEvents.InteractionKey));
  33210. controls[mode].on(ControlEvents.Pinch, this.emit.bind(this, ControlEvents.Pinch));
  33211. controls[mode].on(ControlEvents.Scroll, this.emit.bind(this, ControlEvents.Scroll));
  33212. }.bind(this));
  33213. this.controls = controls;
  33214. this.cameras = cameras;
  33215. }
  33216. }, {
  33217. key: "bindEvents",
  33218. value: function bindEvents(dom) {
  33219. var _this2 = this;
  33220. dom.addEventListener('mousemove', this.onMouseMove.bind(this));
  33221. dom.addEventListener('mousedown', this.onMouseDown.bind(this));
  33222. dom.addEventListener('mouseup', this.onMouseUp.bind(this));
  33223. dom.addEventListener('mouseover', this.onMouseOver.bind(this));
  33224. if (settings$3.useWheel) {
  33225. dom.addEventListener('mousewheel', this.onMouseWheel.bind(this), {
  33226. passive: false
  33227. });
  33228. dom.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), {
  33229. passive: false
  33230. });
  33231. }
  33232. dom.addEventListener('touchstart', this.onTouchStart.bind(this), {
  33233. passive: false
  33234. });
  33235. dom.addEventListener('touchmove', this.onTouchMove.bind(this), {
  33236. passive: false
  33237. });
  33238. dom.addEventListener('touchend', this.onTouchEnd.bind(this));
  33239. dom.addEventListener('contextmenu', function (e) {
  33240. e.preventDefault();
  33241. });
  33242. dom.addEventListener('pointerdown', this.onPointerDown.bind(this));
  33243. dom.addEventListener('pointermove', this.onPointerMove.bind(this));
  33244. dom.addEventListener('pointerup', this.onPointerUp.bind(this));
  33245. dom.addEventListener('pointerout', this.onPointerCancel.bind(this));
  33246. dom.addEventListener('pointercancel', this.onPointerCancel.bind(this));
  33247. document.addEventListener('keydown', this.onKeyDown.bind(this));
  33248. document.addEventListener('keyup', this.onKeyUp.bind(this));
  33249. this.$app.core.get('ModelManager').on(ModelManagerEvents.ActiveModelChanged, function (e) {
  33250. this.setModelForControls(e.model);
  33251. }.bind(this));
  33252. this.on('syncCadAnd3D', function (info) {
  33253. _this2.controls[Viewmode$1.FLOORPLAN].updateDirect(info);
  33254. }); // info = {width:..,height:...,center:...}
  33255. this.on('syncCadAnd3DForRotate', function (info) {
  33256. _this2.controls[Viewmode$1.FLOORPLAN].updateForRotateCad(info);
  33257. });
  33258. }
  33259. }, {
  33260. key: "setModelForControls",
  33261. value: function setModelForControls(model) {
  33262. //this.controls[Viewmode.DOLLHOUSE].setZoomBounds(model.boundingBox)
  33263. var boundingBox = model.boundingBox.clone().expandByScalar(settings$3.modelBoundsPadding);
  33264. [Viewmode$1.DOLLHOUSE, Viewmode$1.FLOORPLAN].forEach(function (mode) {
  33265. this.controls[mode].setZoomBounds(model.boundingBox);
  33266. this.controls[mode].setBounds(boundingBox);
  33267. }.bind(this));
  33268. }
  33269. }, {
  33270. key: "onMouseDown",
  33271. value: function onMouseDown(e) {
  33272. e.preventDefault();
  33273. this.activeControl && this.activeControl.onMouseDown(e);
  33274. }
  33275. }, {
  33276. key: "onMouseMove",
  33277. value: function onMouseMove(e) {
  33278. e.preventDefault();
  33279. this.activeControl && this.activeControl.onMouseMove(e);
  33280. }
  33281. }, {
  33282. key: "onMouseUp",
  33283. value: function onMouseUp(e) {
  33284. e.preventDefault();
  33285. this.activeControl && this.activeControl.onMouseUp(e);
  33286. }
  33287. }, {
  33288. key: "onMouseOver",
  33289. value: function onMouseOver(e) {
  33290. e.preventDefault();
  33291. this.activeControl && this.activeControl.onMouseOver(e);
  33292. }
  33293. }, {
  33294. key: "onMouseWheel",
  33295. value: function onMouseWheel(e) {
  33296. e.preventDefault();
  33297. this.activeControl && this.activeControl.onMouseWheel(e);
  33298. }
  33299. }, {
  33300. key: "onTouchStart",
  33301. value: function onTouchStart(e) {
  33302. e.preventDefault();
  33303. this.activeControl && this.activeControl.onTouchStart(e);
  33304. }
  33305. }, {
  33306. key: "onTouchMove",
  33307. value: function onTouchMove(e) {
  33308. var _this3 = this;
  33309. var func = function func() {
  33310. e.preventDefault();
  33311. _this3.activeControl && _this3.activeControl.onTouchMove(e);
  33312. };
  33313. if (this.$app.VRScreenSYNC) {
  33314. common.debounce(func, 1000 / 60, true)(); //会导致带看leader触屏缩放摇晃。
  33315. } else {
  33316. func();
  33317. }
  33318. }
  33319. }, {
  33320. key: "onTouchEnd",
  33321. value: function onTouchEnd(e) {
  33322. e.preventDefault();
  33323. this.activeControl && this.activeControl.onTouchEnd(e);
  33324. }
  33325. }, {
  33326. key: "onPointerDown",
  33327. value: function onPointerDown(e) {
  33328. e.preventDefault();
  33329. if (this.activeControl) switch (e.pointerType) {
  33330. case 'mouse':
  33331. this.activeControl.onMouseDown(e);
  33332. break;
  33333. default:
  33334. this.activeControl.onPointerDown(e);
  33335. }
  33336. }
  33337. }, {
  33338. key: "onPointerMove",
  33339. value: function onPointerMove(e) {
  33340. var _this4 = this;
  33341. var func = function func() {
  33342. e.preventDefault();
  33343. if (_this4.activeControl) switch (e.pointerType) {
  33344. case 'mouse':
  33345. _this4.activeControl.onMouseMove(e);
  33346. break;
  33347. default:
  33348. _this4.activeControl.onPointerMove(e);
  33349. }
  33350. };
  33351. if (this.$app.VRScreenSYNC) {
  33352. common.debounce(func, 1000 / 60, true)();
  33353. } else {
  33354. func();
  33355. }
  33356. }
  33357. }, {
  33358. key: "onPointerUp",
  33359. value: function onPointerUp(e) {
  33360. e.preventDefault();
  33361. if (this.activeControl) {
  33362. switch (e.pointerType) {
  33363. case 'mouse':
  33364. this.activeControl.onMouseUp(e);
  33365. break;
  33366. default:
  33367. this.activeControl.onPointerUp(e);
  33368. }
  33369. this.emit('pointerUp');
  33370. }
  33371. }
  33372. }, {
  33373. key: "onPointerCancel",
  33374. value: function onPointerCancel(e) {
  33375. e.preventDefault();
  33376. this.activeControl && 'mouse' !== e.pointerType && this.activeControl.onPointerUp(e);
  33377. }
  33378. }, {
  33379. key: "onKeyDown",
  33380. value: function onKeyDown(e) {
  33381. if (!this.$app.config.useShortcutKeys) {
  33382. return;
  33383. }
  33384. if (e.metaKey || e.ctrlKey) ; else {
  33385. e.preventDefault();
  33386. this.activeControl && this.activeControl.onKeyDown(e);
  33387. }
  33388. }
  33389. }, {
  33390. key: "onKeyUp",
  33391. value: function onKeyUp(e) {
  33392. e.preventDefault();
  33393. this.activeControl && this.activeControl.onKeyUp(e);
  33394. }
  33395. }]);
  33396. return CameraControls;
  33397. }(EventEmitter);
  33398. });
  33399. var PanoVideoEvents = {
  33400. CanPlay: 'panovideo.canplay',
  33401. StartPlay: 'panovideo.start',
  33402. Resume: 'panovideo.resume',
  33403. Pause: 'panovideo.pause',
  33404. Stop: 'panovideo.stop',
  33405. Switch: 'panovideo.switch'
  33406. };
  33407. function _createForOfIteratorHelper$6(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$6(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  33408. function _unsupportedIterableToArray$6(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$6(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$6(o, minLen); }
  33409. function _arrayLikeToArray$6(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  33410. function _createSuper$R(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$R(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  33411. function _isNativeReflectConstruct$R() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  33412. var H5VideoPlayer$1 = /*#__PURE__*/function (_EventEmitter) {
  33413. _inherits(H5VideoPlayer, _EventEmitter);
  33414. var _super = _createSuper$R(H5VideoPlayer);
  33415. function H5VideoPlayer(dom, videos) {
  33416. var _this;
  33417. _classCallCheck(this, H5VideoPlayer);
  33418. _this = _super.call(this); // this.listeneNum = 0
  33419. _this.domElement = dom;
  33420. _this.os = ''; //Android | Ios | PC
  33421. _this.environment = ''; //WeChat | WeChatMiniProgram | Other
  33422. // this.videos = new Map();
  33423. // this.textures = new Map();
  33424. _this._resource = new Map();
  33425. videos.forEach(function (value, key) {
  33426. var video = _this._createVideoElement(value.mp4.url, // config.appenv == 'shipin' &&
  33427. _this._resource.size == 0);
  33428. _this._resource.set(key, {
  33429. url: value.mp4.url,
  33430. video: video,
  33431. texture: _this._createTexture(video),
  33432. loaded: true
  33433. });
  33434. /* if(key == 350){
  33435. } */
  33436. });
  33437. _this.video = null; // this.texture = new THREE.VideoTexture(document.createElement('video'))
  33438. // this.texture.minFilter = THREE.LinearFilter
  33439. _this.isFirstPlay = true;
  33440. _this.isMuted = true;
  33441. _this.events = {
  33442. onDomElementTouchStart: function onDomElementTouchStart() {
  33443. //---ios
  33444. //console.log('onDomElementTouchStart')
  33445. if (_this.shouldPlay) {
  33446. _this.video.muted = _this.isMuted;
  33447. _this.video.play();
  33448. console.log('onDomElementTouchStart muted', _this.video.muted, 'paused', _this.video.paused);
  33449. _this.domElement.removeEventListener('touchstart', _this.events.onDomElementTouchStart, true);
  33450. }
  33451. },
  33452. onDomElementTouchEnd: function onDomElementTouchEnd() {
  33453. if (_this.shouldPlay) {
  33454. _this.video.muted = _this.isMuted;
  33455. _this.domElement.removeEventListener('touchend', _this.events.onDomElementTouchEnd, true);
  33456. }
  33457. },
  33458. onDomElementMouseDown: function onDomElementMouseDown() {
  33459. if (_this.shouldPlay) {
  33460. _this.video.muted = _this.isMuted;
  33461. _this.domElement.removeEventListener('mousedown', _this.events.onDomElementMouseDown, true);
  33462. }
  33463. }
  33464. };
  33465. return _this;
  33466. }
  33467. _createClass(H5VideoPlayer, [{
  33468. key: "_createTexture",
  33469. value: function _createTexture(videoElement) {
  33470. var texture = new THREE.VideoTexture(videoElement);
  33471. texture.minFilter = THREE.LinearFilter;
  33472. texture.uploaded = false;
  33473. return texture;
  33474. }
  33475. }, {
  33476. key: "_createVideoElement",
  33477. value: function _createVideoElement(src) {
  33478. var video; // if (config.appenv == 'shipin' && isInPage) {
  33479. // video = parent.document.querySelector('#video-' + config.projectNum)
  33480. // video._isPrepload = true
  33481. // } else
  33482. {
  33483. video = document.createElement('video');
  33484. video.setAttribute('crossOrigin', 'anonymous');
  33485. video.setAttribute('playsinline', 'true');
  33486. video.setAttribute('x5-playsinline', 'true');
  33487. video.setAttribute('webkit-playsinline', 'true');
  33488. video.setAttribute('x5-video-player-type', 'h5');
  33489. video.setAttribute('controls', 'true'); // video.preload = true //"none";
  33490. video.autoplay = false;
  33491. video.muted = this.isMuted;
  33492. video.loop = true;
  33493. video.src = src;
  33494. video.style.position = 'fixed';
  33495. video.style.left = '0';
  33496. video.style.top = '0';
  33497. video.style.width = browser$1.urlHasValue('debug') ? '300px' : '1px';
  33498. video.style.height = browser$1.urlHasValue('debug') ? '300px' : '1px';
  33499. video.style.display = 'block'; // 关于视频卡顿问题,经测试,通过设置zIndex=-1、opacity=0来隐藏video可规避
  33500. video.style.zIndex = browser$1.urlHasValue('debug') ? '1000' : '0';
  33501. video.style.opacity = browser$1.urlHasValue('debug') ? '1' : '0'; //this.domElement.appendChild(video)
  33502. }
  33503. /* if (!H5VideoPlayer.videoReady) {
  33504. H5VideoPlayer.videoReady = true
  33505. function iosInitAutoPlay() {
  33506. console.log('iosInitAutoPlay', video.src)
  33507. video.play()
  33508. setTimeout(()=>{
  33509. console.log('iosInitAutoPlay result', video.paused, __sdk.core.get('Player').model.skybox.material.defines.HasVideo)
  33510. video.pause()
  33511. },100)
  33512. window.listener.removeEventListener('touchstart', iosInitAutoPlay, true)
  33513. }
  33514. //避免重复监听
  33515. window.listener = window //window.document.body
  33516. window.listener.addEventListener('touchstart', iosInitAutoPlay, true)
  33517. } */
  33518. return video;
  33519. }
  33520. }, {
  33521. key: "_onCanPlay",
  33522. value: function _onCanPlay() {
  33523. this.emit(PanoVideoEvents.CanPlay);
  33524. }
  33525. }, {
  33526. key: "_onPlaying",
  33527. value: function _onPlaying() {
  33528. var _this2 = this;
  33529. //console.log('_onPlaying muted', this.video.muted)
  33530. this.emit(PanoVideoEvents.Switch, this.texture);
  33531. this.video.ontimeupdate = function (event) {
  33532. if (_this2.video.currentTime > 0.5) {
  33533. _this2.emit(PanoVideoEvents.Resume);
  33534. _this2.video.ontimeupdate = null;
  33535. _this2.isFirstPlay = false; //console.log('播放成功')
  33536. }
  33537. };
  33538. if (this.isFirstPlay) this.emit(PanoVideoEvents.StartPlay);
  33539. }
  33540. }, {
  33541. key: "_onPause",
  33542. value: function _onPause(event) {
  33543. if (this.video) {
  33544. this.video._isPaused = true;
  33545. }
  33546. this.emit(PanoVideoEvents.Pause);
  33547. }
  33548. }, {
  33549. key: "preload",
  33550. value: function preload(video) {
  33551. var _this3 = this;
  33552. if (video == this.video || video._isPrepload) return;
  33553. video.muted = true;
  33554. try {
  33555. top.WeixinJSBridge && top.WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
  33556. video.play();
  33557. }, false);
  33558. } catch (error) {
  33559. video.play();
  33560. }
  33561. video.onplaying = function () {
  33562. video.pause();
  33563. video._isPrepload = true;
  33564. if (_this3.video && !_this3.video._isPaused) {
  33565. _this3.video.play();
  33566. }
  33567. };
  33568. }
  33569. }, {
  33570. key: "preloadAll",
  33571. value: function preloadAll() {
  33572. if (this.video) {
  33573. this.video._isPaused = this.video.paused;
  33574. }
  33575. var _iterator = _createForOfIteratorHelper$6(this._resource.values()),
  33576. _step;
  33577. try {
  33578. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  33579. var item = _step.value;
  33580. this.preload(item.video);
  33581. }
  33582. } catch (err) {
  33583. _iterator.e(err);
  33584. } finally {
  33585. _iterator.f();
  33586. }
  33587. }
  33588. }, {
  33589. key: "preloadPano",
  33590. value: function preloadPano(pano) {
  33591. var item = this._resource.get(pano.id);
  33592. if (item) {
  33593. this.preload(item.video);
  33594. }
  33595. }
  33596. }, {
  33597. key: "startVideo",
  33598. value: function startVideo(panoId, tryIfFirstplay) {
  33599. var item = this._resource.get(panoId);
  33600. if (item) {
  33601. item.video.autoplay = true;
  33602. item.video.onplaying = this._onPlaying.bind(this);
  33603. item.video.onpause = this._onPause.bind(this);
  33604. item.video.oncanplay = this._onCanPlay.bind(this);
  33605. this.video = item.video;
  33606. this.texture = item.texture; // // debug
  33607. // this.video.addEventListener("playing", () => console.error('mp4_debug_playing'))
  33608. // this.video.addEventListener("pause", () => console.error('mp4_debug_pause'))
  33609. // this.video.addEventListener("canplay", () => console.error('mp4_debug_canplay'))
  33610. // this.video.onloadstart = () => console.error('mp4_debug_loadstart')
  33611. // this.video.onloadedmetadata = () => console.error('mp4_debug_loadedmetadata', this.video.readyState)
  33612. // this.video.onloadeddata = () => console.error('mp4_debug_loadeddata', this.video.readyState)
  33613. // this.video.onprogress = () => {
  33614. // console.error('mp4_debug_progress', this.video.readyState)
  33615. // }
  33616. // this.video.oncanplaythrough = () => console.error('mp4_debug_canplaythrough:视频源数据加载完成')
  33617. // this.video.onwaiting = () => console.error('mp4_debug_waiting')
  33618. // this.video.onerror = (e) => console.error('mp4_debug_error', e)
  33619. // this.video.onabort = () => console.error('mp4_debug_abort: 客户端主动终止下载')
  33620. // this.video.onemptied = () => console.error('mp4_debug_emptied: video元素变为未初始化状态')
  33621. // this.video.onstalled = () => {
  33622. // console.error('mp4_debug_stalled: 浏览器尝试获取媒体数据但数据不可用(网速异常)')
  33623. // }
  33624. // this.video.onseeking = () => console.error('mp4_debug_seeking: 浏览器正在请求数据(视频跳转中)')
  33625. // this.video.onseeked = () => console.error('mp4_debug_seeked')
  33626. // this.video.onsuspend = () => console.error('mp4_debug_suspend: 浏览器暂停获取媒体数据(延迟下载)')
  33627. // this.video.style.display = ""
  33628. /* if(tryIfFirstplay) {
  33629. this.isFirstPlay && this.play(this.video ) */
  33630. /* }else */
  33631. if (this.video.paused) {
  33632. this.play(this.video);
  33633. } else {
  33634. this._onPlaying();
  33635. }
  33636. }
  33637. } // 业务规定要自动播放而且带有声音,不符合Autoplay Policy (https://goo.gl/xX8pDD)。
  33638. // 微信平台可以绕过 Autoplay Policy,所以业务只考虑微信,但这里对普通H5也进行了处理
  33639. }, {
  33640. key: "play",
  33641. value: function play(videoElement) {
  33642. var _this4 = this;
  33643. this.shouldPlay = videoElement;
  33644. if (this.isFirstPlay || !videoElement._isCanplay) {
  33645. if (browser$1.detectWeixin()) {
  33646. //用微信平台的 WeixinJSBridge 越过 Autoplay Policy
  33647. try {
  33648. top.WeixinJSBridge && top.WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
  33649. if (_this4.shouldPlay == videoElement) {
  33650. console.log('play', videoElement.src.split('/').pop());
  33651. videoElement.play();
  33652. videoElement._isCanplay = true;
  33653. }
  33654. }, false);
  33655. } catch (error) {
  33656. videoElement.play();
  33657. videoElement._isCanplay = true;
  33658. }
  33659. } //符合Autoplay Policy的自动播放,处理方式为:先静音播放,再由用户触发打开声音
  33660. else {
  33661. videoElement.play();
  33662. videoElement._isCanplay = true; //经测试,正确的事件为,IOS-touchstart,Android -- touchend 否则setMuted后会异常暂停播放 (细节挖坑!)
  33663. //测试样本 IOS: safari chrome | Android: chrome
  33664. if (browser$1.detectAndroidMobile()) {
  33665. this.domElement.addEventListener('touchend', this.events.onDomElementTouchEnd, true);
  33666. } else if (browser$1.detectIOS()) {
  33667. this.domElement.addEventListener('touchstart', this.events.onDomElementTouchStart, true);
  33668. } else {
  33669. this.domElement.addEventListener('mousedown', this.events.onDomElementMouseDown, true);
  33670. }
  33671. }
  33672. } else {
  33673. videoElement.play();
  33674. } //console.log('try play', videoElement.paused, videoElement.src)
  33675. }
  33676. }, {
  33677. key: "pauseVideo",
  33678. value: function pauseVideo(panoId) {
  33679. var item = this._resource.get(panoId);
  33680. if (item) {
  33681. //console.error('pauseVideo', panoId)
  33682. item.video.pause();
  33683. item.video.muted = true;
  33684. item.video.onplaying = null;
  33685. if (this.shouldPlay == item.video) this.shouldPlay = false;
  33686. }
  33687. }
  33688. }, {
  33689. key: "pause",
  33690. value: function pause() {
  33691. if (this.video) {
  33692. //console.error('pause', this.video.src.split('/').pop())
  33693. this.video._isPaused = true;
  33694. this.video.pause();
  33695. this.shouldPlay = false;
  33696. }
  33697. }
  33698. }, {
  33699. key: "resume",
  33700. value: function resume() {
  33701. if (this.video) {
  33702. this.play(this.video);
  33703. this.video.onplaying = this._onPlaying.bind(this);
  33704. } else {
  33705. console.warn('PanoVideoRenderer: 没有可播放的视频');
  33706. }
  33707. }
  33708. }, {
  33709. key: "setMuted",
  33710. value: function setMuted(muted) {
  33711. //console.log('setMuted', muted )
  33712. var _iterator2 = _createForOfIteratorHelper$6(this._resource.values()),
  33713. _step2;
  33714. try {
  33715. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  33716. var item = _step2.value;
  33717. item.video.muted = muted;
  33718. } //this.video && (this.video.muted = muted)
  33719. } catch (err) {
  33720. _iterator2.e(err);
  33721. } finally {
  33722. _iterator2.f();
  33723. }
  33724. this.isMuted = muted;
  33725. }
  33726. }]);
  33727. return H5VideoPlayer;
  33728. }(EventEmitter);
  33729. H5VideoPlayer$1.videoReady = false;
  33730. function _createForOfIteratorHelper$5(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$5(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  33731. function _unsupportedIterableToArray$5(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$5(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$5(o, minLen); }
  33732. function _arrayLikeToArray$5(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  33733. function _createSuper$Q(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$Q(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  33734. function _isNativeReflectConstruct$Q() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  33735. var FlvVideoPlayer$1 = /*#__PURE__*/function (_EventEmitter) {
  33736. _inherits(FlvVideoPlayer, _EventEmitter);
  33737. var _super = _createSuper$Q(FlvVideoPlayer);
  33738. function FlvVideoPlayer(dom, videos) {
  33739. var _this;
  33740. _classCallCheck(this, FlvVideoPlayer);
  33741. _this = _super.call(this);
  33742. _this.domElement = dom;
  33743. _this.instances = new Map();
  33744. _this.instanceTextures = new Map();
  33745. videos.forEach(function (value, key) {
  33746. // if( config.appenv == "shipin" && this.instances.size>0){
  33747. // return
  33748. // }
  33749. _this.instances.set(key, _this._createVideo(value.flv.url));
  33750. var videoTexture = new THREE__namespace.VideoTexture(_this.instances.get(key).videoElement);
  33751. videoTexture.minFilter = THREE__namespace.LinearFilter;
  33752. _this.instanceTextures.set(key, videoTexture);
  33753. });
  33754. _this.video = null;
  33755. _this.texture = null;
  33756. _this.isFirstPlay = true;
  33757. _this.isMuted = true;
  33758. _this.events = {
  33759. onDomElementTouchStart: function onDomElementTouchStart() {
  33760. //---ios
  33761. //console.log('onDomElementTouchStart')
  33762. /* if (this.shouldPlay) {
  33763. this.video.muted = this.isMuted
  33764. this.video.play()
  33765. console.log('onDomElementTouchStart muted', this.video.muted, 'paused', this.video.paused)
  33766. this.domElement.removeEventListener('touchstart', this.events.onDomElementTouchStart, true)
  33767. }*/
  33768. _this.video.muted = _this.isMuted;
  33769. _this.domElement.removeEventListener('touchstart', _this.events.onDomElementTouchStart, true);
  33770. },
  33771. onDomElementTouchEnd: function onDomElementTouchEnd() {
  33772. //if (this.shouldPlay) {
  33773. _this.video.muted = _this.isMuted;
  33774. _this.domElement.removeEventListener('touchend', _this.events.onDomElementTouchEnd, true); //}
  33775. },
  33776. onDomElementMouseDown: function onDomElementMouseDown() {
  33777. //if (this.shouldPlay) {
  33778. _this.video.muted = _this.isMuted;
  33779. _this.domElement.removeEventListener('mousedown', _this.events.onDomElementMouseDown, true); //}
  33780. }
  33781. };
  33782. return _this;
  33783. }
  33784. _createClass(FlvVideoPlayer, [{
  33785. key: "_createVideo",
  33786. value: function _createVideo(url) {
  33787. var video = document.createElement('video');
  33788. video.setAttribute('crossOrigin', 'anonymous');
  33789. video.setAttribute('playsinline', 'true');
  33790. video.setAttribute('webkit-playsinline', 'true');
  33791. video.setAttribute('controls', 'true');
  33792. video.setAttribute('unfullscreen', 'true');
  33793. video.autoplay = false;
  33794. video.muted = true;
  33795. video.loop = true;
  33796. video.style.position = 'fixed';
  33797. video.style.left = '0';
  33798. video.style.top = '0';
  33799. video.style.width = browser$1.urlHasValue('debug') ? '200px' : '1px';
  33800. video.style.display = 'block'; // 关于视频卡顿问题,经测试,通过设置zIndex=-1、opacity=0来隐藏video可规避
  33801. video.style.zIndex = browser$1.urlHasValue('debug') ? '1000' : '0';
  33802. video.style.opacity = browser$1.urlHasValue('debug') ? '1' : '0';
  33803. this.domElement.appendChild(video); //bug:安卓似乎会在 browser.requestFullscreen(document.body) 后全屏(点击vr时)时播放显示视频
  33804. var player = flvjs.createPlayer({
  33805. type: 'flv',
  33806. url: url
  33807. }, {
  33808. lazyLoad: true,
  33809. lazyLoadMaxDuration: 5
  33810. });
  33811. player.videoElement = video;
  33812. player.attachMediaElement(video);
  33813. player.on(flvjs.Events.ERROR, this._onPlayerError.bind(this));
  33814. return player;
  33815. }
  33816. }, {
  33817. key: "_onPlayerError",
  33818. value: function _onPlayerError(error) {
  33819. console.warn('球幕视频资源加载错误:', error);
  33820. }
  33821. }, {
  33822. key: "_onPlaying",
  33823. value: function _onPlaying() {
  33824. var _this2 = this;
  33825. this.emit(PanoVideoEvents.Switch, this.texture);
  33826. this.video.ontimeupdate = function (event) {
  33827. if (_this2.video.currentTime > 0.2) {
  33828. _this2.emit(PanoVideoEvents.Resume);
  33829. if (_this2.isFirstPlay) _this2.emit(PanoVideoEvents.StartPlay);
  33830. _this2.isFirstPlay = false;
  33831. _this2.video.ontimeupdate = null;
  33832. }
  33833. };
  33834. }
  33835. }, {
  33836. key: "_onPause",
  33837. value: function _onPause() {
  33838. this.emit(PanoVideoEvents.Pause);
  33839. this.state = 0;
  33840. }
  33841. }, {
  33842. key: "preloadPano",
  33843. value: function preloadPano(pano) {
  33844. var instance = this.instances.get(pano.id);
  33845. if (instance && instance.buffered.length == 0) {
  33846. instance.load();
  33847. }
  33848. }
  33849. }, {
  33850. key: "startVideo",
  33851. value: function startVideo(panoId) {
  33852. var instance = this.instances.get(panoId);
  33853. if (instance) {
  33854. instance.buffered.length == 0 && instance.load();
  33855. this.video = instance.videoElement;
  33856. this.video.onplaying = this._onPlaying.bind(this);
  33857. this.video.onpause = this._onPause.bind(this); // 直接取提前准备好的VideoTexture
  33858. // 不能直接给this.texture.image赋值this.video,会在手机上无法播放;
  33859. // 也不能在这里new THREE.VideoTexture,有时会有一小段黑屏
  33860. this.texture = this.instanceTextures.get(panoId);
  33861. if (this.video.paused) {
  33862. this.play(this.video);
  33863. } else {
  33864. this._onPlaying();
  33865. }
  33866. }
  33867. }
  33868. }, {
  33869. key: "pauseVideo",
  33870. value: function pauseVideo(panoId) {
  33871. var instance = this.instances.get(panoId);
  33872. if (instance) {
  33873. instance.videoElement.pause();
  33874. instance.videoElement.onplaying = null;
  33875. }
  33876. } // 业务规定要自动播放而且带有声音,不符合Autoplay Policy (https://goo.gl/xX8pDD)。
  33877. // 微信平台可以绕过 Autoplay Policy,所以业务只考虑微信,但这里对普通H5也进行了处理
  33878. }, {
  33879. key: "play",
  33880. value: function play(videoElement) {
  33881. if (this.isFirstPlay) {
  33882. videoElement.play(); //经测试,正确的事件为,IOS-touchstart,Android -- touchend 否则setMuted后会异常暂停播放 (细节挖坑!)
  33883. //测试样本 IOS: safari chrome | Android: chrome
  33884. if (browser$1.detectAndroidMobile()) {
  33885. this.domElement.addEventListener('touchend', this.events.onDomElementTouchEnd, true);
  33886. } else if (browser$1.detectIOS()) {
  33887. this.domElement.addEventListener('touchstart', this.events.onDomElementTouchStart, true);
  33888. } else {
  33889. this.domElement.addEventListener('mousedown', this.events.onDomElementMouseDown, true);
  33890. }
  33891. } else {
  33892. videoElement.play();
  33893. }
  33894. }
  33895. }, {
  33896. key: "pause",
  33897. value: function pause() {
  33898. this.video && this.video.pause();
  33899. }
  33900. }, {
  33901. key: "resume",
  33902. value: function resume() {
  33903. if (this.video) {
  33904. this.play(this.video);
  33905. } else {
  33906. console.warn('FlvVideoPlayer: 没有可播放的视频');
  33907. }
  33908. }
  33909. }, {
  33910. key: "setMuted",
  33911. value: function setMuted(muted) {
  33912. var _iterator = _createForOfIteratorHelper$5(this.instances.values()),
  33913. _step;
  33914. try {
  33915. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  33916. var instance = _step.value;
  33917. instance.videoElement.muted = muted;
  33918. }
  33919. } catch (err) {
  33920. _iterator.e(err);
  33921. } finally {
  33922. _iterator.f();
  33923. }
  33924. this.isMuted = muted;
  33925. }
  33926. /* onDomElementTouchStart() {
  33927. this.setMuted(false)
  33928. this.domElement.removeEventListener('touchstart', this.onDomElementTouchStart)
  33929. }
  33930. onDomElementTouchEnd() {
  33931. this.setMuted(false)
  33932. this.domElement.removeEventListener('touchstart', this.onDomElementTouchEnd)
  33933. }
  33934. onDomElementMouseDown() {
  33935. this.setMuted(false)
  33936. this.domElement.removeEventListener('mousedown', this.onDomElementMouseDown)
  33937. } */
  33938. }]);
  33939. return FlvVideoPlayer;
  33940. }(EventEmitter);
  33941. var PanoVideoRendererState = {
  33942. Pause: 0,
  33943. Playing: 1
  33944. };
  33945. function _createSuper$P(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$P(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  33946. function _isNativeReflectConstruct$P() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  33947. defineComponent('PanoVideoRenderer', function () {
  33948. return /*#__PURE__*/function (_EventEmitter) {
  33949. _inherits(PanoVideoRenderer, _EventEmitter);
  33950. var _super = _createSuper$P(PanoVideoRenderer);
  33951. function PanoVideoRenderer() {
  33952. var _this;
  33953. _classCallCheck(this, PanoVideoRenderer);
  33954. _this = _super.call(this);
  33955. window.panoVideoRenderer = _assertThisInitialized(_this);
  33956. _this.version = 1;
  33957. _this.videoPlayer = null;
  33958. _this.activePanorama = null;
  33959. _this.nearestPano = null;
  33960. _this.ready = false;
  33961. _this._state = PanoVideoRendererState.Pause;
  33962. _this.texture = null;
  33963. _this.isGuiding = false;
  33964. _this.isRecording = false;
  33965. _this.isSoundRecording = false;
  33966. _this.loadingAnimEnable = true;
  33967. _this.loadingTimeStamp = 0;
  33968. _this.loadingUITimer = 0;
  33969. _this.loadingUIAnimHandler = 0;
  33970. var uniforms = THREE.UniformsUtils.clone(shaders.videoLoading.uniforms);
  33971. uniforms['uColor'].value = new THREE.Vector4(0, 0.7843137254901961, 0.6862745098039216, 0.7);
  33972. _this.loadingUI = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.4, 0.4), new THREE.RawShaderMaterial({
  33973. uniforms: uniforms,
  33974. vertexShader: shaders.videoLoading.vertexShader,
  33975. fragmentShader: shaders.videoLoading.fragmentShader,
  33976. transparent: true
  33977. }));
  33978. _this.loadingUI.visible = false;
  33979. return _this;
  33980. }
  33981. _createClass(PanoVideoRenderer, [{
  33982. key: "init",
  33983. value: function init(videosInfo) {
  33984. var _this2 = this;
  33985. var player = this.$app.core.get('Player');
  33986. this.videosInfo = videosInfo;
  33987. if (!videosInfo) {
  33988. logger$1.warn('PanoVideoRenderer初始化失败,数据为空');
  33989. return;
  33990. }
  33991. this.version = videosInfo.version; // this.initVideoPlayer(this.$app.dom, videosInfo.videos)
  33992. player.on('guide/play/start', function (index) {
  33993. _this2.isGuiding = true;
  33994. _this2.setMuted(true);
  33995. });
  33996. player.on('guide/play/pause', function (index) {
  33997. _this2.isGuiding = false;
  33998. _this2.setMuted(false);
  33999. });
  34000. this.$app.core.get('Player').on('guide/play/stop', function (index) {
  34001. _this2.isGuiding = false;
  34002. _this2.setMuted(false);
  34003. });
  34004. this.ready = true;
  34005. if (browser$1.detectIE() || navigator.userAgent.match('JSN-AL00')) {
  34006. //之前的记录:JSN-AL00 荣耀8x Harmony OS2.0 微信8.0.28 无法显示球幕 2023.5.29又发现可以显示 场景:KK-t-Gw0q49v8k4W
  34007. this.ready = false;
  34008. console.warn('浏览器不支持球幕视频', navigator.userAgent);
  34009. }
  34010. this.$app.core.get('SceneRenderer').scene.add(this.loadingUI);
  34011. /* let updateVideoMarkerDisplay = ()=>{ //---如果要在这些界面上隐藏video图标的话
  34012. if(player.mode != 'floorplan') return //?
  34013. let showVideo = this.canShowMarker('floorplan')
  34014. console.log('updateVideoMarkerDisplay', showVideo)
  34015. player.model.panos.forEach((pano)=>{
  34016. let v = showVideo && (player.model.allFloorsVisible || !pano.floor.hidden)
  34017. if(pano.flagSpot) pano.marker.material.opacity = v ? 1 : 0
  34018. })
  34019. }
  34020. player.on('beginTagVisiSetting', updateVideoMarkerDisplay)
  34021. player.on('exitTagVisiSetting', updateVideoMarkerDisplay)
  34022. player.on('editViewStateChange', updateVideoMarkerDisplay)
  34023. player.on('beginEditOverlay', updateVideoMarkerDisplay)
  34024. player.on('endEditOverlay', updateVideoMarkerDisplay) */
  34025. var updateVideoMarkerDisplay = function updateVideoMarkerDisplay() {
  34026. //---如果要在这些界面上隐藏video图标的话
  34027. if (player.mode != 'floorplan') return; //?
  34028. var showVideo = _this2.canShowMarker('floorplan');
  34029. console.log('updateVideoMarkerDisplay', showVideo);
  34030. player.model.panos.forEach(function (pano) {
  34031. var v = showVideo && (player.model.allFloorsVisible || !pano.floor.hidden);
  34032. if (pano.flagSpot) pano.marker.material.opacity = v ? 1 : 0;
  34033. });
  34034. };
  34035. player.on('linkEditorSetVisible', function (s) {
  34036. updateVideoMarkerDisplay();
  34037. });
  34038. var recoverVideoMarkers = function recoverVideoMarkers() {
  34039. //---恢复video的marker显示
  34040. player.model.panos.forEach(function (pano) {
  34041. var v = player.model.allFloorsVisible || !pano.floor.hidden;
  34042. if (pano.flagSpot) pano.marker.material.opacity = v ? 1 : 0;
  34043. });
  34044. };
  34045. player.on('editViewStateChange', function (state) {
  34046. //退出view的编辑
  34047. if (state == false) recoverVideoMarkers();
  34048. });
  34049. }
  34050. }, {
  34051. key: "initVideoPlayer",
  34052. value: function initVideoPlayer(dom, videos) {
  34053. var _VersionControl$getEn = VersionControl.getEnvironment(),
  34054. os = _VersionControl$getEn.os,
  34055. environment = _VersionControl$getEn.environment;
  34056. /* // if (window.navigator.userAgent.indexOf('WindowsWechat') === -1 && window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  34057. // // 小米自带浏览器只能用FlvVideoPlayer
  34058. // this.videoPlayer = new FlvVideoPlayer(dom, videos)
  34059. // } else {
  34060. this.videoPlayer = new H5VideoPlayer(dom, videos)
  34061. // } */
  34062. //--------之前为什么注释呢?
  34063. //oppo k5 自带的浏览器flv和h5均无法播放, google edge浏览器可以
  34064. //来自v3:
  34065. if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  34066. // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
  34067. this.videoPlayer = new FlvVideoPlayer$1(dom, videos); //console.log('use FlvVideoPlayer')
  34068. } else {
  34069. //console.log('use H5VideoPlayer')
  34070. this.videoPlayer = new H5VideoPlayer$1(dom, videos);
  34071. }
  34072. this.videoPlayer.on(PanoVideoEvents.CanPlay, this.onVideoCanPlay.bind(this));
  34073. this.videoPlayer.on(PanoVideoEvents.StartPlay, this.onVideoStartPlay.bind(this));
  34074. this.videoPlayer.on(PanoVideoEvents.Switch, this.onVideoSwitch.bind(this));
  34075. this.videoPlayer.on(PanoVideoEvents.Resume, this.onVideoResume.bind(this));
  34076. this.videoPlayer.on(PanoVideoEvents.Pause, this.onVideoPause.bind(this));
  34077. this.videoPlayer.on(PanoVideoEvents.Stop, this.onVideoStop.bind(this));
  34078. }
  34079. }, {
  34080. key: "activatePanorama",
  34081. value: function activatePanorama(panorama, isFirstPlay) {
  34082. var _this3 = this;
  34083. //console.log('activatePanorama', panorama && panorama.id)
  34084. if (!panorama.hasVideo || !this.ready) {
  34085. //console.log("renderVideo skip", panorama)
  34086. return;
  34087. }
  34088. this.activePanorama = panorama;
  34089. this.started = true;
  34090. this.videoPlayer.startVideo(panorama.id, isFirstPlay);
  34091. this.loadingUITimer = setTimeout(function () {
  34092. _this3.showLoading(panorama);
  34093. window.clearTimeout(_this3.loadingUITimer);
  34094. }, 500);
  34095. }
  34096. }, {
  34097. key: "deactivePanorama",
  34098. value: function deactivePanorama(panorama) {
  34099. //console.log('deactivePanorama', panorama && panorama.id)
  34100. if (panorama != null && panorama.id != null) {
  34101. this.videoPlayer.pauseVideo(panorama.id);
  34102. }
  34103. this.activePanorama = null;
  34104. }
  34105. }, {
  34106. key: "preActivatePanorama",
  34107. value: function preActivatePanorama(panorama) {
  34108. this.videoPlayer.startVideo(panorama.id, true);
  34109. }
  34110. }, {
  34111. key: "getActivePanorama",
  34112. value: function getActivePanorama() {
  34113. return this.activePanorama;
  34114. }
  34115. }, {
  34116. key: "showLoading",
  34117. value: function showLoading(pano) {
  34118. if (!this.loadingAnimEnable) return;
  34119. var target = new THREE.Vector3().copy(pano.position);
  34120. var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(this.$app.core.get('Player').model.supportsTiles ? 90 : 180));
  34121. var direction = new THREE.Vector3(0, 0, -1).applyQuaternion(qua.multiply(pano.quaternion));
  34122. this.loadingUI.position.copy(target).add(direction);
  34123. this.loadingUI.lookAt(target); // this.loadingUI.visible = true
  34124. this.loadingTimeStamp = performance.now();
  34125. this.loadingAnimte(0);
  34126. }
  34127. }, {
  34128. key: "hideLoading",
  34129. value: function hideLoading() {
  34130. this.loadingUI.visible = false;
  34131. window.cancelAnimationFrame(this.loadingUIAnimHandler);
  34132. window.clearTimeout(this.loadingUITimer);
  34133. }
  34134. }, {
  34135. key: "loadingAnimte",
  34136. value: function loadingAnimte(elapsedTime) {
  34137. this.loadingUI.material.uniforms['uTime'].value = performance.now() - this.loadingTimeStamp;
  34138. this.loadingUIAnimHandler = window.requestAnimationFrame(this.loadingAnimte.bind(this));
  34139. }
  34140. }, {
  34141. key: "suspend",
  34142. value: function suspend() {
  34143. if (!this.ready) return false;
  34144. this.videoPlayer.pause();
  34145. this.emit(PanoVideoRendererEvents.SuspendRender);
  34146. }
  34147. }, {
  34148. key: "resume",
  34149. value: function resume() {
  34150. if (!this.ready) return false;
  34151. this.videoPlayer.resume();
  34152. }
  34153. }, {
  34154. key: "canPhonate",
  34155. value: function canPhonate() {
  34156. return this.isGuiding == false && this.isRecording == false && this.isSoundRecording == false;
  34157. }
  34158. }, {
  34159. key: "setMuted",
  34160. value: function setMuted(muted) {
  34161. if (this.videoPlayer) {
  34162. if (!this.canPhonate()) muted = true;
  34163. this.videoPlayer.setMuted(muted);
  34164. }
  34165. }
  34166. }, {
  34167. key: "getState",
  34168. value: function getState() {
  34169. return this._state;
  34170. }
  34171. }, {
  34172. key: "onVideoPanoramasEnter",
  34173. value: function onVideoPanoramasEnter(oldPanorama, newPanorama) {//this.activatePanorama(newPanorama)
  34174. //console.log('onPanoEnter')
  34175. }
  34176. }, {
  34177. key: "onVideoPanoramasExit",
  34178. value: function onVideoPanoramasExit(panorama) {//console.log('onPanoExit')
  34179. //this.deactivePanorama(panorama)
  34180. }
  34181. }, {
  34182. key: "onVideoCanPlay",
  34183. value: function onVideoCanPlay() {
  34184. //console.log('onVideoCanPlay')
  34185. this.emit(PanoVideoRendererEvents.CanPlayVideo);
  34186. }
  34187. }, {
  34188. key: "onVideoStartPlay",
  34189. value: function onVideoStartPlay() {
  34190. //console.log('onVideoStartPlay')
  34191. this.emit(PanoVideoRendererEvents.StartPlayVideo);
  34192. }
  34193. }, {
  34194. key: "onVideoSwitch",
  34195. value: function onVideoSwitch(texture) {
  34196. if (this.texture) this.texture.dispose(); //xzw add
  34197. this.texture = texture;
  34198. this.emit(PanoVideoRendererEvents.TextureUpdate, texture);
  34199. }
  34200. }, {
  34201. key: "onVideoResume",
  34202. value: function onVideoResume() {
  34203. this._state = PanoVideoRendererState.Playing;
  34204. this.emit(PanoVideoRendererEvents.ResumeRender);
  34205. this.hideLoading();
  34206. }
  34207. }, {
  34208. key: "onVideoPause",
  34209. value: function onVideoPause() {
  34210. this._state = PanoVideoRendererState.Pause;
  34211. this.emit(PanoVideoRendererEvents.SuspendRender);
  34212. }
  34213. }, {
  34214. key: "onVideoStop",
  34215. value: function onVideoStop() {
  34216. this._state = PanoVideoRendererState.Pause;
  34217. this.emit(PanoVideoRendererEvents.SuspendRender);
  34218. }
  34219. }, {
  34220. key: "ifEnable",
  34221. value: function ifEnable() {
  34222. //xzw add
  34223. return (
  34224. /* !objects.tagManager.editSpot.enterSplitView && */
  34225. this.ready
  34226. );
  34227. /* && (//其他写了好像没作用 就都播放吧
  34228. !config.isEdit || store.getters.page != 'screen' ) */
  34229. }
  34230. }, {
  34231. key: "canShowMarker",
  34232. value: function canShowMarker() {
  34233. var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'floorplan';
  34234. var player = this.$app.core.get('Player');
  34235. if (mode == 'floorplan') {
  34236. return !(this.$app.Plugins.EditCAD && this.$app.Plugins.EditCAD.display || player.linkEditor && (player.linkEditor.setPanoVisible || player.linkEditor.setTagVisible));
  34237. }
  34238. }
  34239. }]);
  34240. return PanoVideoRenderer;
  34241. }(EventEmitter);
  34242. }); // export default new PanoVideoRenderer()
  34243. /*
  34244. note:
  34245. 初始点位球幕视频静音播放
  34246. */
  34247. function _createSuper$O(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$O(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  34248. function _isNativeReflectConstruct$O() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  34249. defineComponent('DisplayController', function () {
  34250. return /*#__PURE__*/function (_EventEmitter) {
  34251. _inherits(DisplayController, _EventEmitter);
  34252. var _super = _createSuper$O(DisplayController);
  34253. function DisplayController(fadeInSpeed) {
  34254. var _this;
  34255. _classCallCheck(this, DisplayController);
  34256. _this = _super.call(this);
  34257. _this.fadeInSpeed = fadeInSpeed;
  34258. null !== _this.fadeInSpeed && void 0 !== _this.fadeInSpeed || (_this.fadeInSpeed = 0);
  34259. _this.panoVideoRenderer = null;
  34260. return _this;
  34261. }
  34262. _createClass(DisplayController, [{
  34263. key: "init",
  34264. value: function init() {
  34265. this.container = this.$app.core.get('Player').domElement;
  34266. this.panoVideoRenderer = this.$app.core.get('PanoVideoRenderer');
  34267. this.updateModel();
  34268. this.bindEvents();
  34269. }
  34270. }, {
  34271. key: "bindEvents",
  34272. value: function bindEvents() {
  34273. this.$app.core.get('Player').on(PlayerEvents.FlyingStarted, this.handlePlayerFlyingStarted.bind(this));
  34274. this.$app.core.get('Player').on(PlayerEvents.FlyingEnded, this.handlePlayerFlyingEnded.bind(this));
  34275. this.$app.core.get('Player').on(PlayerEvents.ModeChanging, this.handlePlayerModeChanging.bind(this));
  34276. this.$app.core.get('Player').on(PlayerEvents.ModeChanged, this.handlePlayerModeChanged.bind(this));
  34277. this.$app.core.get('Player').on(PlayerEvents.ClosestPanoChanging, this.handleClosestPanoChanging.bind(this));
  34278. this.$app.core.get('Player').on(PlayerEvents.StartInside, this.handleStartInside.bind(this)); //若初始画面在内
  34279. this.$app.core.get('Player').on(PlayerEvents.StartOutside, this.handleStartOutside.bind(this));
  34280. }
  34281. }, {
  34282. key: "updateModel",
  34283. value: function updateModel() {
  34284. this.model = this.$app.core.get('ModelManager').getActiveModel();
  34285. }
  34286. }, {
  34287. key: "handlePlayerFlyingStarted",
  34288. value: function handlePlayerFlyingStarted(panoInfo) {
  34289. var lastPano = this.model.panos.index[panoInfo.lastPanoId];
  34290. this.panoVideoRenderer.deactivePanorama(lastPano);
  34291. this.panoVideoRenderer.setMuted(true);
  34292. }
  34293. }, {
  34294. key: "handlePlayerFlyingEnded",
  34295. value: function handlePlayerFlyingEnded(_ref) {
  34296. var targetPano = _ref.targetPano;
  34297. if (targetPano && this.model.mode == Viewmode$1.PANORAMA) {
  34298. this.panoVideoRenderer.activatePanorama(targetPano);
  34299. }
  34300. this.panoVideoRenderer.setMuted(false);
  34301. }
  34302. }, {
  34303. key: "handlePlayerModeChanging",
  34304. value: function handlePlayerModeChanging(oldMode, newMode, pano) {
  34305. var activeModel = this.$app.core.get('ModelManager').getActiveModel();
  34306. var opacity; //if(this.$app.core.get('Player').is360View(newMode, pano) || this.$app.core.get('Director').tourIsPlaying)
  34307. if (this.$app.core.get('Player').is360View(newMode, pano)) {
  34308. opacity = 0;
  34309. } else {
  34310. opacity = settings$3[newMode].markerOpacity;
  34311. } //显示地面的白色圈圈
  34312. activeModel.fadePanoMarkers(opacity, 0, {
  34313. mode: newMode
  34314. }); //activeModel.setMode(newMode) //xzw改 没必要所以去掉,在handlePlayerModeChanged中写了。否则太乱了。
  34315. }
  34316. }, {
  34317. key: "handlePlayerModeChanged",
  34318. value: function handlePlayerModeChanged(e, mode) {
  34319. var activeModel = this.$app.core.get('ModelManager').getActiveModel();
  34320. var sid = mode === Viewmode$1.PANORAMA ? THREE.DoubleSide : THREE.FrontSide;
  34321. activeModel.setSide(sid);
  34322. activeModel.setMode(mode);
  34323. } //地面的marker变清晰
  34324. }, {
  34325. key: "handleClosestPanoChanging",
  34326. value: function handleClosestPanoChanging(closestPano, newClosestPano, mode) {
  34327. if (mode !== Viewmode$1.TRANSITIONING) {
  34328. closestPano && closestPano.hoverOff(mode);
  34329. newClosestPano && newClosestPano.hoverOn(mode);
  34330. }
  34331. } //add
  34332. }, {
  34333. key: "handleStartInside",
  34334. value: function handleStartInside(duration) {
  34335. var t = settings$3[this.$app.core.get('Player').mode],
  34336. i = duration ? 0 : t.transitionTime * t.skyboxOpacityLength;
  34337. this.fadeIn(this.fadeInSpeed);
  34338. this.model.alpha = 0;
  34339. this.model.skybox.material.uniforms.opacity.value = 1; //(this.model.skybox.originMat || this.model.skybox.material).uniforms.opacity.value = 1
  34340. this.model.fadePanoMarkers(null, null, {
  34341. player: this.$app.core.get('Player')
  34342. }); //(e ? 0 : t.markerOpacity);
  34343. var reticule = this.$app.core.get('Player').reticule;
  34344. transitions$1.start(lerp.property(reticule.material, 'opacity', 0), i, null, 0, null, 'retReOpac');
  34345. }
  34346. }, {
  34347. key: "handleStartOutside",
  34348. value: function handleStartOutside(duration) {
  34349. this.fadeIn(duration);
  34350. }
  34351. }, {
  34352. key: "fadeIn",
  34353. value: function fadeIn(duration) {
  34354. null !== duration && void 0 !== duration || (duration = 2000, logger.warn('DisplayController.fadeIn -> no transition time specified, defaulting to 2000 ms.'));
  34355. if (this.model) {
  34356. //this.model.chunks.forEach(item => (item.visible = true)) //xzw 4.6.0 隐藏chunk
  34357. this.model.panos.forEach(function (item) {
  34358. return item.updateMakerStyle();
  34359. });
  34360. }
  34361. }
  34362. }]);
  34363. return DisplayController;
  34364. }(EventEmitter);
  34365. });
  34366. defineComponent('QuickstartManager', function () {
  34367. return /*#__PURE__*/function () {
  34368. function QuickstartManager(qualityManager, scene, camera, controls, panoVideoRenderer) {
  34369. _classCallCheck(this, QuickstartManager);
  34370. this.locked = false;
  34371. this.qualityManager = qualityManager;
  34372. this.scene = scene;
  34373. this.camera = camera;
  34374. this.controls = controls;
  34375. this.quickStartcamera = controls.camera;
  34376. this.view = null;
  34377. this.panoVideoRenderer = panoVideoRenderer;
  34378. this.unlockDom = null;
  34379. this.unlockHanlde = null;
  34380. this.loadPromise = null;
  34381. this.ready = false;
  34382. this.touchStartPosition = new THREE.Vector2(0, 0);
  34383. this.touchMoveDelta = new THREE.Vector2(0, 0);
  34384. this.touchPrevPosition = new THREE.Vector2(0, 0);
  34385. this.touchMoveOffset = new THREE.Vector2(0, 0);
  34386. this.enter = false;
  34387. this.canEnter = false;
  34388. this.animFov = null;
  34389. this.animRotation = null;
  34390. this.initTarget = new THREE.Vector3(0, 0, 0);
  34391. this.enterView = {
  34392. pano: null,
  34393. quaternion: new THREE.Quaternion(),
  34394. position: new THREE.Vector3(),
  34395. fov: settings$3.insideFOV
  34396. };
  34397. }
  34398. _createClass(QuickstartManager, [{
  34399. key: "init",
  34400. value: function init(view, metadata) {
  34401. this.dom = this.$app.core.get('Player').domElement;
  34402. this.pano = view.pano;
  34403. this.setSize(window.innerWidth, window.innerHeight);
  34404. this.initView(view);
  34405. this.skybox = new THREE.Mesh(new THREE.BoxBufferGeometry(1, 1, 1), new ModelTextureMaterial({
  34406. side: THREE.DoubleSide
  34407. }));
  34408. this.skybox.material.uniforms.map.value = view.pano.getSkyboxTexture();
  34409. this.skybox.quaternion.copy(view.quaternion);
  34410. this.scene.add(this.skybox);
  34411. this.skybox.material.depthTest = false;
  34412. this.skybox.material.depthWrite = false;
  34413. this.skybox.renderOrder = 1000;
  34414. this.skybox.name = 'quickStartSkyBox';
  34415. this.skybox.material.uniforms.modelAlpha.value = 0;
  34416. this.skybox.position.copy(this.pano.position);
  34417. this.skybox.visible = true;
  34418. this.scene.add(this.skybox);
  34419. this.pano.attachToPanoVideoRenderer(this.$app.core.get('PanoVideoRenderer'));
  34420. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.StartPlayVideo, this.onVideoStartPlay.bind(this));
  34421. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.TextureUpdate, this.onVideoTextureUpdate.bind(this));
  34422. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.ResumeRender, this.onVideoRenderResume.bind(this));
  34423. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.SuspendRender, this.onVideoRenderSuspend.bind(this));
  34424. if (this.$app.core.get('PanoVideoRenderer').videosInfo) {
  34425. var parameters = this.$app.core.get('PanoVideoRenderer').videosInfo.parameters;
  34426. this.skybox.material.uniforms.parameters.value.set(parameters.inputWidth, parameters.inputHeight, parameters.outputWidth, parameters.outputHeight, parameters.focal, parameters.pixel, parameters.centerX, parameters.centerY, parameters.translateX, parameters.translateY, parameters.translateZ, 0, parameters.lenOffsetX, parameters.lenOffsetY, parameters.videoWidth, parameters.videoHeight);
  34427. if (parameters.cameraType == 8) {
  34428. this.skybox.material.defines.HasVideo = 8; //8目
  34429. } else if (parameters.cameraType == 2) {
  34430. this.skybox.material.defines.HasVideo = 2; //2目
  34431. }
  34432. this.skybox.material.defines['VideoMapping'] = parameters.mapping;
  34433. this.skybox.material.uniforms.videoReady.value = 0;
  34434. this.skybox.material.uniforms.progress.value = 1;
  34435. }
  34436. }
  34437. }, {
  34438. key: "initView",
  34439. value: function initView(view) {
  34440. this.view = view;
  34441. var pano = view.pano;
  34442. view.mode;
  34443. view.zoom;
  34444. view.position;
  34445. view.quaternion;
  34446. this.controls.locked = false;
  34447. this.controls.camera.position.copy(pano.position); // zeg 这部分代码使球幕点位初始化的相机旋转变为0
  34448. // if (pano.hasVideo && !view.setByUrl) {
  34449. // if (pano.videoInfo.dir) {
  34450. // this.initTarget.copy(pano.videoInfo.dir).add(pano.position)
  34451. // } else {
  34452. // var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(!this.$app.core.get('Player').model.supportsTiles ? 90 : 180))
  34453. // this.initTarget.copy(Vectors.FORWARD.clone().applyQuaternion(qua.multiply(pano.quaternion))).add(pano.position)
  34454. // }
  34455. // this.controls.lookAt(this.initTarget)
  34456. // } else {
  34457. this.initTarget.copy(new THREE.Vector3(0, 0, -1).applyQuaternion(view.quaternion)).add(view.position);
  34458. this.controls.lookAt(this.initTarget); // }
  34459. this.quickStartcamera.fov = this.view.fov;
  34460. this.quickStartcamera.aspect = window.innerWidth / window.innerHeight;
  34461. this.quickStartcamera.updateProjectionMatrix();
  34462. this.camera.fov = this.view.fov;
  34463. this.camera.aspect = window.innerWidth / window.innerHeight;
  34464. this.camera.position.copy(this.quickStartcamera.position);
  34465. this.camera.quaternion.copy(this.quickStartcamera.quaternion);
  34466. this.enterView.pano = pano;
  34467. this.enterView.position.copy(this.view.position);
  34468. this.enterView.quaternion.copy(this.view.quaternion);
  34469. this.enterView.fov = this.view.fov;
  34470. this.controls.update(0.016);
  34471. /* this.controls.locked = true
  34472. this.controls.limitDownAngel = this.controls.lat */
  34473. //xzw 2023.1.18注释
  34474. this.view.position.copy(this.quickStartcamera.position);
  34475. this.view.quaternion.copy(this.quickStartcamera.quaternion);
  34476. }
  34477. }, {
  34478. key: "load",
  34479. value: function load(view) {
  34480. var _this = this;
  34481. if (this.loadPromise) return this.loadPromise;
  34482. var metadata = this.$app.store.__store.metadata;
  34483. this.view = view;
  34484. this.view.pano.shouldRedrawOnBaseLoaded = !0;
  34485. if (this.view.pano.tiled) {
  34486. this.init(view, metadata);
  34487. var $player = document.querySelector('.player[name=main]');
  34488. var lowSize = this.qualityManager.getPanoSize(PanoSizeClass.BASE),
  34489. highSize = this.qualityManager.getPanoSize(PanoSizeClass.STANDARD),
  34490. d = cameraLight.getHFOVForCamera(this.quickStartcamera, $player.clientWidth, $player.clientHeight),
  34491. p = this.quickStartcamera.fov,
  34492. r = Vectors$1.FORWARD.clone().applyQuaternion(this.view.quaternion);
  34493. var promise1 = this.view.pano.loadTiledPano(highSize, r, {
  34494. hFov: d,
  34495. vFov: p
  34496. }, !1, !1, !0);
  34497. var promise2 = this.view.pano.loadTiledPano(lowSize, r.clone().negate(), null, !1, !1, !0);
  34498. this.loadPromise = new Promise(function (resolve) {
  34499. (_this.view.pano.hasVideo || _this.qualityManager.getMaxNavPanoSize() < 1024 ? promise2 : promise1).then(resolve);
  34500. });
  34501. } else {
  34502. this.init(view, metadata);
  34503. this.loadPromise = new Promise(function (resolve) {
  34504. _this.view.pano.hasVideo ? _this.view.pano.loadCube('low').then(function () {
  34505. return resolve();
  34506. }) : _this.view.pano.loadCube('high').then(function () {
  34507. return resolve();
  34508. });
  34509. });
  34510. }
  34511. this.loadPromise.then(function () {
  34512. _this.ready = true;
  34513. _this.skybox.material.setProjectedPanos(_this.view.pano, _this.view.pano); // 此时已经显示初始点位了,所以也需要设置马赛克和滤镜
  34514. _this.$app.core.get('Player').paintEditor.updatePanoPaint(_this.view.pano.id, _this.view.pano.id);
  34515. _this.$app.FilterManager.updatePanoFilters(_this.view.pano, _this.view.pano);
  34516. });
  34517. return this.loadPromise;
  34518. }
  34519. }, {
  34520. key: "onVideoStartPlay",
  34521. value: function onVideoStartPlay() {}
  34522. }, {
  34523. key: "onVideoTextureUpdate",
  34524. value: function onVideoTextureUpdate(texture) {
  34525. this.skybox.material.uniforms.videoTexture.value = texture;
  34526. }
  34527. }, {
  34528. key: "onVideoRenderResume",
  34529. value: function onVideoRenderResume() {
  34530. this.skybox.material.uniforms.videoReady.value = 1; // 暂停背景音乐
  34531. this.$app.Scene.emit('panorama.videorenderer.resumerender');
  34532. }
  34533. }, {
  34534. key: "onVideoRenderSuspend",
  34535. value: function onVideoRenderSuspend() {
  34536. // this.skybox.material.uniforms.videoReady.value = 0 //修改 球幕视频暂停时不要隐藏
  34537. // todo 播放导览时球目视频挂起不恢复背景音乐
  34538. // 播放背景音乐
  34539. this.$app.Scene.emit('panorama.videorenderer.suspendrender');
  34540. }
  34541. }, {
  34542. key: "watingUnlock",
  34543. value: function watingUnlock() {
  34544. var _this2 = this;
  34545. this.locked = true;
  34546. this.controls.locked = true;
  34547. return new Promise(function (resolve) {
  34548. _this2.unlockHanlde = resolve;
  34549. });
  34550. }
  34551. }, {
  34552. key: "autoUnlock",
  34553. value: function autoUnlock() {
  34554. this.locked = false;
  34555. this.app.active = true;
  34556. this.controls.locked = false;
  34557. this.controls.limitDownAngel = null;
  34558. if (this.pano.hasVideo && browser$1.detectIOS()) {
  34559. this.panoVideoRenderer.setMuted(false);
  34560. } else {
  34561. this.panoVideoRenderer.setMuted(true);
  34562. }
  34563. this.panoVideoRenderer.activatePanorama(this.pano);
  34564. return Promise.resolve(true);
  34565. }
  34566. }, {
  34567. key: "activate",
  34568. value: function activate() {
  34569. this.panoVideoRenderer.setMuted(browser$1.urlQueryValue('sound') == '0');
  34570. this.panoVideoRenderer.activatePanorama(this.pano);
  34571. }
  34572. }, {
  34573. key: "unlock",
  34574. value: function unlock(speed) {
  34575. var _this3 = this;
  34576. if (this.enter) {
  34577. this.controls.rotationAcc.set(0, 0);
  34578. return;
  34579. }
  34580. this.enter = true;
  34581. this.app.emit('unlock');
  34582. this.controls.locked = false;
  34583. this.controls.rotationAcc.set(speed.x > 0 ? 0.3 : -0.3, 0);
  34584. this.controls.limitDownAngel = null;
  34585. if (this.animFov) transitions$1.cancel(this.animFov);
  34586. try {
  34587. parent.postMessage({
  34588. num: config.projectNum,
  34589. cmd: 'unlocking',
  34590. isParent: top == self
  34591. }, '*');
  34592. } catch (error) {
  34593. console.error('跨域', error);
  34594. }
  34595. this.animFov = transitions$1.start(lerp.property(this.quickStartcamera, 'fov', 70), 3000, function () {
  34596. _this3.unlockHanlde && _this3.unlockHanlde();
  34597. _this3.locked = false;
  34598. _this3.enter = true;
  34599. _this3.controls.locked = false;
  34600. _this3.controls.rotationAcc.set(0, 0);
  34601. _this3.controls.limitDownAngel = null;
  34602. try {
  34603. parent.postMessage({
  34604. num: config.projectNum,
  34605. cmd: 'unlocked',
  34606. isParent: top == self
  34607. }, '*');
  34608. } catch (error) {
  34609. console.error('跨域', error);
  34610. }
  34611. }, 0.0, easing.easeOutCubic);
  34612. }
  34613. }, {
  34614. key: "exit",
  34615. value: function exit() {
  34616. this.enter = false;
  34617. var pano = this.pano;
  34618. pano.enter();
  34619. this.controls.rotationAcc.set(0, 0);
  34620. this.controls.limitDownAngel = null;
  34621. if (this.animFov) transitions$1.cancel(this.animFov);
  34622. if (this.app.player.model) {
  34623. this.app.player.flyToPano({
  34624. pano: this.pano
  34625. });
  34626. } else {
  34627. this.smoothLookAt(this.initTarget, 1000);
  34628. }
  34629. }
  34630. }, {
  34631. key: "smoothLookAt",
  34632. value: function smoothLookAt(targetLookAt, duration) {
  34633. var _this4 = this;
  34634. duration = duration || 1000;
  34635. var targetDir = targetLookAt.clone().sub(this.controls.camera.position).normalize();
  34636. var currDir = this.controls.lookVector.clone();
  34637. var dir = new THREE.Vector3();
  34638. new THREE.Vector3();
  34639. var lerp = function lerp(alpha) {
  34640. dir.lerpVectors(currDir, targetDir, alpha);
  34641. _this4.controls.lookAt(dir.add(_this4.controls.camera.position));
  34642. };
  34643. this.animFov = transitions$1.start(lerp, duration);
  34644. }
  34645. }, {
  34646. key: "cancelRotate",
  34647. value: function cancelRotate() {
  34648. if (this.enter && this.app.startOption.needUnlock) this.controls.rotationAcc.set(0, 0);
  34649. }
  34650. }, {
  34651. key: "update",
  34652. value: function update(deltaTime) {
  34653. if (this.locked) ;
  34654. this.controls.update(deltaTime);
  34655. this.camera.position.copy(this.quickStartcamera.position);
  34656. this.camera.quaternion.copy(this.quickStartcamera.quaternion);
  34657. this.camera.fov = this.quickStartcamera.fov;
  34658. this.camera.updateProjectionMatrix();
  34659. this.view.position.copy(this.quickStartcamera.position);
  34660. this.view.quaternion.copy(this.quickStartcamera.quaternion);
  34661. this.view.fov = this.quickStartcamera.fov;
  34662. }
  34663. }, {
  34664. key: "setSize",
  34665. value: function setSize(width, height) {
  34666. this.camera.aspect = width / height;
  34667. this.camera.updateProjectionMatrix();
  34668. }
  34669. }, {
  34670. key: "destroy",
  34671. value: function destroy() {
  34672. this.scene.remove(this.skybox);
  34673. this.controls.rotationAcc.set(0, 0); // this.dom.removeEventListener('touchstart', this.cancelRotate)
  34674. // this.unlockDom.removeEventListener('touchstart', this.onTouchStart)
  34675. // this.unlockDom.removeEventListener('touchmove', this.onTouchMove)
  34676. // this.unlockDom.removeEventListener('touchend', this.onTouchEnd)
  34677. } //swiper事件的原因,用于快速切换解锁需要给定dom
  34678. }, {
  34679. key: "attachDom",
  34680. value: function attachDom(dom) {
  34681. dom.addEventListener('touchstart', this.onTouchStart.bind(this));
  34682. dom.addEventListener('touchmove', this.onTouchMove.bind(this));
  34683. dom.addEventListener('touchend', this.onTouchEnd.bind(this));
  34684. }
  34685. }, {
  34686. key: "onTouchEvent",
  34687. value: function onTouchEvent(eventType, event) {
  34688. if (event.type == 'touchstart') {
  34689. this.onTouchStart(event);
  34690. } else if (event.type == 'touchmove') {
  34691. this.onTouchMove(event);
  34692. } else if (event.type == 'touchend') {
  34693. this.onTouchEnd(event);
  34694. }
  34695. }
  34696. }, {
  34697. key: "onTouchStart",
  34698. value: function onTouchStart(event) {
  34699. this.touchStartPosition.set(event.touches[0].clientX, event.touches[0].clientY);
  34700. this.touchPrevPosition.set(event.touches[0].clientX, event.touches[0].clientY);
  34701. this.touchMoveDelta.set(0, 0);
  34702. this.touchMoveOffset.set(0, 0);
  34703. if (this.enter || this.app.needUnlock == false) {
  34704. this.controls.rotationAcc.set(0, 0);
  34705. this.controls.onTouchStart(event);
  34706. } else {
  34707. //this.controls.onTouchStart( event );
  34708. this.canEnter = false;
  34709. }
  34710. this._start = {
  34711. x: event.touches[0].clientX,
  34712. y: event.touches[0].clientY
  34713. };
  34714. }
  34715. }, {
  34716. key: "onTouchMove",
  34717. value: function onTouchMove(event) {
  34718. this._move = {
  34719. x: event.touches[0].clientX,
  34720. y: event.touches[0].clientY
  34721. };
  34722. this.touchMoveDelta.set(event.touches[0].clientX - this.touchPrevPosition.x, event.touches[0].clientY - this.touchPrevPosition.y);
  34723. this.touchPrevPosition.set(event.touches[0].clientX, event.touches[0].clientY);
  34724. this.touchMoveOffset.set(event.touches[0].clientX - this.touchStartPosition.x, event.touches[0].clientY - this.touchStartPosition.y);
  34725. if (this.enter || this.app.needUnlock == false) {
  34726. this.controls.onTouchMove(event);
  34727. } else {
  34728. var speedX = -this.touchMoveDelta.x;
  34729. var slideHor = Math.abs(this.getAngle(this._start, this._move)) < 15; //(Math.abs(this.touchMoveOffset.y) / Math.abs(this.touchMoveOffset.x)) < 0.15
  34730. var canEnter = slideHor && this.enter == false;
  34731. canEnter && this.unlock(new THREE.Vector2(speedX, 0));
  34732. }
  34733. }
  34734. }, {
  34735. key: "onTouchEnd",
  34736. value: function onTouchEnd(event) {
  34737. if (this.enter || this.app.needUnlock == false) {
  34738. this.controls.onTouchEnd(event);
  34739. }
  34740. }
  34741. }, {
  34742. key: "getAngle",
  34743. value: function getAngle(start, end) {
  34744. var diff_x = end.x - start.x,
  34745. diff_y = end.y - start.y;
  34746. return 360 * Math.atan(diff_y / diff_x) / (2 * Math.PI);
  34747. }
  34748. }]);
  34749. return QuickstartManager;
  34750. }();
  34751. });
  34752. var effects$1 = {
  34753. currentBlur: 0,
  34754. aspect: settings$3.aspect,
  34755. blurStrength: 1,
  34756. hblurPass: settings$3.HorizontalBlurShader,
  34757. vblurPass: settings$3.VerticalBlurShader,
  34758. bindEvents(e) {
  34759. e.on(PlayerEvents.ModeChanged, function (mode, t) {
  34760. if (mode === Viewmode$1.PANORAMA) {
  34761. transitions$1.cancel(effects$1.blur);
  34762. transitions$1.cancel(effects$1.addBlur);
  34763. transitions$1.start(effects$1.removeBlur, 500, null, 0, null, 'deblur');
  34764. }
  34765. });
  34766. },
  34767. blur(blur) {
  34768. effects$1.currentBlur = blur;
  34769. var t = blur * effects$1.blurStrength;
  34770. settings$3.VerticalBlurShader.uniforms.v.value = t / 512 * effects$1.aspect;
  34771. settings$3.HorizontalBlurShader.uniforms.h.value = t / 512;
  34772. },
  34773. addBlur(blur) {
  34774. blur = Math.max(blur, effects$1.currentBlur);
  34775. effects$1.blur(blur);
  34776. },
  34777. removeBlur(blur) {
  34778. blur = Math.min(1 - blur, effects$1.currentBlur);
  34779. effects$1.blur(blur);
  34780. }
  34781. };
  34782. effects$1.blur(0);
  34783. var BasicException$1 = function BasicException(message) {
  34784. _classCallCheck(this, BasicException);
  34785. this.message = message;
  34786. };
  34787. function _createSuper$N(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$N(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  34788. function _isNativeReflectConstruct$N() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  34789. var RendererCreationException$1 = /*#__PURE__*/function (_BasicException) {
  34790. _inherits(RendererCreationException, _BasicException);
  34791. var _super = _createSuper$N(RendererCreationException);
  34792. function RendererCreationException(e) {
  34793. _classCallCheck(this, RendererCreationException);
  34794. return _super.call(this, e);
  34795. }
  34796. return RendererCreationException;
  34797. }(BasicException$1);
  34798. function _createSuper$M(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$M(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  34799. function _isNativeReflectConstruct$M() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  34800. var sceneRenderer$1, player$7;
  34801. var hasInit; // zeg加 否则分屏时会重复初始化
  34802. //window.settings = settings
  34803. //window.ifTest = true // 调试不会开启陀螺仪
  34804. //window.VRScreenType="portrait" //: 不分屏,没有空中小球
  34805. //const flickerThreshold = 0.001
  34806. var avoidFlicker;
  34807. window.screenFaceOrient = 0;
  34808. var vrPermission = {};
  34809. var vrPermissionCallBack = function vrPermissionCallBack(info1, info2) {
  34810. if (info1 == 'reset') {
  34811. vrPermission = {};
  34812. } else {
  34813. vrPermission[info1] = info2;
  34814. if (Object.keys(vrPermission).length == 2 && (vrPermission.deviceMotion != 'granted' || vrPermission.deviceOrientation != 'granted')) {
  34815. //$alert({content:"运动和方向访问失败", "这会导致画面视角一直固定。您需要完全关闭" + (Config.app ?"App":"此浏览器") + ",然后再次打开,并允许访问运动与方向。"})
  34816. // if (!window.VRScreenNotFull) {
  34817. // $alert({ content: i18n.t('modules.base.vr_fail_reopen_tips') })
  34818. // }
  34819. console.error('运动和方向访问失败');
  34820. }
  34821. }
  34822. };
  34823. var vr = /*#__PURE__*/function (_THREE$EventDispatche) {
  34824. _inherits(vr, _THREE$EventDispatche);
  34825. var _super = _createSuper$M(vr);
  34826. function vr() {
  34827. _classCallCheck(this, vr);
  34828. return _super.call(this);
  34829. }
  34830. _createClass(vr, [{
  34831. key: "Init",
  34832. value: function Init(_sceneRenderer, _player) {
  34833. //初始化 外部使用
  34834. sceneRenderer$1 = _sceneRenderer;
  34835. player$7 = _player;
  34836. player$7.VR = this;
  34837. if (!sceneRenderer$1.renderer || sceneRenderer$1.newRenderer || hasInit) return; //还未准备好renderer或已经Init过了
  34838. var vrTexture = common.loadTextureFromCache(texture.getImageURL('images/circleMarker.png'));
  34839. player$7.model.panos.list.forEach(function (pano) {
  34840. pano.createVrMarker(vrTexture, player$7);
  34841. });
  34842. sceneRenderer$1.newRenderer = new vrRenderer(sceneRenderer$1.renderer, sceneRenderer$1, sceneRenderer$1.camera);
  34843. sceneRenderer$1.isHuawei5X = browser$1.detectHUAWEI5X();
  34844. sceneRenderer$1.oldRenderer = sceneRenderer$1.renderer;
  34845. webxr.init(sceneRenderer$1.renderer);
  34846. initFlicker();
  34847. if (player$7.$app.config.vr.markerHeight != null && !isNaN(player$7.$app.config.vr.markerHeight)) {
  34848. var height = player$7.$app.config.vr.markerHeight;
  34849. player$7.model.panos.forEach(function (pano) {
  34850. if (!pano.vrMarker) return; //pano.vrMarker.position.y = pano.floorPosition.y + (v != void 0 ? v : pano.height - 0.2)
  34851. pano.vrMarker.position.y = pano.floorPosition.y + height;
  34852. });
  34853. }
  34854. var _vrEnabled = !1; //vr状态是否开启(开启陀螺仪)
  34855. var _vrSplitScreen = false; //是否分屏
  34856. var events = {
  34857. // get aspect
  34858. setSize: function setSize(b, c) {
  34859. sceneRenderer$1.camera.aspect = b / c;
  34860. }
  34861. }; //if (!settings.hasOwnProperty('vrEnabled')) {
  34862. Object.defineProperty(settings$3, 'vrEnabled', {
  34863. get: function get() {
  34864. return _vrEnabled;
  34865. },
  34866. set: function set(b) {
  34867. b = !!b;
  34868. player$7.cameraControls.controls.panorama.locked = b;
  34869. player$7.model.chunks.forEach(function (c) {
  34870. return c.visible = !(b && (webxr.xrType || settings$3.vrSplitScreen));
  34871. }); //vr模式下 改变chunks显示会让画面分离度改变,可能和眼睛看物体远近不同的夹角有关。 而一直显示模型会有穿墙危险,所以改为一直不显示模型。// 为什么注释掉了?
  34872. //注: 2022.10.19: 调试pico的webxr时,发现若显示模型,会看出模型轮廓,画面被割裂(原地非过渡)。原因可能是头盔是两个camera,且都与原位置有偏差,所以不在pano中心。(但是之前vr眼镜似乎没有此现象?) 故而关闭模型显示,代价就是过渡时无法贴合模型,多楼层看起来像悬空的。
  34873. if (webxr.xrType) {
  34874. return b ? webxr.enterVR() : webxr.leaveVR();
  34875. } else {
  34876. //交换renderer
  34877. b && settings$3.vrSplitScreen ? (sceneRenderer$1.renderer = sceneRenderer$1.newRenderer, player$7.cameraControls.cameras.panorama.staticFov = 70 //为了使镜头不变形
  34878. ) : (sceneRenderer$1.renderer = sceneRenderer$1.oldRenderer, player$7.cameraControls.cameras.panorama.staticFov = null);
  34879. }
  34880. _vrEnabled = b; //注:pico3的xr全屏会黑屏
  34881. if (!window.VRScreenNotFull) {
  34882. b ? browser$1.requestFullscreen(
  34883. /* player.domElement */
  34884. document.body) : browser$1.exitFullscreen();
  34885. } //是否全屏:!!document.fullscreenElement
  34886. //objects.gui.showVrHorizonTip(_vrEnabled && !_vrSplitScreen)
  34887. if (!VR.cursor) createCursor(0.5, true, 1, 16777215, 0); //transparent改为true,旧版竟然可以是false
  34888. if (window.VRScreenType != 'portrait') {
  34889. //普通模式( 不是这种不需要分屏和vrMarker的情况)
  34890. VR.cursor.visible = b;
  34891. sceneRenderer$1.updateScreenSize({
  34892. forceUpdateSize: true
  34893. }); //sceneRenderer.setSize(window.innerWidth, window.innerHeight)
  34894. player$7.model.updateVrMarker(b, player$7);
  34895. }
  34896. if (!b) {
  34897. var pos = player$7.position;
  34898. var qur = new THREE.Quaternion().copy(player$7.camera.quaternion);
  34899. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(qur).add(pos);
  34900. if (lookAtPoint.x == pos.x && lookAtPoint.z == pos.z) {
  34901. console.log('看向正地面时无法lookAt,无法更新camera转向,直接退出vr');
  34902. } else player$7.cameraControls.activeControl.lookAt(lookAtPoint); //退出时更新一下camera的方向
  34903. player$7.viewLinkManager.showAllViews();
  34904. VR.shiftQuaternion = null;
  34905. var index = sceneRenderer$1.resizeListeners.indexOf(events);
  34906. sceneRenderer$1.resizeListeners.splice(index, 1);
  34907. } else {
  34908. player$7.viewLinkManager.hideAllViews();
  34909. sceneRenderer$1.resizeListeners.push(events); //处理失败:
  34910. setTimeout(function () {
  34911. console.log('orientEnable' + window.orientEnable);
  34912. if (settings$3.vrEnabled && !window.orientEnable) {
  34913. //很可能没能触发陀螺仪事件
  34914. if (browser$1.detectIOS()
  34915. /* && browser.detectSafari() */
  34916. ) {
  34917. var b = browser$1.iosVersion(); //{major: 10, minor: 3, patch: 1}
  34918. //console.log("开始获取权限 major"+b.major)
  34919. if (b.major == 12 && b.minor >= 2) {
  34920. if (!window.VRScreenNotFull) {
  34921. if (browser$1.detectSafari()) $alert({
  34922. content: i18n.t('modules.base.vr_fail_safari_tips')
  34923. });else {
  34924. //app??
  34925. $alert({
  34926. content: i18n.t('modules.base.vr_fail_app_tips')
  34927. });
  34928. }
  34929. }
  34930. } else if (b.major >= 13) {
  34931. var hasFailed = window.vrPermission && (window.vrPermission.deviceMotion != 'granted' || window.vrPermission.deviceOrientation != 'granted'); //hasFailed || $tips({content: i18n.t('modules.base.please_click_tips')})
  34932. setTimeout(function () {
  34933. if (!settings$3.vrEnabled || window.orientEnable) return;
  34934. vrPermissionCallBack('reset');
  34935. if (window.DeviceMotionEvent && window.DeviceMotionEvent.requestPermission && typeof window.DeviceMotionEvent.requestPermission === 'function') {
  34936. console.log('开始获取权限1'); ///注意:需要https 本地服务器permissionState会得到denied
  34937. window.DeviceMotionEvent.requestPermission().then(function (permissionState) {
  34938. console.log('permissionState1: ' + permissionState);
  34939. vrPermissionCallBack('deviceMotion', permissionState);
  34940. }).catch(function (e) {
  34941. vrPermissionCallBack('deviceMotion', false);
  34942. console.log(e);
  34943. });
  34944. } else {
  34945. console.log('window.DeviceMotionEvent undefined');
  34946. vrPermissionCallBack('deviceMotion', false);
  34947. }
  34948. if (window.DeviceOrientationEvent && window.DeviceOrientationEvent.requestPermission && typeof window.DeviceOrientationEvent.requestPermission === 'function') {
  34949. console.log('开始获取权限2');
  34950. window.DeviceOrientationEvent.requestPermission().then(function (permissionState) {
  34951. console.log('permissionState2: ' + permissionState);
  34952. vrPermissionCallBack('deviceOrientation', permissionState);
  34953. }).catch(function (e) {
  34954. vrPermissionCallBack('deviceOrientation', false);
  34955. console.log(e);
  34956. });
  34957. } else {
  34958. console.log('window.DeviceOrientationEvent undefined');
  34959. vrPermissionCallBack('deviceOrientation', false);
  34960. }
  34961. }, hasFailed ? 0 : 150);
  34962. /* /* setTimeout(function(){
  34963. if(settings.vrEnabled && !window.orientEnable){
  34964. $alert("若画面视角一直固定,您需要完全关闭Safari浏览器,然后再次打开以开启运动和方向访问。")
  34965. }
  34966. },4000) */
  34967. } else console.log('陀螺仪似乎未能启用 ios ' + b.major + '.' + b.minor);
  34968. }
  34969. }
  34970. }, 200);
  34971. }
  34972. player$7.emit('vrStateChanged');
  34973. }
  34974. });
  34975. Object.defineProperty(settings$3, 'vrSplitScreen', {
  34976. //分屏 许钟文加
  34977. get: function get() {
  34978. return _vrSplitScreen;
  34979. },
  34980. set: function set(b) {
  34981. b = !!b;
  34982. if (_vrSplitScreen == b) return;
  34983. _vrSplitScreen = b;
  34984. if (!settings$3.vrEnabled || window.VRScreenType == 'portrait') return;
  34985. b ? (sceneRenderer$1.renderer = sceneRenderer$1.newRenderer, player$7.cameraControls.cameras.panorama.staticFov = 70) : (sceneRenderer$1.renderer = sceneRenderer$1.oldRenderer, player$7.cameraControls.cameras.panorama.staticFov = null);
  34986. player$7.model.chunks.forEach(function (c) {
  34987. return c.visible = !b;
  34988. });
  34989. sceneRenderer$1.updateScreenSize({
  34990. forceUpdateSize: true
  34991. }); //sceneRenderer.setSize(window.innerWidth, window.innerHeight)//不这么写因刚旋转时 window.innerWidth, window.innerHeight 不准确
  34992. //console.log('vrSplitScreen', b, window.innerWidth, window.innerHeight, player.domElement.clientWidth, player.domElement.clientHeight)
  34993. player$7.emit('vrStateChanged');
  34994. }
  34995. }); //}
  34996. if (window.orientation == 90 || window.orientation == 270) {
  34997. //横屏
  34998. settings$3.vrSplitScreen = true;
  34999. } // let vrMarkerHeight
  35000. // Object.defineProperty(settings, 'vrMarkerHeight', {
  35001. // get: function () {
  35002. // return vrMarkerHeight
  35003. // },
  35004. // set: function (v) {
  35005. // vrMarkerHeight = v
  35006. // player.model.panos.forEach(pano => {
  35007. // if (!pano.vrMarker) return
  35008. // pano.vrMarker.position.y = pano.floorPosition.y + (v != void 0 ? v : pano.height - 0.2)
  35009. // })
  35010. // },
  35011. // })
  35012. //window.sett = settings
  35013. window.addEventListener('orientationchange', function (e) {
  35014. //console.log(`vr orientation ${window.orientation}`)
  35015. if (window.orientation == 0 || window.orientation == 180) {
  35016. //竖屏
  35017. settings$3.vrSplitScreen = false;
  35018. } else {
  35019. settings$3.vrSplitScreen = true;
  35020. }
  35021. });
  35022. hasInit = true;
  35023. }
  35024. }, {
  35025. key: "isSupportXR",
  35026. value: function isSupportXR() {
  35027. return !!webxr.xrType;
  35028. }
  35029. }]);
  35030. return vr;
  35031. }(THREE.EventDispatcher);
  35032. var VR;
  35033. window.VR = VR = new vr(); //vr对焦
  35034. var createCursor = function createCursor(a, b, c, d, e) {
  35035. var g,
  35036. h = new THREE.SpriteMaterial({
  35037. opacity: c,
  35038. color: d,
  35039. transparent: b,
  35040. map: boluoloadTextureFromCache(texture.getImageURL('images/vrCursor.png')),
  35041. side: THREE.DoubleSide
  35042. });
  35043. h.map.offset = new THREE.Vector2(1 / 17 * e, 0);
  35044. h.map.repeat = new THREE.Vector2(1 / 17, 1);
  35045. h.depthTest = !1, h.blending = THREE.AdditiveBlending;
  35046. g = new THREE.Sprite(h);
  35047. g.scale.set(a, a, a);
  35048. g.position.z = -5, g.visible = !1, g.name = 'cursor', g.renderOrder = RenderOrder.panoMarker; //add
  35049. sceneRenderer$1.camera.add(g);
  35050. sceneRenderer$1.scene.add(sceneRenderer$1.camera);
  35051. VR.cursor = g;
  35052. var i = new VROrientation(sceneRenderer$1.scene, g, sceneRenderer$1.camera);
  35053. VR.cursor.triggerTargetEvent = i.triggerTargetEvent.bind(i), sceneRenderer$1.updateListeners = [i].concat(sceneRenderer$1.updateListeners); //before player
  35054. };
  35055. window.orientEnable = 0; //是否能触发deviceorientation
  35056. var VROrientation = function VROrientation(a, b, c) {
  35057. var _this2 = this;
  35058. function d() {
  35059. g.orient = THREE.MathUtils.degToRad(window.orientation || 0);
  35060. }
  35061. var updateRot = function updateRot(a) {
  35062. //deviceorientation 需要https
  35063. if (!settings$3.vrEnabled && window.orientEnable) return;
  35064. window.orientEnable || (window.orientEnable = 1); //if(this.alpha == a.alpha || this.beta == a.beta || this.gamma == a.gamma)return;
  35065. var b = THREE.MathUtils.degToRad(a.alpha),
  35066. c = THREE.MathUtils.degToRad(a.beta),
  35067. d = THREE.MathUtils.degToRad(a.gamma); //console.log(a.alpha.toFixed(3), c.toFixed(3), a.gamma.toFixed(3))
  35068. //console.log((b-this.alpha).toFixed(3), (c-this.beta).toFixed(3), (d-this.gamma).toFixed(3))
  35069. if (_this2.isHuawei5X) {
  35070. -1e3 === _this2.alpha && (_this2.alpha = b), -1e3 === _this2.beta && (_this2.beta = c), -1e3 === _this2.gamma && (_this2.gamma = d), Math.abs(b - _this2.alpha) > 0.06 && (_this2.alpha = b), Math.abs(c - _this2.beta) > 0.006 && (_this2.beta = c), Math.abs(d - _this2.gamma) > 0.006 && (_this2.gamma = d);
  35071. } else {
  35072. _this2.alpha = b, _this2.beta = c, _this2.gamma = d;
  35073. }
  35074. /* if ( SceneRenderer.vrDebug ) {
  35075. $("#info-device-orientation").css("display", "block");
  35076. var e = "";
  35077. e += "alpha=(" + g.alpha + ")<BR/>",
  35078. e += "beta=(" + g.beta + ")<BR/>",
  35079. e += "gamma=" + g.gamma + "<BR/>",
  35080. document.getElementById("info-device-orientation").innerHTML = e
  35081. } */
  35082. };
  35083. this.cursor = b, this.raycaster = new THREE.Raycaster(), this.targetEventObj = {}, this.type = 1, this.canStartAnimation = !0;
  35084. var g = this;
  35085. this.target = c, this.euler = new THREE.Euler(), this.q0 = new THREE.Quaternion(), this.q1 = new THREE.Quaternion(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5)), this.zee = new THREE.Vector3(0, 0, 1), this.alpha = -1e3, this.beta = -1e3, this.gamma = -1e3, this.lastQua = new THREE.Quaternion(), this.orient = THREE.MathUtils.degToRad(window.orientation || 0), window.addEventListener('orientationchange', d), window.addEventListener('deviceorientation', updateRot), this.setObjectQuaternion = function (quaternion, alpha, beta, gamma, f) {
  35086. if (alpha == -1000) return; // 利用player.updatefromControl来最终更新camera
  35087. var aimQua = quaternion.clone();
  35088. g.euler.set(beta, alpha, -gamma, 'YXZ');
  35089. aimQua.setFromEuler(g.euler);
  35090. aimQua.multiply(g.q1);
  35091. aimQua.multiply(g.q0.setFromAxisAngle(g.zee, -f));
  35092. var diffAngle = this.lastQua.angleTo(aimQua);
  35093. if (diffAngle < 1e-7) return; //防抖:
  35094. if (avoidFlicker && VR.shiftQuaternion) {
  35095. quaternion.copy(this.lastQua);
  35096. var useRatio = math$1.linearClamp(diffAngle, avoidFlicker.threshold.min, avoidFlicker.threshold.max, avoidFlicker.useRatio, 0.9); //越小越延迟
  35097. //const useRatio = diffAngle > avoidFlicker.threshold ? 1 : avoidFlicker.useRatio //越小越延迟
  35098. lerp.quaternion(quaternion, aimQua)(useRatio); //diffAngle > avoidFlicker.threshold.min && console.log(useRatio)
  35099. } else {
  35100. quaternion.copy(aimQua);
  35101. }
  35102. this.lastQua.copy(quaternion);
  35103. if (VR.shiftQuaternion == void 0) {
  35104. //标记初始水平朝向(进入vr时的)
  35105. var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(player$7.camera.quaternion); //初始的相机对应的朝向
  35106. dir.setY(0).normalize(); //水平
  35107. var mat = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir, new THREE.Vector3(0, 1, 0));
  35108. var startQuaternion = new THREE.Quaternion().setFromRotationMatrix(mat);
  35109. var dir2 = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion); //初始的陀螺仪对应的朝向
  35110. dir2.setY(0).normalize(); //水平
  35111. var mat2 = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir2, new THREE.Vector3(0, 1, 0));
  35112. var invertQuaternion = new THREE.Quaternion().setFromRotationMatrix(mat2).invert();
  35113. VR.shiftQuaternion = startQuaternion.clone().premultiply(invertQuaternion); //将此刻陀螺仪的朝向dir2矫正到此刻相机朝向dir所要乘的quaternion
  35114. }
  35115. quaternion.premultiply(VR.shiftQuaternion);
  35116. updateScreenFaceOrient(quaternion);
  35117. };
  35118. parent !== window && window.addEventListener('message', function (a) {
  35119. //针对iframe的??
  35120. if (!a.data || a.data && a.data.type && a.data.type.indexOf('webpack') > -1) {
  35121. return;
  35122. }
  35123. var b = typeof a.data == 'string' ? JSON.parse(a.data) : a.data,
  35124. c = -1 !== window.navigator.userAgent.indexOf('KIW-TL00H');
  35125. b && b.alpha && b.beta && b.gamma && function (a) {
  35126. var c = THREE.MathUtils.degToRad(b.alpha),
  35127. d = THREE.MathUtils.degToRad(b.beta),
  35128. e = THREE.MathUtils.degToRad(b.gamma);
  35129. a ? (-1e3 === g.alpha && (g.alpha = c), -1e3 === g.beta && (g.beta = d), -1e3 === g.gamma && (g.gamma = e), Math.abs(c - g.alpha) > 0.06 && (g.alpha = c), Math.abs(d - g.beta) > 0.006 && (g.beta = d), Math.abs(e - g.gamma) > 0.006 && (g.gamma = e)) : (g.alpha = c, g.beta = d, g.gamma = e);
  35130. }(c);
  35131. }), this.update = function (a) {
  35132. TWEEN.update();
  35133. if (window.ifTest && settings$3.vrEnabled) this.triggerTargetEvent(); //测试时不根据陀螺仪来转向
  35134. else settings$3.vrEnabled && (this.setObjectQuaternion(player$7.cameraControls.activeControl.camera.quaternion
  35135. /* this.target.quaternion */
  35136. , this.alpha, this.beta, this.gamma, this.orient), this.triggerTargetEvent());
  35137. }, this.triggerTargetEvent = function () {
  35138. //判断vr cursor是否选中物体
  35139. var a = this.choseObj(),
  35140. b = a ? a.object : void 0;
  35141. this.targetEventObj.currentObj = b;
  35142. b !== this.targetEventObj.lastObj && (b && this.autoCursorPosition(a), 1 === this.type ? (this.cursorAnimate && this.cursorAnimate.stop(), b && b.enabled && this.startAnimate(function () {
  35143. this.clickCallback(b);
  35144. }.bind(this))) : this.type, this.targetEventObj.lastObj = b);
  35145. }, this.choseObj = function () {
  35146. this.raycaster.setFromCamera({
  35147. x: 0,
  35148. y: 0
  35149. }, c);
  35150. var b = this.raycaster.intersectObjects(player$7.model.vrMarkers.filter(function (e) {
  35151. return e.visible;
  35152. }));
  35153. if (b.length > 0) return b[0];
  35154. }, this.clickCallback = function (a) {
  35155. this.runTHREEAction(a, 'onclick');
  35156. }, this.runTHREEAction = function (a, b) {
  35157. switch (b) {
  35158. case 'onclick':
  35159. a._listeners && a._listeners.click && a._listeners.click.forEach(function (a) {
  35160. a();
  35161. });
  35162. break;
  35163. case 'onhover':
  35164. a._listeners && a._listeners.hover && a._listeners.hover.forEach(function (a) {
  35165. a();
  35166. });
  35167. break;
  35168. case 'onout':
  35169. a._listeners && a._listeners.out && a._listeners.out.forEach(function (a) {
  35170. a();
  35171. });
  35172. }
  35173. }, this.startAnimate = function (a) {
  35174. //vr cursor's circle animation
  35175. this.canStartAnimation && this.initAnimation(a);
  35176. }, this.initAnimation = function (done) {
  35177. var b = this,
  35178. offset = this.cursor.material.map.offset,
  35179. f = function f(a) {
  35180. return Math.floor(17 * a) / 17; //对应17个精灵图片段
  35181. };
  35182. b.canStartAnimation = !1, this.cursorAnimate = new TWEEN.Tween(offset).to({
  35183. x: 1 //100%
  35184. }, 1e3).onStart(function () {
  35185. b.canStartAnimation = !1;
  35186. }).onStop(function () {
  35187. b.canStartAnimation = !0, this.x = 0, offset.x = 0;
  35188. }).onUpdate(function () {}).onComplete(function () {
  35189. done(), offset.x = 0, setTimeout(function () {
  35190. b.canStartAnimation = !0;
  35191. }, 1500);
  35192. }), this.cursorAnimate.easing(f), this.cursorAnimate.start();
  35193. }, this.autoCursorPosition = function (a) {
  35194. var b = Math.abs(a.distance - 10);
  35195. this.cursor.position.z = -b, b /= 10, this.cursor.scale.set(b, b, b);
  35196. };
  35197. };
  35198. /* 为分屏重新创建了个renderer,分别渲染左右两个矩形区域,对应左右相机。
  35199. 替换sceneRenderer.renderer即可
  35200. */
  35201. var vrRenderer = function vrRenderer(renderer, sceneRenderer, camera) {
  35202. // vrRenderer类
  35203. var VRCamera = new vrCamera(camera); //d
  35204. window.VRCamera = VRCamera;
  35205. VRCamera.bananaAspect = 0.8, this.width, this.height;
  35206. this.name = 'vrRenderer';
  35207. var b = this;
  35208. this.setSize = function (c, d) {
  35209. renderer.setSize.call(this, c, d
  35210. /* , false */
  35211. ), b.width = c, b.height = d;
  35212. };
  35213. this.render = function (b, c, e, f) {
  35214. var g, h;
  35215. if (c.__RESS__SKIP__STEREO__) {
  35216. var V = renderer.autoClear;
  35217. renderer.autoClear = !1;
  35218. renderer.setRenderTarget(e);
  35219. if (f) renderer.clear();
  35220. renderer.render(b, c);
  35221. renderer.setRenderTarget(null);
  35222. renderer.autoClear = V;
  35223. return; // renderer.render(b, c, e, f)
  35224. }
  35225. if ('PerspectiveCamera' === c.type) g = VRCamera.cameraL, h = VRCamera.cameraR, b.updateMatrixWorld(), null === c.parent && c.updateMatrixWorld(), VRCamera.vrCameraUpdate(c);else {
  35226. if ('OrthographicCamera' !== c.type) return DEBUG && console.error('Unsupported renderer: ', c.type);
  35227. g = h = c;
  35228. }
  35229. renderer.setScissorTest(!0), renderer.setScissor(0, 0, this.width / 2, this.height), renderer.setViewport(0, 0, this.width / 2, this.height), renderer.render.call(this, b, g, e, f), renderer.setScissor(this.width / 2, 0, this.width / 2, this.height), renderer.setViewport(this.width / 2, 0, this.width / 2, this.height), renderer.render.call(this, b, h, e, f), renderer.setScissorTest(!1);
  35230. };
  35231. this.__proto__ = {
  35232. //? 这句会使sceneRenderer.renderer指向这个vrRenderer
  35233. __proto__: renderer
  35234. };
  35235. };
  35236. var vrCamera = function vrCamera(a) {
  35237. this.type = 'StereoCamera', this._aspect = 1, this._overlap = 0.064, this.cameraL = new THREE.PerspectiveCamera(), this.cameraL.layers.enable(0), this.cameraL.near = 0.01, this.cameraL.matrixAutoUpdate = !1, this.cameraR = new THREE.PerspectiveCamera(), this.cameraR.layers.enable(0), this.cameraR.near = 0.01, this.cameraR.matrixAutoUpdate = !1, this.eyeRight = new THREE.Matrix4(), this.eyeLeft = new THREE.Matrix4(), this.vrCameraNeedsUpdate = !0, Object.defineProperty(this, 'bananaAspect', {
  35238. //这个为什么不是随着画面的比例?
  35239. get: function get() {
  35240. return this._aspect;
  35241. },
  35242. set: function set(a) {
  35243. this._aspect !== a && (this.vrCameraNeedsUpdate = !0), this._aspect = a;
  35244. }
  35245. }), Object.defineProperty(this, 'overlap', {
  35246. //瞳距
  35247. get: function get() {
  35248. return this._overlap;
  35249. },
  35250. set: function set(a) {
  35251. this._overlap !== a && (this.vrCameraNeedsUpdate = !0), this._overlap = a;
  35252. }
  35253. }), this.vrCameraUpdate = function (a) {
  35254. if (this.vrCameraNeedsUpdate = this.vrCameraNeedsUpdate || this.bananaFov !== a.fov || this.bananaReal_aspect !== a.aspect * this.bananaAspect || this.bananaNear !== a.near || this.bananaFar !== a.far, this.vrCameraNeedsUpdate) {
  35255. this.vrCameraNeedsUpdate = !1, this.bananaFocus = a.focus, this.bananaFov = 50 //a.fov, 原本用的player.camera的fov应该是50,但这里player.camera设置了70,会让镜头变窄
  35256. ;
  35257. this.bananaReal_aspect = a.aspect * this.bananaAspect, this.bananaNear = a.near, this.bananaFar = a.far, this.bananaFocus = 10;
  35258. var left,
  35259. right,
  35260. d = a.projectionMatrix.clone(),
  35261. e = this.overlap / 2,
  35262. shift = e * this.bananaNear / this.bananaFocus,
  35263. //bananaFocus是焦距吗
  35264. top = this.bananaNear * Math.tan(Math.PI / 180 * this.bananaFov * 0.5);
  35265. this.eyeLeft.elements[12] = -e, this.eyeRight.elements[12] = e, left = -top * this.bananaReal_aspect + shift, right = top * this.bananaReal_aspect + shift;
  35266. d.elements[0] = 2 * this.bananaNear / (right - left); //只改左右,不改上下,所以虽然bananaReal_aspect可能和原来一样,但调了vfov就会直接影响hfov
  35267. d.elements[8] = (right + left) / (right - left);
  35268. this.cameraL.projectionMatrix.copy(d);
  35269. left = -top * this.bananaReal_aspect - shift, right = top * this.bananaReal_aspect - shift;
  35270. d.elements[0] = 2 * this.bananaNear / (right - left);
  35271. d.elements[8] = (right + left) / (right - left);
  35272. this.cameraR.projectionMatrix.copy(d);
  35273. }
  35274. this.cameraL.matrixWorld.copy(a.matrixWorld).multiply(this.eyeLeft), this.cameraR.matrixWorld.copy(a.matrixWorld).multiply(this.eyeRight);
  35275. };
  35276. };
  35277. var boluoloadTextureFromCache = function boluoloadTextureFromCache(a) {
  35278. var b = new THREE.TextureLoader();
  35279. return b.crossOrigin = 'anonymous', b.load(a);
  35280. };
  35281. /* bus.on("orientation", () => {
  35282. console.log(`vr orientation ${window.orientation}`)
  35283. if(window.orientation== 0||window.orientation==180) { //竖屏
  35284. settings.vrSplitScreen = false
  35285. }else{
  35286. settings.vrSplitScreen = true
  35287. }
  35288. }) */
  35289. var webxr = {
  35290. init(renderer) {
  35291. var _this3 = this;
  35292. this.renderer = renderer;
  35293. renderer.xr.enabled = true;
  35294. var xr = this.renderer.xr;
  35295. var cameraVR = xr.getCamera();
  35296. var makeit = function makeit() {
  35297. //xr存在
  35298. VR.cursor.parent.remove(VR.cursor);
  35299. cameraVR.add(VR.cursor);
  35300. sceneRenderer$1.scene.add(cameraVR);
  35301. /* cameraVR.layers.enable(RenderLayers.RETICULE)
  35302. cameraVR.cameras.forEach(camera=>{//实际渲染的是这两个camera
  35303. camera.layers.enable(RenderLayers.RETICULE)
  35304. }) */
  35305. _this3.initHandler();
  35306. player$7.on('update', function (e) {
  35307. if (_this3.entered && (e.hasChanged.cameraChanged2 || e.hasChanged.vrHandlerMoved)) {
  35308. _this3.setHandlerLength(player$7.intersect);
  35309. player$7.reticule.move(null, null, false);
  35310. }
  35311. });
  35312. };
  35313. if ('xr' in navigator && 'isSessionSupported' in navigator.xr) {
  35314. //pico firefox
  35315. var mode = 'immersive-vr';
  35316. navigator.xr.isSessionSupported(mode).then(function (supported) {
  35317. if (!supported) {
  35318. _this3.xrNotFound('isSessionSupported not supported');
  35319. } else {
  35320. _this3.xrType = 'xr'; //showEnterXR();
  35321. makeit();
  35322. }
  35323. }).catch(this.xrNotFound.bind(this, 'isSessionSupported error'));
  35324. } else if ('getVRDisplays' in navigator) {
  35325. //pico 的vr browser是这个 但该版本已被废弃,没有可供的浏览器可以调试
  35326. console.log('\n getVRDisplays!!!!!!!!!\n \n \n ');
  35327. var setDevice = function setDevice(device) {
  35328. _this3.xrType = 'vr';
  35329. _this3.device = device;
  35330. _this3.renderer.xr.setDevice(device); //新版是renderer.vr
  35331. makeit();
  35332. };
  35333. window.addEventListener('vrdisplayconnect', function (event) {
  35334. setDevice(event.display);
  35335. }, false);
  35336. window.addEventListener('vrdisplaydisconnect', function () {
  35337. console.log('vrdisplaydisconnect');
  35338. }, false);
  35339. window.addEventListener('vrdisplaypresentchange', function (event) {
  35340. console.log('vrdisplaypresentchange', event.display.isPresenting ? 'EXIT VR' : 'ENTER VR');
  35341. _this3.callback(!!event.display.isPresenting);
  35342. }, false);
  35343. window.addEventListener('vrdisplayactivate', function (event) {
  35344. event.display.requestPresent([{
  35345. source: this.renderer.domElement
  35346. }]);
  35347. }, false);
  35348. navigator.getVRDisplays().then(function (displays) {
  35349. if (displays.length > 0) {
  35350. setDevice(displays[0]);
  35351. } else {
  35352. this.xrNotFound('no displays');
  35353. }
  35354. }).catch(this.xrNotFound.bind(this, 'getVRDisplays error'));
  35355. } else {
  35356. this.xrNotFound('xr not supported');
  35357. }
  35358. {
  35359. //修改three源代码:
  35360. var originUpdateCamera = xr.updateCamera;
  35361. var _this = this;
  35362. xr.updateCamera = function (camera) {
  35363. //if (!_this.tranCamMatrix) {
  35364. //初始化,获取转换矩阵
  35365. originUpdateCamera(camera); //第一次计算得到的CameraVR的pose是未转换过的device的pose (注意:万一按了reset pose需要重新初始化device的pose,有reset事件吗)
  35366. _this.getShiftPosMat(cameraVR.position); //本来以为local模式下设备是不会位移的,结果居然会,所以需要一直更新devicePos,以及转换函数
  35367. _this.getTranCamMatrix(cameraVR.position, cameraVR.quaternion); //new THREE.Matrix4().multiplyMatrices(originMatrix, cameraVR.matrixWorld.clone().invert()),
  35368. //}
  35369. cameraVR.cameras[0].matrix.premultiply(_this.tranCamMatrix);
  35370. cameraVR.cameras[1].matrix.premultiply(_this.tranCamMatrix);
  35371. cameraVR.cameras.concat([cameraVR]).forEach(function (camera) {
  35372. //实际渲染的是两个cameras
  35373. camera.layers.mask = player$7.camera.layers.mask;
  35374. });
  35375. originUpdateCamera(camera); //根据cameraL和cameraR重算cameraVR matrixWorld
  35376. //还需要将cameraVR同步到camera的,因为originUpdateCamera写的不太好,在半中间同步
  35377. //camera.position.copy(cameraVR.position);
  35378. camera.quaternion.copy(cameraVR.quaternion); //camera.scale.copy(cameraVR.scale);
  35379. //camera.matrix.copy(cameraVR.matrix);
  35380. //camera.matrixWorld.copy(cameraVR.matrixWorld);
  35381. player$7.quaternion.copy(cameraVR.quaternion); //这步不写的话方向有问题贴图模糊
  35382. //player.position.copy(cameraVR.position);
  35383. //另外fov放大了,需要一致吗。但用的不是camera.fov, 搜topFov
  35384. //updateScreenFaceOrient(cameraVR.quaternion)
  35385. };
  35386. player$7.on('update', function (e) {
  35387. //飞向下一个点时,因相机移动了而设备位置不能移动,相对位置改变,要重新绑定位置矩阵
  35388. if (!_this3.entered) return;
  35389. if (e.hasChanged.moved && _this3.devicePos) {
  35390. _this3.getShiftPosMat(_this3.devicePos);
  35391. _this3.getTranCamMatrix();
  35392. }
  35393. });
  35394. }
  35395. },
  35396. enterVR() {
  35397. var _this4 = this;
  35398. if (!this.xrType) return; //不支持
  35399. console.log('enterVR', this.xrType);
  35400. browser$1.exitFullscreen();
  35401. if (this.xrType == 'vr') {
  35402. this.device.isPresenting ? this.device.exitPresent() : this.device.requestPresent([{
  35403. source: renderer.domElement
  35404. }]);
  35405. } else if (this.xrType == 'xr') {
  35406. if (this.currentSession == void 0) {
  35407. var getXRSessionInit = function getXRSessionInit(mode, options) {
  35408. var space = (options || {}).referenceSpaceType || 'local-floor';
  35409. var sessionInit = options && options.sessionInit || {}; // Nothing to do for default features.
  35410. if (space == 'viewer') return sessionInit;
  35411. if (space == 'local' && mode.startsWith('immersive')) return sessionInit; // If the user already specified the space as an optional or required feature, don't do anything.
  35412. if (sessionInit.optionalFeatures && sessionInit.optionalFeatures.includes(space)) return sessionInit;
  35413. if (sessionInit.requiredFeatures && sessionInit.requiredFeatures.includes(space)) return sessionInit; // The user didn't request the reference space type as a feature. Add it to a shallow copy
  35414. // of the user-supplied sessionInit requiredFeatures (if any) to ensure it's valid to
  35415. // request it later.
  35416. var newInit = Object.assign({}, sessionInit);
  35417. newInit.requiredFeatures = [space];
  35418. if (sessionInit.requiredFeatures) {
  35419. newInit.requiredFeatures = newInit.requiredFeatures.concat(sessionInit.requiredFeatures);
  35420. }
  35421. return newInit;
  35422. };
  35423. console.log('this.currentSession == void 0 ');
  35424. var onSessionEnded = function onSessionEnded() {
  35425. console.log('onSessionEnded');
  35426. _this4.currentSession.removeEventListener('end', onSessionEnded);
  35427. setTimeout(function () {
  35428. _this4.renderer.xr.setSession(null);
  35429. _this4.currentSession = null;
  35430. _this4.callback(false);
  35431. }, 1); //延迟原因:先使THREE里的onSessionEnded执行
  35432. };
  35433. var onReset = function onReset() {
  35434. console.log('onReset');
  35435. };
  35436. var onSessionStarted = function onSessionStarted(session) {
  35437. console.log('onSessionStarted');
  35438. /* var attributes = this.renderer.getContextAttributes();
  35439. console.log('xrCompatible', attributes.xrCompatible) */
  35440. session.addEventListener('end', onSessionEnded);
  35441. session.addEventListener('reset', onReset); //在空间被重置时触发,例如,用户校准 XR 设备或 XR 设备重连后自动切回原点。
  35442. _this4.renderer.xr.setSession(session);
  35443. _this4.currentSession = session;
  35444. _this4.callback(true);
  35445. };
  35446. var mode = 'immersive-vr';
  35447. var sessionInit = getXRSessionInit(mode);
  35448. navigator.xr.requestSession(mode, sessionInit).then(onSessionStarted);
  35449. } else {
  35450. console.log('this.currentSession.end()', this.currentSession);
  35451. this.currentSession.end();
  35452. } //为何我看到模拟器可以移动?但是并没有设置为bound
  35453. }
  35454. },
  35455. leaveVR() {
  35456. if (this.xrType == 'xr') {
  35457. this.currentSession && this.currentSession.end();
  35458. } else if (this.xrType == 'vr') ;
  35459. },
  35460. switchRender(state) {
  35461. if (state) {
  35462. console.log('switchRender', state);
  35463. this.renderer.setAnimationLoop(function () {
  35464. //必须使用setAnimationLoop来渲染才能有画面
  35465. sceneRenderer$1.updateComponents();
  35466. sceneRenderer$1.render();
  35467. });
  35468. sceneRenderer$1.started = false;
  35469. } else {
  35470. this.renderer.setAnimationLoop(null);
  35471. sceneRenderer$1.started = true;
  35472. sceneRenderer$1.animate();
  35473. }
  35474. },
  35475. callback(isEnter) {
  35476. //开启或关闭之后
  35477. isEnter = !!isEnter;
  35478. if (isEnter) ; else {
  35479. settings$3.vrEnabled = false; //由系统关闭的话,需要执行一下这句,确保一些东西关闭
  35480. this.tranCamMatrix = this.shiftQuaMat = this.shiftPosMat = null;
  35481. }
  35482. this.switchRender(isEnter);
  35483. this.handler.visible = isEnter;
  35484. this.entered = isEnter;
  35485. VR.dispatchEvent({
  35486. type: 'webxrEntered',
  35487. isEnter
  35488. });
  35489. },
  35490. xrNotFound(text) {
  35491. console.log('xrNotFound:', text);
  35492. },
  35493. //求陀螺仪相机和player相机的转换矩阵
  35494. getShiftQuaMat(deviceQua) {
  35495. //根据初始的player的quaternion和设备陀螺仪的quaternion做一个绑定,得水平quaternion差
  35496. var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(player$7.quaternion
  35497. /* player.cameraControls.activeControl.camera.quaternion */
  35498. ); //初始的相机对应的朝向
  35499. dir.setY(0).normalize(); //水平
  35500. var mat = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir, new THREE.Vector3(0, 1, 0));
  35501. var dir2 = new THREE.Vector3(0, 0, -1).applyQuaternion(deviceQua); //初始的陀螺仪对应的朝向
  35502. dir2.setY(0).normalize(); //水平
  35503. var mat2 = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir2, new THREE.Vector3(0, 1, 0));
  35504. this.shiftQuaMat = mat.clone().premultiply(mat2.clone().invert()); //将此刻陀螺仪的朝向dir2矫正到此刻相机朝向dir所要乘的quaternion
  35505. },
  35506. getShiftPosMat(devicePos) {
  35507. this.shiftPosMat1 = new THREE.Matrix4().setPosition(devicePos.clone().negate());
  35508. this.shiftPosMat2 = new THREE.Matrix4().setPosition(player$7.position.clone());
  35509. this.devicePos = devicePos.clone(); //记录,下次可以直接使用
  35510. },
  35511. getTranCamMatrix(devicePos, deviceQua, reverse) {
  35512. if (!this.shiftQuaMat) this.getShiftQuaMat(deviceQua);
  35513. if (!this.shiftPosMat1) this.getShiftPosMat(devicePos); //先移到原点,再旋转,再移到终点
  35514. this.tranCamMatrix = new THREE.Matrix4().multiplyMatrices(this.shiftQuaMat, this.shiftPosMat1);
  35515. this.tranCamMatrix = new THREE.Matrix4().multiplyMatrices(this.shiftPosMat2, this.tranCamMatrix); //this.controller1.children[0].matrix.copy(this.tranCamMatrix)
  35516. },
  35517. initHandler() {
  35518. var _this5 = this;
  35519. var minAngleTorler = THREE.MathUtils.degToRad(5);
  35520. var controller0 = this.renderer.xr.getController(0); //right //WebXRController._targetRay
  35521. var controller1 = this.renderer.xr.getController(1); //left
  35522. controller0.name = 'controller0-right';
  35523. controller1.name = 'controller1-left';
  35524. var material = new THREE.MeshBasicMaterial({
  35525. color: '#ffffff',
  35526. opacity: 0.5,
  35527. transparent: true,
  35528. depthTest: false,
  35529. depthWrite: false
  35530. });
  35531. var stem = new THREE.Mesh(new THREE.BoxBufferGeometry(0.01, 0.01, 1), material);
  35532. var translateMatrix = new THREE.Matrix4().makeTranslation(0, 0, -0.5); //使一端居于原点
  35533. stem.geometry.applyMatrix4(translateMatrix);
  35534. var sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(0.03, 6, 5), material);
  35535. sphere.position.set(0, 0, -1);
  35536. var handler = new THREE.Object3D();
  35537. handler.add(stem);
  35538. handler.add(sphere);
  35539. handler.matrixAutoUpdate = false;
  35540. handler.name = 'handler';
  35541. handler.visible = false;
  35542. sceneRenderer$1.scene.add(handler);
  35543. this.handler = handler;
  35544. this.handler.lastMatrix = this.handler.matrix.clone();
  35545. var currentControl = controller0;
  35546. var init = function init(control) {
  35547. var selectStartQua, selectStartTime;
  35548. control.addEventListener('selectstart', function (e) {
  35549. //相当于pointerdown 前面的按键
  35550. if (currentControl != control) {
  35551. currentControl = control;
  35552. /* return */
  35553. console.log('切换control', control.name);
  35554. }
  35555. selectStartQua = control.quaternion.clone();
  35556. selectStartTime = Date.now();
  35557. });
  35558. control.addEventListener('selectend', function (e) {
  35559. //相当于pointerup
  35560. var selectEndQua = control.quaternion.clone();
  35561. var selectEndTime = Date.now();
  35562. if (selectEndTime - selectStartTime < 1000 && selectEndQua.angleTo(selectStartQua) < minAngleTorler) {
  35563. if (player$7.intersect) {
  35564. return player$7.flyToPanoClosestToMouse();
  35565. }
  35566. }
  35567. });
  35568. /* control.addEventListener("squeezestart",(e)=>{//旁边的按键
  35569. console.log('squeezestart', control.name)
  35570. }) */
  35571. control.addEventListener('connected', function (e) {
  35572. //进入xr会执行
  35573. console.log('connected', control.name);
  35574. });
  35575. control.addEventListener('disconnected', function (e) {
  35576. //退出xr时会执行
  35577. console.log('disconnected', control.name);
  35578. });
  35579. var update = function update() {
  35580. if (currentControl != control) return;
  35581. _this5.handler.lastMatrix = _this5.handler.matrix.clone();
  35582. _this5.tranCamMatrix || new THREE.Matrix4();
  35583. _this5.tranCamMatrix && _this5.handler.matrix.copy(control.matrix).premultiply(_this5.tranCamMatrix);
  35584. _this5.handler.matrix.decompose(_this5.handler.position, _this5.handler.quaternion, new THREE.Vector3()); //material.opacity = player.reticule.material.uniforms.opacity.value
  35585. }; //为何模拟器中手柄的旋转和渲染出的不同,模拟器中显示0,0,0, 实际是-0.49,0,0,模拟器的bug?
  35586. control.addEventListener('move', update);
  35587. update();
  35588. };
  35589. init(controller0);
  35590. init(controller1);
  35591. },
  35592. handlerMoved() {
  35593. return !this.handler.lastMatrix.equals(this.handler.matrix);
  35594. },
  35595. setRayCaster(raycaster) {
  35596. //console.log('dir',dir)
  35597. raycaster.set(this.handler.position, this.getHandlerDir());
  35598. },
  35599. getHandlerDir() {
  35600. return new THREE.Vector3(0, 0, -1).applyQuaternion(this.handler.quaternion);
  35601. },
  35602. setHandlerLength(intersect) {
  35603. if (!intersect) return;
  35604. this.handler.children[0].scale.z = intersect.distance;
  35605. this.handler.children[1].position.set(0, 0, -intersect.distance);
  35606. }
  35607. };
  35608. VR.webxr = webxr;
  35609. /*
  35610. see:
  35611. https://immersiveweb.dev/
  35612. https://github.com/immersive-web/webxr/blob/master/explainer.md
  35613. https://blog.csdn.net/zhaoxinyao9/article/details/126290815 (中文)
  35614. domo:https://www.4dmodel.com/test/webxr/
  35615. 目前 XRReferenceSpaceType 分为 5 种类型,分别如下。
  35616. viewer 表示具有原生原点的跟踪空间,一般用于不进行任何跟踪场景,任何设备都应该支持该类型
  35617. local 表示只跟踪用户旋转,不跟踪位置,可以理解为坐下,只用头部来观看场景
  35618. local-floor 与 local 类型相似,但是它是站立着的
  35619. bounded-floor 表示在安全区内跟踪旋转和位置,用户可以完全与场景进行交互
  35620. unbounded 表示用户可以自由在场景中移动和旋转,没有安全区限制
  35621. 还可以改进的地方:
  35622. 摇杆控制方向,向左向右旋转、向前进或者fov放大。直接加载4k。 似乎加载图有点慢?loading的三个球画一下。squeeze可以加功能。
  35623. disconnected的情况有哪些
  35624. 参考的门户网站:
  35625. 除了720外
  35626. https://www.ivrpano.com/p/a4135859726628b7?_s=56eadc3a2da6c16b
  35627. pico2 vr browser:
  35628. webxr案例用的three版本是111dev,而目前v4用的是143?,不知为何新版本会报错:
  35629. cannot create XRWebGLLayer before first calling makeXRCompatible
  35630. https://github.com/MozillaReality/FirefoxReality/issues/3420该网页提示升级firefox到10.1即可,故等升级中
  35631. */
  35632. function initFlicker() {
  35633. //设置防抖
  35634. var list = [// userAgent列表
  35635. {
  35636. name: 'nova 10z',
  35637. //设备名称
  35638. //userAgent :自带浏览器 'Mozilla/5.0 (Linux; Android 10; HarmonyOS; CHA-AL80; HMSCore 6.10.4.302) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.93 HuaweiBrowser/11.1.5.315 Mobile Safari/537.36', //agent案例,不同浏览器不同
  35639. //QQ浏览器: Mozilla/5.0 (Linux; U; Android 10; zh-cn; CHA-AL80 Build/HUAWEICHA-AL80) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/98.0.4758.102 MQQBrowser/13.5 Mobile Safari/537.36 COVC/046503
  35640. //edge: Mozilla/5.0 (Linux; Android 10; CHA-AL80) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Mobile Safari/537.36 EdgA/110.0.1587.66
  35641. words: ['CHA-AL80', '537.36'],
  35642. threshold: {
  35643. min: 0.005,
  35644. max: 0.7
  35645. },
  35646. //变化大于这个角度不延迟, 为了防止移动过慢。只在相对静止要对准时防抖。
  35647. useRatio: 0.2 //越低代表抖动越强 //该设备平放桌面都在抖动 alpha等幅度0.02, 还有陀螺仪不准,有时转到背面画面还在当前。贝壳更是转不动。测过三个浏览器均是。可能是设备陀螺仪损坏
  35648. } //仍有的缺陷:因为移动延迟,对焦有点困难。
  35649. ];
  35650. var agent = window.navigator.userAgent;
  35651. for (var i = 0, j = list.length; i < j; i++) {
  35652. var item = list[i];
  35653. if (!item.words.some(function (word) {
  35654. return !agent.includes(word);
  35655. })) {
  35656. //每个word都在agent中存在
  35657. avoidFlicker = item;
  35658. break;
  35659. }
  35660. } //avoidFlicker = list[0]
  35661. if (!avoidFlicker) {
  35662. //给个默认 一点点的防抖 (对iphoneX表现有较明显的提升)
  35663. avoidFlicker = {
  35664. name: 'default',
  35665. threshold: {
  35666. min: 0.01,
  35667. max: 0.3
  35668. },
  35669. useRatio: 0.5 //越低代表抖动越强
  35670. };
  35671. } //console.log('initFlicker', window.navigator.userAgent )
  35672. }
  35673. function updateScreenFaceOrient(quaternion) {
  35674. if (!settings$3.vrSplitScreen) {
  35675. var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion); //相机方向,也是屏幕旋转轴
  35676. player$7.camera.lookAt(player$7.camera.position.clone().add(dir)); //window.screenFaceOrient = THREE.MathUtils.radToDeg(player.camera.quaternion.angleTo(quaternion))
  35677. var dirCamera1 = new THREE.Vector3(1, 0, 0).applyQuaternion(quaternion); //相机横轴被旋转后的方向(如果得到的y还是0,说明没有歪)
  35678. var dirCamera2 = new THREE.Vector3(1, 0, 0).applyQuaternion(player$7.camera.quaternion); //相机横轴被旋转后的方向(这里得到的y是0)
  35679. window.screenFaceOrient = THREE.MathUtils.radToDeg(dirCamera1.angleTo(dirCamera2));
  35680. var crossAxis = dirCamera1.clone().cross(dirCamera2); // 通过朝dir还是-dir来判断逆时针还是顺时针
  35681. if (crossAxis.dot(dir) < 0) {
  35682. window.screenFaceOrient *= -1;
  35683. }
  35684. }
  35685. }
  35686. var VR$1 = VR;
  35687. function _createSuper$L(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$L(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  35688. function _isNativeReflectConstruct$L() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  35689. new THREE.RawShaderMaterial({
  35690. fragmentShader: shaders.skysphere.fragmentShader,
  35691. vertexShader: shaders.skysphere.vertexShader,
  35692. uniforms: THREE.UniformsUtils.clone(shaders.skysphere.uniforms),
  35693. side: THREE.BackSide,
  35694. name: 'skysphereBG'
  35695. });
  35696. window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame;
  35697. var index$1 = 0;
  35698. defineComponent('SceneRenderer', function () {
  35699. return /*#__PURE__*/function (_EventEmitter) {
  35700. _inherits(SceneRenderer, _EventEmitter);
  35701. var _super = _createSuper$L(SceneRenderer);
  35702. function SceneRenderer() {
  35703. var _this;
  35704. _classCallCheck(this, SceneRenderer);
  35705. _this = _super.call(this);
  35706. _this.createScene = function (model) {
  35707. this.camera = new THREE.PerspectiveCamera();
  35708. this.camera.layers.enable(RenderLayers.PANOMARKERS);
  35709. this.camera.layers.enable(RenderLayers.RETICULE); // this.camera.position.set(0, 5, 20)
  35710. // this.camera.lookAt(0, 0, 0)
  35711. this.scene = new THREE.Scene();
  35712. this.light = new THREE.AmbientLight(16777215);
  35713. this.scene.add(this.light); // 灯光非常耗性能
  35714. // var directionalLight = new THREE.DirectionalLight(0xffffff, 0.3)
  35715. // directionalLight.position.set(0, -1, 0).normalize()
  35716. // this.scene.add(directionalLight)
  35717. // var directionalLight1 = new THREE.DirectionalLight(0xffffff, 0.7)
  35718. // directionalLight1.position.set(-10, 3.5, 0).normalize()
  35719. // this.scene.add(directionalLight1)
  35720. // var directionalLight2 = new THREE.DirectionalLight(0xffffff, 0.7)
  35721. // directionalLight2.position.set(0, 3.5, 10).normalize()
  35722. // this.scene.add(directionalLight2)
  35723. // var directionalLight3 = new THREE.DirectionalLight(0xffffff, 0.7)
  35724. // directionalLight3.position.set(0, 3.5, -10).normalize()
  35725. // this.scene.add(directionalLight3)
  35726. // var directionalLight4 = new THREE.DirectionalLight(0xffffff, 0.7)
  35727. // directionalLight4.position.set(10, 3.5, 0).normalize()
  35728. // this.scene.add(directionalLight4)
  35729. // 照亮entryEntry
  35730. var directionalLight = new THREE.DirectionalLight(0xffffff, 1);
  35731. directionalLight.position.set(1, 10, 1).normalize();
  35732. this.scene.add(directionalLight); // this.scene.skyboxBG = new THREE.Mesh(new THREE.SphereBufferGeometry(2500, 20, 5), skyMat)
  35733. // this.scene.add(this.scene.skyboxBG)
  35734. };
  35735. _this.addComponent = function (e, ifAfterRender) {
  35736. this.components.push(e);
  35737. if (e.update) {
  35738. if (ifAfterRender) this.updateLisAfter.push(e); //add
  35739. else this.updateListeners.push(e);
  35740. }
  35741. if (e.setSize) {
  35742. this.resizeListeners.push(e);
  35743. this.forceUpdateSize = !0;
  35744. }
  35745. };
  35746. _this.removeComponent = function (e) {
  35747. var t = function t(_t) {
  35748. return _t !== e;
  35749. };
  35750. this.components = this.components.filter(t);
  35751. this.updateListeners = this.updateListeners.filter(t);
  35752. this.resizeListeners = this.resizeListeners.filter(t);
  35753. };
  35754. _this.start = function (dom) {
  35755. if (this.started) {
  35756. throw new BasicException$1("Can't start SceneRenderer, already started");
  35757. }
  35758. this.createContext(dom);
  35759. this.initComposer();
  35760. this.started = !0;
  35761. if (this.$app.config.mobile) {
  35762. try {
  35763. VR$1.Init(this, this.$app.core.get('Player'));
  35764. } catch (error) {
  35765. console.error(error);
  35766. }
  35767. }
  35768. (this.animate = this.animate.bind(this))();
  35769. };
  35770. _this.createContext = function (dom) {
  35771. try {
  35772. this.renderer = new THREE.WebGLRenderer({
  35773. antialias: true,
  35774. alpha: true
  35775. }); //set alpha for renderTex
  35776. this.renderer.autoClear = !0;
  35777. this.renderer.setPixelRatio(window.devicePixelRatio ? window.devicePixelRatio : 1);
  35778. this.renderer.setSize(window.innerWidth, window.innerHeight);
  35779. this.renderer.setClearColor('#292929', 1.0);
  35780. this.emit(SceneRendererEvents.ContextCreated);
  35781. } catch (e) {
  35782. throw new RendererCreationException$1('Unable to create a WebGL rendering context');
  35783. } //貌似没用
  35784. //settings.profiling.enabled && this.overrideTextures();
  35785. dom.appendChild(this.renderer.domElement);
  35786. };
  35787. _this.initComposer = function () {
  35788. this.composer = new THREE.EffectComposer(this.renderer);
  35789. this.composer.addPass(new THREE.RenderPass(this.scene, this.camera));
  35790. this.composer.addPass(this.effects.hblurPass);
  35791. this.composer.addPass(this.effects.vblurPass);
  35792. };
  35793. _this.setSize = function (width, height) {
  35794. this.renderWidth = width;
  35795. this.renderHeight = height;
  35796. this.effects.aspect = width / height;
  35797. this.renderer.setSize(width, height);
  35798. this.composer.setSize(width, height);
  35799. this.css3dRenderer && this.css3dRenderer.setSize(width, height);
  35800. for (var i = 0; i < this.resizeListeners.length; i++) {
  35801. this.resizeListeners[i].setSize(width, height);
  35802. }
  35803. this.emit('resize', width, height);
  35804. };
  35805. _this.render = function () {
  35806. var size = this.renderer.getSize(new THREE.Vector2());
  35807. if (size.x == 0 || size.y == 0) return; //同屏时关闭一个屏
  35808. this.emit('render', this.updateClock2.getDelta());
  35809. this.update3dTiles();
  35810. this.effects.currentBlur > 0 ? this.composer.render() : this.renderer.render(this.scene, this.camera);
  35811. if (this.css3dRenderer) {
  35812. this.css3dRenderer.render(this.scene, this.camera);
  35813. }
  35814. };
  35815. _this.updateScreenSize = function () {
  35816. //许钟文改
  35817. //xzw 改 为了截屏 要改canvas大小 以及缩放时不模糊
  35818. var W, H, pixelRatio; //当截屏时有setTimeout 期间不能恢复大小,所以要用W,H记录正常大小
  35819. return function () {
  35820. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  35821. var render = false;
  35822. var ratio;
  35823. var w, h; //记录应当render的大小
  35824. if (o.forceUpdateSize) this.forceUpdateSize = true;
  35825. if (!o.resize && o.width != void 0 && o.height != void 0) {
  35826. w = o.width, h = o.height, render = true, ratio = 1;
  35827. } else {
  35828. w = this.renderer.domElement.parentElement.clientWidth;
  35829. h = this.renderer.domElement.parentElement.clientHeight;
  35830. if (o.resize) {
  35831. W = this.renderWidth;
  35832. H = this.renderHeight; //console.log('updateScreenSize',w,h)
  35833. }
  35834. if (w !== W || h !== H || this.forceUpdateSize || pixelRatio != window.devicePixelRatio) {
  35835. W = w, H = h, render = true;
  35836. pixelRatio = window.devicePixelRatio; //如果player放在小窗口了,也要监测devicePixelRatio,因为缩放时client宽高不会改变
  35837. ratio = window.devicePixelRatio;
  35838. }
  35839. }
  35840. if (render) {
  35841. //console.log('setSize',w,h, ratio)
  35842. this.setSize(w, h, ratio);
  35843. this.forceUpdateSize = !1;
  35844. }
  35845. };
  35846. }();
  35847. _this.updateComponents = function () {
  35848. //注意:transitions一定要放在最开头,计时才会准确
  35849. var delta = this.updateClock.getDelta();
  35850. /* if(this.$app.core.get('Player').flying){
  35851. console.log(this.index, delta)
  35852. } */
  35853. for (var e = Math.min(1, delta), t = 0; t < this.updateListeners.length; t++) {
  35854. this.updateListeners[t].update(e);
  35855. }
  35856. };
  35857. _this.updateAfterRender = function () {
  35858. //add
  35859. common.timeMeasuring.addTimeMark('afterRender', 'start');
  35860. for (var t = 0; t < this.updateLisAfter.length; t++) {
  35861. this.updateLisAfter[t].update();
  35862. }
  35863. common.timeMeasuring.addTimeMark('afterRender', 'end');
  35864. };
  35865. _this.suspend = function () {
  35866. this.started = !1, this.suspendedObjects = this.scene.children.map(function (e) {
  35867. return this.scene.remove(e), e;
  35868. }.bind(this)), this.render();
  35869. };
  35870. _this.resume = function () {
  35871. this.suspendedObjects.forEach(function (e) {
  35872. this.scene.add(e);
  35873. }.bind(this));
  35874. this.suspendedObjects = [];
  35875. this.started = !0;
  35876. this.animate();
  35877. };
  35878. _this.animate = function () {
  35879. if (this.started) {
  35880. performance.mark('loop-start'); // 无论有没有reportTimings都要获取,因为getBestCound需要
  35881. //--------------------
  35882. window.requestAnimationFrame(this.animate);
  35883. this.updateScreenSize();
  35884. this.updateComponents(); //this.updateTextureMemory();
  35885. this.render();
  35886. this.updateAfterRender(); //注意:如果每一帧处理太多东西容易崩溃。
  35887. this.emit(SceneRendererEvents.AfterRender); //--------------------
  35888. common.timeMeasuring.addTimeMark('loop', 'end');
  35889. common.timeMeasuring.report(performance.now());
  35890. }
  35891. };
  35892. _this.getImageData = function () {
  35893. var e = document.createElement('canvas'),
  35894. t = e.getContext('2d');
  35895. return function (i, SceneRenderer, r) {
  35896. return e.width === SceneRenderer && e.height === r || (e.width = SceneRenderer, e.height = r), t.drawImage(i, 0, 0, SceneRenderer, r), t.getImageData(0, 0, SceneRenderer, r);
  35897. };
  35898. }();
  35899. _this.initSizedTexture2D = function (size, wrap, i) {
  35900. var renderer = this.renderer,
  35901. ctx = renderer.getContext(),
  35902. glState = renderer.state,
  35903. texture = new THREE.Texture();
  35904. texture.flipY = false;
  35905. texture.wrapS = wrap;
  35906. texture.wrapT = wrap;
  35907. i !== true && (i = false);
  35908. texture.generateMipmaps = i;
  35909. var glFormat = renderer.paramThreeToGL(texture.format),
  35910. glType = renderer.paramThreeToGL(texture.type),
  35911. h = renderer.properties.get(texture),
  35912. glTexture = ctx.createTexture();
  35913. glState.bindTexture(ctx.TEXTURE_2D, glTexture);
  35914. ctx.pixelStorei(ctx.UNPACK_FLIP_Y_WEBGL, texture.flipY);
  35915. ctx.texImage2D(ctx.TEXTURE_2D, 0, glFormat, size, size, 0, glFormat, glType, null);
  35916. var glWrap = renderer.paramThreeToGL(wrap);
  35917. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, glWrap);
  35918. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_T, glWrap);
  35919. if (i) {
  35920. texture.magFilter = THREE.LinearFilter;
  35921. texture.minFilter = THREE.LinearMipMapLinearFilter;
  35922. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR);
  35923. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR_MIPMAP_NEAREST);
  35924. ctx.generateMipmap(ctx.TEXTURE_2D);
  35925. } else {
  35926. texture.magFilter = THREE.LinearFilter;
  35927. texture.minFilter = THREE.LinearFilter;
  35928. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR);
  35929. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR);
  35930. }
  35931. glState.bindTexture(ctx.TEXTURE_2D, null);
  35932. h.__webglTexture = glTexture;
  35933. return texture;
  35934. };
  35935. _this.deallocateCubeTexture = function (e) {
  35936. var t = this.renderer;
  35937. t.getContext();
  35938. t.properties.get(e); //i.deleteTexture(renderer.__image__webglTextureCube) //新版three没有这个耶
  35939. //改成自带的dispose , 虽然未被使用的zoomTarget没有dispose事件
  35940. e.dispose();
  35941. };
  35942. _this.renderToCubeMap = function () {
  35943. var inited = false,
  35944. scene = null,
  35945. material = null,
  35946. geo = null,
  35947. plane = null,
  35948. l = 1,
  35949. cubeCamera = null;
  35950. return function (tex, renderTarget, tileWidth, tileHeight, startXinTile, startYinTile, widthinTile, heightinTile, startX, startY, width, height, cubeFace, E, b, w) {
  35951. var renderer = this.oldRenderer || this.renderer; //不知道为什么vr时一定要用原来的render,否则好像没有autoClear..
  35952. if (!inited) {
  35953. scene = new THREE.Scene();
  35954. cubeCamera = new THREE.CubeCamera(0.1, 1000, renderTarget);
  35955. scene.add(cubeCamera);
  35956. material = new THREE.ShaderMaterial({
  35957. uniforms: {
  35958. tDiffuse: {
  35959. type: 'scene',
  35960. value: null
  35961. },
  35962. alpha: {
  35963. type: 'startYinTile',
  35964. value: 1
  35965. }
  35966. },
  35967. vertexShader: shaders.basicTextured.vertexShader,
  35968. fragmentShader: shaders.basicTextured.fragmentShader,
  35969. depthWrite: !1,
  35970. depthTest: !1,
  35971. side: THREE.DoubleSide
  35972. });
  35973. geo = new THREE.PlaneGeometry(l, l);
  35974. plane = new THREE.Mesh(geo, material);
  35975. scene.add(plane);
  35976. inited = true;
  35977. } // 必须更新cubeCamera的renderTarget
  35978. cubeCamera.renderTarget = renderTarget;
  35979. var uv = geo.getAttribute('uv');
  35980. uv.setUsage(THREE.DynamicDrawUsage); // .setDynamic(!0)
  35981. uv.needsUpdate = true;
  35982. var uvArr = uv.array,
  35983. S = startXinTile / tileWidth,
  35984. //uv这几个值基本是固定的startXinTile:0,startYinTile:0,widthinTile:512,widthinTile:512,tileWidth:512,tileHeight:512 也就是说uv不会变、每张tile的有效范围是100%
  35985. M = startYinTile / tileHeight,
  35986. R = widthinTile / tileWidth,
  35987. P = heightinTile / tileHeight;
  35988. uvArr[0] = S, uvArr[1] = M + P, uvArr[2] = S + R, uvArr[3] = M + P, uvArr[4] = S, uvArr[5] = M, uvArr[6] = S + R, uvArr[7] = M; //修改posistion,使该plane只占据需要绘制的部分。类似拼图。
  35989. //startX startY width height 都是在画布上的大小,比如画布大小为2048*2048,此tile为16分之一,tileX是1,tileY是1,则startX=2048/4,startY=2048/4
  35990. var pos = geo.getAttribute('position');
  35991. pos.setUsage(THREE.DynamicDrawUsage); // .setDynamic(!0)
  35992. pos.needsUpdate = true;
  35993. var posArr = pos.array,
  35994. D = startX / renderTarget.width - l / 2,
  35995. // 起始x
  35996. N = startY / renderTarget.height - l / 2,
  35997. // 起始y
  35998. B = width / renderTarget.width,
  35999. // 宽
  36000. F = height / renderTarget.height // 高
  36001. ;
  36002. posArr[0] = D, posArr[1] = N + F, posArr[3] = D + B, posArr[4] = N + F, posArr[6] = D, posArr[7] = N, posArr[9] = D + B, posArr[10] = N;
  36003. renderer.properties.get(scene); //this.renderer.properties.get(scene);
  36004. material.uniforms.tDiffuse.value = tex;
  36005. material.blending = E || THREE.NoBlending, material.transparent = !!b;
  36006. void 0 !== w && null !== w || (w = 1);
  36007. material.uniforms.alpha.value = w;
  36008. material.needUpdate = !0; // cubeFace 0-5 应该是指定渲染h中的面
  36009. if (cubeFace == 0) {
  36010. plane.scale.set(-1, -1, 1);
  36011. plane.position.set(l / 2, 0, 0);
  36012. }
  36013. if (cubeFace == 1) {
  36014. plane.scale.set(-1, -1, 1);
  36015. plane.position.set(l / -2, 0, 0);
  36016. }
  36017. if (cubeFace == 2) {
  36018. // 上
  36019. plane.scale.set(1, 1, 1);
  36020. plane.position.set(0, l / 2, 0);
  36021. }
  36022. if (cubeFace == 3) {
  36023. // 下
  36024. plane.scale.set(1, 1, 1);
  36025. plane.position.set(0, l / -2, 0);
  36026. }
  36027. if (cubeFace == 4) {
  36028. plane.scale.set(-1, -1, 1);
  36029. plane.position.set(0, 0, l / 2);
  36030. }
  36031. if (cubeFace == 5) {
  36032. plane.scale.set(-1, -1, 1);
  36033. plane.position.set(0, 0, l / -2);
  36034. }
  36035. plane.lookAt(cubeCamera.position);
  36036. /* renderer.setScissorTest(!0)
  36037. //指定绘制区域,类似遮罩(相对于屏幕)
  36038. renderer.setScissor(startX,startY,width,height) //加上这个会不会快一些,尤其是spherical
  36039. //指定绘制视口位置和大小(相对于屏幕)
  36040. */
  36041. renderTarget.viewport.set(0, 0, renderTarget.width, renderTarget.height);
  36042. var V = renderer.autoClear;
  36043. renderer.autoClear = !1;
  36044. cubeCamera.update(renderer, scene);
  36045. renderer.autoClear = V; //renderer.setScissorTest(!1)
  36046. /* this.renderer.render(scene, camera, this.planeTargets[cubeFace], !1),//针对有的场景app第一个点图加载不成功的问题
  36047. console.log(`图index ${cubeFace} , ${startX}, ${startY}, ${width}, ${height}`)
  36048. this.targetList[cubeFace] || (this.targetList[cubeFace] = [])
  36049. this.targetList[cubeFace].push([startX,startY,width,height])*/
  36050. };
  36051. }();
  36052. _this.copyCubeMap = function () {
  36053. //将texture渲染到zoomRenderTarget上
  36054. var inited = !1,
  36055. scene = null,
  36056. cubeCamera = null,
  36057. material = null,
  36058. geo = null,
  36059. mesh = null,
  36060. c = new THREE.Euler();
  36061. return function (texture, renderTarget, tWidth, tHeight, rWidth, rHeight, m, v, A) {
  36062. if (!inited) {
  36063. var w = 2;
  36064. scene = new THREE.Scene();
  36065. cubeCamera = new THREE.CubeCamera(0.1, 1000, renderTarget);
  36066. scene.add(cubeCamera);
  36067. material = new THREE.ShaderMaterial({
  36068. uniforms: {
  36069. tDiffuse: {
  36070. type: 't',
  36071. value: null
  36072. },
  36073. alpha: {
  36074. type: 'f',
  36075. value: 1
  36076. }
  36077. },
  36078. vertexShader: shaders.copyCubeMap.vertexShader,
  36079. fragmentShader: shaders.copyCubeMap.fragmentShader,
  36080. depthWrite: !1,
  36081. depthTest: !1,
  36082. side: THREE.DoubleSide
  36083. });
  36084. geo = new THREE.BoxGeometry(w, w, w);
  36085. mesh = new THREE.Mesh(geo, material);
  36086. mesh.scale.set(-1, -1, 1);
  36087. scene.add(mesh);
  36088. inited = !0;
  36089. }
  36090. var renderer = this.oldRenderer || this.renderer; //不知道为什么vr时一定要用原来的render,否则好像没有autoClear..
  36091. // 必须更新cubeCamera的renderTarget
  36092. cubeCamera.renderTarget = renderTarget;
  36093. for (var C = 0; C < 6; C++) {
  36094. this.getCubeOrientationForCubeFace(C, c);
  36095. mesh.rotation.copy(c);
  36096. mesh.matrixWorldNeedsUpdate = !0;
  36097. mesh.updateMatrixWorld();
  36098. material.uniforms.tDiffuse.value = texture;
  36099. material.blending = m || THREE.NoBlending;
  36100. material.transparent = !!v;
  36101. void 0 !== A && null !== A || (A = 1);
  36102. material.uniforms.alpha.value = A;
  36103. material.needUpdate = !0; // (renderTarget.activeCubeFace = C)
  36104. renderTarget.viewport.set(0, 0, rWidth, rHeight); // this.renderer.render(scene, camera, renderTarget, !1)
  36105. var V = renderer.autoClear;
  36106. renderer.autoClear = !1;
  36107. cubeCamera.update(renderer, scene);
  36108. renderer.autoClear = V;
  36109. }
  36110. };
  36111. }();
  36112. _this.getCubeOrientationForCubeFace = function (e, t) {
  36113. switch (e) {
  36114. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
  36115. t.set(0, -Math.PI / 2, 0);
  36116. break;
  36117. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
  36118. t.set(0, Math.PI / 2, 0);
  36119. break;
  36120. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
  36121. t.set(Math.PI / 2, Math.PI, 0);
  36122. break;
  36123. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
  36124. t.set(-Math.PI / 2, Math.PI, 0);
  36125. break;
  36126. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
  36127. t.set(0, -Math.PI, 0);
  36128. break;
  36129. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
  36130. t.set(0, 0, 0);
  36131. }
  36132. };
  36133. _this.index = index$1++;
  36134. _this.scene = null;
  36135. _this.camera = null;
  36136. _this.light = null;
  36137. _this.renderer = null;
  36138. _this.effects = effects$1;
  36139. _this.css3dRenderer = null;
  36140. _this.animateCallback = null;
  36141. _this.composer = null;
  36142. _this.qualityManager = null;
  36143. _this.updateClock = new THREE.Clock();
  36144. _this.updateClock2 = new THREE.Clock();
  36145. _this.components = [];
  36146. _this.updateListeners = [];
  36147. _this.resizeListeners = [];
  36148. _this.updateLisAfter = []; //add
  36149. _this.forceUpdateSize = !1;
  36150. _this.started = !1;
  36151. _this.textures = {};
  36152. _this.suspendedObjects = [];
  36153. _this.vrMode = false;
  36154. _this.autoUpdate3dTiles = false;
  36155. common.timeMeasuring.reportTimings = false;
  36156. common.timeMeasuring.registerCollect('loop', {
  36157. minCount: 120,
  36158. median: 3,
  36159. refreshTime: 5 * 1000
  36160. }); // iphone13和电脑近似, iphonex很卡差别较大
  36161. //common.timeMeasuring.registerCollect('getMouseIntersect', { minCount: 120, median: 1, refreshTime: 10 * 1000 }) // iphone13和电脑近似, iphonex很卡差别较大
  36162. //写了一个针对多个iframe切换的事件,释放内存防止崩溃(因为iframe不像win页面那样会有unfocusPage的事件,即使隐藏了也会loop)
  36163. window.addEventListener('unfocusPage', function (e) {
  36164. console.log('unfocusPage', document.title);
  36165. _this.suspend();
  36166. _this.$app.core.get('PanoRenderer').disposeIdelTargets();
  36167. });
  36168. window.addEventListener('focusPage', function (e) {
  36169. console.log('focusPage', document.title);
  36170. _this.resume();
  36171. });
  36172. return _this;
  36173. }
  36174. _createClass(SceneRenderer, [{
  36175. key: "update3dTiles",
  36176. value: function update3dTiles() {
  36177. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  36178. var player = this.$app.core.get('Player');
  36179. var _3dTilesRuntime = player.model._3dTilesRuntime;
  36180. if (_3dTilesRuntime) {
  36181. var deltaTime = this.updateClock2.getDelta();
  36182. if (player.mode !== Viewmode$1.PANORAMA) {
  36183. // 遍历tiles
  36184. _3dTilesRuntime.getTileset().tiles.forEach(function (tile) {
  36185. var tileContent = _3dTilesRuntime.getRenderMap()[tile.id];
  36186. if (tileContent && tileContent.modified !== 'remove') {
  36187. deltaTime = 9999; // 因为需要实时计算可视范围内的tile,所以一旦相机发生变化就要tilesetUpdate
  36188. if (tile.isVisibleAndInRequestVolume || player.mode === Viewmode$1.TRANSITIONING) {
  36189. // 如果tile在可视范围内或相机过渡中,则添加会对应floor
  36190. player.model.floors.get(tile.floorIndex).add(tileContent);
  36191. } else {
  36192. // 如果tile不在可视范围内,就从场景中remove
  36193. tileContent.removeFromParent();
  36194. tileContent.traverse(function (obj) {
  36195. if (obj.isChunk && obj.geometry) {
  36196. obj.geometry.dispose();
  36197. obj.material.dispose();
  36198. obj.material.uniforms.map && obj.material.uniforms.map.value.dispose();
  36199. /*obj.material.uniforms.map.value = null
  36200. obj.geometry = null
  36201. obj.material = null */
  36202. }
  36203. });
  36204. }
  36205. }
  36206. });
  36207. }
  36208. if (this.autoUpdate3dTiles || options.force) {
  36209. /**
  36210. * tilesetUpdate需要满足条件:
  36211. * 1. deltaTime累计超过UPDATE_INTERVAL
  36212. * 2. 相机发生变化 lastFrameChanged //xzw 2023.11.27
  36213. * options.force==true时,会忽视上述两点进行更新
  36214. */
  36215. if (player.lastFrameChanged || options.force) {
  36216. var camera = player.cameraControls.activeControl ? player.cameraControls.activeControl.camera : this.camera;
  36217. _3dTilesRuntime.update(deltaTime, this.renderer, camera, options.force);
  36218. _3dTilesRuntime.stats && _3dTilesRuntime.stats.update();
  36219. }
  36220. }
  36221. }
  36222. }
  36223. /* updateScreenSize = function () {
  36224. ;(window.innerWidth !== this.renderWidth || window.innerHeight !== this.renderHeight || this.forceUpdateSize) &&
  36225. (this.setSize(window.innerWidth, window.innerHeight), (this.forceUpdateSize = !1))
  36226. } */
  36227. }, {
  36228. key: "uploadTexture2D",
  36229. value:
  36230. /* uploadTexture2D = function (e, t, i, renderer, r, o) {
  36231. var a = this.renderer,
  36232. s = a.context,
  36233. l = a.state,
  36234. c = a.properties.get(t)
  36235. l.bindTexture(s.TEXTURE_2D, c.__webglTexture)
  36236. s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, t.flipY)
  36237. s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, t.premultiplyAlpha)
  36238. s.pixelStorei(s.UNPACK_ALIGNMENT, t.unpackAlignment)
  36239. s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_S, a.paramThreeToGL(t.wrapS))
  36240. s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_T, a.paramThreeToGL(t.wrapT))
  36241. s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MAG_FILTER, a.paramThreeToGL(t.magFilter))
  36242. s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MIN_FILTER, a.paramThreeToGL(t.minFilter))
  36243. s.texSubImage2D(s.TEXTURE_2D, 0, i, renderer, s.RGBA, s.UNSIGNED_BYTE, e)
  36244. t.generateMipmaps && s.generateMipmap(s.TEXTURE_2D)
  36245. l.bindTexture(s.TEXTURE_2D, null)
  36246. } */
  36247. function uploadTexture2D(img, tex, startX, startY, width, height) {
  36248. var renderer = this.renderer,
  36249. gl = renderer.getContext(),
  36250. webglState = renderer.state,
  36251. c = renderer.properties.get(tex);
  36252. webglState.bindTexture(gl.TEXTURE_2D, c.__webglTexture);
  36253. gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, tex.flipY);
  36254. gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, tex.premultiplyAlpha);
  36255. gl.pixelStorei(gl.UNPACK_ALIGNMENT, tex.unpackAlignment);
  36256. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, renderer.paramThreeToGL(tex.wrapS));
  36257. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, renderer.paramThreeToGL(tex.wrapT));
  36258. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, renderer.paramThreeToGL(tex.magFilter));
  36259. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, renderer.paramThreeToGL(tex.minFilter));
  36260. gl.texSubImage2D(gl.TEXTURE_2D, 0, startX, startY, gl.RGBA, gl.UNSIGNED_BYTE, img);
  36261. tex.generateMipmaps && gl.generateMipmap(gl.TEXTURE_2D);
  36262. webglState.bindTexture(gl.TEXTURE_2D, null);
  36263. }
  36264. /*
  36265. 注:tileY的方向同UV,从下到上
  36266. renderToCubeMap里的画布or镜头的xy范围是-0.5到0.5
  36267. */
  36268. }, {
  36269. key: "setBg",
  36270. value: function setBg(color, opacity) {
  36271. if (color) {
  36272. this.renderer.setClearColor(color);
  36273. }
  36274. if (opacity != void 0) {
  36275. this.renderer.setClearAlpha(opacity);
  36276. }
  36277. }
  36278. }]);
  36279. return SceneRenderer;
  36280. }(EventEmitter);
  36281. });
  36282. /*
  36283. Copyright (c) 2008, Adobe Systems Incorporated
  36284. All rights reserved.
  36285. Redistribution and use in source and binary forms, with or without
  36286. modification, are permitted provided that the following conditions are
  36287. met:
  36288. * Redistributions of source code must retain the above copyright notice,
  36289. this list of conditions and the following disclaimer.
  36290. * Redistributions in binary form must reproduce the above copyright
  36291. notice, this list of conditions and the following disclaimer in the
  36292. documentation and/or other materials provided with the distribution.
  36293. * Neither the name of Adobe Systems Incorporated nor the names of its
  36294. contributors may be used to endorse or promote products derived from
  36295. this software without specific prior written permission.
  36296. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  36297. IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  36298. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  36299. PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  36300. CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  36301. EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  36302. PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  36303. PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  36304. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  36305. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  36306. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36307. */
  36308. function JPEGEncoder$1(quality) {
  36309. var ffloor = Math.floor;
  36310. var YTable = new Array(64);
  36311. var UVTable = new Array(64);
  36312. var fdtbl_Y = new Array(64);
  36313. var fdtbl_UV = new Array(64);
  36314. var YDC_HT;
  36315. var UVDC_HT;
  36316. var YAC_HT;
  36317. var UVAC_HT;
  36318. var bitcode = new Array(65535);
  36319. var category = new Array(65535);
  36320. var outputfDCTQuant = new Array(64);
  36321. var DU = new Array(64);
  36322. var byteout = [];
  36323. var bytenew = 0;
  36324. var bytepos = 7;
  36325. var YDU = new Array(64);
  36326. var UDU = new Array(64);
  36327. var VDU = new Array(64);
  36328. var clt = new Array(256);
  36329. var RGB_YUV_TABLE = new Array(2048);
  36330. var currentQuality;
  36331. var ZigZag = [0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63];
  36332. var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0];
  36333. var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
  36334. var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d];
  36335. var std_ac_luminance_values = [0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa];
  36336. var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0];
  36337. var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
  36338. var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77];
  36339. var std_ac_chrominance_values = [0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa];
  36340. function initQuantTables(sf) {
  36341. var YQT = [16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99];
  36342. for (var i = 0; i < 64; i++) {
  36343. var t = ffloor((YQT[i] * sf + 50) / 100);
  36344. if (t < 1) {
  36345. t = 1;
  36346. } else if (t > 255) {
  36347. t = 255;
  36348. }
  36349. YTable[ZigZag[i]] = t;
  36350. }
  36351. var UVQT = [17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99];
  36352. for (var j = 0; j < 64; j++) {
  36353. var u = ffloor((UVQT[j] * sf + 50) / 100);
  36354. if (u < 1) {
  36355. u = 1;
  36356. } else if (u > 255) {
  36357. u = 255;
  36358. }
  36359. UVTable[ZigZag[j]] = u;
  36360. }
  36361. var aasf = [1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, 0.785694958, 0.5411961, 0.275899379];
  36362. var k = 0;
  36363. for (var row = 0; row < 8; row++) {
  36364. for (var col = 0; col < 8; col++) {
  36365. fdtbl_Y[k] = 1.0 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0);
  36366. fdtbl_UV[k] = 1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0);
  36367. k++;
  36368. }
  36369. }
  36370. }
  36371. function computeHuffmanTbl(nrcodes, std_table) {
  36372. var codevalue = 0;
  36373. var pos_in_table = 0;
  36374. var HT = new Array();
  36375. for (var k = 1; k <= 16; k++) {
  36376. for (var j = 1; j <= nrcodes[k]; j++) {
  36377. HT[std_table[pos_in_table]] = [];
  36378. HT[std_table[pos_in_table]][0] = codevalue;
  36379. HT[std_table[pos_in_table]][1] = k;
  36380. pos_in_table++;
  36381. codevalue++;
  36382. }
  36383. codevalue *= 2;
  36384. }
  36385. return HT;
  36386. }
  36387. function initHuffmanTbl() {
  36388. YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values);
  36389. UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values);
  36390. YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values);
  36391. UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values);
  36392. }
  36393. function initCategoryNumber() {
  36394. var nrlower = 1;
  36395. var nrupper = 2;
  36396. for (var cat = 1; cat <= 15; cat++) {
  36397. //Positive numbers
  36398. for (var nr = nrlower; nr < nrupper; nr++) {
  36399. category[32767 + nr] = cat;
  36400. bitcode[32767 + nr] = [];
  36401. bitcode[32767 + nr][1] = cat;
  36402. bitcode[32767 + nr][0] = nr;
  36403. } //Negative numbers
  36404. for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) {
  36405. category[32767 + nrneg] = cat;
  36406. bitcode[32767 + nrneg] = [];
  36407. bitcode[32767 + nrneg][1] = cat;
  36408. bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg;
  36409. }
  36410. nrlower <<= 1;
  36411. nrupper <<= 1;
  36412. }
  36413. }
  36414. function initRGBYUVTable() {
  36415. for (var i = 0; i < 256; i++) {
  36416. RGB_YUV_TABLE[i] = 19595 * i;
  36417. RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i;
  36418. RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 0x8000;
  36419. RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i;
  36420. RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i;
  36421. RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 0x807fff;
  36422. RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i;
  36423. RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i;
  36424. }
  36425. } // IO functions
  36426. function writeBits(bs) {
  36427. var value = bs[0];
  36428. var posval = bs[1] - 1;
  36429. while (posval >= 0) {
  36430. if (value & 1 << posval) {
  36431. bytenew |= 1 << bytepos;
  36432. }
  36433. posval--;
  36434. bytepos--;
  36435. if (bytepos < 0) {
  36436. if (bytenew == 0xff) {
  36437. writeByte(0xff);
  36438. writeByte(0);
  36439. } else {
  36440. writeByte(bytenew);
  36441. }
  36442. bytepos = 7;
  36443. bytenew = 0;
  36444. }
  36445. }
  36446. }
  36447. function writeByte(value) {
  36448. //byteout.push(clt[value]); // write char directly instead of converting later
  36449. byteout.push(value);
  36450. if (byteout.length === 1) ;
  36451. }
  36452. function writeWord(value) {
  36453. writeByte(value >> 8 & 0xff);
  36454. writeByte(value & 0xff);
  36455. } // DCT & quantization core
  36456. function fDCTQuant(data, fdtbl) {
  36457. var d0, d1, d2, d3, d4, d5, d6, d7;
  36458. /* Pass 1: process rows. */
  36459. var dataOff = 0;
  36460. var i;
  36461. var I8 = 8;
  36462. var I64 = 64;
  36463. for (i = 0; i < I8; ++i) {
  36464. d0 = data[dataOff];
  36465. d1 = data[dataOff + 1];
  36466. d2 = data[dataOff + 2];
  36467. d3 = data[dataOff + 3];
  36468. d4 = data[dataOff + 4];
  36469. d5 = data[dataOff + 5];
  36470. d6 = data[dataOff + 6];
  36471. d7 = data[dataOff + 7];
  36472. var tmp0 = d0 + d7;
  36473. var tmp7 = d0 - d7;
  36474. var tmp1 = d1 + d6;
  36475. var tmp6 = d1 - d6;
  36476. var tmp2 = d2 + d5;
  36477. var tmp5 = d2 - d5;
  36478. var tmp3 = d3 + d4;
  36479. var tmp4 = d3 - d4;
  36480. /* Even part */
  36481. var tmp10 = tmp0 + tmp3;
  36482. /* phase 2 */
  36483. var tmp13 = tmp0 - tmp3;
  36484. var tmp11 = tmp1 + tmp2;
  36485. var tmp12 = tmp1 - tmp2;
  36486. data[dataOff] = tmp10 + tmp11;
  36487. /* phase 3 */
  36488. data[dataOff + 4] = tmp10 - tmp11;
  36489. var z1 = (tmp12 + tmp13) * 0.707106781;
  36490. /* c4 */
  36491. data[dataOff + 2] = tmp13 + z1;
  36492. /* phase 5 */
  36493. data[dataOff + 6] = tmp13 - z1;
  36494. /* Odd part */
  36495. tmp10 = tmp4 + tmp5;
  36496. /* phase 2 */
  36497. tmp11 = tmp5 + tmp6;
  36498. tmp12 = tmp6 + tmp7;
  36499. /* The rotator is modified from fig 4-8 to avoid extra negations. */
  36500. var z5 = (tmp10 - tmp12) * 0.382683433;
  36501. /* c6 */
  36502. var z2 = 0.5411961 * tmp10 + z5;
  36503. /* c2-c6 */
  36504. var z4 = 1.306562965 * tmp12 + z5;
  36505. /* c2+c6 */
  36506. var z3 = tmp11 * 0.707106781;
  36507. /* c4 */
  36508. var z11 = tmp7 + z3;
  36509. /* phase 5 */
  36510. var z13 = tmp7 - z3;
  36511. data[dataOff + 5] = z13 + z2;
  36512. /* phase 6 */
  36513. data[dataOff + 3] = z13 - z2;
  36514. data[dataOff + 1] = z11 + z4;
  36515. data[dataOff + 7] = z11 - z4;
  36516. dataOff += 8;
  36517. /* advance pointer to next row */
  36518. }
  36519. /* Pass 2: process columns. */
  36520. dataOff = 0;
  36521. for (i = 0; i < I8; ++i) {
  36522. d0 = data[dataOff];
  36523. d1 = data[dataOff + 8];
  36524. d2 = data[dataOff + 16];
  36525. d3 = data[dataOff + 24];
  36526. d4 = data[dataOff + 32];
  36527. d5 = data[dataOff + 40];
  36528. d6 = data[dataOff + 48];
  36529. d7 = data[dataOff + 56];
  36530. var tmp0p2 = d0 + d7;
  36531. var tmp7p2 = d0 - d7;
  36532. var tmp1p2 = d1 + d6;
  36533. var tmp6p2 = d1 - d6;
  36534. var tmp2p2 = d2 + d5;
  36535. var tmp5p2 = d2 - d5;
  36536. var tmp3p2 = d3 + d4;
  36537. var tmp4p2 = d3 - d4;
  36538. /* Even part */
  36539. var tmp10p2 = tmp0p2 + tmp3p2;
  36540. /* phase 2 */
  36541. var tmp13p2 = tmp0p2 - tmp3p2;
  36542. var tmp11p2 = tmp1p2 + tmp2p2;
  36543. var tmp12p2 = tmp1p2 - tmp2p2;
  36544. data[dataOff] = tmp10p2 + tmp11p2;
  36545. /* phase 3 */
  36546. data[dataOff + 32] = tmp10p2 - tmp11p2;
  36547. var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781;
  36548. /* c4 */
  36549. data[dataOff + 16] = tmp13p2 + z1p2;
  36550. /* phase 5 */
  36551. data[dataOff + 48] = tmp13p2 - z1p2;
  36552. /* Odd part */
  36553. tmp10p2 = tmp4p2 + tmp5p2;
  36554. /* phase 2 */
  36555. tmp11p2 = tmp5p2 + tmp6p2;
  36556. tmp12p2 = tmp6p2 + tmp7p2;
  36557. /* The rotator is modified from fig 4-8 to avoid extra negations. */
  36558. var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433;
  36559. /* c6 */
  36560. var z2p2 = 0.5411961 * tmp10p2 + z5p2;
  36561. /* c2-c6 */
  36562. var z4p2 = 1.306562965 * tmp12p2 + z5p2;
  36563. /* c2+c6 */
  36564. var z3p2 = tmp11p2 * 0.707106781;
  36565. /* c4 */
  36566. var z11p2 = tmp7p2 + z3p2;
  36567. /* phase 5 */
  36568. var z13p2 = tmp7p2 - z3p2;
  36569. data[dataOff + 40] = z13p2 + z2p2;
  36570. /* phase 6 */
  36571. data[dataOff + 24] = z13p2 - z2p2;
  36572. data[dataOff + 8] = z11p2 + z4p2;
  36573. data[dataOff + 56] = z11p2 - z4p2;
  36574. dataOff++;
  36575. /* advance pointer to next column */
  36576. } // Quantize/descale the coefficients
  36577. var fDCTQuant;
  36578. for (i = 0; i < I64; ++i) {
  36579. // Apply the quantization and scaling factor & Round to nearest integer
  36580. fDCTQuant = data[i] * fdtbl[i];
  36581. outputfDCTQuant[i] = fDCTQuant > 0.0 ? fDCTQuant + 0.5 | 0 : fDCTQuant - 0.5 | 0; //outputfDCTQuant[i] = fround(fDCTQuant);
  36582. }
  36583. return outputfDCTQuant;
  36584. }
  36585. function writeAPP0() {
  36586. writeWord(0xffe0); // marker
  36587. writeWord(16); // length
  36588. writeByte(0x4a); // J
  36589. writeByte(0x46); // F
  36590. writeByte(0x49); // I
  36591. writeByte(0x46); // F
  36592. writeByte(0); // = "JFIF",'\0'
  36593. writeByte(1); // versionhi
  36594. writeByte(1); // versionlo
  36595. writeByte(0); // xyunits
  36596. writeWord(1); // xdensity
  36597. writeWord(1); // ydensity
  36598. writeByte(0); // thumbnwidth
  36599. writeByte(0); // thumbnheight
  36600. }
  36601. function writeSOF0(width, height) {
  36602. writeWord(0xffc0); // marker
  36603. writeWord(17); // length, truecolor YUV JPG
  36604. writeByte(8); // precision
  36605. writeWord(height);
  36606. writeWord(width);
  36607. writeByte(3); // nrofcomponents
  36608. writeByte(1); // IdY
  36609. writeByte(0x11); // HVY
  36610. writeByte(0); // QTY
  36611. writeByte(2); // IdU
  36612. writeByte(0x11); // HVU
  36613. writeByte(1); // QTU
  36614. writeByte(3); // IdV
  36615. writeByte(0x11); // HVV
  36616. writeByte(1); // QTV
  36617. }
  36618. function writeDQT() {
  36619. writeWord(0xffdb); // marker
  36620. writeWord(132); // length
  36621. writeByte(0);
  36622. for (var i = 0; i < 64; i++) {
  36623. writeByte(YTable[i]);
  36624. }
  36625. writeByte(1);
  36626. for (var j = 0; j < 64; j++) {
  36627. writeByte(UVTable[j]);
  36628. }
  36629. }
  36630. function writeDHT() {
  36631. writeWord(0xffc4); // marker
  36632. writeWord(0x01a2); // length
  36633. writeByte(0); // HTYDCinfo
  36634. for (var i = 0; i < 16; i++) {
  36635. writeByte(std_dc_luminance_nrcodes[i + 1]);
  36636. }
  36637. for (var j = 0; j <= 11; j++) {
  36638. writeByte(std_dc_luminance_values[j]);
  36639. }
  36640. writeByte(0x10); // HTYACinfo
  36641. for (var k = 0; k < 16; k++) {
  36642. writeByte(std_ac_luminance_nrcodes[k + 1]);
  36643. }
  36644. for (var l = 0; l <= 161; l++) {
  36645. writeByte(std_ac_luminance_values[l]);
  36646. }
  36647. writeByte(1); // HTUDCinfo
  36648. for (var m = 0; m < 16; m++) {
  36649. writeByte(std_dc_chrominance_nrcodes[m + 1]);
  36650. }
  36651. for (var n = 0; n <= 11; n++) {
  36652. writeByte(std_dc_chrominance_values[n]);
  36653. }
  36654. writeByte(0x11); // HTUACinfo
  36655. for (var o = 0; o < 16; o++) {
  36656. writeByte(std_ac_chrominance_nrcodes[o + 1]);
  36657. }
  36658. for (var p = 0; p <= 161; p++) {
  36659. writeByte(std_ac_chrominance_values[p]);
  36660. }
  36661. }
  36662. function writeSOS() {
  36663. writeWord(0xffda); // marker
  36664. writeWord(12); // length
  36665. writeByte(3); // nrofcomponents
  36666. writeByte(1); // IdY
  36667. writeByte(0); // HTY
  36668. writeByte(2); // IdU
  36669. writeByte(0x11); // HTU
  36670. writeByte(3); // IdV
  36671. writeByte(0x11); // HTV
  36672. writeByte(0); // Ss
  36673. writeByte(0x3f); // Se
  36674. writeByte(0); // Bf
  36675. }
  36676. function processDU(CDU, fdtbl, DC, HTDC, HTAC) {
  36677. var EOB = HTAC[0x00];
  36678. var M16zeroes = HTAC[0xf0];
  36679. var pos;
  36680. var I16 = 16;
  36681. var I63 = 63;
  36682. var I64 = 64;
  36683. var DU_DCT = fDCTQuant(CDU, fdtbl); //ZigZag reorder
  36684. for (var j = 0; j < I64; ++j) {
  36685. DU[ZigZag[j]] = DU_DCT[j];
  36686. }
  36687. var Diff = DU[0] - DC;
  36688. DC = DU[0]; //Encode DC
  36689. if (Diff == 0) {
  36690. writeBits(HTDC[0]); // Diff might be 0
  36691. } else {
  36692. pos = 32767 + Diff;
  36693. writeBits(HTDC[category[pos]]);
  36694. writeBits(bitcode[pos]);
  36695. } //Encode ACs
  36696. var end0pos = 63; // was const... which is crazy
  36697. for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) {} //end0pos = first element in reverse order !=0
  36698. if (end0pos == 0) {
  36699. writeBits(EOB);
  36700. return DC;
  36701. }
  36702. var i = 1;
  36703. var lng;
  36704. while (i <= end0pos) {
  36705. var startpos = i;
  36706. for (; DU[i] == 0 && i <= end0pos; ++i) {}
  36707. var nrzeroes = i - startpos;
  36708. if (nrzeroes >= I16) {
  36709. lng = nrzeroes >> 4;
  36710. for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) {
  36711. writeBits(M16zeroes);
  36712. }
  36713. nrzeroes = nrzeroes & 0xf;
  36714. }
  36715. pos = 32767 + DU[i];
  36716. writeBits(HTAC[(nrzeroes << 4) + category[pos]]);
  36717. writeBits(bitcode[pos]);
  36718. i++;
  36719. }
  36720. if (end0pos != I63) {
  36721. writeBits(EOB);
  36722. }
  36723. return DC;
  36724. }
  36725. function initCharLookupTable() {
  36726. var sfcc = String.fromCharCode;
  36727. for (var i = 0; i < 256; i++) {
  36728. ///// ACHTUNG // 255
  36729. clt[i] = sfcc(i);
  36730. }
  36731. }
  36732. this.encode = function (image, quality // image data object
  36733. ) {
  36734. new Date().getTime();
  36735. if (quality) setQuality(quality); // Initialize bit writer
  36736. byteout = []; //new Array(); //新版QQ浏览器使用new Array()可能得到一个 [empty × 4]……
  36737. bytenew = 0;
  36738. bytepos = 7; // Add JPEG headers
  36739. writeWord(0xffd8); // SOI
  36740. writeAPP0();
  36741. writeDQT();
  36742. writeSOF0(image.width, image.height);
  36743. writeDHT();
  36744. writeSOS(); // Encode 8x8 macroblocks
  36745. var DCY = 0;
  36746. var DCU = 0;
  36747. var DCV = 0;
  36748. bytenew = 0;
  36749. bytepos = 7;
  36750. this.encode.displayName = '_encode_';
  36751. var imageData = image.data;
  36752. var width = image.width;
  36753. var height = image.height;
  36754. var quadWidth = width * 4;
  36755. var x,
  36756. y = 0;
  36757. var r, g, b;
  36758. var start, p, col, row, pos;
  36759. while (y < height) {
  36760. x = 0;
  36761. while (x < quadWidth) {
  36762. start = quadWidth * y + x;
  36763. p = start;
  36764. col = -1;
  36765. row = 0;
  36766. for (pos = 0; pos < 64; pos++) {
  36767. row = pos >> 3; // /8
  36768. col = (pos & 7) * 4; // %8
  36769. p = start + row * quadWidth + col;
  36770. if (y + row >= height) {
  36771. // padding bottom
  36772. p -= quadWidth * (y + 1 + row - height);
  36773. }
  36774. if (x + col >= quadWidth) {
  36775. // padding right
  36776. p -= x + col - quadWidth + 4;
  36777. }
  36778. r = imageData[p++];
  36779. g = imageData[p++];
  36780. b = imageData[p++];
  36781. /* // calculate YUV values dynamically
  36782. YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
  36783. UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
  36784. VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
  36785. */
  36786. // use lookup table (slightly faster)
  36787. YDU[pos] = (RGB_YUV_TABLE[r] + RGB_YUV_TABLE[g + 256 >> 0] + RGB_YUV_TABLE[b + 512 >> 0] >> 16) - 128;
  36788. UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128;
  36789. VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128;
  36790. }
  36791. DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
  36792. DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
  36793. DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
  36794. x += 32;
  36795. }
  36796. y += 8;
  36797. } ////////////////////////////////////////////////////////////////
  36798. // Do the bit alignment of the EOI marker
  36799. if (bytepos >= 0) {
  36800. var fillbits = [];
  36801. fillbits[1] = bytepos + 1;
  36802. fillbits[0] = (1 << bytepos + 1) - 1;
  36803. writeBits(fillbits);
  36804. }
  36805. writeWord(0xffd9); //EOI
  36806. if (typeof module === 'undefined') return new Uint8Array(byteout);
  36807. return Buffer.from(byteout);
  36808. /* var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
  36809. byteout = [];
  36810. // benchmarking
  36811. var duration = new Date().getTime() - time_start;
  36812. //console.log('Encoding time: '+ duration + 'ms');
  36813. //
  36814. return jpegDataUri */
  36815. };
  36816. function setQuality(quality) {
  36817. if (quality <= 0) {
  36818. quality = 1;
  36819. }
  36820. if (quality > 100) {
  36821. quality = 100;
  36822. }
  36823. if (currentQuality == quality) return; // don't recalc if unchanged
  36824. var sf = 0;
  36825. if (quality < 50) {
  36826. sf = Math.floor(5000 / quality);
  36827. } else {
  36828. sf = Math.floor(200 - quality * 2);
  36829. }
  36830. initQuantTables(sf);
  36831. currentQuality = quality; //console.log('Quality set to: '+quality +'%');
  36832. }
  36833. function init() {
  36834. var time_start = new Date().getTime();
  36835. if (!quality) quality = 50; // Create tables
  36836. initCharLookupTable();
  36837. initHuffmanTbl();
  36838. initCategoryNumber();
  36839. initRGBYUVTable();
  36840. setQuality(quality);
  36841. new Date().getTime() - time_start; //console.log('Initialization '+ duration + 'ms');
  36842. }
  36843. init();
  36844. } //module.exports = encode;
  36845. function encode$4(imgData, qu) {
  36846. if (typeof qu === 'undefined') qu = 50;
  36847. var encoder = new JPEGEncoder$1(qu);
  36848. var data = encoder.encode(imgData, qu);
  36849. return {
  36850. data: data,
  36851. width: imgData.width,
  36852. height: imgData.height
  36853. };
  36854. } // helper function to get the imageData of an existing image on the current page.
  36855. /* -*- tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
  36856. /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
  36857. /*
  36858. Copyright 2011 notmasteryet
  36859. Licensed under the Apache License, Version 2.0 (the "License");
  36860. you may not use this file except in compliance with the License.
  36861. You may obtain a copy of the License at
  36862. http://www.apache.org/licenses/LICENSE-2.0
  36863. Unless required by applicable law or agreed to in writing, software
  36864. distributed under the License is distributed on an "AS IS" BASIS,
  36865. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  36866. See the License for the specific language governing permissions and
  36867. limitations under the License.
  36868. */
  36869. // - The JPEG specification can be found in the ITU CCITT Recommendation T.81
  36870. // (www.w3.org/Graphics/JPEG/itu-t81.pdf)
  36871. // - The JFIF specification can be found in the JPEG File Interchange Format
  36872. // (www.w3.org/Graphics/JPEG/jfif3.pdf)
  36873. // - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
  36874. // in PostScript Level 2, Technical Note #5116
  36875. // (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
  36876. var JpegImage = function jpegImage() {
  36877. var dctZigZag = new Int32Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
  36878. var dctCos1 = 4017; // cos(pi/16)
  36879. var dctSin1 = 799; // sin(pi/16)
  36880. var dctCos3 = 3406; // cos(3*pi/16)
  36881. var dctSin3 = 2276; // sin(3*pi/16)
  36882. var dctCos6 = 1567; // cos(6*pi/16)
  36883. var dctSin6 = 3784; // sin(6*pi/16)
  36884. var dctSqrt2 = 5793; // sqrt(2)
  36885. var dctSqrt1d2 = 2896; // sqrt(2) / 2
  36886. function constructor() {}
  36887. function buildHuffmanTable(codeLengths, values) {
  36888. var k = 0,
  36889. code = [],
  36890. i,
  36891. j,
  36892. length = 16;
  36893. while (length > 0 && !codeLengths[length - 1]) {
  36894. length--;
  36895. }
  36896. code.push({
  36897. children: [],
  36898. index: 0
  36899. });
  36900. var p = code[0],
  36901. q;
  36902. for (i = 0; i < length; i++) {
  36903. for (j = 0; j < codeLengths[i]; j++) {
  36904. p = code.pop();
  36905. p.children[p.index] = values[k];
  36906. while (p.index > 0) {
  36907. if (code.length === 0) throw new Error('Could not recreate Huffman Table');
  36908. p = code.pop();
  36909. }
  36910. p.index++;
  36911. code.push(p);
  36912. while (code.length <= i) {
  36913. code.push(q = {
  36914. children: [],
  36915. index: 0
  36916. });
  36917. p.children[p.index] = q.children;
  36918. p = q;
  36919. }
  36920. k++;
  36921. }
  36922. if (i + 1 < length) {
  36923. // p here points to last code
  36924. code.push(q = {
  36925. children: [],
  36926. index: 0
  36927. });
  36928. p.children[p.index] = q.children;
  36929. p = q;
  36930. }
  36931. }
  36932. return code[0].children;
  36933. }
  36934. function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
  36935. frame.precision;
  36936. frame.samplesPerLine;
  36937. frame.scanLines;
  36938. var mcusPerLine = frame.mcusPerLine;
  36939. var progressive = frame.progressive;
  36940. frame.maxH;
  36941. frame.maxV;
  36942. var startOffset = offset,
  36943. bitsData = 0,
  36944. bitsCount = 0;
  36945. function readBit() {
  36946. if (bitsCount > 0) {
  36947. bitsCount--;
  36948. return bitsData >> bitsCount & 1;
  36949. }
  36950. bitsData = data[offset++];
  36951. if (bitsData == 0xff) {
  36952. var nextByte = data[offset++];
  36953. if (nextByte) {
  36954. throw new Error('unexpected marker: ' + (bitsData << 8 | nextByte).toString(16));
  36955. } // unstuff 0
  36956. }
  36957. bitsCount = 7;
  36958. return bitsData >>> 7;
  36959. }
  36960. function decodeHuffman(tree) {
  36961. var node = tree,
  36962. bit;
  36963. while ((bit = readBit()) !== null) {
  36964. node = node[bit];
  36965. if (typeof node === 'number') return node;
  36966. if (typeof node !== 'object') throw new Error('invalid huffman sequence');
  36967. }
  36968. return null;
  36969. }
  36970. function receive(length) {
  36971. var n = 0;
  36972. while (length > 0) {
  36973. var bit = readBit();
  36974. if (bit === null) return;
  36975. n = n << 1 | bit;
  36976. length--;
  36977. }
  36978. return n;
  36979. }
  36980. function receiveAndExtend(length) {
  36981. var n = receive(length);
  36982. if (n >= 1 << length - 1) return n;
  36983. return n + (-1 << length) + 1;
  36984. }
  36985. function decodeBaseline(component, zz) {
  36986. var t = decodeHuffman(component.huffmanTableDC);
  36987. var diff = t === 0 ? 0 : receiveAndExtend(t);
  36988. zz[0] = component.pred += diff;
  36989. var k = 1;
  36990. while (k < 64) {
  36991. var rs = decodeHuffman(component.huffmanTableAC);
  36992. var s = rs & 15,
  36993. r = rs >> 4;
  36994. if (s === 0) {
  36995. if (r < 15) break;
  36996. k += 16;
  36997. continue;
  36998. }
  36999. k += r;
  37000. var z = dctZigZag[k];
  37001. zz[z] = receiveAndExtend(s);
  37002. k++;
  37003. }
  37004. }
  37005. function decodeDCFirst(component, zz) {
  37006. var t = decodeHuffman(component.huffmanTableDC);
  37007. var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
  37008. zz[0] = component.pred += diff;
  37009. }
  37010. function decodeDCSuccessive(component, zz) {
  37011. zz[0] |= readBit() << successive;
  37012. }
  37013. var eobrun = 0;
  37014. function decodeACFirst(component, zz) {
  37015. if (eobrun > 0) {
  37016. eobrun--;
  37017. return;
  37018. }
  37019. var k = spectralStart,
  37020. e = spectralEnd;
  37021. while (k <= e) {
  37022. var rs = decodeHuffman(component.huffmanTableAC);
  37023. var s = rs & 15,
  37024. r = rs >> 4;
  37025. if (s === 0) {
  37026. if (r < 15) {
  37027. eobrun = receive(r) + (1 << r) - 1;
  37028. break;
  37029. }
  37030. k += 16;
  37031. continue;
  37032. }
  37033. k += r;
  37034. var z = dctZigZag[k];
  37035. zz[z] = receiveAndExtend(s) * (1 << successive);
  37036. k++;
  37037. }
  37038. }
  37039. var successiveACState = 0,
  37040. successiveACNextValue;
  37041. function decodeACSuccessive(component, zz) {
  37042. var k = spectralStart,
  37043. e = spectralEnd,
  37044. r = 0;
  37045. while (k <= e) {
  37046. var z = dctZigZag[k];
  37047. var direction = zz[z] < 0 ? -1 : 1;
  37048. switch (successiveACState) {
  37049. case 0:
  37050. // initial state
  37051. var rs = decodeHuffman(component.huffmanTableAC);
  37052. var s = rs & 15,
  37053. r = rs >> 4;
  37054. if (s === 0) {
  37055. if (r < 15) {
  37056. eobrun = receive(r) + (1 << r);
  37057. successiveACState = 4;
  37058. } else {
  37059. r = 16;
  37060. successiveACState = 1;
  37061. }
  37062. } else {
  37063. if (s !== 1) throw new Error('invalid ACn encoding');
  37064. successiveACNextValue = receiveAndExtend(s);
  37065. successiveACState = r ? 2 : 3;
  37066. }
  37067. continue;
  37068. case 1: // skipping r zero items
  37069. case 2:
  37070. if (zz[z]) zz[z] += (readBit() << successive) * direction;else {
  37071. r--;
  37072. if (r === 0) successiveACState = successiveACState == 2 ? 3 : 0;
  37073. }
  37074. break;
  37075. case 3:
  37076. // set value for a zero item
  37077. if (zz[z]) zz[z] += (readBit() << successive) * direction;else {
  37078. zz[z] = successiveACNextValue << successive;
  37079. successiveACState = 0;
  37080. }
  37081. break;
  37082. case 4:
  37083. // eob
  37084. if (zz[z]) zz[z] += (readBit() << successive) * direction;
  37085. break;
  37086. }
  37087. k++;
  37088. }
  37089. if (successiveACState === 4) {
  37090. eobrun--;
  37091. if (eobrun === 0) successiveACState = 0;
  37092. }
  37093. }
  37094. function decodeMcu(component, decode, mcu, row, col) {
  37095. var mcuRow = mcu / mcusPerLine | 0;
  37096. var mcuCol = mcu % mcusPerLine;
  37097. var blockRow = mcuRow * component.v + row;
  37098. var blockCol = mcuCol * component.h + col;
  37099. decode(component, component.blocks[blockRow][blockCol]);
  37100. }
  37101. function decodeBlock(component, decode, mcu) {
  37102. var blockRow = mcu / component.blocksPerLine | 0;
  37103. var blockCol = mcu % component.blocksPerLine;
  37104. decode(component, component.blocks[blockRow][blockCol]);
  37105. }
  37106. var componentsLength = components.length;
  37107. var component, i, j, k, n;
  37108. var decodeFn;
  37109. if (progressive) {
  37110. if (spectralStart === 0) decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;else decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
  37111. } else {
  37112. decodeFn = decodeBaseline;
  37113. }
  37114. var mcu = 0,
  37115. marker;
  37116. var mcuExpected;
  37117. if (componentsLength == 1) {
  37118. mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
  37119. } else {
  37120. mcuExpected = mcusPerLine * frame.mcusPerColumn;
  37121. }
  37122. if (!resetInterval) resetInterval = mcuExpected;
  37123. var h, v;
  37124. while (mcu < mcuExpected) {
  37125. // reset interval stuff
  37126. for (i = 0; i < componentsLength; i++) {
  37127. components[i].pred = 0;
  37128. }
  37129. eobrun = 0;
  37130. if (componentsLength == 1) {
  37131. component = components[0];
  37132. for (n = 0; n < resetInterval; n++) {
  37133. decodeBlock(component, decodeFn, mcu);
  37134. mcu++;
  37135. }
  37136. } else {
  37137. for (n = 0; n < resetInterval; n++) {
  37138. for (i = 0; i < componentsLength; i++) {
  37139. component = components[i];
  37140. h = component.h;
  37141. v = component.v;
  37142. for (j = 0; j < v; j++) {
  37143. for (k = 0; k < h; k++) {
  37144. decodeMcu(component, decodeFn, mcu, j, k);
  37145. }
  37146. }
  37147. }
  37148. mcu++; // If we've reached our expected MCU's, stop decoding
  37149. if (mcu === mcuExpected) break;
  37150. }
  37151. } // find marker
  37152. bitsCount = 0;
  37153. marker = data[offset] << 8 | data[offset + 1];
  37154. if (marker < 0xff00) {
  37155. throw new Error('marker was not found');
  37156. }
  37157. if (marker >= 0xffd0 && marker <= 0xffd7) {
  37158. // RSTx
  37159. offset += 2;
  37160. } else break;
  37161. }
  37162. return offset - startOffset;
  37163. }
  37164. function buildComponentData(frame, component) {
  37165. var lines = [];
  37166. var blocksPerLine = component.blocksPerLine;
  37167. var blocksPerColumn = component.blocksPerColumn;
  37168. var samplesPerLine = blocksPerLine << 3;
  37169. var R = new Int32Array(64),
  37170. r = new Uint8Array(64); // A port of poppler's IDCT method which in turn is taken from:
  37171. // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
  37172. // "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
  37173. // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
  37174. // 988-991.
  37175. function quantizeAndInverse(zz, dataOut, dataIn) {
  37176. var qt = component.quantizationTable;
  37177. var v0, v1, v2, v3, v4, v5, v6, v7, t;
  37178. var p = dataIn;
  37179. var i; // dequant
  37180. for (i = 0; i < 64; i++) {
  37181. p[i] = zz[i] * qt[i];
  37182. } // inverse DCT on rows
  37183. for (i = 0; i < 8; ++i) {
  37184. var row = 8 * i; // check for all-zero AC coefficients
  37185. if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 && p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 && p[7 + row] == 0) {
  37186. t = dctSqrt2 * p[0 + row] + 512 >> 10;
  37187. p[0 + row] = t;
  37188. p[1 + row] = t;
  37189. p[2 + row] = t;
  37190. p[3 + row] = t;
  37191. p[4 + row] = t;
  37192. p[5 + row] = t;
  37193. p[6 + row] = t;
  37194. p[7 + row] = t;
  37195. continue;
  37196. } // stage 4
  37197. v0 = dctSqrt2 * p[0 + row] + 128 >> 8;
  37198. v1 = dctSqrt2 * p[4 + row] + 128 >> 8;
  37199. v2 = p[2 + row];
  37200. v3 = p[6 + row];
  37201. v4 = dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128 >> 8;
  37202. v7 = dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128 >> 8;
  37203. v5 = p[3 + row] << 4;
  37204. v6 = p[5 + row] << 4; // stage 3
  37205. t = v0 - v1 + 1 >> 1;
  37206. v0 = v0 + v1 + 1 >> 1;
  37207. v1 = t;
  37208. t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;
  37209. v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;
  37210. v3 = t;
  37211. t = v4 - v6 + 1 >> 1;
  37212. v4 = v4 + v6 + 1 >> 1;
  37213. v6 = t;
  37214. t = v7 + v5 + 1 >> 1;
  37215. v5 = v7 - v5 + 1 >> 1;
  37216. v7 = t; // stage 2
  37217. t = v0 - v3 + 1 >> 1;
  37218. v0 = v0 + v3 + 1 >> 1;
  37219. v3 = t;
  37220. t = v1 - v2 + 1 >> 1;
  37221. v1 = v1 + v2 + 1 >> 1;
  37222. v2 = t;
  37223. t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
  37224. v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
  37225. v7 = t;
  37226. t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
  37227. v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
  37228. v6 = t; // stage 1
  37229. p[0 + row] = v0 + v7;
  37230. p[7 + row] = v0 - v7;
  37231. p[1 + row] = v1 + v6;
  37232. p[6 + row] = v1 - v6;
  37233. p[2 + row] = v2 + v5;
  37234. p[5 + row] = v2 - v5;
  37235. p[3 + row] = v3 + v4;
  37236. p[4 + row] = v3 - v4;
  37237. } // inverse DCT on columns
  37238. for (i = 0; i < 8; ++i) {
  37239. var col = i; // check for all-zero AC coefficients
  37240. if (p[1 * 8 + col] == 0 && p[2 * 8 + col] == 0 && p[3 * 8 + col] == 0 && p[4 * 8 + col] == 0 && p[5 * 8 + col] == 0 && p[6 * 8 + col] == 0 && p[7 * 8 + col] == 0) {
  37241. t = dctSqrt2 * dataIn[i + 0] + 8192 >> 14;
  37242. p[0 * 8 + col] = t;
  37243. p[1 * 8 + col] = t;
  37244. p[2 * 8 + col] = t;
  37245. p[3 * 8 + col] = t;
  37246. p[4 * 8 + col] = t;
  37247. p[5 * 8 + col] = t;
  37248. p[6 * 8 + col] = t;
  37249. p[7 * 8 + col] = t;
  37250. continue;
  37251. } // stage 4
  37252. v0 = dctSqrt2 * p[0 * 8 + col] + 2048 >> 12;
  37253. v1 = dctSqrt2 * p[4 * 8 + col] + 2048 >> 12;
  37254. v2 = p[2 * 8 + col];
  37255. v3 = p[6 * 8 + col];
  37256. v4 = dctSqrt1d2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048 >> 12;
  37257. v7 = dctSqrt1d2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048 >> 12;
  37258. v5 = p[3 * 8 + col];
  37259. v6 = p[5 * 8 + col]; // stage 3
  37260. t = v0 - v1 + 1 >> 1;
  37261. v0 = v0 + v1 + 1 >> 1;
  37262. v1 = t;
  37263. t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;
  37264. v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;
  37265. v3 = t;
  37266. t = v4 - v6 + 1 >> 1;
  37267. v4 = v4 + v6 + 1 >> 1;
  37268. v6 = t;
  37269. t = v7 + v5 + 1 >> 1;
  37270. v5 = v7 - v5 + 1 >> 1;
  37271. v7 = t; // stage 2
  37272. t = v0 - v3 + 1 >> 1;
  37273. v0 = v0 + v3 + 1 >> 1;
  37274. v3 = t;
  37275. t = v1 - v2 + 1 >> 1;
  37276. v1 = v1 + v2 + 1 >> 1;
  37277. v2 = t;
  37278. t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
  37279. v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
  37280. v7 = t;
  37281. t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
  37282. v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
  37283. v6 = t; // stage 1
  37284. p[0 * 8 + col] = v0 + v7;
  37285. p[7 * 8 + col] = v0 - v7;
  37286. p[1 * 8 + col] = v1 + v6;
  37287. p[6 * 8 + col] = v1 - v6;
  37288. p[2 * 8 + col] = v2 + v5;
  37289. p[5 * 8 + col] = v2 - v5;
  37290. p[3 * 8 + col] = v3 + v4;
  37291. p[4 * 8 + col] = v3 - v4;
  37292. } // convert to 8-bit integers
  37293. for (i = 0; i < 64; ++i) {
  37294. var sample = 128 + (p[i] + 8 >> 4);
  37295. dataOut[i] = sample < 0 ? 0 : sample > 0xff ? 0xff : sample;
  37296. }
  37297. }
  37298. var i, j;
  37299. for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
  37300. var scanLine = blockRow << 3;
  37301. for (i = 0; i < 8; i++) {
  37302. lines.push(new Uint8Array(samplesPerLine));
  37303. }
  37304. for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
  37305. quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
  37306. var offset = 0,
  37307. sample = blockCol << 3;
  37308. for (j = 0; j < 8; j++) {
  37309. var line = lines[scanLine + j];
  37310. for (i = 0; i < 8; i++) {
  37311. line[sample + i] = r[offset++];
  37312. }
  37313. }
  37314. }
  37315. }
  37316. return lines;
  37317. }
  37318. function clampTo8bit(a) {
  37319. return a < 0 ? 0 : a > 255 ? 255 : a;
  37320. }
  37321. constructor.prototype = {
  37322. load: function load(path) {
  37323. var xhr = new XMLHttpRequest();
  37324. xhr.open('GET', path, true);
  37325. xhr.responseType = 'arraybuffer';
  37326. xhr.onload = function () {
  37327. // TODO catch parse error
  37328. var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
  37329. this.parse(data);
  37330. if (this.onload) this.onload();
  37331. }.bind(this);
  37332. xhr.send(null);
  37333. },
  37334. parse: function parse(data) {
  37335. var offset = 0;
  37336. data.length;
  37337. function readUint16() {
  37338. var value = data[offset] << 8 | data[offset + 1];
  37339. offset += 2;
  37340. return value;
  37341. }
  37342. function readDataBlock() {
  37343. var length = readUint16();
  37344. var array = data.subarray(offset, offset + length - 2);
  37345. offset += array.length;
  37346. return array;
  37347. }
  37348. function prepareComponents(frame) {
  37349. var maxH = 0,
  37350. maxV = 0;
  37351. var component, componentId;
  37352. for (componentId in frame.components) {
  37353. if (frame.components.hasOwnProperty(componentId)) {
  37354. component = frame.components[componentId];
  37355. if (maxH < component.h) maxH = component.h;
  37356. if (maxV < component.v) maxV = component.v;
  37357. }
  37358. }
  37359. var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
  37360. var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
  37361. for (componentId in frame.components) {
  37362. if (frame.components.hasOwnProperty(componentId)) {
  37363. component = frame.components[componentId];
  37364. var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
  37365. var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);
  37366. var blocksPerLineForMcu = mcusPerLine * component.h;
  37367. var blocksPerColumnForMcu = mcusPerColumn * component.v;
  37368. var blocks = [];
  37369. for (var i = 0; i < blocksPerColumnForMcu; i++) {
  37370. var row = [];
  37371. for (var j = 0; j < blocksPerLineForMcu; j++) {
  37372. row.push(new Int32Array(64));
  37373. }
  37374. blocks.push(row);
  37375. }
  37376. component.blocksPerLine = blocksPerLine;
  37377. component.blocksPerColumn = blocksPerColumn;
  37378. component.blocks = blocks;
  37379. }
  37380. }
  37381. frame.maxH = maxH;
  37382. frame.maxV = maxV;
  37383. frame.mcusPerLine = mcusPerLine;
  37384. frame.mcusPerColumn = mcusPerColumn;
  37385. }
  37386. var jfif = null;
  37387. var adobe = null;
  37388. var frame, resetInterval;
  37389. var quantizationTables = [],
  37390. frames = [];
  37391. var huffmanTablesAC = [],
  37392. huffmanTablesDC = [];
  37393. var fileMarker = readUint16();
  37394. if (fileMarker != 0xffd8) {
  37395. // SOI (Start of Image)
  37396. throw new Error('SOI not found');
  37397. }
  37398. fileMarker = readUint16();
  37399. while (fileMarker != 0xffd9) {
  37400. // EOI (End of image)
  37401. var i, j;
  37402. switch (fileMarker) {
  37403. case 0xff00:
  37404. break;
  37405. case 0xffe0: // APP0 (Application Specific)
  37406. case 0xffe1: // APP1
  37407. case 0xffe2: // APP2
  37408. case 0xffe3: // APP3
  37409. case 0xffe4: // APP4
  37410. case 0xffe5: // APP5
  37411. case 0xffe6: // APP6
  37412. case 0xffe7: // APP7
  37413. case 0xffe8: // APP8
  37414. case 0xffe9: // APP9
  37415. case 0xffea: // APP10
  37416. case 0xffeb: // APP11
  37417. case 0xffec: // APP12
  37418. case 0xffed: // APP13
  37419. case 0xffee: // APP14
  37420. case 0xffef: // APP15
  37421. case 0xfffe:
  37422. // COM (Comment)
  37423. var appData = readDataBlock();
  37424. if (fileMarker === 0xffe0) {
  37425. if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
  37426. // 'JFIF\x00'
  37427. jfif = {
  37428. version: {
  37429. major: appData[5],
  37430. minor: appData[6]
  37431. },
  37432. densityUnits: appData[7],
  37433. xDensity: appData[8] << 8 | appData[9],
  37434. yDensity: appData[10] << 8 | appData[11],
  37435. thumbWidth: appData[12],
  37436. thumbHeight: appData[13],
  37437. thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
  37438. };
  37439. }
  37440. } // TODO APP1 - Exif
  37441. if (fileMarker === 0xffee) {
  37442. if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) {
  37443. // 'Adobe\x00'
  37444. adobe = {
  37445. version: appData[6],
  37446. flags0: appData[7] << 8 | appData[8],
  37447. flags1: appData[9] << 8 | appData[10],
  37448. transformCode: appData[11]
  37449. };
  37450. }
  37451. }
  37452. break;
  37453. case 0xffdb:
  37454. // DQT (Define Quantization Tables)
  37455. var quantizationTablesLength = readUint16();
  37456. var quantizationTablesEnd = quantizationTablesLength + offset - 2;
  37457. while (offset < quantizationTablesEnd) {
  37458. var quantizationTableSpec = data[offset++];
  37459. var tableData = new Int32Array(64);
  37460. if (quantizationTableSpec >> 4 === 0) {
  37461. // 8 bit values
  37462. for (j = 0; j < 64; j++) {
  37463. var z = dctZigZag[j];
  37464. tableData[z] = data[offset++];
  37465. }
  37466. } else if (quantizationTableSpec >> 4 === 1) {
  37467. //16 bit
  37468. for (j = 0; j < 64; j++) {
  37469. var z = dctZigZag[j];
  37470. tableData[z] = readUint16();
  37471. }
  37472. } else throw new Error('DQT: invalid table spec');
  37473. quantizationTables[quantizationTableSpec & 15] = tableData;
  37474. }
  37475. break;
  37476. case 0xffc0: // SOF0 (Start of Frame, Baseline DCT)
  37477. case 0xffc1: // SOF1 (Start of Frame, Extended DCT)
  37478. case 0xffc2:
  37479. // SOF2 (Start of Frame, Progressive DCT)
  37480. readUint16(); // skip data length
  37481. frame = {};
  37482. frame.extended = fileMarker === 0xffc1;
  37483. frame.progressive = fileMarker === 0xffc2;
  37484. frame.precision = data[offset++];
  37485. frame.scanLines = readUint16();
  37486. frame.samplesPerLine = readUint16();
  37487. frame.components = {};
  37488. frame.componentsOrder = [];
  37489. var componentsCount = data[offset++],
  37490. componentId;
  37491. for (i = 0; i < componentsCount; i++) {
  37492. componentId = data[offset];
  37493. var h = data[offset + 1] >> 4;
  37494. var v = data[offset + 1] & 15;
  37495. var qId = data[offset + 2];
  37496. frame.componentsOrder.push(componentId);
  37497. frame.components[componentId] = {
  37498. h: h,
  37499. v: v,
  37500. quantizationIdx: qId
  37501. };
  37502. offset += 3;
  37503. }
  37504. prepareComponents(frame);
  37505. frames.push(frame);
  37506. break;
  37507. case 0xffc4:
  37508. // DHT (Define Huffman Tables)
  37509. var huffmanLength = readUint16();
  37510. for (i = 2; i < huffmanLength;) {
  37511. var huffmanTableSpec = data[offset++];
  37512. var codeLengths = new Uint8Array(16);
  37513. var codeLengthSum = 0;
  37514. for (j = 0; j < 16; j++, offset++) {
  37515. codeLengthSum += codeLengths[j] = data[offset];
  37516. }
  37517. var huffmanValues = new Uint8Array(codeLengthSum);
  37518. for (j = 0; j < codeLengthSum; j++, offset++) {
  37519. huffmanValues[j] = data[offset];
  37520. }
  37521. i += 17 + codeLengthSum;
  37522. (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
  37523. }
  37524. break;
  37525. case 0xffdd:
  37526. // DRI (Define Restart Interval)
  37527. readUint16(); // skip data length
  37528. resetInterval = readUint16();
  37529. break;
  37530. case 0xffda:
  37531. // SOS (Start of Scan)
  37532. readUint16();
  37533. var selectorsCount = data[offset++];
  37534. var components = [],
  37535. component;
  37536. for (i = 0; i < selectorsCount; i++) {
  37537. component = frame.components[data[offset++]];
  37538. var tableSpec = data[offset++];
  37539. component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
  37540. component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
  37541. components.push(component);
  37542. }
  37543. var spectralStart = data[offset++];
  37544. var spectralEnd = data[offset++];
  37545. var successiveApproximation = data[offset++];
  37546. var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15);
  37547. offset += processed;
  37548. break;
  37549. case 0xffff:
  37550. // Fill bytes
  37551. if (data[offset] !== 0xff) {
  37552. // Avoid skipping a valid marker.
  37553. offset--;
  37554. }
  37555. break;
  37556. default:
  37557. if (data[offset - 3] == 0xff && data[offset - 2] >= 0xc0 && data[offset - 2] <= 0xfe) {
  37558. // could be incorrect encoding -- last 0xFF byte of the previous
  37559. // block was eaten by the encoder
  37560. offset -= 3;
  37561. break;
  37562. }
  37563. throw new Error('unknown JPEG marker ' + fileMarker.toString(16));
  37564. }
  37565. fileMarker = readUint16();
  37566. }
  37567. if (frames.length != 1) throw new Error('only single frame JPEGs supported'); // set each frame's components quantization table
  37568. for (var i = 0; i < frames.length; i++) {
  37569. var cp = frames[i].components;
  37570. for (var j in cp) {
  37571. cp[j].quantizationTable = quantizationTables[cp[j].quantizationIdx];
  37572. delete cp[j].quantizationIdx;
  37573. }
  37574. }
  37575. this.width = frame.samplesPerLine;
  37576. this.height = frame.scanLines;
  37577. this.jfif = jfif;
  37578. this.adobe = adobe;
  37579. this.components = [];
  37580. for (var i = 0; i < frame.componentsOrder.length; i++) {
  37581. var component = frame.components[frame.componentsOrder[i]];
  37582. this.components.push({
  37583. lines: buildComponentData(frame, component),
  37584. scaleX: component.h / frame.maxH,
  37585. scaleY: component.v / frame.maxV
  37586. });
  37587. }
  37588. },
  37589. getData: function getData(width, height) {
  37590. var scaleX = this.width / width,
  37591. scaleY = this.height / height;
  37592. var component1, component2, component3, component4;
  37593. var component1Line, component2Line, component3Line, component4Line;
  37594. var x, y;
  37595. var offset = 0;
  37596. var Y, Cb, Cr, K, C, M, Ye, R, G, B;
  37597. var colorTransform;
  37598. var dataLength = width * height * this.components.length;
  37599. var data = new Uint8Array(dataLength);
  37600. switch (this.components.length) {
  37601. case 1:
  37602. component1 = this.components[0];
  37603. for (y = 0; y < height; y++) {
  37604. component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
  37605. for (x = 0; x < width; x++) {
  37606. Y = component1Line[0 | x * component1.scaleX * scaleX];
  37607. data[offset++] = Y;
  37608. }
  37609. }
  37610. break;
  37611. case 2:
  37612. // PDF might compress two component data in custom colorspace
  37613. component1 = this.components[0];
  37614. component2 = this.components[1];
  37615. for (y = 0; y < height; y++) {
  37616. component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
  37617. component2Line = component2.lines[0 | y * component2.scaleY * scaleY];
  37618. for (x = 0; x < width; x++) {
  37619. Y = component1Line[0 | x * component1.scaleX * scaleX];
  37620. data[offset++] = Y;
  37621. Y = component2Line[0 | x * component2.scaleX * scaleX];
  37622. data[offset++] = Y;
  37623. }
  37624. }
  37625. break;
  37626. case 3:
  37627. // The default transform for three components is true
  37628. colorTransform = true; // The adobe transform marker overrides any previous setting
  37629. if (this.adobe && this.adobe.transformCode) colorTransform = true;else if (typeof this.colorTransform !== 'undefined') colorTransform = !!this.colorTransform;
  37630. component1 = this.components[0];
  37631. component2 = this.components[1];
  37632. component3 = this.components[2];
  37633. for (y = 0; y < height; y++) {
  37634. component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
  37635. component2Line = component2.lines[0 | y * component2.scaleY * scaleY];
  37636. component3Line = component3.lines[0 | y * component3.scaleY * scaleY];
  37637. for (x = 0; x < width; x++) {
  37638. if (!colorTransform) {
  37639. R = component1Line[0 | x * component1.scaleX * scaleX];
  37640. G = component2Line[0 | x * component2.scaleX * scaleX];
  37641. B = component3Line[0 | x * component3.scaleX * scaleX];
  37642. } else {
  37643. Y = component1Line[0 | x * component1.scaleX * scaleX];
  37644. Cb = component2Line[0 | x * component2.scaleX * scaleX];
  37645. Cr = component3Line[0 | x * component3.scaleX * scaleX];
  37646. R = clampTo8bit(Y + 1.402 * (Cr - 128));
  37647. G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
  37648. B = clampTo8bit(Y + 1.772 * (Cb - 128));
  37649. }
  37650. data[offset++] = R;
  37651. data[offset++] = G;
  37652. data[offset++] = B;
  37653. }
  37654. }
  37655. break;
  37656. case 4:
  37657. if (!this.adobe) throw new Error('Unsupported color mode (4 components)'); // The default transform for four components is false
  37658. colorTransform = false; // The adobe transform marker overrides any previous setting
  37659. if (this.adobe && this.adobe.transformCode) colorTransform = true;else if (typeof this.colorTransform !== 'undefined') colorTransform = !!this.colorTransform;
  37660. component1 = this.components[0];
  37661. component2 = this.components[1];
  37662. component3 = this.components[2];
  37663. component4 = this.components[3];
  37664. for (y = 0; y < height; y++) {
  37665. component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
  37666. component2Line = component2.lines[0 | y * component2.scaleY * scaleY];
  37667. component3Line = component3.lines[0 | y * component3.scaleY * scaleY];
  37668. component4Line = component4.lines[0 | y * component4.scaleY * scaleY];
  37669. for (x = 0; x < width; x++) {
  37670. if (!colorTransform) {
  37671. C = component1Line[0 | x * component1.scaleX * scaleX];
  37672. M = component2Line[0 | x * component2.scaleX * scaleX];
  37673. Ye = component3Line[0 | x * component3.scaleX * scaleX];
  37674. K = component4Line[0 | x * component4.scaleX * scaleX];
  37675. } else {
  37676. Y = component1Line[0 | x * component1.scaleX * scaleX];
  37677. Cb = component2Line[0 | x * component2.scaleX * scaleX];
  37678. Cr = component3Line[0 | x * component3.scaleX * scaleX];
  37679. K = component4Line[0 | x * component4.scaleX * scaleX];
  37680. C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
  37681. M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
  37682. Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
  37683. }
  37684. data[offset++] = 255 - C;
  37685. data[offset++] = 255 - M;
  37686. data[offset++] = 255 - Ye;
  37687. data[offset++] = 255 - K;
  37688. }
  37689. }
  37690. break;
  37691. default:
  37692. throw new Error('Unsupported color mode');
  37693. }
  37694. return data;
  37695. },
  37696. copyToImageData: function copyToImageData(imageData, formatAsRGBA) {
  37697. var width = imageData.width,
  37698. height = imageData.height;
  37699. var imageDataArray = imageData.data;
  37700. var data = this.getData(width, height);
  37701. var i = 0,
  37702. j = 0,
  37703. x,
  37704. y;
  37705. var Y, K, C, M, R, G, B;
  37706. switch (this.components.length) {
  37707. case 1:
  37708. for (y = 0; y < height; y++) {
  37709. for (x = 0; x < width; x++) {
  37710. Y = data[i++];
  37711. imageDataArray[j++] = Y;
  37712. imageDataArray[j++] = Y;
  37713. imageDataArray[j++] = Y;
  37714. if (formatAsRGBA) {
  37715. imageDataArray[j++] = 255;
  37716. }
  37717. }
  37718. }
  37719. break;
  37720. case 3:
  37721. for (y = 0; y < height; y++) {
  37722. for (x = 0; x < width; x++) {
  37723. R = data[i++];
  37724. G = data[i++];
  37725. B = data[i++];
  37726. imageDataArray[j++] = R;
  37727. imageDataArray[j++] = G;
  37728. imageDataArray[j++] = B;
  37729. if (formatAsRGBA) {
  37730. imageDataArray[j++] = 255;
  37731. }
  37732. }
  37733. }
  37734. break;
  37735. case 4:
  37736. for (y = 0; y < height; y++) {
  37737. for (x = 0; x < width; x++) {
  37738. C = data[i++];
  37739. M = data[i++];
  37740. Y = data[i++];
  37741. K = data[i++];
  37742. R = 255 - clampTo8bit(C * (1 - K / 255) + K);
  37743. G = 255 - clampTo8bit(M * (1 - K / 255) + K);
  37744. B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
  37745. imageDataArray[j++] = R;
  37746. imageDataArray[j++] = G;
  37747. imageDataArray[j++] = B;
  37748. if (formatAsRGBA) {
  37749. imageDataArray[j++] = 255;
  37750. }
  37751. }
  37752. }
  37753. break;
  37754. default:
  37755. throw new Error('Unsupported color mode');
  37756. }
  37757. }
  37758. };
  37759. return constructor;
  37760. }();
  37761. function decode$6(jpegData, opts) {
  37762. var defaultOpts = {
  37763. useTArray: false,
  37764. // "undefined" means "Choose whether to transform colors based on the image’s color model."
  37765. colorTransform: undefined,
  37766. formatAsRGBA: true
  37767. };
  37768. if (opts) {
  37769. if (typeof opts === 'object') {
  37770. opts = {
  37771. useTArray: typeof opts.useTArray === 'undefined' ? defaultOpts.useTArray : opts.useTArray,
  37772. colorTransform: typeof opts.colorTransform === 'undefined' ? defaultOpts.colorTransform : opts.colorTransform,
  37773. formatAsRGBA: typeof opts.formatAsRGBA === 'undefined' ? defaultOpts.formatAsRGBA : opts.formatAsRGBA
  37774. };
  37775. } else {
  37776. // backwards compatiblity, before 0.3.5, we only had the useTArray param
  37777. opts = defaultOpts;
  37778. opts.useTArray = true;
  37779. }
  37780. } else {
  37781. opts = defaultOpts;
  37782. }
  37783. var arr = new Uint8Array(jpegData);
  37784. var decoder = new JpegImage();
  37785. decoder.parse(arr);
  37786. decoder.colorTransform = opts.colorTransform;
  37787. var channels = opts.formatAsRGBA ? 4 : 3;
  37788. var bytesNeeded = decoder.width * decoder.height * channels;
  37789. try {
  37790. var image = {
  37791. width: decoder.width,
  37792. height: decoder.height,
  37793. data: opts.useTArray ? new Uint8Array(bytesNeeded) : new Buffer(bytesNeeded)
  37794. };
  37795. } catch (err) {
  37796. if (err instanceof RangeError) {
  37797. throw new Error('Could not allocate enough memory for the image. ' + 'Required: ' + bytesNeeded);
  37798. } else {
  37799. throw err;
  37800. }
  37801. }
  37802. decoder.copyToImageData(image, opts.formatAsRGBA);
  37803. return image;
  37804. }
  37805. var JPEGEncoder = {
  37806. encode: encode$4,
  37807. decode: decode$6
  37808. };
  37809. function n$3(e, t, i) {
  37810. e && (e = e.toLowerCase().trim());
  37811. var n = new I.UP.clone(),
  37812. r = Math.PI / 3,
  37813. o = Math.PI / 2;
  37814. switch (e) {
  37815. case 'left':
  37816. i.copy(t), i.applyAxisAngle(n, o);
  37817. break;
  37818. case 'right':
  37819. i.copy(t), i.applyAxisAngle(n, -o);
  37820. break;
  37821. case 'forwardleft':
  37822. i.copy(t), i.applyAxisAngle(n, r);
  37823. break;
  37824. case 'forwardright':
  37825. i.copy(t), i.applyAxisAngle(n, -r);
  37826. break;
  37827. case 'forward':
  37828. default:
  37829. i.copy(t);
  37830. }
  37831. return i;
  37832. }
  37833. function r$2(e, t) {
  37834. if (e) {
  37835. var i = {
  37836. pano: e,
  37837. lookAtPoint: null,
  37838. duration: null,
  37839. maxDistanceOverride: null,
  37840. skipWarpingCheck: !1
  37841. };
  37842. this.player.flyToPano(i, function () {
  37843. t && t({
  37844. success: !0,
  37845. message: 'Transition complete.'
  37846. });
  37847. });
  37848. } else R.warn('Showcase -> clickPanoObject: Unable to find pano.'), t && t({
  37849. success: !1,
  37850. error: 'Unable to find pano.'
  37851. });
  37852. }
  37853. function o$1(e, t) {
  37854. var i = this.findRankedPano(e, t);
  37855. return i >= 0 ? this.handleToObject[i] : (R.warn('Showcase -> findRankedPanoObject: Unable to find nearby pano.'), null);
  37856. }
  37857. function a$2(e, t) {
  37858. var i = this.findRankedtag(e, t);
  37859. return i >= 0 ? this.handleToObject[i] : (R.warn('Showcase -> findRankedtagObject: Unable to find nearby tag.'), null);
  37860. }
  37861. function s$2(e, t) {
  37862. t.copy(I.FORWARD), e.getDirection(t);
  37863. }
  37864. var myObjects = {
  37865. director: null,
  37866. player: null,
  37867. controls: null,
  37868. sceneRenderer: null,
  37869. model: null,
  37870. //app中会调用
  37871. init: function init(director, controls, player, sceneRenderer) {
  37872. this.director = director;
  37873. this.player = player;
  37874. this.controls = controls;
  37875. this.sceneRenderer = sceneRenderer;
  37876. },
  37877. handleToObject: {},
  37878. objectToHandle: {},
  37879. handleCount: 0,
  37880. onMessageReceive: function onMessageReceive(e) {
  37881. if (e) {
  37882. var t = e.targetFunction,
  37883. i = e.params,
  37884. n = e.onDone;
  37885. t && this[t] && this[t](i, n);
  37886. }
  37887. },
  37888. waitForInit: function waitForInit(e, t) {
  37889. F.then(t.bind({
  37890. success: !0,
  37891. message: 'Init complete.'
  37892. }));
  37893. },
  37894. moveToPano: function (e, t) {
  37895. var i = new THREE.Euler(0, 0, 0, 'YXZ'),
  37896. n = new THREE.Quaternion();
  37897. return function (e, t) {
  37898. var r = e.pano,
  37899. o = e.rotation,
  37900. a = e.transition;
  37901. if (!this.model) return t({
  37902. success: !1,
  37903. error: 'The model has not been loaded yet'
  37904. });
  37905. var s = this.model.panos.get(r);
  37906. if (!s) return t({
  37907. success: !1,
  37908. error: r + ' does not exist in this model'
  37909. });
  37910. if (!o) return t({
  37911. sucess: !1,
  37912. erorr: o + ' is not a valid rotation'
  37913. });
  37914. i.set(c.Math.degToRad(o.x || 0), c.Math.degToRad(o.y || 0), c.Math.degToRad(o.z || 0), 'YXZ'), logger$1.info(o.z);
  37915. var l = {
  37916. success: !0,
  37917. message: r
  37918. };
  37919. if (a === A.FADEOUT) n.setFromEuler(i), this.player.warpToPano(s, n, null, null, b.BLACK, null, null, t.bind(this, l));else {
  37920. var h, u;
  37921. a === A.INSTANT && (h = 0, u = 0);
  37922. var d = I.FORWARD.clone().applyEuler(i).add(s.position);
  37923. this.player.flyToPano({
  37924. pano: s,
  37925. lookAtPoint: d,
  37926. duration: h,
  37927. aimDuration: u
  37928. }, t.bind(this, l));
  37929. }
  37930. };
  37931. }(),
  37932. moveInDirection: function moveInDirection(e, t) {
  37933. var i = e.direction;
  37934. return 'undefined' == typeof v[i] ? (R.warn('Showcase -> moveInDirection: Cannot move in invalid direction.'), void (t && t({
  37935. success: !1,
  37936. error: 'Invalid direction.'
  37937. }))) : void this.player.flyLocalDirection(I[i].clone()).then(function (e) {
  37938. t(e ? {
  37939. success: !0,
  37940. message: 'moved ' + i
  37941. } : {
  37942. success: !1,
  37943. error: 'Cannot move in direction: ' + i
  37944. });
  37945. });
  37946. },
  37947. getPose: function getPose(e, t) {
  37948. this.player.camera.position, new THREE.Euler().setFromQuaternion(this.player.camera.quaternion, 'YXZ');
  37949. return t({
  37950. success: !0,
  37951. message: B(this.player)
  37952. });
  37953. },
  37954. //截图,我们有用到
  37955. takeScreenShot: function () {
  37956. var camera = new THREE.PerspectiveCamera(),
  37957. webGLRenderTarget = new THREE.WebGLRenderTarget(); //图片分辨率,图片质量,回调函数
  37958. return function (imgInfo, callFunc) {
  37959. if (!imgInfo.resolution) return callFunc({
  37960. success: !1,
  37961. error: 'An invalid resolution was specified'
  37962. });
  37963. if (imgInfo.resolution.width === -1 || imgInfo.resolution.height === -1) {
  37964. var size = this.sceneRenderer.renderer.getSize();
  37965. imgInfo.resolution.width = size.width;
  37966. imgInfo.resolution.height = size.height;
  37967. }
  37968. camera.layers.set(RenderLayers.DEFAULT);
  37969. if (imgInfo.visibleObjects) {
  37970. imgInfo.visibleObjects.showPucks && camera.layers.enable(RenderLayers.PANOMARKERS);
  37971. imgInfo.visibleObjects.showReticule && camera.layers.enable(RenderLayers.RETICULE);
  37972. }
  37973. var width = imgInfo.resolution.width,
  37974. height = imgInfo.resolution.height,
  37975. aspect = width / height;
  37976. camera.position.copy(this.sceneRenderer.camera.position), camera.quaternion.copy(this.sceneRenderer.camera.quaternion), camera.projectionMatrix.copy(this.player.camera.projectionMatrix), camera.projectionMatrix.elements[0] = this.player.camera.projectionMatrix.elements[5] / aspect, camera.projectionMatrix.elements[5] = -camera.projectionMatrix.elements[5], //许钟文加 为了不flipY 但是只有side=2双面时有效否则是黑色的
  37977. webGLRenderTarget.setSize(width, height), this.sceneRenderer.renderer.setRenderTarget(webGLRenderTarget);
  37978. if (imgInfo.bgOpacity != void 0) {
  37979. imgInfo.bgOpacityOld = this.sceneRenderer.renderer.getClearAlpha();
  37980. this.sceneRenderer.setBg(null, imgInfo.bgOpacity);
  37981. }
  37982. var alpha = this.sceneRenderer.renderer.getClearAlpha();
  37983. this.sceneRenderer.renderer.render(this.sceneRenderer.scene, camera);
  37984. this.sceneRenderer.renderer.setRenderTarget(null);
  37985. if (imgInfo.bgOpacity != void 0) {
  37986. this.sceneRenderer.setBg(null, imgInfo.bgOpacityOld);
  37987. } //var pixelBuffer = new Uint8Array(width * height * 4)
  37988. //this.sceneRenderer.renderer.readRenderTargetPixels(webGLRenderTarget, 0, 0, width, height, pixelBuffer)
  37989. // var c = JPEGEncoder.encode({
  37990. // data: pixelBuffer,
  37991. // width: width,
  37992. // height: height,
  37993. // heading: 180,
  37994. // pitch: 0
  37995. // }, {
  37996. // quality: imgInfo.quality || 75,
  37997. // flipY: !1 //许钟文改 原本是true. 不在这里翻转,因为它翻转后会使顶部像素重复高10像素,底部少了10像素。
  37998. // })
  37999. // , imgBase64Url = "data:image/jpg;base64," + common.uint8ToBase64(c.data);
  38000. //https://github.com/eugeneware/jpeg-js/blob/master/lib/encoder.js
  38001. if (alpha < 1) {
  38002. var imgBase64Url = common.renderTargetToDataUrl(webGLRenderTarget, webGLRenderTarget.width, webGLRenderTarget.height, this.sceneRenderer.renderer, imgInfo.quality, true);
  38003. } else {
  38004. var pixelBuffer = new Uint8Array(width * height * 4);
  38005. this.sceneRenderer.renderer.readRenderTargetPixels(webGLRenderTarget, 0, 0, width, height, pixelBuffer);
  38006. var rawImageData = JPEGEncoder.encode( //无法透明
  38007. {
  38008. data: pixelBuffer,
  38009. width: width,
  38010. height: height,
  38011. heading: 180,
  38012. pitch: 0
  38013. }, imgInfo.quality);
  38014. var imgBase64Url = 'data:image/png;base64,' + common.uint8ToBase64(rawImageData.data);
  38015. }
  38016. callFunc({
  38017. success: !0,
  38018. message: imgBase64Url,
  38019. camera: camera
  38020. });
  38021. };
  38022. }(),
  38023. findRankedPano: function (e, t) {
  38024. var i = new THREE.Vector3(),
  38025. r = new THREE.Vector3();
  38026. return function (e, t) {
  38027. s$2(this.player, r), n$3(t, r, i);
  38028. var o = this.player.rankedPanoInDirection(e, i);
  38029. if (o) {
  38030. var a = this.objectToHandle[o.id];
  38031. return a || (this.objectToHandle[o.id] = a = this.handleCount++, this.handleToObject[a] = o), a;
  38032. }
  38033. return R.warn('Showcase -> findRankedPano: Unable to find nearby pano.'), -1;
  38034. };
  38035. }(),
  38036. findRankedtag: function (e, t) {
  38037. var i = new THREE.Vector3(),
  38038. r = new THREE.Vector3();
  38039. return function (e, t) {
  38040. s$2(this.player, r), n$3(t, r, i);
  38041. var o = this.player.rankedtagInDirection(e, i);
  38042. if (o) {
  38043. var a = this.objectToHandle[o.sid];
  38044. return a || (this.objectToHandle[o.sid] = a = this.handleCount++, this.handleToObject[a] = o), a;
  38045. }
  38046. return R.warn('Showcase -> findRankedtag: Unable to find nearby tag.'), -1;
  38047. };
  38048. }(),
  38049. clickNearesttag: function clickNearesttag(e) {
  38050. this.clickRankedtag(0, e);
  38051. },
  38052. clickRankedtag: function clickRankedtag(e, t) {
  38053. var i = a$2.call(this, e, t);
  38054. i && O.call(this, i);
  38055. },
  38056. clickNearestPano: function clickNearestPano(e, t) {
  38057. this.clickRankedPano(0, e, t);
  38058. },
  38059. clickRankedPano: function clickRankedPano(e, t, i) {
  38060. var n = o$1.call(this, e, t);
  38061. n ? r$2.call(this, n, i) : i(null);
  38062. },
  38063. clickPano: function clickPano(e, t) {
  38064. var i = this.handleTable[e];
  38065. i ? r$2.call(this, i, t) : t(null);
  38066. },
  38067. rotateDirection: function () {
  38068. return function (e, t) {
  38069. var i = e.direction,
  38070. n = e.angle;
  38071. if (!P.active) {
  38072. var r = 0,
  38073. o = 0,
  38074. a = 0,
  38075. s = 0;
  38076. if (!n || isNaN(n)) return R.warn('Showcase -> rotateDirection: Invalid rotation angle.'), void (t && t({
  38077. success: !1,
  38078. error: 'Invalid rotation angle.'
  38079. }));
  38080. if (this.player.mode === E.TRANSITIONING) return R.warn('Automation -> rotateDirection: Cannot rotate while transitioning'), void (t && t({
  38081. success: !1,
  38082. error: 'Cannot rotate while transitioning'
  38083. }));
  38084. if (i === v.RIGHT || i === v.LEFT) i === v.RIGHT && (n = -n), r = n > 0 ? -1 : 1, a = n;else {
  38085. if (i !== v.UP && i !== v.DOWN) return R.warn('Showcase -> rotateDirection: Invalid direction for rotation: ' + i), void (t && t({
  38086. success: !1,
  38087. error: 'Invalid direction for rotation.'
  38088. }));
  38089. if (this.player.mode === E.FLOORPLAN) return R.warn('Showcase -> rotateDirection: Cannot rotate ' + i + ' in floorplan mode'), void (t && t({
  38090. success: !1,
  38091. error: 'Cannot rotate ' + i + ' in floorplan mode'
  38092. }));
  38093. if (i === v.DOWN && (n = -n), n = N.call(this, n), 0 === n) return R.warn('Showcase -> rotateDirection: Already at maximum rotation in direction: ' + i), void (t && t({
  38094. success: !1,
  38095. error: 'Already at maximum rotation in direction: ' + i
  38096. }));
  38097. o = n > 0 ? 1 : -1, s = n;
  38098. }
  38099. var l = n;
  38100. n = c.Math.degToRad(n), a = c.Math.degToRad(a), s = c.Math.degToRad(s);
  38101. var h = this.controls.activeControl,
  38102. u = function u() {
  38103. h.stopRotating(!0), t && t({
  38104. success: !0,
  38105. message: 'Rotated ' + l.toFixed(2) + '° in direction: ' + e.direction
  38106. });
  38107. };
  38108. h.startRotating(r, o), P.start(a, s, this.player, u);
  38109. }
  38110. };
  38111. }(),
  38112. rotate: function () {
  38113. var e = new THREE.Vector3(),
  38114. t = new THREE.Vector3();
  38115. return function (i, n) {
  38116. var r = i.xAngle,
  38117. o = i.yAngle;
  38118. if (!P.active) {
  38119. if (r = r || 0, o = o || 0, isNaN(r) || isNaN(o)) return R.warn('Showcase -> rotate: Invalid rotation angle.'), void (n && n({
  38120. success: !1,
  38121. error: 'Invalid rotation angle.'
  38122. }));
  38123. if (this.player.mode === E.TRANSITIONING) return R.warn('Automation -> rotate: Cannot rotate while transitioning'), void (n && n({
  38124. success: !1,
  38125. error: 'Cannot rotate while transitioning'
  38126. }));
  38127. Math.abs(r) < 0.01 && (r = 0), Math.abs(o) < 0.01 && (o = 0);
  38128. var a = o;
  38129. o = N.call(this, o), r = -r;
  38130. var s = a > 0 ? 'UP' : 'DOWN';
  38131. if (!r && a && !o) return R.warn('Showcase -> rotate: Already at maximum rotation in direction: ' + s), void (n && n({
  38132. success: !1,
  38133. error: 'Already at maximum rotation in direction: ' + s
  38134. }));
  38135. a > o && R.warn('Showcase -> rotate: Reached maximum rotation in direction: ' + s);
  38136. var l = o;
  38137. o = c.Math.degToRad(o), r = c.Math.degToRad(r), e.copy(this.player.mode === E.FLOORPLAN ? I.UP : I.FORWARD), this.player.getDirection(e), t.copy(e).applyAxisAngle(I.UP, r), t.applyAxisAngle(I.RIGHT, o);
  38138. var h = (e.angleTo(t), r > 0 ? -1 : r < 0 ? 1 : 0),
  38139. u = o > 0 ? 1 : o < 0 ? -1 : 0;
  38140. Math.abs(r) > Math.abs(o) ? u *= Math.abs(o / r) : Math.abs(o) > Math.abs(r) && (h *= Math.abs(r / o));
  38141. var d = this.controls.activeControl,
  38142. p = function p() {
  38143. d.stopRotating(!0), n && n({
  38144. success: !0,
  38145. message: 'Rotated ' + i.xAngle.toFixed(2) + '° horizontally, ' + l.toFixed(2) + '° vertically'
  38146. });
  38147. };
  38148. d.startRotating(h, u), P.start(r, o, this.player, p);
  38149. }
  38150. };
  38151. }(),
  38152. panCamera: function panCamera(e, t) {
  38153. function i(e) {
  38154. switch (r.removeAllListeners(T.AutoPanComplete), r.removeAllListeners(T.AutoPanInterrupt), r.removeAllListeners(T.AutoPanClamped), e) {
  38155. case T.AutoPanInterrupt:
  38156. t({
  38157. success: !0,
  38158. message: 'Camera panning interrupted.'
  38159. });
  38160. break;
  38161. case T.AutoPanClamped:
  38162. if (r.autoPanPosition.x !== n.x || r.autoPanPosition.z !== n.z) {
  38163. if (Math.abs(this.player.position.x - r.autoPanPosition.x) < 0.01 && Math.abs(this.player.position.z - r.autoPanPosition.z) < 0.01) return void t({
  38164. success: !1,
  38165. error: 'Already at edge of current model bounds.'
  38166. });
  38167. var i = 'The view point is outside the bounds for the current model. ';
  38168. i += 'The view point was clamped to ' + o(r.target.x, r.target.z), console.warn(i);
  38169. }
  38170. case T.AutoPanComplete:
  38171. t({
  38172. success: !0,
  38173. message: 'Panned camera to position ' + o(r.autoPanPosition.x, r.autoPanPosition.z)
  38174. });
  38175. }
  38176. }
  38177. if (this.player.mode !== E.DOLLHOUSE && this.player.mode !== E.FLOORPLAN) return t({
  38178. success: !1,
  38179. error: 'Camera panning is not available in the current mode: ' + this.player.mode
  38180. });
  38181. var n = e.position,
  38182. r = this.player.control;
  38183. r.setAutoPanPosition(n.x, n.z), r.autoPan = !0;
  38184. var o = function o(e, t) {
  38185. return '(' + e.toFixed(2) + ', ' + t.toFixed(2) + ')';
  38186. };
  38187. r.on(T.AutoPanComplete, i.bind(this, T.AutoPanComplete)), r.on(T.AutoPanInterrupt, i.bind(this, T.AutoPanInterrupt)), r.on(T.AutoPanClamped, i.bind(this, T.AutoPanClamped));
  38188. },
  38189. click: function click(e, t) {
  38190. var i = e.x,
  38191. n = e.y,
  38192. r = e.percentage;
  38193. r === !0 && (i = i / 100 * $('#player').width(), n = n / 100 * $('#player').height()), this.player.handleInputStart(i, n), this.player.updateIntersect(), this.player.handleInputEnd(i, n);
  38194. },
  38195. mouseOver: function mouseOver(e, t) {
  38196. var i = e.x,
  38197. n = e.y,
  38198. r = e.percentage;
  38199. r === !0 && (i = i / 100 * $('#player').width(), n = n / 100 * $('#player').height()), this.player.handleInputMove(i, n), this.player.updateIntersect();
  38200. },
  38201. moveToMode: function moveToMode(e, t) {
  38202. function i(e) {
  38203. t(e ? {
  38204. success: !1,
  38205. error: 'Failed to load new mode: ' + e
  38206. } : {
  38207. success: !0,
  38208. message: 'Moved to new mode: ' + n
  38209. });
  38210. }
  38211. var n = e.mode;
  38212. n === E.PANORAMA || n === E.DOLLHOUSE || n === E.FLOORPLAN ? this.director.changeMode(n).then(function () {
  38213. i();
  38214. }, function (e) {
  38215. i(e);
  38216. }) : t({
  38217. success: !1,
  38218. error: 'Invalid mode selection'
  38219. });
  38220. }
  38221. };
  38222. var automation = {
  38223. init: function init(e, t, i, n, r) {
  38224. myObjects.init(e, t, i, r);
  38225. },
  38226. //许钟文加:
  38227. takeScreenShot: function takeScreenShot(o, f) {
  38228. myObjects.takeScreenShot(o, f);
  38229. }
  38230. };
  38231. defineComponent('Screenshot', function () {
  38232. var _execute, _recover, _toFish, _unFish;
  38233. return _execute = /*#__PURE__*/_classPrivateFieldKey("execute"), _recover = /*#__PURE__*/_classPrivateFieldKey("recover"), _toFish = /*#__PURE__*/_classPrivateFieldKey("toFish"), _unFish = /*#__PURE__*/_classPrivateFieldKey("unFish"), /*#__PURE__*/function () {
  38234. function Screenshot() {
  38235. _classCallCheck(this, Screenshot);
  38236. Object.defineProperty(this, _execute, {
  38237. value: _execute2
  38238. });
  38239. Object.defineProperty(this, _recover, {
  38240. writable: true,
  38241. value: function value(changeBefore) {
  38242. this.player.reticule.visible = true;
  38243. this.player.model.floorLogos.firstLogo.visible = changeBefore.fL0;
  38244. this.player.model.floorLogos.secondLogo.visible = changeBefore.fL1;
  38245. this.player.path.currentPanoMarker.mesh.visible = true;
  38246. this.player.model.panos.list.forEach(function (pano) {
  38247. pano.isAligned() && (pano.marker.visible = pano.marker.forceHide);
  38248. });
  38249. this.$app.core.get('CameraControls').controls.floorplan.snapshotTopAspect = null;
  38250. if (this.player.mode != Viewmode$1.PANORAMA) {
  38251. if (ModelSide.side === null) {
  38252. //兼容ModelSide
  38253. this.player.model.chunks.forEach(function (chunk) {
  38254. chunk.material.side = THREE.FrontSide;
  38255. });
  38256. }
  38257. var skyboxBG = this.$app.core.get('SceneRenderer').scene.skyboxBG;
  38258. skyboxBG && (skyboxBG.material.side = THREE.BackSide);
  38259. }
  38260. this.player.model.skybox.material.side = THREE.BackSide;
  38261. this.player.OverlayManager.show('all', true);
  38262. this.player.GLTFEditor.show('all', true);
  38263. changeBefore.notHideMonitors || this.player.$app.Camera.monitor.control.showAll();
  38264. }
  38265. });
  38266. Object.defineProperty(this, _toFish, {
  38267. writable: true,
  38268. value: function value(changeBefore) {
  38269. if (!this.player.model.fishSkybox) {
  38270. this.player.model.fishSkybox = new THREE.Mesh(new THREE.SphereGeometry(constants$4.skyRadius, 80, 50), this.player.model.skybox.material);
  38271. this.core.get('SceneRenderer').scene.add(this.player.model.fishSkybox);
  38272. }
  38273. this.player.model.fishSkybox.position.copy(this.player.position);
  38274. this.player.model.fishSkybox.visible = true;
  38275. this.player.model.skybox.visible = false;
  38276. for (var i = 0; i < this.player.model.chunks.length; i++) {
  38277. //场景过小的话可能比fishSkybox还小所以隐藏
  38278. this.player.model.chunks[i].visible = false;
  38279. }
  38280. changeBefore.cameraPosOld = this.player.camera.position.clone();
  38281. this.player.cameraControls.activeControl.fishState = true; //切换到鱼眼镜头
  38282. this.player.cameraControls.activeControl.camera.fov = settings$3.fish.insideFOV;
  38283. this.player.cameraControls.activeControl.target.copy(this.player.position);
  38284. this.player.updateFromControls();
  38285. }
  38286. });
  38287. Object.defineProperty(this, _unFish, {
  38288. writable: true,
  38289. value: function value(changeBefore) {
  38290. if (this.player.mode == Viewmode$1.PANORAMA) {
  38291. this.player.cameraControls.activeControl.camera.position.copy(changeBefore.cameraPosOld);
  38292. this.player.cameraControls.activeControl.fishState = false; //this.player.cameraControls.activeControl.update(0);
  38293. this.player.model.fishSkybox.visible = false;
  38294. this.player.model.skybox.visible = true;
  38295. for (var i = 0; i < this.player.model.chunks.length; i++) {
  38296. this.player.model.chunks[i].visible = true;
  38297. }
  38298. this.player.cameraControls.activeControl.camera.fov = settings$3.insideFOV;
  38299. }
  38300. this.player.updateFromControls();
  38301. }
  38302. });
  38303. }
  38304. _createClass(Screenshot, [{
  38305. key: "capture",
  38306. value: function capture(options) {
  38307. this.player = this.$app.core.get('Player');
  38308. if (this.player.flying || this.player.isWarping() || this.player.mode == Viewmode$1.TRANSITIONING) {
  38309. logger$1.warn('you take a screenshot on flying or transitioning mode!!');
  38310. } //之前这么写,改变了当前canvas大小截图:R.updateScreenSize(options);
  38311. var _this$player$getSize = this.player.getSize(),
  38312. clientWidth = _this$player$getSize.clientWidth,
  38313. clientHeight = _this$player$getSize.clientHeight;
  38314. var fL0 = this.player.model.floorLogos.firstLogo.visible;
  38315. var fL1 = this.player.model.floorLogos.secondLogo.visible;
  38316. this.player.model.panos.list.forEach(function (pano) {
  38317. pano.isAligned() && (pano.marker.forceHide = pano.marker.visible, pano.marker.visible = false);
  38318. });
  38319. this.player.reticule.visible = false;
  38320. this.player.model.floorLogos.firstLogo.visible = false;
  38321. this.player.model.floorLogos.secondLogo.visible = false;
  38322. this.player.path.currentPanoMarker.mesh.visible = false; //因为修改了截图时的projection中y的正负,如果side不反向,会黑(可能因为渲染到了背面?)。
  38323. if (this.player.mode != Viewmode$1.PANORAMA) {
  38324. if (ModelSide.side === null) {
  38325. //兼容ModelSide
  38326. this.player.model.chunks.forEach(function (chunk) {
  38327. chunk.material.side = THREE.BackSide;
  38328. });
  38329. } //this.$app.core.get('SceneRenderer').scene.skyboxBG.material.side = THREE.FrontSide
  38330. }
  38331. this.player.model.skybox.material.side = THREE.DoubleSide;
  38332. this.player.OverlayManager.hide('all');
  38333. this.player.GLTFEditor.hide('all');
  38334. options.notHideMonitors || this.player.$app.Camera.monitor.control.hideAll();
  38335. if (options.snapshotTopview && this.player.mode == Viewmode$1.FLOORPLAN) {
  38336. this.$app.core.get('CameraControls').controls.floorplan.snapshotTopAspect = clientWidth / clientHeight;
  38337. }
  38338. options.changeBefore = Object.assign({}, options, {
  38339. fL0,
  38340. fL1
  38341. }); // fL0, fL1, notHideTags: options.notHideTags, notHideMonitors: options.notHideMonitors,
  38342. _classPrivateFieldBase(this, _execute)[_execute](options);
  38343. }
  38344. /**
  38345. * 按顺序在当前视角一个个截图
  38346. * @param {*} options
  38347. * @param {*} lastState
  38348. */
  38349. }]);
  38350. return Screenshot;
  38351. }();
  38352. function _execute2(options, lastState) {
  38353. var _this = this;
  38354. var task, state;
  38355. if (options.tasks.unFish && options.tasks.unFish.length) {
  38356. task = options.tasks.unFish.splice(0, 1)[0];
  38357. state = 'unFish';
  38358. } else if (options.tasks.fish && options.tasks.fish.length) {
  38359. task = options.tasks.fish.splice(0, 1)[0];
  38360. state = 'fish';
  38361. } else {
  38362. state = 'finish';
  38363. } //turn state:
  38364. if (lastState == 'unFish' && state == 'fish') {
  38365. //变成鱼眼
  38366. _classPrivateFieldBase(this, _toFish)[_toFish](options.changeBefore);
  38367. } else if (lastState == 'fish' && state == 'finish') {
  38368. //结束鱼眼
  38369. _classPrivateFieldBase(this, _unFish)[_unFish](options.changeBefore);
  38370. _classPrivateFieldBase(this, _recover)[_recover](options.changeBefore);
  38371. } else if (state == 'finish') {
  38372. _classPrivateFieldBase(this, _recover)[_recover](options.changeBefore);
  38373. } else {
  38374. logger$1.info('other state:' + lastState + '|' + state);
  38375. }
  38376. if (state != 'finish') automation.takeScreenShot({
  38377. resolution: {
  38378. width: task.width,
  38379. height: task.height
  38380. },
  38381. bgOpacity: task.bgOpacity,
  38382. quality: options.quality || (settings$3.isSafari ? 50 : 65)
  38383. }, function (d) {
  38384. options.done && options.done(d.message, task.name, d);
  38385. _classPrivateFieldBase(_this, _execute)[_execute](options, state);
  38386. });
  38387. }
  38388. });
  38389. var PathDisplayMode = Object.freeze({
  38390. Show: 0,
  38391. Hide: 1,
  38392. Retain: 2
  38393. });
  38394. var PathDiscardMode = Object.freeze({
  38395. Standard: 0,
  38396. Slow: 1,
  38397. Retain: 2
  38398. });
  38399. function _createSuper$K(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$K(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  38400. function _isNativeReflectConstruct$K() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  38401. defineComponent('Director', function () {
  38402. return /*#__PURE__*/function (_EventEmitter) {
  38403. _inherits(Director, _EventEmitter);
  38404. var _super = _createSuper$K(Director);
  38405. function Director() {
  38406. var _this;
  38407. _classCallCheck(this, Director);
  38408. _this = _super.call(this);
  38409. _this.endlessLoop = settings$3.warp.loop;
  38410. _this.clock = new THREE.Clock(true);
  38411. _this.currentItem = null;
  38412. _this.destinationItem = null;
  38413. _this.tourIsPlaying = false;
  38414. _this.nextFunc = null;
  38415. _this.onTheBus = false;
  38416. _this.reachSource = null;
  38417. _this.interrupted = false;
  38418. _this.nItems = 0;
  38419. _this.currentScript = 0;
  38420. _this.walkingSectionPaused = false;
  38421. _this.C = Object.freeze({
  38422. None: 0,
  38423. Moving: 1,
  38424. Aiming: 2,
  38425. Interlude: 3
  38426. });
  38427. _this.I = Object.freeze({
  38428. Forward: 1,
  38429. NoChange: 0,
  38430. Backwards: -1
  38431. });
  38432. _this.transitionStage = _this.C.None;
  38433. _this.player = _this.$app.core.get('Player');
  38434. return _this;
  38435. }
  38436. _createClass(Director, [{
  38437. key: "init",
  38438. value: function init() {
  38439. this.updateModel();
  38440. this.resetAll();
  38441. this.bindEvents();
  38442. }
  38443. }, {
  38444. key: "resetAll",
  38445. value: function resetAll() {
  38446. this.currentItem = null;
  38447. this.destinationItem = null;
  38448. this.tourIsPlaying = false;
  38449. this.transitionStage = this.C.None;
  38450. this.nextFunc = null;
  38451. this.onTheBus = false;
  38452. this.reachSource = null;
  38453. this.interrupted = false;
  38454. if (this.player.model) {
  38455. switch (this.player.model.switch_scene_type) {
  38456. case 1:
  38457. this.defaultWarpStyle = WarpStyle.BLACK;
  38458. break;
  38459. case 2:
  38460. this.defaultWarpStyle = WarpStyle.WALK;
  38461. break;
  38462. case 3:
  38463. this.defaultWarpStyle = WarpStyle.STD;
  38464. break;
  38465. default:
  38466. this.defaultWarpStyle = WarpStyle.BLACK;
  38467. break;
  38468. }
  38469. } else {
  38470. this.defaultWarpStyle = WarpStyle.BLACK, logger$1.warn('No model yet, choosing "' + this.defaultWarpStyle + '" transitions');
  38471. }
  38472. this.resetSpecialTransition();
  38473. }
  38474. }, {
  38475. key: "updateModel",
  38476. value: function updateModel() {
  38477. this.player.model = this.modelManager.getActiveModel();
  38478. this.nItems = 0;
  38479. }
  38480. }, {
  38481. key: "bindEvents",
  38482. value: function bindEvents() {
  38483. this.modelManager.on(ModelManagerEvents.ActiveModelChanged, this.updateModel.bind(this)), this.player.on(PlayerEvents.WarpInterruptedWithFlyTo, this.handleFlyToWarpInterruption.bind(this)), this.player.on(PlayerEvents.Move, this.handlePlayerMove.bind(this)), this.player.on(PlayerEvents.PanoChosen, this.handlePlayerPanoChosen.bind(this)), this.player.on(PlayerEvents.ModeChanged, this.handlePlayerModeChanged.bind(this)), this.player.on(PlayerEvents.InputStart, this.handlePlayerInputStart.bind(this)), this.player.on(PlayerEvents.FlyingStarted, this.handlePlayerFlyingStarted.bind(this));
  38484. }
  38485. }, {
  38486. key: "handleFlyToWarpInterruption",
  38487. value: function handleFlyToWarpInterruption(warpStyle, func) {
  38488. if (warpStyle === WarpStyle.WALK) {
  38489. this.interrupt(BlackoutStyle.NONE), this.pauseWalkingSection(), this.player.fastForwardActivePanoFlight();
  38490. } else if (this.transitionStage === this.C.Interlude) {
  38491. this.interrupt(BlackoutStyle.NONE);
  38492. func && func();
  38493. }
  38494. }
  38495. }, {
  38496. key: "handlePlayerMove",
  38497. value: function handlePlayerMove(t) {
  38498. this.transitionStage === this.C.Interlude && this.interrupt(BlackoutStyle.NONE);
  38499. }
  38500. }, {
  38501. key: "handlePlayerPanoChosen",
  38502. value: function handlePlayerPanoChosen(e, t) {
  38503. this.intermediateState() || e.id === t.id || (this.onTheBus = !1, this.emit('update.controls'));
  38504. }
  38505. }, {
  38506. key: "handlePlayerModeChanged",
  38507. value: function handlePlayerModeChanged(e, t) {
  38508. this.intermediateState() || e === t || (this.onTheBus = !1, this.emit('update.controls'));
  38509. }
  38510. }, {
  38511. key: "handlePlayerInputStart",
  38512. value: function handlePlayerInputStart(e) {
  38513. this.transitionStage === this.C.Interlude && this.interrupt(BlackoutStyle.NONE);
  38514. }
  38515. }, {
  38516. key: "handlePlayerFlyingStarted",
  38517. value: function handlePlayerFlyingStarted() {
  38518. this.clearWalkingSectionPaused();
  38519. }
  38520. }, {
  38521. key: "describe",
  38522. value: function describe() {
  38523. return {
  38524. nItems: this.nItems,
  38525. currentItem: this.currentItem,
  38526. destinationItem: this.destinationItem,
  38527. tourIsPlaying: this.tourIsPlaying,
  38528. onTheBus: this.onTheBus,
  38529. endlessLoop: this.endlessLoop,
  38530. viewMode: this.player.mode,
  38531. inTransition: this._inTransition(),
  38532. transitionStage: this.transitionStage,
  38533. tourInProgress: this.tourInProgress
  38534. };
  38535. }
  38536. }, {
  38537. key: "_inTransition",
  38538. value: function _inTransition() {
  38539. return this.player.flying || this.player.isWarping() || this.player.isWaitingToWarp() || this.player.mode === Viewmode.TRANSITIONING || this.tourIsPlaying;
  38540. }
  38541. }, {
  38542. key: "bounceable",
  38543. value: function bounceable() {
  38544. var e = this.clock.getDelta();
  38545. return this.isInterrupted() || e < 0.9 && e > 0.01 || this.player.flying && !this.player.isWarping();
  38546. }
  38547. }, {
  38548. key: "currentMoveDirection",
  38549. value: function currentMoveDirection() {
  38550. return null === this.currentItem || void 0 === this.currentItem ? this.I.Forward : this.destinationItem === this.currentItem ? this.I.NoChange : this.destinationItem > this.currentItem ? this.I.Forward : I.Backwards;
  38551. }
  38552. }, {
  38553. key: "clearPath",
  38554. value: function clearPath() {
  38555. this._inTransition() || this.player.path.discardPathObject();
  38556. }
  38557. }, {
  38558. key: "allFloors",
  38559. value: function allFloors() {
  38560. /* var t = this.player.controls[this.player.mode];
  38561. t && t.emit("move", "gui"),
  38562. this.player.controls[ViewMode.PANORAMA].emit(ControlEvents.InteractionGui, "floor-control"),*/
  38563. this.player.model.toggleAllFloors();
  38564. }
  38565. }, {
  38566. key: "actionComplete",
  38567. value: function actionComplete(t) {
  38568. var state = this.transitionStage;
  38569. this.interrupted = false, this.transitionStage = this.C.None, this.resetSpecialTransition(), null !== this.destinationItem && this.setCurrentItem(this.destinationItem), this.tourIsPlaying || this.player.mode === Viewmode$1.PANORAMA && this.player.currentPano.isAligned() && this.player.model.fadePanoMarkers(), this.emit('update.controls');
  38570. if (this.currentScript && (this.player.model.enableTagMovie && state === this.C.Interlude || this.player.model.enableTagMovie && state === this.C.Aiming && this.nextFunc === null)) {
  38571. this.openTag();
  38572. } else {
  38573. if (this.nextFunc) {
  38574. var e = this.nextFunc;
  38575. this.nextFunc = null;
  38576. e();
  38577. }
  38578. }
  38579. }
  38580. }, {
  38581. key: "awaitCompletion",
  38582. value: function awaitCompletion(e, t) {
  38583. this.nextFunc = t;
  38584. e();
  38585. }
  38586. }, {
  38587. key: "updateSuccessFunction",
  38588. value: function updateSuccessFunction(e) {
  38589. this.nextFunc = e;
  38590. }
  38591. }, {
  38592. key: "interrupt",
  38593. value: function interrupt(e, t) {
  38594. if (!this.wouldInterrupt()) {
  38595. return false;
  38596. }
  38597. this.tourIsPlaying && (this.player.zoomEnabled = this.wasZoomEnabled);
  38598. this.tourIsPlaying = !1;
  38599. this.interrupted = !0;
  38600. this.nextFunc = null;
  38601. this.emit(DirectorEvents.ActionInterrupted);
  38602. null !== e && void 0 !== e || (e = BlackoutStyle.BEGINNING);
  38603. this.player.interruptAndFastForward(e, t);
  38604. return true;
  38605. }
  38606. }, {
  38607. key: "wouldInterrupt",
  38608. value: function wouldInterrupt() {
  38609. return this.transitionStage !== this.C.None;
  38610. }
  38611. }, {
  38612. key: "intermediateState",
  38613. value: function intermediateState() {
  38614. return this.transitionStage !== this.C.None;
  38615. }
  38616. }, {
  38617. key: "isInterrupted",
  38618. value: function isInterrupted() {
  38619. return this.interrupted;
  38620. }
  38621. }, {
  38622. key: "pauseWalkingSection",
  38623. value: function pauseWalkingSection() {
  38624. this.walkingSectionPaused = !0;
  38625. }
  38626. }, {
  38627. key: "clearWalkingSectionPaused",
  38628. value: function clearWalkingSectionPaused() {
  38629. this.walkingSectionPaused = !1;
  38630. }
  38631. }, {
  38632. key: "autoTour",
  38633. value: function autoTour() {
  38634. if (!settings$3.nestscenes || !settings$3.nestscenes.scenes || !settings$3.nestscenes.scenes.length || settings$3.nestscenes.scenes[0].script) return;
  38635. if (settings$3.basic.menu.scene_autoplay) {
  38636. settings$3.warp.auto = 0;
  38637. $('#play').removeClass('play').addClass('pause');
  38638. G.playing = true;
  38639. $('.gui-floor').hide();
  38640. $('.rightbar').hide();
  38641. $('#userlogo').hide();
  38642. $('#page-view').hide();
  38643. $('#back-url').hide();
  38644. $('.indoordir, .indoorscale').hide();
  38645. $('#virgule, #barrageShow, #barrageCon').hide();
  38646. }
  38647. settings$3.warp.auto >= 0 && transitions.trigger({
  38648. duration: 1e3 * Math.min(300, settings$3.warp.auto),
  38649. done: function () {
  38650. this.playTour();
  38651. }.bind(this),
  38652. name: '_atr'
  38653. });
  38654. }
  38655. }, {
  38656. key: "atDestinationPano",
  38657. value: function atDestinationPano() {
  38658. if (!this.player.currentPano || null === this.destinationItem) return false;
  38659. var t = this.player.currentPano.id;
  38660. if (void 0 === t) return false;
  38661. var e = this.player.model.heroLocations;
  38662. return null !== this.destinationItem && void 0 !== e[this.destinationItem] && t == e[this.destinationItem].panoId;
  38663. }
  38664. }, {
  38665. key: "redirectToItem",
  38666. value: function redirectToItem(t, e) {
  38667. if (null === t || void 0 === t) return void logger$1.warn('Director.redirectToItem() -> Redirecting to null item.');
  38668. if (!this.wouldInterrupt()) return void logger$1.warn('Director.redirectToItem() -> Director cannot redirect if there is nothing to interrupt.');
  38669. if (this.player.mode === Viewmode$1.TRANSITIONING) return void logger$1.debug('Director.redirectToItem() -> Cannot redirect while transitioning.');
  38670. logger$1.debug('Director.redirectToItem() -> Redirecting to ' + t + ' via ' + e);
  38671. var i = function () {
  38672. transitions.setTimeout(function () {
  38673. this.setDestinationItem(t), logger$1.info('from redirectToItem'), this.goToDestination(true, BlackoutStyle.BEGINNING, settings$3.warp.warpInterruptionRedirectTime, false);
  38674. }.bind(this), 0);
  38675. }.bind(this);
  38676. this.interrupt(BlackoutStyle.END, 0), this.updateSuccessFunction(i);
  38677. }
  38678. }, {
  38679. key: "useSpecialTransition",
  38680. value: function useSpecialTransition(t) {
  38681. void 0 !== t && this.defaultWarpStyle !== WarpStyle.BLACK && logger$1.debug('useSpecialTransition(): ' + t), this.nextWarpStyle = this.defaultWarpStyle;
  38682. }
  38683. }, {
  38684. key: "resetSpecialTransition",
  38685. value: function resetSpecialTransition() {
  38686. this.nextWarpStyle = this.defaultWarpStyle;
  38687. }
  38688. }, {
  38689. key: "arrivedAtDestination",
  38690. value: function arrivedAtDestination(e) {
  38691. if (this.player.flying || this.player.isWarping()) logger$1.warn('Cannot advance to interlude or aiming while player is flying or warping.');else {
  38692. this.transitionStage = this.C.Aiming;
  38693. var t = this.tourIsPlaying ? this.tourInterlude.bind(this, this.nextItem(this.currentItem)) : null;
  38694. this.player.model.fadePanoMarkers(0), this.awaitCompletion(function () {
  38695. this.resetSpecialTransition(), e ? this.player.aimTourCamera(this.destinationItem, PathDisplayMode.Retain, PathDisplayMode.Slow, this.actionComplete.bind(this)) : this.actionComplete();
  38696. }.bind(this), t);
  38697. }
  38698. if (!this.play.control.canPlay) {
  38699. this.play.control.canPlay = true;
  38700. }
  38701. if (this.play.control.wait && this.play.control.isPlaying) {
  38702. this.record.updateFragmentUI(this.play.control.currentIndex);
  38703. this.play.control.wait = false;
  38704. }
  38705. }
  38706. }, {
  38707. key: "toast",
  38708. value: function toast(msg) {
  38709. setTimeout(function () {
  38710. document.getElementsByClassName('toast-wrap')[0].getElementsByClassName('toast-msg')[0].innerHTML = msg;
  38711. var toastTag = document.getElementsByClassName('toast-wrap')[0];
  38712. toastTag.className = toastTag.className.replace('toastAnimate', '');
  38713. setTimeout(function () {
  38714. toastTag.className = toastTag.className + ' toastAnimate';
  38715. }, 10);
  38716. }, 10);
  38717. }
  38718. }, {
  38719. key: "tour360view",
  38720. value: function tour360view() {
  38721. //360显示toast
  38722. if (this.player.currentPano && this.player.currentPano.alignmentType === 2) {
  38723. var language = this.player.model.language;
  38724. this.toast(language.watchPr); // settings.basic.menu.compass_enable && $(".indoordir, .indoorscale").fadeOut(300);
  38725. } else if ($('#play').hasClass('play')) ;
  38726. }
  38727. }, {
  38728. key: "goToDestination",
  38729. value: function goToDestination(e, t, i, n) {
  38730. this.destinationItem = objects.play.control.currentIndex;
  38731. if (this.onTheBus = !0, this.emit('update.controls'), !n && this.atDestinationPano()) return void this.arrivedAtDestination(!0);
  38732. if (this.player.flying || this.player.isWarping()) logger$1.warn('Cannot go to new destination while player is flying or warping.');else {
  38733. var r = this.player.model.getHeroDescriptorByIndex(this.destinationItem),
  38734. o = null,
  38735. a = null;
  38736. if (r.pano != null && typeof r.pano != 'undefined') {
  38737. var s = 0 === this.destinationItem || e ? WarpStyle.BLACK : this.nextWarpStyle;
  38738. a = this.player.warpToPanoByHeroIndex.bind(this.player, this.destinationItem, PathDisplayMode.Show, PathDiscardMode.Slow, s, t, i, this.actionComplete.bind(this)), o = this.arrivedAtDestination.bind(this, !0);
  38739. } else a = this.player.warpToNonPanoByHeroIndex.bind(this.player, this.destinationItem, this.actionComplete.bind(this)), o = this.arrivedAtDestination.bind(this, !1);
  38740. this.transitionStage = this.C.Moving, this.player.model.fadePanoMarkers(0, null, {
  38741. hideVideoFlag: true
  38742. }), this.awaitCompletion(function () {
  38743. a();
  38744. }.bind(this), o), this.emit('update.controls');
  38745. }
  38746. }
  38747. }, {
  38748. key: "tourInterlude",
  38749. value: function tourInterlude() {
  38750. // if (h.trackAlways("reach_highlight", {
  38751. // reach_source: this.reachSource
  38752. // }),
  38753. this.player.model.fadePanoMarkers(0);
  38754. this.emit('update.controls');
  38755. if (this.tourIsPlaying) return this.atEndOfTour() && !this.endlessLoop ? (this.tourInProgress = !1, this.stopTour(), this.emit(DirectorEvents.TourEnd), void (this.player.mode === Viewmode.PANORAMA && this.player.model.fadePanoMarkers(settings$3.panorama.markerOpacity))) : void this.awaitCompletion(function () {
  38756. this.transitionStage = this.C.Interlude, this.player.tourInterlude(this.nextItem(this.currentItem), this.actionComplete.bind(this));
  38757. }.bind(this), this.goNext.bind(this));
  38758. }
  38759. }, {
  38760. key: "playTour",
  38761. value: function playTour() {
  38762. if (!this.bounceable()) return this.tourIsPlaying ? void logger$1.info('tour is already playing') : void (this.wouldInterrupt() || (this.player.emit('tour_auto', this.defaultWarpStyle), this.tourInProgress = !0, this.reachSource = 'play', this.tourIsPlaying = !0, this.wasZoomEnabled = this.player.zoomEnabled, this.player.zoomEnabled = !1, this.resetSpecialTransition(), this.emit('update.controls'), this.emit(DirectorEvents.TourStart), this.player.enablePreRendering(), this.walkingSectionPaused ? (this.clearWalkingSectionPaused(), this.goToDestination()) : this.goNext()));
  38763. }
  38764. }, {
  38765. key: "hideTourBar",
  38766. value: function hideTourBar() {
  38767. if (browser.isMobile()) {
  38768. $('.btn-cat-play').removeClass('cat-mob-pause').addClass('cat-mob-play');
  38769. } else {
  38770. $('.btn-cat-play').removeClass('cat-pc-pause').addClass('cat-pc-play');
  38771. }
  38772. $('#gui').show();
  38773. }
  38774. }, {
  38775. key: "stopTour",
  38776. value: function stopTour() {
  38777. this.isInterrupted() || this.transitionStage === this.C.Moving && this.checkAndHandleWalkingtourInterruption(this.nextWarpStyle) || (this.tourIsPlaying && (this.player.zoomEnabled = this.wasZoomEnabled), this.tourIsPlaying = !1, this.interrupt(), this.clearWalkingSectionPaused(), this.resetSpecialTransition(), this.emit('update.controls'));
  38778. }
  38779. }, {
  38780. key: "endTourProgress",
  38781. value: function endTourProgress() {
  38782. this.tourInProgress = !1, this.emit('update.controls'), this.emit(DirectorEvents.TourEnd);
  38783. }
  38784. }, {
  38785. key: "goToHighlight",
  38786. value: function goToHighlight(t) {
  38787. this.clearWalkingSectionPaused();
  38788. this.destinationItem = t;
  38789. this.useSpecialTransition('Hilight');
  38790. this.goToDestination();
  38791. }
  38792. }, {
  38793. key: "goToHighlightByLocation",
  38794. value: function goToHighlightByLocation(location) {
  38795. function getLocation(item) {
  38796. if (item.panoId && item.panoId == location) {
  38797. return true;
  38798. } else {
  38799. return false;
  38800. }
  38801. }
  38802. var index = this.player.model.heroLocations.findIndex(getLocation); //if (this.canInterrupt() || !this.wouldInterrupt()) {
  38803. if (!this.wouldInterrupt()) {
  38804. if (logger$1.debug('<tour.goto ' + index + '>'), this.wouldInterrupt() && (index === this.destinationItem ? this.interrupt() : this.redirectToItem(index, 'goToHighlight')), this.isInterrupted()) return;
  38805. this.clearWalkingSectionPaused(), this.setDestinationItem(index), this.useSpecialTransition('Hilight'), this.goToDestination(); // analytics.trackAlways("USER", {
  38806. // event_type: "reach_highlight",
  38807. // reach_source: "thumb"
  38808. // })
  38809. }
  38810. }
  38811. }, {
  38812. key: "prevHighlight",
  38813. value: function prevHighlight() {
  38814. this.bounceable() || (this.player.emit('tour_manual', 'prev'), this.interrupt(BlackoutStyle.BEGINNING) || this.isInterrupted() || (this.clearWalkingSectionPaused(), this.reachSource = 'prev', this.goPrev()));
  38815. }
  38816. }, {
  38817. key: "nextHighlight",
  38818. value: function nextHighlight() {
  38819. this.bounceable() || (this.player.emit('tour_manual', 'next'), this.interrupt(BlackoutStyle.BEGINNING) || this.isInterrupted() || (this.clearWalkingSectionPaused(), this.reachSource = 'next', this.goNext()));
  38820. }
  38821. }, {
  38822. key: "changeMode",
  38823. value: function changeMode(t, e) {
  38824. var i = e || 'gui';
  38825. switch (this.wouldInterrupt() && this.interrupt(), this.player.controls[t].emit('interaction.' + i), this.clearWalkingSectionPaused(), t) {
  38826. case Viewmode$1.PANORAMA:
  38827. this.player.insideMode();
  38828. break;
  38829. case Viewmode$1.DOLLHOUSE:
  38830. case Viewmode$1.FLOORPLAN:
  38831. this.player.flyToNewMode({
  38832. mode: t
  38833. });
  38834. }
  38835. }
  38836. }, {
  38837. key: "atEndOfTour",
  38838. value: function atEndOfTour() {
  38839. var t = this.currentItem >= this.nItems - 1;
  38840. return t;
  38841. }
  38842. }, {
  38843. key: "firstDestination",
  38844. value: function firstDestination() {
  38845. if (this.nItems <= 0) {
  38846. return null;
  38847. }
  38848. for (var i = 0; i < this.nItems; i++) {
  38849. if (this.player.model.images['list'][i].script === this.currentScript) {
  38850. return i;
  38851. }
  38852. }
  38853. return 0;
  38854. }
  38855. }, {
  38856. key: "finalDestination",
  38857. value: function finalDestination() {
  38858. if (this.nItems <= 0) return null;
  38859. for (var i = this.nItems - 1; i >= 0; i--) {
  38860. if (this.player.model.images['list'][i].script === this.currentScript) {
  38861. return i;
  38862. }
  38863. }
  38864. return 0;
  38865. }
  38866. }, {
  38867. key: "goPrev",
  38868. value: function goPrev() {
  38869. this.tourAdvance(-1);
  38870. }
  38871. }, {
  38872. key: "goNext",
  38873. value: function goNext() {
  38874. this.tourAdvance(1);
  38875. }
  38876. }, {
  38877. key: "setDestinationItem",
  38878. value: function setDestinationItem(t) {
  38879. if (t > this.nItems) {
  38880. t = this.firstDestination();
  38881. }
  38882. this.destinationItem = t;
  38883. this.emit('update.controls');
  38884. }
  38885. }, {
  38886. key: "setCurrentItem",
  38887. value: function setCurrentItem(t) {
  38888. this.currentItem = t, this.emit('update.controls');
  38889. }
  38890. }, {
  38891. key: "nextItem",
  38892. value: function nextItem(t) {
  38893. return null === t ? this.firstDestination() : t >= this.nItems - 1 ? this.endlessLoop ? this.firstDestination() : null : t + 1;
  38894. }
  38895. }, {
  38896. key: "prevItem",
  38897. value: function prevItem(t) {
  38898. return null === t ? this.firstDestination() : t < 0 ? this.endlessLoop ? this.lastDestination() : null : t - 1;
  38899. }
  38900. }, {
  38901. key: "tourAdvance",
  38902. value: function tourAdvance(t) {
  38903. logger$1.debug('tourAdvance(' + t + ')');
  38904. null === this.currentItem || void 0 === this.currentItem ? this.setDestinationItem(this.firstDestination()) : this.setDestinationItem(this.currentItem + t);
  38905. this.destinationItem < 0 ? (this.setDestinationItem(this.finalDestination()), this.useSpecialTransition('reverse-looping to end')) : this.destinationItem >= this.nItems && (this.setDestinationItem(this.firstDestination()), this.useSpecialTransition('looping back to start'));
  38906. this.goToDestination();
  38907. }
  38908. }]);
  38909. return Director;
  38910. }(EventEmitter);
  38911. });
  38912. /*
  38913. 热点markSpot的拖拽定位
  38914. */
  38915. var MoveCtrl = function MoveCtrl(o) {
  38916. this.elem = o.elem;
  38917. this.domParent = o.domParent;
  38918. this.elem.addEventListener('mousedown', this.beginMove.bind(this));
  38919. this.elem.addEventListener('touchstart', this.beginMove.bind(this));
  38920. this.elem.addEventListener('pointerdown', this.beginMove.bind(this)); //this.elem.on('pointerdown mousedown touchstart', this.beginMove.bind(this))
  38921. document.addEventListener('mousedown', this.move.bind(this));
  38922. document.addEventListener('touchmove', this.move.bind(this));
  38923. document.addEventListener('pointermove', this.move.bind(this)); //$(document).on('pointermove mousemove touchmove', this.move.bind(this))
  38924. {
  38925. //A screen(edit player屏幕的侦听难加上所以直接写在controls里吧 )
  38926. o.cameraControls.on('pointerUp', this.moveDone.bind(this)); //B screen
  38927. document.addEventListener('pointerup', this.moveDone.bind(this));
  38928. document.addEventListener('mouseup', this.moveDone.bind(this));
  38929. document.addEventListener('touchend', this.moveDone.bind(this));
  38930. document.addEventListener('touchcancel', this.moveDone.bind(this)); //$(document).on('pointerup mouseup touchend touchcancel', this.moveDone.bind(this))
  38931. }
  38932. this.beginMoveFuc = o.beginMoveFuc;
  38933. this.moveDoneFuc = o.moveDoneFuc;
  38934. this.hasBound = o.hasBound;
  38935. this.useTransform = o.useTransform; //为true时适用于页面resize时,elem不需要
  38936. if (o.hasBound) {
  38937. this.needGetBound = 1;
  38938. window.addEventListener('resize', function () {
  38939. this.needGetBound = 1;
  38940. }.bind(this));
  38941. }
  38942. this.recover();
  38943. };
  38944. MoveCtrl.prototype.beginMove = function (e) {
  38945. //每次begin
  38946. e.preventDefault(); //防止页面滑动
  38947. e.stopPropagation();
  38948. if (this.hasBound) this.getMoveBound();
  38949. if (this.moving) return;
  38950. e = e.originalEvent || e;
  38951. var isTouch = e.type.indexOf('touch') > -1; //console.log(isTouch)
  38952. this.moving = true;
  38953. if (this.useTransform) {
  38954. //‘translate(55.5556px, 71.1111px)’
  38955. var transform = this.elem.style.transform;
  38956. var x, y;
  38957. if (!transform) {
  38958. x = y = 0;
  38959. } else {
  38960. var a1 = transform.indexOf('(');
  38961. var a2 = transform.indexOf(')');
  38962. transform = transform.slice(a1 + 1, a2).split(',');
  38963. x = parseFloat(transform[0]);
  38964. y = parseFloat(transform[1]);
  38965. }
  38966. this.dragInfo = {
  38967. startElem: {
  38968. x,
  38969. y
  38970. },
  38971. endElem: {
  38972. x,
  38973. y
  38974. }
  38975. };
  38976. } else {
  38977. this.dragInfo = {
  38978. startElem: {
  38979. x: parseFloat(this.elem[0].style.left),
  38980. y: parseFloat(this.elem[0].style.top)
  38981. }
  38982. /* ,
  38983. endElem: {
  38984. x: 0,
  38985. y: 0
  38986. } */
  38987. };
  38988. }
  38989. this.dragInfo.startMouse = {
  38990. x: isTouch ? e.changedTouches[0].clientX : e.clientX,
  38991. y: isTouch ? e.changedTouches[0].clientY : e.clientY
  38992. };
  38993. if (this.beginMoveFuc) this.beginMoveFuc(); //console.log('beginMove')
  38994. //if(this.controlEvent)this.dealMoveCallBack();
  38995. };
  38996. MoveCtrl.prototype.move = function (e) {
  38997. //位移
  38998. if (!this.moving) return;
  38999. e = e.originalEvent || e;
  39000. var isTouch = e.type.indexOf('touch') > -1; //console.log(isTouch)
  39001. var x = isTouch ? e.changedTouches[0].clientX : e.clientX;
  39002. var y = isTouch ? e.changedTouches[0].clientY : e.clientY;
  39003. this.dragInfo.vector = {
  39004. //位移
  39005. x: x - this.dragInfo.startMouse.x,
  39006. y: y - this.dragInfo.startMouse.y
  39007. };
  39008. this.dragInfo.endElem = {
  39009. x: this.dragInfo.startElem.x + this.dragInfo.vector.x,
  39010. y: this.dragInfo.startElem.y + this.dragInfo.vector.y
  39011. }; //console.log(this.dragInfo.endElem)
  39012. //限制移动范围
  39013. if (this.hasBound) {
  39014. this.dragInfo.endElem.x = Math.max(this.bound.left, this.dragInfo.endElem.x);
  39015. this.dragInfo.endElem.x = Math.min(this.bound.right, this.dragInfo.endElem.x);
  39016. this.dragInfo.endElem.y = Math.max(this.bound.top, this.dragInfo.endElem.y);
  39017. this.dragInfo.endElem.y = Math.min(this.bound.bottom, this.dragInfo.endElem.y);
  39018. }
  39019. if (this.useTransform) {
  39020. this.elem.style.transform = 'translate(' + this.dragInfo.endElem.x + 'px,' + this.dragInfo.endElem.y + 'px)';
  39021. } else {
  39022. this.elem.style.left = this.dragInfo.endElem.x + 'px';
  39023. this.elem.style.top = this.dragInfo.endElem.y + 'px';
  39024. }
  39025. };
  39026. MoveCtrl.prototype.moveDone = function (e) {
  39027. if (!this.moving) return;
  39028. this.getMoveBound();
  39029. this.moving = false;
  39030. this.move(e);
  39031. if (this.moveDoneFuc) this.moveDoneFuc(this.reportPos()); //最后一次刷新一下位置
  39032. this.dragInfo.startElem = this.dragInfo.endElem;
  39033. this.dragInfo.vector = {
  39034. x: 0,
  39035. y: 0
  39036. }; //console.log('moveDone')
  39037. };
  39038. MoveCtrl.prototype.getMoveBound = function () {
  39039. //限制移动范围
  39040. if (!this.needGetBound) return;
  39041. var width = isMobile ? 68 : 100;
  39042. var height = isMobile ? 32 : 60; //this.$elem[0].scrollHeight; //scrollHeight没用的
  39043. var w = ($('#player').width() - width) / 2;
  39044. if (isMobile) {
  39045. this.bound = {
  39046. left: -w,
  39047. right: w,
  39048. top: -($('#player').height() / 2 - $('header')[0].offsetTop - $('header').height() - height / 2),
  39049. bottom: $('#player').height() / 2 - $('footer').height() - height / 2
  39050. };
  39051. } else {
  39052. this.bound = {
  39053. left: -w,
  39054. right: w,
  39055. top: -($('#player').height() / 2 - 50 - height / 2),
  39056. bottom: $('#player').height() / 2 - height / 2
  39057. };
  39058. }
  39059. console.log(this.bound);
  39060. this.needGetBound = 0;
  39061. };
  39062. MoveCtrl.prototype.reportPos = function () {
  39063. //输出创建热点所需要的平面上的坐标
  39064. return {
  39065. x: this.dragInfo.endElem.x + this.domParent.clientWidth / 2,
  39066. y: this.dragInfo.endElem.y + this.domParent.clientHeight / 2
  39067. };
  39068. }; //外部调用----------
  39069. MoveCtrl.prototype.recover = function () {
  39070. //恢复到初始状态
  39071. this.dragInfo = {
  39072. startElem: {
  39073. x: 0,
  39074. y: 0
  39075. },
  39076. endElem: {
  39077. x: 0,
  39078. y: 0
  39079. }
  39080. };
  39081. if (this.useTransform) {
  39082. this.elem.style.transform = '';
  39083. } else {
  39084. this.elem.style.left = 0;
  39085. this.elem.style.top = 0;
  39086. }
  39087. };
  39088. function _createSuper$J(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$J(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  39089. function _isNativeReflectConstruct$J() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  39090. var Label2D = /*#__PURE__*/function (_EventEmitter) {
  39091. _inherits(Label2D, _EventEmitter);
  39092. var _super = _createSuper$J(Label2D);
  39093. function Label2D() {
  39094. var _this;
  39095. var info = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  39096. var player = arguments.length > 1 ? arguments[1] : undefined;
  39097. _classCallCheck(this, Label2D);
  39098. _this = _super.call(this);
  39099. if (info.pos3d) {
  39100. _this.pos3d = new THREE.Vector3().copy(info.pos3d);
  39101. }
  39102. if (info.pos2d) {
  39103. _this.pos2d = new THREE.Vector2().copy(info.pos2d);
  39104. _this.setElemPos();
  39105. }
  39106. _this.name = info.name;
  39107. _this.elem = info.elem;
  39108. _this.camera = info.camera;
  39109. _this.domParent = info.domParent;
  39110. _this.player = player;
  39111. _this.useTransform = info.useTransform;
  39112. _this.mayShelter = info.mayShelter;
  39113. return _this;
  39114. }
  39115. _createClass(Label2D, [{
  39116. key: "update",
  39117. value: function update() {
  39118. /* if(objects.player.mode !== 'dollhouse' || !this.enable || !this.text
  39119. || objects.model.currentFloor.floorIndex != this.floorIndex && !objects.model.allFloorsVisible
  39120. || config.isEdit && (objects.mainDesign && objects.mainDesign.editing || objects.player.EditOverlay && objects.player.EditOverlay.editing||
  39121. objects.player.linkEditor && (objects.player.linkEditor.setPanoVisible || objects.player.linkEditor.setTagVisible)
  39122. )
  39123. ){
  39124. this.elem.css('display','none'); return;
  39125. } */
  39126. if (!this.pos3d || this.dragging) return; //console.log(this.name, this.camera.matrixWorldInverse.elements, this.camera.projectionMatrix.elements)
  39127. var p = convertTool.getPos2d(this.pos3d, this.player, this.camera, this.domParent);
  39128. if (!p.trueSide) {
  39129. this.elem.style.display = 'none';
  39130. return;
  39131. } //判断label是否被模型遮挡,遮挡则消失
  39132. if (this.mayShelter && convertTool.ifShelter(this.pos3d, this.player, {
  39133. x: p.vector.x,
  39134. y: p.vector.y
  39135. }, this.camera
  39136. /* , objects.model.allFloorsVisible ? null : this.floorIndex */
  39137. )) {
  39138. this.elem.style.display = 'none';
  39139. return;
  39140. }
  39141. this.elem.style.display = 'block'; //先显示,driftDir才能计算位置
  39142. if (this.driftDir) {
  39143. //针对入户门标识。 label位置相对position向外偏移一段(driftDir为箭头方向),保证label的外沿相对position距离spaceDis个像素,这样看上去就会贴近箭头且距离稳定。
  39144. var driftPoint = convertTool.getPos2d(this.pos3d.clone().add(this.driftDir)); //先将label置于position的位置,然后求从箭头开始到position的这条射线在label的rect中的二维交点(向外的那个交点)
  39145. var rect = this.elem[0].children[0].getBoundingClientRect();
  39146. var crossPos2d = math$1.getCrossPointAtRect(driftPoint.pos, p.pos, rect.width, rect.height, p.pos.x - rect.width / 2, p.pos.y - rect.height / 2);
  39147. var driftVec = crossPos2d.sub(p.pos.clone()); //得到二维偏移方向
  39148. var dis = this.pos3d.distanceTo(this.camera.position);
  39149. var spaceDis = 100 / dis; //边距(距离position) 为了防止离远时看起来似乎较远,除以一下相机距离
  39150. //将label的二维位置向外偏移 长度为label的中心到label边缘(crossPos2d)的距离 外加一小段spaceDis
  39151. this.pos2d = p.pos.clone().add(driftVec.multiplyScalar((spaceDis + driftVec.length()) / driftVec.length()));
  39152. } else {
  39153. this.pos2d = new THREE.Vector2().copy(p.vector);
  39154. }
  39155. this.setElemPos();
  39156. }
  39157. }, {
  39158. key: "setElemPos",
  39159. value: function setElemPos() {
  39160. if (this.useTransform) {
  39161. var transformX = this.pos2d.x / 2 * this.domParent.clientWidth;
  39162. var transformY = -this.pos2d.y / 2 * this.domParent.clientHeight;
  39163. this.elem.style.transform = 'translate(' + Math.round(transformX) + 'px,' + Math.round(transformY) + 'px)';
  39164. } else {
  39165. this.elem.style.left = this.pos2d.x + 'px', this.elem.style.top = this.pos2d.y + 'px';
  39166. }
  39167. }
  39168. }]);
  39169. return Label2D;
  39170. }(EventEmitter);
  39171. function _createSuper$I(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$I(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  39172. function _isNativeReflectConstruct$I() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  39173. var player$6;
  39174. var isMobile$2;
  39175. var playerB$1,
  39176. markBmoveCtrl,
  39177. lastMouseB = new THREE.Vector2();
  39178. var MatchDataGetWrong = {};
  39179. var MatchData = {};
  39180. var insideLookLimitDownOld, insideLookLimitUpOld;
  39181. function mousedownB(e) {
  39182. //editSpot.playerBmousedown = true
  39183. lastMouseB = getMouseB(e);
  39184. /* if (config.isEdit && editor.mainDesign.floorExamingStep == 2) { //模型地面高度
  39185. if (editor.mainDesign.hoverPull) {
  39186. editor.mainDesign.dragLineBegin(editSpot);
  39187. }
  39188. return;
  39189. } */
  39190. }
  39191. function getMouseB(e) {
  39192. e = e.originalEvent || e;
  39193. var isTouch = e.type.indexOf('touch') > -1;
  39194. var x = isTouch ? e.changedTouches[0].clientX : e.offsetX;
  39195. var y = isTouch ? isMobile$2 ? e.changedTouches[0].clientY - player$6.domElement.clientHeight : e.changedTouches[0].clientY : e.offsetY; //手机的上下分屏有点麻烦。电脑触屏使用的后者没有测过
  39196. return {
  39197. x: x,
  39198. y: y
  39199. };
  39200. }
  39201. function getPoint(dir, panoB) {
  39202. //获取B的click dir是经过matrix变换的方向,要变成没有变换的点击点
  39203. var dir = dir.clone();
  39204. var matrixWorld = panoB.matrixWorld.clone();
  39205. matrixWorld.invert(); //求逆矩阵
  39206. dir = math$1.crossRight(dir, matrixWorld); //dir右乘逆矩阵 得无matrix转化的向量O’B
  39207. //console.log('B的dir(无matrix转化):')
  39208. //console.log(dir.clone().normalize())
  39209. return panoB.position.clone().add(dir);
  39210. }
  39211. defineComponent('TagEditManager', function () {
  39212. return /*#__PURE__*/function (_Emiter) {
  39213. _inherits(Editspot, _Emiter);
  39214. var _super = _createSuper$I(Editspot);
  39215. function Editspot(splitView) {
  39216. var _this;
  39217. var info = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  39218. _classCallCheck(this, Editspot);
  39219. _this = _super.call(this);
  39220. _this.splitView = splitView;
  39221. _this.panoA; //不同于splitView的panoA. 只有getA时才会改变
  39222. _this.paonB; //基本和splitView的paonB一样,因为右侧不能移动所以不会变
  39223. _this.markTagPos; //被计算出的热点位置
  39224. _this.init(info);
  39225. /* splitView.on('leave', () => {
  39226. //player.unableChangePano = false
  39227. }) */
  39228. return _this;
  39229. }
  39230. _createClass(Editspot, [{
  39231. key: "init",
  39232. value: function init(info) {
  39233. var _this2 = this;
  39234. if (this.inited) return;
  39235. playerB$1 = this.$app.dom.querySelector('.player[name="copy"]'); //副屏
  39236. player$6 = this.$app.core.get('Player');
  39237. this.$app.core.get('TagManager');
  39238. isMobile$2 = this.$app.config.mobile;
  39239. this.panosHistory = []; //每次定位时左侧走过的点位
  39240. /* this.mouseA = new THREE.Vector2(Infinity, Infinity)
  39241. this.mouseB = new THREE.Vector2(Infinity, Infinity) */
  39242. //两个热点标记
  39243. this.markSpotA = new Label2D({
  39244. name: 'markSpotA',
  39245. elem: info.spotA,
  39246. domParent: player$6.domElement,
  39247. camera: player$6.camera,
  39248. useTransform: true
  39249. }, player$6); //不使用panorama那个camera,因为在飞向下一个点时camera不更新
  39250. this.markSpotB = new Label2D({
  39251. name: 'markSpotB',
  39252. elem: info.spotB,
  39253. domParent: playerB$1,
  39254. camera: this.splitView.panoramaCam,
  39255. useTransform: true
  39256. }, player$6);
  39257. this.markSpotA.name = 'markSpotA';
  39258. this.markSpotB.name = 'markSpotB'; //热点的拖拽控制
  39259. new MoveCtrl({
  39260. elem: this.markSpotA.elem,
  39261. domParent: player$6.domElement,
  39262. useTransform: true,
  39263. cameraControls: player$6.cameraControls,
  39264. beginMoveFuc: function beginMoveFuc() {
  39265. if (!_this2.editing) return;
  39266. _this2.markSpotA.dragging = true; //this.markSpotA.elem.addClass("dragging")
  39267. player$6.cameraControls.controls.panorama.locked = true;
  39268. _this2.splitView.panoramaCtl.locked = true;
  39269. },
  39270. moveDoneFuc: function moveDoneFuc(e) {
  39271. if (!_this2.editing) return;
  39272. _this2.markSpotA.dragging = false; //this.markSpotA.elem.removeClass("dragging")
  39273. player$6.cameraControls.controls.panorama.locked = false;
  39274. _this2.splitView.panoramaCtl.locked = false;
  39275. e && _this2.moveToReGetA(e);
  39276. player$6.mouseCouldBeClickToMove = false;
  39277. }
  39278. });
  39279. markBmoveCtrl = new MoveCtrl({
  39280. elem: this.markSpotB.elem,
  39281. domParent: playerB$1,
  39282. useTransform: true,
  39283. cameraControls: player$6.cameraControls,
  39284. beginMoveFuc: function beginMoveFuc() {
  39285. _this2.markSpotB.dragging = true; //this.markSpotB.elem.addClass("dragging")
  39286. _this2.splitView.panoramaCtl.locked = true; //防止相机移动
  39287. player$6.cameraControls.controls.panorama.locked = true; //避免在B区抬起不触发moveDone
  39288. },
  39289. moveDoneFuc: function moveDoneFuc(e) {
  39290. _this2.markSpotB.dragging = false; //this.markSpotB.elem.removeClass("dragging")
  39291. _this2.splitView.panoramaCtl.locked = false;
  39292. player$6.cameraControls.controls.panorama.locked = false;
  39293. e && _this2.moveToReGetB(e);
  39294. }
  39295. });
  39296. playerB$1.addEventListener('pointerdown', mousedownB);
  39297. playerB$1.addEventListener('touchstart', mousedownB);
  39298. playerB$1.addEventListener('pointerup', this.clickToReGetB.bind(this)); //iphone pointerup无效
  39299. playerB$1.addEventListener('touchend', this.clickToReGetB.bind(this)); //player不断更新时,如果画面改变,要更新热点位置。
  39300. player$6.on('update', function (e) {
  39301. if (_this2.editing) {
  39302. if (e.hasChanged.cameraChanged2) {
  39303. /* this.markSpotA.camera.updateMatrix() //没自动更新
  39304. this.markSpotA.camera.updateMatrixWorld() */
  39305. _this2.markSpotA.update();
  39306. }
  39307. if (_this2.splitView.changed()
  39308. /* || this.changed() */
  39309. ) {
  39310. _this2.markSpotB.update();
  39311. }
  39312. }
  39313. }); //左屏改变漫游点
  39314. player$6.on('pano.chosen', function (pano1, pano2) {
  39315. _this2.changePano(pano2);
  39316. }); //左侧第一次点击确定位置
  39317. player$6.on('click', function (e) {
  39318. if (_this2.editing && !_this2.clickA) {
  39319. e.intersect && _this2.getA(e.intersect);
  39320. e.consume(); //使用了,阻止后续进行
  39321. }
  39322. }); //左屏改变漫游点时询问是否有要转向的aim target。 转向markTagPos
  39323. player$6.on('ifFocusPoint', function (askAim) {
  39324. if (_this2.editing && _this2.markTagPos) {
  39325. var importance = 3; //设置当前的importance级别。如果askAim已高于该级别 就不操作
  39326. if (askAim.importance < importance) {
  39327. askAim.importance = importance;
  39328. askAim.aim = _this2.markTagPos.clone();
  39329. }
  39330. }
  39331. });
  39332. this.inited = true;
  39333. }
  39334. /* changed = (function () {
  39335. var previousState = {}
  39336. return function () {
  39337. let changed = !previousState.mouseB || !this.mouseB.equals(previousState.mouseB)
  39338. previousState.mouseB = this.mouseB.clone()
  39339. return changed
  39340. }
  39341. })() */
  39342. //添加热点
  39343. }, {
  39344. key: "enter",
  39345. value: function enter() {
  39346. var _this3 = this;
  39347. /* var checkCanAddSpot = function(){
  39348. if(player.is360View(player.mode, player.currentPano)){
  39349. player.currentPano.view.backToPanorama();
  39350. $waiting.show()
  39351. }
  39352. return player.currentPano && (config.settings.visions != 2 || player.currentPano.assistPano)
  39353. }
  39354. if(!checkCanAddSpot()){
  39355. var timer = setInterval(() => {
  39356. if(checkCanAddSpot()){
  39357. editSpot.addSpot()
  39358. clearInterval(timer)
  39359. }
  39360. }, 50)
  39361. return;
  39362. } */
  39363. player$6.viewLinkManager.exitView().then(function () {
  39364. if (player$6.flying || player$6.flyingToTag) {
  39365. if (player$6.flyingToTag) ;
  39366. player$6.once(PlayerEvents.FlyingEnded, function () {
  39367. //等到飞行结束后再开始
  39368. _this3.enter();
  39369. });
  39370. return;
  39371. }
  39372. player$6.flyToMode('panorama', function () {
  39373. var begin = function begin() {
  39374. if (!player$6.currentPano) {
  39375. setTimeout(begin, 50);
  39376. return;
  39377. } //$waiting.hide()
  39378. _this3.editing = true;
  39379. if (_this3.setSpotPos || player$6.flying) return;
  39380. _this3.splitView.enter();
  39381. _this3.panosHistory = [];
  39382. /* this.splitView.changePano(player.currentPano) //因为在enter之前已经分屏了,但之后可能飞到另一个漫游点了,所以同步下,保证右侧和左侧是对应的
  39383. this.splitView.setSceneB() */
  39384. _this3.panoB = _this3.splitView.panoB;
  39385. _this3.markSpotA.elem.style.display = 'none';
  39386. _this3.markSpotB.elem.style.display = 'none';
  39387. _this3.markSpotA.pos3d = _this3.clickA = null;
  39388. _this3.markSpotB.pos3d = _this3.clickB = null;
  39389. _this3.markTagPos = null; //clear focus
  39390. player$6.reticule.visible = false;
  39391. player$6.locked = true; //左屏禁止移动,直到第一次点击
  39392. /* if (settings.visions == 1) {
  39393. player.unableChangePano = true
  39394. } */
  39395. if (insideLookLimitDownOld == void 0) {
  39396. insideLookLimitDownOld = settings$3.insideLookLimitDown;
  39397. insideLookLimitUpOld = settings$3.insideLookLimitUp;
  39398. settings$3.insideLookLimitDown = -35;
  39399. settings$3.insideLookLimitUp = 35;
  39400. }
  39401. };
  39402. begin();
  39403. });
  39404. });
  39405. }
  39406. /*
  39407. 开始热点位置修改
  39408. */
  39409. }, {
  39410. key: "reSetPos",
  39411. value: function reSetPos(pos) {
  39412. var _this4 = this;
  39413. this.markTagPos = new THREE.Vector3().copy(pos);
  39414. player$6.viewLinkManager.exitView().then(function () {
  39415. if (player$6.flying || player$6.flyingToTag) {
  39416. if (player$6.flyingToTag) ;
  39417. player$6.once(PlayerEvents.FlyingEnded, function () {
  39418. //等到飞行结束后再开始
  39419. _this4.reSetPos(pos);
  39420. });
  39421. return;
  39422. }
  39423. _this4.editing = true;
  39424. _this4.panosHistory = []; //$waiting.hide() //objects.gui.showWaiting(false, "reSetPos")
  39425. _this4.hotRePos = true;
  39426. _this4.markSpotA.pos3d = _this4.clickA = _this4.markTagPos.clone();
  39427. _this4.markSpotA.enable = true;
  39428. _this4.markSpotB.pos3d = _this4.clickB = _this4.markTagPos.clone();
  39429. _this4.markSpotA.elem.style.display = 'block';
  39430. _this4.markSpotB.elem.style.display = 'block'; //store.commit('SetPlayerOptions', { showPositionMarks: true }) //热点hotspot可见
  39431. _this4.markSpotB.enable = true;
  39432. setTimeout(function () {
  39433. _this4.markSpotA.update();
  39434. _this4.markSpotB.update();
  39435. }, 300); //console.log('reSetPos', player.currentPano.id)
  39436. /* this.splitView.changePano(player.currentPano)
  39437. this.splitView.setSceneB() */
  39438. _this4.splitView.enter();
  39439. _this4.panoA = _this4.splitView.panoA;
  39440. _this4.panoB = _this4.splitView.panoB;
  39441. if (insideLookLimitDownOld == void 0) {
  39442. insideLookLimitDownOld = settings$3.insideLookLimitDown;
  39443. insideLookLimitUpOld = settings$3.insideLookLimitUp;
  39444. settings$3.insideLookLimitDown = -35;
  39445. settings$3.insideLookLimitUp = 35;
  39446. } //转向:
  39447. player$6.flyToPano({
  39448. pano: player$6.currentPano,
  39449. aimDuration: 500,
  39450. lookAtPoint: _this4.markTagPos
  39451. });
  39452. return true;
  39453. });
  39454. } //确定热点位置
  39455. }, {
  39456. key: "confirmPos",
  39457. value: function confirmPos(Tag) {
  39458. if (!this.editing) return;
  39459. var sid = common.getRandomSid();
  39460. var pos = this.computeHotPos();
  39461. if (Tag) {
  39462. //测试
  39463. player$6.model.add(new Tag(sid, {
  39464. position: pos
  39465. }));
  39466. }
  39467. if (!this.panoA) {
  39468. return {};
  39469. }
  39470. return {
  39471. sid,
  39472. position: pos,
  39473. panoId: this.panoA.id //添加热点时,相机站在当前点
  39474. };
  39475. }
  39476. }, {
  39477. key: "exit",
  39478. value: function exit() {
  39479. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  39480. if (o.cancel) ;
  39481. this.clickA = this.clickB = null;
  39482. this.markSpotA.pos3d = this.markSpotB.pos3d = null;
  39483. /* markSpotA.enable = false;
  39484. markSpotB.enable = false; */
  39485. this.splitView.leave();
  39486. this.markSpotA.elem.style.display = 'none';
  39487. this.markSpotB.elem.style.display = 'none'; // 每次退出需要将markSpot位置重置屏幕中央
  39488. this.markSpotA.pos2d = new THREE.Vector2();
  39489. this.markSpotB.pos2d = new THREE.Vector2();
  39490. this.markSpotA.setElemPos();
  39491. this.markSpotB.setElemPos();
  39492. player$6.reticule.visible = true;
  39493. if (this.hideMarker) {
  39494. editSpot.hideMarker.visible = true;
  39495. editSpot.hideMarker = null;
  39496. }
  39497. this.hotRePos = false;
  39498. this.editing = false;
  39499. player$6.locked = false;
  39500. if (insideLookLimitDownOld != void 0) {
  39501. settings$3.insideLookLimitDown = insideLookLimitDownOld;
  39502. settings$3.insideLookLimitUp = insideLookLimitUpOld;
  39503. insideLookLimitDownOld = insideLookLimitUpOld = null;
  39504. }
  39505. } //左方更改位置
  39506. }, {
  39507. key: "changePano",
  39508. value: function changePano(pano) {
  39509. if (!this.editing) return;
  39510. this.splitView.changePano(pano); //if (!this.markTagPos) return
  39511. if (this.markTagPos) {
  39512. this.markSpotA.pos3d = this.markTagPos.clone(); //使用计算出的坐标
  39513. this.panosHistory.push(pano);
  39514. }
  39515. if (pano.assistPano == this.splitView.panoB || pano == this.splitView.panoB) {
  39516. this.splitView.pauseCameraBind = false;
  39517. } else {
  39518. if (!this.splitView.pauseCameraBind) {
  39519. this.splitView.pauseCameraBind = true;
  39520. this.markSpotB.pos3d && this.splitView.panoramaCtl.startLookAt(this.markSpotB.pos3d); //重新focus回tag一下,因为刚为了很可能转到别的方向了
  39521. }
  39522. }
  39523. } //在左边屏确定位置时
  39524. }, {
  39525. key: "getA",
  39526. value: function getA(intersect) {
  39527. var _this5 = this;
  39528. if (player$6.flying || !this.editing) return;
  39529. this.panoA = player$6.currentPano; //记录改变位置时的左屏pano
  39530. player$6.locked = false; //没有下相机的信息时,分屏后左右pano一样,当左屏确定位置后需要自动飞向别的pano
  39531. if (settings$3.visions != 2 && this.panoA == this.panoB) {
  39532. var modelViewMatrix = player$6.model.matrixWorld.clone().invert();
  39533. var pos = intersect.point.clone().applyMatrix4(modelViewMatrix); //自动飞到旁边最近的点:(为了避免走到的点可能看不见目标,所以取最近的)
  39534. //var metadata = store.getters['scene/metadata'];
  39535. if (
  39536. /* metadata.sceneSource != 12 && */
  39537. !this.clickA) {
  39538. //123的点位在不同房间,全景图很不一样所以不飞(用户需尽量走到可以看到热点的其他位置进行校准,如果没有可见位置,就当做在该房间内的局部全景热点,因为其他房间看不到所以不准确没有关系)
  39539. this.clickA = this.clickB = pos;
  39540. var nearestPano = player$6.model.panos.find([function (pano) {
  39541. return player$6.currentPano.neighbourPanos[pano.id] && player$6.currentPano != pano;
  39542. }], [Panorama.sortFunctions.distanceToPoint(player$6.currentPano.position)]); //player.unableChangePano = false
  39543. if (nearestPano) player$6.flyToPano({
  39544. pano: nearestPano,
  39545. lookAtPoint: pos.clone()
  39546. });else {
  39547. console.log('当前场景只有一个pano,所以不走到下一个点');
  39548. }
  39549. }
  39550. this.clickA = this.clickB = pos;
  39551. } else {
  39552. if (player$6.currentPano.assistPano != this.splitView.panoB || this.panosHistory.length > 0) {
  39553. //左屏已经到另一个点 或者又回来这个点,右侧都不用自动改位置
  39554. if (!this.clickA) {
  39555. //测距第二步时左边走到别的地方,右边要加载对应的
  39556. this.splitView.setSceneB();
  39557. this.panoB = this.splitView.panoB;
  39558. this.splitView.pauseCameraBind = false;
  39559. if (settings$3.visions != 2) {
  39560. //恢复到两边一样,再次执行,以类似第一步开始时
  39561. this.splitView.panoramaCtl.startLookAt(intersect.point);
  39562. return this.getA(intersect);
  39563. }
  39564. } else {
  39565. this.panoA = player$6.currentPano;
  39566. var modelViewMatrix = player$6.model.matrixWorld.clone().invert(); //×模型矩阵的逆矩阵,是因为当飞出屋子再飞进去时模型位移了,现在要保证采集的点是模型没有任何变换下的点。在计算2d坐标时会乘以模型矩阵。
  39567. this.clickA = intersect.point.clone().applyMatrix4(modelViewMatrix);
  39568. this.markSpotA.pos3d = this.clickA;
  39569. this.markSpotA.update();
  39570. this.computeHotPos(); //objects.tagManager.markTag.rePos(markSpotA.computeHotPos({ onlyGetPos: true, dontRestric: editSpot.editType == "measure" })) //总是记录最新算出的坐标 A或B到下一个位置时就使用它
  39571. //console.log("远近:" + objects.tagManager.markTag.position.distanceTo(player.position));
  39572. return;
  39573. }
  39574. }
  39575. if (settings$3.visions != 2) {
  39576. console.warn('settings.visions != 2 ???');
  39577. }
  39578. var data = this.getMatchData();
  39579. if (!data) {
  39580. //$waiting.show() ////objects.gui.showWaiting(true, "getMatchData")
  39581. var name = this.panoA.id + '_' + this.panoB.id;
  39582. MatchDataGetWrong[name] = (MatchDataGetWrong[name] || 0) + 1;
  39583. if (MatchDataGetWrong[name] > 5) {
  39584. console.error('获取不到matchdata 放弃使用: ' + name);
  39585. } else {
  39586. setTimeout(function () {
  39587. _this5.getA(intersect);
  39588. }, 200);
  39589. return;
  39590. }
  39591. } //if (texGetted) $waiting.hide() //objects.gui.showWaiting(false, "getMatchData")
  39592. var modelViewMatrix = player$6.model.matrixWorld.clone().invert(); //×模型矩阵的逆矩阵,是因为当飞出屋子再飞进去时模型位移了,现在要保证采集的点是模型没有任何变换下的点。在计算2d坐标时会乘以模型矩阵。
  39593. this.clickA = intersect.point.clone().applyMatrix4(modelViewMatrix);
  39594. this.dirA = math$1.getNormalDir(this.clickA, player$6.model.supportsTiles, player$6.currentPano); //经过matrix变换的方向
  39595. //通过A预测B
  39596. this.UVa = math$1.getUVfromDir(this.dirA);
  39597. this.UVb = this.searchPointAtLeft(this.UVa);
  39598. if (!this.UVb) {
  39599. //因为B相机相对A相机在y向偏移,所以预估UV
  39600. console.log('找不到UVb,假设一个'); //$tips({ content: "辅助校准位置可能不准确,请检查并拖动到"+ (config.isMobile ? "上方":"左侧")+"相同位置" })
  39601. //$tips({ content: i18n.t('modules.hotspot.m_location_move_tips', { direction: i18n.t(`modules.hotspot.m_location_${config.isMobile?'up':'left'}`) }) })
  39602. var shiftY = -0.02; //最好根据历史统计一下。因为x也可能很不一样
  39603. this.UVb = {
  39604. x: this.UVa.x,
  39605. y: this.UVa.y + shiftY
  39606. };
  39607. } else {
  39608. this.UVb.x = this.UVb.x.toFixed(3) - 0;
  39609. this.UVb.y = this.UVb.y.toFixed(3) - 0;
  39610. }
  39611. this.dirB = math$1.getDirFromUV(this.UVb);
  39612. this.clickB = getPoint(this.dirB, this.splitView.panoB); //更新相机朝向,并记得要立刻updateMatrix,getPos2d需要用到matrix
  39613. /* panoramaCam.lookAt(this.clickB)
  39614. panoramaCam.updateMatrix();
  39615. panoramaCam.updateMatrixWorld(); */
  39616. //UV显示对照更新
  39617. /* $("#IMGparent > div").eq(0).find('.cursor1').css({"display":"block",
  39618. "left": this.UVa.x*100+"100%",
  39619. "top": this.UVa.y*100+"100%"})
  39620. $("#IMGparent > div").eq(1).find('.cursor1').css({"display":"block",
  39621. "left": this.UVb.x*100+"100%",
  39622. "top": this.UVb.y*100+"100%"}) */
  39623. }
  39624. this.markSpotA.pos3d = this.clickA;
  39625. this.markSpotB.pos3d = this.clickB; //热点标记可见
  39626. //store.commit('SetPlayerOptions', { showPositionMarks: true })
  39627. this.markSpotA.elem.style.display = 'block';
  39628. this.markSpotB.elem.style.display = 'block';
  39629. this.markSpotA.enable = true;
  39630. this.markSpotB.enable = true;
  39631. this.markSpotA.update();
  39632. this.markSpotB.update();
  39633. if (settings$3.visions != 2 && this.panoA == this.panoB) {
  39634. this.markTagPos = this.markSpotA.pos3d.clone();
  39635. } else {
  39636. this.computeHotPos();
  39637. } //$('#player').css('cursor', '');
  39638. this.$app.TagManager.emit('tagManager.markTagPos');
  39639. } //在右边屏确定位置时
  39640. }, {
  39641. key: "getB",
  39642. value: function getB(mouse) {
  39643. var intersect = convertTool.getMouseIntersect(this.splitView.panoramaCam, [this.splitView.cube], mouse);
  39644. var modelViewMatrix = player$6.model.matrixWorld.clone().invert(); //×模型矩阵的逆矩阵,是因为当飞出屋子再飞进去时模型位移了,现在要保证采集的点是模型没有任何变换下的点。在计算2d坐标时会乘以模型矩阵。
  39645. this.clickB = intersect.point.clone().applyMatrix4(modelViewMatrix);
  39646. this.markSpotB.pos3d = this.clickB; //更新hotspot三维位置
  39647. this.markSpotB.update(); //更新hotspot二维位置
  39648. this.computeHotPos();
  39649. }
  39650. }, {
  39651. key: "moveToReGetA",
  39652. value: function moveToReGetA(e) {
  39653. //拖拽左侧热点到新的位置
  39654. player$6.handleInputStart(e.x, e.y, true, true); //更新mouse
  39655. player$6.updateIntersect({}); //let intersect = player.getMouseIntersect(null, this.linkEditor.footIcons)
  39656. player$6.intersect ? this.getA(player$6.intersect) : this.markSpotA.update(); //update:回到原来的位置
  39657. player$6.mouseDown = false; //移动端这个不会归零 所以手动
  39658. }
  39659. }, {
  39660. key: "moveToReGetB",
  39661. value: function moveToReGetB(e) {
  39662. //拖拽右侧热点到新的位置
  39663. var mouse = new THREE.Vector2();
  39664. math$1.convertScreenPositionToNDC(e.x, e.y, mouse, playerB$1); //获取在canvasB的mouse
  39665. this.getB(mouse);
  39666. }
  39667. }, {
  39668. key: "clickToReGetB",
  39669. value: function clickToReGetB(e) {
  39670. //点击右侧,热点到新的位置(左侧点击不能确定位置)
  39671. //this.playerBmousedown = false
  39672. if (markBmoveCtrl.moving) return; //这时候使用的是moveToReGetB 因为拖拽热点
  39673. var mouseB = getMouseB(e);
  39674. if (Math.abs(lastMouseB.x - mouseB.x) > 3 || Math.abs(lastMouseB.y - mouseB.y) > 3) return; //在拖拽画布
  39675. if (!this.clickA && !this.hotRePos) {
  39676. console.log('..?..');
  39677. this.$app.TagManager.emit('tagManager.firstMarkTagPosB'); //$tips({ content:i18n.t(`show.location_start_tips`,{direction: i18n.t(`show.location_${config.isMobile?'up':'left'}`)}) });
  39678. return;
  39679. }
  39680. var mouse = new THREE.Vector2();
  39681. math$1.convertScreenPositionToNDC(mouseB.x, mouseB.y, mouse, playerB$1); //获取在canvasB的mouse
  39682. this.getB(mouse);
  39683. }
  39684. }, {
  39685. key: "restricPosAtRoom",
  39686. value: function restricPosAtRoom(pos3d) {
  39687. var A = player$6.currentPano.position; //如果不支持编辑户型的话就得不到rooms 直接使用模型判断 但可能出门 能限制在skybox内
  39688. /* var group = objects.player.model.wallManager.roomInfo && objects.player.model.wallManager.roomInfo.oriRoomGroup;
  39689. if(group){
  39690. group.visible = true;
  39691. var intersect = convertTool.ifIntersectChunks(A, pos3d, {model: group.children});
  39692. if(intersect && intersect.length ){
  39693. console.log('热点飘出房间')
  39694. var pos = intersect[0].point.clone().setY(intersect[0].point.y + 0.001)//+ 0.001防止重叠
  39695. pos3d.copy(pos)
  39696. }
  39697. group.visible = false;
  39698. //新版只有一个房间,可能需要用柱子等其他物体隔开(不在oriRoomData内),还是用模型好。且oriRoomData需一开始就初始化mainDesign。
  39699. }else{ */
  39700. var B = pos3d;
  39701. var dir = B.clone().sub(A).normalize();
  39702. var ray = new THREE.Raycaster(A, dir, 0, A.distanceTo(B));
  39703. var o = ray.intersectObjects(player$6.model.skyBoxTight
  39704. /* .colliders */
  39705. ); //模型不准时热点就永远放不准 只有激光的比较准
  39706. if (o && o.length) {
  39707. console.log('热点飘出skyBoxTight外,矫正:' + pos3d.toArray() + ' --> ' + o[0].point.toArray());
  39708. pos3d.copy(o[0].point).sub(dir.clone().multiplyScalar(0.001));
  39709. } //}
  39710. return pos3d;
  39711. }
  39712. }, {
  39713. key: "computeHotPos",
  39714. value: function computeHotPos() {
  39715. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  39716. //通过采集的两个点位信息,来计算3d坐标
  39717. if (!this.panoA || !this.clickA) {
  39718. return null;
  39719. }
  39720. var A = this.panoA.position.clone();
  39721. var B = this.panoB.position.clone();
  39722. var p1 = this.clickA;
  39723. var p2 = this.clickB;
  39724. var _math$getLineIntersec = math$1.getLineIntersect({
  39725. A,
  39726. B,
  39727. p1,
  39728. p2
  39729. }),
  39730. pos3d = _math$getLineIntersec.pos3d;
  39731. if (!o.dontRestric) this.restricPosAtRoom(pos3d);
  39732. this.markTagPos = pos3d;
  39733. console.log('markTagPos: ', pos3d.toArray());
  39734. return pos3d;
  39735. } //-----------通过上下相机来预测初始位置-------------
  39736. }, {
  39737. key: "getMatchData",
  39738. value: function getMatchData() {
  39739. //获取上下相机的 view pair 对照数据
  39740. var name = this.panoA.id + '_' + this.panoB.id;
  39741. if (MatchData[name]) return MatchData[name];else {
  39742. http.get(this.$app.resource.getEditDataURL("mapping/".concat(name, ".json"))).then(function (data) {
  39743. MatchData[name] = data;
  39744. });
  39745. }
  39746. }
  39747. }, {
  39748. key: "searchPointAtLeft",
  39749. value: function searchPointAtLeft(UVa) {
  39750. //借用view pair数据 通过UVa(热点在左屏的uv位置) 预测UVb
  39751. var data = this.getMatchData();
  39752. if (!UVa) {
  39753. console.log('!!!');
  39754. }
  39755. if (!data || !data['view pair'] || !data['view pair']['uv']) return null; /////////////////////////
  39756. var tx = UVa.x;
  39757. var ty = UVa.y;
  39758. var leftTop = {},
  39759. rightTop = {},
  39760. leftBot = {},
  39761. rightBot = {};
  39762. var info = {
  39763. leftTop: leftTop,
  39764. rightTop: rightTop,
  39765. leftBot: leftBot,
  39766. rightBot: rightBot
  39767. };
  39768. var result; //$('#IMGparent .cursor2').remove()
  39769. data['view pair']['uv'].forEach(function (pair) {
  39770. if (pair[0] < tx && pair[1] <= ty) {
  39771. judge(leftTop, pair);
  39772. } else if (pair[0] >= tx && pair[1] <= ty) {
  39773. judge(rightTop, pair);
  39774. } else if (pair[0] < tx && pair[1] >= ty) {
  39775. judge(leftBot, pair);
  39776. } else {
  39777. judge(rightBot, pair);
  39778. }
  39779. });
  39780. function judge(o, pair) {
  39781. var x = pair[0];
  39782. var y = pair[1]; //var dis = Math.abs(x-tx) + Math.abs(y-ty);
  39783. var dis = (x - tx) * (x - tx) + (y - ty) * (y - ty);
  39784. if (o.dis == void 0 || o.dis > dis) {
  39785. o.dis = dis;
  39786. o.pair = pair;
  39787. }
  39788. }
  39789. var hasValue = 0; //四个方向有值的个数
  39790. for (var i in info) {
  39791. if (info[i].pair) hasValue++;
  39792. }
  39793. var percent = {}; //根据距离算出比例 近似成左右边的uv比例
  39794. if (hasValue >= 3) {
  39795. //有三个值就足够算出
  39796. result = compute();
  39797. } else if (hasValue == 2) {
  39798. //两个值的需要 对角线上都有值
  39799. if (leftTop.pair && rightBot.pair || leftBot.pair && rightTop.pair) {
  39800. result = compute();
  39801. }
  39802. } else ;
  39803. function getSmallest(dir1, dir2) {
  39804. if (!dir1.pair) return dir2;else if (!dir2.pair) return dir1;
  39805. if (dir1.dis < dir2.dis) return dir1;else return dir2;
  39806. }
  39807. function compute() {
  39808. //线性插值计算(比例) uvA对应的uvB
  39809. var left = getSmallest(leftTop, leftBot);
  39810. var right = getSmallest(rightTop, rightBot);
  39811. var top = getSmallest(leftTop, rightTop);
  39812. var bottom = getSmallest(leftBot, rightBot);
  39813. percent.x = (tx - left.pair[0]) / (right.pair[0] - left.pair[0]);
  39814. percent.y = (ty - top.pair[1]) / (bottom.pair[1] - top.pair[1]); //得到对应的uv
  39815. var x = left.pair[2] + (right.pair[2] - left.pair[2]) * percent.x;
  39816. var y = top.pair[3] + (bottom.pair[3] - top.pair[3]) * percent.y;
  39817. return {
  39818. x: x,
  39819. y: y
  39820. };
  39821. }
  39822. return result;
  39823. }
  39824. }]);
  39825. return Editspot;
  39826. }(tinyEmitter);
  39827. });
  39828. /*
  39829. 若关联全景中加热点, 热点仅在此pano可见。无需分屏
  39830. */
  39831. /*
  39832. 初始画面
  39833. */
  39834. var FirstView = /*#__PURE__*/function () {
  39835. function FirstView(metadata, panos) {
  39836. _classCallCheck(this, FirstView);
  39837. this.quickstart = true;
  39838. this.mode = Viewmode$1.PANORAMA;
  39839. this.zoom = -1, this.fov = browser$1.urlHasValue('fov') ? Number(browser$1.urlQueryValue('fov')) : settings$3.insideFOV;
  39840. this.pano = null;
  39841. this.position = new THREE.Vector3();
  39842. this.quaternion = new THREE.Quaternion();
  39843. this.init(metadata, panos);
  39844. }
  39845. _createClass(FirstView, [{
  39846. key: "init",
  39847. value: function init(metadata, panos) {
  39848. var urlFirstView = browser$1.urlHasValue('pose', true); //使用地址栏的信息 如 &pose=pano:2,qua:-0.2205,-0.718,-0.2613,0.605
  39849. if (urlFirstView) {
  39850. try {
  39851. urlFirstView = common.replaceAll(urlFirstView, 'pano', '"pano"');
  39852. urlFirstView = common.replaceAll(urlFirstView, 'qua:', '"qua":[');
  39853. urlFirstView = '{' + urlFirstView + ']}';
  39854. var info = JSON.parse(urlFirstView);
  39855. this.pano = panos.get(info.pano);
  39856. if (!this.pano) {
  39857. urlFirstView = false;
  39858. console.error('检测到firstView但是 找不到该pano');
  39859. } else {
  39860. this.quaternion = new THREE.Quaternion().fromArray(info.qua);
  39861. this.zoom = -1;
  39862. this.setByUrl = true;
  39863. }
  39864. } catch (e) {
  39865. urlFirstView = false;
  39866. console.error('检测到firstView但是解析出错' + e);
  39867. }
  39868. } else {
  39869. if (metadata && metadata.entry) {
  39870. var entry = metadata.entry;
  39871. this.updateByEntry(entry, panos);
  39872. } else {
  39873. this.pano = panos.list[0];
  39874. this.quaternion.copy(this.pano.quaternion);
  39875. }
  39876. }
  39877. this.position.copy(this.pano.position);
  39878. if (this.quaternion.equals(new THREE.Quaternion(-0.5, 0.5, 0.5, 0.5))) {
  39879. //俯视向下会黑屏
  39880. this.quaternion.set(0, 0, 0, 1);
  39881. console.log('检测到初始画面quaternion为-0.5,0.5,0.5,0.5,强制更改为0,0,0,1');
  39882. }
  39883. }
  39884. }, {
  39885. key: "updateByEntry",
  39886. value: function updateByEntry(entry, panos) {
  39887. if (typeof entry == 'string') {
  39888. entry = JSON.parse(entry);
  39889. }
  39890. if (entry.pano) {
  39891. this.pano = panos.get(entry.pano);
  39892. } //有可能客户补拍,那时候这个id可能不存在了。
  39893. if (this.pano == void 0) {
  39894. this.pano = panos.list[0];
  39895. }
  39896. this.quaternion.copy(this.pano.quaternion);
  39897. if (entry.camera) {
  39898. this.quaternion = new THREE.Quaternion().fromArray(entry.camera.quaternion);
  39899. this.zoom = entry.camera.zoom;
  39900. }
  39901. }
  39902. }, {
  39903. key: "fromGuideView",
  39904. value: function fromGuideView(guidItem, panos) {
  39905. this.mode = guidItem.value.mode;
  39906. this.zoom = guidItem.value.zoom;
  39907. this.position.copy(guidItem.value.pos);
  39908. this.quaternion.set(guidItem.value.qua._x, guidItem.value.qua._y, guidItem.value.qua._z, guidItem.value.qua._w);
  39909. this.pano = panos.get(guidItem.value.pano);
  39910. }
  39911. }]);
  39912. return FirstView;
  39913. }();
  39914. function _createSuper$H(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$H(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  39915. function _isNativeReflectConstruct$H() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  39916. var renderer$1, playerB, player$5;
  39917. var texWaitTimer = {};
  39918. var panos2; //分屏模块
  39919. var SplitView = /*#__PURE__*/function (_EventEmitter) {
  39920. _inherits(SplitView, _EventEmitter);
  39921. var _super = _createSuper$H(SplitView);
  39922. function SplitView($app, editType) {
  39923. var _this;
  39924. _classCallCheck(this, SplitView);
  39925. _this = _super.call(this);
  39926. _this.changed = function () {
  39927. //判断右边分屏是否移动了panoramaCam 即是否需要更新markB的位置
  39928. var previousState;
  39929. return function () {
  39930. var cameraChanged;
  39931. var p = this.panoramaCam.position.clone(),
  39932. q = this.panoramaCam.quaternion.clone();
  39933. if (!previousState || !MathLight.closeTo(previousState.position, p, 5) || !MathLight.closeTo(previousState.quaternion, q, 5)) cameraChanged = true;
  39934. if (cameraChanged) {
  39935. previousState = {
  39936. position: p,
  39937. quaternion: q
  39938. };
  39939. }
  39940. return cameraChanged;
  39941. };
  39942. }();
  39943. window.SplitView = _assertThisInitialized(_this);
  39944. _this.$app = $app;
  39945. {
  39946. _this.init();
  39947. }
  39948. _this.editType = editType;
  39949. _this.pauseCameraBind; //右屏是否不跟左屏动
  39950. return _this;
  39951. }
  39952. _createClass(SplitView, [{
  39953. key: "init",
  39954. value: function init() {
  39955. var _this2 = this;
  39956. player$5 = this.$app.core.get('Player'); //-------------设置副屏-------------
  39957. playerB = this.$app.dom.querySelector('.player[name="copy"]'); //创建新的renderer、 scene 和 相机控制
  39958. renderer$1 = new THREE.WebGLRenderer({
  39959. antialias: true
  39960. /* !config.isMobile */
  39961. });
  39962. renderer$1.setPixelRatio(window.devicePixelRatio);
  39963. renderer$1.setSize(300, 300, false);
  39964. playerB.appendChild(renderer$1.domElement);
  39965. var ctls = this.$app.withNewComponent('CameraControls');
  39966. ctls.init(playerB, ['panorama']);
  39967. ctls.activateControls('panorama');
  39968. this.panoramaCtl = ctls.activeControl;
  39969. this.panoramaCam = ctls.activeControl.camera;
  39970. this.panoramaCam.fov = 60;
  39971. this.panoramaCam.name = 'splitViewCam';
  39972. this.panoramaCam.layers.toggle(RenderLayers.DEFAULT);
  39973. this.panoramaCam.layers.enable(RenderLayers.PANOMARKERS);
  39974. this.panoramaCam.layers.enable(RenderLayers.BothAtMainAndSubScreen);
  39975. this.panoramaCam.layers.enable(RenderLayers.SubScreen);
  39976. if (settings$3.visions == 2 && !player$5.model.panos.list[0].assistPano) {
  39977. //诊断出没有vision2的数据
  39978. settings$3.visions = 1;
  39979. console.warn('自动更改 visions = 1');
  39980. }
  39981. if (settings$3.visions != 2 && player$5.model.supportsTiles) {
  39982. //没有下相机的单张全景图,所以只加载和左侧一样的tiles贴图,需要重新创建tiles相关,因贴图无法共用(会报错)
  39983. var sceneRenderer2 = this.$app.withNewComponent('SceneRenderer', 1);
  39984. var panoRenderer2 = this.$app.withNewComponent('PanoRenderer', 1);
  39985. var tileDownloader2 = this.$app.withNewComponent('TileDownloader', {
  39986. $app: this.$app
  39987. });
  39988. tileDownloader2.index = 1;
  39989. sceneRenderer2.renderer = renderer$1;
  39990. tileDownloader2.processPriorityQueue = true; //?
  39991. panoRenderer2.init(sceneRenderer2, tileDownloader2);
  39992. panos2 = new PanoramaCollection();
  39993. panos2.extend(player$5.model.panos.list.map(function (pano) {
  39994. var panoCopy = new Panorama(_this2.$app, pano.id, pano);
  39995. panoCopy.attachToPanoRenderer(panoRenderer2);
  39996. panoCopy.tileDownloader = tileDownloader2;
  39997. panoCopy.qualityManager = _this2.$app.core.get('QualityManager');
  39998. return panoCopy;
  39999. }));
  40000. tileDownloader2.setPanoData(panos2, [], this.$app.core.get('ModelManager').projectNum);
  40001. tileDownloader2.setUrls(player$5.model.urls); //?
  40002. tileDownloader2.start(); //tileDownloader2.tilePrioritizer.updateCriteria(this.panoB)//?
  40003. }
  40004. {
  40005. //添加天空盒
  40006. this.cube = new THREE.Mesh(new THREE.BoxGeometry(10, 10, 10), new ModelTextureMaterial({
  40007. side: THREE.BackSide,
  40008. transparent: false,
  40009. name: 'splitViewCubeMat',
  40010. not_Cube: settings$3.visions == 2 || !player$5.model.supportsTiles //如果有下相机,右侧是单张图,否则和左侧一样
  40011. }, 'skybox'));
  40012. this.cube.name = 'splitView-cube';
  40013. this.cube.layers.set(RenderLayers.SubScreen);
  40014. this.$app.core.get('SceneRenderer').scene.add(this.cube);
  40015. }
  40016. {
  40017. //--event
  40018. player$5.on('updateFromControls', function (player, e) {
  40019. if (_this2.editing) {
  40020. if (_this2.pauseCameraBind) {
  40021. _this2.panoramaCtl.update(e);
  40022. } else {
  40023. _this2.panoramaCtl.lon = player.cameraControls.controls.panorama.lon;
  40024. _this2.panoramaCtl.lat = player.cameraControls.controls.panorama.lat;
  40025. _this2.panoramaCtl.update(e);
  40026. player.cameraControls.controls.panorama.lon = _this2.panoramaCtl.lon;
  40027. player.cameraControls.controls.panorama.lat = _this2.panoramaCtl.lat;
  40028. } //console.log('同步')
  40029. }
  40030. });
  40031. }
  40032. }
  40033. }, {
  40034. key: "enter",
  40035. value: function enter() {
  40036. //开始分屏
  40037. if (this.editing) return;
  40038. this.editing = true;
  40039. this.$app.core.get('SceneRenderer').addComponent(this);
  40040. var camera = player$5.cameraControls.cameras.panorama;
  40041. camera.fov = camera.staticFov = 60;
  40042. this.zoomEnabled = settings$3.zoom.enabled;
  40043. settings$3.zoom.enabled = false; //这个决定滚轮是缩放或者前进
  40044. this.pauseCameraBind = false; //false时两个相机的旋转角度是一致的,互相影响
  40045. this.panoA = player$5.currentPano;
  40046. this.setSize();
  40047. this.setSceneB();
  40048. this.emit('enter');
  40049. player$5.OverlayManager.hide('all');
  40050. player$5.GLTFEditor.hide('all');
  40051. }
  40052. }, {
  40053. key: "leave",
  40054. value: function leave() {
  40055. //结束分屏
  40056. if (!this.editing) return;
  40057. this.$app.core.get('SceneRenderer').removeComponent(this);
  40058. this.emit('leave');
  40059. this.editing = false;
  40060. settings$3.zoom.enabled = this.zoomEnabled;
  40061. player$5.OverlayManager.show('all', true);
  40062. player$5.GLTFEditor.show('all', true);
  40063. player$5.cameraControls.cameras.panorama.staticFov = null;
  40064. if (this.panoB && this.panoB != this.panoA) {
  40065. this.panoB.exit();
  40066. this.panoB.useAtScreenB = false;
  40067. }
  40068. }
  40069. }, {
  40070. key: "setSceneB",
  40071. value: function setSceneB() {
  40072. //设置右屏
  40073. var oldPanoB = this.panoB;
  40074. if (settings$3.visions != 2) {
  40075. this.panoB = this.panoA;
  40076. this.cube.position.copy(this.panoB.position);
  40077. this.panoramaCam.position.copy(this.panoB.position);
  40078. } else if (this.panoB != this.panoA.assistPano) {
  40079. this.panoB = this.panoA.assistPano;
  40080. this.cube.position.copy(this.panoB.position);
  40081. this.panoramaCam.position.copy(this.panoB.position); //隐藏marker
  40082. /* if (!config.isMobile || this.editType != "measure") */
  40083. {
  40084. this.hideMarker && (this.hideMarker.visible = true);
  40085. this.hideMarker = this.panoA.marker;
  40086. this.hideMarker.visible = false;
  40087. }
  40088. }
  40089. this.getTextureForCube(this.panoB);
  40090. this.panoB.useAtScreenB = true;
  40091. if (oldPanoB && oldPanoB != this.panoB) {
  40092. oldPanoB.exit();
  40093. oldPanoB.useAtScreenB = false;
  40094. }
  40095. }
  40096. /*
  40097. 注意:当visions==2时,才有下相机assistPano,而下相机没有tile
  40098. */
  40099. }, {
  40100. key: "getTextureForCube",
  40101. value: function getTextureForCube(pano) {
  40102. var _this3 = this;
  40103. //获取右方贴图
  40104. console.log('getTextureForCube', pano.id);
  40105. var pano = pano || this.panoB;
  40106. if (settings$3.visions != 2 && player$5.model.supportsTiles) {
  40107. pano = panos2.index[pano.id]; //加载tiles贴图需要换成panos2的pano
  40108. }
  40109. /* var wait = player.checkAndWaitForPanoLoad(pano, 'high', 'high', 2048, () => {
  40110. //标准pc:2048
  40111. this.getTextureForCube(pano)
  40112. }) */
  40113. var loaded = function loaded() {
  40114. if (texWaitTimer[_this3.panoB.id]) {
  40115. clearTimeout(texWaitTimer[_this3.panoB.id]);
  40116. delete texWaitTimer[_this3.panoB.id];
  40117. }
  40118. if (pano && _this3.panoB.id != pano.id) {
  40119. console.log('getTextureForCube退出');
  40120. return;
  40121. } //可能加载好就退出或者换到别的点
  40122. console.log('texGetted', pano.id);
  40123. pano.ensureSkyboxReadyForRender();
  40124. var tex = pano.getSkyboxTexture();
  40125. _this3.cube.material.uniforms.pano1Map.value = tex;
  40126. _this3.cube.material.uniforms.pano1Matrix.value.copy(_this3.panoB.matrixWorld);
  40127. };
  40128. if (pano.tiled) {
  40129. //若无下相机,使用和左侧一样的漫游点(的copy), 是tiled
  40130. //先优先加载部分贴图
  40131. var size = 2048,
  40132. d = cameraLight.getHFOVForCamera(player$5.camera, player$5.domElement.clientWidth / 2, player$5.domElement.clientHeight),
  40133. p = player$5.zoomFov,
  40134. r = player$5.getDirection(); //console.log('loadPromise', 'hFov', d, 'vFov',p )
  40135. var loadPromise = pano.loadTiledPano(size, r, {
  40136. hFov: d,
  40137. vFov: p
  40138. }, !1, !1, !0);
  40139. loadPromise.then(function () {
  40140. loaded();
  40141. }); //然后加载所有
  40142. player$5.checkAndWaitForPanoLoad(pano, 'high', 'high', 2048, function () {});
  40143. } else {
  40144. //单张贴图
  40145. if (!player$5.checkAndWaitForPanoLoad(pano, 'high', 'high', 2048, loaded)) {
  40146. loaded();
  40147. } //修改位置时 右侧可能变黑 为何
  40148. }
  40149. /* if (!wait) {
  40150. if (texWaitTimer[this.panoB.id]) {
  40151. clearTimeout(texWaitTimer[this.panoB.id])
  40152. delete texWaitTimer[this.panoB.id]
  40153. }
  40154. if (pano && this.panoB.id != pano.id) {
  40155. console.log('getTextureForCube退出')
  40156. return
  40157. } //可能加载好就退出或者换到别的点
  40158. //$waiting.hide()
  40159. texGetted = true
  40160. console.log('texGetted ')
  40161. pano.ensureSkyboxReadyForRender()
  40162. var tex = pano.getSkyboxTexture()
  40163. this.cube.material.uniforms.pano1Map.value = tex
  40164. this.cube.material.uniforms.pano1Matrix.value.copy(this.panoB.matrixWorld)
  40165. } else {
  40166. if (!texWaitTimer[this.panoB.id]) {
  40167. //如果20秒后还没加载好贴图就停止
  40168. texWaitTimer[this.panoB.id] = setTimeout(() => {
  40169. //$waiting.hide()
  40170. clearTimeout(texWaitTimer[this.panoB.id])
  40171. delete texWaitTimer[this.panoB.id]
  40172. console.log('无法获取贴图,可能网络状态不佳')
  40173. }, 20e3)
  40174. }
  40175. //$waiting.show() // objects.gui.showWaiting(true, "getTextureForCube")
  40176. texGetted = false
  40177. } */
  40178. }
  40179. }, {
  40180. key: "update",
  40181. value: function update() {
  40182. //渲染右屏
  40183. if (!this.editing) return;
  40184. /* objects.tagManager.tagDiscs.forEach((disc) => {
  40185. if (!disc.visible || disc.material.uniforms.opacity.value == 0) return;
  40186. disc.canvasA_Qua = disc.quaternion.clone();
  40187. disc.canvasA_Scale = disc.scale.clone();
  40188. disc.tag.update(player.mode, panoramaCam, player.currentPano, player.flying)
  40189. }) */
  40190. renderer$1.render(this.$app.core.get('SceneRenderer').scene, this.panoramaCam);
  40191. /* objects.tagManager.tagDiscs.forEach((disc) => {
  40192. if (!disc.visible || disc.material.uniforms.opacity.value == 0) return;
  40193. disc.quaternion.copy(disc.canvasA_Qua)
  40194. disc.scale.copy(disc.canvasA_Scale)
  40195. }) */
  40196. }
  40197. }, {
  40198. key: "setSize",
  40199. value: function setSize() {
  40200. //右屏更改大小
  40201. if (!this.editing) return;
  40202. renderer$1.setSize(playerB.clientWidth, playerB.clientHeight, true, Math.min(window.devicePixelRatio, 2));
  40203. this.panoramaCam.updateAspect(playerB.clientWidth / playerB.clientHeight);
  40204. }
  40205. }, {
  40206. key: "changePano",
  40207. value: function changePano(pano) {
  40208. this.panoA = pano;
  40209. }
  40210. }]);
  40211. return SplitView;
  40212. }(EventEmitter);
  40213. var Preloaders = /*#__PURE__*/function () {
  40214. function Preloaders(model, player) {
  40215. _classCallCheck(this, Preloaders);
  40216. this.model = model;
  40217. this.panos = model.panos;
  40218. this.player = player;
  40219. this.retryMinimumTime = 1e4;
  40220. }
  40221. _createClass(Preloaders, [{
  40222. key: "start",
  40223. value: function start() {
  40224. this.loadNextPano(function (e) {
  40225. if (e) {
  40226. this.start();
  40227. } else {
  40228. logger$1.debug('No suitable pano loaded, waiting a little while before looking again');
  40229. setTimeout(function () {
  40230. this.start();
  40231. }.bind(this), 1e3);
  40232. }
  40233. }.bind(this));
  40234. }
  40235. }, {
  40236. key: "validLoadTarget",
  40237. value: function validLoadTarget(e) {
  40238. return e && !e.isLoaded('high') && Date.now() - e.failedLoadingAt > this.retryMinimumTime;
  40239. }
  40240. }, {
  40241. key: "listImagePanos",
  40242. value: function listImagePanos() {
  40243. var e = [],
  40244. t = this;
  40245. this.model.images.forEach(function (i) {
  40246. if (i.metadata && i.metadata.scan_id) {
  40247. var n = t.model.panos.get(i.metadata.scan_id);
  40248. n && !n.isLoaded('high') && e.push(n);
  40249. }
  40250. });
  40251. return e;
  40252. }
  40253. }, {
  40254. key: "loadNextPano",
  40255. value: function loadNextPano(e) {
  40256. var pano,
  40257. i,
  40258. n = this.model.waitQueue.filter(function (e) {
  40259. return e.object instanceof Panorama;
  40260. });
  40261. if (n.length > 0) {
  40262. pano = n[0].object;
  40263. logger$1.debug('Overrode pano selection: Flying to an unloaded pano ' + pano.id);
  40264. } else if (this.validLoadTarget(this.player.currentPano)) {
  40265. pano = this.player.currentPano;
  40266. logger$1.debug('Overrode pano selection: Currently at an unloaded pano ' + pano.id);
  40267. } else if (this.validLoadTarget(this.player.closestPano)) {
  40268. pano = this.player.closestPano;
  40269. logger$1.debug('Overrode pano selection: Hovering over an unloaded pano ' + pano.id);
  40270. } else if (this.player.mode === Viewmode$1.PANORAMA) {
  40271. pano = this.panos.lowestByScore([this.validLoadTarget.bind(this), Panorama.filters.isNeighbourPanoTo(this.player.currentPano)], [Panorama.scoreFunctions.distance(this.player.currentPano), Panorama.scoreFunctions.direction(this.player.position, this.player.getDirection()), Panorama.scoreFunctions.inFieldOfView(this.player.position, this.player.getDirection())]);
  40272. pano && logger$1.debug('Normal pano selection: neighbor ' + pano.id);
  40273. }
  40274. if (pano) {
  40275. i = i || pano.isLoaded('low') ? 'high' : 'low';
  40276. logger$1.debug('Preloading ' + i + '-res pano ' + pano.id);
  40277. console.log('Preloading ' + i + '-res pano ' + pano.id);
  40278. pano.loadCube(i).done(e).fail(function () {
  40279. logger$1.warn('Failed preloading pano', pano.id, ', marking it as failed and forgetting it for a while'), e();
  40280. });
  40281. } else {
  40282. e && e(null);
  40283. }
  40284. }
  40285. }]);
  40286. return Preloaders;
  40287. }();
  40288. function _createForOfIteratorHelper$4(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$4(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  40289. function _unsupportedIterableToArray$4(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$4(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$4(o, minLen); }
  40290. function _arrayLikeToArray$4(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  40291. defineComponent('Scene', function () {
  40292. return /*#__PURE__*/function () {
  40293. function Scene() {
  40294. _classCallCheck(this, Scene);
  40295. this.ready = false;
  40296. this.loaded = false;
  40297. this.tilegen = true; //应该放到setting里
  40298. this.quickstart = false;
  40299. this.position = new THREE.Vector3(15, 10, 15); //默认初始点位置
  40300. this.splitViews = []; //分屏
  40301. // if (this.$app.config.view === false) {
  40302. // this.locked = Deferred()
  40303. // this.$app.store.on('auth', () => {
  40304. // this.locked.resolve()
  40305. // })
  40306. // }
  40307. }
  40308. _createClass(Scene, [{
  40309. key: "beforeLoad",
  40310. value: function beforeLoad() {
  40311. this.$app.withComponent('Screenshot');
  40312. this.$app.withComponent('SceneRenderer');
  40313. this.$app.withComponent('PanoRenderer');
  40314. this.$app.withComponent('PanoVideoRenderer');
  40315. this.$app.withComponent('QualityManager');
  40316. this.$app.withComponent('ModelManager');
  40317. this.$app.withComponent('CameraControls');
  40318. this.$app.withComponent('DisplayController');
  40319. this.$app.withComponent('TileDownloader', {
  40320. concurrentDownloads: this.tilegen ? 6 : 2,
  40321. $app: this.$app
  40322. });
  40323. this.$app.withComponent('Player');
  40324. this.$app.withComponent('Director');
  40325. this.$app.core.get('SceneRenderer').createScene();
  40326. this.$app.core.get('CameraControls').init(this.$app.dom.querySelector('.player'));
  40327. this.$app.core.get('QualityManager').init();
  40328. this.$app.core.get('TileDownloader').init();
  40329. this.$app.core.get('PanoRenderer').init();
  40330. } //启动
  40331. }, {
  40332. key: "start",
  40333. value: function () {
  40334. var _start = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
  40335. var _this = this;
  40336. var auth, metadata, metadataForVideo, _iterator, _step, data, buildScene;
  40337. return regenerator.wrap(function _callee2$(_context2) {
  40338. while (1) {
  40339. switch (_context2.prev = _context2.next) {
  40340. case 0:
  40341. if (!this.ready) {
  40342. _context2.next = 2;
  40343. break;
  40344. }
  40345. return _context2.abrupt("return");
  40346. case 2:
  40347. if (!(this.$app.config.view === false && this.$app.config.useAuth)) {
  40348. _context2.next = 14;
  40349. break;
  40350. }
  40351. _context2.prev = 3;
  40352. _context2.next = 6;
  40353. return this.$app.resource.auth();
  40354. case 6:
  40355. auth = _context2.sent;
  40356. if (!(auth.success == false)) {
  40357. _context2.next = 9;
  40358. break;
  40359. }
  40360. return _context2.abrupt("return");
  40361. case 9:
  40362. _context2.next = 14;
  40363. break;
  40364. case 11:
  40365. _context2.prev = 11;
  40366. _context2.t0 = _context2["catch"](3);
  40367. return _context2.abrupt("return");
  40368. case 14:
  40369. _context2.next = 16;
  40370. return this.$app.resource.metadata();
  40371. case 16:
  40372. metadata = _context2.sent;
  40373. if (!(metadata == void 0)) {
  40374. _context2.next = 19;
  40375. break;
  40376. }
  40377. return _context2.abrupt("return");
  40378. case 19:
  40379. if (!(metadata.filters && metadata.filters == 1)) {
  40380. _context2.next = 22;
  40381. break;
  40382. }
  40383. _context2.next = 22;
  40384. return this.$app.store.get('filters');
  40385. case 22:
  40386. if (!(metadata.cutModel && metadata.cutModel == 1)) {
  40387. _context2.next = 26;
  40388. break;
  40389. }
  40390. _context2.next = 25;
  40391. return this.$app.store.get('cutModel');
  40392. case 25:
  40393. this.$app.store.getValue('metadata').cutModel = _context2.sent;
  40394. case 26:
  40395. // if (metadata.sceneDraw && metadata.sceneDraw == 1) {
  40396. // let data = await this.$app.store.get('sceneDraw')
  40397. // this.$app.store.getValue('metadata').sceneDraw = {
  40398. // data,
  40399. // labelVisible: this.$app.store.getValue('metadata').controls.showDrawTitle,
  40400. // }
  40401. // }
  40402. if (this.$app.store.getValue('metadata').controls.showAllModel === 1) {
  40403. ModelSide.setSide(2);
  40404. } else {
  40405. ModelSide.setSide(null);
  40406. }
  40407. this.beforeLoad(); // 判断是否需要锁住场景不继续加载
  40408. if (!this.$app.Scene.locked) {
  40409. _context2.next = 31;
  40410. break;
  40411. }
  40412. _context2.next = 31;
  40413. return this.$app.Scene.locked;
  40414. case 31:
  40415. // 判断你是否加载单张4k全景图
  40416. if (metadata.sceneKind && metadata.sceneKind == 'pano') {
  40417. this.$app.core.get('Player').model.supportsTiles = false;
  40418. } //是否加载tile图片
  40419. // if (this.$app.core.get('Player').model.supportsTiles)
  40420. this.$app.core.get('TileDownloader').start();
  40421. metadataForVideo = JSON.parse(JSON.stringify(metadata));
  40422. _context2.next = 36;
  40423. return VersionControl.handle(metadataForVideo, this.$app);
  40424. case 36:
  40425. this.$app.core.get('PanoVideoRenderer').init(metadataForVideo.videos);
  40426. /**
  40427. * 加载paint图片
  40428. */
  40429. // console.error("start load", new Date().getTime())
  40430. if (!(metadata.mosaic && metadata.mosaicList && metadata.mosaicList.length)) {
  40431. _context2.next = 57;
  40432. break;
  40433. }
  40434. _iterator = _createForOfIteratorHelper$4(metadata.mosaicList);
  40435. _context2.prev = 39;
  40436. _iterator.s();
  40437. case 41:
  40438. if ((_step = _iterator.n()).done) {
  40439. _context2.next = 49;
  40440. break;
  40441. }
  40442. data = _step.value;
  40443. _context2.t1 = data.fileName;
  40444. if (!_context2.t1) {
  40445. _context2.next = 47;
  40446. break;
  40447. }
  40448. _context2.next = 47;
  40449. return texture.loadWithoutUpdate(this.$app.resource.getUserResourceURL(data.fileName));
  40450. case 47:
  40451. _context2.next = 41;
  40452. break;
  40453. case 49:
  40454. _context2.next = 54;
  40455. break;
  40456. case 51:
  40457. _context2.prev = 51;
  40458. _context2.t2 = _context2["catch"](39);
  40459. _iterator.e(_context2.t2);
  40460. case 54:
  40461. _context2.prev = 54;
  40462. _iterator.f();
  40463. return _context2.finish(54);
  40464. case 57:
  40465. _context2.next = 59;
  40466. return this.$app.resource.visions();
  40467. case 59:
  40468. //步骤1
  40469. this.initPanos(metadata); //解析漫游点,步骤1的延伸
  40470. this.$app.FilterManager.initFilters(); // 初始化滤镜数据
  40471. _context2.next = 63;
  40472. return this.isQuick(metadata);
  40473. case 63:
  40474. //步骤2 Quick Start
  40475. /**
  40476. * 基础资源已准备完毕
  40477. */
  40478. this.$app.Scene.emit('ready');
  40479. this.ready = true;
  40480. buildScene = /*#__PURE__*/function () {
  40481. var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  40482. return regenerator.wrap(function _callee$(_context) {
  40483. while (1) {
  40484. switch (_context.prev = _context.next) {
  40485. case 0:
  40486. _context.next = 2;
  40487. return _this.$app.resource.flooruser();
  40488. case 2:
  40489. _this.$app.core.get('SceneRenderer').addComponent(transitions$1); //将加载的模型构建好以便于直接使用
  40490. _this.$app.core.get('Player').model.build();
  40491. _this.afterLoad();
  40492. if (!_this.$app.core.get('Player').model.supportsTiles) {
  40493. new Preloaders(_this.$app.core.get('Player').model, _this.$app.core.get('Player')).start();
  40494. }
  40495. _context.next = 8;
  40496. return _this.loadPanos();
  40497. case 8:
  40498. case "end":
  40499. return _context.stop();
  40500. }
  40501. }
  40502. }, _callee);
  40503. }));
  40504. return function buildScene() {
  40505. return _ref.apply(this, arguments);
  40506. };
  40507. }();
  40508. if (!(metadata.modelKind === '3dtiles')) {
  40509. _context2.next = 72;
  40510. break;
  40511. }
  40512. _context2.next = 69;
  40513. return this.$app.resource.modelmesh3dTiles();
  40514. case 69:
  40515. //步骤3
  40516. this.$app.Scene.on('3dTilesLoaded', buildScene);
  40517. _context2.next = 78;
  40518. break;
  40519. case 72:
  40520. _context2.next = 74;
  40521. return this.$app.resource.modelmeshDam();
  40522. case 74:
  40523. _context2.next = 76;
  40524. return this.$app.resource.textures();
  40525. case 76:
  40526. _context2.next = 78;
  40527. return buildScene();
  40528. case 78:
  40529. case "end":
  40530. return _context2.stop();
  40531. }
  40532. }
  40533. }, _callee2, this, [[3, 11], [39, 51, 54, 57]]);
  40534. }));
  40535. function start() {
  40536. return _start.apply(this, arguments);
  40537. }
  40538. return start;
  40539. }()
  40540. }, {
  40541. key: "isQuick",
  40542. value: function () {
  40543. var _isQuick = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(metadata) {
  40544. return regenerator.wrap(function _callee3$(_context3) {
  40545. while (1) {
  40546. switch (_context3.prev = _context3.next) {
  40547. case 0:
  40548. if (!this.firstView.quickstart) {
  40549. _context3.next = 3;
  40550. break;
  40551. }
  40552. _context3.next = 3;
  40553. return this.quickEnter(this.firstView, metadata
  40554. /* , startOption */
  40555. );
  40556. case 3:
  40557. case "end":
  40558. return _context3.stop();
  40559. }
  40560. }
  40561. }, _callee3, this);
  40562. }));
  40563. function isQuick(_x) {
  40564. return _isQuick.apply(this, arguments);
  40565. }
  40566. return isQuick;
  40567. }()
  40568. }, {
  40569. key: "loadPanos",
  40570. value: function () {
  40571. var _loadPanos = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5() {
  40572. var _this2 = this;
  40573. var loadData;
  40574. return regenerator.wrap(function _callee5$(_context5) {
  40575. while (1) {
  40576. switch (_context5.prev = _context5.next) {
  40577. case 0:
  40578. _context5.next = 2;
  40579. return this.$app.core.get('Player').start(this.firstView);
  40580. case 2:
  40581. if (this.firstView.quickstart) {
  40582. this.$app.core.get('SceneRenderer').removeComponent(this.$app.core.get('QuickstartManager'));
  40583. this.$app.core.get('QuickstartManager').destroy();
  40584. } // 第一个点位加载完后执行
  40585. this.loaded = true;
  40586. this.$app.Scene.emit('loaded', this.$app.core.get('Player').currentPano); //-------这两个争取addComponent在最后-------
  40587. this.$app.core.get('TileDownloader').useComponent();
  40588. this.$app.core.get('SceneRenderer').addComponent(this.$app.core.get('PanoRenderer'), true); //------------------------------------------
  40589. loadData = /*#__PURE__*/function () {
  40590. var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4() {
  40591. return regenerator.wrap(function _callee4$(_context4) {
  40592. while (1) {
  40593. switch (_context4.prev = _context4.next) {
  40594. case 0:
  40595. _context4.next = 2;
  40596. return _this2.$app.store.get('tags');
  40597. case 2:
  40598. _context4.next = 4;
  40599. return _this2.$app.store.get('tours');
  40600. case 4:
  40601. _context4.next = 6;
  40602. return _this2.$app.store.get('links');
  40603. case 6:
  40604. _context4.next = 8;
  40605. return _this2.$app.store.get('cameras');
  40606. case 8:
  40607. _context4.next = 10;
  40608. return _this2.$app.store.get('billboards');
  40609. case 10:
  40610. _context4.next = 12;
  40611. return _this2.$app.store.get('cutModel');
  40612. case 12:
  40613. _context4.next = 14;
  40614. return _this2.$app.store.get('sceneDraw');
  40615. case 14:
  40616. // await this.$app.store.get('filters')
  40617. // await this.$app.store.get('mosaics')
  40618. _this2.$app.Scene.emit('loadeddata');
  40619. logSth(_this2.$app);
  40620. case 16:
  40621. case "end":
  40622. return _context4.stop();
  40623. }
  40624. }
  40625. }, _callee4);
  40626. }));
  40627. return function loadData() {
  40628. return _ref2.apply(this, arguments);
  40629. };
  40630. }(); // TRANSITIONING时loadData会造成动画卡顿
  40631. if (!(this.$app.core.get('Player').mode !== Viewmode$1.TRANSITIONING)) {
  40632. _context5.next = 13;
  40633. break;
  40634. }
  40635. _context5.next = 11;
  40636. return loadData();
  40637. case 11:
  40638. _context5.next = 14;
  40639. break;
  40640. case 13:
  40641. this.$app.Camera.once('mode.afterChange', loadData);
  40642. case 14:
  40643. case "end":
  40644. return _context5.stop();
  40645. }
  40646. }
  40647. }, _callee5, this);
  40648. }));
  40649. function loadPanos() {
  40650. return _loadPanos.apply(this, arguments);
  40651. }
  40652. return loadPanos;
  40653. }()
  40654. }, {
  40655. key: "initPanos",
  40656. value: function initPanos(metadata) {
  40657. this.startSceneRenderer();
  40658. var model = this.$app.core.get('Player').model;
  40659. this.$app.core.get('ModelManager').init();
  40660. this.$app.core.get('ModelManager').addModel(model);
  40661. this.firstView = new FirstView(metadata, model.panos);
  40662. this.firstView.quickstart = true;
  40663. }
  40664. }, {
  40665. key: "afterLoad",
  40666. value: function afterLoad() {
  40667. this.$app.core.get('SceneRenderer').scene.add(this.$app.core.get('Player').model);
  40668. this.$app.core.get('Player').init();
  40669. this.$app.core.get('Player').setScene();
  40670. this.$app.core.get('DisplayController').init();
  40671. effects$1.bindEvents(this.$app.core.get('Player'));
  40672. this.$app.core.get('SceneRenderer').addComponent(this.$app.core.get('Player'));
  40673. automation.init(this.$app.core.get('Director'), this.$app.core.get('CameraControls'), this.$app.core.get('Player'), this.$app.core.get('ModelManager'), this.$app.core.get('SceneRenderer'));
  40674. }
  40675. }, {
  40676. key: "startSceneRenderer",
  40677. value: function startSceneRenderer() {
  40678. if (this.$app.core.get('SceneRenderer').started) return;
  40679. try {
  40680. this.$app.core.get('SceneRenderer').start(this.$app.dom.querySelector('.player'));
  40681. } catch (msg) {
  40682. logger$1.error(msg.message);
  40683. } // 单实例才允许VR
  40684. if (this.$app.uid == 1 && this.$app.config.mobile) {
  40685. VR$1.Init(this.$app.core.get('SceneRenderer'), this.$app.core.get('Player'));
  40686. }
  40687. }
  40688. }, {
  40689. key: "quickEnter",
  40690. value: function () {
  40691. var _quickEnter = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee6(firstView, metadata) {
  40692. var _this3 = this;
  40693. var control, quickstartManager;
  40694. return regenerator.wrap(function _callee6$(_context6) {
  40695. while (1) {
  40696. switch (_context6.prev = _context6.next) {
  40697. case 0:
  40698. //logger.warn('Quickstart engaged. Hold on to your knickers.')
  40699. //var control = this.$app.core.get('CameraControls').controls[Viewmode.PANORAMA]
  40700. this.$app.core.get('CameraControls').activateControls(Viewmode$1.PANORAMA);
  40701. control = this.$app.core.get('CameraControls').controls[Viewmode$1.PANORAMA];
  40702. this.$app.withComponent('QuickstartManager', this.$app.core.get('QualityManager'), this.$app.core.get('SceneRenderer').scene, this.$app.core.get('SceneRenderer').camera, control);
  40703. quickstartManager = this.$app.core.get('QuickstartManager'); //quickstartManager.init(firstView, metadata)
  40704. _context6.next = 6;
  40705. return quickstartManager.load(firstView);
  40706. case 6:
  40707. this.$app.core.get('SceneRenderer').addComponent(quickstartManager);
  40708. this.$app.core.get('SceneRenderer').once(SceneRendererEvents.AfterRender, function () {
  40709. logger$1.info("".concat(_this3.$app.config.num, "First render after quickstart load finished."));
  40710. });
  40711. case 8:
  40712. case "end":
  40713. return _context6.stop();
  40714. }
  40715. }
  40716. }, _callee6, this);
  40717. }));
  40718. function quickEnter(_x2, _x3) {
  40719. return _quickEnter.apply(this, arguments);
  40720. }
  40721. return quickEnter;
  40722. }()
  40723. /**
  40724. * 拆分
  40725. */
  40726. }, {
  40727. key: "getSplit",
  40728. value: function () {
  40729. var _getSplit = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee7(editType, split) {
  40730. return regenerator.wrap(function _callee7$(_context7) {
  40731. while (1) {
  40732. switch (_context7.prev = _context7.next) {
  40733. case 0:
  40734. this.$app.dom.classList.add('kankan-app__split');
  40735. _context7.prev = 1;
  40736. _context7.next = 4;
  40737. return this.$app.resource.visions2();
  40738. case 4:
  40739. _context7.next = 9;
  40740. break;
  40741. case 6:
  40742. _context7.prev = 6;
  40743. _context7.t0 = _context7["catch"](1);
  40744. logger$1.warn("".concat(this.$app.config.num, "[load visions2] fail"));
  40745. case 9:
  40746. //splitViews由许钟文定义
  40747. if (!this.splitViews[editType]) {
  40748. this.splitViews[editType] = new SplitView(this.$app, editType);
  40749. }
  40750. split && this.splitViews[editType].enter();
  40751. return _context7.abrupt("return", this.splitViews[editType]);
  40752. case 12:
  40753. case "end":
  40754. return _context7.stop();
  40755. }
  40756. }
  40757. }, _callee7, this, [[1, 6]]);
  40758. }));
  40759. function getSplit(_x4, _x5) {
  40760. return _getSplit.apply(this, arguments);
  40761. }
  40762. return getSplit;
  40763. }()
  40764. /**
  40765. * 还原
  40766. */
  40767. }, {
  40768. key: "restore",
  40769. value: function restore(editType) {
  40770. this.$app.dom.classList.remove('kankan-app__split');
  40771. this.splitViews[editType].leave();
  40772. }
  40773. }]);
  40774. return Scene;
  40775. }();
  40776. });
  40777. function logSth(app) {
  40778. var player = app.core.get('Player');
  40779. var tagCount = app.TagManager.tags.length;
  40780. var chunkLen = player.model.chunks.length;
  40781. var vertexC = player.model.chunks.reduce(function (total, chunk) {
  40782. return total + chunk.geometry.attributes.position.count;
  40783. }, 0);
  40784. var texSizeBlock = player.model.texSizeBlock;
  40785. var panoCount = player.model.panos.list.length;
  40786. var videoPanoCount = player.model.panos.list.filter(function (p) {
  40787. return p.hasVideo;
  40788. }).length;
  40789. var overlayCount = player.OverlayManager.group.children.length;
  40790. var overlayVideoCount = player.OverlayManager.group.children.filter(function (e) {
  40791. return e.info.type == 'video';
  40792. }).length;
  40793. var views = Object.keys(player.viewLinkManager.views);
  40794. var viewLinkCount = views.length;
  40795. var viewPanoLinkCount = views.filter(function (e) {
  40796. return player.viewLinkManager.views[e].linkType == 'pano';
  40797. }).length;
  40798. console.log('%c'.concat("\u5171\u6709\u521D\u59CBchunk ".concat(chunkLen, " \u4E2A ( \u9876\u70B9\u6570 ").concat(vertexC, " )\n \u6A21\u578B\u8D34\u56FE\u5C3A\u5BF8\u662F512\u7684 ").concat(texSizeBlock, " \u500D\u6570 \n \u70ED\u70B9 ").concat(tagCount, " \u4E2A \n \u6F2B\u6E38\u70B9 ").concat(panoCount, " \u4E2A ( \u89C6\u9891\u6F2B\u6E38\u70B9 ").concat(videoPanoCount, " \u4E2A )\n overlay ").concat(overlayCount, " \u4E2A ( \u89C6\u9891\u7C7B\u578B ").concat(overlayVideoCount, " \u4E2A )\n viewLink ").concat(viewLinkCount, " \u4E2A ( pano\u7C7B\u578B ").concat(viewPanoLinkCount, " \u4E2A )\n ")), 'color:#FF4399');
  40799. }
  40800. /**
  40801. * 解压采用protobuf的方式压缩的文件,比如:dam,vision.modeldata
  40802. */
  40803. var Deompress = {
  40804. damPro: Base64.decode('bWVzc2FnZSBiaW5hcnlfbWVzaCB7CglyZXBlYXRlZCBjaHVua19zaW1wbGUgY2h1bmsgPSAxOwoJcmVwZWF0ZWQgY2h1bmtfcXVhbnRpemVkIHF1YW50aXplZF9jaHVuayA9IDI7Cn0KCi8vIERlZmluaXRpb24gb2YgdmVydGljZXM6IDNEIGNvb3JkaW5hdGVzLCBhbmQgMkQgdGV4dHVyZSBjb29yZGluYXRlcy4KbWVzc2FnZSB2ZXJ0aWNlc19zaW1wbGUgewoJcmVwZWF0ZWQgZmxvYXQgeHl6ID0gMSBbcGFja2VkPXRydWVdOyAgLy8geF8wLHlfMCx6XzAsIHhfMSx5XzEsel8xLCAuLi4KCXJlcGVhdGVkIGZsb2F0IHV2ID0gMiBbcGFja2VkPXRydWVdOyAgLy8gdV8wLHZfMCwgdV8xLHZfMSwgLi4uCn0KCi8vIEluZGV4ZXMgb2YgdmVydGljZXMgb2YgZmFjZXMKbWVzc2FnZSBmYWNlc19zaW1wbGUgewoJcmVwZWF0ZWQgdWludDMyIGZhY2VzID0gMSBbcGFja2VkPXRydWVdOyAvLyBpMDAsaTAxLGkwMiwgaTEwLGkxMSxpMTIsIC4uLgp9CgovLyBBIHNpbXBseSBlbmNvZGVkIGNodW5rLgovLyBUT0RPOiBhZGQgY2h1bmsgcHJvcGVyaXRlcyAoc3VjaCBhcyAicmVmbGVjdGl2ZSIpCm1lc3NhZ2UgY2h1bmtfc2ltcGxlIHsKCW9wdGlvbmFsIHZlcnRpY2VzX3NpbXBsZSB2ZXJ0aWNlcyA9IDE7CglvcHRpb25hbCBmYWNlc19zaW1wbGUgZmFjZXMgPSAyOwoJb3B0aW9uYWwgc3RyaW5nIGNodW5rX25hbWUgPSAzOwoJb3B0aW9uYWwgc3RyaW5nIG1hdGVyaWFsX25hbWUgPSA0Owp9CgovLyBRdWFudGl6ZWQgdmVyc2lvbnMgZm9sbG93OgptZXNzYWdlIHZlcnRpY2VzX3F1YW50aXplZCB7CglvcHRpb25hbCBmbG9hdCBxdWFudGl6YXRpb24gPSAxOwoJcmVwZWF0ZWQgZmxvYXQgdHJhbnNsYXRpb24gPSAyOwoJcmVwZWF0ZWQgc2ludDMyIHggPSAzIFtwYWNrZWQ9dHJ1ZV07CglyZXBlYXRlZCBzaW50MzIgeSA9IDQgW3BhY2tlZD10cnVlXTsKCXJlcGVhdGVkIHNpbnQzMiB6ID0gNSBbcGFja2VkPXRydWVdOwp9CgptZXNzYWdlIHV2X3F1YW50aXplZCB7CglvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CglvcHRpb25hbCBmbG9hdCBxdWFudGl6YXRpb24gPSAyOwoJcmVwZWF0ZWQgc2ludDMyIHUgPSAzIFtwYWNrZWQ9dHJ1ZV07CglyZXBlYXRlZCBzaW50MzIgdiA9IDQgW3BhY2tlZD10cnVlXTsKfQoKLy8gSW5kZXhlcyBvZiB2ZXJ0aWNlcyBvZiBmYWNlcwptZXNzYWdlIGZhY2VzX2NvbXByZXNzZWQgewoJcmVwZWF0ZWQgc2ludDMyIGZhY2VzID0gMSBbcGFja2VkPXRydWVdOyAvLyBpMDAsaTAxLGkwMiwgaTEwLGkxMSxpMTIsIC4uLgp9CgptZXNzYWdlIGNodW5rX3F1YW50aXplZCB7CglvcHRpb25hbCBzdHJpbmcgY2h1bmtfbmFtZSA9IDE7CglvcHRpb25hbCBzdHJpbmcgbWF0ZXJpYWxfbmFtZSA9IDI7CglvcHRpb25hbCB2ZXJ0aWNlc19xdWFudGl6ZWQgdmVydGljZXMgPSAzOwoJcmVwZWF0ZWQgdXZfcXVhbnRpemVkIHV2cyA9IDQ7CglvcHRpb25hbCBmYWNlc19zaW1wbGUgZmFjZXMgPSA1Owp9Cg=='),
  40805. visionmodeldataPro: Base64.decode( //'Ly8KLy8gUHJvdG9jb2wgQnVmZmVyIGZvciBwdWNrIHZpc2liaWxpdHkgYW5kIHJlbGF0ZWQgZGF0YQovLwovL3BhY2thZ2UgZW9zLnN0b3JhZ2U7CgovLyBpbXBvcnQgImVvcy9pbmZyYS9jb21tb24ucHJvdG8iOwovLyBUaGUgZm9sbG93aW5nIHdlcmUgbWFudWFsbHkgZXh0cmFjdGVkIGhlcmUsIEpTIGRvZXMgbm90IGxpa2UgcHJvdG9idWYgaW1wb3J0cwoKbWVzc2FnZSBBZmZpbmUzZiB7CglvcHRpb25hbCBRdWF0ZXJuaW9uZiByb3RhdGlvbiA9IDE7CglvcHRpb25hbCBWZWN0b3IzZiB0cmFuc2xhdGlvbiA9IDI7Cn0KCm1lc3NhZ2UgUXVhdGVybmlvbmYgewoJb3B0aW9uYWwgZmxvYXQgdyA9IDE7CglvcHRpb25hbCBmbG9hdCB4ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHkgPSAzOwoJb3B0aW9uYWwgZmxvYXQgeiA9IDQ7Cn0KCm1lc3NhZ2UgVmVjdG9yM2YgewoJb3B0aW9uYWwgZmxvYXQgeCA9IDE7CglvcHRpb25hbCBmbG9hdCB5ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHogPSAzOwp9CgovLwovLyBPbmUgc3dlZXAgLyBwYW5vCi8vCm1lc3NhZ2UgU3dlZXBMb2NhdGlvbiB7CglvcHRpb25hbCBieXRlcyB1dWlkID0gMTsgIC8qIHV1aWQgKi8KCW9wdGlvbmFsIEFmZmluZTNmIHBvc2UgPSAyOyAgLyogY2FtZXJhIHBvc2UgKHgsIHkseikgaW4gbWV0ZXIgYW5kIGEgcXVhdGVybmlvbiovCglvcHRpb25hbCBWZWN0b3IzZiBwdWNrID0gMzsgIC8qIHB1Y2sgbG9jYXRpb24gLSB4IGFueSBpcyBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgcG9zZSwgeiBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBjbG9zZXN0IGZsb29yIHVuZGVyIHRoZSBjYW1lcmEgKi8KCW9wdGlvbmFsIGludDMyIGdyb3VwID0gNDsgIC8qIGZsb29yIGluZGV4ICovCglvcHRpb25hbCBpbnQzMiBzdWJncm91cCA9IDU7ICAvKiByb29tIGluZGV4ICovCglyZXBlYXRlZCBpbnQzMiB2aXNpYmxlcyA9IDY7ICAvKiBsaXN0IG9mIGluZGljZXMgdG8gYWxsIHB1Y2tzIHZpc2libGUgZnJvbSB0aGlzIHB1Y2sgKi8KCXJlcGVhdGVkIGZsb2F0IHNjb3JlcyA9IDc7IC8qIHVzZWQgYXMgcGFydCBvZiBzY29yaW5nIGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB3aGljaCBwdWNrIHRvIGdvIHRvIG5leHQgKi8KfQoKLy8KLy8gQWxsIHB1Y2tzIGluIGEgbW9kZWwuIFB1Y2tzIGFyZSBzdG9yZWQgaW4gc2Nhbm5pbmcgb3JkZXIuCi8vCm1lc3NhZ2UgTmF2aWdhdGlvbkluZm8gewoJcmVwZWF0ZWQgU3dlZXBMb2NhdGlvbiBzd2VlcExvY2F0aW9ucyA9IDE7Cn0K'
  40806. 'Ly8KLy8gUHJvdG9jb2wgQnVmZmVyIGZvciBwdWNrIHZpc2liaWxpdHkgYW5kIHJlbGF0ZWQgZGF0YQovLwovL3BhY2thZ2UgZW9zLnN0b3JhZ2U7CgovLyBpbXBvcnQgImVvcy9pbmZyYS9jb21tb24ucHJvdG8iOwovLyBUaGUgZm9sbG93aW5nIHdlcmUgbWFudWFsbHkgZXh0cmFjdGVkIGhlcmUsIEpTIGRvZXMgbm90IGxpa2UgcHJvdG9idWYgaW1wb3J0cwoKbWVzc2FnZSBBZmZpbmUzZiB7CglvcHRpb25hbCBRdWF0ZXJuaW9uZiByb3RhdGlvbiA9IDE7CglvcHRpb25hbCBWZWN0b3IzZiB0cmFuc2xhdGlvbiA9IDI7Cn0KCm1lc3NhZ2UgUXVhdGVybmlvbmYgewoJb3B0aW9uYWwgZmxvYXQgdyA9IDE7CglvcHRpb25hbCBmbG9hdCB4ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHkgPSAzOwoJb3B0aW9uYWwgZmxvYXQgeiA9IDQ7Cn0KCm1lc3NhZ2UgVmVjdG9yM2YgewoJb3B0aW9uYWwgZmxvYXQgeCA9IDE7CglvcHRpb25hbCBmbG9hdCB5ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHogPSAzOwp9CgovLwovLyBPbmUgc3dlZXAgLyBwYW5vCi8vCm1lc3NhZ2UgU3dlZXBMb2NhdGlvbiB7CglvcHRpb25hbCBieXRlcyB1dWlkID0gMTsgIC8qIHV1aWQgKi8KCW9wdGlvbmFsIEFmZmluZTNmIHBvc2UgPSAyOyAgLyogY2FtZXJhIHBvc2UgKHgsIHkseikgaW4gbWV0ZXIgYW5kIGEgcXVhdGVybmlvbiovCglvcHRpb25hbCBWZWN0b3IzZiBwdWNrID0gMzsgIC8qIHB1Y2sgbG9jYXRpb24gLSB4IGFueSBpcyBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgcG9zZSwgeiBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBjbG9zZXN0IGZsb29yIHVuZGVyIHRoZSBjYW1lcmEgKi8KCW9wdGlvbmFsIGludDMyIGdyb3VwID0gNDsgIC8qIGZsb29yIGluZGV4ICovCglvcHRpb25hbCBpbnQzMiBzdWJncm91cCA9IDU7ICAvKiByb29tIGluZGV4ICovCglyZXBlYXRlZCBpbnQzMiB2aXNpYmxlcyA9IDY7ICAvKiBsaXN0IG9mIGluZGljZXMgdG8gYWxsIHB1Y2tzIHZpc2libGUgZnJvbSB0aGlzIHB1Y2sgKi8KCXJlcGVhdGVkIGludDMyIHZpc2libGVzMiA9IDc7IAoJcmVwZWF0ZWQgaW50MzIgdmlzaWJsZXMzID0gODsKfQoKLy8KLy8gQWxsIHB1Y2tzIGluIGEgbW9kZWwuIFB1Y2tzIGFyZSBzdG9yZWQgaW4gc2Nhbm5pbmcgb3JkZXIuCi8vCm1lc3NhZ2UgTmF2aWdhdGlvbkluZm8gewoJcmVwZWF0ZWQgU3dlZXBMb2NhdGlvbiBzd2VlcExvY2F0aW9ucyA9IDE7Cn0='),
  40807. decoderMesh() {
  40808. var builderMesh = dcodeIO.ProtoBuf.loadProto(this.damPro);
  40809. return builderMesh.build('binary_mesh');
  40810. },
  40811. decoderModeldata() {
  40812. var builderModeldata = dcodeIO.ProtoBuf.loadProto(this.visionmodeldataPro);
  40813. return builderModeldata.build('NavigationInfo');
  40814. },
  40815. decompressMesh(content) {
  40816. var data = null;
  40817. try {
  40818. data = this.decoderMesh().decode(content);
  40819. } catch (k) {
  40820. logger$1.error('failed parsing proto for .dam');
  40821. return null;
  40822. }
  40823. return data;
  40824. },
  40825. decompressModeldata(content) {
  40826. var data = null;
  40827. try {
  40828. data = this.decoderModeldata().decode(content);
  40829. } catch (k) {
  40830. logger$1.error('failed parsing proto for .modeldata');
  40831. return null;
  40832. }
  40833. return data;
  40834. }
  40835. };
  40836. function _createSuper$G(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$G(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  40837. function _isNativeReflectConstruct$G() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  40838. /*
  40839. meshObject = {
  40840. geometry: i,
  40841. textureName: e.material_name,
  40842. name: e.chunk_name,
  40843. meshUrl: t
  40844. }
  40845. */
  40846. //模型会分成多个chunk
  40847. var Chunk = /*#__PURE__*/function (_THREE$Mesh) {
  40848. _inherits(Chunk, _THREE$Mesh);
  40849. var _super = _createSuper$G(Chunk);
  40850. function Chunk(meshObject) {
  40851. var _this;
  40852. _classCallCheck(this, Chunk);
  40853. var materialInside = new ModelTextureMaterial({
  40854. side: THREE.DoubleSide
  40855. });
  40856. _this = _super.call(this, meshObject.geometry, materialInside);
  40857. _this.materialInside = materialInside;
  40858. var uniform = THREE.UniformsUtils.clone(shaders.modelOutside.uniforms);
  40859. _this.materialOutside = new THREE.RawShaderMaterial({
  40860. fragmentShader: shaders.modelOutside.fragmentShader,
  40861. vertexShader: shaders.modelOutside.vertexShader,
  40862. uniforms: uniform,
  40863. side: THREE.FrontSide,
  40864. name: 'chunkOut',
  40865. transparent: true //只有设置了透明才能使用renderOrder 和 depthTest
  40866. });
  40867. _this.materialOutside.extraValues = {}; //xzw add
  40868. _this.name = meshObject.name || '';
  40869. _this.meshUrl = meshObject.meshUrl;
  40870. _this.tileId = meshObject.tileId;
  40871. if (meshObject.tileId) {
  40872. _this.materialInside.defines['Is3dTiles'] = 1;
  40873. _this.materialOutside.defines['Is3dTiles'] = 1;
  40874. }
  40875. if (meshObject.textureName) _this.textureName = meshObject.textureName;else _this.setTextureMap(meshObject.texture);
  40876. _this.isChunk = true;
  40877. return _this;
  40878. }
  40879. _createClass(Chunk, [{
  40880. key: "setTextureMap",
  40881. value: function setTextureMap(texture) {
  40882. this.materialInside.uniforms.map.value = texture;
  40883. this.materialOutside.uniforms.map.value = texture;
  40884. }
  40885. }, {
  40886. key: "setMode",
  40887. value: function setMode(mode) {
  40888. var modeTran = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '-';
  40889. //mode可能是transitioning
  40890. /* let getExtValue = (name)=>{//因为opacity两个材质都有 ,在其他地方设置后会被这里覆盖
  40891. return material.extraValues && material.extraValues[name] != void 0 ? material.extraValues[name] : this.material.uniforms[name].value
  40892. } */
  40893. modeTran.split('-')[0];
  40894. modeTran.split('-')[1];
  40895. var material = this.materialInside;
  40896. if ((mode === Viewmode$1.DOLLHOUSE || mode === Viewmode$1.FLOORPLAN) && !(mode == 'transitioning' && modeTran.includes(Viewmode$1.PANORAMA))) {
  40897. //xzw改:当dollhouse和floorplan转换时也用outside. 飞出飞入时都是materialInside
  40898. material = this.materialOutside;
  40899. }
  40900. if (mode === Viewmode$1.PANORAMA) {
  40901. material.side = THREE.DoubleSide; // material.side = THREE.BackSide
  40902. } else {
  40903. material.side = THREE.FrontSide;
  40904. }
  40905. if (ModelSide.side !== null) {
  40906. material.side = ModelSide.side;
  40907. } //material.transparent = this.material.transparent
  40908. //material.uniforms.opacity.value = getExtValue('opacity')
  40909. this.material = material;
  40910. }
  40911. }]);
  40912. return Chunk;
  40913. }(THREE.Mesh);
  40914. /*
  40915. * @Author: Rindy
  40916. * @Date: 2021-05-13 17:27:29
  40917. * @LastEditors: Rindy
  40918. * @LastEditTime: 2021-05-27 16:30:31
  40919. * @Description: Process
  40920. */
  40921. var Process = {
  40922. //读入dam文件后,需要进行处理才能转换成mesh,方法如下:
  40923. //loaddata和e一样
  40924. convertProtobufToSceneObject: function convertProtobufToSceneObject(app, loaddata, prefixTexture) {
  40925. // function getMaterial(imgUrl) {
  40926. // imgUrl in materails || (materails[imgUrl] = new THREE.MeshBasicMaterial({
  40927. // map: THREE.ImageUtils.loadTexture(imgUrl)
  40928. // }));
  40929. // return materails[imgUrl];
  40930. // }
  40931. function getMesh(chunk) {
  40932. var geometry = new THREE.BufferGeometry();
  40933. geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(chunk.vertices.xyz, 0, 3), 3));
  40934. chunk.vertices.uv.length > 0 && geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(chunk.vertices.uv, 0, 2), 2));
  40935. geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(chunk.faces.faces, 0, 1), 1));
  40936. geometry.applyMatrix4(matrix);
  40937. geometry.computeBoundingBox();
  40938. var meshUrl = settings$3.job + settings$3.format;
  40939. if (config$4.model.name) {
  40940. meshUrl = config$4.model.name;
  40941. }
  40942. return new Chunk({
  40943. geometry: geometry,
  40944. textureName: chunk.material_name,
  40945. name: chunk.chunk_name,
  40946. meshUrl: app.resource.getViewImagesURL(meshUrl) //app.resource.getViewImagesURL(settings.job + settings.format),
  40947. }); // var mesh = new THREE.Mesh(geometry,getMaterial(prefixTexture + chunk.material_name));
  40948. // mesh.name = chunk.chunk_name;
  40949. // logger.warn("No chunks in damfile...");
  40950. // return mesh;
  40951. }
  40952. if (0 == loaddata.chunk.length) {
  40953. logger$1.warn('No chunks in damfile...');
  40954. return null;
  40955. }
  40956. var matrix = new THREE.Matrix4();
  40957. matrix.set(1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1); //var materails = {};
  40958. return loaddata.chunk.map(getMesh);
  40959. },
  40960. //vision.modeldata的数据不能直接用,需要转换,方法如下:
  40961. visionModeldata: function visionModeldata(loaddata) {
  40962. loaddata.sweepLocations.forEach(function (s) {
  40963. //许钟文 add 将某些旧场景visibles3为[]的改成至少包含visibles的所有
  40964. s.visibles3 = s.visibles3 || [];
  40965. s.visibles.forEach(function (v) {
  40966. s.visibles3.indexOf(v) == -1 && s.visibles3.push(v);
  40967. });
  40968. }); //------有的场景非4dkk拍摄、手动上传的,visibles2可能都是[],那么就转化为null,这样flying时才会有模型 by许钟文
  40969. var hasVisibles2;
  40970. for (var len = loaddata.sweepLocations.length, ss = 0; ss < len; ss++) {
  40971. var v = loaddata.sweepLocations[ss].visibles2 && loaddata.sweepLocations[ss].visibles2.length || 0;
  40972. if (v > 0) {
  40973. hasVisibles2 = true;
  40974. break;
  40975. }
  40976. }
  40977. if (!hasVisibles2) {
  40978. loaddata.sweepLocations.forEach(function (s) {
  40979. s.visibles2 = null;
  40980. });
  40981. logger$1.info('检测到疑似没有noblock数据,应该是手动上传,block置空');
  40982. } //-------------------
  40983. var modeldata = loaddata.sweepLocations.map(function (n, i) {
  40984. return {
  40985. uuid: n.uuid.toUTF8().replace(/-/g, ''),
  40986. position: {
  40987. x: n.pose.translation.x,
  40988. y: n.pose.translation.y,
  40989. z: n.pose.translation.z
  40990. },
  40991. quaternion: {
  40992. x: n.pose.rotation.x,
  40993. y: n.pose.rotation.y,
  40994. z: n.pose.rotation.z,
  40995. w: n.pose.rotation.w
  40996. },
  40997. puck: {
  40998. x: n.puck.x,
  40999. y: n.puck.y,
  41000. z: n.puck.z
  41001. },
  41002. //floor: n.group,
  41003. alignmentType: n.alignment_type,
  41004. neighbours: n.visibles3 || n.visibles,
  41005. noBlocks: n.visibles2,
  41006. // 过渡时出模型的点
  41007. seeMarkers: n.visibles,
  41008. //可以看见marker及热点的点
  41009. group: n.group,
  41010. subgroup: n.subgroup,
  41011. index: i //add
  41012. };
  41013. }.bind(this)).map(function (n) {
  41014. n.position = this.convertVisionVector(n.position);
  41015. n.quaternion = this.convertVisionQuaternion(n.quaternion);
  41016. n.puck = this.convertVisionVector(n.puck);
  41017. return n;
  41018. }.bind(this)); // modeldata.forEach(function (n) {
  41019. // n.neighbours = n.neighbours.filter((o) => o >= 0 )
  41020. // n.seeMarkers = n.seeMarkers.filter((o) => o >= 0 )
  41021. // })
  41022. modeldata.forEach(function (n) {
  41023. n.neighbours = n.neighbours.filter(function (o) {
  41024. return modeldata[o];
  41025. }).map(function (o) {
  41026. return modeldata[o].uuid;
  41027. });
  41028. });
  41029. modeldata.forEach(function (t) {
  41030. //xzw
  41031. if (t.noBlocks) t.noBlocks = t.noBlocks.map(function (t) {
  41032. return modeldata[t].uuid;
  41033. });
  41034. });
  41035. modeldata.forEach(function (t) {
  41036. //xzw
  41037. if (t.seeMarkers) t.seeMarkers = t.seeMarkers.filter(function (t) {
  41038. return modeldata[t];
  41039. }).map(function (t) {
  41040. return modeldata[t].uuid;
  41041. });
  41042. });
  41043. return modeldata; //def.resolve(m);
  41044. },
  41045. panos: function panos($app, modeldata, metadata) {
  41046. var panoramaCollection = $app.core.get('Player').model.panos;
  41047. var panoVideoRenderer = $app.core.get('PanoVideoRenderer');
  41048. var panoVideos = panoVideoRenderer.videosInfo.videos;
  41049. if ($app.config.view) {
  41050. // 展示页仅加载可视点位球幕视频
  41051. var visiblePanoVideos = new Map();
  41052. panoramaCollection.extend(modeldata.map(function (modeldataitem) {
  41053. if (modeldataitem.neighbours.length) {
  41054. var video = panoVideos.get(modeldataitem.uuid);
  41055. video && visiblePanoVideos.set(modeldataitem.uuid, video);
  41056. return new Panorama($app, modeldataitem.uuid, modeldataitem, video);
  41057. } else {
  41058. return new Panorama($app, modeldataitem.uuid, modeldataitem, null);
  41059. }
  41060. }.bind(this)), 'id');
  41061. panoVideoRenderer.initVideoPlayer($app.dom, visiblePanoVideos);
  41062. } else {
  41063. // 编辑页加载所有点位球幕视频
  41064. panoramaCollection.extend(modeldata.map(function (modeldataitem) {
  41065. return new Panorama($app, modeldataitem.uuid, modeldataitem, panoVideos.get(modeldataitem.uuid));
  41066. }.bind(this)), 'id');
  41067. panoVideoRenderer.initVideoPlayer($app.dom, panoVideos);
  41068. } //forEach是PanoramaCollection的函数
  41069. //listItem是Panorama的一个对象
  41070. panoramaCollection.forEach(function (listItem) {
  41071. if (listItem.neighbourUUIDs) {
  41072. listItem.neighbourUUIDs.forEach(function (uuid) {
  41073. //get是PanoramaCollection的函数
  41074. var pano = panoramaCollection.get(uuid);
  41075. pano && panoramaCollection.setNeighbour(listItem, pano, !0);
  41076. }); // 点位隐藏时neighbourPanos为undefined,会被赋默认值,导致点位隐藏不可用,所以取空对象
  41077. listItem.neighbourPanos = panoramaCollection.getNeighbours(listItem) || {};
  41078. }
  41079. });
  41080. if (0 === panoramaCollection.length) {
  41081. logger$1.warn('Model has no panos, turning off inside mode');
  41082. }
  41083. return panoramaCollection;
  41084. },
  41085. panosAssist(modeldata, $app) {
  41086. //xzw add
  41087. return modeldata.map(function (data) {
  41088. data.panoType = 'assistant'; //isAssist = true
  41089. data.tiled = false;
  41090. return new Panorama($app, data.uuid, data);
  41091. }.bind(this));
  41092. },
  41093. //变换vision.modeldata里拍摄点的坐标
  41094. convertVisionVector: function convertVisionVector(position) {
  41095. return new THREE.Vector3(position.x, position.z, -position.y);
  41096. },
  41097. //变换vision.modeldata里拍摄点的旋转角度quaternion
  41098. convertVisionQuaternion: function convertVisionQuaternion(quaternion) {
  41099. return new THREE.Quaternion(quaternion.x, quaternion.z, -quaternion.y, quaternion.w).multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(90)));
  41100. },
  41101. //变换初始点的坐标
  41102. convertWorkshopVector: function convertWorkshopVector(position) {
  41103. return new THREE.Vector3(-position.x, position.y, position.z);
  41104. },
  41105. //变换初始点的quaternion
  41106. convertWorkshopQuaternion: function convertWorkshopQuaternion(quaternion) {
  41107. return new THREE.Quaternion(-quaternion.x, quaternion.y, quaternion.z, -quaternion.w).multiply(new THREE.Quaternion(Math.sqrt(2) / 2, Math.sqrt(2) / 2, 0, 0));
  41108. }
  41109. };
  41110. var Chunks = {
  41111. parseIdsFromChunkName(chunkName, floorRoomIds) {
  41112. floorRoomIds.floorId = this.parseFloor(chunkName);
  41113. floorRoomIds.roomId = this.parseRoom(chunkName);
  41114. },
  41115. parseFloor(chunkName) {
  41116. var floorInfo = chunkName.match(/_group([0-9]+)/);
  41117. if (!floorInfo) return 0;
  41118. try {
  41119. return parseInt(floorInfo[1], 10);
  41120. } catch (msg) {
  41121. logger.warn('Non-int value "' + floorInfo[1] + '" for mesh group, defaulting to floor 0');
  41122. return 0;
  41123. }
  41124. },
  41125. parseRoom(chunkName) {
  41126. var roomInfo = chunkName.match(/_sub([0-9]+)/);
  41127. if (!roomInfo) return -1;
  41128. try {
  41129. return parseInt(roomInfo[1], 10);
  41130. } catch (msg) {
  41131. logger.warn('Non-int value "' + roomInfo[1] + '" for mesh subgroup, defaulting to subgroup 0');
  41132. return 0;
  41133. }
  41134. }
  41135. };
  41136. var ModelTextureLoader = {
  41137. load(model, textures, resource) {
  41138. return new Promise(function (resolve) {
  41139. function addTexture(flag, texture) {
  41140. if (!flag) {
  41141. textures.push(texture);
  41142. p++;
  41143. p === textureLen && resolve();
  41144. }
  41145. }
  41146. if (!model.chunks[0] || !model.chunks[0].meshUrl) {
  41147. return resolve();
  41148. }
  41149. var textureLen = common.countUnique(model.chunks.map(function (chunk) {
  41150. return chunk.textureName;
  41151. }));
  41152. var modelVersion = '';
  41153. if (model.chunks[0].meshUrl.indexOf('_50k') !== -1) ;
  41154. var textureType = 'low';
  41155. if (settings$3.minimalMemoryMode && 'high' === textureType) {
  41156. if (browser$1.detectSamsungS6()) {
  41157. logger$1.warn('Galaxy S6 cannot handle large textures, turning down quality.');
  41158. textureType = 'low';
  41159. } else if (textureLen > settings$3.maxMobileTextures) {
  41160. logger$1.warn('Model probably too large for mobile, turning down quality.');
  41161. textureType = 'low';
  41162. }
  41163. }
  41164. var p = 0;
  41165. var textureFoldName = model.data.job.uuid + modelVersion + '_50k_texture_jpg_' + 'high1' + '/';
  41166. if (config$4.model.name) {
  41167. textureFoldName = config$4.model.name.replace('.dam', '_texture/');
  41168. }
  41169. model.chunks.forEach(function (chunk) {
  41170. if (!chunk.material.map && chunk.textureName) {
  41171. var textureUrl = model.urls.get(textureFoldName + chunk.textureName);
  41172. chunk.setTextureMap(texture.load(textureUrl, addTexture.bind(this, texture.isLoaded(textureUrl))));
  41173. }
  41174. });
  41175. });
  41176. }
  41177. };
  41178. function _defineProperty$1(obj, key, value) {
  41179. if (key in obj) {
  41180. Object.defineProperty(obj, key, {
  41181. value: value,
  41182. enumerable: true,
  41183. configurable: true,
  41184. writable: true
  41185. });
  41186. } else {
  41187. obj[key] = value;
  41188. }
  41189. return obj;
  41190. }
  41191. function _AwaitValue(value) {
  41192. this.wrapped = value;
  41193. }
  41194. function _awaitAsyncGenerator(value) {
  41195. return new _AwaitValue(value);
  41196. }
  41197. function AsyncGenerator(gen) {
  41198. var front, back;
  41199. function send(key, arg) {
  41200. return new Promise(function (resolve, reject) {
  41201. var request = {
  41202. key: key,
  41203. arg: arg,
  41204. resolve: resolve,
  41205. reject: reject,
  41206. next: null
  41207. };
  41208. if (back) {
  41209. back = back.next = request;
  41210. } else {
  41211. front = back = request;
  41212. resume(key, arg);
  41213. }
  41214. });
  41215. }
  41216. function resume(key, arg) {
  41217. try {
  41218. var result = gen[key](arg);
  41219. var value = result.value;
  41220. var wrappedAwait = value instanceof _AwaitValue;
  41221. Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
  41222. if (wrappedAwait) {
  41223. resume(key === "return" ? "return" : "next", arg);
  41224. return;
  41225. }
  41226. settle(result.done ? "return" : "normal", arg);
  41227. }, function (err) {
  41228. resume("throw", err);
  41229. });
  41230. } catch (err) {
  41231. settle("throw", err);
  41232. }
  41233. }
  41234. function settle(type, value) {
  41235. switch (type) {
  41236. case "return":
  41237. front.resolve({
  41238. value: value,
  41239. done: true
  41240. });
  41241. break;
  41242. case "throw":
  41243. front.reject(value);
  41244. break;
  41245. default:
  41246. front.resolve({
  41247. value: value,
  41248. done: false
  41249. });
  41250. break;
  41251. }
  41252. front = front.next;
  41253. if (front) {
  41254. resume(front.key, front.arg);
  41255. } else {
  41256. back = null;
  41257. }
  41258. }
  41259. this._invoke = send;
  41260. if (typeof gen["return"] !== "function") {
  41261. this["return"] = undefined;
  41262. }
  41263. }
  41264. AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () {
  41265. return this;
  41266. };
  41267. AsyncGenerator.prototype.next = function (arg) {
  41268. return this._invoke("next", arg);
  41269. };
  41270. AsyncGenerator.prototype["throw"] = function (arg) {
  41271. return this._invoke("throw", arg);
  41272. };
  41273. AsyncGenerator.prototype["return"] = function (arg) {
  41274. return this._invoke("return", arg);
  41275. };
  41276. function _wrapAsyncGenerator(fn) {
  41277. return function () {
  41278. return new AsyncGenerator(fn.apply(this, arguments));
  41279. };
  41280. }
  41281. function _asyncIterator(iterable) {
  41282. var method;
  41283. if (typeof Symbol !== "undefined") {
  41284. if (Symbol.asyncIterator) method = iterable[Symbol.asyncIterator];
  41285. if (method == null && Symbol.iterator) method = iterable[Symbol.iterator];
  41286. }
  41287. if (method == null) method = iterable["@@asyncIterator"];
  41288. if (method == null) method = iterable["@@iterator"];
  41289. if (method == null) throw new TypeError("Object is not async iterable");
  41290. return method.call(iterable);
  41291. }
  41292. /**
  41293. * @author Deepkolos / https://github.com/deepkolos
  41294. */
  41295. var WorkerPool$1 = /*#__PURE__*/function () {
  41296. function WorkerPool() {
  41297. var pool = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 4;
  41298. _classCallCheck(this, WorkerPool);
  41299. this.pool = pool;
  41300. this.queue = [];
  41301. this.workers = [];
  41302. this.workersResolve = [];
  41303. this.workerStatus = 0;
  41304. }
  41305. _createClass(WorkerPool, [{
  41306. key: "_initWorker",
  41307. value: function _initWorker(workerId) {
  41308. if (!this.workers[workerId]) {
  41309. var worker = this.workerCreator();
  41310. worker.addEventListener('message', this._onMessage.bind(this, workerId));
  41311. this.workers[workerId] = worker;
  41312. }
  41313. }
  41314. }, {
  41315. key: "_getIdleWorker",
  41316. value: function _getIdleWorker() {
  41317. for (var i = 0; i < this.pool; i++) {
  41318. if (!(this.workerStatus & 1 << i)) return i;
  41319. }
  41320. return -1;
  41321. }
  41322. }, {
  41323. key: "_onMessage",
  41324. value: function _onMessage(workerId, msg) {
  41325. var resolve = this.workersResolve[workerId];
  41326. resolve && resolve(msg);
  41327. if (this.queue.length) {
  41328. var _this$queue$shift = this.queue.shift(),
  41329. _resolve = _this$queue$shift.resolve,
  41330. _msg = _this$queue$shift.msg,
  41331. transfer = _this$queue$shift.transfer;
  41332. this.workersResolve[workerId] = _resolve;
  41333. this.workers[workerId].postMessage(_msg, transfer);
  41334. } else {
  41335. this.workerStatus ^= 1 << workerId;
  41336. }
  41337. }
  41338. }, {
  41339. key: "setWorkerCreator",
  41340. value: function setWorkerCreator(workerCreator) {
  41341. this.workerCreator = workerCreator;
  41342. }
  41343. }, {
  41344. key: "setWorkerLimit",
  41345. value: function setWorkerLimit(pool) {
  41346. this.pool = pool;
  41347. }
  41348. }, {
  41349. key: "postMessage",
  41350. value: function postMessage(msg, transfer) {
  41351. var _this = this;
  41352. return new Promise(function (resolve) {
  41353. var workerId = _this._getIdleWorker();
  41354. if (workerId !== -1) {
  41355. _this._initWorker(workerId);
  41356. _this.workerStatus |= 1 << workerId;
  41357. _this.workersResolve[workerId] = resolve;
  41358. _this.workers[workerId].postMessage(msg, transfer);
  41359. } else {
  41360. _this.queue.push({
  41361. resolve,
  41362. msg,
  41363. transfer
  41364. });
  41365. }
  41366. });
  41367. }
  41368. }, {
  41369. key: "dispose",
  41370. value: function dispose() {
  41371. this.workers.forEach(function (worker) {
  41372. return worker.terminate();
  41373. });
  41374. this.workersResolve.length = 0;
  41375. this.workers.length = 0;
  41376. this.queue.length = 0;
  41377. this.workerStatus = 0;
  41378. }
  41379. }]);
  41380. return WorkerPool;
  41381. }();
  41382. var t = 0,
  41383. n$2 = 2,
  41384. p$1 = 1,
  41385. x$1 = 2,
  41386. nt = 0,
  41387. ct = 9,
  41388. gt = 15,
  41389. yt = 16,
  41390. dt = 22,
  41391. Ot = 37,
  41392. Ft = 43,
  41393. $t = 76,
  41394. se = 83,
  41395. pe = 97,
  41396. xe = 100,
  41397. de = 103,
  41398. Ae = 109;
  41399. var Si = function Si() {
  41400. _classCallCheck(this, Si);
  41401. this.vkFormat = 0, this.typeSize = 1, this.pixelWidth = 0, this.pixelHeight = 0, this.pixelDepth = 0, this.layerCount = 0, this.faceCount = 1, this.supercompressionScheme = 0, this.levels = [], this.dataFormatDescriptor = [{
  41402. vendorId: 0,
  41403. descriptorType: 0,
  41404. descriptorBlockSize: 0,
  41405. versionNumber: 2,
  41406. colorModel: 0,
  41407. colorPrimaries: 1,
  41408. transferFunction: 2,
  41409. flags: 0,
  41410. texelBlockDimension: [0, 0, 0, 0],
  41411. bytesPlane: [0, 0, 0, 0, 0, 0, 0, 0],
  41412. samples: []
  41413. }], this.keyValue = {}, this.globalData = null;
  41414. };
  41415. var Ii = /*#__PURE__*/function () {
  41416. function Ii(t, e, n, i) {
  41417. _classCallCheck(this, Ii);
  41418. this._dataView = new DataView(t.buffer, t.byteOffset + e, n), this._littleEndian = i, this._offset = 0;
  41419. }
  41420. _createClass(Ii, [{
  41421. key: "_nextUint8",
  41422. value: function _nextUint8() {
  41423. var t = this._dataView.getUint8(this._offset);
  41424. return this._offset += 1, t;
  41425. }
  41426. }, {
  41427. key: "_nextUint16",
  41428. value: function _nextUint16() {
  41429. var t = this._dataView.getUint16(this._offset, this._littleEndian);
  41430. return this._offset += 2, t;
  41431. }
  41432. }, {
  41433. key: "_nextUint32",
  41434. value: function _nextUint32() {
  41435. var t = this._dataView.getUint32(this._offset, this._littleEndian);
  41436. return this._offset += 4, t;
  41437. }
  41438. }, {
  41439. key: "_nextUint64",
  41440. value: function _nextUint64() {
  41441. var t = this._dataView.getUint32(this._offset, this._littleEndian) + Math.pow(2, 32) * this._dataView.getUint32(this._offset + 4, this._littleEndian);
  41442. return this._offset += 8, t;
  41443. }
  41444. }, {
  41445. key: "_nextInt32",
  41446. value: function _nextInt32() {
  41447. var t = this._dataView.getInt32(this._offset, this._littleEndian);
  41448. return this._offset += 4, t;
  41449. }
  41450. }, {
  41451. key: "_skip",
  41452. value: function _skip(t) {
  41453. return this._offset += t, this;
  41454. }
  41455. }, {
  41456. key: "_scan",
  41457. value: function _scan(t) {
  41458. var e = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  41459. var n = this._offset;
  41460. var i = 0;
  41461. for (; this._dataView.getUint8(this._offset) !== e && i < t;) {
  41462. i++, this._offset++;
  41463. }
  41464. return i < t && this._offset++, new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + n, i);
  41465. }
  41466. }]);
  41467. return Ii;
  41468. }();
  41469. var Ti = [171, 75, 84, 88, 32, 50, 48, 187, 13, 10, 26, 10];
  41470. function Ei(t) {
  41471. return 'undefined' != typeof TextDecoder ? new TextDecoder().decode(t) : Buffer.from(t).toString('utf8');
  41472. }
  41473. function Pi(t) {
  41474. var e = new Uint8Array(t.buffer, t.byteOffset, Ti.length);
  41475. if (e[0] !== Ti[0] || e[1] !== Ti[1] || e[2] !== Ti[2] || e[3] !== Ti[3] || e[4] !== Ti[4] || e[5] !== Ti[5] || e[6] !== Ti[6] || e[7] !== Ti[7] || e[8] !== Ti[8] || e[9] !== Ti[9] || e[10] !== Ti[10] || e[11] !== Ti[11]) throw new Error('Missing KTX 2.0 identifier.');
  41476. var n = new Si(),
  41477. i = 17 * Uint32Array.BYTES_PER_ELEMENT,
  41478. s = new Ii(t, Ti.length, i, !0);
  41479. n.vkFormat = s._nextUint32(), n.typeSize = s._nextUint32(), n.pixelWidth = s._nextUint32(), n.pixelHeight = s._nextUint32(), n.pixelDepth = s._nextUint32(), n.layerCount = s._nextUint32(), n.faceCount = s._nextUint32();
  41480. var a = s._nextUint32();
  41481. n.supercompressionScheme = s._nextUint32();
  41482. var r = s._nextUint32(),
  41483. o = s._nextUint32(),
  41484. l = s._nextUint32(),
  41485. f = s._nextUint32(),
  41486. U = s._nextUint64(),
  41487. c = s._nextUint64(),
  41488. h = new Ii(t, Ti.length + i, 3 * a * 8, !0);
  41489. for (var _e3 = 0; _e3 < a; _e3++) {
  41490. n.levels.push({
  41491. levelData: new Uint8Array(t.buffer, t.byteOffset + h._nextUint64(), h._nextUint64()),
  41492. uncompressedByteLength: h._nextUint64()
  41493. });
  41494. }
  41495. var _ = new Ii(t, r, o, !0),
  41496. p = {
  41497. vendorId: _._skip(4)._nextUint16(),
  41498. descriptorType: _._nextUint16(),
  41499. versionNumber: _._nextUint16(),
  41500. descriptorBlockSize: _._nextUint16(),
  41501. colorModel: _._nextUint8(),
  41502. colorPrimaries: _._nextUint8(),
  41503. transferFunction: _._nextUint8(),
  41504. flags: _._nextUint8(),
  41505. texelBlockDimension: [_._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8()],
  41506. bytesPlane: [_._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8()],
  41507. samples: []
  41508. },
  41509. g = (p.descriptorBlockSize / 4 - 6) / 4;
  41510. for (var _t2 = 0; _t2 < g; _t2++) {
  41511. var _e4 = {
  41512. bitOffset: _._nextUint16(),
  41513. bitLength: _._nextUint8(),
  41514. channelType: _._nextUint8(),
  41515. samplePosition: [_._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8()],
  41516. sampleLower: -Infinity,
  41517. sampleUpper: Infinity
  41518. };
  41519. 64 & _e4.channelType ? (_e4.sampleLower = _._nextInt32(), _e4.sampleUpper = _._nextInt32()) : (_e4.sampleLower = _._nextUint32(), _e4.sampleUpper = _._nextUint32()), p.samples[_t2] = _e4;
  41520. }
  41521. n.dataFormatDescriptor.length = 0, n.dataFormatDescriptor.push(p);
  41522. var y = new Ii(t, l, f, !0);
  41523. for (; y._offset < f;) {
  41524. var _t3 = y._nextUint32(),
  41525. _e5 = y._scan(_t3),
  41526. _i2 = Ei(_e5),
  41527. _s = y._scan(_t3 - _e5.byteLength);
  41528. n.keyValue[_i2] = _i2.match(/^ktx/i) ? Ei(_s) : _s, y._offset % 4 && y._skip(4 - y._offset % 4);
  41529. }
  41530. if (c <= 0) return n;
  41531. var x = new Ii(t, U, c, !0),
  41532. u = x._nextUint16(),
  41533. b = x._nextUint16(),
  41534. d = x._nextUint32(),
  41535. m = x._nextUint32(),
  41536. w = x._nextUint32(),
  41537. D = x._nextUint32(),
  41538. B = [];
  41539. for (var _t4 = 0; _t4 < a; _t4++) {
  41540. B.push({
  41541. imageFlags: x._nextUint32(),
  41542. rgbSliceByteOffset: x._nextUint32(),
  41543. rgbSliceByteLength: x._nextUint32(),
  41544. alphaSliceByteOffset: x._nextUint32(),
  41545. alphaSliceByteLength: x._nextUint32()
  41546. });
  41547. }
  41548. var L = U + x._offset,
  41549. A = L + d,
  41550. k = A + m,
  41551. v = k + w,
  41552. S = new Uint8Array(t.buffer, t.byteOffset + L, d),
  41553. I = new Uint8Array(t.buffer, t.byteOffset + A, m),
  41554. O = new Uint8Array(t.buffer, t.byteOffset + k, w),
  41555. T = new Uint8Array(t.buffer, t.byteOffset + v, D);
  41556. return n.globalData = {
  41557. endpointCount: u,
  41558. selectorCount: b,
  41559. imageDescs: B,
  41560. endpointsData: S,
  41561. selectorsData: I,
  41562. tablesData: O,
  41563. extendedData: T
  41564. }, n;
  41565. }
  41566. var A$1, I$1, B$1;
  41567. var g$1 = {
  41568. env: {
  41569. emscripten_notify_memory_growth: function emscripten_notify_memory_growth(A) {
  41570. B$1 = new Uint8Array(I$1.exports.memory.buffer);
  41571. }
  41572. }
  41573. };
  41574. var Q = /*#__PURE__*/function () {
  41575. function Q() {
  41576. _classCallCheck(this, Q);
  41577. }
  41578. _createClass(Q, [{
  41579. key: "init",
  41580. value: function init() {
  41581. return A$1 || (A$1 = 'undefined' != typeof fetch ? fetch('data:application/wasm;base64,' + C).then(function (A) {
  41582. return A.arrayBuffer();
  41583. }).then(function (A) {
  41584. return WebAssembly.instantiate(A, g$1);
  41585. }).then(this._init) : WebAssembly.instantiate(Buffer.from(C, 'base64'), g$1).then(this._init), A$1);
  41586. }
  41587. }, {
  41588. key: "_init",
  41589. value: function _init(A) {
  41590. I$1 = A.instance, g$1.env.emscripten_notify_memory_growth(0);
  41591. }
  41592. }, {
  41593. key: "decode",
  41594. value: function decode(A) {
  41595. var g = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  41596. if (!I$1) throw new Error('ZSTDDecoder: Await .init() before decoding.');
  41597. var _Q = A.byteLength,
  41598. C = I$1.exports.malloc(_Q);
  41599. B$1.set(A, C), g = g || Number(I$1.exports.ZSTD_findDecompressedSize(C, _Q));
  41600. var E = I$1.exports.malloc(g),
  41601. i = I$1.exports.ZSTD_decompress(E, g, C, _Q),
  41602. D = B$1.slice(E, E + i);
  41603. return I$1.exports.free(C), I$1.exports.free(E), D;
  41604. }
  41605. }]);
  41606. return Q;
  41607. }();
  41608. var C = 'AGFzbQEAAAABpQEVYAF/AX9gAn9/AGADf39/AX9gBX9/f39/AX9gAX8AYAJ/fwF/YAR/f39/AX9gA39/fwBgBn9/f39/fwF/YAd/f39/f39/AX9gAn9/AX5gAn5+AX5gAABgBX9/f39/AGAGf39/f39/AGAIf39/f39/f38AYAl/f39/f39/f38AYAABf2AIf39/f39/f38Bf2ANf39/f39/f39/f39/fwF/YAF/AX4CJwEDZW52H2Vtc2NyaXB0ZW5fbm90aWZ5X21lbW9yeV9ncm93dGgABANpaAEFAAAFAgEFCwACAQABAgIFBQcAAwABDgsBAQcAEhMHAAUBDAQEAAANBwQCAgYCBAgDAwMDBgEACQkHBgICAAYGAgQUBwYGAwIGAAMCAQgBBwUGCgoEEQAEBAEIAwgDBQgDEA8IAAcABAUBcAECAgUEAQCAAgYJAX8BQaCgwAILB2AHBm1lbW9yeQIABm1hbGxvYwAoBGZyZWUAJgxaU1REX2lzRXJyb3IAaBlaU1REX2ZpbmREZWNvbXByZXNzZWRTaXplAFQPWlNURF9kZWNvbXByZXNzAEoGX3N0YXJ0ACQJBwEAQQELASQKussBaA8AIAAgACgCBCABajYCBAsZACAAKAIAIAAoAgRBH3F0QQAgAWtBH3F2CwgAIABBiH9LC34BBH9BAyEBIAAoAgQiA0EgTQRAIAAoAggiASAAKAIQTwRAIAAQDQ8LIAAoAgwiAiABRgRAQQFBAiADQSBJGw8LIAAgASABIAJrIANBA3YiBCABIARrIAJJIgEbIgJrIgQ2AgggACADIAJBA3RrNgIEIAAgBCgAADYCAAsgAQsUAQF/IAAgARACIQIgACABEAEgAgv3AQECfyACRQRAIABCADcCACAAQQA2AhAgAEIANwIIQbh/DwsgACABNgIMIAAgAUEEajYCECACQQRPBEAgACABIAJqIgFBfGoiAzYCCCAAIAMoAAA2AgAgAUF/ai0AACIBBEAgAEEIIAEQFGs2AgQgAg8LIABBADYCBEF/DwsgACABNgIIIAAgAS0AACIDNgIAIAJBfmoiBEEBTQRAIARBAWtFBEAgACABLQACQRB0IANyIgM2AgALIAAgAS0AAUEIdCADajYCAAsgASACakF/ai0AACIBRQRAIABBADYCBEFsDwsgAEEoIAEQFCACQQN0ams2AgQgAgsWACAAIAEpAAA3AAAgACABKQAINwAICy8BAX8gAUECdEGgHWooAgAgACgCAEEgIAEgACgCBGprQR9xdnEhAiAAIAEQASACCyEAIAFCz9bTvtLHq9lCfiAAfEIfiUKHla+vmLbem55/fgsdAQF/IAAoAgggACgCDEYEfyAAKAIEQSBGBUEACwuCBAEDfyACQYDAAE8EQCAAIAEgAhBnIAAPCyAAIAJqIQMCQCAAIAFzQQNxRQRAAkAgAkEBSARAIAAhAgwBCyAAQQNxRQRAIAAhAgwBCyAAIQIDQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADTw0BIAJBA3ENAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgA0F8aiIEIABJBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAsMACAAIAEpAAA3AAALQQECfyAAKAIIIgEgACgCEEkEQEEDDwsgACAAKAIEIgJBB3E2AgQgACABIAJBA3ZrIgE2AgggACABKAAANgIAQQALDAAgACABKAIANgAAC/cCAQJ/AkAgACABRg0AAkAgASACaiAASwRAIAAgAmoiBCABSw0BCyAAIAEgAhALDwsgACABc0EDcSEDAkACQCAAIAFJBEAgAwRAIAAhAwwDCyAAQQNxRQRAIAAhAwwCCyAAIQMDQCACRQ0EIAMgAS0AADoAACABQQFqIQEgAkF/aiECIANBAWoiA0EDcQ0ACwwBCwJAIAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQhBSAGQQR2IQRBICAAdCIAQQFyIQkgASgCACEPQQAhAiADIQYCQANAIAlBAkggAiAPS3JFBEAgAiEHAkAgCARAA0AgBEH//wNxQf//A0YEQCAHQRhqIQcgBiAQSQR/IAZBAmoiBigAACAFdgUgBUEQaiEFIARBEHYLIQQMAQsLA0AgBEEDcSIIQQNGBEAgBUECaiEFIARBAnYhBCAHQQNqIQcMAQsLIAcgCGoiByAPSw0EIAVBAmohBQNAIAIgB0kEQCANIAJBAXRqQQA7AQAgAkEBaiECDAELCyAGIA5LQQAgBiAFQQN1aiIHIAxLG0UEQCAHKAAAIAVBB3EiBXYhBAwCCyAEQQJ2IQQLIAYhBwsCfyALQX9qIAQgAEF/anEiBiAAQQF0QX9qIgggCWsiEUkNABogBCAIcSIEQQAgESAEIABIG2shBiALCyEIIA0gAkEBdGogBkF/aiIEOwEAIAlBASAGayAEIAZBAUgbayEJA0AgCSAASARAIABBAXUhACALQX9qIQsMAQsLAn8gByAOS0EAIAcgBSAIaiIFQQN1aiIGIAxLG0UEQCAFQQdxDAELIAUgDCIGIAdrQQN0awshBSACQQFqIQIgBEUhCCAGKAAAIAVBH3F2IQQMAQsLQWwgCUEBRyAFQSBKcg0BGiABIAJBf2o2AgAgBiAFQQdqQQN1aiADawwBC0FQCyEAIApBEGokACAACwkAQQFBBSAAGwsMACAAIAEoAAA2AAALqgMBCn8jAEHwAGsiCiQAIAJBAWohDiAAQQhqIQtBgIAEIAVBf2p0QRB1IQxBACECQQEhBkEBIAV0IglBf2oiDyEIA0AgAiAORkUEQAJAIAEgAkEBdCINai8BACIHQf//A0YEQCALIAhBA3RqIAI2AgQgCEF/aiEIQQEhBwwBCyAGQQAgDCAHQRB0QRB1ShshBgsgCiANaiAHOwEAIAJBAWohAgwBCwsgACAFNgIEIAAgBjYCACAJQQN2IAlBAXZqQQNqIQxBACEAQQAhBkEAIQIDQCAGIA5GBEADQAJAIAAgCUYNACAKIAsgAEEDdGoiASgCBCIGQQF0aiICIAIvAQAiAkEBajsBACABIAUgAhAUayIIOgADIAEgAiAIQf8BcXQgCWs7AQAgASAEIAZBAnQiAmooAgA6AAIgASACIANqKAIANgIEIABBAWohAAwBCwsFIAEgBkEBdGouAQAhDUEAIQcDQCAHIA1ORQRAIAsgAkEDdGogBjYCBANAIAIgDGogD3EiAiAISw0ACyAHQQFqIQcMAQsLIAZBAWohBgwBCwsgCkHwAGokAAsjAEIAIAEQCSAAhUKHla+vmLbem55/fkLj3MqV/M7y9YV/fAsQACAAQn43AwggACABNgIACyQBAX8gAARAIAEoAgQiAgRAIAEoAgggACACEQEADwsgABAmCwsfACAAIAEgAi8BABAINgIAIAEQBBogACACQQRqNgIEC0oBAX9BoCAoAgAiASAAaiIAQX9MBEBBiCBBMDYCAEF/DwsCQCAAPwBBEHRNDQAgABBmDQBBiCBBMDYCAEF/DwtBoCAgADYCACABC9cBAQh/Qbp/IQoCQCACKAIEIgggAigCACIJaiIOIAEgAGtLDQBBbCEKIAkgBCADKAIAIgtrSw0AIAAgCWoiBCACKAIIIgxrIQ0gACABQWBqIg8gCyAJQQAQKSADIAkgC2o2AgACQAJAIAwgBCAFa00EQCANIQUMAQsgDCAEIAZrSw0CIAcgDSAFayIAaiIBIAhqIAdNBEAgBCABIAgQDxoMAgsgBCABQQAgAGsQDyEBIAIgACAIaiIINgIEIAEgAGshBAsgBCAPIAUgCEEBECkLIA4hCgsgCgubAgEBfyMAQYABayINJAAgDSADNgJ8AkAgAkEDSwRAQX8hCQwBCwJAAkACQAJAIAJBAWsOAwADAgELIAZFBEBBuH8hCQwEC0FsIQkgBS0AACICIANLDQMgACAHIAJBAnQiAmooAgAgAiAIaigCABA7IAEgADYCAEEBIQkMAwsgASAJNgIAQQAhCQwCCyAKRQRAQWwhCQwCC0EAIQkgC0UgDEEZSHINAUEIIAR0QQhqIQBBACECA0AgAiAATw0CIAJBQGshAgwAAAsAC0FsIQkgDSANQfwAaiANQfgAaiAFIAYQFSICEAMNACANKAJ4IgMgBEsNACAAIA0gDSgCfCAHIAggAxAYIAEgADYCACACIQkLIA1BgAFqJAAgCQsLACAAIAEgAhALGgsQACAALwAAIAAtAAJBEHRyCy8AAn9BuH8gAUEISQ0AGkFyIAAoAAQiAEF3Sw0AGkG4fyAAQQhqIgAgACABSxsLCwkAIAAgATsAAAsDAAELigYBBX8gACAAKAIAIgVBfnE2AgBBACAAIAVBAXZqQYQgKAIAIgQgAEYbIQECQAJAIAAoAgQiAkUNACACKAIAIgNBAXENACACQQhqIgUgA0EBdkF4aiIDQQggA0EISxtnQR9zQQJ0QYAfaiIDKAIARgRAIAMgAigCDDYCAAsgAigCCCIDBEAgAyACKAIMNgIECyACKAIMIgMEQCADIAIoAgg2AgALIAIgAigCACAAKAIAQX5xajYCAEGEICEAAkACQCABRQ0AIAEgAjYCBCABKAIAIgNBAXENASADQQF2QXhqIgNBCCADQQhLG2dBH3NBAnRBgB9qIgMoAgAgAUEIakYEQCADIAEoAgw2AgALIAEoAggiAwRAIAMgASgCDDYCBAsgASgCDCIDBEAgAyABKAIINgIAQYQgKAIAIQQLIAIgAigCACABKAIAQX5xajYCACABIARGDQAgASABKAIAQQF2akEEaiEACyAAIAI2AgALIAIoAgBBAXZBeGoiAEEIIABBCEsbZ0Efc0ECdEGAH2oiASgCACEAIAEgBTYCACACIAA2AgwgAkEANgIIIABFDQEgACAFNgIADwsCQCABRQ0AIAEoAgAiAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAigCACABQQhqRgRAIAIgASgCDDYCAAsgASgCCCICBEAgAiABKAIMNgIECyABKAIMIgIEQCACIAEoAgg2AgBBhCAoAgAhBAsgACAAKAIAIAEoAgBBfnFqIgI2AgACQCABIARHBEAgASABKAIAQQF2aiAANgIEIAAoAgAhAgwBC0GEICAANgIACyACQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgIoAgAhASACIABBCGoiAjYCACAAIAE2AgwgAEEANgIIIAFFDQEgASACNgIADwsgBUEBdkF4aiIBQQggAUEISxtnQR9zQQJ0QYAfaiICKAIAIQEgAiAAQQhqIgI2AgAgACABNgIMIABBADYCCCABRQ0AIAEgAjYCAAsLDgAgAARAIABBeGoQJQsLgAIBA38CQCAAQQ9qQXhxQYQgKAIAKAIAQQF2ayICEB1Bf0YNAAJAQYQgKAIAIgAoAgAiAUEBcQ0AIAFBAXZBeGoiAUEIIAFBCEsbZ0Efc0ECdEGAH2oiASgCACAAQQhqRgRAIAEgACgCDDYCAAsgACgCCCIBBEAgASAAKAIMNgIECyAAKAIMIgFFDQAgASAAKAIINgIAC0EBIQEgACAAKAIAIAJBAXRqIgI2AgAgAkEBcQ0AIAJBAXZBeGoiAkEIIAJBCEsbZ0Efc0ECdEGAH2oiAygCACECIAMgAEEIaiIDNgIAIAAgAjYCDCAAQQA2AgggAkUNACACIAM2AgALIAELtwIBA38CQAJAIABBASAAGyICEDgiAA0AAkACQEGEICgCACIARQ0AIAAoAgAiA0EBcQ0AIAAgA0EBcjYCACADQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgEoAgAgAEEIakYEQCABIAAoAgw2AgALIAAoAggiAQRAIAEgACgCDDYCBAsgACgCDCIBBEAgASAAKAIINgIACyACECchAkEAIQFBhCAoAgAhACACDQEgACAAKAIAQX5xNgIAQQAPCyACQQ9qQXhxIgMQHSICQX9GDQIgAkEHakF4cSIAIAJHBEAgACACaxAdQX9GDQMLAkBBhCAoAgAiAUUEQEGAICAANgIADAELIAAgATYCBAtBhCAgADYCACAAIANBAXRBAXI2AgAMAQsgAEUNAQsgAEEIaiEBCyABC7kDAQJ/IAAgA2ohBQJAIANBB0wEQANAIAAgBU8NAiAAIAItAAA6AAAgAEEBaiEAIAJBAWohAgwAAAsACyAEQQFGBEACQCAAIAJrIgZBB00EQCAAIAItAAA6AAAgACACLQABOgABIAAgAi0AAjoAAiAAIAItAAM6AAMgAEEEaiACIAZBAnQiBkHAHmooAgBqIgIQFyACIAZB4B5qKAIAayECDAELIAAgAhAMCyACQQhqIQIgAEEIaiEACwJAAkACQAJAIAUgAU0EQCAAIANqIQEgBEEBRyAAIAJrQQ9Kcg0BA0AgACACEAwgAkEIaiECIABBCGoiACABSQ0ACwwFCyAAIAFLBEAgACEBDAQLIARBAUcgACACa0EPSnINASAAIQMgAiEEA0AgAyAEEAwgBEEIaiEEIANBCGoiAyABSQ0ACwwCCwNAIAAgAhAHIAJBEGohAiAAQRBqIgAgAUkNAAsMAwsgACEDIAIhBANAIAMgBBAHIARBEGohBCADQRBqIgMgAUkNAAsLIAIgASAAa2ohAgsDQCABIAVPDQEgASACLQAAOgAAIAFBAWohASACQQFqIQIMAAALAAsLQQECfyAAIAAoArjgASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigCACACaiAAQQZ2IgFBAnRBsB5qKAIAaiAAQSBxIgBFaiABRSAAQQV2cWoFQbh/CwsdACAAKAKQ4gEQWiAAQQA2AqDiASAAQgA3A5DiAQu1AwEFfyMAQZACayIKJABBuH8hBgJAIAVFDQAgBCwAACIIQf8BcSEHAkAgCEF/TARAIAdBgn9qQQF2IgggBU8NAkFsIQYgB0GBf2oiBUGAAk8NAiAEQQFqIQdBACEGA0AgBiAFTwRAIAUhBiAIIQcMAwUgACAGaiAHIAZBAXZqIgQtAABBBHY6AAAgACAGQQFyaiAELQAAQQ9xOgAAIAZBAmohBgwBCwAACwALIAcgBU8NASAAIARBAWogByAKEFMiBhADDQELIAYhBEEAIQYgAUEAQTQQECEJQQAhBQNAIAQgBkcEQCAAIAZqIggtAAAiAUELSwRAQWwhBgwDBSAJIAFBAnRqIgEgASgCAEEBajYCACAGQQFqIQZBASAILQAAdEEBdSAFaiEFDAILAAsLQWwhBiAFRQ0AIAUQFEEBaiIBQQxLDQAgAyABNgIAQQFBASABdCAFayIDEBQiAXQgA0cNACAAIARqIAFBAWoiADoAACAJIABBAnRqIgAgACgCAEEBajYCACAJKAIEIgBBAkkgAEEBcXINACACIARBAWo2AgAgB0EBaiEGCyAKQZACaiQAIAYLxhEBDH8jAEHwAGsiBSQAQWwhCwJAIANBCkkNACACLwAAIQogAi8AAiEJIAIvAAQhByAFQQhqIAQQDgJAIAMgByAJIApqakEGaiIMSQ0AIAUtAAohCCAFQdgAaiACQQZqIgIgChAGIgsQAw0BIAVBQGsgAiAKaiICIAkQBiILEAMNASAFQShqIAIgCWoiAiAHEAYiCxADDQEgBUEQaiACIAdqIAMgDGsQBiILEAMNASAAIAFqIg9BfWohECAEQQRqIQZBASELIAAgAUEDakECdiIDaiIMIANqIgIgA2oiDiEDIAIhBCAMIQcDQCALIAMgEElxBEAgACAGIAVB2ABqIAgQAkECdGoiCS8BADsAACAFQdgAaiAJLQACEAEgCS0AAyELIAcgBiAFQUBrIAgQAkECdGoiCS8BADsAACAFQUBrIAktAAIQASAJLQADIQogBCAGIAVBKGogCBACQQJ0aiIJLwEAOwAAIAVBKGogCS0AAhABIAktAAMhCSADIAYgBUEQaiAIEAJBAnRqIg0vAQA7AAAgBUEQaiANLQACEAEgDS0AAyENIAAgC2oiCyAGIAVB2ABqIAgQAkECdGoiAC8BADsAACAFQdgAaiAALQACEAEgAC0AAyEAIAcgCmoiCiAGIAVBQGsgCBACQQJ0aiIHLwEAOwAAIAVBQGsgBy0AAhABIActAAMhByAEIAlqIgkgBiAFQShqIAgQAkECdGoiBC8BADsAACAFQShqIAQtAAIQASAELQADIQQgAyANaiIDIAYgBUEQaiAIEAJBAnRqIg0vAQA7AAAgBUEQaiANLQACEAEgACALaiEAIAcgCmohByAEIAlqIQQgAyANLQADaiEDIAVB2ABqEA0gBUFAaxANciAFQShqEA1yIAVBEGoQDXJFIQsMAQsLIAQgDksgByACS3INAEFsIQsgACAMSw0BIAxBfWohCQNAQQAgACAJSSAFQdgAahAEGwRAIAAgBiAFQdgAaiAIEAJBAnRqIgovAQA7AAAgBUHYAGogCi0AAhABIAAgCi0AA2oiACAGIAVB2ABqIAgQAkECdGoiCi8BADsAACAFQdgAaiAKLQACEAEgACAKLQADaiEADAEFIAxBfmohCgNAIAVB2ABqEAQgACAKS3JFBEAgACAGIAVB2ABqIAgQAkECdGoiCS8BADsAACAFQdgAaiAJLQACEAEgACAJLQADaiEADAELCwNAIAAgCk0EQCAAIAYgBUHYAGogCBACQQJ0aiIJLwEAOwAAIAVB2ABqIAktAAIQASAAIAktAANqIQAMAQsLAkAgACAMTw0AIAAgBiAFQdgAaiAIEAIiAEECdGoiDC0AADoAACAMLQADQQFGBEAgBUHYAGogDC0AAhABDAELIAUoAlxBH0sNACAFQdgAaiAGIABBAnRqLQACEAEgBSgCXEEhSQ0AIAVBIDYCXAsgAkF9aiEMA0BBACAHIAxJIAVBQGsQBBsEQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiIAIAYgBUFAayAIEAJBAnRqIgcvAQA7AAAgBUFAayAHLQACEAEgACAHLQADaiEHDAEFIAJBfmohDANAIAVBQGsQBCAHIAxLckUEQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiEHDAELCwNAIAcgDE0EQCAHIAYgBUFAayAIEAJBAnRqIgAvAQA7AAAgBUFAayAALQACEAEgByAALQADaiEHDAELCwJAIAcgAk8NACAHIAYgBUFAayAIEAIiAEECdGoiAi0AADoAACACLQADQQFGBEAgBUFAayACLQACEAEMAQsgBSgCREEfSw0AIAVBQGsgBiAAQQJ0ai0AAhABIAUoAkRBIUkNACAFQSA2AkQLIA5BfWohAgNAQQAgBCACSSAFQShqEAQbBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2oiACAGIAVBKGogCBACQQJ0aiIELwEAOwAAIAVBKGogBC0AAhABIAAgBC0AA2ohBAwBBSAOQX5qIQIDQCAFQShqEAQgBCACS3JFBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2ohBAwBCwsDQCAEIAJNBEAgBCAGIAVBKGogCBACQQJ0aiIALwEAOwAAIAVBKGogAC0AAhABIAQgAC0AA2ohBAwBCwsCQCAEIA5PDQAgBCAGIAVBKGogCBACIgBBAnRqIgItAAA6AAAgAi0AA0EBRgRAIAVBKGogAi0AAhABDAELIAUoAixBH0sNACAFQShqIAYgAEECdGotAAIQASAFKAIsQSFJDQAgBUEgNgIsCwNAQQAgAyAQSSAFQRBqEAQbBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2oiACAGIAVBEGogCBACQQJ0aiICLwEAOwAAIAVBEGogAi0AAhABIAAgAi0AA2ohAwwBBSAPQX5qIQIDQCAFQRBqEAQgAyACS3JFBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2ohAwwBCwsDQCADIAJNBEAgAyAGIAVBEGogCBACQQJ0aiIALwEAOwAAIAVBEGogAC0AAhABIAMgAC0AA2ohAwwBCwsCQCADIA9PDQAgAyAGIAVBEGogCBACIgBBAnRqIgItAAA6AAAgAi0AA0EBRgRAIAVBEGogAi0AAhABDAELIAUoAhRBH0sNACAFQRBqIAYgAEECdGotAAIQASAFKAIUQSFJDQAgBUEgNgIUCyABQWwgBUHYAGoQCiAFQUBrEApxIAVBKGoQCnEgBUEQahAKcRshCwwJCwAACwALAAALAAsAAAsACwAACwALQWwhCwsgBUHwAGokACALC7UEAQ5/IwBBEGsiBiQAIAZBBGogABAOQVQhBQJAIARB3AtJDQAgBi0ABCEHIANB8ARqQQBB7AAQECEIIAdBDEsNACADQdwJaiIJIAggBkEIaiAGQQxqIAEgAhAxIhAQA0UEQCAGKAIMIgQgB0sNASADQdwFaiEPIANBpAVqIREgAEEEaiESIANBqAVqIQEgBCEFA0AgBSICQX9qIQUgCCACQQJ0aigCAEUNAAsgAkEBaiEOQQEhBQNAIAUgDk9FBEAgCCAFQQJ0IgtqKAIAIQwgASALaiAKNgIAIAVBAWohBSAKIAxqIQoMAQsLIAEgCjYCAEEAIQUgBigCCCELA0AgBSALRkUEQCABIAUgCWotAAAiDEECdGoiDSANKAIAIg1BAWo2AgAgDyANQQF0aiINIAw6AAEgDSAFOgAAIAVBAWohBQwBCwtBACEBIANBADYCqAUgBEF/cyAHaiEJQQEhBQNAIAUgDk9FBEAgCCAFQQJ0IgtqKAIAIQwgAyALaiABNgIAIAwgBSAJanQgAWohASAFQQFqIQUMAQsLIAcgBEEBaiIBIAJrIgRrQQFqIQgDQEEBIQUgBCAIT0UEQANAIAUgDk9FBEAgBUECdCIJIAMgBEE0bGpqIAMgCWooAgAgBHY2AgAgBUEBaiEFDAELCyAEQQFqIQQMAQsLIBIgByAPIAogESADIAIgARBkIAZBAToABSAGIAc6AAYgACAGKAIENgIACyAQIQULIAZBEGokACAFC8ENAQt/IwBB8ABrIgUkAEFsIQkCQCADQQpJDQAgAi8AACEKIAIvAAIhDCACLwAEIQYgBUEIaiAEEA4CQCADIAYgCiAMampBBmoiDUkNACAFLQAKIQcgBUHYAGogAkEGaiICIAoQBiIJEAMNASAFQUBrIAIgCmoiAiAMEAYiCRADDQEgBUEoaiACIAxqIgIgBhAGIgkQAw0BIAVBEGogAiAGaiADIA1rEAYiCRADDQEgACABaiIOQX1qIQ8gBEEEaiEGQQEhCSAAIAFBA2pBAnYiAmoiCiACaiIMIAJqIg0hAyAMIQQgCiECA0AgCSADIA9JcQRAIAYgBUHYAGogBxACQQF0aiIILQAAIQsgBUHYAGogCC0AARABIAAgCzoAACAGIAVBQGsgBxACQQF0aiIILQAAIQsgBUFAayAILQABEAEgAiALOgAAIAYgBUEoaiAHEAJBAXRqIggtAAAhCyAFQShqIAgtAAEQASAEIAs6AAAgBiAFQRBqIAcQAkEBdGoiCC0AACELIAVBEGogCC0AARABIAMgCzoAACAGIAVB2ABqIAcQAkEBdGoiCC0AACELIAVB2ABqIAgtAAEQASAAIAs6AAEgBiAFQUBrIAcQAkEBdGoiCC0AACELIAVBQGsgCC0AARABIAIgCzoAASAGIAVBKGogBxACQQF0aiIILQAAIQsgBUEoaiAILQABEAEgBCALOgABIAYgBUEQaiAHEAJBAXRqIggtAAAhCyAFQRBqIAgtAAEQASADIAs6AAEgA0ECaiEDIARBAmohBCACQQJqIQIgAEECaiEAIAkgBUHYAGoQDUVxIAVBQGsQDUVxIAVBKGoQDUVxIAVBEGoQDUVxIQkMAQsLIAQgDUsgAiAMS3INAEFsIQkgACAKSw0BIApBfWohCQNAIAVB2ABqEAQgACAJT3JFBEAgBiAFQdgAaiAHEAJBAXRqIggtAAAhCyAFQdgAaiAILQABEAEgACALOgAAIAYgBUHYAGogBxACQQF0aiIILQAAIQsgBUHYAGogCC0AARABIAAgCzoAASAAQQJqIQAMAQsLA0AgBUHYAGoQBCAAIApPckUEQCAGIAVB2ABqIAcQAkEBdGoiCS0AACEIIAVB2ABqIAktAAEQASAAIAg6AAAgAEEBaiEADAELCwNAIAAgCkkEQCAGIAVB2ABqIAcQAkEBdGoiCS0AACEIIAVB2ABqIAktAAEQASAAIAg6AAAgAEEBaiEADAELCyAMQX1qIQADQCAFQUBrEAQgAiAAT3JFBEAgBiAFQUBrIAcQAkEBdGoiCi0AACEJIAVBQGsgCi0AARABIAIgCToAACAGIAVBQGsgBxACQQF0aiIKLQAAIQkgBUFAayAKLQABEAEgAiAJOgABIAJBAmohAgwBCwsDQCAFQUBrEAQgAiAMT3JFBEAgBiAFQUBrIAcQAkEBdGoiAC0AACEKIAVBQGsgAC0AARABIAIgCjoAACACQQFqIQIMAQsLA0AgAiAMSQRAIAYgBUFAayAHEAJBAXRqIgAtAAAhCiAFQUBrIAAtAAEQASACIAo6AAAgAkEBaiECDAELCyANQX1qIQADQCAFQShqEAQgBCAAT3JFBEAgBiAFQShqIAcQAkEBdGoiAi0AACEKIAVBKGogAi0AARABIAQgCjoAACAGIAVBKGogBxACQQF0aiICLQAAIQogBUEoaiACLQABEAEgBCAKOgABIARBAmohBAwBCwsDQCAFQShqEAQgBCANT3JFBEAgBiAFQShqIAcQAkEBdGoiAC0AACECIAVBKGogAC0AARABIAQgAjoAACAEQQFqIQQMAQsLA0AgBCANSQRAIAYgBUEoaiAHEAJBAXRqIgAtAAAhAiAFQShqIAAtAAEQASAEIAI6AAAgBEEBaiEEDAELCwNAIAVBEGoQBCADIA9PckUEQCAGIAVBEGogBxACQQF0aiIALQAAIQIgBUEQaiAALQABEAEgAyACOgAAIAYgBUEQaiAHEAJBAXRqIgAtAAAhAiAFQRBqIAAtAAEQASADIAI6AAEgA0ECaiEDDAELCwNAIAVBEGoQBCADIA5PckUEQCAGIAVBEGogBxACQQF0aiIALQAAIQIgBUEQaiAALQABEAEgAyACOgAAIANBAWohAwwBCwsDQCADIA5JBEAgBiAFQRBqIAcQAkEBdGoiAC0AACECIAVBEGogAC0AARABIAMgAjoAACADQQFqIQMMAQsLIAFBbCAFQdgAahAKIAVBQGsQCnEgBUEoahAKcSAFQRBqEApxGyEJDAELQWwhCQsgBUHwAGokACAJC8oCAQR/IwBBIGsiBSQAIAUgBBAOIAUtAAIhByAFQQhqIAIgAxAGIgIQA0UEQCAEQQRqIQIgACABaiIDQX1qIQQDQCAFQQhqEAQgACAET3JFBEAgAiAFQQhqIAcQAkEBdGoiBi0AACEIIAVBCGogBi0AARABIAAgCDoAACACIAVBCGogBxACQQF0aiIGLQAAIQggBUEIaiAGLQABEAEgACAIOgABIABBAmohAAwBCwsDQCAFQQhqEAQgACADT3JFBEAgAiAFQQhqIAcQAkEBdGoiBC0AACEGIAVBCGogBC0AARABIAAgBjoAACAAQQFqIQAMAQsLA0AgACADT0UEQCACIAVBCGogBxACQQF0aiIELQAAIQYgBUEIaiAELQABEAEgACAGOgAAIABBAWohAAwBCwsgAUFsIAVBCGoQChshAgsgBUEgaiQAIAILtgMBCX8jAEEQayIGJAAgBkEANgIMIAZBADYCCEFUIQQCQAJAIANBQGsiDCADIAZBCGogBkEMaiABIAIQMSICEAMNACAGQQRqIAAQDiAGKAIMIgcgBi0ABEEBaksNASAAQQRqIQogBkEAOgAFIAYgBzoABiAAIAYoAgQ2AgAgB0EBaiEJQQEhBANAIAQgCUkEQCADIARBAnRqIgEoAgAhACABIAU2AgAgACAEQX9qdCAFaiEFIARBAWohBAwBCwsgB0EBaiEHQQAhBSAGKAIIIQkDQCAFIAlGDQEgAyAFIAxqLQAAIgRBAnRqIgBBASAEdEEBdSILIAAoAgAiAWoiADYCACAHIARrIQhBACEEAkAgC0EDTQRAA0AgBCALRg0CIAogASAEakEBdGoiACAIOgABIAAgBToAACAEQQFqIQQMAAALAAsDQCABIABPDQEgCiABQQF0aiIEIAg6AAEgBCAFOgAAIAQgCDoAAyAEIAU6AAIgBCAIOgAFIAQgBToABCAEIAg6AAcgBCAFOgAGIAFBBGohAQwAAAsACyAFQQFqIQUMAAALAAsgAiEECyAGQRBqJAAgBAutAQECfwJAQYQgKAIAIABHIAAoAgBBAXYiAyABa0F4aiICQXhxQQhHcgR/IAIFIAMQJ0UNASACQQhqC0EQSQ0AIAAgACgCACICQQFxIAAgAWpBD2pBeHEiASAAa0EBdHI2AgAgASAANgIEIAEgASgCAEEBcSAAIAJBAXZqIAFrIgJBAXRyNgIAQYQgIAEgAkH/////B3FqQQRqQYQgKAIAIABGGyABNgIAIAEQJQsLygIBBX8CQAJAAkAgAEEIIABBCEsbZ0EfcyAAaUEBR2oiAUEESSAAIAF2cg0AIAFBAnRB/B5qKAIAIgJFDQADQCACQXhqIgMoAgBBAXZBeGoiBSAATwRAIAIgBUEIIAVBCEsbZ0Efc0ECdEGAH2oiASgCAEYEQCABIAIoAgQ2AgALDAMLIARBHksNASAEQQFqIQQgAigCBCICDQALC0EAIQMgAUEgTw0BA0AgAUECdEGAH2ooAgAiAkUEQCABQR5LIQIgAUEBaiEBIAJFDQEMAwsLIAIgAkF4aiIDKAIAQQF2QXhqIgFBCCABQQhLG2dBH3NBAnRBgB9qIgEoAgBGBEAgASACKAIENgIACwsgAigCACIBBEAgASACKAIENgIECyACKAIEIgEEQCABIAIoAgA2AgALIAMgAygCAEEBcjYCACADIAAQNwsgAwvhCwINfwV+IwBB8ABrIgckACAHIAAoAvDhASIINgJcIAEgAmohDSAIIAAoAoDiAWohDwJAAkAgBUUEQCABIQQMAQsgACgCxOABIRAgACgCwOABIREgACgCvOABIQ4gAEEBNgKM4QFBACEIA0AgCEEDRwRAIAcgCEECdCICaiAAIAJqQazQAWooAgA2AkQgCEEBaiEIDAELC0FsIQwgB0EYaiADIAQQBhADDQEgB0EsaiAHQRhqIAAoAgAQEyAHQTRqIAdBGGogACgCCBATIAdBPGogB0EYaiAAKAIEEBMgDUFgaiESIAEhBEEAIQwDQCAHKAIwIAcoAixBA3RqKQIAIhRCEIinQf8BcSEIIAcoAkAgBygCPEEDdGopAgAiFUIQiKdB/wFxIQsgBygCOCAHKAI0QQN0aikCACIWQiCIpyEJIBVCIIghFyAUQiCIpyECAkAgFkIQiKdB/wFxIgNBAk8EQAJAIAZFIANBGUlyRQRAIAkgB0EYaiADQSAgBygCHGsiCiAKIANLGyIKEAUgAyAKayIDdGohCSAHQRhqEAQaIANFDQEgB0EYaiADEAUgCWohCQwBCyAHQRhqIAMQBSAJaiEJIAdBGGoQBBoLIAcpAkQhGCAHIAk2AkQgByAYNwNIDAELAkAgA0UEQCACBEAgBygCRCEJDAMLIAcoAkghCQwBCwJAAkAgB0EYakEBEAUgCSACRWpqIgNBA0YEQCAHKAJEQX9qIgMgA0VqIQkMAQsgA0ECdCAHaigCRCIJIAlFaiEJIANBAUYNAQsgByAHKAJINgJMCwsgByAHKAJENgJIIAcgCTYCRAsgF6chAyALBEAgB0EYaiALEAUgA2ohAwsgCCALakEUTwRAIAdBGGoQBBoLIAgEQCAHQRhqIAgQBSACaiECCyAHQRhqEAQaIAcgB0EYaiAUQhiIp0H/AXEQCCAUp0H//wNxajYCLCAHIAdBGGogFUIYiKdB/wFxEAggFadB//8DcWo2AjwgB0EYahAEGiAHIAdBGGogFkIYiKdB/wFxEAggFqdB//8DcWo2AjQgByACNgJgIAcoAlwhCiAHIAk2AmggByADNgJkAkACQAJAIAQgAiADaiILaiASSw0AIAIgCmoiEyAPSw0AIA0gBGsgC0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdBKGogACgCBBATQQAhBCAHQeAAaiEMIAdB5ABqIQoDQCAHQShqEARBAksgBCAXTnJFBEAgBygCQCAHKAI8QQN0aikCACIdQhCIp0H/AXEhCyAHKAJQIAcoAkxBA3RqKQIAIh5CEIinQf8BcSEJIAcoAkggBygCREEDdGopAgAiH0IgiKchCCAeQiCIISAgHUIgiKchAgJAIB9CEIinQf8BcSIDQQJPBEACQCAGRSADQRlJckUEQCAIIAdBKGogA0EgIAcoAixrIg0gDSADSxsiDRAFIAMgDWsiA3RqIQggB0EoahAEGiADRQ0BIAdBKGogAxAFIAhqIQgMAQsgB0EoaiADEAUgCGohCCAHQShqEAQaCyAHKQJUISEgByAINgJUIAcgITcDWAwBCwJAIANFBEAgAgRAIAcoAlQhCAwDCyAHKAJYIQgMAQsCQAJAIAdBKGpBARAFIAggAkVqaiIDQQNGBEAgBygCVEF/aiIDIANFaiEIDAELIANBAnQgB2ooAlQiCCAIRWohCCADQQFGDQELIAcgBygCWDYCXAsLIAcgBygCVDYCWCAHIAg2AlQLICCnIQMgCQRAIAdBKGogCRAFIANqIQMLIAkgC2pBFE8EQCAHQShqEAQaCyALBEAgB0EoaiALEAUgAmohAgsgB0EoahAEGiAHIAcoAmggAmoiCSADajYCaCAKIAwgCCAJSxsoAgAhDSAHIAdBKGogHUIYiKdB/wFxEAggHadB//8DcWo2AjwgByAHQShqIB5CGIinQf8BcRAIIB6nQf//A3FqNgJMIAdBKGoQBBogB0EoaiAfQhiIp0H/AXEQCCEOIAdB8ABqIARBBHRqIgsgCSANaiAIazYCDCALIAg2AgggCyADNgIEIAsgAjYCACAHIA4gH6dB//8DcWo2AkQgBEEBaiEEDAELCyAEIBdIDQEgEkFgaiEYIAdB4ABqIRogB0HkAGohGyABIQMDQCAHQShqEARBAksgBCAFTnJFBEAgBygCQCAHKAI8QQN0aikCACIdQhCIp0H/AXEhCyAHKAJQIAcoAkxBA3RqKQIAIh5CEIinQf8BcSEIIAcoAkggBygCREEDdGopAgAiH0IgiKchCSAeQiCIISAgHUIgiKchDAJAIB9CEIinQf8BcSICQQJPBEACQCAGRSACQRlJckUEQCAJIAdBKGogAkEgIAcoAixrIgogCiACSxsiChAFIAIgCmsiAnRqIQkgB0EoahAEGiACRQ0BIAdBKGogAhAFIAlqIQkMAQsgB0EoaiACEAUgCWohCSAHQShqEAQaCyAHKQJUISEgByAJNgJUIAcgITcDWAwBCwJAIAJFBEAgDARAIAcoAlQhCQwDCyAHKAJYIQkMAQsCQAJAIAdBKGpBARAFIAkgDEVqaiICQQNGBEAgBygCVEF/aiICIAJFaiEJDAELIAJBAnQgB2ooAlQiCSAJRWohCSACQQFGDQELIAcgBygCWDYCXAsLIAcgBygCVDYCWCAHIAk2AlQLICCnIRQgCARAIAdBKGogCBAFIBRqIRQLIAggC2pBFE8EQCAHQShqEAQaCyALBEAgB0EoaiALEAUgDGohDAsgB0EoahAEGiAHIAcoAmggDGoiGSAUajYCaCAbIBogCSAZSxsoAgAhHCAHIAdBKGogHUIYiKdB/wFxEAggHadB//8DcWo2AjwgByAHQShqIB5CGIinQf8BcRAIIB6nQf//A3FqNgJMIAdBKGoQBBogByAHQShqIB9CGIinQf8BcRAIIB+nQf//A3FqNgJEIAcgB0HwAGogBEEDcUEEdGoiDSkDCCIdNwPIASAHIA0pAwAiHjcDwAECQAJAAkAgBygCvAEiDiAepyICaiIWIBNLDQAgAyAHKALEASIKIAJqIgtqIBhLDQAgEiADayALQSBqTw0BCyAHIAcpA8gBNwMQIAcgBykDwAE3AwggAyASIAdBCGogB0G8AWogEyAPIBUgERAeIQsMAQsgAiADaiEIIAMgDhAHIAJBEU8EQCADQRBqIQIDQCACIA5BEGoiDhAHIAJBEGoiAiAISQ0ACwsgCCAdpyIOayECIAcgFjYCvAEgDiAIIA9rSwRAIA4gCCAVa0sEQEFsIQsMAgsgESACIA9rIgJqIhYgCmogEU0EQCAIIBYgChAPGgwCCyAIIBZBACACaxAPIQggByACIApqIgo2AsQBIAggAmshCCAPIQILIA5BEE8EQCAIIApqIQoDQCAIIAIQByACQRBqIQIgCEEQaiIIIApJDQALDAELAkAgDkEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgDkECdCIKQcAeaigCAGoiAhAXIAIgCkHgHmooAgBrIQIgBygCxAEhCgwBCyAIIAIQDAsgCkEJSQ0AIAggCmohCiAIQQhqIgggAkEIaiICa0EPTARAA0AgCCACEAwgAkEIaiECIAhBCGoiCCAKSQ0ADAIACwALA0AgCCACEAcgAkEQaiECIAhBEGoiCCAKSQ0ACwsgCxADBEAgCyEQDAQFIA0gDDYCACANIBkgHGogCWs2AgwgDSAJNgIIIA0gFDYCBCAEQQFqIQQgAyALaiEDDAILAAsLIAQgBUgNASAEIBdrIQtBACEEA0AgCyAFSARAIAcgB0HwAGogC0EDcUEEdGoiAikDCCIdNwPIASAHIAIpAwAiHjcDwAECQAJAAkAgBygCvAEiDCAepyICaiIKIBNLDQAgAyAHKALEASIJIAJqIhBqIBhLDQAgEiADayAQQSBqTw0BCyAHIAcpA8gBNwMgIAcgBykDwAE3AxggAyASIAdBGGogB0G8AWogEyAPIBUgERAeIRAMAQsgAiADaiEIIAMgDBAHIAJBEU8EQCADQRBqIQIDQCACIAxBEGoiDBAHIAJBEGoiAiAISQ0ACwsgCCAdpyIGayECIAcgCjYCvAEgBiAIIA9rSwRAIAYgCCAVa0sEQEFsIRAMAgsgESACIA9rIgJqIgwgCWogEU0EQCAIIAwgCRAPGgwCCyAIIAxBACACaxAPIQggByACIAlqIgk2AsQBIAggAmshCCAPIQILIAZBEE8EQCAIIAlqIQYDQCAIIAIQByACQRBqIQIgCEEQaiIIIAZJDQALDAELAkAgBkEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgBkECdCIGQcAeaigCAGoiAhAXIAIgBkHgHmooAgBrIQIgBygCxAEhCQwBCyAIIAIQDAsgCUEJSQ0AIAggCWohBiAIQQhqIgggAkEIaiICa0EPTARAA0AgCCACEAwgAkEIaiECIAhBCGoiCCAGSQ0ADAIACwALA0AgCCACEAcgAkEQaiECIAhBEGoiCCAGSQ0ACwsgEBADDQMgC0EBaiELIAMgEGohAwwBCwsDQCAEQQNHBEAgACAEQQJ0IgJqQazQAWogAiAHaigCVDYCACAEQQFqIQQMAQsLIAcoArwBIQgLQbp/IRAgEyAIayIAIBIgA2tLDQAgAwR/IAMgCCAAEAsgAGoFQQALIAFrIRALIAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY0AAQMyIFEAMiBg0AIANBHzYCfCADIANB/ABqIANB+ABqIAQgBCAFaiAGGyIEIAEgAmoiAiAEaxAVIgUQAw0AIAMoAnwiBkEfSw0AIAMoAngiB0EJTw0AIABBiCBqIAMgBkGAC0GADCAHEBggA0E0NgJ8IAMgA0H8AGogA0H4AGogBCAFaiIEIAIgBGsQFSIFEAMNACADKAJ8IgZBNEsNACADKAJ4IgdBCk8NACAAQZAwaiADIAZBgA1B4A4gBxAYIANBIzYCfCADIANB/ABqIANB+ABqIAQgBWoiBCACIARrEBUiBRADDQAgAygCfCIGQSNLDQAgAygCeCIHQQpPDQAgACADIAZBwBBB0BEgBxAYIAQgBWoiBEEMaiIFIAJLDQAgAiAFayEFQQAhAgNAIAJBA0cEQCAEKAAAIgZBf2ogBU8NAiAAIAJBAnRqQZzQAWogBjYCACACQQFqIQIgBEEEaiEEDAELCyAEIAFrIQgLIANBgAFqJAAgCAtGAQN/IABBCGohAyAAKAIEIQJBACEAA0AgACACdkUEQCABIAMgAEEDdGotAAJBFktqIQEgAEEBaiEADAELCyABQQggAmt0C4YDAQV/Qbh/IQcCQCADRQ0AIAItAAAiBEUEQCABQQA2AgBBAUG4fyADQQFGGw8LAn8gAkEBaiIFIARBGHRBGHUiBkF/Sg0AGiAGQX9GBEAgA0EDSA0CIAUvAABBgP4BaiEEIAJBA2oMAQsgA0ECSA0BIAItAAEgBEEIdHJBgIB+aiEEIAJBAmoLIQUgASAENgIAIAVBAWoiASACIANqIgNLDQBBbCEHIABBEGogACAFLQAAIgVBBnZBI0EJIAEgAyABa0HAEEHQEUHwEiAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBmCBqIABBCGogBUEEdkEDcUEfQQggASABIAZqIAgbIgEgAyABa0GAC0GADEGAFyAAKAKM4QEgACgCnOIBIAQQHyIGEAMiCA0AIABBoDBqIABBBGogBUECdkEDcUE0QQkgASABIAZqIAgbIgEgAyABa0GADUHgDkGQGSAAKAKM4QEgACgCnOIBIAQQHyIAEAMNACAAIAFqIAJrIQcLIAcLrQMBCn8jAEGABGsiCCQAAn9BUiACQf8BSw0AGkFUIANBDEsNABogAkEBaiELIABBBGohCUGAgAQgA0F/anRBEHUhCkEAIQJBASEEQQEgA3QiB0F/aiIMIQUDQCACIAtGRQRAAkAgASACQQF0Ig1qLwEAIgZB//8DRgRAIAkgBUECdGogAjoAAiAFQX9qIQVBASEGDAELIARBACAKIAZBEHRBEHVKGyEECyAIIA1qIAY7AQAgAkEBaiECDAELCyAAIAQ7AQIgACADOwEAIAdBA3YgB0EBdmpBA2ohBkEAIQRBACECA0AgBCALRkUEQCABIARBAXRqLgEAIQpBACEAA0AgACAKTkUEQCAJIAJBAnRqIAQ6AAIDQCACIAZqIAxxIgIgBUsNAAsgAEEBaiEADAELCyAEQQFqIQQMAQsLQX8gAg0AGkEAIQIDfyACIAdGBH9BAAUgCCAJIAJBAnRqIgAtAAJBAXRqIgEgAS8BACIBQQFqOwEAIAAgAyABEBRrIgU6AAMgACABIAVB/wFxdCAHazsBACACQQFqIQIMAQsLCyEFIAhBgARqJAAgBQvjBgEIf0FsIQcCQCACQQNJDQACQAJAAkACQCABLQAAIgNBA3EiCUEBaw4DAwEAAgsgACgCiOEBDQBBYg8LIAJBBUkNAkEDIQYgASgAACEFAn8CQAJAIANBAnZBA3EiCEF+aiIEQQFNBEAgBEEBaw0BDAILIAVBDnZB/wdxIQQgBUEEdkH/B3EhAyAIRQwCCyAFQRJ2IQRBBCEGIAVBBHZB//8AcSEDQQAMAQsgBUEEdkH//w9xIgNBgIAISw0DIAEtAARBCnQgBUEWdnIhBEEFIQZBAAshBSAEIAZqIgogAksNAgJAIANBgQZJDQAgACgCnOIBRQ0AQQAhAgNAIAJBg4ABSw0BIAJBQGshAgwAAAsACwJ/IAlBA0YEQCABIAZqIQEgAEHw4gFqIQIgACgCDCEGIAUEQCACIAMgASAEIAYQXwwCCyACIAMgASAEIAYQXQwBCyAAQbjQAWohAiABIAZqIQEgAEHw4gFqIQYgAEGo0ABqIQggBQRAIAggBiADIAEgBCACEF4MAQsgCCAGIAMgASAEIAIQXAsQAw0CIAAgAzYCgOIBIABBATYCiOEBIAAgAEHw4gFqNgLw4QEgCUECRgRAIAAgAEGo0ABqNgIMCyAAIANqIgBBiOMBakIANwAAIABBgOMBakIANwAAIABB+OIBakIANwAAIABB8OIBakIANwAAIAoPCwJ/AkACQAJAIANBAnZBA3FBf2oiBEECSw0AIARBAWsOAgACAQtBASEEIANBA3YMAgtBAiEEIAEvAABBBHYMAQtBAyEEIAEQIUEEdgsiAyAEaiIFQSBqIAJLBEAgBSACSw0CIABB8OIBaiABIARqIAMQCyEBIAAgAzYCgOIBIAAgATYC8OEBIAEgA2oiAEIANwAYIABCADcAECAAQgA3AAggAEIANwAAIAUPCyAAIAM2AoDiASAAIAEgBGo2AvDhASAFDwsCfwJAAkACQCADQQJ2QQNxQX9qIgRBAksNACAEQQFrDgIAAgELQQEhByADQQN2DAILQQIhByABLwAAQQR2DAELIAJBBEkgARAhIgJBj4CAAUtyDQFBAyEHIAJBBHYLIQIgAEHw4gFqIAEgB2otAAAgAkEgahAQIQEgACACNgKA4gEgACABNgLw4QEgB0EBaiEHCyAHC0sAIABC+erQ0OfJoeThADcDICAAQgA3AxggAELP1tO+0ser2UI3AxAgAELW64Lu6v2J9eAANwMIIABCADcDACAAQShqQQBBKBAQGgviAgICfwV+IABBKGoiASAAKAJIaiECAn4gACkDACIDQiBaBEAgACkDECIEQgeJIAApAwgiBUIBiXwgACkDGCIGQgyJfCAAKQMgIgdCEol8IAUQGSAEEBkgBhAZIAcQGQwBCyAAKQMYQsXP2bLx5brqJ3wLIAN8IQMDQCABQQhqIgAgAk0EQEIAIAEpAAAQCSADhUIbiUKHla+vmLbem55/fkLj3MqV/M7y9YV/fCEDIAAhAQwBCwsCQCABQQRqIgAgAksEQCABIQAMAQsgASgAAK1Ch5Wvr5i23puef34gA4VCF4lCz9bTvtLHq9lCfkL5893xmfaZqxZ8IQMLA0AgACACSQRAIAAxAABCxc/ZsvHluuonfiADhUILiUKHla+vmLbem55/fiEDIABBAWohAAwBCwsgA0IhiCADhULP1tO+0ser2UJ+IgNCHYggA4VC+fPd8Zn2masWfiIDQiCIIAOFC+8CAgJ/BH4gACAAKQMAIAKtfDcDAAJAAkAgACgCSCIDIAJqIgRBH00EQCABRQ0BIAAgA2pBKGogASACECAgACgCSCACaiEEDAELIAEgAmohAgJ/IAMEQCAAQShqIgQgA2ogAUEgIANrECAgACAAKQMIIAQpAAAQCTcDCCAAIAApAxAgACkAMBAJNwMQIAAgACkDGCAAKQA4EAk3AxggACAAKQMgIABBQGspAAAQCTcDICAAKAJIIQMgAEEANgJIIAEgA2tBIGohAQsgAUEgaiACTQsEQCACQWBqIQMgACkDICEFIAApAxghBiAAKQMQIQcgACkDCCEIA0AgCCABKQAAEAkhCCAHIAEpAAgQCSEHIAYgASkAEBAJIQYgBSABKQAYEAkhBSABQSBqIgEgA00NAAsgACAFNwMgIAAgBjcDGCAAIAc3AxAgACAINwMICyABIAJPDQEgAEEoaiABIAIgAWsiBBAgCyAAIAQ2AkgLCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQEBogAwVBun8LCy8BAX8gAEUEQEG2f0EAIAMbDwtBun8hBCADIAFNBH8gACACIAMQCxogAwVBun8LC6gCAQZ/IwBBEGsiByQAIABB2OABaikDAEKAgIAQViEIQbh/IQUCQCAEQf//B0sNACAAIAMgBBBCIgUQAyIGDQAgACgCnOIBIQkgACAHQQxqIAMgAyAFaiAGGyIKIARBACAFIAYbayIGEEAiAxADBEAgAyEFDAELIAcoAgwhBCABRQRAQbp/IQUgBEEASg0BCyAGIANrIQUgAyAKaiEDAkAgCQRAIABBADYCnOIBDAELAkACQAJAIARBBUgNACAAQdjgAWopAwBCgICACFgNAAwBCyAAQQA2ApziAQwBCyAAKAIIED8hBiAAQQA2ApziASAGQRRPDQELIAAgASACIAMgBSAEIAgQOSEFDAELIAAgASACIAMgBSAEIAgQOiEFCyAHQRBqJAAgBQtnACAAQdDgAWogASACIAAoAuzhARAuIgEQAwRAIAEPC0G4fyECAkAgAQ0AIABB7OABaigCACIBBEBBYCECIAAoApjiASABRw0BC0EAIQIgAEHw4AFqKAIARQ0AIABBkOEBahBDCyACCycBAX8QVyIERQRAQUAPCyAEIAAgASACIAMgBBBLEE8hACAEEFYgAAs/AQF/AkACQAJAIAAoAqDiAUEBaiIBQQJLDQAgAUEBaw4CAAECCyAAEDBBAA8LIABBADYCoOIBCyAAKAKU4gELvAMCB38BfiMAQRBrIgkkAEG4fyEGAkAgBCgCACIIQQVBCSAAKALs4QEiBRtJDQAgAygCACIHQQFBBSAFGyAFEC8iBRADBEAgBSEGDAELIAggBUEDakkNACAAIAcgBRBJIgYQAw0AIAEgAmohCiAAQZDhAWohCyAIIAVrIQIgBSAHaiEHIAEhBQNAIAcgAiAJECwiBhADDQEgAkF9aiICIAZJBEBBuH8hBgwCCyAJKAIAIghBAksEQEFsIQYMAgsgB0EDaiEHAn8CQAJAAkAgCEEBaw4CAgABCyAAIAUgCiAFayAHIAYQSAwCCyAFIAogBWsgByAGEEcMAQsgBSAKIAVrIActAAAgCSgCCBBGCyIIEAMEQCAIIQYMAgsgACgC8OABBEAgCyAFIAgQRQsgAiAGayECIAYgB2ohByAFIAhqIQUgCSgCBEUNAAsgACkD0OABIgxCf1IEQEFsIQYgDCAFIAFrrFINAQsgACgC8OABBEBBaiEGIAJBBEkNASALEEQhDCAHKAAAIAynRw0BIAdBBGohByACQXxqIQILIAMgBzYCACAEIAI2AgAgBSABayEGCyAJQRBqJAAgBgsuACAAECsCf0EAQQAQAw0AGiABRSACRXJFBEBBYiAAIAEgAhA9EAMNARoLQQALCzcAIAEEQCAAIAAoAsTgASABKAIEIAEoAghqRzYCnOIBCyAAECtBABADIAFFckUEQCAAIAEQWwsL0QIBB38jAEEQayIGJAAgBiAENgIIIAYgAzYCDCAFBEAgBSgCBCEKIAUoAgghCQsgASEIAkACQANAIAAoAuzhARAWIQsCQANAIAQgC0kNASADKAAAQXBxQdDUtMIBRgRAIAMgBBAiIgcQAw0EIAQgB2shBCADIAdqIQMMAQsLIAYgAzYCDCAGIAQ2AggCQCAFBEAgACAFEE5BACEHQQAQA0UNAQwFCyAAIAogCRBNIgcQAw0ECyAAIAgQUCAMQQFHQQAgACAIIAIgBkEMaiAGQQhqEEwiByIDa0EAIAMQAxtBCkdyRQRAQbh/IQcMBAsgBxADDQMgAiAHayECIAcgCGohCEEBIQwgBigCDCEDIAYoAgghBAwBCwsgBiADNgIMIAYgBDYCCEG4fyEHIAQNASAIIAFrIQcMAQsgBiADNgIMIAYgBDYCCAsgBkEQaiQAIAcLRgECfyABIAAoArjgASICRwRAIAAgAjYCxOABIAAgATYCuOABIAAoArzgASEDIAAgATYCvOABIAAgASADIAJrajYCwOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEEdCAAbiECCyAAQQh2IgEgAkEYbCIAQYwIaigCAGwgAEGICGooAgBqIgJBA3YgAmogAEGACGooAgAgAEGECGooAgAgAWxqSQs3ACAAIAMgBCAFQYAQEDMiBRADBEAgBQ8LIAUgBEkEfyABIAIgAyAFaiAEIAVrIAAQMgVBuH8LC78DAQN/IwBBIGsiBSQAIAVBCGogAiADEAYiAhADRQRAIAAgAWoiB0F9aiEGIAUgBBAOIARBBGohAiAFLQACIQMDQEEAIAAgBkkgBUEIahAEGwRAIAAgAiAFQQhqIAMQAkECdGoiBC8BADsAACAFQQhqIAQtAAIQASAAIAQtAANqIgQgAiAFQQhqIAMQAkECdGoiAC8BADsAACAFQQhqIAAtAAIQASAEIAAtAANqIQAMAQUgB0F+aiEEA0AgBUEIahAEIAAgBEtyRQRAIAAgAiAFQQhqIAMQAkECdGoiBi8BADsAACAFQQhqIAYtAAIQASAAIAYtAANqIQAMAQsLA0AgACAES0UEQCAAIAIgBUEIaiADEAJBAnRqIgYvAQA7AAAgBUEIaiAGLQACEAEgACAGLQADaiEADAELCwJAIAAgB08NACAAIAIgBUEIaiADEAIiA0ECdGoiAC0AADoAACAALQADQQFGBEAgBUEIaiAALQACEAEMAQsgBSgCDEEfSw0AIAVBCGogAiADQQJ0ai0AAhABIAUoAgxBIUkNACAFQSA2AgwLIAFBbCAFQQhqEAobIQILCwsgBUEgaiQAIAILkgIBBH8jAEFAaiIJJAAgCSADQTQQCyEDAkAgBEECSA0AIAMgBEECdGooAgAhCSADQTxqIAgQIyADQQE6AD8gAyACOgA+QQAhBCADKAI8IQoDQCAEIAlGDQEgACAEQQJ0aiAKNgEAIARBAWohBAwAAAsAC0EAIQkDQCAGIAlGRQRAIAMgBSAJQQF0aiIKLQABIgtBAnRqIgwoAgAhBCADQTxqIAotAABBCHQgCGpB//8DcRAjIANBAjoAPyADIAcgC2siCiACajoAPiAEQQEgASAKa3RqIQogAygCPCELA0AgACAEQQJ0aiALNgEAIARBAWoiBCAKSQ0ACyAMIAo2AgAgCUEBaiEJDAELCyADQUBrJAALowIBCX8jAEHQAGsiCSQAIAlBEGogBUE0EAsaIAcgBmshDyAHIAFrIRADQAJAIAMgCkcEQEEBIAEgByACIApBAXRqIgYtAAEiDGsiCGsiC3QhDSAGLQAAIQ4gCUEQaiAMQQJ0aiIMKAIAIQYgCyAPTwRAIAAgBkECdGogCyAIIAUgCEE0bGogCCAQaiIIQQEgCEEBShsiCCACIAQgCEECdGooAgAiCEEBdGogAyAIayAHIA4QYyAGIA1qIQgMAgsgCUEMaiAOECMgCUEBOgAPIAkgCDoADiAGIA1qIQggCSgCDCELA0AgBiAITw0CIAAgBkECdGogCzYBACAGQQFqIQYMAAALAAsgCUHQAGokAA8LIAwgCDYCACAKQQFqIQoMAAALAAs0ACAAIAMgBCAFEDYiBRADBEAgBQ8LIAUgBEkEfyABIAIgAyAFaiAEIAVrIAAQNAVBuH8LCyMAIAA/AEEQdGtB//8DakEQdkAAQX9GBEBBAA8LQQAQAEEBCzsBAX8gAgRAA0AgACABIAJBgCAgAkGAIEkbIgMQCyEAIAFBgCBqIQEgAEGAIGohACACIANrIgINAAsLCwYAIAAQAwsLqBUJAEGICAsNAQAAAAEAAAACAAAAAgBBoAgLswYBAAAAAQAAAAIAAAACAAAAJgAAAIIAAAAhBQAASgAAAGcIAAAmAAAAwAEAAIAAAABJBQAASgAAAL4IAAApAAAALAIAAIAAAABJBQAASgAAAL4IAAAvAAAAygIAAIAAAACKBQAASgAAAIQJAAA1AAAAcwMAAIAAAACdBQAASgAAAKAJAAA9AAAAgQMAAIAAAADrBQAASwAAAD4KAABEAAAAngMAAIAAAABNBgAASwAAAKoKAABLAAAAswMAAIAAAADBBgAATQAAAB8NAABNAAAAUwQAAIAAAAAjCAAAUQAAAKYPAABUAAAAmQQAAIAAAABLCQAAVwAAALESAABYAAAA2gQAAIAAAABvCQAAXQAAACMUAABUAAAARQUAAIAAAABUCgAAagAAAIwUAABqAAAArwUAAIAAAAB2CQAAfAAAAE4QAAB8AAAA0gIAAIAAAABjBwAAkQAAAJAHAACSAAAAAAAAAAEAAAABAAAABQAAAA0AAAAdAAAAPQAAAH0AAAD9AAAA/QEAAP0DAAD9BwAA/Q8AAP0fAAD9PwAA/X8AAP3/AAD9/wEA/f8DAP3/BwD9/w8A/f8fAP3/PwD9/38A/f//AP3//wH9//8D/f//B/3//w/9//8f/f//P/3//38AAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACUAAAAnAAAAKQAAACsAAAAvAAAAMwAAADsAAABDAAAAUwAAAGMAAACDAAAAAwEAAAMCAAADBAAAAwgAAAMQAAADIAAAA0AAAAOAAAADAAEAQeAPC1EBAAAAAQAAAAEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAEAAAABQAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAQcQQC4sBAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABIAAAAUAAAAFgAAABgAAAAcAAAAIAAAACgAAAAwAAAAQAAAAIAAAAAAAQAAAAIAAAAEAAAACAAAABAAAAAgAAAAQAAAAIAAAAAAAQBBkBIL5gQBAAAAAQAAAAEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAAAEAAAAEAAAACAAAAAAAAAABAAEBBgAAAAAAAAQAAAAAEAAABAAAAAAgAAAFAQAAAAAAAAUDAAAAAAAABQQAAAAAAAAFBgAAAAAAAAUHAAAAAAAABQkAAAAAAAAFCgAAAAAAAAUMAAAAAAAABg4AAAAAAAEFEAAAAAAAAQUUAAAAAAABBRYAAAAAAAIFHAAAAAAAAwUgAAAAAAAEBTAAAAAgAAYFQAAAAAAABwWAAAAAAAAIBgABAAAAAAoGAAQAAAAADAYAEAAAIAAABAAAAAAAAAAEAQAAAAAAAAUCAAAAIAAABQQAAAAAAAAFBQAAACAAAAUHAAAAAAAABQgAAAAgAAAFCgAAAAAAAAULAAAAAAAABg0AAAAgAAEFEAAAAAAAAQUSAAAAIAABBRYAAAAAAAIFGAAAACAAAwUgAAAAAAADBSgAAAAAAAYEQAAAABAABgRAAAAAIAAHBYAAAAAAAAkGAAIAAAAACwYACAAAMAAABAAAAAAQAAAEAQAAACAAAAUCAAAAIAAABQMAAAAgAAAFBQAAACAAAAUGAAAAIAAABQgAAAAgAAAFCQAAACAAAAULAAAAIAAABQwAAAAAAAAGDwAAACAAAQUSAAAAIAABBRQAAAAgAAIFGAAAACAAAgUcAAAAIAADBSgAAAAgAAQFMAAAAAAAEAYAAAEAAAAPBgCAAAAAAA4GAEAAAAAADQYAIABBgBcLhwIBAAEBBQAAAAAAAAUAAAAAAAAGBD0AAAAAAAkF/QEAAAAADwX9fwAAAAAVBf3/HwAAAAMFBQAAAAAABwR9AAAAAAAMBf0PAAAAABIF/f8DAAAAFwX9/38AAAAFBR0AAAAAAAgE/QAAAAAADgX9PwAAAAAUBf3/DwAAAAIFAQAAABAABwR9AAAAAAALBf0HAAAAABEF/f8BAAAAFgX9/z8AAAAEBQ0AAAAQAAgE/QAAAAAADQX9HwAAAAATBf3/BwAAAAEFAQAAABAABgQ9AAAAAAAKBf0DAAAAABAF/f8AAAAAHAX9//8PAAAbBf3//wcAABoF/f//AwAAGQX9//8BAAAYBf3//wBBkBkLhgQBAAEBBgAAAAAAAAYDAAAAAAAABAQAAAAgAAAFBQAAAAAAAAUGAAAAAAAABQgAAAAAAAAFCQAAAAAAAAULAAAAAAAABg0AAAAAAAAGEAAAAAAAAAYTAAAAAAAABhYAAAAAAAAGGQAAAAAAAAYcAAAAAAAABh8AAAAAAAAGIgAAAAAAAQYlAAAAAAABBikAAAAAAAIGLwAAAAAAAwY7AAAAAAAEBlMAAAAAAAcGgwAAAAAACQYDAgAAEAAABAQAAAAAAAAEBQAAACAAAAUGAAAAAAAABQcAAAAgAAAFCQAAAAAAAAUKAAAAAAAABgwAAAAAAAAGDwAAAAAAAAYSAAAAAAAABhUAAAAAAAAGGAAAAAAAAAYbAAAAAAAABh4AAAAAAAAGIQAAAAAAAQYjAAAAAAABBicAAAAAAAIGKwAAAAAAAwYzAAAAAAAEBkMAAAAAAAUGYwAAAAAACAYDAQAAIAAABAQAAAAwAAAEBAAAABAAAAQFAAAAIAAABQcAAAAgAAAFCAAAACAAAAUKAAAAIAAABQsAAAAAAAAGDgAAAAAAAAYRAAAAAAAABhQAAAAAAAAGFwAAAAAAAAYaAAAAAAAABh0AAAAAAAAGIAAAAAAAEAYDAAEAAAAPBgOAAAAAAA4GA0AAAAAADQYDIAAAAAAMBgMQAAAAAAsGAwgAAAAACgYDBABBpB0L2QEBAAAAAwAAAAcAAAAPAAAAHwAAAD8AAAB/AAAA/wAAAP8BAAD/AwAA/wcAAP8PAAD/HwAA/z8AAP9/AAD//wAA//8BAP//AwD//wcA//8PAP//HwD//z8A//9/AP///wD///8B////A////wf///8P////H////z////9/AAAAAAEAAAACAAAABAAAAAAAAAACAAAABAAAAAgAAAAAAAAAAQAAAAIAAAABAAAABAAAAAQAAAAEAAAABAAAAAgAAAAIAAAACAAAAAcAAAAIAAAACQAAAAoAAAALAEGgIAsDwBBQ';
  41609. function _createSuper$F(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$F(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  41610. function _isNativeReflectConstruct$F() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  41611. var _taskCache = new WeakMap();
  41612. var _activeLoaders = 0;
  41613. var _zstd;
  41614. var KTX2Loader = /*#__PURE__*/function (_Loader) {
  41615. _inherits(KTX2Loader, _Loader);
  41616. var _super = _createSuper$F(KTX2Loader);
  41617. function KTX2Loader(manager) {
  41618. var _this;
  41619. _classCallCheck(this, KTX2Loader);
  41620. _this = _super.call(this, manager);
  41621. _this.transcoderPath = '';
  41622. _this.transcoderBinary = null;
  41623. _this.transcoderPending = null;
  41624. _this.workerPool = new WorkerPool$1();
  41625. _this.workerSourceURL = '';
  41626. _this.workerConfig = null;
  41627. if (typeof MSC_TRANSCODER !== 'undefined') {
  41628. console.warn('THREE.KTX2Loader: Please update to latest "basis_transcoder".' + ' "msc_basis_transcoder" is no longer supported in three.js r125+.');
  41629. }
  41630. return _this;
  41631. }
  41632. _createClass(KTX2Loader, [{
  41633. key: "setTranscoderPath",
  41634. value: function setTranscoderPath(path) {
  41635. this.transcoderPath = path;
  41636. return this;
  41637. }
  41638. }, {
  41639. key: "setWorkerLimit",
  41640. value: function setWorkerLimit(num) {
  41641. this.workerPool.setWorkerLimit(num);
  41642. return this;
  41643. }
  41644. }, {
  41645. key: "detectSupport",
  41646. value: function detectSupport(renderer) {
  41647. this.workerConfig = {
  41648. astcSupported: renderer.extensions.has('WEBGL_compressed_texture_astc'),
  41649. etc1Supported: renderer.extensions.has('WEBGL_compressed_texture_etc1'),
  41650. etc2Supported: renderer.extensions.has('WEBGL_compressed_texture_etc'),
  41651. dxtSupported: renderer.extensions.has('WEBGL_compressed_texture_s3tc'),
  41652. bptcSupported: renderer.extensions.has('EXT_texture_compression_bptc'),
  41653. pvrtcSupported: renderer.extensions.has('WEBGL_compressed_texture_pvrtc') || renderer.extensions.has('WEBKIT_WEBGL_compressed_texture_pvrtc')
  41654. };
  41655. if (renderer.capabilities.isWebGL2) {
  41656. // https://github.com/mrdoob/three.js/pull/22928
  41657. this.workerConfig.etc1Supported = false;
  41658. }
  41659. return this;
  41660. }
  41661. }, {
  41662. key: "init",
  41663. value: function init() {
  41664. var _this2 = this;
  41665. if (!this.transcoderPending) {
  41666. // Load transcoder wrapper.
  41667. var jsLoader = new THREE$1.FileLoader(this.manager);
  41668. jsLoader.setPath(this.transcoderPath);
  41669. jsLoader.setWithCredentials(this.withCredentials);
  41670. var jsContent = jsLoader.loadAsync('basis_transcoder.js'); // Load transcoder WASM binary.
  41671. var binaryLoader = new THREE$1.FileLoader(this.manager);
  41672. binaryLoader.setPath(this.transcoderPath);
  41673. binaryLoader.setResponseType('arraybuffer');
  41674. binaryLoader.setWithCredentials(this.withCredentials);
  41675. var binaryContent = binaryLoader.loadAsync('basis_transcoder.wasm');
  41676. this.transcoderPending = Promise.all([jsContent, binaryContent]).then(function (_ref) {
  41677. var _ref2 = _slicedToArray(_ref, 2),
  41678. jsContent = _ref2[0],
  41679. binaryContent = _ref2[1];
  41680. var fn = KTX2Loader.BasisWorker.toString();
  41681. var body = ['/* constants */', 'let _EngineFormat = ' + JSON.stringify(KTX2Loader.EngineFormat), 'let _TranscoderFormat = ' + JSON.stringify(KTX2Loader.TranscoderFormat), 'let _BasisFormat = ' + JSON.stringify(KTX2Loader.BasisFormat), '/* basis_transcoder.js */', jsContent, '/* worker */', fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}'))].join('\n');
  41682. _this2.workerSourceURL = URL.createObjectURL(new Blob([body]));
  41683. _this2.transcoderBinary = binaryContent;
  41684. _this2.workerPool.setWorkerCreator(function () {
  41685. var worker = new Worker(_this2.workerSourceURL);
  41686. var transcoderBinary = _this2.transcoderBinary.slice(0);
  41687. worker.postMessage({
  41688. type: 'init',
  41689. config: _this2.workerConfig,
  41690. transcoderBinary
  41691. }, [transcoderBinary]);
  41692. return worker;
  41693. });
  41694. });
  41695. if (_activeLoaders > 0) {
  41696. // Each instance loads a transcoder and allocates workers, increasing network and memory cost.
  41697. console.warn('THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.' + ' Use a single KTX2Loader instance, or call .dispose() on old instances.');
  41698. }
  41699. _activeLoaders++;
  41700. }
  41701. return this.transcoderPending;
  41702. }
  41703. }, {
  41704. key: "load",
  41705. value: function load(url, onLoad, onProgress, onError) {
  41706. var _this3 = this;
  41707. if (this.workerConfig === null) {
  41708. throw new Error('THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.');
  41709. }
  41710. var loader = new THREE$1.FileLoader(this.manager);
  41711. loader.setResponseType('arraybuffer');
  41712. loader.setWithCredentials(this.withCredentials);
  41713. loader.load(url, function (buffer) {
  41714. // Check for an existing task using this buffer. A transferred buffer cannot be transferred
  41715. // again from this thread.
  41716. if (_taskCache.has(buffer)) {
  41717. var cachedTask = _taskCache.get(buffer);
  41718. return cachedTask.promise.then(onLoad).catch(onError);
  41719. }
  41720. _this3._createTexture(buffer).then(function (texture) {
  41721. return onLoad ? onLoad(texture) : null;
  41722. }).catch(onError);
  41723. }, onProgress, onError);
  41724. }
  41725. }, {
  41726. key: "_createTextureFrom",
  41727. value: function _createTextureFrom(transcodeResult) {
  41728. var mipmaps = transcodeResult.mipmaps,
  41729. width = transcodeResult.width,
  41730. height = transcodeResult.height,
  41731. format = transcodeResult.format,
  41732. type = transcodeResult.type,
  41733. error = transcodeResult.error,
  41734. dfdTransferFn = transcodeResult.dfdTransferFn,
  41735. dfdFlags = transcodeResult.dfdFlags;
  41736. if (type === 'error') return Promise.reject(error);
  41737. var texture = new THREE$1.CompressedTexture(mipmaps, width, height, format, THREE$1.UnsignedByteType);
  41738. texture.minFilter = mipmaps.length === 1 ? THREE$1.LinearFilter : THREE$1.LinearMipmapLinearFilter;
  41739. texture.magFilter = THREE$1.LinearFilter;
  41740. texture.generateMipmaps = false;
  41741. texture.needsUpdate = true;
  41742. texture.encoding = dfdTransferFn === x$1 ? THREE$1.sRGBEncoding : THREE$1.LinearEncoding;
  41743. texture.premultiplyAlpha = !!(dfdFlags & p$1);
  41744. return texture;
  41745. }
  41746. /**
  41747. * @param {ArrayBuffer} buffer
  41748. * @param {object?} config
  41749. * @return {Promise<CompressedTexture|DataTexture|Data3DTexture>}
  41750. */
  41751. }, {
  41752. key: "_createTexture",
  41753. value: function _createTexture(buffer) {
  41754. var _this4 = this;
  41755. var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  41756. var container = Pi(new Uint8Array(buffer));
  41757. if (container.vkFormat !== nt) {
  41758. return createDataTexture(container);
  41759. } //
  41760. var taskConfig = config;
  41761. var texturePending = this.init().then(function () {
  41762. return _this4.workerPool.postMessage({
  41763. type: 'transcode',
  41764. buffer,
  41765. taskConfig: taskConfig
  41766. }, [buffer]);
  41767. }).then(function (e) {
  41768. return _this4._createTextureFrom(e.data);
  41769. }); // Cache the task result.
  41770. _taskCache.set(buffer, {
  41771. promise: texturePending
  41772. });
  41773. return texturePending;
  41774. }
  41775. }, {
  41776. key: "dispose",
  41777. value: function dispose() {
  41778. this.workerPool.dispose();
  41779. if (this.workerSourceURL) URL.revokeObjectURL(this.workerSourceURL);
  41780. _activeLoaders--;
  41781. return this;
  41782. }
  41783. }]);
  41784. return KTX2Loader;
  41785. }(THREE$1.Loader);
  41786. /* CONSTANTS */
  41787. KTX2Loader.BasisFormat = {
  41788. ETC1S: 0,
  41789. UASTC_4x4: 1
  41790. };
  41791. KTX2Loader.TranscoderFormat = {
  41792. ETC1: 0,
  41793. ETC2: 1,
  41794. BC1: 2,
  41795. BC3: 3,
  41796. BC4: 4,
  41797. BC5: 5,
  41798. BC7_M6_OPAQUE_ONLY: 6,
  41799. BC7_M5: 7,
  41800. PVRTC1_4_RGB: 8,
  41801. PVRTC1_4_RGBA: 9,
  41802. ASTC_4x4: 10,
  41803. ATC_RGB: 11,
  41804. ATC_RGBA_INTERPOLATED_ALPHA: 12,
  41805. RGBA32: 13,
  41806. RGB565: 14,
  41807. BGR565: 15,
  41808. RGBA4444: 16
  41809. };
  41810. KTX2Loader.EngineFormat = {
  41811. RGBAFormat: THREE$1.RGBAFormat,
  41812. RGBA_ASTC_4x4_Format: THREE$1.RGBA_ASTC_4x4_Format,
  41813. RGBA_BPTC_Format: THREE$1.RGBA_BPTC_Format,
  41814. RGBA_ETC2_EAC_Format: THREE$1.RGBA_ETC2_EAC_Format,
  41815. RGBA_PVRTC_4BPPV1_Format: THREE$1.RGBA_PVRTC_4BPPV1_Format,
  41816. RGBA_S3TC_DXT5_Format: THREE$1.RGBA_S3TC_DXT5_Format,
  41817. RGB_ETC1_Format: THREE$1.RGB_ETC1_Format,
  41818. RGB_ETC2_Format: THREE$1.RGB_ETC2_Format,
  41819. RGB_PVRTC_4BPPV1_Format: THREE$1.RGB_PVRTC_4BPPV1_Format,
  41820. RGB_S3TC_DXT1_Format: THREE$1.RGB_S3TC_DXT1_Format
  41821. };
  41822. /* WEB WORKER */
  41823. KTX2Loader.BasisWorker = function () {
  41824. var config;
  41825. var transcoderPending;
  41826. var BasisModule;
  41827. var EngineFormat = _EngineFormat; // eslint-disable-line no-undef
  41828. var TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef
  41829. var BasisFormat = _BasisFormat; // eslint-disable-line no-undef
  41830. self.addEventListener('message', function (e) {
  41831. var message = e.data;
  41832. switch (message.type) {
  41833. case 'init':
  41834. config = message.config;
  41835. init(message.transcoderBinary);
  41836. break;
  41837. case 'transcode':
  41838. transcoderPending.then(function () {
  41839. try {
  41840. var _transcode = transcode(message.buffer),
  41841. width = _transcode.width,
  41842. height = _transcode.height,
  41843. hasAlpha = _transcode.hasAlpha,
  41844. mipmaps = _transcode.mipmaps,
  41845. format = _transcode.format,
  41846. dfdTransferFn = _transcode.dfdTransferFn,
  41847. dfdFlags = _transcode.dfdFlags;
  41848. var buffers = [];
  41849. for (var i = 0; i < mipmaps.length; ++i) {
  41850. buffers.push(mipmaps[i].data.buffer);
  41851. }
  41852. self.postMessage({
  41853. type: 'transcode',
  41854. id: message.id,
  41855. width,
  41856. height,
  41857. hasAlpha,
  41858. mipmaps,
  41859. format,
  41860. dfdTransferFn,
  41861. dfdFlags
  41862. }, buffers);
  41863. } catch (error) {
  41864. console.error(error);
  41865. self.postMessage({
  41866. type: 'error',
  41867. id: message.id,
  41868. error: error.message
  41869. });
  41870. }
  41871. });
  41872. break;
  41873. }
  41874. });
  41875. function init(wasmBinary) {
  41876. transcoderPending = new Promise(function (resolve) {
  41877. BasisModule = {
  41878. wasmBinary,
  41879. onRuntimeInitialized: resolve
  41880. };
  41881. BASIS(BasisModule); // eslint-disable-line no-undef
  41882. }).then(function () {
  41883. BasisModule.initializeBasis();
  41884. if (BasisModule.KTX2File === undefined) {
  41885. console.warn('THREE.KTX2Loader: Please update Basis Universal transcoder.');
  41886. }
  41887. });
  41888. }
  41889. function transcode(buffer) {
  41890. var ktx2File = new BasisModule.KTX2File(new Uint8Array(buffer));
  41891. function cleanup() {
  41892. ktx2File.close();
  41893. ktx2File.delete();
  41894. }
  41895. if (!ktx2File.isValid()) {
  41896. cleanup();
  41897. throw new Error('THREE.KTX2Loader: Invalid or unsupported .ktx2 file');
  41898. }
  41899. var basisFormat = ktx2File.isUASTC() ? BasisFormat.UASTC_4x4 : BasisFormat.ETC1S;
  41900. var width = ktx2File.getWidth();
  41901. var height = ktx2File.getHeight();
  41902. var levels = ktx2File.getLevels();
  41903. var hasAlpha = ktx2File.getHasAlpha();
  41904. var dfdTransferFn = ktx2File.getDFDTransferFunc();
  41905. var dfdFlags = ktx2File.getDFDFlags();
  41906. var _getTranscoderFormat = getTranscoderFormat(basisFormat, width, height, hasAlpha),
  41907. transcoderFormat = _getTranscoderFormat.transcoderFormat,
  41908. engineFormat = _getTranscoderFormat.engineFormat;
  41909. if (!width || !height || !levels) {
  41910. cleanup();
  41911. throw new Error('THREE.KTX2Loader: Invalid texture');
  41912. }
  41913. if (!ktx2File.startTranscoding()) {
  41914. cleanup();
  41915. throw new Error('THREE.KTX2Loader: .startTranscoding failed');
  41916. }
  41917. var mipmaps = [];
  41918. for (var mip = 0; mip < levels; mip++) {
  41919. var levelInfo = ktx2File.getImageLevelInfo(mip, 0, 0);
  41920. var mipWidth = levelInfo.origWidth;
  41921. var mipHeight = levelInfo.origHeight;
  41922. var dst = new Uint8Array(ktx2File.getImageTranscodedSizeInBytes(mip, 0, 0, transcoderFormat));
  41923. var status = ktx2File.transcodeImage(dst, mip, 0, 0, transcoderFormat, 0, -1, -1);
  41924. if (!status) {
  41925. cleanup();
  41926. throw new Error('THREE.KTX2Loader: .transcodeImage failed.');
  41927. }
  41928. mipmaps.push({
  41929. data: dst,
  41930. width: mipWidth,
  41931. height: mipHeight
  41932. });
  41933. }
  41934. cleanup();
  41935. return {
  41936. width,
  41937. height,
  41938. hasAlpha,
  41939. mipmaps,
  41940. format: engineFormat,
  41941. dfdTransferFn,
  41942. dfdFlags
  41943. };
  41944. } //
  41945. // Optimal choice of a transcoder target format depends on the Basis format (ETC1S or UASTC),
  41946. // device capabilities, and texture dimensions. The list below ranks the formats separately
  41947. // for ETC1S and UASTC.
  41948. //
  41949. // In some cases, transcoding UASTC to RGBA32 might be preferred for higher quality (at
  41950. // significant memory cost) compared to ETC1/2, BC1/3, and PVRTC. The transcoder currently
  41951. // chooses RGBA32 only as a last resort and does not expose that option to the caller.
  41952. var FORMAT_OPTIONS = [{
  41953. if: 'astcSupported',
  41954. basisFormat: [BasisFormat.UASTC_4x4],
  41955. transcoderFormat: [TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4],
  41956. engineFormat: [EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format],
  41957. priorityETC1S: Infinity,
  41958. priorityUASTC: 1,
  41959. needsPowerOfTwo: false
  41960. }, {
  41961. if: 'bptcSupported',
  41962. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  41963. transcoderFormat: [TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5],
  41964. engineFormat: [EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format],
  41965. priorityETC1S: 3,
  41966. priorityUASTC: 2,
  41967. needsPowerOfTwo: false
  41968. }, {
  41969. if: 'dxtSupported',
  41970. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  41971. transcoderFormat: [TranscoderFormat.BC1, TranscoderFormat.BC3],
  41972. engineFormat: [EngineFormat.RGB_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format],
  41973. priorityETC1S: 4,
  41974. priorityUASTC: 5,
  41975. needsPowerOfTwo: false
  41976. }, {
  41977. if: 'etc2Supported',
  41978. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  41979. transcoderFormat: [TranscoderFormat.ETC1, TranscoderFormat.ETC2],
  41980. engineFormat: [EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format],
  41981. priorityETC1S: 1,
  41982. priorityUASTC: 3,
  41983. needsPowerOfTwo: false
  41984. }, {
  41985. if: 'etc1Supported',
  41986. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  41987. transcoderFormat: [TranscoderFormat.ETC1],
  41988. engineFormat: [EngineFormat.RGB_ETC1_Format],
  41989. priorityETC1S: 2,
  41990. priorityUASTC: 4,
  41991. needsPowerOfTwo: false
  41992. }, {
  41993. if: 'pvrtcSupported',
  41994. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  41995. transcoderFormat: [TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA],
  41996. engineFormat: [EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format],
  41997. priorityETC1S: 5,
  41998. priorityUASTC: 6,
  41999. needsPowerOfTwo: true
  42000. }];
  42001. var ETC1S_OPTIONS = FORMAT_OPTIONS.sort(function (a, b) {
  42002. return a.priorityETC1S - b.priorityETC1S;
  42003. });
  42004. var UASTC_OPTIONS = FORMAT_OPTIONS.sort(function (a, b) {
  42005. return a.priorityUASTC - b.priorityUASTC;
  42006. });
  42007. function getTranscoderFormat(basisFormat, width, height, hasAlpha) {
  42008. var transcoderFormat;
  42009. var engineFormat;
  42010. var options = basisFormat === BasisFormat.ETC1S ? ETC1S_OPTIONS : UASTC_OPTIONS;
  42011. for (var i = 0; i < options.length; i++) {
  42012. var opt = options[i];
  42013. if (!config[opt.if]) continue;
  42014. if (!opt.basisFormat.includes(basisFormat)) continue;
  42015. if (hasAlpha && opt.transcoderFormat.length < 2) continue;
  42016. if (opt.needsPowerOfTwo && !(isPowerOfTwo(width) && isPowerOfTwo(height))) continue;
  42017. transcoderFormat = opt.transcoderFormat[hasAlpha ? 1 : 0];
  42018. engineFormat = opt.engineFormat[hasAlpha ? 1 : 0];
  42019. return {
  42020. transcoderFormat,
  42021. engineFormat
  42022. };
  42023. }
  42024. console.warn('THREE.KTX2Loader: No suitable compressed texture format found. Decoding to RGBA32.');
  42025. transcoderFormat = TranscoderFormat.RGBA32;
  42026. engineFormat = EngineFormat.RGBAFormat;
  42027. return {
  42028. transcoderFormat,
  42029. engineFormat
  42030. };
  42031. }
  42032. function isPowerOfTwo(value) {
  42033. if (value <= 2) return true;
  42034. return (value & value - 1) === 0 && value !== 0;
  42035. }
  42036. }; //
  42037. // DataTexture and Data3DTexture parsing.
  42038. var FORMAT_MAP = {
  42039. [Ae]: THREE$1.RGBAFormat,
  42040. [pe]: THREE$1.RGBAFormat,
  42041. [Ot]: THREE$1.RGBAFormat,
  42042. [Ft]: THREE$1.RGBAFormat,
  42043. [de]: THREE$1.RGFormat,
  42044. [se]: THREE$1.RGFormat,
  42045. [yt]: THREE$1.RGFormat,
  42046. [dt]: THREE$1.RGFormat,
  42047. [xe]: THREE$1.RedFormat,
  42048. [$t]: THREE$1.RedFormat,
  42049. [gt]: THREE$1.RedFormat,
  42050. [ct]: THREE$1.RedFormat
  42051. };
  42052. var TYPE_MAP = {
  42053. [Ae]: THREE$1.FloatType,
  42054. [pe]: THREE$1.HalfFloatType,
  42055. [Ot]: THREE$1.UnsignedByteType,
  42056. [Ft]: THREE$1.UnsignedByteType,
  42057. [de]: THREE$1.FloatType,
  42058. [se]: THREE$1.HalfFloatType,
  42059. [yt]: THREE$1.UnsignedByteType,
  42060. [dt]: THREE$1.UnsignedByteType,
  42061. [xe]: THREE$1.FloatType,
  42062. [$t]: THREE$1.HalfFloatType,
  42063. [gt]: THREE$1.UnsignedByteType,
  42064. [ct]: THREE$1.UnsignedByteType
  42065. };
  42066. var ENCODING_MAP = {
  42067. [Ft]: THREE$1.sRGBEncoding,
  42068. [dt]: THREE$1.sRGBEncoding,
  42069. [gt]: THREE$1.sRGBEncoding
  42070. };
  42071. function createDataTexture(_x) {
  42072. return _createDataTexture.apply(this, arguments);
  42073. }
  42074. function _createDataTexture() {
  42075. _createDataTexture = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(container) {
  42076. var vkFormat, pixelWidth, pixelHeight, pixelDepth, level, levelData, view, texture;
  42077. return regenerator.wrap(function _callee2$(_context2) {
  42078. while (1) {
  42079. switch (_context2.prev = _context2.next) {
  42080. case 0:
  42081. vkFormat = container.vkFormat, pixelWidth = container.pixelWidth, pixelHeight = container.pixelHeight, pixelDepth = container.pixelDepth;
  42082. if (!(FORMAT_MAP[vkFormat] === undefined)) {
  42083. _context2.next = 3;
  42084. break;
  42085. }
  42086. throw new Error('THREE.KTX2Loader: Unsupported vkFormat.');
  42087. case 3:
  42088. //
  42089. level = container.levels[0];
  42090. if (!(container.supercompressionScheme === t)) {
  42091. _context2.next = 8;
  42092. break;
  42093. }
  42094. levelData = level.levelData;
  42095. _context2.next = 16;
  42096. break;
  42097. case 8:
  42098. if (!(container.supercompressionScheme === n$2)) {
  42099. _context2.next = 15;
  42100. break;
  42101. }
  42102. if (!_zstd) {
  42103. _zstd = new Promise( /*#__PURE__*/function () {
  42104. var _ref3 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(resolve) {
  42105. var zstd;
  42106. return regenerator.wrap(function _callee$(_context) {
  42107. while (1) {
  42108. switch (_context.prev = _context.next) {
  42109. case 0:
  42110. zstd = new Q();
  42111. _context.next = 3;
  42112. return zstd.init();
  42113. case 3:
  42114. resolve(zstd);
  42115. case 4:
  42116. case "end":
  42117. return _context.stop();
  42118. }
  42119. }
  42120. }, _callee);
  42121. }));
  42122. return function (_x2) {
  42123. return _ref3.apply(this, arguments);
  42124. };
  42125. }());
  42126. }
  42127. _context2.next = 12;
  42128. return _zstd;
  42129. case 12:
  42130. levelData = _context2.sent.decode(level.levelData, level.uncompressedByteLength);
  42131. _context2.next = 16;
  42132. break;
  42133. case 15:
  42134. throw new Error('THREE.KTX2Loader: Unsupported supercompressionScheme.');
  42135. case 16:
  42136. if (TYPE_MAP[vkFormat] === THREE$1.FloatType) {
  42137. view = new Float32Array(levelData.buffer, levelData.byteOffset, levelData.byteLength / Float32Array.BYTES_PER_ELEMENT);
  42138. } else if (TYPE_MAP[vkFormat] === THREE$1.HalfFloatType) {
  42139. view = new Uint16Array(levelData.buffer, levelData.byteOffset, levelData.byteLength / Uint16Array.BYTES_PER_ELEMENT);
  42140. } else {
  42141. view = levelData;
  42142. } //
  42143. texture = pixelDepth === 0 ? new THREE$1.DataTexture(view, pixelWidth, pixelHeight) : new THREE$1.Data3DTexture(view, pixelWidth, pixelHeight, pixelDepth);
  42144. texture.type = TYPE_MAP[vkFormat];
  42145. texture.format = FORMAT_MAP[vkFormat];
  42146. texture.encoding = ENCODING_MAP[vkFormat] || THREE$1.LinearEncoding;
  42147. texture.needsUpdate = true; //
  42148. return _context2.abrupt("return", Promise.resolve(texture));
  42149. case 23:
  42150. case "end":
  42151. return _context2.stop();
  42152. }
  42153. }
  42154. }, _callee2);
  42155. }));
  42156. return _createDataTexture.apply(this, arguments);
  42157. }
  42158. function _createSuper$E(Derived){var hasNativeReflectConstruct=_isNativeReflectConstruct$E();return function _createSuperInternal(){var Super=_getPrototypeOf(Derived),result;if(hasNativeReflectConstruct){var NewTarget=_getPrototypeOf(this).constructor;result=Reflect.construct(Super,arguments,NewTarget);}else {result=Super.apply(this,arguments);}return _possibleConstructorReturn(this,result);};}function _isNativeReflectConstruct$E(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));return true;}catch(e){return false;}}var _marked=/*#__PURE__*/regenerator.mark(makeStringIterator),_marked2=/*#__PURE__*/regenerator.mark(makeArrayBufferIterator),_marked3=/*#__PURE__*/regenerator.mark(makeMeshPrimitiveIterator);function _createForOfIteratorHelper$3(o,allowArrayLike){var it=typeof Symbol!=="undefined"&&o[Symbol.iterator]||o["@@iterator"];if(!it){if(Array.isArray(o)||(it=_unsupportedIterableToArray$3(o))||allowArrayLike&&o&&typeof o.length==="number"){if(it)o=it;var i=0;var F=function F(){};return {s:F,n:function n(){if(i>=o.length)return {done:true};return {done:false,value:o[i++]};},e:function e(_e){throw _e;},f:F};}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}var normalCompletion=true,didErr=false,err;return {s:function s(){it=it.call(o);},n:function n(){var step=it.next();normalCompletion=step.done;return step;},e:function e(_e2){didErr=true;err=_e2;},f:function f(){try{if(!normalCompletion&&it.return!=null)it.return();}finally{if(didErr)throw err;}}};}function _unsupportedIterableToArray$3(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray$3(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(o);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray$3(o,minLen);}function _arrayLikeToArray$3(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++){arr2[i]=arr[i];}return arr2;}function ownKeys$4(object,enumerableOnly){var keys=Object.keys(object);if(Object.getOwnPropertySymbols){var symbols=Object.getOwnPropertySymbols(object);if(enumerableOnly){symbols=symbols.filter(function(sym){return Object.getOwnPropertyDescriptor(object,sym).enumerable;});}keys.push.apply(keys,symbols);}return keys;}function _objectSpread$3(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};if(i%2){ownKeys$4(Object(source),true).forEach(function(key){_defineProperty$1(target,key,source[key]);});}else if(Object.getOwnPropertyDescriptors){Object.defineProperties(target,Object.getOwnPropertyDescriptors(source));}else {ownKeys$4(Object(source)).forEach(function(key){Object.defineProperty(target,key,Object.getOwnPropertyDescriptor(source,key));});}}return target;}var GLTFLoader$1=THREE.GLTFLoader;/*! *****************************************************************************
  42159. Copyright (c) Microsoft Corporation.
  42160. Permission to use, copy, modify, and/or distribute this software for any
  42161. purpose with or without fee is hereby granted.
  42162. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
  42163. REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  42164. AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
  42165. INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  42166. LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  42167. OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  42168. PERFORMANCE OF THIS SOFTWARE.
  42169. ***************************************************************************** */ // !zeg改 必须将window赋值给globalThis,否则会导致钉钉和支付宝小程序打不开
  42170. var globalThis$1=window;function __awaiter(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P(function(resolve){resolve(value);});}return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value));}catch(e){reject(e);}}function rejected(value){try{step(generator['throw'](value));}catch(e){reject(e);}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected);}step((generator=generator.apply(thisArg,_arguments||[])).next());});}function assert$7(condition,message){if(!condition){throw new Error(message||'loader assertion failed.');}}var isBrowser$2=Boolean(typeof process!=='object'||String(process)!=='[object process]'||process.browser);// process未定义,false
  42171. var matches$1=typeof process!=='undefined'&&process.version&&/v([0-9]*)/.exec(process.version);matches$1&&parseFloat(matches$1[1])||0;var VERSION$8='3.1.4';function assert$6(condition,message){if(!condition){throw new Error(message||'loaders.gl assertion failed.');}}var globals$1={self:typeof self!=='undefined'&&self,window:typeof window!=='undefined'&&window,global:typeof global!=='undefined'&&global,document:typeof document!=='undefined'&&document};var global_=globals$1.global||globals$1.self||globals$1.window||{};var isBrowser$1=typeof process!=='object'||String(process)!=='[object process]'||process.browser;var isWorker=typeof importScripts==='function';var isMobile$1=typeof window!=='undefined'&&typeof window.orientation!=='undefined';var matches=typeof process!=='undefined'&&process.version&&/v([0-9]*)/.exec(process.version);matches&&parseFloat(matches[1])||0;function _defineProperty(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else {obj[key]=value;}return obj;}var WorkerJob=/*#__PURE__*/function(){function WorkerJob(jobName,workerThread){var _this=this;_classCallCheck(this,WorkerJob);_defineProperty(this,'name',void 0);_defineProperty(this,'workerThread',void 0);_defineProperty(this,'isRunning',void 0);_defineProperty(this,'result',void 0);_defineProperty(this,'_resolve',void 0);_defineProperty(this,'_reject',void 0);this.name=jobName;this.workerThread=workerThread;this.isRunning=true;this._resolve=function(){};this._reject=function(){};this.result=new Promise(function(resolve,reject){_this._resolve=resolve;_this._reject=reject;});}_createClass(WorkerJob,[{key:"postMessage",value:function postMessage(type,payload){this.workerThread.postMessage({source:'loaders.gl',type,payload});}},{key:"done",value:function done(value){assert$6(this.isRunning);this.isRunning=false;this._resolve(value);}},{key:"error",value:function error(_error){assert$6(this.isRunning);this.isRunning=false;this._reject(_error);}}]);return WorkerJob;}();var workerURLCache=new Map();function getLoadableWorkerURL(props){assert$6(props.source&&!props.url||!props.source&&props.url);var workerURL=workerURLCache.get(props.source||props.url);if(!workerURL){if(props.url){workerURL=getLoadableWorkerURLFromURL(props.url);workerURLCache.set(props.url,workerURL);}if(props.source){workerURL=getLoadableWorkerURLFromSource(props.source);workerURLCache.set(props.source,workerURL);}}assert$6(workerURL);return workerURL;}function getLoadableWorkerURLFromURL(url){if(!url.startsWith('http')){return url;}var workerSource=buildScriptSource(url);return getLoadableWorkerURLFromSource(workerSource);}function getLoadableWorkerURLFromSource(workerSource){var blob=new Blob([workerSource],{type:'application/javascript'});return URL.createObjectURL(blob);}function buildScriptSource(workerUrl){return "try {\n importScripts('".concat(workerUrl,"');\n} catch (error) {\n console.error(error);\n throw error;\n}");}function getTransferList(object){var recursive=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var transfers=arguments.length>2?arguments[2]:undefined;var transfersSet=transfers||new Set();if(!object);else if(isTransferable(object)){transfersSet.add(object);}else if(isTransferable(object.buffer)){transfersSet.add(object.buffer);}else if(ArrayBuffer.isView(object));else if(recursive&&typeof object==='object'){for(var key in object){getTransferList(object[key],recursive,transfersSet);}}return transfers===undefined?Array.from(transfersSet):[];}function isTransferable(object){if(!object){return false;}if(object instanceof ArrayBuffer){return true;}if(typeof MessagePort!=='undefined'&&object instanceof MessagePort){return true;}if(typeof ImageBitmap!=='undefined'&&object instanceof ImageBitmap){return true;}if(typeof OffscreenCanvas!=='undefined'&&object instanceof OffscreenCanvas){return true;}return false;}var NOOP=function NOOP(){};var WorkerThread=/*#__PURE__*/function(){function WorkerThread(props){_classCallCheck(this,WorkerThread);_defineProperty(this,'name',void 0);_defineProperty(this,'source',void 0);_defineProperty(this,'url',void 0);_defineProperty(this,'terminated',false);_defineProperty(this,'worker',void 0);_defineProperty(this,'onMessage',void 0);_defineProperty(this,'onError',void 0);_defineProperty(this,'_loadableURL','');var name=props.name,source=props.source,url=props.url;assert$6(source||url);this.name=name;this.source=source;this.url=url;this.onMessage=NOOP;this.onError=function(error){return console.log(error);};this.worker=this._createBrowserWorker();}_createClass(WorkerThread,[{key:"destroy",value:function destroy(){this.onMessage=NOOP;this.onError=NOOP;this.worker.terminate();this.terminated=true;}},{key:"isRunning",get:function get(){return Boolean(this.onMessage);}},{key:"postMessage",value:function postMessage(data,transferList){transferList=transferList||getTransferList(data);this.worker.postMessage(data,transferList);}},{key:"_getErrorFromErrorEvent",value:function _getErrorFromErrorEvent(event){var message='Failed to load ';message+='worker '.concat(this.name,' from ').concat(this.url,'. ');if(event.message){message+=''.concat(event.message,' in ');}if(event.lineno){message+=':'.concat(event.lineno,':').concat(event.colno);}return new Error(message);}},{key:"_createBrowserWorker",value:function _createBrowserWorker(){var _this2=this;this._loadableURL=getLoadableWorkerURL({source:this.source,url:this.url});var worker=new Worker(this._loadableURL,{name:this.name});worker.onmessage=function(event){if(!event.data){_this2.onError(new Error('No data received'));}else {_this2.onMessage(event.data);}};worker.onerror=function(error){_this2.onError(_this2._getErrorFromErrorEvent(error));_this2.terminated=true;};worker.onmessageerror=function(event){return console.error(event);};return worker;}}],[{key:"isSupported",value:function isSupported(){return typeof Worker!=='undefined';}}]);return WorkerThread;}();var WorkerPool=/*#__PURE__*/function(){function WorkerPool(props){_classCallCheck(this,WorkerPool);_defineProperty(this,'name','unnamed');_defineProperty(this,'source',void 0);_defineProperty(this,'url',void 0);_defineProperty(this,'maxConcurrency',1);_defineProperty(this,'maxMobileConcurrency',1);_defineProperty(this,'onDebug',function(){});_defineProperty(this,'reuseWorkers',true);_defineProperty(this,'props',{});_defineProperty(this,'jobQueue',[]);_defineProperty(this,'idleQueue',[]);_defineProperty(this,'count',0);_defineProperty(this,'isDestroyed',false);this.source=props.source;this.url=props.url;this.setProps(props);}_createClass(WorkerPool,[{key:"destroy",value:function destroy(){this.idleQueue.forEach(function(worker){return worker.destroy();});this.isDestroyed=true;}},{key:"setProps",value:function setProps(props){this.props=_objectSpread$3(_objectSpread$3({},this.props),props);if(props.name!==undefined){this.name=props.name;}if(props.maxConcurrency!==undefined){this.maxConcurrency=props.maxConcurrency;}if(props.maxMobileConcurrency!==undefined){this.maxMobileConcurrency=props.maxMobileConcurrency;}if(props.reuseWorkers!==undefined){this.reuseWorkers=props.reuseWorkers;}if(props.onDebug!==undefined){this.onDebug=props.onDebug;}}},{key:"startJob",value:function(){var _startJob=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee(name){var _this3=this;var onMessage,onError,startPromise,_args2=arguments;return regenerator.wrap(function _callee$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:onMessage=_args2.length>1&&_args2[1]!==undefined?_args2[1]:function(job,type,data){return job.done(data);};onError=_args2.length>2&&_args2[2]!==undefined?_args2[2]:function(job,error){return job.error(error);};startPromise=new Promise(function(onStart){_this3.jobQueue.push({name,onMessage,onError,onStart});return _this3;});this._startQueuedJob();_context2.next=6;return startPromise;case 6:return _context2.abrupt("return",_context2.sent);case 7:case"end":return _context2.stop();}}},_callee,this);}));function startJob(_x7){return _startJob.apply(this,arguments);}return startJob;}()},{key:"_startQueuedJob",value:function(){var _startQueuedJob2=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee2(){var workerThread,queuedJob,job;return regenerator.wrap(function _callee2$(_context3){while(1){switch(_context3.prev=_context3.next){case 0:if(this.jobQueue.length){_context3.next=2;break;}return _context3.abrupt("return");case 2:workerThread=this._getAvailableWorker();if(workerThread){_context3.next=5;break;}return _context3.abrupt("return");case 5:queuedJob=this.jobQueue.shift();if(!queuedJob){_context3.next=18;break;}this.onDebug({message:'Starting job',name:queuedJob.name,workerThread,backlog:this.jobQueue.length});job=new WorkerJob(queuedJob.name,workerThread);workerThread.onMessage=function(data){return queuedJob.onMessage(job,data.type,data.payload);};workerThread.onError=function(error){return queuedJob.onError(job,error);};queuedJob.onStart(job);_context3.prev=12;_context3.next=15;return job.result;case 15:_context3.prev=15;this.returnWorkerToQueue(workerThread);return _context3.finish(15);case 18:case"end":return _context3.stop();}}},_callee2,this,[[12,,15,18]]);}));function _startQueuedJob(){return _startQueuedJob2.apply(this,arguments);}return _startQueuedJob;}()},{key:"returnWorkerToQueue",value:function returnWorkerToQueue(worker){var shouldDestroyWorker=this.isDestroyed||!this.reuseWorkers||this.count>this._getMaxConcurrency();if(shouldDestroyWorker){worker.destroy();this.count--;}else {this.idleQueue.push(worker);}if(!this.isDestroyed){this._startQueuedJob();}}},{key:"_getAvailableWorker",value:function _getAvailableWorker(){if(this.idleQueue.length>0){return this.idleQueue.shift()||null;}if(this.count<this._getMaxConcurrency()){this.count++;var _name=''.concat(this.name.toLowerCase(),' (#').concat(this.count,' of ').concat(this.maxConcurrency,')');return new WorkerThread({name:_name,source:this.source,url:this.url});}return null;}},{key:"_getMaxConcurrency",value:function _getMaxConcurrency(){return isMobile$1?this.maxMobileConcurrency:this.maxConcurrency;}}]);return WorkerPool;}();var DEFAULT_PROPS$3={maxConcurrency:3,maxMobileConcurrency:1,onDebug:function onDebug(){},reuseWorkers:true};var WorkerFarm=/*#__PURE__*/function(){function WorkerFarm(props){_classCallCheck(this,WorkerFarm);_defineProperty(this,'props',void 0);_defineProperty(this,'workerPools',new Map());this.props=_objectSpread$3({},DEFAULT_PROPS$3);this.setProps(props);this.workerPools=new Map();}_createClass(WorkerFarm,[{key:"destroy",value:function destroy(){var _iterator3=_createForOfIteratorHelper$3(this.workerPools.values()),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var workerPool=_step3.value;workerPool.destroy();}}catch(err){_iterator3.e(err);}finally{_iterator3.f();}}},{key:"setProps",value:function setProps(props){this.props=_objectSpread$3(_objectSpread$3({},this.props),props);var _iterator4=_createForOfIteratorHelper$3(this.workerPools.values()),_step4;try{for(_iterator4.s();!(_step4=_iterator4.n()).done;){var workerPool=_step4.value;workerPool.setProps(this._getWorkerPoolProps());}}catch(err){_iterator4.e(err);}finally{_iterator4.f();}}},{key:"getWorkerPool",value:function getWorkerPool(options){var name=options.name,source=options.source,url=options.url;var workerPool=this.workerPools.get(name);if(!workerPool){workerPool=new WorkerPool({name,source,url});workerPool.setProps(this._getWorkerPoolProps());this.workerPools.set(name,workerPool);}return workerPool;}},{key:"_getWorkerPoolProps",value:function _getWorkerPoolProps(){return {maxConcurrency:this.props.maxConcurrency,maxMobileConcurrency:this.props.maxMobileConcurrency,reuseWorkers:this.props.reuseWorkers,onDebug:this.props.onDebug};}}],[{key:"isSupported",value:function isSupported(){return WorkerThread.isSupported();}},{key:"getWorkerFarm",value:function getWorkerFarm(){var props=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};WorkerFarm._workerFarm=WorkerFarm._workerFarm||new WorkerFarm({});WorkerFarm._workerFarm.setProps(props);return WorkerFarm._workerFarm;}}]);return WorkerFarm;}();_defineProperty(WorkerFarm,'_workerFarm',void 0);var NPM_TAG='latest';function getWorkerURL(worker){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var workerOptions=options[worker.id]||{};var workerFile=''.concat(worker.id,'-worker.js');var url=workerOptions.workerUrl;if(!url&&worker.id==='compression'){url=options.workerUrl;}if(options._workerType==='test'){url='modules/'.concat(worker.module,'/dist/').concat(workerFile);}if(!url){var version=worker.version;if(version==='latest'){version=NPM_TAG;}var versionTag=version?'@'.concat(version):'';url='https://unpkg.com/@loaders.gl/'.concat(worker.module).concat(versionTag,'/dist/').concat(workerFile);}assert$6(url);return url;}function validateWorkerVersion(worker){var coreVersion=arguments.length>1&&arguments[1]!==undefined?arguments[1]:VERSION$8;assert$6(worker,'no worker provided');var workerVersion=worker.version;if(!coreVersion||!workerVersion){return false;}return true;}var ChildProcessProxy={};var node=/*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null),ChildProcessProxy,{default:ChildProcessProxy}));var VERSION$7='3.1.4';var loadLibraryPromises={};function loadLibrary(_x8){return _loadLibrary.apply(this,arguments);}function _loadLibrary(){_loadLibrary=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee14(libraryUrl){var moduleName,options,_args18=arguments;return regenerator.wrap(function _callee14$(_context18){while(1){switch(_context18.prev=_context18.next){case 0:moduleName=_args18.length>1&&_args18[1]!==undefined?_args18[1]:null;options=_args18.length>2&&_args18[2]!==undefined?_args18[2]:{};if(moduleName){libraryUrl=getLibraryUrl(libraryUrl,moduleName,options);}loadLibraryPromises[libraryUrl]=loadLibraryPromises[libraryUrl]||loadLibraryFromFile(libraryUrl);_context18.next=6;return loadLibraryPromises[libraryUrl];case 6:return _context18.abrupt("return",_context18.sent);case 7:case"end":return _context18.stop();}}},_callee14);}));return _loadLibrary.apply(this,arguments);}function getLibraryUrl(library,moduleName,options){if(library.startsWith('http')){return library;}var modules=options.modules||{};if(modules[library]){return modules[library];}if(!isBrowser$1){return 'modules/'.concat(moduleName,'/dist/libs/').concat(library);}if(options.CDN){assert$6(options.CDN.startsWith('http'));return ''.concat(options.CDN,'/').concat(moduleName,'@').concat(VERSION$7,'/dist/libs/').concat(library);}if(isWorker){return '../src/libs/'.concat(library);}return 'modules/'.concat(moduleName,'/src/libs/').concat(library);}function loadLibraryFromFile(_x9){return _loadLibraryFromFile.apply(this,arguments);}function _loadLibraryFromFile(){_loadLibraryFromFile=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee15(libraryUrl){var _response,response,scriptSource;return regenerator.wrap(function _callee15$(_context19){while(1){switch(_context19.prev=_context19.next){case 0:if(!libraryUrl.endsWith('wasm')){_context19.next=7;break;}_context19.next=3;return fetch(libraryUrl);case 3:_response=_context19.sent;_context19.next=6;return _response.arrayBuffer();case 6:return _context19.abrupt("return",_context19.sent);case 7:if(isBrowser$1){_context19.next=20;break;}_context19.prev=8;_context19.t0=node&&ChildProcessProxy.requireFromFile;if(!_context19.t0){_context19.next=14;break;}_context19.next=13;return ChildProcessProxy.requireFromFile(libraryUrl);case 13:_context19.t0=_context19.sent;case 14:return _context19.abrupt("return",_context19.t0);case 17:_context19.prev=17;_context19.t1=_context19["catch"](8);return _context19.abrupt("return",null);case 20:if(!isWorker){_context19.next=22;break;}return _context19.abrupt("return",importScripts(libraryUrl));case 22:_context19.next=24;return fetch(libraryUrl);case 24:response=_context19.sent;_context19.next=27;return response.text();case 27:scriptSource=_context19.sent;return _context19.abrupt("return",loadLibraryFromString(scriptSource,libraryUrl));case 29:case"end":return _context19.stop();}}},_callee15,null,[[8,17]]);}));return _loadLibraryFromFile.apply(this,arguments);}function loadLibraryFromString(scriptSource,id){if(!isBrowser$1){return ChildProcessProxy.requireFromString&&ChildProcessProxy.requireFromString(scriptSource,id);}if(isWorker){eval.call(global_,scriptSource);return null;}var script=document.createElement('script');script.id=id;try{script.appendChild(document.createTextNode(scriptSource));}catch(e){script.text=scriptSource;}document.body.appendChild(script);return null;}function canParseWithWorker(loader,options){if(!WorkerFarm.isSupported()){return false;}return loader.worker&&(options===null||options===void 0?void 0:options.worker);}function parseWithWorker(_x10,_x11,_x12,_x13,_x14){return _parseWithWorker.apply(this,arguments);}function _parseWithWorker(){_parseWithWorker=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee16(loader,data,options,context,parseOnMainThread){var name,url,workerFarm,workerPool,job,result;return regenerator.wrap(function _callee16$(_context20){while(1){switch(_context20.prev=_context20.next){case 0:name=loader.id;url=getWorkerURL(loader,options);workerFarm=WorkerFarm.getWorkerFarm(options);workerPool=workerFarm.getWorkerPool({name,url});options=JSON.parse(JSON.stringify(options));_context20.next=7;return workerPool.startJob('process-on-worker',onMessage.bind(null,parseOnMainThread));case 7:job=_context20.sent;job.postMessage('process',{input:data,options});_context20.next=11;return job.result;case 11:result=_context20.sent;_context20.next=14;return result.result;case 14:return _context20.abrupt("return",_context20.sent);case 15:case"end":return _context20.stop();}}},_callee16);}));return _parseWithWorker.apply(this,arguments);}function onMessage(_x15,_x16,_x17,_x18){return _onMessage.apply(this,arguments);}function _onMessage(){_onMessage=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee17(parseOnMainThread,job,type,payload){var id,input,_options,result,message;return regenerator.wrap(function _callee17$(_context21){while(1){switch(_context21.prev=_context21.next){case 0:_context21.t0=type;_context21.next=_context21.t0==='done'?3:_context21.t0==='error'?5:_context21.t0==='process'?7:20;break;case 3:job.done(payload);return _context21.abrupt("break",21);case 5:job.error(new Error(payload.error));return _context21.abrupt("break",21);case 7:id=payload.id,input=payload.input,_options=payload.options;_context21.prev=8;_context21.next=11;return parseOnMainThread(input,_options);case 11:result=_context21.sent;job.postMessage('done',{id,result});_context21.next=19;break;case 15:_context21.prev=15;_context21.t1=_context21["catch"](8);message=_context21.t1 instanceof Error?_context21.t1.message:'unknown error';job.postMessage('error',{id,error:message});case 19:return _context21.abrupt("break",21);case 20:console.warn('parse-with-worker unknown message '.concat(type));case 21:case"end":return _context21.stop();}}},_callee17,null,[[8,15]]);}));return _onMessage.apply(this,arguments);}function getFirstCharacters$1(data){var length=arguments.length>1&&arguments[1]!==undefined?arguments[1]:5;if(typeof data==='string'){return data.slice(0,length);}else if(ArrayBuffer.isView(data)){return getMagicString$3(data.buffer,data.byteOffset,length);}else if(data instanceof ArrayBuffer){var byteOffset=0;return getMagicString$3(data,byteOffset,length);}return '';}function getMagicString$3(arrayBuffer,byteOffset,length){if(arrayBuffer.byteLength<=byteOffset+length){return '';}var dataView=new DataView(arrayBuffer);var magic='';for(var _i=0;_i<length;_i++){magic+=String.fromCharCode(dataView.getUint8(byteOffset+_i));}return magic;}function parseJSON(string){try{return JSON.parse(string);}catch(_){throw new Error('Failed to parse JSON from data starting with "'.concat(getFirstCharacters$1(string),'"'));}}function isBuffer$1(value){return value&&typeof value==='object'&&value.isBuffer;}function bufferToArrayBuffer(buffer){if(isBuffer$1(buffer)){var typedArray=new Uint8Array(buffer.buffer,buffer.byteOffset,buffer.length);return typedArray.slice().buffer;}return buffer;}function toArrayBuffer(data){if(isBuffer$1(data)){return bufferToArrayBuffer(data);}if(data instanceof ArrayBuffer){return data;}if(ArrayBuffer.isView(data)){if(data.byteOffset===0&&data.byteLength===data.buffer.byteLength){return data.buffer;}return data.buffer.slice(data.byteOffset,data.byteOffset+data.byteLength);}if(typeof data==='string'){var text=data;var uint8Array=new TextEncoder().encode(text);return uint8Array.buffer;}if(data&&typeof data==='object'&&data._toArrayBuffer){return data._toArrayBuffer();}throw new Error('toArrayBuffer');}function compareArrayBuffers(arrayBuffer1,arrayBuffer2,byteLength){byteLength=byteLength||arrayBuffer1.byteLength;if(arrayBuffer1.byteLength<byteLength||arrayBuffer2.byteLength<byteLength){return false;}var array1=new Uint8Array(arrayBuffer1);var array2=new Uint8Array(arrayBuffer2);for(var _i2=0;_i2<array1.length;++_i2){if(array1[_i2]!==array2[_i2]){return false;}}return true;}function concatenateArrayBuffers(){for(var _len2=arguments.length,sources=new Array(_len2),_key2=0;_key2<_len2;_key2++){sources[_key2]=arguments[_key2];}var sourceArrays=sources.map(function(source2){return source2 instanceof ArrayBuffer?new Uint8Array(source2):source2;});var byteLength=sourceArrays.reduce(function(length,typedArray){return length+typedArray.byteLength;},0);var result=new Uint8Array(byteLength);var offset=0;var _iterator5=_createForOfIteratorHelper$3(sourceArrays),_step5;try{for(_iterator5.s();!(_step5=_iterator5.n()).done;){var sourceArray=_step5.value;result.set(sourceArray,offset);offset+=sourceArray.byteLength;}}catch(err){_iterator5.e(err);}finally{_iterator5.f();}return result.buffer;}function sliceArrayBuffer(arrayBuffer,byteOffset,byteLength){var subArray=byteLength!==undefined?new Uint8Array(arrayBuffer).subarray(byteOffset,byteOffset+byteLength):new Uint8Array(arrayBuffer).subarray(byteOffset);var arrayCopy=new Uint8Array(subArray);return arrayCopy.buffer;}function padToNBytes(byteLength,padding){assert$7(byteLength>=0);assert$7(padding>0);return byteLength+(padding-1)&~(padding-1);}function copyToArray(source,target,targetOffset){var sourceArray;if(source instanceof ArrayBuffer){sourceArray=new Uint8Array(source);}else {var srcByteOffset=source.byteOffset;var srcByteLength=source.byteLength;sourceArray=new Uint8Array(source.buffer||source.arrayBuffer,srcByteOffset,srcByteLength);}target.set(sourceArray,targetOffset);return targetOffset+padToNBytes(sourceArray.byteLength,4);}function concatenateArrayBuffersAsync(asyncIterator){var arrayBuffers,_iteratorAbruptCompletion,_didIteratorError,_iteratorError,_iterator,_step,chunk;return regenerator.async(function concatenateArrayBuffersAsync$(_context){while(1){switch(_context.prev=_context.next){case 0:arrayBuffers=[];_iteratorAbruptCompletion=false;_didIteratorError=false;_context.prev=3;_iterator=_asyncIterator(asyncIterator);case 5:_context.next=7;return regenerator.awrap(_iterator.next());case 7:if(!(_iteratorAbruptCompletion=!(_step=_context.sent).done)){_context.next=13;break;}chunk=_step.value;arrayBuffers.push(chunk);case 10:_iteratorAbruptCompletion=false;_context.next=5;break;case 13:_context.next=19;break;case 15:_context.prev=15;_context.t0=_context["catch"](3);_didIteratorError=true;_iteratorError=_context.t0;case 19:_context.prev=19;_context.prev=20;if(!(_iteratorAbruptCompletion&&_iterator.return!=null)){_context.next=24;break;}_context.next=24;return regenerator.awrap(_iterator.return());case 24:_context.prev=24;if(!_didIteratorError){_context.next=27;break;}throw _iteratorError;case 27:return _context.finish(24);case 28:return _context.finish(19);case 29:return _context.abrupt("return",concatenateArrayBuffers.apply(void 0,arrayBuffers));case 30:case"end":return _context.stop();}}},null,null,[[3,15,19,29],[20,,24,28]],Promise);}function getHiResTimestamp$1(){var timestamp;if(typeof window!=='undefined'&&window.performance){timestamp=window.performance.now();}else if(typeof process!=='undefined'&&process.hrtime){var timeParts=process.hrtime();timestamp=timeParts[0]*1000+timeParts[1]/1e6;}else {timestamp=Date.now();}return timestamp;}var Stat=/*#__PURE__*/function(){function Stat(name,type){_classCallCheck(this,Stat);_defineProperty(this,'name',void 0);_defineProperty(this,'type',void 0);_defineProperty(this,'sampleSize',1);_defineProperty(this,'time',void 0);_defineProperty(this,'count',void 0);_defineProperty(this,'samples',void 0);_defineProperty(this,'lastTiming',void 0);_defineProperty(this,'lastSampleTime',void 0);_defineProperty(this,'lastSampleCount',void 0);_defineProperty(this,'_count',0);_defineProperty(this,'_time',0);_defineProperty(this,'_samples',0);_defineProperty(this,'_startTime',0);_defineProperty(this,'_timerPending',false);this.name=name;this.type=type;this.reset();}_createClass(Stat,[{key:"setSampleSize",value:function setSampleSize(samples){this.sampleSize=samples;return this;}},{key:"incrementCount",value:function incrementCount(){this.addCount(1);return this;}},{key:"decrementCount",value:function decrementCount(){this.subtractCount(1);return this;}},{key:"addCount",value:function addCount(value){this._count+=value;this._samples++;this._checkSampling();return this;}},{key:"subtractCount",value:function subtractCount(value){this._count-=value;this._samples++;this._checkSampling();return this;}},{key:"addTime",value:function addTime(time){this._time+=time;this.lastTiming=time;this._samples++;this._checkSampling();return this;}},{key:"timeStart",value:function timeStart(){this._startTime=getHiResTimestamp$1();this._timerPending=true;return this;}},{key:"timeEnd",value:function timeEnd(){if(!this._timerPending){return this;}this.addTime(getHiResTimestamp$1()-this._startTime);this._timerPending=false;this._checkSampling();return this;}},{key:"getSampleAverageCount",value:function getSampleAverageCount(){return this.sampleSize>0?this.lastSampleCount/this.sampleSize:0;}},{key:"getSampleAverageTime",value:function getSampleAverageTime(){return this.sampleSize>0?this.lastSampleTime/this.sampleSize:0;}},{key:"getSampleHz",value:function getSampleHz(){return this.lastSampleTime>0?this.sampleSize/(this.lastSampleTime/1000):0;}},{key:"getAverageCount",value:function getAverageCount(){return this.samples>0?this.count/this.samples:0;}},{key:"getAverageTime",value:function getAverageTime(){return this.samples>0?this.time/this.samples:0;}},{key:"getHz",value:function getHz(){return this.time>0?this.samples/(this.time/1000):0;}},{key:"reset",value:function reset(){this.time=0;this.count=0;this.samples=0;this.lastTiming=0;this.lastSampleTime=0;this.lastSampleCount=0;this._count=0;this._time=0;this._samples=0;this._startTime=0;this._timerPending=false;return this;}},{key:"_checkSampling",value:function _checkSampling(){if(this._samples===this.sampleSize){this.lastSampleTime=this._time;this.lastSampleCount=this._count;this.count+=this._count;this.time+=this._time;this.samples+=this._samples;this._time=0;this._count=0;this._samples=0;}}}]);return Stat;}();var Stats=/*#__PURE__*/function(){function Stats(options){_classCallCheck(this,Stats);_defineProperty(this,'id',void 0);_defineProperty(this,'stats',{});this.id=options.id;this.stats={};this._initializeStats(options.stats);Object.seal(this);}_createClass(Stats,[{key:"get",value:function get(name){var type=arguments.length>1&&arguments[1]!==undefined?arguments[1]:'count';return this._getOrCreate({name,type});}},{key:"size",get:function get(){return Object.keys(this.stats).length;}},{key:"reset",value:function reset(){for(var key in this.stats){this.stats[key].reset();}return this;}},{key:"forEach",value:function forEach(fn){for(var key in this.stats){fn(this.stats[key]);}}},{key:"getTable",value:function getTable(){var table={};this.forEach(function(stat){table[stat.name]={time:stat.time||0,count:stat.count||0,average:stat.getAverageTime()||0,hz:stat.getHz()||0};});return table;}},{key:"_initializeStats",value:function _initializeStats(){var _this4=this;var stats=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];stats.forEach(function(stat){return _this4._getOrCreate(stat);});}},{key:"_getOrCreate",value:function _getOrCreate(stat){if(!stat||!stat.name){return null;}var name=stat.name,type=stat.type;if(!this.stats[name]){if(stat instanceof Stat){this.stats[name]=stat;}else {this.stats[name]=new Stat(name,type);}}return this.stats[name];}}]);return Stats;}();var STAT_QUEUED_REQUESTS='Queued Requests';var STAT_ACTIVE_REQUESTS='Active Requests';var STAT_CANCELLED_REQUESTS='Cancelled Requests';var STAT_QUEUED_REQUESTS_EVER='Queued Requests Ever';var STAT_ACTIVE_REQUESTS_EVER='Active Requests Ever';var DEFAULT_PROPS$2={id:'request-scheduler',throttleRequests:true,maxRequests:6};var RequestScheduler=/*#__PURE__*/function(){function RequestScheduler(){var props=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};_classCallCheck(this,RequestScheduler);_defineProperty(this,'props',void 0);_defineProperty(this,'stats',void 0);_defineProperty(this,'activeRequestCount',0);_defineProperty(this,'requestQueue',[]);_defineProperty(this,'requestMap',new Map());_defineProperty(this,'deferredUpdate',null);this.props=_objectSpread$3(_objectSpread$3({},DEFAULT_PROPS$2),props);this.stats=new Stats({id:this.props.id});this.stats.get(STAT_QUEUED_REQUESTS);this.stats.get(STAT_ACTIVE_REQUESTS);this.stats.get(STAT_CANCELLED_REQUESTS);this.stats.get(STAT_QUEUED_REQUESTS_EVER);this.stats.get(STAT_ACTIVE_REQUESTS_EVER);}_createClass(RequestScheduler,[{key:"scheduleRequest",value:function scheduleRequest(handle){var getPriority=arguments.length>1&&arguments[1]!==undefined?arguments[1]:function(){return 0;};if(!this.props.throttleRequests){return Promise.resolve({done:function done(){}});}if(this.requestMap.has(handle)){return this.requestMap.get(handle);}var request={handle,priority:0,getPriority};var promise=new Promise(function(resolve){request.resolve=resolve;return request;});this.requestQueue.push(request);this.requestMap.set(handle,promise);this._issueNewRequests();return promise;}},{key:"_issueRequest",value:function _issueRequest(request){var _this5=this;var handle=request.handle,resolve=request.resolve;var isDone=false;var done=function done(){if(!isDone){isDone=true;_this5.requestMap.delete(handle);_this5.activeRequestCount--;_this5._issueNewRequests();}};this.activeRequestCount++;return resolve?resolve({done}):Promise.resolve({done});}},{key:"_issueNewRequests",value:function _issueNewRequests(){var _this6=this;if(!this.deferredUpdate){this.deferredUpdate=setTimeout(function(){return _this6._issueNewRequestsAsync();},0);}}},{key:"_issueNewRequestsAsync",value:function _issueNewRequestsAsync(){this.deferredUpdate=null;var freeSlots=Math.max(this.props.maxRequests-this.activeRequestCount,0);if(freeSlots===0){return;}this._updateAllRequests();for(var _i3=0;_i3<freeSlots;++_i3){var request=this.requestQueue.shift();if(request){this._issueRequest(request);}}}},{key:"_updateAllRequests",value:function _updateAllRequests(){var requestQueue=this.requestQueue;for(var _i4=0;_i4<requestQueue.length;++_i4){var request=requestQueue[_i4];if(!this._updateRequest(request)){requestQueue.splice(_i4,1);this.requestMap.delete(request.handle);_i4--;}}requestQueue.sort(function(a,b){return a.priority-b.priority;});}},{key:"_updateRequest",value:function _updateRequest(request){request.priority=request.getPriority(request.handle);if(request.priority<0){request.resolve(null);return false;}return true;}}]);return RequestScheduler;}();var pathPrefix='';var fileAliases={};function resolvePath(filename){for(var alias in fileAliases){if(filename.startsWith(alias)){var replacement=fileAliases[alias];filename=filename.replace(alias,replacement);}}if(!filename.startsWith('http://')&&!filename.startsWith('https://')){filename=''.concat(pathPrefix).concat(filename);}return filename;}function filename(url){var slashIndex=url&&url.lastIndexOf('/');return slashIndex>=0?url.substr(slashIndex+1):'';}function dirname(url){var slashIndex=url&&url.lastIndexOf('/');return slashIndex>=0?url.substr(0,slashIndex):'';}var isBoolean=function isBoolean(x){return typeof x==='boolean';};var isFunction=function isFunction(x){return typeof x==='function';};var isObject$2=function isObject(x){return x!==null&&typeof x==='object';};var isPureObject=function isPureObject(x){return isObject$2(x)&&x.constructor==={}.constructor;};var isIterable=function isIterable(x){return x&&typeof x[Symbol.iterator]==='function';};var isAsyncIterable=function isAsyncIterable(x){return x&&typeof x[Symbol.asyncIterator]==='function';};var isResponse=function isResponse(x){return typeof Response!=='undefined'&&x instanceof Response||x&&x.arrayBuffer&&x.text&&x.json;};var isBlob=function isBlob(x){return typeof Blob!=='undefined'&&x instanceof Blob;};var isBuffer=function isBuffer(x){return x&&typeof x==='object'&&x.isBuffer;};var isReadableDOMStream=function isReadableDOMStream(x){return typeof ReadableStream!=='undefined'&&x instanceof ReadableStream||isObject$2(x)&&isFunction(x.tee)&&isFunction(x.cancel)&&isFunction(x.getReader);};var isReadableNodeStream=function isReadableNodeStream(x){return isObject$2(x)&&isFunction(x.read)&&isFunction(x.pipe)&&isBoolean(x.readable);};var isReadableStream=function isReadableStream(x){return isReadableDOMStream(x)||isReadableNodeStream(x);};var DATA_URL_PATTERN=/^data:([-\w.]+\/[-\w.+]+)(;|,)/;var MIME_TYPE_PATTERN=/^([-\w.]+\/[-\w.+]+)/;function parseMIMEType(mimeString){var matches=MIME_TYPE_PATTERN.exec(mimeString);if(matches){return matches[1];}return mimeString;}function parseMIMETypeFromURL(url){var matches=DATA_URL_PATTERN.exec(url);if(matches){return matches[1];}return '';}var QUERY_STRING_PATTERN=/\?.*/;function getResourceUrlAndType(resource){if(isResponse(resource)){var url=stripQueryString(resource.url||'');var contentTypeHeader=resource.headers.get('content-type')||'';return {url,type:parseMIMEType(contentTypeHeader)||parseMIMETypeFromURL(url)};}if(isBlob(resource)){return {url:stripQueryString(resource.name||''),type:resource.type||''};}if(typeof resource==='string'){return {url:stripQueryString(resource),type:parseMIMETypeFromURL(resource)};}return {url:'',type:''};}function getResourceContentLength(resource){if(isResponse(resource)){return resource.headers['content-length']||-1;}if(isBlob(resource)){return resource.size;}if(typeof resource==='string'){return resource.length;}if(resource instanceof ArrayBuffer){return resource.byteLength;}if(ArrayBuffer.isView(resource)){return resource.byteLength;}return -1;}function stripQueryString(url){return url.replace(QUERY_STRING_PATTERN,'');}function makeResponse(_x19){return _makeResponse.apply(this,arguments);}function _makeResponse(){_makeResponse=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee18(resource){var headers,contentLength,_getResourceUrlAndTyp3,url,type,initialDataUrl,response;return regenerator.wrap(function _callee18$(_context22){while(1){switch(_context22.prev=_context22.next){case 0:if(!isResponse(resource)){_context22.next=2;break;}return _context22.abrupt("return",resource);case 2:headers={};contentLength=getResourceContentLength(resource);if(contentLength>=0){headers['content-length']=String(contentLength);}_getResourceUrlAndTyp3=getResourceUrlAndType(resource),url=_getResourceUrlAndTyp3.url,type=_getResourceUrlAndTyp3.type;if(type){headers['content-type']=type;}_context22.next=9;return getInitialDataUrl(resource);case 9:initialDataUrl=_context22.sent;if(initialDataUrl){headers['x-first-bytes']=initialDataUrl;}if(typeof resource==='string'){resource=new TextEncoder().encode(resource);}response=new Response(resource,{headers});Object.defineProperty(response,'url',{value:url});return _context22.abrupt("return",response);case 15:case"end":return _context22.stop();}}},_callee18);}));return _makeResponse.apply(this,arguments);}function checkResponse(_x20){return _checkResponse.apply(this,arguments);}function _checkResponse(){_checkResponse=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee19(response){var message;return regenerator.wrap(function _callee19$(_context23){while(1){switch(_context23.prev=_context23.next){case 0:if(response.ok){_context23.next=5;break;}_context23.next=3;return getResponseError(response);case 3:message=_context23.sent;throw new Error(message);case 5:case"end":return _context23.stop();}}},_callee19);}));return _checkResponse.apply(this,arguments);}function getResponseError(_x21){return _getResponseError.apply(this,arguments);}function _getResponseError(){_getResponseError=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee20(response){var message,contentType,text;return regenerator.wrap(function _callee20$(_context24){while(1){switch(_context24.prev=_context24.next){case 0:message='Failed to fetch resource '.concat(response.url,' (').concat(response.status,'): ');_context24.prev=1;contentType=response.headers.get('Content-Type');text=response.statusText;if(!contentType.includes('application/json')){_context24.next=11;break;}_context24.t0=text;_context24.t1=' ';_context24.next=9;return response.text();case 9:_context24.t2=_context24.sent;text=_context24.t0+=_context24.t1.concat.call(_context24.t1,_context24.t2);case 11:message+=text;message=message.length>60?''.concat(message.slice(60),'...'):message;_context24.next=17;break;case 15:_context24.prev=15;_context24.t3=_context24["catch"](1);case 17:return _context24.abrupt("return",message);case 18:case"end":return _context24.stop();}}},_callee20,null,[[1,15]]);}));return _getResponseError.apply(this,arguments);}function getInitialDataUrl(_x22){return _getInitialDataUrl.apply(this,arguments);}function _getInitialDataUrl(){_getInitialDataUrl=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee21(resource){var INITIAL_DATA_LENGTH,blobSlice,slice,base64;return regenerator.wrap(function _callee21$(_context25){while(1){switch(_context25.prev=_context25.next){case 0:INITIAL_DATA_LENGTH=5;if(!(typeof resource==='string')){_context25.next=3;break;}return _context25.abrupt("return",'data:,'.concat(resource.slice(0,INITIAL_DATA_LENGTH)));case 3:if(!(resource instanceof Blob)){_context25.next=8;break;}blobSlice=resource.slice(0,5);_context25.next=7;return new Promise(function(resolve){var reader=new FileReader();reader.onload=function(event){var _event$target;return resolve(event===null||event===void 0?void 0:(_event$target=event.target)===null||_event$target===void 0?void 0:_event$target.result);};reader.readAsDataURL(blobSlice);});case 7:return _context25.abrupt("return",_context25.sent);case 8:if(!(resource instanceof ArrayBuffer)){_context25.next=12;break;}slice=resource.slice(0,INITIAL_DATA_LENGTH);base64=arrayBufferToBase64(slice);return _context25.abrupt("return",'data:base64,'.concat(base64));case 12:return _context25.abrupt("return",null);case 13:case"end":return _context25.stop();}}},_callee21);}));return _getInitialDataUrl.apply(this,arguments);}function arrayBufferToBase64(buffer){var binary='';var bytes=new Uint8Array(buffer);for(var _i5=0;_i5<bytes.byteLength;_i5++){binary+=String.fromCharCode(bytes[_i5]);}return btoa(binary);}function fetchFile(_x23,_x24){return _fetchFile.apply(this,arguments);}function _fetchFile(){_fetchFile=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee22(url,options){var fetchOptions;return regenerator.wrap(function _callee22$(_context26){while(1){switch(_context26.prev=_context26.next){case 0:if(!(typeof url==='string')){_context26.next=7;break;}url=resolvePath(url);fetchOptions=options;if(options!==null&&options!==void 0&&options.fetch&&typeof(options===null||options===void 0?void 0:options.fetch)!=='function'){fetchOptions=options.fetch;}_context26.next=6;return fetch(url,fetchOptions);case 6:return _context26.abrupt("return",_context26.sent);case 7:_context26.next=9;return makeResponse(url);case 9:return _context26.abrupt("return",_context26.sent);case 10:case"end":return _context26.stop();}}},_callee22);}));return _fetchFile.apply(this,arguments);}function isElectron(mockUserAgent){if(typeof window!=='undefined'&&typeof window.process==='object'&&window.process.type==='renderer'){return true;}if(typeof process!=='undefined'&&typeof process.versions==='object'&&Boolean(process.versions.electron)){return true;}var realUserAgent=typeof navigator==='object'&&typeof navigator.userAgent==='string'&&navigator.userAgent;var userAgent=mockUserAgent||realUserAgent;if(userAgent&&userAgent.indexOf('Electron')>=0){return true;}return false;}function isBrowser(){var isNode=typeof process==='object'&&String(process)==='[object process]'&&!process.browser;return !isNode||isElectron();}var globals={self:typeof self!=='undefined'&&self,window:typeof window!=='undefined'&&window,global:typeof global!=='undefined'&&global,document:typeof document!=='undefined'&&document,process:typeof process==='object'&&process};var window_=globals.window||globals.self||globals.global;var process_=globals.process||{};var VERSION$6="4.12.0-alpha.26";isBrowser();function getStorage(type){try{var storage=window[type];var x='__storage_test__';storage.setItem(x,x);storage.removeItem(x);return storage;}catch(e){return null;}}var LocalStorage=/*#__PURE__*/function(){function LocalStorage(id){_classCallCheck(this,LocalStorage);var defaultSettings=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var type=arguments.length>2&&arguments[2]!==undefined?arguments[2]:'sessionStorage';_defineProperty(this,'storage',void 0);_defineProperty(this,'id',void 0);_defineProperty(this,'config',{});this.storage=getStorage(type);this.id=id;this.config={};Object.assign(this.config,defaultSettings);this._loadConfiguration();}_createClass(LocalStorage,[{key:"getConfiguration",value:function getConfiguration(){return this.config;}},{key:"setConfiguration",value:function setConfiguration(configuration){this.config={};return this.updateConfiguration(configuration);}},{key:"updateConfiguration",value:function updateConfiguration(configuration){Object.assign(this.config,configuration);if(this.storage){var serialized=JSON.stringify(this.config);this.storage.setItem(this.id,serialized);}return this;}},{key:"_loadConfiguration",value:function _loadConfiguration(){var configuration={};if(this.storage){var serializedConfiguration=this.storage.getItem(this.id);configuration=serializedConfiguration?JSON.parse(serializedConfiguration):{};}Object.assign(this.config,configuration);return this;}}]);return LocalStorage;}();function formatTime(ms){var formatted;if(ms<10){formatted=''.concat(ms.toFixed(2),'ms');}else if(ms<100){formatted=''.concat(ms.toFixed(1),'ms');}else if(ms<1000){formatted=''.concat(ms.toFixed(0),'ms');}else {formatted=''.concat((ms/1000).toFixed(2),'s');}return formatted;}function leftPad(string){var length=arguments.length>1&&arguments[1]!==undefined?arguments[1]:8;var padLength=Math.max(length-string.length,0);return ''.concat(' '.repeat(padLength)).concat(string);}function formatImage(image,message,scale){var maxWidth=arguments.length>3&&arguments[3]!==undefined?arguments[3]:600;var imageUrl=image.src.replace(/\(/g,'%28').replace(/\)/g,'%29');if(image.width>maxWidth){scale=Math.min(scale,maxWidth/image.width);}var width=image.width*scale;var height=image.height*scale;var style=['font-size:1px;','padding:'.concat(Math.floor(height/2),'px ').concat(Math.floor(width/2),'px;'),'line-height:'.concat(height,'px;'),'background:url('.concat(imageUrl,');'),'background-size:'.concat(width,'px ').concat(height,'px;'),'color:transparent;'].join('');return [''.concat(message,' %c+'),style];}var COLOR;(function(COLOR){COLOR[COLOR['BLACK']=30]='BLACK';COLOR[COLOR['RED']=31]='RED';COLOR[COLOR['GREEN']=32]='GREEN';COLOR[COLOR['YELLOW']=33]='YELLOW';COLOR[COLOR['BLUE']=34]='BLUE';COLOR[COLOR['MAGENTA']=35]='MAGENTA';COLOR[COLOR['CYAN']=36]='CYAN';COLOR[COLOR['WHITE']=37]='WHITE';COLOR[COLOR['BRIGHT_BLACK']=90]='BRIGHT_BLACK';COLOR[COLOR['BRIGHT_RED']=91]='BRIGHT_RED';COLOR[COLOR['BRIGHT_GREEN']=92]='BRIGHT_GREEN';COLOR[COLOR['BRIGHT_YELLOW']=93]='BRIGHT_YELLOW';COLOR[COLOR['BRIGHT_BLUE']=94]='BRIGHT_BLUE';COLOR[COLOR['BRIGHT_MAGENTA']=95]='BRIGHT_MAGENTA';COLOR[COLOR['BRIGHT_CYAN']=96]='BRIGHT_CYAN';COLOR[COLOR['BRIGHT_WHITE']=97]='BRIGHT_WHITE';})(COLOR||(COLOR={}));function getColor(color){return typeof color==='string'?COLOR[color.toUpperCase()]||COLOR.WHITE:color;}function addColor(string,color,background){if(!isBrowser&&typeof string==='string'){if(color){color=getColor(color);string='\x1B['.concat(color,'m').concat(string,'\x1B[39m');}if(background){color=getColor(background);string='\x1B['.concat(background+10,'m').concat(string,'\x1B[49m');}}return string;}function autobind(obj){var predefined=arguments.length>1&&arguments[1]!==undefined?arguments[1]:['constructor'];var proto=Object.getPrototypeOf(obj);var propNames=Object.getOwnPropertyNames(proto);var _iterator6=_createForOfIteratorHelper$3(propNames),_step6;try{var _loop=function _loop(){var key=_step6.value;if(typeof obj[key]==='function'){if(!predefined.find(function(name){return key===name;})){obj[key]=obj[key].bind(obj);}}};for(_iterator6.s();!(_step6=_iterator6.n()).done;){_loop();}}catch(err){_iterator6.e(err);}finally{_iterator6.f();}}function assert$5(condition,message){if(!condition){throw new Error(message||'Assertion failed');}}function getHiResTimestamp(){var timestamp;if(isBrowser&&'performance'in window_){var _window$performance,_window$performance$n;timestamp=window_===null||window_===void 0?void 0:(_window$performance=window_.performance)===null||_window$performance===void 0?void 0:(_window$performance$n=_window$performance.now)===null||_window$performance$n===void 0?void 0:_window$performance$n.call(_window$performance);}else if('hrtime'in process_){var _process$hrtime;var timeParts=process_===null||process_===void 0?void 0:(_process$hrtime=process_.hrtime)===null||_process$hrtime===void 0?void 0:_process$hrtime.call(process_);timestamp=timeParts[0]*1000+timeParts[1]/1e6;}else {timestamp=Date.now();}return timestamp;}var originalConsole={debug:isBrowser?console.debug||console.log:console.log,log:console.log,info:console.info,warn:console.warn,error:console.error};var DEFAULT_SETTINGS={enabled:true,level:0};function noop$1(){}var cache={};var ONCE={once:true};var Log=/*#__PURE__*/function(){function Log(){_classCallCheck(this,Log);var _ref4=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{id:''},id=_ref4.id;_defineProperty(this,'id',void 0);_defineProperty(this,'VERSION',VERSION$6);_defineProperty(this,'_startTs',getHiResTimestamp());_defineProperty(this,'_deltaTs',getHiResTimestamp());_defineProperty(this,'_storage',void 0);_defineProperty(this,'userData',{});_defineProperty(this,'LOG_THROTTLE_TIMEOUT',0);this.id=id;this._storage=new LocalStorage('__probe-'.concat(this.id,'__'),DEFAULT_SETTINGS);this.userData={};this.timeStamp(''.concat(this.id,' started'));autobind(this);Object.seal(this);}_createClass(Log,[{key:"level",get:function get(){return this.getLevel();},set:function set(newLevel){this.setLevel(newLevel);}},{key:"isEnabled",value:function isEnabled(){return this._storage.config.enabled;}},{key:"getLevel",value:function getLevel(){return this._storage.config.level;}},{key:"getTotal",value:function getTotal(){return Number((getHiResTimestamp()-this._startTs).toPrecision(10));}},{key:"getDelta",value:function getDelta(){return Number((getHiResTimestamp()-this._deltaTs).toPrecision(10));}},{key:"priority",get:function get(){return this.level;},set:function set(newPriority){this.level=newPriority;}},{key:"getPriority",value:function getPriority(){return this.level;}},{key:"enable",value:function enable(){var enabled=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;this._storage.updateConfiguration({enabled});return this;}},{key:"setLevel",value:function setLevel(level){this._storage.updateConfiguration({level});return this;}},{key:"get",value:function get(setting){return this._storage.config[setting];}},{key:"set",value:function set(setting,value){this._storage.updateConfiguration({[setting]:value});}},{key:"settings",value:function settings(){if(console.table){console.table(this._storage.config);}else {console.log(this._storage.config);}}},{key:"assert",value:function assert(condition,message){assert$5(condition,message);}},{key:"warn",value:function warn(message){return this._getLogFunction(0,message,originalConsole.warn,arguments,ONCE);}},{key:"error",value:function error(message){return this._getLogFunction(0,message,originalConsole.error,arguments);}},{key:"deprecated",value:function deprecated(oldUsage,newUsage){return this.warn('`'.concat(oldUsage,'` is deprecated and will be removed in a later version. Use `').concat(newUsage,'` instead'));}},{key:"removed",value:function removed(oldUsage,newUsage){return this.error('`'.concat(oldUsage,'` has been removed. Use `').concat(newUsage,'` instead'));}},{key:"probe",value:function probe(logLevel,message){return this._getLogFunction(logLevel,message,originalConsole.log,arguments,{time:true,once:true});}},{key:"log",value:function log(logLevel,message){return this._getLogFunction(logLevel,message,originalConsole.debug,arguments);}},{key:"info",value:function info(logLevel,message){return this._getLogFunction(logLevel,message,console.info,arguments);}},{key:"once",value:function once(logLevel,message){for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++){args[_key-2]=arguments[_key];}return this._getLogFunction(logLevel,message,originalConsole.debug||originalConsole.info,arguments,ONCE);}},{key:"table",value:function table(logLevel,_table,columns){if(_table){return this._getLogFunction(logLevel,_table,console.table||noop$1,columns&&[columns],{tag:getTableHeader(_table)});}return noop$1;}},{key:"image",value:function image(_ref){var logLevel=_ref.logLevel,priority=_ref.priority,image=_ref.image,_ref$message=_ref.message,message=_ref$message===void 0?'':_ref$message,_ref$scale=_ref.scale,scale=_ref$scale===void 0?1:_ref$scale;if(!this._shouldLog(logLevel||priority)){return noop$1;}return isBrowser?logImageInBrowser({image,message,scale}):logImageInNode({image,message,scale});}},{key:"time",value:function time(logLevel,message){return this._getLogFunction(logLevel,message,console.time?console.time:console.info);}},{key:"timeEnd",value:function timeEnd(logLevel,message){return this._getLogFunction(logLevel,message,console.timeEnd?console.timeEnd:console.info);}},{key:"timeStamp",value:function timeStamp(logLevel,message){return this._getLogFunction(logLevel,message,console.timeStamp||noop$1);}},{key:"group",value:function group(logLevel,message){var opts=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{collapsed:false};var options=normalizeArguments({logLevel,message,opts});var collapsed=opts.collapsed;options.method=(collapsed?console.groupCollapsed:console.group)||console.info;return this._getLogFunction(options);}},{key:"groupCollapsed",value:function groupCollapsed(logLevel,message){var opts=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};return this.group(logLevel,message,Object.assign({},opts,{collapsed:true}));}},{key:"groupEnd",value:function groupEnd(logLevel){return this._getLogFunction(logLevel,'',console.groupEnd||noop$1);}},{key:"withGroup",value:function withGroup(logLevel,message,func){this.group(logLevel,message)();try{func();}finally{this.groupEnd(logLevel)();}}},{key:"trace",value:function trace(){if(console.trace){console.trace();}}},{key:"_shouldLog",value:function _shouldLog(logLevel){return this.isEnabled()&&this.getLevel()>=normalizeLogLevel(logLevel);}},{key:"_getLogFunction",value:function _getLogFunction(logLevel,message,method,args,opts){if(this._shouldLog(logLevel)){var _method;opts=normalizeArguments({logLevel,message,args,opts});method=method||opts.method;assert$5(method);opts.total=this.getTotal();opts.delta=this.getDelta();this._deltaTs=getHiResTimestamp();var tag=opts.tag||opts.message;if(opts.once){if(!cache[tag]){cache[tag]=getHiResTimestamp();}else {return noop$1;}}message=decorateMessage(this.id,opts.message,opts);return (_method=method).bind.apply(_method,[console,message].concat(_toConsumableArray(opts.args)));}return noop$1;}}]);return Log;}();_defineProperty(Log,'VERSION',VERSION$6);function normalizeLogLevel(logLevel){if(!logLevel){return 0;}var resolvedLevel;switch(typeof logLevel){case'number':resolvedLevel=logLevel;break;case'object':resolvedLevel=logLevel.logLevel||logLevel.priority||0;break;default:return 0;}assert$5(Number.isFinite(resolvedLevel)&&resolvedLevel>=0);return resolvedLevel;}function normalizeArguments(opts){var logLevel=opts.logLevel,message=opts.message;opts.logLevel=normalizeLogLevel(logLevel);var args=opts.args?Array.from(opts.args):[];while(args.length&&args.shift()!==message){}switch(typeof logLevel){case'string':case'function':if(message!==undefined){args.unshift(message);}opts.message=logLevel;break;case'object':Object.assign(opts,logLevel);break;}if(typeof opts.message==='function'){opts.message=opts.message();}var messageType=typeof opts.message;assert$5(messageType==='string'||messageType==='object');return Object.assign(opts,{args},opts.opts);}function decorateMessage(id,message,opts){if(typeof message==='string'){var time=opts.time?leftPad(formatTime(opts.total)):'';message=opts.time?''.concat(id,': ').concat(time,' ').concat(message):''.concat(id,': ').concat(message);message=addColor(message,opts.color,opts.background);}return message;}function logImageInNode(_ref2){var image=_ref2.image;_ref2.message;var _ref2$scale=_ref2.scale,scale=_ref2$scale===void 0?1:_ref2$scale;var asciify=null;try{asciify=module.require('asciify-image');}catch(error){}if(asciify){return function(){return asciify(image,{fit:'box',width:''.concat(Math.round(80*scale),'%')}).then(function(data){return console.log(data);});};}return noop$1;}function logImageInBrowser(_ref3){var image=_ref3.image,_ref3$message=_ref3.message,message=_ref3$message===void 0?'':_ref3$message,_ref3$scale=_ref3.scale,scale=_ref3$scale===void 0?1:_ref3$scale;if(typeof image==='string'){var img=new Image();img.onload=function(){var _console;var args=formatImage(img,message,scale);(_console=console).log.apply(_console,_toConsumableArray(args));};img.src=image;return noop$1;}var element=image.nodeName||'';if(element.toLowerCase()==='img'){var _console2;(_console2=console).log.apply(_console2,_toConsumableArray(formatImage(image,message,scale)));return noop$1;}if(element.toLowerCase()==='canvas'){var _img=new Image();_img.onload=function(){var _console3;return (_console3=console).log.apply(_console3,_toConsumableArray(formatImage(_img,message,scale)));};_img.src=image.toDataURL();return noop$1;}return noop$1;}function getTableHeader(table){for(var key in table){for(var title in table[key]){return title||'untitled';}}return 'empty';}var probeLog=new Log({id:'loaders.gl'});var NullLog=/*#__PURE__*/function(){function NullLog(){_classCallCheck(this,NullLog);}_createClass(NullLog,[{key:"log",value:function log(){return function(){};}},{key:"info",value:function info(){return function(){};}},{key:"warn",value:function warn(){return function(){};}},{key:"error",value:function error(){return function(){};}}]);return NullLog;}();var ConsoleLog=/*#__PURE__*/function(){function ConsoleLog(){_classCallCheck(this,ConsoleLog);_defineProperty(this,'console',void 0);this.console=console;}_createClass(ConsoleLog,[{key:"log",value:function log(){var _this$console$log;for(var _len3=arguments.length,args=new Array(_len3),_key3=0;_key3<_len3;_key3++){args[_key3]=arguments[_key3];}return (_this$console$log=this.console.log).bind.apply(_this$console$log,[this.console].concat(args));}},{key:"info",value:function info(){var _this$console$info;for(var _len4=arguments.length,args=new Array(_len4),_key4=0;_key4<_len4;_key4++){args[_key4]=arguments[_key4];}return (_this$console$info=this.console.info).bind.apply(_this$console$info,[this.console].concat(args));}},{key:"warn",value:function warn(){var _this$console$warn;for(var _len5=arguments.length,args=new Array(_len5),_key5=0;_key5<_len5;_key5++){args[_key5]=arguments[_key5];}return (_this$console$warn=this.console.warn).bind.apply(_this$console$warn,[this.console].concat(args));}},{key:"error",value:function error(){var _this$console$error;for(var _len6=arguments.length,args=new Array(_len6),_key6=0;_key6<_len6;_key6++){args[_key6]=arguments[_key6];}return (_this$console$error=this.console.error).bind.apply(_this$console$error,[this.console].concat(args));}}]);return ConsoleLog;}();var DEFAULT_LOADER_OPTIONS={fetch:null,mimeType:undefined,nothrow:false,log:new ConsoleLog(),CDN:'https://unpkg.com/@loaders.gl',worker:true,maxConcurrency:3,maxMobileConcurrency:1,reuseWorkers:true,_workerType:'',limit:0,_limitMB:0,batchSize:'auto',batchDebounceMs:0,metadata:false,transforms:[]};var REMOVED_LOADER_OPTIONS={throws:'nothrow',dataType:'(no longer used)',uri:'baseUri',method:'fetch.method',headers:'fetch.headers',body:'fetch.body',mode:'fetch.mode',credentials:'fetch.credentials',cache:'fetch.cache',redirect:'fetch.redirect',referrer:'fetch.referrer',referrerPolicy:'fetch.referrerPolicy',integrity:'fetch.integrity',keepalive:'fetch.keepalive',signal:'fetch.signal'};function getGlobalLoaderState(){globalThis$1.loaders=globalThis$1.loaders||{};var loaders=globalThis$1.loaders;loaders._state=loaders._state||{};return loaders._state;}var getGlobalLoaderOptions=function getGlobalLoaderOptions(){var state=getGlobalLoaderState();state.globalOptions=state.globalOptions||_objectSpread$3({},DEFAULT_LOADER_OPTIONS);return state.globalOptions;};function normalizeOptions(options,loader,loaders,url){loaders=loaders||[];loaders=Array.isArray(loaders)?loaders:[loaders];validateOptions(options,loaders);return normalizeOptionsInternal(loader,options,url);}function getFetchFunction(options,context){var globalOptions=getGlobalLoaderOptions();var fetchOptions=options||globalOptions;if(typeof fetchOptions.fetch==='function'){return fetchOptions.fetch;}if(isObject$2(fetchOptions.fetch)){return function(url){return fetchFile(url,fetchOptions);};}if(context!==null&&context!==void 0&&context.fetch){return context===null||context===void 0?void 0:context.fetch;}return fetchFile;}function validateOptions(options,loaders){validateOptionsObject(options,null,DEFAULT_LOADER_OPTIONS,REMOVED_LOADER_OPTIONS,loaders);var _iterator7=_createForOfIteratorHelper$3(loaders),_step7;try{for(_iterator7.s();!(_step7=_iterator7.n()).done;){var loader=_step7.value;var idOptions=options&&options[loader.id]||{};var loaderOptions=loader.options&&loader.options[loader.id]||{};var deprecatedOptions=loader.deprecatedOptions&&loader.deprecatedOptions[loader.id]||{};validateOptionsObject(idOptions,loader.id,loaderOptions,deprecatedOptions,loaders);}}catch(err){_iterator7.e(err);}finally{_iterator7.f();}}function validateOptionsObject(options,id,defaultOptions,deprecatedOptions,loaders){var loaderName=id||'Top level';var prefix=id?''.concat(id,'.'):'';for(var key in options){var isSubOptions=!id&&isObject$2(options[key]);var isBaseUriOption=key==='baseUri'&&!id;var isWorkerUrlOption=key==='workerUrl'&&id;if(!(key in defaultOptions)&&!isBaseUriOption&&!isWorkerUrlOption){if(key in deprecatedOptions){probeLog.warn(''.concat(loaderName," loader option '").concat(prefix).concat(key,"' no longer supported, use '").concat(deprecatedOptions[key],"'"))();}else if(!isSubOptions){var suggestion=findSimilarOption(key,loaders);probeLog.warn(''.concat(loaderName," loader option '").concat(prefix).concat(key,"' not recognized. ").concat(suggestion))();}}}}function findSimilarOption(optionKey,loaders){var lowerCaseOptionKey=optionKey.toLowerCase();var bestSuggestion='';var _iterator8=_createForOfIteratorHelper$3(loaders),_step8;try{for(_iterator8.s();!(_step8=_iterator8.n()).done;){var loader=_step8.value;for(var key in loader.options){if(optionKey===key){return "Did you mean '".concat(loader.id,'.').concat(key,"'?");}var lowerCaseKey=key.toLowerCase();var isPartialMatch=lowerCaseOptionKey.startsWith(lowerCaseKey)||lowerCaseKey.startsWith(lowerCaseOptionKey);if(isPartialMatch){bestSuggestion=bestSuggestion||"Did you mean '".concat(loader.id,'.').concat(key,"'?");}}}}catch(err){_iterator8.e(err);}finally{_iterator8.f();}return bestSuggestion;}function normalizeOptionsInternal(loader,options,url){var loaderDefaultOptions=loader.options||{};var mergedOptions=_objectSpread$3({},loaderDefaultOptions);addUrlOptions(mergedOptions,url);if(mergedOptions.log===null){mergedOptions.log=new NullLog();}mergeNestedFields(mergedOptions,getGlobalLoaderOptions());mergeNestedFields(mergedOptions,options);return mergedOptions;}function mergeNestedFields(mergedOptions,options){for(var key in options){if(key in options){var value=options[key];if(isPureObject(value)&&isPureObject(mergedOptions[key])){mergedOptions[key]=_objectSpread$3(_objectSpread$3({},mergedOptions[key]),options[key]);}else {mergedOptions[key]=options[key];}}}}function addUrlOptions(options,url){if(url&&!('baseUri'in options)){options.baseUri=url;}}function isLoaderObject(loader){var _loader;if(!loader){return false;}if(Array.isArray(loader)){loader=loader[0];}var hasExtensions=Array.isArray((_loader=loader)===null||_loader===void 0?void 0:_loader.extensions);return hasExtensions;}function normalizeLoader(loader){var _loader2,_loader3;assert$7(loader,'null loader');assert$7(isLoaderObject(loader),'invalid loader');var options;if(Array.isArray(loader)){options=loader[1];loader=loader[0];loader=_objectSpread$3(_objectSpread$3({},loader),{},{options:_objectSpread$3(_objectSpread$3({},loader.options),options)});}if((_loader2=loader)!==null&&_loader2!==void 0&&_loader2.parseTextSync||(_loader3=loader)!==null&&_loader3!==void 0&&_loader3.parseText){loader.text=true;}if(!loader.text){loader.binary=true;}return loader;}var getGlobalLoaderRegistry=function getGlobalLoaderRegistry(){var state=getGlobalLoaderState();state.loaderRegistry=state.loaderRegistry||[];return state.loaderRegistry;};function getRegisteredLoaders(){return getGlobalLoaderRegistry();}var EXT_PATTERN=/\.([^.]+)$/;function selectLoader(_x25){return _selectLoader.apply(this,arguments);}function _selectLoader(){_selectLoader=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee23(data){var loaders,options,context,loader,_args27=arguments;return regenerator.wrap(function _callee23$(_context27){while(1){switch(_context27.prev=_context27.next){case 0:loaders=_args27.length>1&&_args27[1]!==undefined?_args27[1]:[];options=_args27.length>2?_args27[2]:undefined;context=_args27.length>3?_args27[3]:undefined;if(validHTTPResponse(data)){_context27.next=5;break;}return _context27.abrupt("return",null);case 5:loader=selectLoaderSync(data,loaders,_objectSpread$3(_objectSpread$3({},options),{},{nothrow:true}),context);if(!loader){_context27.next=8;break;}return _context27.abrupt("return",loader);case 8:if(!isBlob(data)){_context27.next=13;break;}_context27.next=11;return data.slice(0,10).arrayBuffer();case 11:data=_context27.sent;loader=selectLoaderSync(data,loaders,options,context);case 13:if(!(!loader&&!(options!==null&&options!==void 0&&options.nothrow))){_context27.next=15;break;}throw new Error(getNoValidLoaderMessage(data));case 15:return _context27.abrupt("return",loader);case 16:case"end":return _context27.stop();}}},_callee23);}));return _selectLoader.apply(this,arguments);}function selectLoaderSync(data){var loaders=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[];var options=arguments.length>2?arguments[2]:undefined;var context=arguments.length>3?arguments[3]:undefined;if(!validHTTPResponse(data)){return null;}if(loaders&&!Array.isArray(loaders)){return normalizeLoader(loaders);}var candidateLoaders=[];if(loaders){candidateLoaders=candidateLoaders.concat(loaders);}if(!(options!==null&&options!==void 0&&options.ignoreRegisteredLoaders)){var _candidateLoaders;(_candidateLoaders=candidateLoaders).push.apply(_candidateLoaders,_toConsumableArray(getRegisteredLoaders()));}normalizeLoaders(candidateLoaders);var loader=selectLoaderInternal(data,candidateLoaders,options,context);if(!loader&&!(options!==null&&options!==void 0&&options.nothrow)){throw new Error(getNoValidLoaderMessage(data));}return loader;}function selectLoaderInternal(data,loaders,options,context){var _getResourceUrlAndTyp=getResourceUrlAndType(data),url=_getResourceUrlAndTyp.url,type=_getResourceUrlAndTyp.type;var testUrl=url||(context===null||context===void 0?void 0:context.url);var loader=null;if(options!==null&&options!==void 0&&options.mimeType){loader=findLoaderByMIMEType(loaders,options===null||options===void 0?void 0:options.mimeType);}loader=loader||findLoaderByUrl(loaders,testUrl);loader=loader||findLoaderByMIMEType(loaders,type);loader=loader||findLoaderByInitialBytes(loaders,data);loader=loader||findLoaderByMIMEType(loaders,options===null||options===void 0?void 0:options.fallbackMimeType);return loader;}function validHTTPResponse(data){if(data instanceof Response){if(data.status===204){return false;}}return true;}function getNoValidLoaderMessage(data){var _getResourceUrlAndTyp2=getResourceUrlAndType(data),url=_getResourceUrlAndTyp2.url,type=_getResourceUrlAndTyp2.type;var message='No valid loader found (';message+=url?''.concat(filename(url),', '):'no url provided, ';message+='MIME type: '.concat(type?'"'.concat(type,'"'):'not provided',', ');var firstCharacters=data?getFirstCharacters(data):'';message+=firstCharacters?' first bytes: "'.concat(firstCharacters,'"'):'first bytes: not available';message+=')';return message;}function normalizeLoaders(loaders){var _iterator9=_createForOfIteratorHelper$3(loaders),_step9;try{for(_iterator9.s();!(_step9=_iterator9.n()).done;){var loader=_step9.value;normalizeLoader(loader);}}catch(err){_iterator9.e(err);}finally{_iterator9.f();}}function findLoaderByUrl(loaders,url){var match=url&&EXT_PATTERN.exec(url);var extension=match&&match[1];return extension?findLoaderByExtension(loaders,extension):null;}function findLoaderByExtension(loaders,extension){extension=extension.toLowerCase();var _iterator10=_createForOfIteratorHelper$3(loaders),_step10;try{for(_iterator10.s();!(_step10=_iterator10.n()).done;){var loader=_step10.value;var _iterator11=_createForOfIteratorHelper$3(loader.extensions),_step11;try{for(_iterator11.s();!(_step11=_iterator11.n()).done;){var loaderExtension=_step11.value;if(loaderExtension.toLowerCase()===extension){return loader;}}}catch(err){_iterator11.e(err);}finally{_iterator11.f();}}}catch(err){_iterator10.e(err);}finally{_iterator10.f();}return null;}function findLoaderByMIMEType(loaders,mimeType){var _iterator12=_createForOfIteratorHelper$3(loaders),_step12;try{for(_iterator12.s();!(_step12=_iterator12.n()).done;){var loader=_step12.value;if(loader.mimeTypes&&loader.mimeTypes.includes(mimeType)){return loader;}if(mimeType==='application/x.'.concat(loader.id)){return loader;}}}catch(err){_iterator12.e(err);}finally{_iterator12.f();}return null;}function findLoaderByInitialBytes(loaders,data){if(!data){return null;}var _iterator13=_createForOfIteratorHelper$3(loaders),_step13;try{for(_iterator13.s();!(_step13=_iterator13.n()).done;){var loader=_step13.value;if(typeof data==='string'){if(testDataAgainstText(data,loader)){return loader;}}else if(ArrayBuffer.isView(data)){if(testDataAgainstBinary(data.buffer,data.byteOffset,loader)){return loader;}}else if(data instanceof ArrayBuffer){var byteOffset=0;if(testDataAgainstBinary(data,byteOffset,loader)){return loader;}}}}catch(err){_iterator13.e(err);}finally{_iterator13.f();}return null;}function testDataAgainstText(data,loader){if(loader.testText){return loader.testText(data);}var tests=Array.isArray(loader.tests)?loader.tests:[loader.tests];return tests.some(function(test){return data.startsWith(test);});}function testDataAgainstBinary(data,byteOffset,loader){var tests=Array.isArray(loader.tests)?loader.tests:[loader.tests];return tests.some(function(test){return testBinary(data,byteOffset,loader,test);});}function testBinary(data,byteOffset,loader,test){if(test instanceof ArrayBuffer){return compareArrayBuffers(test,data,test.byteLength);}switch(typeof test){case'function':return test(data,loader);case'string':var magic=getMagicString$2(data,byteOffset,test.length);return test===magic;default:return false;}}function getFirstCharacters(data){var length=arguments.length>1&&arguments[1]!==undefined?arguments[1]:5;if(typeof data==='string'){return data.slice(0,length);}else if(ArrayBuffer.isView(data)){return getMagicString$2(data.buffer,data.byteOffset,length);}else if(data instanceof ArrayBuffer){var byteOffset=0;return getMagicString$2(data,byteOffset,length);}return '';}function getMagicString$2(arrayBuffer,byteOffset,length){if(arrayBuffer.byteLength<byteOffset+length){return '';}var dataView=new DataView(arrayBuffer);var magic='';for(var _i6=0;_i6<length;_i6++){magic+=String.fromCharCode(dataView.getUint8(byteOffset+_i6));}return magic;}var DEFAULT_CHUNK_SIZE$2=256*1024;function makeStringIterator(string,options){var chunkSize,offset,textEncoder,chunkLength,chunk;return regenerator.wrap(function makeStringIterator$(_context4){while(1){switch(_context4.prev=_context4.next){case 0:chunkSize=(options===null||options===void 0?void 0:options.chunkSize)||DEFAULT_CHUNK_SIZE$2;offset=0;textEncoder=new TextEncoder();case 3:if(!(offset<string.length)){_context4.next=11;break;}chunkLength=Math.min(string.length-offset,chunkSize);chunk=string.slice(offset,offset+chunkLength);offset+=chunkLength;_context4.next=9;return textEncoder.encode(chunk);case 9:_context4.next=3;break;case 11:case"end":return _context4.stop();}}},_marked);}var DEFAULT_CHUNK_SIZE$1=256*1024;function makeArrayBufferIterator(arrayBuffer){var options,_options$chunkSize,chunkSize,byteOffset,chunkByteLength,chunk,sourceArray,chunkArray,_args5=arguments;return regenerator.wrap(function makeArrayBufferIterator$(_context5){while(1){switch(_context5.prev=_context5.next){case 0:options=_args5.length>1&&_args5[1]!==undefined?_args5[1]:{};_options$chunkSize=options.chunkSize,chunkSize=_options$chunkSize===void 0?DEFAULT_CHUNK_SIZE$1:_options$chunkSize;byteOffset=0;case 3:if(!(byteOffset<arrayBuffer.byteLength)){_context5.next=14;break;}chunkByteLength=Math.min(arrayBuffer.byteLength-byteOffset,chunkSize);chunk=new ArrayBuffer(chunkByteLength);sourceArray=new Uint8Array(arrayBuffer,byteOffset,chunkByteLength);chunkArray=new Uint8Array(chunk);chunkArray.set(sourceArray);byteOffset+=chunkByteLength;_context5.next=12;return chunk;case 12:_context5.next=3;break;case 14:case"end":return _context5.stop();}}},_marked2);}var DEFAULT_CHUNK_SIZE=1024*1024;function makeBlobIterator(_x,_x2){return _makeBlobIterator.apply(this,arguments);}function _makeBlobIterator(){_makeBlobIterator=_wrapAsyncGenerator(/*#__PURE__*/regenerator.mark(function _callee3(blob,options){var chunkSize,offset,end,chunk;return regenerator.wrap(function _callee3$(_context6){while(1){switch(_context6.prev=_context6.next){case 0:chunkSize=(options===null||options===void 0?void 0:options.chunkSize)||DEFAULT_CHUNK_SIZE;offset=0;case 2:if(!(offset<blob.size)){_context6.next=12;break;}end=offset+chunkSize;_context6.next=6;return _awaitAsyncGenerator(blob.slice(offset,end).arrayBuffer());case 6:chunk=_context6.sent;offset=end;_context6.next=10;return chunk;case 10:_context6.next=2;break;case 12:case"end":return _context6.stop();}}},_callee3);}));return _makeBlobIterator.apply(this,arguments);}function makeStreamIterator(stream,options){return isBrowser$2?makeBrowserStreamIterator(stream,options):makeNodeStreamIterator(stream);}function makeBrowserStreamIterator(_x3,_x4){return _makeBrowserStreamIterator.apply(this,arguments);}function _makeBrowserStreamIterator(){_makeBrowserStreamIterator=_wrapAsyncGenerator(/*#__PURE__*/regenerator.mark(function _callee4(stream,options){var reader,nextBatchPromise,currentBatchPromise,_yield$_awaitAsyncGen,done,value;return regenerator.wrap(function _callee4$(_context7){while(1){switch(_context7.prev=_context7.next){case 0:reader=stream.getReader();_context7.prev=1;case 2:currentBatchPromise=nextBatchPromise||reader.read();if(options!==null&&options!==void 0&&options._streamReadAhead){nextBatchPromise=reader.read();}_context7.next=7;return _awaitAsyncGenerator(currentBatchPromise);case 7:_yield$_awaitAsyncGen=_context7.sent;done=_yield$_awaitAsyncGen.done;value=_yield$_awaitAsyncGen.value;if(!done){_context7.next=12;break;}return _context7.abrupt("return");case 12:_context7.next=14;return toArrayBuffer(value);case 14:_context7.next=2;break;case 16:_context7.next=21;break;case 18:_context7.prev=18;_context7.t0=_context7["catch"](1);reader.releaseLock();case 21:case"end":return _context7.stop();}}},_callee4,null,[[1,18]]);}));return _makeBrowserStreamIterator.apply(this,arguments);}function makeNodeStreamIterator(_x5,_x6){return _makeNodeStreamIterator.apply(this,arguments);}function _makeNodeStreamIterator(){_makeNodeStreamIterator=_wrapAsyncGenerator(/*#__PURE__*/regenerator.mark(function _callee5(stream,options){var _iteratorAbruptCompletion2,_didIteratorError2,_iteratorError2,_iterator2,_step2,chunk;return regenerator.wrap(function _callee5$(_context8){while(1){switch(_context8.prev=_context8.next){case 0:_iteratorAbruptCompletion2=false;_didIteratorError2=false;_context8.prev=2;_iterator2=_asyncIterator(stream);case 4:_context8.next=6;return _awaitAsyncGenerator(_iterator2.next());case 6:if(!(_iteratorAbruptCompletion2=!(_step2=_context8.sent).done)){_context8.next=13;break;}chunk=_step2.value;_context8.next=10;return toArrayBuffer(chunk);case 10:_iteratorAbruptCompletion2=false;_context8.next=4;break;case 13:_context8.next=19;break;case 15:_context8.prev=15;_context8.t0=_context8["catch"](2);_didIteratorError2=true;_iteratorError2=_context8.t0;case 19:_context8.prev=19;_context8.prev=20;if(!(_iteratorAbruptCompletion2&&_iterator2.return!=null)){_context8.next=24;break;}_context8.next=24;return _awaitAsyncGenerator(_iterator2.return());case 24:_context8.prev=24;if(!_didIteratorError2){_context8.next=27;break;}throw _iteratorError2;case 27:return _context8.finish(24);case 28:return _context8.finish(19);case 29:case"end":return _context8.stop();}}},_callee5,null,[[2,15,19,29],[20,,24,28]]);}));return _makeNodeStreamIterator.apply(this,arguments);}function makeIterator(data,options){if(typeof data==='string'){return makeStringIterator(data,options);}if(data instanceof ArrayBuffer){return makeArrayBufferIterator(data,options);}if(isBlob(data)){return makeBlobIterator(data,options);}if(isReadableStream(data)){return makeStreamIterator(data,options);}if(isResponse(data)){var response=data;return makeStreamIterator(response.body,options);}throw new Error('makeIterator');}var ERR_DATA='Cannot convert supplied data type';function getArrayBufferOrStringFromDataSync(data,loader,options){if(loader.text&&typeof data==='string'){return data;}if(isBuffer(data)){data=data.buffer;}if(data instanceof ArrayBuffer){var arrayBuffer=data;if(loader.text&&!loader.binary){var textDecoder=new TextDecoder('utf8');return textDecoder.decode(arrayBuffer);}return arrayBuffer;}if(ArrayBuffer.isView(data)){if(loader.text&&!loader.binary){var _textDecoder=new TextDecoder('utf8');return _textDecoder.decode(data);}var _arrayBuffer=data.buffer;var byteLength=data.byteLength||data.length;if(data.byteOffset!==0||byteLength!==_arrayBuffer.byteLength){_arrayBuffer=_arrayBuffer.slice(data.byteOffset,data.byteOffset+byteLength);}return _arrayBuffer;}throw new Error(ERR_DATA);}function getArrayBufferOrStringFromData(_x26,_x27,_x28){return _getArrayBufferOrStringFromData.apply(this,arguments);}function _getArrayBufferOrStringFromData(){_getArrayBufferOrStringFromData=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee24(data,loader,options){var isArrayBuffer,response;return regenerator.wrap(function _callee24$(_context28){while(1){switch(_context28.prev=_context28.next){case 0:isArrayBuffer=data instanceof ArrayBuffer||ArrayBuffer.isView(data);if(!(typeof data==='string'||isArrayBuffer)){_context28.next=3;break;}return _context28.abrupt("return",getArrayBufferOrStringFromDataSync(data,loader));case 3:if(!isBlob(data)){_context28.next=7;break;}_context28.next=6;return makeResponse(data);case 6:data=_context28.sent;case 7:if(!isResponse(data)){_context28.next=21;break;}response=data;_context28.next=11;return checkResponse(response);case 11:if(!loader.binary){_context28.next=17;break;}_context28.next=14;return response.arrayBuffer();case 14:_context28.t0=_context28.sent;_context28.next=20;break;case 17:_context28.next=19;return response.text();case 19:_context28.t0=_context28.sent;case 20:return _context28.abrupt("return",_context28.t0);case 21:if(isReadableStream(data)){data=makeIterator(data,options);}if(!(isIterable(data)||isAsyncIterable(data))){_context28.next=24;break;}return _context28.abrupt("return",concatenateArrayBuffersAsync(data));case 24:throw new Error(ERR_DATA);case 25:case"end":return _context28.stop();}}},_callee24);}));return _getArrayBufferOrStringFromData.apply(this,arguments);}function getLoaderContext(context,options){var previousContext=arguments.length>2&&arguments[2]!==undefined?arguments[2]:null;if(previousContext){return previousContext;}var resolvedContext=_objectSpread$3({fetch:getFetchFunction(options,context)},context);if(!Array.isArray(resolvedContext.loaders)){resolvedContext.loaders=null;}return resolvedContext;}function getLoadersFromContext(loaders,context){if(!context&&loaders&&!Array.isArray(loaders)){return loaders;}var candidateLoaders;if(loaders){candidateLoaders=Array.isArray(loaders)?loaders:[loaders];}if(context&&context.loaders){var contextLoaders=Array.isArray(context.loaders)?context.loaders:[context.loaders];candidateLoaders=candidateLoaders?[].concat(_toConsumableArray(candidateLoaders),_toConsumableArray(contextLoaders)):contextLoaders;}return candidateLoaders&&candidateLoaders.length?candidateLoaders:null;}function parse$3(_x29,_x30,_x31,_x32){return _parse$.apply(this,arguments);}function _parse$(){_parse$=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee25(data,loaders,options,context){var _getResourceUrlAndTyp4,url,typedLoaders,candidateLoaders,loader;return regenerator.wrap(function _callee25$(_context29){while(1){switch(_context29.prev=_context29.next){case 0:assert$6(!context||typeof context==='object');if(loaders&&!Array.isArray(loaders)&&!isLoaderObject(loaders)){context=undefined;options=loaders;loaders=undefined;}_context29.next=4;return data;case 4:data=_context29.sent;options=options||{};_getResourceUrlAndTyp4=getResourceUrlAndType(data),url=_getResourceUrlAndTyp4.url;typedLoaders=loaders;candidateLoaders=getLoadersFromContext(typedLoaders,context);_context29.next=11;return selectLoader(data,candidateLoaders,options);case 11:loader=_context29.sent;if(loader){_context29.next=14;break;}return _context29.abrupt("return",null);case 14:options=normalizeOptions(options,loader,candidateLoaders,url);context=getLoaderContext({url,parse:parse$3,loaders:candidateLoaders},options,context);_context29.next=18;return parseWithLoader(loader,data,options,context);case 18:return _context29.abrupt("return",_context29.sent);case 19:case"end":return _context29.stop();}}},_callee25);}));return _parse$.apply(this,arguments);}function parseWithLoader(_x33,_x34,_x35,_x36){return _parseWithLoader.apply(this,arguments);}function _parseWithLoader(){_parseWithLoader=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee26(loader,data,options,context){return regenerator.wrap(function _callee26$(_context30){while(1){switch(_context30.prev=_context30.next){case 0:validateWorkerVersion(loader);_context30.next=3;return getArrayBufferOrStringFromData(data,loader,options);case 3:data=_context30.sent;if(!(loader.parseTextSync&&typeof data==='string')){_context30.next=7;break;}options.dataType='text';return _context30.abrupt("return",loader.parseTextSync(data,options,context,loader));case 7:if(!canParseWithWorker(loader,options)){_context30.next=11;break;}_context30.next=10;return parseWithWorker(loader,data,options,context,parse$3);case 10:return _context30.abrupt("return",_context30.sent);case 11:if(!(loader.parseText&&typeof data==='string')){_context30.next=15;break;}_context30.next=14;return loader.parseText(data,options,context,loader);case 14:return _context30.abrupt("return",_context30.sent);case 15:if(!loader.parse){_context30.next=19;break;}_context30.next=18;return loader.parse(data,options,context,loader);case 18:return _context30.abrupt("return",_context30.sent);case 19:assert$6(!loader.parseSync);throw new Error(''.concat(loader.id,' loader - no parser found and worker is disabled'));case 21:case"end":return _context30.stop();}}},_callee26);}));return _parseWithLoader.apply(this,arguments);}function _load2(_x37,_x38,_x39,_x40){return _load.apply(this,arguments);}function _load(){_load=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee27(url,loaders,options,context){var fetch,data;return regenerator.wrap(function _callee27$(_context31){while(1){switch(_context31.prev=_context31.next){case 0:if(!Array.isArray(loaders)&&!isLoaderObject(loaders)){options=loaders;loaders=undefined;}fetch=getFetchFunction(options);data=url;if(!(typeof url==='string')){_context31.next=7;break;}_context31.next=6;return fetch(url);case 6:data=_context31.sent;case 7:if(!isBlob(url)){_context31.next=11;break;}_context31.next=10;return fetch(url);case 10:data=_context31.sent;case 11:_context31.next=13;return parse$3(data,loaders,options);case 13:return _context31.abrupt("return",_context31.sent);case 14:case"end":return _context31.stop();}}},_callee27);}));return _load.apply(this,arguments);}function assert$4(condition,message){if(!condition){throw new Error('math.gl assertion '.concat(message));}}var RADIANS_TO_DEGREES=1/Math.PI*180;var DEGREES_TO_RADIANS=1/180*Math.PI;var config$1={};config$1.EPSILON=1e-12;config$1.debug=false;config$1.precision=4;config$1.printTypes=false;config$1.printDegrees=false;config$1.printRowMajor=true;function round(value){return Math.round(value/config$1.EPSILON)*config$1.EPSILON;}function formatValue(value){var _ref5=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},_ref5$precision=_ref5.precision,precision=_ref5$precision===void 0?config$1.precision||4:_ref5$precision;value=round(value);return ''.concat(parseFloat(value.toPrecision(precision)));}function isArray$2(value){return Array.isArray(value)||ArrayBuffer.isView(value)&&!(value instanceof DataView);}function duplicateArray(array){return array.clone?array.clone():new Array(array.length);}function map$1(value,func,result){if(isArray$2(value)){result=result||duplicateArray(value);for(var _i7=0;_i7<result.length&&_i7<value.length;++_i7){result[_i7]=func(value[_i7],_i7,result);}return result;}return func(value);}function toRadians(degrees){return radians(degrees);}function toDegrees(radians){return degrees(radians);}function radians(degrees,result){return map$1(degrees,function(degrees){return degrees*DEGREES_TO_RADIANS;},result);}function degrees(radians,result){return map$1(radians,function(radians){return radians*RADIANS_TO_DEGREES;},result);}function clamp(value,min,max){return map$1(value,function(value){return Math.max(min,Math.min(max,value));});}function _equals(a,b,epsilon){var oldEpsilon=config$1.EPSILON;if(epsilon){config$1.EPSILON=epsilon;}try{if(a===b){return true;}if(isArray$2(a)&&isArray$2(b)){if(a.length!==b.length){return false;}for(var _i8=0;_i8<a.length;++_i8){if(!_equals(a[_i8],b[_i8])){return false;}}return true;}if(a&&a.equals){return a.equals(b);}if(b&&b.equals){return b.equals(a);}if(Number.isFinite(a)&&Number.isFinite(b)){return Math.abs(a-b)<=config$1.EPSILON*Math.max(1.0,Math.abs(a),Math.abs(b));}return false;}finally{config$1.EPSILON=oldEpsilon;}}function _extendableBuiltin(cls){function ExtendableBuiltin(){var instance=Reflect.construct(cls,Array.from(arguments));Object.setPrototypeOf(instance,Object.getPrototypeOf(this));return instance;}ExtendableBuiltin.prototype=Object.create(cls.prototype,{constructor:{value:cls,enumerable:false,writable:true,configurable:true}});if(Object.setPrototypeOf){Object.setPrototypeOf(ExtendableBuiltin,cls);}else {ExtendableBuiltin.__proto__=cls;}return ExtendableBuiltin;}var MathArray=/*#__PURE__*/function(_extendableBuiltin2){_inherits(MathArray,_extendableBuiltin2);var _super=_createSuper$E(MathArray);function MathArray(){_classCallCheck(this,MathArray);return _super.apply(this,arguments);}_createClass(MathArray,[{key:"ELEMENTS",get:function get(){assert$4(false);return 0;}},{key:"clone",value:function clone(){return new this.constructor().copy(this);}},{key:"from",value:function from(arrayOrObject){return Array.isArray(arrayOrObject)?this.copy(arrayOrObject):this.fromObject(arrayOrObject);}},{key:"fromArray",value:function fromArray(array){var offset=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;for(var _i9=0;_i9<this.ELEMENTS;++_i9){this[_i9]=array[_i9+offset];}return this.check();}},{key:"to",value:function to(arrayOrObject){if(arrayOrObject===this){return this;}return isArray$2(arrayOrObject)?this.toArray(arrayOrObject):this.toObject(arrayOrObject);}},{key:"toTarget",value:function toTarget(target){return target?this.to(target):this;}},{key:"toArray",value:function toArray(){var array=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];var offset=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;for(var _i10=0;_i10<this.ELEMENTS;++_i10){array[offset+_i10]=this[_i10];}return array;}},{key:"toFloat32Array",value:function toFloat32Array(){return new Float32Array(this);}},{key:"toString",value:function toString(){return this.formatString(config$1);}},{key:"formatString",value:function formatString(opts){var string='';for(var _i11=0;_i11<this.ELEMENTS;++_i11){string+=(_i11>0?', ':'')+formatValue(this[_i11],opts);}return ''.concat(opts.printTypes?this.constructor.name:'','[').concat(string,']');}},{key:"equals",value:function equals(array){if(!array||this.length!==array.length){return false;}for(var _i12=0;_i12<this.ELEMENTS;++_i12){if(!_equals(this[_i12],array[_i12])){return false;}}return true;}},{key:"exactEquals",value:function exactEquals(array){if(!array||this.length!==array.length){return false;}for(var _i13=0;_i13<this.ELEMENTS;++_i13){if(this[_i13]!==array[_i13]){return false;}}return true;}},{key:"negate",value:function negate(){for(var _i14=0;_i14<this.ELEMENTS;++_i14){this[_i14]=-this[_i14];}return this.check();}},{key:"lerp",value:function lerp(a,b,t){if(t===undefined){t=b;b=a;a=this;}for(var _i15=0;_i15<this.ELEMENTS;++_i15){var ai=a[_i15];this[_i15]=ai+t*(b[_i15]-ai);}return this.check();}},{key:"min",value:function min(vector){for(var _i16=0;_i16<this.ELEMENTS;++_i16){this[_i16]=Math.min(vector[_i16],this[_i16]);}return this.check();}},{key:"max",value:function max(vector){for(var _i17=0;_i17<this.ELEMENTS;++_i17){this[_i17]=Math.max(vector[_i17],this[_i17]);}return this.check();}},{key:"clamp",value:function clamp(minVector,maxVector){for(var _i18=0;_i18<this.ELEMENTS;++_i18){this[_i18]=Math.min(Math.max(this[_i18],minVector[_i18]),maxVector[_i18]);}return this.check();}},{key:"add",value:function add(){for(var _len7=arguments.length,vectors=new Array(_len7),_key7=0;_key7<_len7;_key7++){vectors[_key7]=arguments[_key7];}for(var _i19=0,_vectors=vectors;_i19<_vectors.length;_i19++){var vector=_vectors[_i19];for(var _i20=0;_i20<this.ELEMENTS;++_i20){this[_i20]+=vector[_i20];}}return this.check();}},{key:"subtract",value:function subtract(){for(var _len8=arguments.length,vectors=new Array(_len8),_key8=0;_key8<_len8;_key8++){vectors[_key8]=arguments[_key8];}for(var _i21=0,_vectors2=vectors;_i21<_vectors2.length;_i21++){var vector=_vectors2[_i21];for(var _i22=0;_i22<this.ELEMENTS;++_i22){this[_i22]-=vector[_i22];}}return this.check();}},{key:"scale",value:function scale(_scale){if(Array.isArray(_scale)){return this.multiply(_scale);}for(var _i23=0;_i23<this.ELEMENTS;++_i23){this[_i23]*=_scale;}return this.check();}},{key:"sub",value:function sub(a){return this.subtract(a);}},{key:"setScalar",value:function setScalar(a){for(var _i24=0;_i24<this.ELEMENTS;++_i24){this[_i24]=a;}return this.check();}},{key:"addScalar",value:function addScalar(a){for(var _i25=0;_i25<this.ELEMENTS;++_i25){this[_i25]+=a;}return this.check();}},{key:"subScalar",value:function subScalar(a){return this.addScalar(-a);}},{key:"multiplyScalar",value:function multiplyScalar(scalar){for(var _i26=0;_i26<this.ELEMENTS;++_i26){this[_i26]*=scalar;}return this.check();}},{key:"divideScalar",value:function divideScalar(a){return this.scale(1/a);}},{key:"clampScalar",value:function clampScalar(min,max){for(var _i27=0;_i27<this.ELEMENTS;++_i27){this[_i27]=Math.min(Math.max(this[_i27],min),max);}return this.check();}},{key:"multiplyByScalar",value:function multiplyByScalar(scalar){return this.scale(scalar);}},{key:"elements",get:function get(){return this;}},{key:"check",value:function check(){if(config$1.debug&&!this.validate()){throw new Error('math.gl: '.concat(this.constructor.name," some fields set to invalid numbers'"));}return this;}},{key:"validate",value:function validate(){var valid=this.length===this.ELEMENTS;for(var _i28=0;_i28<this.ELEMENTS;++_i28){valid=valid&&Number.isFinite(this[_i28]);}return valid;}}]);return MathArray;}(_extendableBuiltin(Array));function validateVector(v,length){if(v.length!==length){return false;}for(var _i29=0;_i29<v.length;++_i29){if(!Number.isFinite(v[_i29])){return false;}}return true;}function checkNumber(value){if(!Number.isFinite(value)){throw new Error('Invalid number '.concat(value));}return value;}function checkVector(v,length){var callerName=arguments.length>2&&arguments[2]!==undefined?arguments[2]:'';if(config$1.debug&&!validateVector(v,length)){throw new Error('math.gl: '.concat(callerName," some fields set to invalid numbers'"));}return v;}var map={};function deprecated(method,version){if(!map[method]){map[method]=true;console.warn(''.concat(method,' has been removed in version ').concat(version,', see upgrade guide for more information'));}}var Vector=/*#__PURE__*/function(_MathArray){_inherits(Vector,_MathArray);var _super2=_createSuper$E(Vector);function Vector(){_classCallCheck(this,Vector);return _super2.apply(this,arguments);}_createClass(Vector,[{key:"ELEMENTS",get:function get(){assert$4(false);return 0;}},{key:"copy",value:function copy(vector){assert$4(false);return this;}},{key:"x",get:function get(){return this[0];},set:function set(value){this[0]=checkNumber(value);}},{key:"y",get:function get(){return this[1];},set:function set(value){this[1]=checkNumber(value);}},{key:"len",value:function len(){return Math.sqrt(this.lengthSquared());}},{key:"magnitude",value:function magnitude(){return this.len();}},{key:"lengthSquared",value:function lengthSquared(){var length=0;for(var _i30=0;_i30<this.ELEMENTS;++_i30){length+=this[_i30]*this[_i30];}return length;}},{key:"magnitudeSquared",value:function magnitudeSquared(){return this.lengthSquared();}},{key:"distance",value:function distance(mathArray){return Math.sqrt(this.distanceSquared(mathArray));}},{key:"distanceSquared",value:function distanceSquared(mathArray){var length=0;for(var _i31=0;_i31<this.ELEMENTS;++_i31){var dist=this[_i31]-mathArray[_i31];length+=dist*dist;}return checkNumber(length);}},{key:"dot",value:function dot(mathArray){var product=0;for(var _i32=0;_i32<this.ELEMENTS;++_i32){product+=this[_i32]*mathArray[_i32];}return checkNumber(product);}},{key:"normalize",value:function normalize(){var length=this.magnitude();if(length!==0){for(var _i33=0;_i33<this.ELEMENTS;++_i33){this[_i33]/=length;}}return this.check();}},{key:"multiply",value:function multiply(){for(var _len9=arguments.length,vectors=new Array(_len9),_key9=0;_key9<_len9;_key9++){vectors[_key9]=arguments[_key9];}for(var _i34=0,_vectors3=vectors;_i34<_vectors3.length;_i34++){var vector=_vectors3[_i34];for(var _i35=0;_i35<this.ELEMENTS;++_i35){this[_i35]*=vector[_i35];}}return this.check();}},{key:"divide",value:function divide(){for(var _len10=arguments.length,vectors=new Array(_len10),_key10=0;_key10<_len10;_key10++){vectors[_key10]=arguments[_key10];}for(var _i36=0,_vectors4=vectors;_i36<_vectors4.length;_i36++){var vector=_vectors4[_i36];for(var _i37=0;_i37<this.ELEMENTS;++_i37){this[_i37]/=vector[_i37];}}return this.check();}},{key:"lengthSq",value:function lengthSq(){return this.lengthSquared();}},{key:"distanceTo",value:function distanceTo(vector){return this.distance(vector);}},{key:"distanceToSquared",value:function distanceToSquared(vector){return this.distanceSquared(vector);}},{key:"getComponent",value:function getComponent(i){assert$4(i>=0&&i<this.ELEMENTS,'index is out of range');return checkNumber(this[i]);}},{key:"setComponent",value:function setComponent(i,value){assert$4(i>=0&&i<this.ELEMENTS,'index is out of range');this[i]=value;return this.check();}},{key:"addVectors",value:function addVectors(a,b){return this.copy(a).add(b);}},{key:"subVectors",value:function subVectors(a,b){return this.copy(a).subtract(b);}},{key:"multiplyVectors",value:function multiplyVectors(a,b){return this.copy(a).multiply(b);}},{key:"addScaledVector",value:function addScaledVector(a,b){return this.add(new this.constructor(a).multiplyScalar(b));}}]);return Vector;}(MathArray);/**
  42172. * Common utilities
  42173. * @module glMatrix
  42174. */ // Configuration Constants
  42175. var EPSILON=0.000001;var ARRAY_TYPE=typeof Float32Array!=='undefined'?Float32Array:Array;if(!Math.hypot)Math.hypot=function(){var y=0,i=arguments.length;while(i--){y+=arguments[i]*arguments[i];}return Math.sqrt(y);};/**
  42176. * 2 Dimensional Vector
  42177. * @module vec2
  42178. */ /**
  42179. * Creates a new, empty vec2
  42180. *
  42181. * @returns {vec2} a new 2D vector
  42182. */function create$4(){var out=new ARRAY_TYPE(2);if(ARRAY_TYPE!=Float32Array){out[0]=0;out[1]=0;}return out;}/**
  42183. * Transforms the vec2 with a mat2
  42184. *
  42185. * @param {vec2} out the receiving vector
  42186. * @param {ReadonlyVec2} a the vector to transform
  42187. * @param {ReadonlyMat2} m matrix to transform with
  42188. * @returns {vec2} out
  42189. */function transformMat2(out,a,m){var x=a[0],y=a[1];out[0]=m[0]*x+m[2]*y;out[1]=m[1]*x+m[3]*y;return out;}/**
  42190. * Transforms the vec2 with a mat2d
  42191. *
  42192. * @param {vec2} out the receiving vector
  42193. * @param {ReadonlyVec2} a the vector to transform
  42194. * @param {ReadonlyMat2d} m matrix to transform with
  42195. * @returns {vec2} out
  42196. */function transformMat2d(out,a,m){var x=a[0],y=a[1];out[0]=m[0]*x+m[2]*y+m[4];out[1]=m[1]*x+m[3]*y+m[5];return out;}/**
  42197. * Transforms the vec2 with a mat3
  42198. * 3rd vector component is implicitly '1'
  42199. *
  42200. * @param {vec2} out the receiving vector
  42201. * @param {ReadonlyVec2} a the vector to transform
  42202. * @param {ReadonlyMat3} m matrix to transform with
  42203. * @returns {vec2} out
  42204. */function transformMat3$1(out,a,m){var x=a[0],y=a[1];out[0]=m[0]*x+m[3]*y+m[6];out[1]=m[1]*x+m[4]*y+m[7];return out;}/**
  42205. * Transforms the vec2 with a mat4
  42206. * 3rd vector component is implicitly '0'
  42207. * 4th vector component is implicitly '1'
  42208. *
  42209. * @param {vec2} out the receiving vector
  42210. * @param {ReadonlyVec2} a the vector to transform
  42211. * @param {ReadonlyMat4} m matrix to transform with
  42212. * @returns {vec2} out
  42213. */function transformMat4$2(out,a,m){var x=a[0];var y=a[1];out[0]=m[0]*x+m[4]*y+m[12];out[1]=m[1]*x+m[5]*y+m[13];return out;}(function(){var vec=create$4();return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=2;}if(!offset){offset=0;}if(count){l=Math.min(count*stride+offset,a.length);}else {l=a.length;}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];}return a;};})();function vec2_transformMat4AsVector(out,a,m){var x=a[0];var y=a[1];var w=m[3]*x+m[7]*y||1.0;out[0]=(m[0]*x+m[4]*y)/w;out[1]=(m[1]*x+m[5]*y)/w;return out;}function vec3_transformMat4AsVector(out,a,m){var x=a[0];var y=a[1];var z=a[2];var w=m[3]*x+m[7]*y+m[11]*z||1.0;out[0]=(m[0]*x+m[4]*y+m[8]*z)/w;out[1]=(m[1]*x+m[5]*y+m[9]*z)/w;out[2]=(m[2]*x+m[6]*y+m[10]*z)/w;return out;}function vec3_transformMat2(out,a,m){var x=a[0];var y=a[1];out[0]=m[0]*x+m[2]*y;out[1]=m[1]*x+m[3]*y;out[2]=a[2];return out;}function vec4_transformMat3(out,a,m){var x=a[0];var y=a[1];var z=a[2];out[0]=m[0]*x+m[3]*y+m[6]*z;out[1]=m[1]*x+m[4]*y+m[7]*z;out[2]=m[2]*x+m[5]*y+m[8]*z;out[3]=a[3];return out;}var Vector2=/*#__PURE__*/function(_Vector){_inherits(Vector2,_Vector);var _super3=_createSuper$E(Vector2);function Vector2(){var _this7;var x=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0;var y=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;_classCallCheck(this,Vector2);_this7=_super3.call(this,2);if(isArray$2(x)&&arguments.length===1){_this7.copy(x);}else {if(config$1.debug){checkNumber(x);checkNumber(y);}_this7[0]=x;_this7[1]=y;}return _this7;}_createClass(Vector2,[{key:"set",value:function set(x,y){this[0]=x;this[1]=y;return this.check();}},{key:"copy",value:function copy(array){this[0]=array[0];this[1]=array[1];return this.check();}},{key:"fromObject",value:function fromObject(object){if(config$1.debug){checkNumber(object.x);checkNumber(object.y);}this[0]=object.x;this[1]=object.y;return this.check();}},{key:"toObject",value:function toObject(object){object.x=this[0];object.y=this[1];return object;}},{key:"ELEMENTS",get:function get(){return 2;}},{key:"horizontalAngle",value:function horizontalAngle(){return Math.atan2(this.y,this.x);}},{key:"verticalAngle",value:function verticalAngle(){return Math.atan2(this.x,this.y);}},{key:"transform",value:function transform(matrix4){return this.transformAsPoint(matrix4);}},{key:"transformAsPoint",value:function transformAsPoint(matrix4){transformMat4$2(this,this,matrix4);return this.check();}},{key:"transformAsVector",value:function transformAsVector(matrix4){vec2_transformMat4AsVector(this,this,matrix4);return this.check();}},{key:"transformByMatrix3",value:function transformByMatrix3(matrix3){transformMat3$1(this,this,matrix3);return this.check();}},{key:"transformByMatrix2x3",value:function transformByMatrix2x3(matrix2x3){transformMat2d(this,this,matrix2x3);return this.check();}},{key:"transformByMatrix2",value:function transformByMatrix2(matrix2){transformMat2(this,this,matrix2);return this.check();}}]);return Vector2;}(Vector);/**
  42214. * 3 Dimensional Vector
  42215. * @module vec3
  42216. */ /**
  42217. * Creates a new, empty vec3
  42218. *
  42219. * @returns {vec3} a new 3D vector
  42220. */function create$3(){var out=new ARRAY_TYPE(3);if(ARRAY_TYPE!=Float32Array){out[0]=0;out[1]=0;out[2]=0;}return out;}/**
  42221. * Calculates the length of a vec3
  42222. *
  42223. * @param {ReadonlyVec3} a vector to calculate length of
  42224. * @returns {Number} length of a
  42225. */function length$2(a){var x=a[0];var y=a[1];var z=a[2];return Math.hypot(x,y,z);}/**
  42226. * Creates a new vec3 initialized with the given values
  42227. *
  42228. * @param {Number} x X component
  42229. * @param {Number} y Y component
  42230. * @param {Number} z Z component
  42231. * @returns {vec3} a new 3D vector
  42232. */function fromValues(x,y,z){var out=new ARRAY_TYPE(3);out[0]=x;out[1]=y;out[2]=z;return out;}/**
  42233. * Normalize a vec3
  42234. *
  42235. * @param {vec3} out the receiving vector
  42236. * @param {ReadonlyVec3} a vector to normalize
  42237. * @returns {vec3} out
  42238. */function normalize$2(out,a){var x=a[0];var y=a[1];var z=a[2];var len=x*x+y*y+z*z;if(len>0){//TODO: evaluate use of glm_invsqrt here?
  42239. len=1/Math.sqrt(len);}out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;return out;}/**
  42240. * Calculates the dot product of two vec3's
  42241. *
  42242. * @param {ReadonlyVec3} a the first operand
  42243. * @param {ReadonlyVec3} b the second operand
  42244. * @returns {Number} dot product of a and b
  42245. */function dot$2(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];}/**
  42246. * Computes the cross product of two vec3's
  42247. *
  42248. * @param {vec3} out the receiving vector
  42249. * @param {ReadonlyVec3} a the first operand
  42250. * @param {ReadonlyVec3} b the second operand
  42251. * @returns {vec3} out
  42252. */function _cross(out,a,b){var ax=a[0],ay=a[1],az=a[2];var bx=b[0],by=b[1],bz=b[2];out[0]=ay*bz-az*by;out[1]=az*bx-ax*bz;out[2]=ax*by-ay*bx;return out;}/**
  42253. * Transforms the vec3 with a mat4.
  42254. * 4th vector component is implicitly '1'
  42255. *
  42256. * @param {vec3} out the receiving vector
  42257. * @param {ReadonlyVec3} a the vector to transform
  42258. * @param {ReadonlyMat4} m matrix to transform with
  42259. * @returns {vec3} out
  42260. */function transformMat4$1(out,a,m){var x=a[0],y=a[1],z=a[2];var w=m[3]*x+m[7]*y+m[11]*z+m[15];w=w||1.0;out[0]=(m[0]*x+m[4]*y+m[8]*z+m[12])/w;out[1]=(m[1]*x+m[5]*y+m[9]*z+m[13])/w;out[2]=(m[2]*x+m[6]*y+m[10]*z+m[14])/w;return out;}/**
  42261. * Transforms the vec3 with a mat3.
  42262. *
  42263. * @param {vec3} out the receiving vector
  42264. * @param {ReadonlyVec3} a the vector to transform
  42265. * @param {ReadonlyMat3} m the 3x3 matrix to transform with
  42266. * @returns {vec3} out
  42267. */function transformMat3(out,a,m){var x=a[0],y=a[1],z=a[2];out[0]=x*m[0]+y*m[3]+z*m[6];out[1]=x*m[1]+y*m[4]+z*m[7];out[2]=x*m[2]+y*m[5]+z*m[8];return out;}/**
  42268. * Transforms the vec3 with a quat
  42269. * Can also be used for dual quaternions. (Multiply it with the real part)
  42270. *
  42271. * @param {vec3} out the receiving vector
  42272. * @param {ReadonlyVec3} a the vector to transform
  42273. * @param {ReadonlyQuat} q quaternion to transform with
  42274. * @returns {vec3} out
  42275. */function transformQuat$1(out,a,q){// benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed
  42276. var qx=q[0],qy=q[1],qz=q[2],qw=q[3];var x=a[0],y=a[1],z=a[2];// var qvec = [qx, qy, qz];
  42277. // var uv = vec3.cross([], qvec, a);
  42278. var uvx=qy*z-qz*y,uvy=qz*x-qx*z,uvz=qx*y-qy*x;// var uuv = vec3.cross([], qvec, uv);
  42279. var uuvx=qy*uvz-qz*uvy,uuvy=qz*uvx-qx*uvz,uuvz=qx*uvy-qy*uvx;// vec3.scale(uv, uv, 2 * w);
  42280. var w2=qw*2;uvx*=w2;uvy*=w2;uvz*=w2;// vec3.scale(uuv, uuv, 2);
  42281. uuvx*=2;uuvy*=2;uuvz*=2;// return vec3.add(out, a, vec3.add(out, uv, uuv));
  42282. out[0]=x+uvx+uuvx;out[1]=y+uvy+uuvy;out[2]=z+uvz+uuvz;return out;}/**
  42283. * Rotate a 3D vector around the x-axis
  42284. * @param {vec3} out The receiving vec3
  42285. * @param {ReadonlyVec3} a The vec3 point to rotate
  42286. * @param {ReadonlyVec3} b The origin of the rotation
  42287. * @param {Number} rad The angle of rotation in radians
  42288. * @returns {vec3} out
  42289. */function rotateX$2(out,a,b,rad){var p=[],r=[];//Translate point to the origin
  42290. p[0]=a[0]-b[0];p[1]=a[1]-b[1];p[2]=a[2]-b[2];//perform rotation
  42291. r[0]=p[0];r[1]=p[1]*Math.cos(rad)-p[2]*Math.sin(rad);r[2]=p[1]*Math.sin(rad)+p[2]*Math.cos(rad);//translate to correct position
  42292. out[0]=r[0]+b[0];out[1]=r[1]+b[1];out[2]=r[2]+b[2];return out;}/**
  42293. * Rotate a 3D vector around the y-axis
  42294. * @param {vec3} out The receiving vec3
  42295. * @param {ReadonlyVec3} a The vec3 point to rotate
  42296. * @param {ReadonlyVec3} b The origin of the rotation
  42297. * @param {Number} rad The angle of rotation in radians
  42298. * @returns {vec3} out
  42299. */function rotateY$2(out,a,b,rad){var p=[],r=[];//Translate point to the origin
  42300. p[0]=a[0]-b[0];p[1]=a[1]-b[1];p[2]=a[2]-b[2];//perform rotation
  42301. r[0]=p[2]*Math.sin(rad)+p[0]*Math.cos(rad);r[1]=p[1];r[2]=p[2]*Math.cos(rad)-p[0]*Math.sin(rad);//translate to correct position
  42302. out[0]=r[0]+b[0];out[1]=r[1]+b[1];out[2]=r[2]+b[2];return out;}/**
  42303. * Rotate a 3D vector around the z-axis
  42304. * @param {vec3} out The receiving vec3
  42305. * @param {ReadonlyVec3} a The vec3 point to rotate
  42306. * @param {ReadonlyVec3} b The origin of the rotation
  42307. * @param {Number} rad The angle of rotation in radians
  42308. * @returns {vec3} out
  42309. */function rotateZ$2(out,a,b,rad){var p=[],r=[];//Translate point to the origin
  42310. p[0]=a[0]-b[0];p[1]=a[1]-b[1];p[2]=a[2]-b[2];//perform rotation
  42311. r[0]=p[0]*Math.cos(rad)-p[1]*Math.sin(rad);r[1]=p[0]*Math.sin(rad)+p[1]*Math.cos(rad);r[2]=p[2];//translate to correct position
  42312. out[0]=r[0]+b[0];out[1]=r[1]+b[1];out[2]=r[2]+b[2];return out;}/**
  42313. * Get the angle between two 3D vectors
  42314. * @param {ReadonlyVec3} a The first operand
  42315. * @param {ReadonlyVec3} b The second operand
  42316. * @returns {Number} The angle in radians
  42317. */function _angle(a,b){var ax=a[0],ay=a[1],az=a[2],bx=b[0],by=b[1],bz=b[2],mag1=Math.sqrt(ax*ax+ay*ay+az*az),mag2=Math.sqrt(bx*bx+by*by+bz*bz),mag=mag1*mag2,cosine=mag&&dot$2(a,b)/mag;return Math.acos(Math.min(Math.max(cosine,-1),1));}/**
  42318. * Alias for {@link vec3.length}
  42319. * @function
  42320. */var len=length$2/**
  42321. * Perform some operation over an array of vec3s.
  42322. *
  42323. * @param {Array} a the array of vectors to iterate over
  42324. * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed
  42325. * @param {Number} offset Number of elements to skip at the beginning of the array
  42326. * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array
  42327. * @param {Function} fn Function to call for each vector in the array
  42328. * @param {Object} [arg] additional argument to pass to fn
  42329. * @returns {Array} a
  42330. * @function
  42331. */;(function(){var vec=create$3();return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=3;}if(!offset){offset=0;}if(count){l=Math.min(count*stride+offset,a.length);}else {l=a.length;}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2];}return a;};})();var ORIGIN=[0,0,0];var constants$2={};var Vector3$1=/*#__PURE__*/function(_Vector2){_inherits(Vector3,_Vector2);var _super4=_createSuper$E(Vector3);function Vector3(){var _this8;var x=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0;var y=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var z=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;_classCallCheck(this,Vector3);_this8=_super4.call(this,-0,-0,-0);if(arguments.length===1&&isArray$2(x)){_this8.copy(x);}else {if(config$1.debug){checkNumber(x);checkNumber(y);checkNumber(z);}_this8[0]=x;_this8[1]=y;_this8[2]=z;}return _this8;}_createClass(Vector3,[{key:"set",value:function set(x,y,z){this[0]=x;this[1]=y;this[2]=z;return this.check();}},{key:"copy",value:function copy(array){this[0]=array[0];this[1]=array[1];this[2]=array[2];return this.check();}},{key:"fromObject",value:function fromObject(object){if(config$1.debug){checkNumber(object.x);checkNumber(object.y);checkNumber(object.z);}this[0]=object.x;this[1]=object.y;this[2]=object.z;return this.check();}},{key:"toObject",value:function toObject(object){object.x=this[0];object.y=this[1];object.z=this[2];return object;}},{key:"ELEMENTS",get:function get(){return 3;}},{key:"z",get:function get(){return this[2];},set:function set(value){this[2]=checkNumber(value);}},{key:"angle",value:function angle(vector){return _angle(this,vector);}},{key:"cross",value:function cross(vector){_cross(this,this,vector);return this.check();}},{key:"rotateX",value:function rotateX(_ref6){var radians=_ref6.radians,_ref6$origin=_ref6.origin,origin=_ref6$origin===void 0?ORIGIN:_ref6$origin;rotateX$2(this,this,origin,radians);return this.check();}},{key:"rotateY",value:function rotateY(_ref7){var radians=_ref7.radians,_ref7$origin=_ref7.origin,origin=_ref7$origin===void 0?ORIGIN:_ref7$origin;rotateY$2(this,this,origin,radians);return this.check();}},{key:"rotateZ",value:function rotateZ(_ref8){var radians=_ref8.radians,_ref8$origin=_ref8.origin,origin=_ref8$origin===void 0?ORIGIN:_ref8$origin;rotateZ$2(this,this,origin,radians);return this.check();}},{key:"transform",value:function transform(matrix4){return this.transformAsPoint(matrix4);}},{key:"transformAsPoint",value:function transformAsPoint(matrix4){transformMat4$1(this,this,matrix4);return this.check();}},{key:"transformAsVector",value:function transformAsVector(matrix4){vec3_transformMat4AsVector(this,this,matrix4);return this.check();}},{key:"transformByMatrix3",value:function transformByMatrix3(matrix3){transformMat3(this,this,matrix3);return this.check();}},{key:"transformByMatrix2",value:function transformByMatrix2(matrix2){vec3_transformMat2(this,this,matrix2);return this.check();}},{key:"transformByQuaternion",value:function transformByQuaternion(quaternion){transformQuat$1(this,this,quaternion);return this.check();}}],[{key:"ZERO",get:function get(){return constants$2.ZERO=constants$2.ZERO||Object.freeze(new Vector3(0,0,0,0));}}]);return Vector3;}(Vector);var Matrix=/*#__PURE__*/function(_MathArray2){_inherits(Matrix,_MathArray2);var _super5=_createSuper$E(Matrix);function Matrix(){_classCallCheck(this,Matrix);return _super5.apply(this,arguments);}_createClass(Matrix,[{key:"ELEMENTS",get:function get(){assert$4(false);return 0;}},{key:"RANK",get:function get(){assert$4(false);return 0;}},{key:"toString",value:function toString(){var string='[';if(config$1.printRowMajor){string+='row-major:';for(var row=0;row<this.RANK;++row){for(var col=0;col<this.RANK;++col){string+=' '.concat(this[col*this.RANK+row]);}}}else {string+='column-major:';for(var _i38=0;_i38<this.ELEMENTS;++_i38){string+=' '.concat(this[_i38]);}}string+=']';return string;}},{key:"getElementIndex",value:function getElementIndex(row,col){return col*this.RANK+row;}},{key:"getElement",value:function getElement(row,col){return this[col*this.RANK+row];}},{key:"setElement",value:function setElement(row,col,value){this[col*this.RANK+row]=checkNumber(value);return this;}},{key:"getColumn",value:function getColumn(columnIndex){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:new Array(this.RANK).fill(-0);var firstIndex=columnIndex*this.RANK;for(var _i39=0;_i39<this.RANK;++_i39){result[_i39]=this[firstIndex+_i39];}return result;}},{key:"setColumn",value:function setColumn(columnIndex,columnVector){var firstIndex=columnIndex*this.RANK;for(var _i40=0;_i40<this.RANK;++_i40){this[firstIndex+_i40]=columnVector[_i40];}return this;}}]);return Matrix;}(MathArray);/**
  42332. * 3x3 Matrix
  42333. * @module mat3
  42334. */ /**
  42335. * Creates a new identity mat3
  42336. *
  42337. * @returns {mat3} a new 3x3 matrix
  42338. */function create$2(){var out=new ARRAY_TYPE(9);if(ARRAY_TYPE!=Float32Array){out[1]=0;out[2]=0;out[3]=0;out[5]=0;out[6]=0;out[7]=0;}out[0]=1;out[4]=1;out[8]=1;return out;}/**
  42339. * Transpose the values of a mat3
  42340. *
  42341. * @param {mat3} out the receiving matrix
  42342. * @param {ReadonlyMat3} a the source matrix
  42343. * @returns {mat3} out
  42344. */function transpose$1(out,a){// If we are transposing ourselves we can skip a few steps but have to cache some values
  42345. if(out===a){var a01=a[1],a02=a[2],a12=a[5];out[1]=a[3];out[2]=a[6];out[3]=a01;out[5]=a[7];out[6]=a02;out[7]=a12;}else {out[0]=a[0];out[1]=a[3];out[2]=a[6];out[3]=a[1];out[4]=a[4];out[5]=a[7];out[6]=a[2];out[7]=a[5];out[8]=a[8];}return out;}/**
  42346. * Inverts a mat3
  42347. *
  42348. * @param {mat3} out the receiving matrix
  42349. * @param {ReadonlyMat3} a the source matrix
  42350. * @returns {mat3} out
  42351. */function invert$2(out,a){var a00=a[0],a01=a[1],a02=a[2];var a10=a[3],a11=a[4],a12=a[5];var a20=a[6],a21=a[7],a22=a[8];var b01=a22*a11-a12*a21;var b11=-a22*a10+a12*a20;var b21=a21*a10-a11*a20;// Calculate the determinant
  42352. var det=a00*b01+a01*b11+a02*b21;if(!det){return null;}det=1.0/det;out[0]=b01*det;out[1]=(-a22*a01+a02*a21)*det;out[2]=(a12*a01-a02*a11)*det;out[3]=b11*det;out[4]=(a22*a00-a02*a20)*det;out[5]=(-a12*a00+a02*a10)*det;out[6]=b21*det;out[7]=(-a21*a00+a01*a20)*det;out[8]=(a11*a00-a01*a10)*det;return out;}/**
  42353. * Calculates the determinant of a mat3
  42354. *
  42355. * @param {ReadonlyMat3} a the source matrix
  42356. * @returns {Number} determinant of a
  42357. */function determinant$1(a){var a00=a[0],a01=a[1],a02=a[2];var a10=a[3],a11=a[4],a12=a[5];var a20=a[6],a21=a[7],a22=a[8];return a00*(a22*a11-a12*a21)+a01*(-a22*a10+a12*a20)+a02*(a21*a10-a11*a20);}/**
  42358. * Multiplies two mat3's
  42359. *
  42360. * @param {mat3} out the receiving matrix
  42361. * @param {ReadonlyMat3} a the first operand
  42362. * @param {ReadonlyMat3} b the second operand
  42363. * @returns {mat3} out
  42364. */function multiply$2(out,a,b){var a00=a[0],a01=a[1],a02=a[2];var a10=a[3],a11=a[4],a12=a[5];var a20=a[6],a21=a[7],a22=a[8];var b00=b[0],b01=b[1],b02=b[2];var b10=b[3],b11=b[4],b12=b[5];var b20=b[6],b21=b[7],b22=b[8];out[0]=b00*a00+b01*a10+b02*a20;out[1]=b00*a01+b01*a11+b02*a21;out[2]=b00*a02+b01*a12+b02*a22;out[3]=b10*a00+b11*a10+b12*a20;out[4]=b10*a01+b11*a11+b12*a21;out[5]=b10*a02+b11*a12+b12*a22;out[6]=b20*a00+b21*a10+b22*a20;out[7]=b20*a01+b21*a11+b22*a21;out[8]=b20*a02+b21*a12+b22*a22;return out;}/**
  42365. * Translate a mat3 by the given vector
  42366. *
  42367. * @param {mat3} out the receiving matrix
  42368. * @param {ReadonlyMat3} a the matrix to translate
  42369. * @param {ReadonlyVec2} v vector to translate by
  42370. * @returns {mat3} out
  42371. */function translate$1(out,a,v){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],x=v[0],y=v[1];out[0]=a00;out[1]=a01;out[2]=a02;out[3]=a10;out[4]=a11;out[5]=a12;out[6]=x*a00+y*a10+a20;out[7]=x*a01+y*a11+a21;out[8]=x*a02+y*a12+a22;return out;}/**
  42372. * Rotates a mat3 by the given angle
  42373. *
  42374. * @param {mat3} out the receiving matrix
  42375. * @param {ReadonlyMat3} a the matrix to rotate
  42376. * @param {Number} rad the angle to rotate the matrix by
  42377. * @returns {mat3} out
  42378. */function rotate$1(out,a,rad){var a00=a[0],a01=a[1],a02=a[2],a10=a[3],a11=a[4],a12=a[5],a20=a[6],a21=a[7],a22=a[8],s=Math.sin(rad),c=Math.cos(rad);out[0]=c*a00+s*a10;out[1]=c*a01+s*a11;out[2]=c*a02+s*a12;out[3]=c*a10-s*a00;out[4]=c*a11-s*a01;out[5]=c*a12-s*a02;out[6]=a20;out[7]=a21;out[8]=a22;return out;}/**
  42379. * Scales the mat3 by the dimensions in the given vec2
  42380. *
  42381. * @param {mat3} out the receiving matrix
  42382. * @param {ReadonlyMat3} a the matrix to rotate
  42383. * @param {ReadonlyVec2} v the vec2 to scale the matrix by
  42384. * @returns {mat3} out
  42385. **/function scale$3(out,a,v){var x=v[0],y=v[1];out[0]=x*a[0];out[1]=x*a[1];out[2]=x*a[2];out[3]=y*a[3];out[4]=y*a[4];out[5]=y*a[5];out[6]=a[6];out[7]=a[7];out[8]=a[8];return out;}/**
  42386. * Calculates a 3x3 matrix from the given quaternion
  42387. *
  42388. * @param {mat3} out mat3 receiving operation result
  42389. * @param {ReadonlyQuat} q Quaternion to create matrix from
  42390. *
  42391. * @returns {mat3} out
  42392. */function fromQuat$1(out,q){var x=q[0],y=q[1],z=q[2],w=q[3];var x2=x+x;var y2=y+y;var z2=z+z;var xx=x*x2;var yx=y*x2;var yy=y*y2;var zx=z*x2;var zy=z*y2;var zz=z*z2;var wx=w*x2;var wy=w*y2;var wz=w*z2;out[0]=1-yy-zz;out[3]=yx-wz;out[6]=zx+wy;out[1]=yx+wz;out[4]=1-xx-zz;out[7]=zy-wx;out[2]=zx-wy;out[5]=zy+wx;out[8]=1-xx-yy;return out;}var IDENTITY$1=Object.freeze([1,0,0,0,1,0,0,0,1]);var ZERO$1=Object.freeze([0,0,0,0,0,0,0,0,0]);var INDICES$1=Object.freeze({COL0ROW0:0,COL0ROW1:1,COL0ROW2:2,COL1ROW0:3,COL1ROW1:4,COL1ROW2:5,COL2ROW0:6,COL2ROW1:7,COL2ROW2:8});var constants$1={};var Matrix3=/*#__PURE__*/function(_Matrix){_inherits(Matrix3,_Matrix);var _super6=_createSuper$E(Matrix3);function Matrix3(array){var _this9;_classCallCheck(this,Matrix3);_this9=_super6.call(this,-0,-0,-0,-0,-0,-0,-0,-0,-0);if(arguments.length===1&&Array.isArray(array)){_this9.copy(array);}else {_this9.identity();}return _this9;}_createClass(Matrix3,[{key:"ELEMENTS",get:function get(){return 9;}},{key:"RANK",get:function get(){return 3;}},{key:"INDICES",get:function get(){return INDICES$1;}},{key:"copy",value:function copy(array){this[0]=array[0];this[1]=array[1];this[2]=array[2];this[3]=array[3];this[4]=array[4];this[5]=array[5];this[6]=array[6];this[7]=array[7];this[8]=array[8];return this.check();}},{key:"set",value:function set(m00,m10,m20,m01,m11,m21,m02,m12,m22){this[0]=m00;this[1]=m10;this[2]=m20;this[3]=m01;this[4]=m11;this[5]=m21;this[6]=m02;this[7]=m12;this[8]=m22;return this.check();}},{key:"setRowMajor",value:function setRowMajor(m00,m01,m02,m10,m11,m12,m20,m21,m22){this[0]=m00;this[1]=m10;this[2]=m20;this[3]=m01;this[4]=m11;this[5]=m21;this[6]=m02;this[7]=m12;this[8]=m22;return this.check();}},{key:"determinant",value:function determinant(){return determinant$1(this);}},{key:"identity",value:function identity(){return this.copy(IDENTITY$1);}},{key:"fromQuaternion",value:function fromQuaternion(q){fromQuat$1(this,q);return this.check();}},{key:"transpose",value:function transpose(){transpose$1(this,this);return this.check();}},{key:"invert",value:function invert(){invert$2(this,this);return this.check();}},{key:"multiplyLeft",value:function multiplyLeft(a){multiply$2(this,a,this);return this.check();}},{key:"multiplyRight",value:function multiplyRight(a){multiply$2(this,this,a);return this.check();}},{key:"rotate",value:function rotate(radians){rotate$1(this,this,radians);return this.check();}},{key:"scale",value:function scale(factor){if(Array.isArray(factor)){scale$3(this,this,factor);}else {scale$3(this,this,[factor,factor,factor]);}return this.check();}},{key:"translate",value:function translate(vec){translate$1(this,this,vec);return this.check();}},{key:"transform",value:function transform(vector,result){switch(vector.length){case 2:result=transformMat3$1(result||[-0,-0],vector,this);break;case 3:result=transformMat3(result||[-0,-0,-0],vector,this);break;case 4:result=vec4_transformMat3(result||[-0,-0,-0,-0],vector,this);break;default:throw new Error('Illegal vector');}checkVector(result,vector.length);return result;}},{key:"transformVector",value:function transformVector(vector,result){deprecated('Matrix3.transformVector');return this.transform(vector,result);}},{key:"transformVector2",value:function transformVector2(vector,result){deprecated('Matrix3.transformVector');return this.transform(vector,result);}},{key:"transformVector3",value:function transformVector3(vector,result){deprecated('Matrix3.transformVector');return this.transform(vector,result);}}],[{key:"IDENTITY",get:function get(){constants$1.IDENTITY=constants$1.IDENTITY||Object.freeze(new Matrix3(IDENTITY$1));return constants$1.IDENTITY;}},{key:"ZERO",get:function get(){constants$1.ZERO=constants$1.ZERO||Object.freeze(new Matrix3(ZERO$1));return constants$1.ZERO;}}]);return Matrix3;}(Matrix);/**
  42393. * Set a mat4 to the identity matrix
  42394. *
  42395. * @param {mat4} out the receiving matrix
  42396. * @returns {mat4} out
  42397. */function identity$1(out){out[0]=1;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=1;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=1;out[11]=0;out[12]=0;out[13]=0;out[14]=0;out[15]=1;return out;}/**
  42398. * Transpose the values of a mat4
  42399. *
  42400. * @param {mat4} out the receiving matrix
  42401. * @param {ReadonlyMat4} a the source matrix
  42402. * @returns {mat4} out
  42403. */function _transpose(out,a){// If we are transposing ourselves we can skip a few steps but have to cache some values
  42404. if(out===a){var a01=a[1],a02=a[2],a03=a[3];var a12=a[6],a13=a[7];var a23=a[11];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a01;out[6]=a[9];out[7]=a[13];out[8]=a02;out[9]=a12;out[11]=a[14];out[12]=a03;out[13]=a13;out[14]=a23;}else {out[0]=a[0];out[1]=a[4];out[2]=a[8];out[3]=a[12];out[4]=a[1];out[5]=a[5];out[6]=a[9];out[7]=a[13];out[8]=a[2];out[9]=a[6];out[10]=a[10];out[11]=a[14];out[12]=a[3];out[13]=a[7];out[14]=a[11];out[15]=a[15];}return out;}/**
  42405. * Inverts a mat4
  42406. *
  42407. * @param {mat4} out the receiving matrix
  42408. * @param {ReadonlyMat4} a the source matrix
  42409. * @returns {mat4} out
  42410. */function invert$1(out,a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3];var a10=a[4],a11=a[5],a12=a[6],a13=a[7];var a20=a[8],a21=a[9],a22=a[10],a23=a[11];var a30=a[12],a31=a[13],a32=a[14],a33=a[15];var b00=a00*a11-a01*a10;var b01=a00*a12-a02*a10;var b02=a00*a13-a03*a10;var b03=a01*a12-a02*a11;var b04=a01*a13-a03*a11;var b05=a02*a13-a03*a12;var b06=a20*a31-a21*a30;var b07=a20*a32-a22*a30;var b08=a20*a33-a23*a30;var b09=a21*a32-a22*a31;var b10=a21*a33-a23*a31;var b11=a22*a33-a23*a32;// Calculate the determinant
  42411. var det=b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;if(!det){return null;}det=1.0/det;out[0]=(a11*b11-a12*b10+a13*b09)*det;out[1]=(a02*b10-a01*b11-a03*b09)*det;out[2]=(a31*b05-a32*b04+a33*b03)*det;out[3]=(a22*b04-a21*b05-a23*b03)*det;out[4]=(a12*b08-a10*b11-a13*b07)*det;out[5]=(a00*b11-a02*b08+a03*b07)*det;out[6]=(a32*b02-a30*b05-a33*b01)*det;out[7]=(a20*b05-a22*b02+a23*b01)*det;out[8]=(a10*b10-a11*b08+a13*b06)*det;out[9]=(a01*b08-a00*b10-a03*b06)*det;out[10]=(a30*b04-a31*b02+a33*b00)*det;out[11]=(a21*b02-a20*b04-a23*b00)*det;out[12]=(a11*b07-a10*b09-a12*b06)*det;out[13]=(a00*b09-a01*b07+a02*b06)*det;out[14]=(a31*b01-a30*b03-a32*b00)*det;out[15]=(a20*b03-a21*b01+a22*b00)*det;return out;}/**
  42412. * Calculates the determinant of a mat4
  42413. *
  42414. * @param {ReadonlyMat4} a the source matrix
  42415. * @returns {Number} determinant of a
  42416. */function _determinant(a){var a00=a[0],a01=a[1],a02=a[2],a03=a[3];var a10=a[4],a11=a[5],a12=a[6],a13=a[7];var a20=a[8],a21=a[9],a22=a[10],a23=a[11];var a30=a[12],a31=a[13],a32=a[14],a33=a[15];var b00=a00*a11-a01*a10;var b01=a00*a12-a02*a10;var b02=a00*a13-a03*a10;var b03=a01*a12-a02*a11;var b04=a01*a13-a03*a11;var b05=a02*a13-a03*a12;var b06=a20*a31-a21*a30;var b07=a20*a32-a22*a30;var b08=a20*a33-a23*a30;var b09=a21*a32-a22*a31;var b10=a21*a33-a23*a31;var b11=a22*a33-a23*a32;// Calculate the determinant
  42417. return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;}/**
  42418. * Multiplies two mat4s
  42419. *
  42420. * @param {mat4} out the receiving matrix
  42421. * @param {ReadonlyMat4} a the first operand
  42422. * @param {ReadonlyMat4} b the second operand
  42423. * @returns {mat4} out
  42424. */function multiply$1(out,a,b){var a00=a[0],a01=a[1],a02=a[2],a03=a[3];var a10=a[4],a11=a[5],a12=a[6],a13=a[7];var a20=a[8],a21=a[9],a22=a[10],a23=a[11];var a30=a[12],a31=a[13],a32=a[14],a33=a[15];// Cache only the current line of the second matrix
  42425. var b0=b[0],b1=b[1],b2=b[2],b3=b[3];out[0]=b0*a00+b1*a10+b2*a20+b3*a30;out[1]=b0*a01+b1*a11+b2*a21+b3*a31;out[2]=b0*a02+b1*a12+b2*a22+b3*a32;out[3]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[4];b1=b[5];b2=b[6];b3=b[7];out[4]=b0*a00+b1*a10+b2*a20+b3*a30;out[5]=b0*a01+b1*a11+b2*a21+b3*a31;out[6]=b0*a02+b1*a12+b2*a22+b3*a32;out[7]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[8];b1=b[9];b2=b[10];b3=b[11];out[8]=b0*a00+b1*a10+b2*a20+b3*a30;out[9]=b0*a01+b1*a11+b2*a21+b3*a31;out[10]=b0*a02+b1*a12+b2*a22+b3*a32;out[11]=b0*a03+b1*a13+b2*a23+b3*a33;b0=b[12];b1=b[13];b2=b[14];b3=b[15];out[12]=b0*a00+b1*a10+b2*a20+b3*a30;out[13]=b0*a01+b1*a11+b2*a21+b3*a31;out[14]=b0*a02+b1*a12+b2*a22+b3*a32;out[15]=b0*a03+b1*a13+b2*a23+b3*a33;return out;}/**
  42426. * Translate a mat4 by the given vector
  42427. *
  42428. * @param {mat4} out the receiving matrix
  42429. * @param {ReadonlyMat4} a the matrix to translate
  42430. * @param {ReadonlyVec3} v vector to translate by
  42431. * @returns {mat4} out
  42432. */function _translate(out,a,v){var x=v[0],y=v[1],z=v[2];var a00,a01,a02,a03;var a10,a11,a12,a13;var a20,a21,a22,a23;if(a===out){out[12]=a[0]*x+a[4]*y+a[8]*z+a[12];out[13]=a[1]*x+a[5]*y+a[9]*z+a[13];out[14]=a[2]*x+a[6]*y+a[10]*z+a[14];out[15]=a[3]*x+a[7]*y+a[11]*z+a[15];}else {a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];out[0]=a00;out[1]=a01;out[2]=a02;out[3]=a03;out[4]=a10;out[5]=a11;out[6]=a12;out[7]=a13;out[8]=a20;out[9]=a21;out[10]=a22;out[11]=a23;out[12]=a00*x+a10*y+a20*z+a[12];out[13]=a01*x+a11*y+a21*z+a[13];out[14]=a02*x+a12*y+a22*z+a[14];out[15]=a03*x+a13*y+a23*z+a[15];}return out;}/**
  42433. * Scales the mat4 by the dimensions in the given vec3 not using vectorization
  42434. *
  42435. * @param {mat4} out the receiving matrix
  42436. * @param {ReadonlyMat4} a the matrix to scale
  42437. * @param {ReadonlyVec3} v the vec3 to scale the matrix by
  42438. * @returns {mat4} out
  42439. **/function scale$2(out,a,v){var x=v[0],y=v[1],z=v[2];out[0]=a[0]*x;out[1]=a[1]*x;out[2]=a[2]*x;out[3]=a[3]*x;out[4]=a[4]*y;out[5]=a[5]*y;out[6]=a[6]*y;out[7]=a[7]*y;out[8]=a[8]*z;out[9]=a[9]*z;out[10]=a[10]*z;out[11]=a[11]*z;out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];return out;}/**
  42440. * Rotates a mat4 by the given angle around the given axis
  42441. *
  42442. * @param {mat4} out the receiving matrix
  42443. * @param {ReadonlyMat4} a the matrix to rotate
  42444. * @param {Number} rad the angle to rotate the matrix by
  42445. * @param {ReadonlyVec3} axis the axis to rotate around
  42446. * @returns {mat4} out
  42447. */function rotate(out,a,rad,axis){var x=axis[0],y=axis[1],z=axis[2];var len=Math.hypot(x,y,z);var s,c,t;var a00,a01,a02,a03;var a10,a11,a12,a13;var a20,a21,a22,a23;var b00,b01,b02;var b10,b11,b12;var b20,b21,b22;if(len<EPSILON){return null;}len=1/len;x*=len;y*=len;z*=len;s=Math.sin(rad);c=Math.cos(rad);t=1-c;a00=a[0];a01=a[1];a02=a[2];a03=a[3];a10=a[4];a11=a[5];a12=a[6];a13=a[7];a20=a[8];a21=a[9];a22=a[10];a23=a[11];// Construct the elements of the rotation matrix
  42448. b00=x*x*t+c;b01=y*x*t+z*s;b02=z*x*t-y*s;b10=x*y*t-z*s;b11=y*y*t+c;b12=z*y*t+x*s;b20=x*z*t+y*s;b21=y*z*t-x*s;b22=z*z*t+c;// Perform rotation-specific matrix multiplication
  42449. out[0]=a00*b00+a10*b01+a20*b02;out[1]=a01*b00+a11*b01+a21*b02;out[2]=a02*b00+a12*b01+a22*b02;out[3]=a03*b00+a13*b01+a23*b02;out[4]=a00*b10+a10*b11+a20*b12;out[5]=a01*b10+a11*b11+a21*b12;out[6]=a02*b10+a12*b11+a22*b12;out[7]=a03*b10+a13*b11+a23*b12;out[8]=a00*b20+a10*b21+a20*b22;out[9]=a01*b20+a11*b21+a21*b22;out[10]=a02*b20+a12*b21+a22*b22;out[11]=a03*b20+a13*b21+a23*b22;if(a!==out){// If the source and destination differ, copy the unchanged last row
  42450. out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];}return out;}/**
  42451. * Rotates a matrix by the given angle around the X axis
  42452. *
  42453. * @param {mat4} out the receiving matrix
  42454. * @param {ReadonlyMat4} a the matrix to rotate
  42455. * @param {Number} rad the angle to rotate the matrix by
  42456. * @returns {mat4} out
  42457. */function rotateX$1(out,a,rad){var s=Math.sin(rad);var c=Math.cos(rad);var a10=a[4];var a11=a[5];var a12=a[6];var a13=a[7];var a20=a[8];var a21=a[9];var a22=a[10];var a23=a[11];if(a!==out){// If the source and destination differ, copy the unchanged rows
  42458. out[0]=a[0];out[1]=a[1];out[2]=a[2];out[3]=a[3];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];}// Perform axis-specific matrix multiplication
  42459. out[4]=a10*c+a20*s;out[5]=a11*c+a21*s;out[6]=a12*c+a22*s;out[7]=a13*c+a23*s;out[8]=a20*c-a10*s;out[9]=a21*c-a11*s;out[10]=a22*c-a12*s;out[11]=a23*c-a13*s;return out;}/**
  42460. * Rotates a matrix by the given angle around the Y axis
  42461. *
  42462. * @param {mat4} out the receiving matrix
  42463. * @param {ReadonlyMat4} a the matrix to rotate
  42464. * @param {Number} rad the angle to rotate the matrix by
  42465. * @returns {mat4} out
  42466. */function rotateY$1(out,a,rad){var s=Math.sin(rad);var c=Math.cos(rad);var a00=a[0];var a01=a[1];var a02=a[2];var a03=a[3];var a20=a[8];var a21=a[9];var a22=a[10];var a23=a[11];if(a!==out){// If the source and destination differ, copy the unchanged rows
  42467. out[4]=a[4];out[5]=a[5];out[6]=a[6];out[7]=a[7];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];}// Perform axis-specific matrix multiplication
  42468. out[0]=a00*c-a20*s;out[1]=a01*c-a21*s;out[2]=a02*c-a22*s;out[3]=a03*c-a23*s;out[8]=a00*s+a20*c;out[9]=a01*s+a21*c;out[10]=a02*s+a22*c;out[11]=a03*s+a23*c;return out;}/**
  42469. * Rotates a matrix by the given angle around the Z axis
  42470. *
  42471. * @param {mat4} out the receiving matrix
  42472. * @param {ReadonlyMat4} a the matrix to rotate
  42473. * @param {Number} rad the angle to rotate the matrix by
  42474. * @returns {mat4} out
  42475. */function rotateZ$1(out,a,rad){var s=Math.sin(rad);var c=Math.cos(rad);var a00=a[0];var a01=a[1];var a02=a[2];var a03=a[3];var a10=a[4];var a11=a[5];var a12=a[6];var a13=a[7];if(a!==out){// If the source and destination differ, copy the unchanged last row
  42476. out[8]=a[8];out[9]=a[9];out[10]=a[10];out[11]=a[11];out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];}// Perform axis-specific matrix multiplication
  42477. out[0]=a00*c+a10*s;out[1]=a01*c+a11*s;out[2]=a02*c+a12*s;out[3]=a03*c+a13*s;out[4]=a10*c-a00*s;out[5]=a11*c-a01*s;out[6]=a12*c-a02*s;out[7]=a13*c-a03*s;return out;}/**
  42478. * Returns the scaling factor component of a transformation
  42479. * matrix. If a matrix is built with fromRotationTranslationScale
  42480. * with a normalized Quaternion paramter, the returned vector will be
  42481. * the same as the scaling vector
  42482. * originally supplied.
  42483. * @param {vec3} out Vector to receive scaling factor component
  42484. * @param {ReadonlyMat4} mat Matrix to be decomposed (input)
  42485. * @return {vec3} out
  42486. */function getScaling(out,mat){var m11=mat[0];var m12=mat[1];var m13=mat[2];var m21=mat[4];var m22=mat[5];var m23=mat[6];var m31=mat[8];var m32=mat[9];var m33=mat[10];out[0]=Math.hypot(m11,m12,m13);out[1]=Math.hypot(m21,m22,m23);out[2]=Math.hypot(m31,m32,m33);return out;}/**
  42487. * Calculates a 4x4 matrix from the given quaternion
  42488. *
  42489. * @param {mat4} out mat4 receiving operation result
  42490. * @param {ReadonlyQuat} q Quaternion to create matrix from
  42491. *
  42492. * @returns {mat4} out
  42493. */function fromQuat(out,q){var x=q[0],y=q[1],z=q[2],w=q[3];var x2=x+x;var y2=y+y;var z2=z+z;var xx=x*x2;var yx=y*x2;var yy=y*y2;var zx=z*x2;var zy=z*y2;var zz=z*z2;var wx=w*x2;var wy=w*y2;var wz=w*z2;out[0]=1-yy-zz;out[1]=yx+wz;out[2]=zx-wy;out[3]=0;out[4]=yx-wz;out[5]=1-xx-zz;out[6]=zy+wx;out[7]=0;out[8]=zx+wy;out[9]=zy-wx;out[10]=1-xx-yy;out[11]=0;out[12]=0;out[13]=0;out[14]=0;out[15]=1;return out;}/**
  42494. * Generates a frustum matrix with the given bounds
  42495. *
  42496. * @param {mat4} out mat4 frustum matrix will be written into
  42497. * @param {Number} left Left bound of the frustum
  42498. * @param {Number} right Right bound of the frustum
  42499. * @param {Number} bottom Bottom bound of the frustum
  42500. * @param {Number} top Top bound of the frustum
  42501. * @param {Number} near Near bound of the frustum
  42502. * @param {Number} far Far bound of the frustum
  42503. * @returns {mat4} out
  42504. */function _frustum(out,left,right,bottom,top,near,far){var rl=1/(right-left);var tb=1/(top-bottom);var nf=1/(near-far);out[0]=near*2*rl;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=near*2*tb;out[6]=0;out[7]=0;out[8]=(right+left)*rl;out[9]=(top+bottom)*tb;out[10]=(far+near)*nf;out[11]=-1;out[12]=0;out[13]=0;out[14]=far*near*2*nf;out[15]=0;return out;}/**
  42505. * Generates a perspective projection matrix with the given bounds.
  42506. * Passing null/undefined/no value for far will generate infinite projection matrix.
  42507. *
  42508. * @param {mat4} out mat4 frustum matrix will be written into
  42509. * @param {number} fovy Vertical field of view in radians
  42510. * @param {number} aspect Aspect ratio. typically viewport width/height
  42511. * @param {number} near Near bound of the frustum
  42512. * @param {number} far Far bound of the frustum, can be null or Infinity
  42513. * @returns {mat4} out
  42514. */function _perspective(out,fovy,aspect,near,far){var f=1.0/Math.tan(fovy/2),nf;out[0]=f/aspect;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=f;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[11]=-1;out[12]=0;out[13]=0;out[15]=0;if(far!=null&&far!==Infinity){nf=1/(near-far);out[10]=(far+near)*nf;out[14]=2*far*near*nf;}else {out[10]=-1;out[14]=-2*near;}return out;}/**
  42515. * Generates a orthogonal projection matrix with the given bounds
  42516. *
  42517. * @param {mat4} out mat4 frustum matrix will be written into
  42518. * @param {number} left Left bound of the frustum
  42519. * @param {number} right Right bound of the frustum
  42520. * @param {number} bottom Bottom bound of the frustum
  42521. * @param {number} top Top bound of the frustum
  42522. * @param {number} near Near bound of the frustum
  42523. * @param {number} far Far bound of the frustum
  42524. * @returns {mat4} out
  42525. */function _ortho(out,left,right,bottom,top,near,far){var lr=1/(left-right);var bt=1/(bottom-top);var nf=1/(near-far);out[0]=-2*lr;out[1]=0;out[2]=0;out[3]=0;out[4]=0;out[5]=-2*bt;out[6]=0;out[7]=0;out[8]=0;out[9]=0;out[10]=2*nf;out[11]=0;out[12]=(left+right)*lr;out[13]=(top+bottom)*bt;out[14]=(far+near)*nf;out[15]=1;return out;}/**
  42526. * Generates a look-at matrix with the given eye position, focal point, and up axis.
  42527. * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.
  42528. *
  42529. * @param {mat4} out mat4 frustum matrix will be written into
  42530. * @param {ReadonlyVec3} eye Position of the viewer
  42531. * @param {ReadonlyVec3} center Point the viewer is looking at
  42532. * @param {ReadonlyVec3} up vec3 pointing up
  42533. * @returns {mat4} out
  42534. */function _lookAt(out,eye,center,up){var x0,x1,x2,y0,y1,y2,z0,z1,z2,len;var eyex=eye[0];var eyey=eye[1];var eyez=eye[2];var upx=up[0];var upy=up[1];var upz=up[2];var centerx=center[0];var centery=center[1];var centerz=center[2];if(Math.abs(eyex-centerx)<EPSILON&&Math.abs(eyey-centery)<EPSILON&&Math.abs(eyez-centerz)<EPSILON){return identity$1(out);}z0=eyex-centerx;z1=eyey-centery;z2=eyez-centerz;len=1/Math.hypot(z0,z1,z2);z0*=len;z1*=len;z2*=len;x0=upy*z2-upz*z1;x1=upz*z0-upx*z2;x2=upx*z1-upy*z0;len=Math.hypot(x0,x1,x2);if(!len){x0=0;x1=0;x2=0;}else {len=1/len;x0*=len;x1*=len;x2*=len;}y0=z1*x2-z2*x1;y1=z2*x0-z0*x2;y2=z0*x1-z1*x0;len=Math.hypot(y0,y1,y2);if(!len){y0=0;y1=0;y2=0;}else {len=1/len;y0*=len;y1*=len;y2*=len;}out[0]=x0;out[1]=y0;out[2]=z0;out[3]=0;out[4]=x1;out[5]=y1;out[6]=z1;out[7]=0;out[8]=x2;out[9]=y2;out[10]=z2;out[11]=0;out[12]=-(x0*eyex+x1*eyey+x2*eyez);out[13]=-(y0*eyex+y1*eyey+y2*eyez);out[14]=-(z0*eyex+z1*eyey+z2*eyez);out[15]=1;return out;}/**
  42535. * 4 Dimensional Vector
  42536. * @module vec4
  42537. */ /**
  42538. * Creates a new, empty vec4
  42539. *
  42540. * @returns {vec4} a new 4D vector
  42541. */function create$1(){var out=new ARRAY_TYPE(4);if(ARRAY_TYPE!=Float32Array){out[0]=0;out[1]=0;out[2]=0;out[3]=0;}return out;}/**
  42542. * Adds two vec4's
  42543. *
  42544. * @param {vec4} out the receiving vector
  42545. * @param {ReadonlyVec4} a the first operand
  42546. * @param {ReadonlyVec4} b the second operand
  42547. * @returns {vec4} out
  42548. */function add$1(out,a,b){out[0]=a[0]+b[0];out[1]=a[1]+b[1];out[2]=a[2]+b[2];out[3]=a[3]+b[3];return out;}/**
  42549. * Scales a vec4 by a scalar number
  42550. *
  42551. * @param {vec4} out the receiving vector
  42552. * @param {ReadonlyVec4} a the vector to scale
  42553. * @param {Number} b amount to scale the vector by
  42554. * @returns {vec4} out
  42555. */function scale$1(out,a,b){out[0]=a[0]*b;out[1]=a[1]*b;out[2]=a[2]*b;out[3]=a[3]*b;return out;}/**
  42556. * Calculates the length of a vec4
  42557. *
  42558. * @param {ReadonlyVec4} a vector to calculate length of
  42559. * @returns {Number} length of a
  42560. */function length$1(a){var x=a[0];var y=a[1];var z=a[2];var w=a[3];return Math.hypot(x,y,z,w);}/**
  42561. * Calculates the squared length of a vec4
  42562. *
  42563. * @param {ReadonlyVec4} a vector to calculate squared length of
  42564. * @returns {Number} squared length of a
  42565. */function squaredLength$1(a){var x=a[0];var y=a[1];var z=a[2];var w=a[3];return x*x+y*y+z*z+w*w;}/**
  42566. * Normalize a vec4
  42567. *
  42568. * @param {vec4} out the receiving vector
  42569. * @param {ReadonlyVec4} a vector to normalize
  42570. * @returns {vec4} out
  42571. */function normalize$1(out,a){var x=a[0];var y=a[1];var z=a[2];var w=a[3];var len=x*x+y*y+z*z+w*w;if(len>0){len=1/Math.sqrt(len);}out[0]=x*len;out[1]=y*len;out[2]=z*len;out[3]=w*len;return out;}/**
  42572. * Calculates the dot product of two vec4's
  42573. *
  42574. * @param {ReadonlyVec4} a the first operand
  42575. * @param {ReadonlyVec4} b the second operand
  42576. * @returns {Number} dot product of a and b
  42577. */function dot$1(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];}/**
  42578. * Performs a linear interpolation between two vec4's
  42579. *
  42580. * @param {vec4} out the receiving vector
  42581. * @param {ReadonlyVec4} a the first operand
  42582. * @param {ReadonlyVec4} b the second operand
  42583. * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
  42584. * @returns {vec4} out
  42585. */function lerp$1(out,a,b,t){var ax=a[0];var ay=a[1];var az=a[2];var aw=a[3];out[0]=ax+t*(b[0]-ax);out[1]=ay+t*(b[1]-ay);out[2]=az+t*(b[2]-az);out[3]=aw+t*(b[3]-aw);return out;}/**
  42586. * Transforms the vec4 with a mat4.
  42587. *
  42588. * @param {vec4} out the receiving vector
  42589. * @param {ReadonlyVec4} a the vector to transform
  42590. * @param {ReadonlyMat4} m matrix to transform with
  42591. * @returns {vec4} out
  42592. */function transformMat4(out,a,m){var x=a[0],y=a[1],z=a[2],w=a[3];out[0]=m[0]*x+m[4]*y+m[8]*z+m[12]*w;out[1]=m[1]*x+m[5]*y+m[9]*z+m[13]*w;out[2]=m[2]*x+m[6]*y+m[10]*z+m[14]*w;out[3]=m[3]*x+m[7]*y+m[11]*z+m[15]*w;return out;}/**
  42593. * Transforms the vec4 with a quat
  42594. *
  42595. * @param {vec4} out the receiving vector
  42596. * @param {ReadonlyVec4} a the vector to transform
  42597. * @param {ReadonlyQuat} q quaternion to transform with
  42598. * @returns {vec4} out
  42599. */function transformQuat(out,a,q){var x=a[0],y=a[1],z=a[2];var qx=q[0],qy=q[1],qz=q[2],qw=q[3];// calculate quat * vec
  42600. var ix=qw*x+qy*z-qz*y;var iy=qw*y+qz*x-qx*z;var iz=qw*z+qx*y-qy*x;var iw=-qx*x-qy*y-qz*z;// calculate result * inverse quat
  42601. out[0]=ix*qw+iw*-qx+iy*-qz-iz*-qy;out[1]=iy*qw+iw*-qy+iz*-qx-ix*-qz;out[2]=iz*qw+iw*-qz+ix*-qy-iy*-qx;out[3]=a[3];return out;}(function(){var vec=create$1();return function(a,stride,offset,count,fn,arg){var i,l;if(!stride){stride=4;}if(!offset){offset=0;}if(count){l=Math.min(count*stride+offset,a.length);}else {l=a.length;}for(i=offset;i<l;i+=stride){vec[0]=a[i];vec[1]=a[i+1];vec[2]=a[i+2];vec[3]=a[i+3];fn(vec,vec,arg);a[i]=vec[0];a[i+1]=vec[1];a[i+2]=vec[2];a[i+3]=vec[3];}return a;};})();var IDENTITY=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);var ZERO=Object.freeze([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);var INDICES=Object.freeze({COL0ROW0:0,COL0ROW1:1,COL0ROW2:2,COL0ROW3:3,COL1ROW0:4,COL1ROW1:5,COL1ROW2:6,COL1ROW3:7,COL2ROW0:8,COL2ROW1:9,COL2ROW2:10,COL2ROW3:11,COL3ROW0:12,COL3ROW1:13,COL3ROW2:14,COL3ROW3:15});var constants$3={};var Matrix4=/*#__PURE__*/function(_Matrix2){_inherits(Matrix4,_Matrix2);var _super7=_createSuper$E(Matrix4);function Matrix4(array){var _this10;_classCallCheck(this,Matrix4);_this10=_super7.call(this,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0);if(arguments.length===1&&Array.isArray(array)){_this10.copy(array);}else {_this10.identity();}return _this10;}_createClass(Matrix4,[{key:"INDICES",get:function get(){return INDICES;}},{key:"ELEMENTS",get:function get(){return 16;}},{key:"RANK",get:function get(){return 4;}},{key:"copy",value:function copy(array){this[0]=array[0];this[1]=array[1];this[2]=array[2];this[3]=array[3];this[4]=array[4];this[5]=array[5];this[6]=array[6];this[7]=array[7];this[8]=array[8];this[9]=array[9];this[10]=array[10];this[11]=array[11];this[12]=array[12];this[13]=array[13];this[14]=array[14];this[15]=array[15];return this.check();}},{key:"set",value:function set(m00,m10,m20,m30,m01,m11,m21,m31,m02,m12,m22,m32,m03,m13,m23,m33){this[0]=m00;this[1]=m10;this[2]=m20;this[3]=m30;this[4]=m01;this[5]=m11;this[6]=m21;this[7]=m31;this[8]=m02;this[9]=m12;this[10]=m22;this[11]=m32;this[12]=m03;this[13]=m13;this[14]=m23;this[15]=m33;return this.check();}},{key:"setRowMajor",value:function setRowMajor(m00,m01,m02,m03,m10,m11,m12,m13,m20,m21,m22,m23,m30,m31,m32,m33){this[0]=m00;this[1]=m10;this[2]=m20;this[3]=m30;this[4]=m01;this[5]=m11;this[6]=m21;this[7]=m31;this[8]=m02;this[9]=m12;this[10]=m22;this[11]=m32;this[12]=m03;this[13]=m13;this[14]=m23;this[15]=m33;return this.check();}},{key:"toRowMajor",value:function toRowMajor(result){result[0]=this[0];result[1]=this[4];result[2]=this[8];result[3]=this[12];result[4]=this[1];result[5]=this[5];result[6]=this[9];result[7]=this[13];result[8]=this[2];result[9]=this[6];result[10]=this[10];result[11]=this[14];result[12]=this[3];result[13]=this[7];result[14]=this[11];result[15]=this[15];return result;}},{key:"identity",value:function identity(){return this.copy(IDENTITY);}},{key:"fromQuaternion",value:function fromQuaternion(q){fromQuat(this,q);return this.check();}},{key:"frustum",value:function frustum(_ref9){var left=_ref9.left,right=_ref9.right,bottom=_ref9.bottom,top=_ref9.top,near=_ref9.near,far=_ref9.far;if(far===Infinity){Matrix4._computeInfinitePerspectiveOffCenter(this,left,right,bottom,top,near);}else {_frustum(this,left,right,bottom,top,near,far);}return this.check();}},{key:"lookAt",value:function lookAt(eye,center,up){if(arguments.length===1){var _eye=eye;eye=_eye.eye;center=_eye.center;up=_eye.up;}center=center||[0,0,0];up=up||[0,1,0];_lookAt(this,eye,center,up);return this.check();}},{key:"ortho",value:function ortho(_ref10){var left=_ref10.left,right=_ref10.right,bottom=_ref10.bottom,top=_ref10.top,_ref10$near=_ref10.near,near=_ref10$near===void 0?0.1:_ref10$near,_ref10$far=_ref10.far,far=_ref10$far===void 0?500:_ref10$far;_ortho(this,left,right,bottom,top,near,far);return this.check();}},{key:"orthographic",value:function orthographic(_ref11){var _ref11$fovy=_ref11.fovy,fovy=_ref11$fovy===void 0?45*Math.PI/180:_ref11$fovy,_ref11$aspect=_ref11.aspect,aspect=_ref11$aspect===void 0?1:_ref11$aspect,_ref11$focalDistance=_ref11.focalDistance,focalDistance=_ref11$focalDistance===void 0?1:_ref11$focalDistance,_ref11$near=_ref11.near,near=_ref11$near===void 0?0.1:_ref11$near,_ref11$far=_ref11.far,far=_ref11$far===void 0?500:_ref11$far;if(fovy>Math.PI*2){throw Error('radians');}var halfY=fovy/2;var top=focalDistance*Math.tan(halfY);var right=top*aspect;return new Matrix4().ortho({left:-right,right,bottom:-top,top,near,far});}},{key:"perspective",value:function perspective(){var _ref12=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},_ref12$fovy=_ref12.fovy,fovy=_ref12$fovy===void 0?undefined:_ref12$fovy,_ref12$fov=_ref12.fov,fov=_ref12$fov===void 0?45*Math.PI/180:_ref12$fov,_ref12$aspect=_ref12.aspect,aspect=_ref12$aspect===void 0?1:_ref12$aspect,_ref12$near=_ref12.near,near=_ref12$near===void 0?0.1:_ref12$near,_ref12$far=_ref12.far,far=_ref12$far===void 0?500:_ref12$far;fovy=fovy||fov;if(fovy>Math.PI*2){throw Error('radians');}_perspective(this,fovy,aspect,near,far);return this.check();}},{key:"determinant",value:function determinant(){return _determinant(this);}},{key:"getScale",value:function getScale(){var result=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[-0,-0,-0];result[0]=Math.sqrt(this[0]*this[0]+this[1]*this[1]+this[2]*this[2]);result[1]=Math.sqrt(this[4]*this[4]+this[5]*this[5]+this[6]*this[6]);result[2]=Math.sqrt(this[8]*this[8]+this[9]*this[9]+this[10]*this[10]);return result;}},{key:"getTranslation",value:function getTranslation(){var result=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[-0,-0,-0];result[0]=this[12];result[1]=this[13];result[2]=this[14];return result;}},{key:"getRotation",value:function getRotation(){var result=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0,-0];var scaleResult=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var scale=this.getScale(scaleResult||[-0,-0,-0]);var inverseScale0=1/scale[0];var inverseScale1=1/scale[1];var inverseScale2=1/scale[2];result[0]=this[0]*inverseScale0;result[1]=this[1]*inverseScale1;result[2]=this[2]*inverseScale2;result[3]=0;result[4]=this[4]*inverseScale0;result[5]=this[5]*inverseScale1;result[6]=this[6]*inverseScale2;result[7]=0;result[8]=this[8]*inverseScale0;result[9]=this[9]*inverseScale1;result[10]=this[10]*inverseScale2;result[11]=0;result[12]=0;result[13]=0;result[14]=0;result[15]=1;return result;}},{key:"getRotationMatrix3",value:function getRotationMatrix3(){var result=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[-0,-0,-0,-0,-0,-0,-0,-0,-0];var scaleResult=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;var scale=this.getScale(scaleResult||[-0,-0,-0]);var inverseScale0=1/scale[0];var inverseScale1=1/scale[1];var inverseScale2=1/scale[2];result[0]=this[0]*inverseScale0;result[1]=this[1]*inverseScale1;result[2]=this[2]*inverseScale2;result[3]=this[4]*inverseScale0;result[4]=this[5]*inverseScale1;result[5]=this[6]*inverseScale2;result[6]=this[8]*inverseScale0;result[7]=this[9]*inverseScale1;result[8]=this[10]*inverseScale2;return result;}},{key:"transpose",value:function transpose(){_transpose(this,this);return this.check();}},{key:"invert",value:function invert(){invert$1(this,this);return this.check();}},{key:"multiplyLeft",value:function multiplyLeft(a){multiply$1(this,a,this);return this.check();}},{key:"multiplyRight",value:function multiplyRight(a){multiply$1(this,this,a);return this.check();}},{key:"rotateX",value:function rotateX(radians){rotateX$1(this,this,radians);return this.check();}},{key:"rotateY",value:function rotateY(radians){rotateY$1(this,this,radians);return this.check();}},{key:"rotateZ",value:function rotateZ(radians){rotateZ$1(this,this,radians);return this.check();}},{key:"rotateXYZ",value:function rotateXYZ(_ref13){var _ref14=_slicedToArray(_ref13,3),rx=_ref14[0],ry=_ref14[1],rz=_ref14[2];return this.rotateX(rx).rotateY(ry).rotateZ(rz);}},{key:"rotateAxis",value:function rotateAxis(radians,axis){rotate(this,this,radians,axis);return this.check();}},{key:"scale",value:function scale(factor){if(Array.isArray(factor)){scale$2(this,this,factor);}else {scale$2(this,this,[factor,factor,factor]);}return this.check();}},{key:"translate",value:function translate(vec){_translate(this,this,vec);return this.check();}},{key:"transform",value:function transform(vector,result){if(vector.length===4){result=transformMat4(result||[-0,-0,-0,-0],vector,this);checkVector(result,4);return result;}return this.transformAsPoint(vector,result);}},{key:"transformAsPoint",value:function transformAsPoint(vector,result){var length=vector.length;switch(length){case 2:result=transformMat4$2(result||[-0,-0],vector,this);break;case 3:result=transformMat4$1(result||[-0,-0,-0],vector,this);break;default:throw new Error('Illegal vector');}checkVector(result,vector.length);return result;}},{key:"transformAsVector",value:function transformAsVector(vector,result){switch(vector.length){case 2:result=vec2_transformMat4AsVector(result||[-0,-0],vector,this);break;case 3:result=vec3_transformMat4AsVector(result||[-0,-0,-0],vector,this);break;default:throw new Error('Illegal vector');}checkVector(result,vector.length);return result;}},{key:"makeRotationX",value:function makeRotationX(radians){return this.identity().rotateX(radians);}},{key:"makeTranslation",value:function makeTranslation(x,y,z){return this.identity().translate([x,y,z]);}},{key:"transformPoint",value:function transformPoint(vector,result){deprecated('Matrix4.transformPoint','3.0');return this.transformAsPoint(vector,result);}},{key:"transformVector",value:function transformVector(vector,result){deprecated('Matrix4.transformVector','3.0');return this.transformAsPoint(vector,result);}},{key:"transformDirection",value:function transformDirection(vector,result){deprecated('Matrix4.transformDirection','3.0');return this.transformAsVector(vector,result);}}],[{key:"IDENTITY",get:function get(){constants$3.IDENTITY=constants$3.IDENTITY||Object.freeze(new Matrix4(IDENTITY));return constants$3.IDENTITY;}},{key:"ZERO",get:function get(){constants$3.ZERO=constants$3.ZERO||Object.freeze(new Matrix4(ZERO));return constants$3.ZERO;}},{key:"_computeInfinitePerspectiveOffCenter",value:function _computeInfinitePerspectiveOffCenter(result,left,right,bottom,top,near){var column0Row0=2.0*near/(right-left);var column1Row1=2.0*near/(top-bottom);var column2Row0=(right+left)/(right-left);var column2Row1=(top+bottom)/(top-bottom);var column2Row2=-1.0;var column2Row3=-1.0;var column3Row2=-2.0*near;result[0]=column0Row0;result[1]=0.0;result[2]=0.0;result[3]=0.0;result[4]=0.0;result[5]=column1Row1;result[6]=0.0;result[7]=0.0;result[8]=column2Row0;result[9]=column2Row1;result[10]=column2Row2;result[11]=column2Row3;result[12]=0.0;result[13]=0.0;result[14]=column3Row2;result[15]=0.0;return result;}}]);return Matrix4;}(Matrix);/**
  42602. * Quaternion
  42603. * @module quat
  42604. */ /**
  42605. * Creates a new identity quat
  42606. *
  42607. * @returns {quat} a new quaternion
  42608. */function create(){var out=new ARRAY_TYPE(4);if(ARRAY_TYPE!=Float32Array){out[0]=0;out[1]=0;out[2]=0;}out[3]=1;return out;}/**
  42609. * Set a quat to the identity quaternion
  42610. *
  42611. * @param {quat} out the receiving quaternion
  42612. * @returns {quat} out
  42613. */function _identity(out){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out;}/**
  42614. * Sets a quat from the given angle and rotation axis,
  42615. * then returns it.
  42616. *
  42617. * @param {quat} out the receiving quaternion
  42618. * @param {ReadonlyVec3} axis the axis around which to rotate
  42619. * @param {Number} rad the angle in radians
  42620. * @returns {quat} out
  42621. **/function setAxisAngle(out,axis,rad){rad=rad*0.5;var s=Math.sin(rad);out[0]=s*axis[0];out[1]=s*axis[1];out[2]=s*axis[2];out[3]=Math.cos(rad);return out;}/**
  42622. * Multiplies two quat's
  42623. *
  42624. * @param {quat} out the receiving quaternion
  42625. * @param {ReadonlyQuat} a the first operand
  42626. * @param {ReadonlyQuat} b the second operand
  42627. * @returns {quat} out
  42628. */function multiply(out,a,b){var ax=a[0],ay=a[1],az=a[2],aw=a[3];var bx=b[0],by=b[1],bz=b[2],bw=b[3];out[0]=ax*bw+aw*bx+ay*bz-az*by;out[1]=ay*bw+aw*by+az*bx-ax*bz;out[2]=az*bw+aw*bz+ax*by-ay*bx;out[3]=aw*bw-ax*bx-ay*by-az*bz;return out;}/**
  42629. * Rotates a quaternion by the given angle about the X axis
  42630. *
  42631. * @param {quat} out quat receiving operation result
  42632. * @param {ReadonlyQuat} a quat to rotate
  42633. * @param {number} rad angle (in radians) to rotate
  42634. * @returns {quat} out
  42635. */function _rotateX(out,a,rad){rad*=0.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3];var bx=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+aw*bx;out[1]=ay*bw+az*bx;out[2]=az*bw-ay*bx;out[3]=aw*bw-ax*bx;return out;}/**
  42636. * Rotates a quaternion by the given angle about the Y axis
  42637. *
  42638. * @param {quat} out quat receiving operation result
  42639. * @param {ReadonlyQuat} a quat to rotate
  42640. * @param {number} rad angle (in radians) to rotate
  42641. * @returns {quat} out
  42642. */function _rotateY(out,a,rad){rad*=0.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3];var by=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw-az*by;out[1]=ay*bw+aw*by;out[2]=az*bw+ax*by;out[3]=aw*bw-ay*by;return out;}/**
  42643. * Rotates a quaternion by the given angle about the Z axis
  42644. *
  42645. * @param {quat} out quat receiving operation result
  42646. * @param {ReadonlyQuat} a quat to rotate
  42647. * @param {number} rad angle (in radians) to rotate
  42648. * @returns {quat} out
  42649. */function _rotateZ(out,a,rad){rad*=0.5;var ax=a[0],ay=a[1],az=a[2],aw=a[3];var bz=Math.sin(rad),bw=Math.cos(rad);out[0]=ax*bw+ay*bz;out[1]=ay*bw-ax*bz;out[2]=az*bw+aw*bz;out[3]=aw*bw-az*bz;return out;}/**
  42650. * Calculates the W component of a quat from the X, Y, and Z components.
  42651. * Assumes that quaternion is 1 unit in length.
  42652. * Any existing W component will be ignored.
  42653. *
  42654. * @param {quat} out the receiving quaternion
  42655. * @param {ReadonlyQuat} a quat to calculate W component of
  42656. * @returns {quat} out
  42657. */function _calculateW(out,a){var x=a[0],y=a[1],z=a[2];out[0]=x;out[1]=y;out[2]=z;out[3]=Math.sqrt(Math.abs(1.0-x*x-y*y-z*z));return out;}/**
  42658. * Performs a spherical linear interpolation between two quat
  42659. *
  42660. * @param {quat} out the receiving quaternion
  42661. * @param {ReadonlyQuat} a the first operand
  42662. * @param {ReadonlyQuat} b the second operand
  42663. * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
  42664. * @returns {quat} out
  42665. */function _slerp(out,a,b,t){// benchmarks:
  42666. // http://jsperf.com/quaternion-slerp-implementations
  42667. var ax=a[0],ay=a[1],az=a[2],aw=a[3];var bx=b[0],by=b[1],bz=b[2],bw=b[3];var omega,cosom,sinom,scale0,scale1;// calc cosine
  42668. cosom=ax*bx+ay*by+az*bz+aw*bw;// adjust signs (if necessary)
  42669. if(cosom<0.0){cosom=-cosom;bx=-bx;by=-by;bz=-bz;bw=-bw;}// calculate coefficients
  42670. if(1.0-cosom>EPSILON){// standard case (slerp)
  42671. omega=Math.acos(cosom);sinom=Math.sin(omega);scale0=Math.sin((1.0-t)*omega)/sinom;scale1=Math.sin(t*omega)/sinom;}else {// "from" and "to" quaternions are very close
  42672. // ... so we can do a linear interpolation
  42673. scale0=1.0-t;scale1=t;}// calculate final values
  42674. out[0]=scale0*ax+scale1*bx;out[1]=scale0*ay+scale1*by;out[2]=scale0*az+scale1*bz;out[3]=scale0*aw+scale1*bw;return out;}/**
  42675. * Calculates the inverse of a quat
  42676. *
  42677. * @param {quat} out the receiving quaternion
  42678. * @param {ReadonlyQuat} a quat to calculate inverse of
  42679. * @returns {quat} out
  42680. */function _invert(out,a){var a0=a[0],a1=a[1],a2=a[2],a3=a[3];var dot=a0*a0+a1*a1+a2*a2+a3*a3;var invDot=dot?1.0/dot:0;// TODO: Would be faster to return [0,0,0,0] immediately if dot == 0
  42681. out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out;}/**
  42682. * Calculates the conjugate of a quat
  42683. * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.
  42684. *
  42685. * @param {quat} out the receiving quaternion
  42686. * @param {ReadonlyQuat} a quat to calculate conjugate of
  42687. * @returns {quat} out
  42688. */function _conjugate(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out;}/**
  42689. * Creates a quaternion from the given 3x3 rotation matrix.
  42690. *
  42691. * NOTE: The resultant quaternion is not normalized, so you should be sure
  42692. * to renormalize the quaternion yourself where necessary.
  42693. *
  42694. * @param {quat} out the receiving quaternion
  42695. * @param {ReadonlyMat3} m rotation matrix
  42696. * @returns {quat} out
  42697. * @function
  42698. */function fromMat3(out,m){// Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
  42699. // article "Quaternion Calculus and Fast Animation".
  42700. var fTrace=m[0]+m[4]+m[8];var fRoot;if(fTrace>0.0){// |w| > 1/2, may as well choose w > 1/2
  42701. fRoot=Math.sqrt(fTrace+1.0);// 2w
  42702. out[3]=0.5*fRoot;fRoot=0.5/fRoot;// 1/(4w)
  42703. out[0]=(m[5]-m[7])*fRoot;out[1]=(m[6]-m[2])*fRoot;out[2]=(m[1]-m[3])*fRoot;}else {// |w| <= 1/2
  42704. var i=0;if(m[4]>m[0])i=1;if(m[8]>m[i*3+i])i=2;var j=(i+1)%3;var k=(i+2)%3;fRoot=Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k]+1.0);out[i]=0.5*fRoot;fRoot=0.5/fRoot;out[3]=(m[j*3+k]-m[k*3+j])*fRoot;out[j]=(m[j*3+i]+m[i*3+j])*fRoot;out[k]=(m[k*3+i]+m[i*3+k])*fRoot;}return out;}/**
  42705. * Adds two quat's
  42706. *
  42707. * @param {quat} out the receiving quaternion
  42708. * @param {ReadonlyQuat} a the first operand
  42709. * @param {ReadonlyQuat} b the second operand
  42710. * @returns {quat} out
  42711. * @function
  42712. */var _add=add$1;/**
  42713. * Scales a quat by a scalar number
  42714. *
  42715. * @param {quat} out the receiving vector
  42716. * @param {ReadonlyQuat} a the vector to scale
  42717. * @param {Number} b amount to scale the vector by
  42718. * @returns {quat} out
  42719. * @function
  42720. */var _scale2=scale$1;/**
  42721. * Calculates the dot product of two quat's
  42722. *
  42723. * @param {ReadonlyQuat} a the first operand
  42724. * @param {ReadonlyQuat} b the second operand
  42725. * @returns {Number} dot product of a and b
  42726. * @function
  42727. */var _dot=dot$1;/**
  42728. * Performs a linear interpolation between two quat's
  42729. *
  42730. * @param {quat} out the receiving quaternion
  42731. * @param {ReadonlyQuat} a the first operand
  42732. * @param {ReadonlyQuat} b the second operand
  42733. * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
  42734. * @returns {quat} out
  42735. * @function
  42736. */var _lerp=lerp$1;/**
  42737. * Calculates the length of a quat
  42738. *
  42739. * @param {ReadonlyQuat} a vector to calculate length of
  42740. * @returns {Number} length of a
  42741. */var length=length$1;/**
  42742. * Calculates the squared length of a quat
  42743. *
  42744. * @param {ReadonlyQuat} a vector to calculate squared length of
  42745. * @returns {Number} squared length of a
  42746. * @function
  42747. */var squaredLength=squaredLength$1;/**
  42748. * Normalize a quat
  42749. *
  42750. * @param {quat} out the receiving quaternion
  42751. * @param {ReadonlyQuat} a quaternion to normalize
  42752. * @returns {quat} out
  42753. * @function
  42754. */var normalize=normalize$1;/**
  42755. * Sets a quaternion to represent the shortest rotation from one
  42756. * vector to another.
  42757. *
  42758. * Both vectors are assumed to be unit length.
  42759. *
  42760. * @param {quat} out the receiving quaternion.
  42761. * @param {ReadonlyVec3} a the initial vector
  42762. * @param {ReadonlyVec3} b the destination vector
  42763. * @returns {quat} out
  42764. */var _rotationTo=function(){var tmpvec3=create$3();var xUnitVec3=fromValues(1,0,0);var yUnitVec3=fromValues(0,1,0);return function(out,a,b){var dot=dot$2(a,b);if(dot<-0.999999){_cross(tmpvec3,xUnitVec3,a);if(len(tmpvec3)<0.000001)_cross(tmpvec3,yUnitVec3,a);normalize$2(tmpvec3,tmpvec3);setAxisAngle(out,tmpvec3,Math.PI);return out;}else if(dot>0.999999){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out;}else {_cross(tmpvec3,a,b);out[0]=tmpvec3[0];out[1]=tmpvec3[1];out[2]=tmpvec3[2];out[3]=1+dot;return normalize(out,out);}};}()/**
  42765. * Performs a spherical linear interpolation with two control points
  42766. *
  42767. * @param {quat} out the receiving quaternion
  42768. * @param {ReadonlyQuat} a the first operand
  42769. * @param {ReadonlyQuat} b the second operand
  42770. * @param {ReadonlyQuat} c the third operand
  42771. * @param {ReadonlyQuat} d the fourth operand
  42772. * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
  42773. * @returns {quat} out
  42774. */;(function(){var temp1=create();var temp2=create();return function(out,a,b,c,d,t){_slerp(temp1,a,d,t);_slerp(temp2,b,c,t);_slerp(out,temp1,temp2,2*t*(1-t));return out;};})()/**
  42775. * Sets the specified quaternion with values corresponding to the given
  42776. * axes. Each axis is a vec3 and is expected to be unit length and
  42777. * perpendicular to all other specified axes.
  42778. *
  42779. * @param {ReadonlyVec3} view the vector representing the viewing direction
  42780. * @param {ReadonlyVec3} right the vector representing the local "right" direction
  42781. * @param {ReadonlyVec3} up the vector representing the local "up" direction
  42782. * @returns {quat} out
  42783. */;(function(){var matr=create$2();return function(out,view,right,up){matr[0]=right[0];matr[3]=right[1];matr[6]=right[2];matr[1]=up[0];matr[4]=up[1];matr[7]=up[2];matr[2]=-view[0];matr[5]=-view[1];matr[8]=-view[2];return normalize(out,fromMat3(out,matr));};})();var IDENTITY_QUATERNION=[0,0,0,1];var Quaternion=/*#__PURE__*/function(_MathArray3){_inherits(Quaternion,_MathArray3);var _super8=_createSuper$E(Quaternion);function Quaternion(){var _this11;var x=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0;var y=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var z=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;var w=arguments.length>3&&arguments[3]!==undefined?arguments[3]:1;_classCallCheck(this,Quaternion);_this11=_super8.call(this,-0,-0,-0,-0);if(Array.isArray(x)&&arguments.length===1){_this11.copy(x);}else {_this11.set(x,y,z,w);}return _this11;}_createClass(Quaternion,[{key:"copy",value:function copy(array){this[0]=array[0];this[1]=array[1];this[2]=array[2];this[3]=array[3];return this.check();}},{key:"set",value:function set(x,y,z,w){this[0]=x;this[1]=y;this[2]=z;this[3]=w;return this.check();}},{key:"fromMatrix3",value:function fromMatrix3(m){fromMat3(this,m);return this.check();}},{key:"identity",value:function identity(){_identity(this);return this.check();}},{key:"fromAxisRotation",value:function fromAxisRotation(axis,rad){setAxisAngle(this,axis,rad);return this.check();}},{key:"setAxisAngle",value:function setAxisAngle(axis,rad){return this.fromAxisRotation(axis,rad);}},{key:"ELEMENTS",get:function get(){return 4;}},{key:"x",get:function get(){return this[0];},set:function set(value){this[0]=checkNumber(value);}},{key:"y",get:function get(){return this[1];},set:function set(value){this[1]=checkNumber(value);}},{key:"z",get:function get(){return this[2];},set:function set(value){this[2]=checkNumber(value);}},{key:"w",get:function get(){return this[3];},set:function set(value){this[3]=checkNumber(value);}},{key:"len",value:function len(){return length(this);}},{key:"lengthSquared",value:function lengthSquared(){return squaredLength(this);}},{key:"dot",value:function dot(a,b){if(b!==undefined){throw new Error('Quaternion.dot only takes one argument');}return _dot(this,a);}},{key:"rotationTo",value:function rotationTo(vectorA,vectorB){_rotationTo(this,vectorA,vectorB);return this.check();}},{key:"add",value:function add(a,b){if(b!==undefined){throw new Error('Quaternion.add only takes one argument');}_add(this,this,a);return this.check();}},{key:"calculateW",value:function calculateW(){_calculateW(this,this);return this.check();}},{key:"conjugate",value:function conjugate(){_conjugate(this,this);return this.check();}},{key:"invert",value:function invert(){_invert(this,this);return this.check();}},{key:"lerp",value:function lerp(a,b,t){_lerp(this,a,b,t);return this.check();}},{key:"multiplyRight",value:function multiplyRight(a,b){assert$4(!b);multiply(this,this,a);return this.check();}},{key:"multiplyLeft",value:function multiplyLeft(a,b){assert$4(!b);multiply(this,a,this);return this.check();}},{key:"normalize",value:function normalize(){var length=this.len();var l=length>0?1/length:0;this[0]=this[0]*l;this[1]=this[1]*l;this[2]=this[2]*l;this[3]=this[3]*l;if(length===0){this[3]=1;}return this.check();}},{key:"rotateX",value:function rotateX(rad){_rotateX(this,this,rad);return this.check();}},{key:"rotateY",value:function rotateY(rad){_rotateY(this,this,rad);return this.check();}},{key:"rotateZ",value:function rotateZ(rad){_rotateZ(this,this,rad);return this.check();}},{key:"scale",value:function scale(b){_scale2(this,this,b);return this.check();}},{key:"slerp",value:function slerp(start,target,ratio){switch(arguments.length){case 1:var _arguments$=arguments[0];var _arguments$$start=_arguments$.start;start=_arguments$$start===void 0?IDENTITY_QUATERNION:_arguments$$start;target=_arguments$.target;ratio=_arguments$.ratio;break;case 2:var _arguments2=Array.prototype.slice.call(arguments);target=_arguments2[0];ratio=_arguments2[1];start=this;break;}_slerp(this,start,target,ratio);return this.check();}},{key:"transformVector4",value:function transformVector4(vector){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:vector;transformQuat(result,vector,this);return checkVector(result,4);}},{key:"lengthSq",value:function lengthSq(){return this.lengthSquared();}},{key:"setFromAxisAngle",value:function setFromAxisAngle(axis,rad){return this.setAxisAngle(axis,rad);}},{key:"premultiply",value:function premultiply(a,b){return this.multiplyLeft(a,b);}},{key:"multiply",value:function multiply(a,b){return this.multiplyRight(a,b);}}]);return Quaternion;}(MathArray);var _MathUtils={EPSILON1:1e-1,EPSILON2:1e-2,EPSILON3:1e-3,EPSILON4:1e-4,EPSILON5:1e-5,EPSILON6:1e-6,EPSILON7:1e-7,EPSILON8:1e-8,EPSILON9:1e-9,EPSILON10:1e-10,EPSILON11:1e-11,EPSILON12:1e-12,EPSILON13:1e-13,EPSILON14:1e-14,EPSILON15:1e-15,EPSILON16:1e-16,EPSILON17:1e-17,EPSILON18:1e-18,EPSILON19:1e-19,EPSILON20:1e-20,PI_OVER_TWO:Math.PI/2,PI_OVER_FOUR:Math.PI/4,PI_OVER_SIX:Math.PI/6,TWO_PI:Math.PI*2};var WGS84_RADIUS_X$1=6378137.0;var WGS84_RADIUS_Y$1=6378137.0;var WGS84_RADIUS_Z$1=6356752.3142451793;var noop=function noop(x){return x;};var scratchVector$6=new Vector3$1();function fromCartographic(cartographic,result){var map=arguments.length>2&&arguments[2]!==undefined?arguments[2]:noop;if(isArray$2(cartographic)){result[0]=map(cartographic[0]);result[1]=map(cartographic[1]);result[2]=cartographic[2];}else if('longitude'in cartographic){result[0]=map(cartographic.longitude);result[1]=map(cartographic.latitude);result[2]=cartographic.height;}else {result[0]=map(cartographic.x);result[1]=map(cartographic.y);result[2]=cartographic.z;}return result;}function fromCartographicToRadians(cartographic){var vector=arguments.length>1&&arguments[1]!==undefined?arguments[1]:scratchVector$6;return fromCartographic(cartographic,vector,config$1._cartographicRadians?noop:toRadians);}function toCartographic(vector,cartographic){var map=arguments.length>2&&arguments[2]!==undefined?arguments[2]:noop;if(isArray$2(cartographic)){cartographic[0]=map(vector[0]);cartographic[1]=map(vector[1]);cartographic[2]=vector[2];}else if('longitude'in cartographic){cartographic.longitude=map(vector[0]);cartographic.latitude=map(vector[1]);cartographic.height=vector[2];}else {cartographic.x=map(vector[0]);cartographic.y=map(vector[1]);cartographic.z=vector[2];}return cartographic;}function toCartographicFromRadians(vector,cartographic){return toCartographic(vector,cartographic,config$1._cartographicRadians?noop:toDegrees);}var scratchVector$5=new Vector3$1();var scaleToGeodeticSurfaceIntersection=new Vector3$1();var scaleToGeodeticSurfaceGradient=new Vector3$1();function _scaleToGeodeticSurface(cartesian,ellipsoid){var result=arguments.length>2&&arguments[2]!==undefined?arguments[2]:new Vector3$1();var oneOverRadii=ellipsoid.oneOverRadii,oneOverRadiiSquared=ellipsoid.oneOverRadiiSquared,centerToleranceSquared=ellipsoid.centerToleranceSquared;scratchVector$5.from(cartesian);var positionX=cartesian.x;var positionY=cartesian.y;var positionZ=cartesian.z;var oneOverRadiiX=oneOverRadii.x;var oneOverRadiiY=oneOverRadii.y;var oneOverRadiiZ=oneOverRadii.z;var x2=positionX*positionX*oneOverRadiiX*oneOverRadiiX;var y2=positionY*positionY*oneOverRadiiY*oneOverRadiiY;var z2=positionZ*positionZ*oneOverRadiiZ*oneOverRadiiZ;var squaredNorm=x2+y2+z2;var ratio=Math.sqrt(1.0/squaredNorm);if(!Number.isFinite(ratio)){return undefined;}var intersection=scaleToGeodeticSurfaceIntersection;intersection.copy(cartesian).scale(ratio);if(squaredNorm<centerToleranceSquared){return intersection.to(result);}var oneOverRadiiSquaredX=oneOverRadiiSquared.x;var oneOverRadiiSquaredY=oneOverRadiiSquared.y;var oneOverRadiiSquaredZ=oneOverRadiiSquared.z;var gradient=scaleToGeodeticSurfaceGradient;gradient.set(intersection.x*oneOverRadiiSquaredX*2.0,intersection.y*oneOverRadiiSquaredY*2.0,intersection.z*oneOverRadiiSquaredZ*2.0);var lambda=(1.0-ratio)*cartesian.len()/(0.5*gradient.len());var correction=0.0;var xMultiplier;var yMultiplier;var zMultiplier;var func;do{lambda-=correction;xMultiplier=1.0/(1.0+lambda*oneOverRadiiSquaredX);yMultiplier=1.0/(1.0+lambda*oneOverRadiiSquaredY);zMultiplier=1.0/(1.0+lambda*oneOverRadiiSquaredZ);var xMultiplier2=xMultiplier*xMultiplier;var yMultiplier2=yMultiplier*yMultiplier;var zMultiplier2=zMultiplier*zMultiplier;var xMultiplier3=xMultiplier2*xMultiplier;var yMultiplier3=yMultiplier2*yMultiplier;var zMultiplier3=zMultiplier2*zMultiplier;func=x2*xMultiplier2+y2*yMultiplier2+z2*zMultiplier2-1.0;var denominator=x2*xMultiplier3*oneOverRadiiSquaredX+y2*yMultiplier3*oneOverRadiiSquaredY+z2*zMultiplier3*oneOverRadiiSquaredZ;var derivative=-2.0*denominator;correction=func/derivative;}while(Math.abs(func)>_MathUtils.EPSILON12);return scratchVector$5.scale([xMultiplier,yMultiplier,zMultiplier]).to(result);}var EPSILON14=1e-14;var scratchOrigin=new Vector3$1();var VECTOR_PRODUCT_LOCAL_FRAME={up:{south:'east',north:'west',west:'south',east:'north'},down:{south:'west',north:'east',west:'north',east:'south'},south:{up:'west',down:'east',west:'down',east:'up'},north:{up:'east',down:'west',west:'up',east:'down'},west:{up:'north',down:'south',north:'down',south:'up'},east:{up:'south',down:'north',north:'up',south:'down'}};var degeneratePositionLocalFrame={north:[-1,0,0],east:[0,1,0],up:[0,0,1],south:[1,0,0],west:[0,-1,0],down:[0,0,-1]};var scratchAxisVectors={east:new Vector3$1(),north:new Vector3$1(),up:new Vector3$1(),west:new Vector3$1(),south:new Vector3$1(),down:new Vector3$1()};var scratchVector1=new Vector3$1();var scratchVector2$1=new Vector3$1();var scratchVector3$1=new Vector3$1();function _localFrameToFixedFrame(ellipsoid,firstAxis,secondAxis,thirdAxis,cartesianOrigin,result){var thirdAxisInferred=VECTOR_PRODUCT_LOCAL_FRAME[firstAxis]&&VECTOR_PRODUCT_LOCAL_FRAME[firstAxis][secondAxis];assert$4(thirdAxisInferred&&(!thirdAxis||thirdAxis===thirdAxisInferred));var firstAxisVector;var secondAxisVector;var thirdAxisVector;var origin=scratchOrigin.copy(cartesianOrigin);var atPole=_equals(origin.x,0.0,EPSILON14)&&_equals(origin.y,0.0,EPSILON14);if(atPole){var sign=Math.sign(origin.z);firstAxisVector=scratchVector1.fromArray(degeneratePositionLocalFrame[firstAxis]);if(firstAxis!=='east'&&firstAxis!=='west'){firstAxisVector.scale(sign);}secondAxisVector=scratchVector2$1.fromArray(degeneratePositionLocalFrame[secondAxis]);if(secondAxis!=='east'&&secondAxis!=='west'){secondAxisVector.scale(sign);}thirdAxisVector=scratchVector3$1.fromArray(degeneratePositionLocalFrame[thirdAxis]);if(thirdAxis!=='east'&&thirdAxis!=='west'){thirdAxisVector.scale(sign);}}else {var up=scratchAxisVectors.up,east=scratchAxisVectors.east,north=scratchAxisVectors.north;east.set(-origin.y,origin.x,0.0).normalize();ellipsoid.geodeticSurfaceNormal(origin,up);north.copy(up).cross(east);var down=scratchAxisVectors.down,west=scratchAxisVectors.west,south=scratchAxisVectors.south;down.copy(up).scale(-1);west.copy(east).scale(-1);south.copy(north).scale(-1);firstAxisVector=scratchAxisVectors[firstAxis];secondAxisVector=scratchAxisVectors[secondAxis];thirdAxisVector=scratchAxisVectors[thirdAxis];}result[0]=firstAxisVector.x;result[1]=firstAxisVector.y;result[2]=firstAxisVector.z;result[3]=0.0;result[4]=secondAxisVector.x;result[5]=secondAxisVector.y;result[6]=secondAxisVector.z;result[7]=0.0;result[8]=thirdAxisVector.x;result[9]=thirdAxisVector.y;result[10]=thirdAxisVector.z;result[11]=0.0;result[12]=origin.x;result[13]=origin.y;result[14]=origin.z;result[15]=1.0;return result;}var scratchVector$4=new Vector3$1();var scratchNormal$2=new Vector3$1();var scratchK=new Vector3$1();var scratchPosition$2=new Vector3$1();var scratchHeight=new Vector3$1();var scratchCartesian=new Vector3$1();var wgs84;var Ellipsoid=/*#__PURE__*/function(){function Ellipsoid(){var x=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0.0;var y=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0.0;var z=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0.0;_classCallCheck(this,Ellipsoid);assert$4(x>=0.0);assert$4(y>=0.0);assert$4(z>=0.0);this.radii=new Vector3$1(x,y,z);this.radiiSquared=new Vector3$1(x*x,y*y,z*z);this.radiiToTheFourth=new Vector3$1(x*x*x*x,y*y*y*y,z*z*z*z);this.oneOverRadii=new Vector3$1(x===0.0?0.0:1.0/x,y===0.0?0.0:1.0/y,z===0.0?0.0:1.0/z);this.oneOverRadiiSquared=new Vector3$1(x===0.0?0.0:1.0/(x*x),y===0.0?0.0:1.0/(y*y),z===0.0?0.0:1.0/(z*z));this.minimumRadius=Math.min(x,y,z);this.maximumRadius=Math.max(x,y,z);this.centerToleranceSquared=_MathUtils.EPSILON1;if(this.radiiSquared.z!==0){this.squaredXOverSquaredZ=this.radiiSquared.x/this.radiiSquared.z;}Object.freeze(this);}_createClass(Ellipsoid,[{key:"equals",value:function equals(right){return this===right||Boolean(right&&this.radii.equals(right.radii));}},{key:"toString",value:function toString(){return this.radii.toString();}},{key:"cartographicToCartesian",value:function cartographicToCartesian(cartographic){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];var normal=scratchNormal$2;var k=scratchK;var _cartographic=_slicedToArray(cartographic,3),height=_cartographic[2];this.geodeticSurfaceNormalCartographic(cartographic,normal);k.copy(this.radiiSquared).scale(normal);var gamma=Math.sqrt(normal.dot(k));k.scale(1/gamma);normal.scale(height);k.add(normal);return k.to(result);}},{key:"cartesianToCartographic",value:function cartesianToCartographic(cartesian){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];scratchCartesian.from(cartesian);var point=this.scaleToGeodeticSurface(scratchCartesian,scratchPosition$2);if(!point){return undefined;}var normal=this.geodeticSurfaceNormal(point,scratchNormal$2);var h=scratchHeight;h.copy(scratchCartesian).subtract(point);var longitude=Math.atan2(normal.y,normal.x);var latitude=Math.asin(normal.z);var height=Math.sign(dot$2(h,scratchCartesian))*length$2(h);return toCartographicFromRadians([longitude,latitude,height],result);}},{key:"eastNorthUpToFixedFrame",value:function eastNorthUpToFixedFrame(origin){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:new Matrix4();return _localFrameToFixedFrame(this,'east','north','up',origin,result);}},{key:"localFrameToFixedFrame",value:function localFrameToFixedFrame(firstAxis,secondAxis,thirdAxis,origin){var result=arguments.length>4&&arguments[4]!==undefined?arguments[4]:new Matrix4();return _localFrameToFixedFrame(this,firstAxis,secondAxis,thirdAxis,origin,result);}},{key:"geocentricSurfaceNormal",value:function geocentricSurfaceNormal(cartesian){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];return scratchVector$4.from(cartesian).normalize().to(result);}},{key:"geodeticSurfaceNormalCartographic",value:function geodeticSurfaceNormalCartographic(cartographic){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];var cartographicVectorRadians=fromCartographicToRadians(cartographic);var longitude=cartographicVectorRadians[0];var latitude=cartographicVectorRadians[1];var cosLatitude=Math.cos(latitude);scratchVector$4.set(cosLatitude*Math.cos(longitude),cosLatitude*Math.sin(longitude),Math.sin(latitude)).normalize();return scratchVector$4.to(result);}},{key:"geodeticSurfaceNormal",value:function geodeticSurfaceNormal(cartesian){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];return scratchVector$4.from(cartesian).scale(this.oneOverRadiiSquared).normalize().to(result);}},{key:"scaleToGeodeticSurface",value:function scaleToGeodeticSurface(cartesian,result){return _scaleToGeodeticSurface(cartesian,this,result);}},{key:"scaleToGeocentricSurface",value:function scaleToGeocentricSurface(cartesian){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];scratchPosition$2.from(cartesian);var positionX=scratchPosition$2.x;var positionY=scratchPosition$2.y;var positionZ=scratchPosition$2.z;var oneOverRadiiSquared=this.oneOverRadiiSquared;var beta=1.0/Math.sqrt(positionX*positionX*oneOverRadiiSquared.x+positionY*positionY*oneOverRadiiSquared.y+positionZ*positionZ*oneOverRadiiSquared.z);return scratchPosition$2.multiplyScalar(beta).to(result);}},{key:"transformPositionToScaledSpace",value:function transformPositionToScaledSpace(position){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];return scratchPosition$2.from(position).scale(this.oneOverRadii).to(result);}},{key:"transformPositionFromScaledSpace",value:function transformPositionFromScaledSpace(position){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];return scratchPosition$2.from(position).scale(this.radii).to(result);}},{key:"getSurfaceNormalIntersectionWithZAxis",value:function getSurfaceNormalIntersectionWithZAxis(position){var buffer=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0.0;var result=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[0,0,0];assert$4(_equals(this.radii.x,this.radii.y,_MathUtils.EPSILON15));assert$4(this.radii.z>0);scratchPosition$2.from(position);var z=scratchPosition$2.z*(1-this.squaredXOverSquaredZ);if(Math.abs(z)>=this.radii.z-buffer){return undefined;}return scratchPosition$2.set(0.0,0.0,z).to(result);}}],[{key:"WGS84",get:function get(){wgs84=wgs84||new Ellipsoid(WGS84_RADIUS_X$1,WGS84_RADIUS_Y$1,WGS84_RADIUS_Z$1);return wgs84;}}]);return Ellipsoid;}();var DoublyLinkedListNode=function DoublyLinkedListNode(item,previous,next){_classCallCheck(this,DoublyLinkedListNode);_defineProperty(this,'item',void 0);_defineProperty(this,'previous',void 0);_defineProperty(this,'next',void 0);this.item=item;this.previous=previous;this.next=next;};var DoublyLinkedList=/*#__PURE__*/function(){function DoublyLinkedList(){_classCallCheck(this,DoublyLinkedList);_defineProperty(this,'head',null);_defineProperty(this,'tail',null);_defineProperty(this,'_length',0);}_createClass(DoublyLinkedList,[{key:"length",get:function get(){return this._length;}},{key:"add",value:function add(item){var node=new DoublyLinkedListNode(item,this.tail,null);if(this.tail){this.tail.next=node;this.tail=node;}else {this.head=node;this.tail=node;}++this._length;return node;}},{key:"remove",value:function remove(node){if(!node){return;}if(node.previous&&node.next){node.previous.next=node.next;node.next.previous=node.previous;}else if(node.previous){node.previous.next=null;this.tail=node.previous;}else if(node.next){node.next.previous=null;this.head=node.next;}else {this.head=null;this.tail=null;}node.next=null;node.previous=null;--this._length;}},{key:"splice",value:function splice(node,nextNode){if(node===nextNode){return;}this.remove(nextNode);this._insert(node,nextNode);}},{key:"_insert",value:function _insert(node,nextNode){var oldNodeNext=node.next;node.next=nextNode;if(this.tail===node){this.tail=nextNode;}else {oldNodeNext.previous=nextNode;}nextNode.next=oldNodeNext;nextNode.previous=node;++this._length;}}]);return DoublyLinkedList;}();function defined$5(x){return x!==undefined&&x!==null;}var TilesetCache=/*#__PURE__*/function(){function TilesetCache(){_classCallCheck(this,TilesetCache);_defineProperty(this,'_list',void 0);_defineProperty(this,'_sentinel',void 0);_defineProperty(this,'_trimTiles',void 0);this._list=new DoublyLinkedList();this._sentinel=this._list.add('sentinel');this._trimTiles=false;}_createClass(TilesetCache,[{key:"reset",value:function reset(){this._list.splice(this._list.tail,this._sentinel);}},{key:"touch",value:function touch(tile){var node=tile._cacheNode;if(defined$5(node)){this._list.splice(this._sentinel,node);}}},{key:"add",value:function add(tileset,tile,addCallback){if(!defined$5(tile._cacheNode)){tile._cacheNode=this._list.add(tile);if(addCallback){addCallback(tileset,tile);}}}},{key:"unloadTile",value:function unloadTile(tileset,tile,unloadCallback){var node=tile._cacheNode;if(!defined$5(node)){return;}this._list.remove(node);tile._cacheNode=undefined;if(unloadCallback){unloadCallback(tileset,tile);}}},{key:"unloadTiles",value:function unloadTiles(tileset,unloadCallback){var trimTiles=this._trimTiles;this._trimTiles=false;var list=this._list;var maximumMemoryUsageInBytes=tileset.maximumMemoryUsage*1024*1024;var sentinel=this._sentinel;var node=list.head;while(node!==sentinel&&(tileset.gpuMemoryUsageInBytes>maximumMemoryUsageInBytes||trimTiles)){var tile=node.item;node=node.next;this.unloadTile(tileset,tile,unloadCallback);}}},{key:"trim",value:function trim(){this._trimTiles=true;}}]);return TilesetCache;}();function calculateTransformProps(tileHeader,tile){assert$7(tileHeader);assert$7(tile);var rtcCenter=tile.rtcCenter,gltfUpAxis=tile.gltfUpAxis;var computedTransform=tileHeader.computedTransform,center=tileHeader.boundingVolume.center;var modelMatrix=new Matrix4(computedTransform);if(rtcCenter){modelMatrix.translate(rtcCenter);}switch(gltfUpAxis){case'Z':break;case'Y':var rotationY=new Matrix4().rotateX(Math.PI/2);modelMatrix=modelMatrix.multiplyRight(rotationY);break;case'X':var rotationX=new Matrix4().rotateY(-Math.PI/2);modelMatrix=modelMatrix.multiplyRight(rotationX);break;}if(tile.isQuantized){modelMatrix.translate(tile.quantizedVolumeOffset).scale(tile.quantizedVolumeScale);}var cartesianOrigin=new Vector3$1(center);tile.cartesianModelMatrix=modelMatrix;tile.cartesianOrigin=cartesianOrigin;var cartographicOrigin=Ellipsoid.WGS84.cartesianToCartographic(cartesianOrigin,new Vector3$1());var fromFixedFrameMatrix=Ellipsoid.WGS84.eastNorthUpToFixedFrame(cartesianOrigin);var toFixedFrameMatrix=fromFixedFrameMatrix.invert();tile.cartographicModelMatrix=toFixedFrameMatrix.multiplyRight(modelMatrix);tile.cartographicOrigin=cartographicOrigin;if(!tile.coordinateSystem){tile.modelMatrix=tile.cartographicModelMatrix;}}var INTERSECTION=Object.freeze({OUTSIDE:-1,INTERSECTING:0,INSIDE:1});new Vector3$1();new Vector3$1();var scratchVector$3=new Vector3$1();var scratchVector2=new Vector3$1();var BoundingSphere=/*#__PURE__*/function(){function BoundingSphere(){var center=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[0,0,0];var radius=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0.0;_classCallCheck(this,BoundingSphere);this.radius=-0;this.center=new Vector3$1();this.fromCenterRadius(center,radius);}_createClass(BoundingSphere,[{key:"fromCenterRadius",value:function fromCenterRadius(center,radius){this.center.from(center);this.radius=radius;return this;}},{key:"fromCornerPoints",value:function fromCornerPoints(corner,oppositeCorner){oppositeCorner=scratchVector$3.from(oppositeCorner);this.center=new Vector3$1().from(corner).add(oppositeCorner).scale(0.5);this.radius=this.center.distance(oppositeCorner);return this;}},{key:"equals",value:function equals(right){return this===right||Boolean(right)&&this.center.equals(right.center)&&this.radius===right.radius;}},{key:"clone",value:function clone(){return new BoundingSphere(this.center,this.radius);}},{key:"union",value:function union(boundingSphere){var leftCenter=this.center;var leftRadius=this.radius;var rightCenter=boundingSphere.center;var rightRadius=boundingSphere.radius;var toRightCenter=scratchVector$3.copy(rightCenter).subtract(leftCenter);var centerSeparation=toRightCenter.magnitude();if(leftRadius>=centerSeparation+rightRadius){return this.clone();}if(rightRadius>=centerSeparation+leftRadius){return boundingSphere.clone();}var halfDistanceBetweenTangentPoints=(leftRadius+centerSeparation+rightRadius)*0.5;scratchVector2.copy(toRightCenter).scale((-leftRadius+halfDistanceBetweenTangentPoints)/centerSeparation).add(leftCenter);this.center.copy(scratchVector2);this.radius=halfDistanceBetweenTangentPoints;return this;}},{key:"expand",value:function expand(point){point=scratchVector$3.from(point);var radius=point.subtract(this.center).magnitude();if(radius>this.radius){this.radius=radius;}return this;}},{key:"transform",value:function transform(_transform){this.center.transform(_transform);var scale=getScaling(scratchVector$3,_transform);this.radius=Math.max(scale[0],Math.max(scale[1],scale[2]))*this.radius;return this;}},{key:"distanceSquaredTo",value:function distanceSquaredTo(point){var d=this.distanceTo(point);return d*d;}},{key:"distanceTo",value:function distanceTo(point){point=scratchVector$3.from(point);var delta=point.subtract(this.center);return Math.max(0,delta.len()-this.radius);}},{key:"intersectPlane",value:function intersectPlane(plane){var center=this.center;var radius=this.radius;var normal=plane.normal;var distanceToPlane=normal.dot(center)+plane.distance;if(distanceToPlane<-radius){return INTERSECTION.OUTSIDE;}if(distanceToPlane<radius){return INTERSECTION.INTERSECTING;}return INTERSECTION.INSIDE;}}]);return BoundingSphere;}();var scratchVector3=new Vector3$1();var scratchOffset=new Vector3$1();var scratchVectorU=new Vector3$1();var scratchVectorV=new Vector3$1();var scratchVectorW=new Vector3$1();var scratchCorner=new Vector3$1();var scratchToCenter=new Vector3$1();var MATRIX3={COLUMN0ROW0:0,COLUMN0ROW1:1,COLUMN0ROW2:2,COLUMN1ROW0:3,COLUMN1ROW1:4,COLUMN1ROW2:5,COLUMN2ROW0:6,COLUMN2ROW1:7,COLUMN2ROW2:8};var OrientedBoundingBox=/*#__PURE__*/function(){function OrientedBoundingBox(){var center=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[0,0,0];var halfAxes=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0,0,0,0,0,0,0];_classCallCheck(this,OrientedBoundingBox);this.center=new Vector3$1().from(center);this.halfAxes=new Matrix3(halfAxes);}_createClass(OrientedBoundingBox,[{key:"halfSize",get:function get(){var xAxis=this.halfAxes.getColumn(0);var yAxis=this.halfAxes.getColumn(1);var zAxis=this.halfAxes.getColumn(2);return [new Vector3$1(xAxis).len(),new Vector3$1(yAxis).len(),new Vector3$1(zAxis).len()];}},{key:"quaternion",get:function get(){var xAxis=this.halfAxes.getColumn(0);var yAxis=this.halfAxes.getColumn(1);var zAxis=this.halfAxes.getColumn(2);var normXAxis=new Vector3$1(xAxis).normalize();var normYAxis=new Vector3$1(yAxis).normalize();var normZAxis=new Vector3$1(zAxis).normalize();return new Quaternion().fromMatrix3(new Matrix3([].concat(_toConsumableArray(normXAxis),_toConsumableArray(normYAxis),_toConsumableArray(normZAxis))));}},{key:"fromCenterHalfSizeQuaternion",value:function fromCenterHalfSizeQuaternion(center,halfSize,quaternion){var quaternionObject=new Quaternion(quaternion);var directionsMatrix=new Matrix3().fromQuaternion(quaternionObject);directionsMatrix[0]=directionsMatrix[0]*halfSize[0];directionsMatrix[1]=directionsMatrix[1]*halfSize[0];directionsMatrix[2]=directionsMatrix[2]*halfSize[0];directionsMatrix[3]=directionsMatrix[3]*halfSize[1];directionsMatrix[4]=directionsMatrix[4]*halfSize[1];directionsMatrix[5]=directionsMatrix[5]*halfSize[1];directionsMatrix[6]=directionsMatrix[6]*halfSize[2];directionsMatrix[7]=directionsMatrix[7]*halfSize[2];directionsMatrix[8]=directionsMatrix[8]*halfSize[2];this.center=new Vector3$1().from(center);this.halfAxes=directionsMatrix;return this;}},{key:"clone",value:function clone(){return new OrientedBoundingBox(this.center,this.halfAxes);}},{key:"equals",value:function equals(right){return this===right||Boolean(right)&&this.center.equals(right.center)&&this.halfAxes.equals(right.halfAxes);}},{key:"getBoundingSphere",value:function getBoundingSphere(){var result=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new BoundingSphere();var halfAxes=this.halfAxes;var u=halfAxes.getColumn(0,scratchVectorU);var v=halfAxes.getColumn(1,scratchVectorV);var w=halfAxes.getColumn(2,scratchVectorW);var cornerVector=scratchVector3.copy(u).add(v).add(w);result.center.copy(this.center);result.radius=cornerVector.magnitude();return result;}},{key:"intersectPlane",value:function intersectPlane(plane){var center=this.center;var normal=plane.normal;var halfAxes=this.halfAxes;var normalX=normal.x;var normalY=normal.y;var normalZ=normal.z;var radEffective=Math.abs(normalX*halfAxes[MATRIX3.COLUMN0ROW0]+normalY*halfAxes[MATRIX3.COLUMN0ROW1]+normalZ*halfAxes[MATRIX3.COLUMN0ROW2])+Math.abs(normalX*halfAxes[MATRIX3.COLUMN1ROW0]+normalY*halfAxes[MATRIX3.COLUMN1ROW1]+normalZ*halfAxes[MATRIX3.COLUMN1ROW2])+Math.abs(normalX*halfAxes[MATRIX3.COLUMN2ROW0]+normalY*halfAxes[MATRIX3.COLUMN2ROW1]+normalZ*halfAxes[MATRIX3.COLUMN2ROW2]);var distanceToPlane=normal.dot(center)+plane.distance;if(distanceToPlane<=-radEffective){return INTERSECTION.OUTSIDE;}else if(distanceToPlane>=radEffective){return INTERSECTION.INSIDE;}return INTERSECTION.INTERSECTING;}},{key:"distanceTo",value:function distanceTo(point){return Math.sqrt(this.distanceSquaredTo(point));}},{key:"distanceSquaredTo",value:function distanceSquaredTo(point){var offset=scratchOffset.from(point).subtract(this.center);var halfAxes=this.halfAxes;var u=halfAxes.getColumn(0,scratchVectorU);var v=halfAxes.getColumn(1,scratchVectorV);var w=halfAxes.getColumn(2,scratchVectorW);var uHalf=u.magnitude();var vHalf=v.magnitude();var wHalf=w.magnitude();u.normalize();v.normalize();w.normalize();var distanceSquared=0.0;var d;d=Math.abs(offset.dot(u))-uHalf;if(d>0){distanceSquared+=d*d;}d=Math.abs(offset.dot(v))-vHalf;if(d>0){distanceSquared+=d*d;}d=Math.abs(offset.dot(w))-wHalf;if(d>0){distanceSquared+=d*d;}return distanceSquared;}},{key:"computePlaneDistances",value:function computePlaneDistances(position,direction){var result=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[-0,-0];var minDist=Number.POSITIVE_INFINITY;var maxDist=Number.NEGATIVE_INFINITY;var center=this.center;var halfAxes=this.halfAxes;var u=halfAxes.getColumn(0,scratchVectorU);var v=halfAxes.getColumn(1,scratchVectorV);var w=halfAxes.getColumn(2,scratchVectorW);var corner=scratchCorner.copy(u).add(v).add(w).add(center);var toCenter=scratchToCenter.copy(corner).subtract(position);var mag=direction.dot(toCenter);minDist=Math.min(mag,minDist);maxDist=Math.max(mag,maxDist);corner.copy(center).add(u).add(v).subtract(w);toCenter.copy(corner).subtract(position);mag=direction.dot(toCenter);minDist=Math.min(mag,minDist);maxDist=Math.max(mag,maxDist);corner.copy(center).add(u).subtract(v).add(w);toCenter.copy(corner).subtract(position);mag=direction.dot(toCenter);minDist=Math.min(mag,minDist);maxDist=Math.max(mag,maxDist);corner.copy(center).add(u).subtract(v).subtract(w);toCenter.copy(corner).subtract(position);mag=direction.dot(toCenter);minDist=Math.min(mag,minDist);maxDist=Math.max(mag,maxDist);center.copy(corner).subtract(u).add(v).add(w);toCenter.copy(corner).subtract(position);mag=direction.dot(toCenter);minDist=Math.min(mag,minDist);maxDist=Math.max(mag,maxDist);center.copy(corner).subtract(u).add(v).subtract(w);toCenter.copy(corner).subtract(position);mag=direction.dot(toCenter);minDist=Math.min(mag,minDist);maxDist=Math.max(mag,maxDist);center.copy(corner).subtract(u).subtract(v).add(w);toCenter.copy(corner).subtract(position);mag=direction.dot(toCenter);minDist=Math.min(mag,minDist);maxDist=Math.max(mag,maxDist);center.copy(corner).subtract(u).subtract(v).subtract(w);toCenter.copy(corner).subtract(position);mag=direction.dot(toCenter);minDist=Math.min(mag,minDist);maxDist=Math.max(mag,maxDist);result[0]=minDist;result[1]=maxDist;return result;}},{key:"transform",value:function transform(transformation){this.center.transformAsPoint(transformation);var xAxis=this.halfAxes.getColumn(0,scratchVectorU);xAxis.transformAsPoint(transformation);var yAxis=this.halfAxes.getColumn(1,scratchVectorV);yAxis.transformAsPoint(transformation);var zAxis=this.halfAxes.getColumn(2,scratchVectorW);zAxis.transformAsPoint(transformation);this.halfAxes=new Matrix3([].concat(_toConsumableArray(xAxis),_toConsumableArray(yAxis),_toConsumableArray(zAxis)));return this;}},{key:"getTransform",value:function getTransform(){throw new Error('not implemented');}}]);return OrientedBoundingBox;}();var scratchPosition$1=new Vector3$1();var scratchNormal$1=new Vector3$1();var Plane=/*#__PURE__*/function(){function Plane(){var normal=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[0,0,1];var distance=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;_classCallCheck(this,Plane);this.normal=new Vector3$1();this.distance=-0;this.fromNormalDistance(normal,distance);}_createClass(Plane,[{key:"fromNormalDistance",value:function fromNormalDistance(normal,distance){assert$4(Number.isFinite(distance));this.normal.from(normal).normalize();this.distance=distance;return this;}},{key:"fromPointNormal",value:function fromPointNormal(point,normal){point=scratchPosition$1.from(point);this.normal.from(normal).normalize();var distance=-this.normal.dot(point);this.distance=distance;return this;}},{key:"fromCoefficients",value:function fromCoefficients(a,b,c,d){this.normal.set(a,b,c);assert$4(_equals(this.normal.len(),1));this.distance=d;return this;}},{key:"clone",value:function clone(plane){return new Plane(this.normal,this.distance);}},{key:"equals",value:function equals(right){return _equals(this.distance,right.distance)&&_equals(this.normal,right.normal);}},{key:"getPointDistance",value:function getPointDistance(point){return this.normal.dot(point)+this.distance;}},{key:"transform",value:function transform(matrix4){var normal=scratchNormal$1.copy(this.normal).transformAsVector(matrix4).normalize();var point=this.normal.scale(-this.distance).transform(matrix4);return this.fromPointNormal(point,normal);}},{key:"projectPointOntoPlane",value:function projectPointOntoPlane(point){var result=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];point=scratchPosition$1.from(point);var pointDistance=this.getPointDistance(point);var scaledNormal=scratchNormal$1.copy(this.normal).scale(pointDistance);return point.subtract(scaledNormal).to(result);}}]);return Plane;}();var faces=[new Vector3$1([1,0,0]),new Vector3$1([0,1,0]),new Vector3$1([0,0,1])];var scratchPlaneCenter=new Vector3$1();var scratchPlaneNormal$1=new Vector3$1();new Plane(new Vector3$1(1.0,0.0,0.0),0.0);var CullingVolume=/*#__PURE__*/function(){function CullingVolume(){var planes=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];_classCallCheck(this,CullingVolume);this.planes=planes;assert$4(this.planes.every(function(plane){return plane instanceof Plane;}));}_createClass(CullingVolume,[{key:"fromBoundingSphere",value:function fromBoundingSphere(boundingSphere){this.planes.length=2*faces.length;var center=boundingSphere.center;var radius=boundingSphere.radius;var planeIndex=0;var _iterator14=_createForOfIteratorHelper$3(faces),_step14;try{for(_iterator14.s();!(_step14=_iterator14.n()).done;){var faceNormal=_step14.value;var plane0=this.planes[planeIndex];var plane1=this.planes[planeIndex+1];if(!plane0){plane0=this.planes[planeIndex]=new Plane();}if(!plane1){plane1=this.planes[planeIndex+1]=new Plane();}var plane0Center=scratchPlaneCenter.copy(faceNormal).scale(-radius).add(center);-faceNormal.dot(plane0Center);plane0.fromPointNormal(plane0Center,faceNormal);var plane1Center=scratchPlaneCenter.copy(faceNormal).scale(radius).add(center);var negatedFaceNormal=scratchPlaneNormal$1.copy(faceNormal).negate();-negatedFaceNormal.dot(plane1Center);plane1.fromPointNormal(plane1Center,negatedFaceNormal);planeIndex+=2;}}catch(err){_iterator14.e(err);}finally{_iterator14.f();}return this;}},{key:"computeVisibility",value:function computeVisibility(boundingVolume){assert$4(boundingVolume);var intersect=INTERSECTION.INSIDE;var _iterator15=_createForOfIteratorHelper$3(this.planes),_step15;try{for(_iterator15.s();!(_step15=_iterator15.n()).done;){var plane=_step15.value;var result=boundingVolume.intersectPlane(plane);switch(result){case INTERSECTION.OUTSIDE:return INTERSECTION.OUTSIDE;case INTERSECTION.INTERSECTING:intersect=INTERSECTION.INTERSECTING;break;}}}catch(err){_iterator15.e(err);}finally{_iterator15.f();}return intersect;}},{key:"computeVisibilityWithPlaneMask",value:function computeVisibilityWithPlaneMask(boundingVolume,parentPlaneMask){assert$4(boundingVolume,'boundingVolume is required.');assert$4(Number.isFinite(parentPlaneMask),'parentPlaneMask is required.');if(parentPlaneMask===CullingVolume.MASK_OUTSIDE||parentPlaneMask===CullingVolume.MASK_INSIDE){return parentPlaneMask;}var mask=CullingVolume.MASK_INSIDE;var planes=this.planes;for(var k=0;k<this.planes.length;++k){var flag=k<31?1<<k:0;if(k<31&&(parentPlaneMask&flag)===0){continue;}var plane=planes[k];var result=boundingVolume.intersectPlane(plane);if(result===INTERSECTION.OUTSIDE){return CullingVolume.MASK_OUTSIDE;}else if(result===INTERSECTION.INTERSECTING){mask|=flag;}}return mask;}}],[{key:"MASK_OUTSIDE",get:function get(){return 0xffffffff;}},{key:"MASK_INSIDE",get:function get(){return 0x00000000;}},{key:"MASK_INDETERMINATE",get:function get(){return 0x7fffffff;}}]);return CullingVolume;}();var scratchPlaneUpVector=new Vector3$1();var scratchPlaneRightVector=new Vector3$1();var scratchPlaneNearCenter=new Vector3$1();var scratchPlaneFarCenter=new Vector3$1();var scratchPlaneNormal=new Vector3$1();var PerspectiveOffCenterFrustum=/*#__PURE__*/function(){function PerspectiveOffCenterFrustum(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};_classCallCheck(this,PerspectiveOffCenterFrustum);options=_objectSpread$3({near:1.0,far:500000000.0},options);this.left=options.left;this._left=undefined;this.right=options.right;this._right=undefined;this.top=options.top;this._top=undefined;this.bottom=options.bottom;this._bottom=undefined;this.near=options.near;this._near=this.near;this.far=options.far;this._far=this.far;this._cullingVolume=new CullingVolume([new Plane(),new Plane(),new Plane(),new Plane(),new Plane(),new Plane()]);this._perspectiveMatrix=new Matrix4();this._infinitePerspective=new Matrix4();}_createClass(PerspectiveOffCenterFrustum,[{key:"clone",value:function clone(){return new PerspectiveOffCenterFrustum({right:this.right,left:this.left,top:this.top,bottom:this.bottom,near:this.near,far:this.far});}},{key:"equals",value:function equals(other){return other&&other instanceof PerspectiveOffCenterFrustum&&this.right===other.right&&this.left===other.left&&this.top===other.top&&this.bottom===other.bottom&&this.near===other.near&&this.far===other.far;}},{key:"projectionMatrix",get:function get(){update$1(this);return this._perspectiveMatrix;}},{key:"infiniteProjectionMatrix",get:function get(){update$1(this);return this._infinitePerspective;}},{key:"computeCullingVolume",value:function computeCullingVolume(position,direction,up){assert$4(position,'position is required.');assert$4(direction,'direction is required.');assert$4(up,'up is required.');var planes=this._cullingVolume.planes;up=scratchPlaneUpVector.copy(up).normalize();var right=scratchPlaneRightVector.copy(direction).cross(up).normalize();var nearCenter=scratchPlaneNearCenter.copy(direction).multiplyByScalar(this.near).add(position);var farCenter=scratchPlaneFarCenter.copy(direction).multiplyByScalar(this.far).add(position);var normal=scratchPlaneNormal;normal.copy(right).multiplyByScalar(this.left).add(nearCenter).subtract(position).cross(up);planes[0].fromPointNormal(position,normal);normal.copy(right).multiplyByScalar(this.right).add(nearCenter).subtract(position).cross(up).negate();planes[1].fromPointNormal(position,normal);normal.copy(up).multiplyByScalar(this.bottom).add(nearCenter).subtract(position).cross(right).negate();planes[2].fromPointNormal(position,normal);normal.copy(up).multiplyByScalar(this.top).add(nearCenter).subtract(position).cross(right);planes[3].fromPointNormal(position,normal);normal=new Vector3$1().copy(direction);planes[4].fromPointNormal(nearCenter,normal);normal.negate();planes[5].fromPointNormal(farCenter,normal);return this._cullingVolume;}},{key:"getPixelDimensions",value:function getPixelDimensions(drawingBufferWidth,drawingBufferHeight,distance,result){update$1(this);assert$4(Number.isFinite(drawingBufferWidth)&&Number.isFinite(drawingBufferHeight));assert$4(drawingBufferWidth>0);assert$4(drawingBufferHeight>0);assert$4(distance>0);assert$4(result);var inverseNear=1.0/this.near;var tanTheta=this.top*inverseNear;var pixelHeight=2.0*distance*tanTheta/drawingBufferHeight;tanTheta=this.right*inverseNear;var pixelWidth=2.0*distance*tanTheta/drawingBufferWidth;result.x=pixelWidth;result.y=pixelHeight;return result;}}]);return PerspectiveOffCenterFrustum;}();function update$1(frustum){assert$4(Number.isFinite(frustum.right)&&Number.isFinite(frustum.left)&&Number.isFinite(frustum.top)&&Number.isFinite(frustum.bottom)&&Number.isFinite(frustum.near)&&Number.isFinite(frustum.far));var top=frustum.top,bottom=frustum.bottom,right=frustum.right,left=frustum.left,near=frustum.near,far=frustum.far;if(top!==frustum._top||bottom!==frustum._bottom||left!==frustum._left||right!==frustum._right||near!==frustum._near||far!==frustum._far){assert$4(frustum.near>0&&frustum.near<frustum.far,'near must be greater than zero and less than far.');frustum._left=left;frustum._right=right;frustum._top=top;frustum._bottom=bottom;frustum._near=near;frustum._far=far;frustum._perspectiveMatrix=new Matrix4().frustum({left,right,bottom,top,near,far});frustum._infinitePerspective=new Matrix4().frustum({left,right,bottom,top,near,far:Infinity});}}var defined$4=function defined$4(val){return val!==null&&typeof val!=='undefined';};var PerspectiveFrustum=/*#__PURE__*/function(){function PerspectiveFrustum(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};_classCallCheck(this,PerspectiveFrustum);options=_objectSpread$3({near:1.0,far:500000000.0,xOffset:0.0,yOffset:0.0},options);this.type=options.type;//add
  42784. this._offCenterFrustum=new PerspectiveOffCenterFrustum();this.fov=options.fov;this._fov=undefined;this._fovy=undefined;this._sseDenominator=undefined;this.aspectRatio=options.aspectRatio;this._aspectRatio=undefined;this.near=options.near;this._near=this.near;this.far=options.far;this._far=this.far;this.xOffset=options.xOffset;this._xOffset=this.xOffset;this.yOffset=options.yOffset;this._yOffset=this.yOffset;}_createClass(PerspectiveFrustum,[{key:"clone",value:function clone(){return new PerspectiveFrustum({aspectRatio:this.aspectRatio,fov:this.fov,near:this.near,far:this.far});}},{key:"equals",value:function equals(other){if(!defined$4(other)||!(other instanceof PerspectiveFrustum)){return false;}update(this);update(other);return this.fov===other.fov&&this.aspectRatio===other.aspectRatio&&this.near===other.near&&this.far===other.far&&this._offCenterFrustum.equals(other._offCenterFrustum);}},{key:"projectionMatrix",get:function get(){update(this);return this._offCenterFrustum.projectionMatrix;}},{key:"infiniteProjectionMatrix",get:function get(){update(this);return this._offCenterFrustum.infiniteProjectionMatrix;}},{key:"fovy",get:function get(){update(this);return this._fovy;}},{key:"sseDenominator",get:function get(){update(this);return this._sseDenominator;}},{key:"computeCullingVolume",value:function computeCullingVolume(position,direction,up){update(this);return this._offCenterFrustum.computeCullingVolume(position,direction,up);}},{key:"getPixelDimensions",value:function getPixelDimensions(drawingBufferWidth,drawingBufferHeight,distance,result){update(this);return this._offCenterFrustum.getPixelDimensions(drawingBufferWidth,drawingBufferHeight,distance,result);}}]);return PerspectiveFrustum;}();function update(frustum){assert$4(Number.isFinite(frustum.fov)&&Number.isFinite(frustum.aspectRatio)&&Number.isFinite(frustum.near)&&Number.isFinite(frustum.far));var f=frustum._offCenterFrustum;if(frustum.fov!==frustum._fov||frustum.aspectRatio!==frustum._aspectRatio||frustum.near!==frustum._near||frustum.far!==frustum._far||frustum.xOffset!==frustum._xOffset||frustum.yOffset!==frustum._yOffset){assert$4(frustum.fov>=0&&frustum.fov<Math.PI);assert$4(frustum.aspectRatio>0);assert$4(frustum.near>=0&&frustum.near<frustum.far);frustum._aspectRatio=frustum.aspectRatio;frustum._fov=frustum.fov;frustum._fovy=frustum.aspectRatio<=1?frustum.fov:Math.atan(Math.tan(frustum.fov*0.5)/frustum.aspectRatio)*2.0;frustum._near=frustum.near;frustum._far=frustum.far;frustum._sseDenominator=2.0*Math.tan(0.5*frustum._fovy);frustum._xOffset=frustum.xOffset;frustum._yOffset=frustum.yOffset;f.top=frustum.near*Math.tan(0.5*frustum._fovy);f.bottom=-f.top;f.right=frustum.aspectRatio*f.top;f.left=-f.right;f.near=frustum.near;f.far=frustum.far;f.right+=frustum.xOffset;f.left+=frustum.xOffset;f.top+=frustum.yOffset;f.bottom+=frustum.yOffset;}}new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Matrix3();new Matrix3();new Matrix3();new Matrix3();new Matrix3();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();new Matrix3();({diagonal:new Matrix3(),unitary:new Matrix3()});var scratchVector$2=new Vector3$1();var scratchPosition=new Vector3$1();var cullingVolume=new CullingVolume([new Plane(),new Plane(),new Plane(),new Plane(),new Plane(),new Plane()]);function getFrameState(viewport,frameNumber){var cameraDirection=viewport.cameraDirection,cameraUp=viewport.cameraUp,height=viewport.height;var metersPerUnit=viewport.distanceScales.metersPerUnit;var viewportCenterCartographic=viewport.unprojectPosition(viewport.center);var viewportCenterCartesian=Ellipsoid.WGS84.cartographicToCartesian(viewportCenterCartographic,new Vector3$1());var enuToFixedTransform=Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);var cameraPositionCartographic=viewport.unprojectPosition(viewport.cameraPosition);var cameraPositionCartesian=Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic,new Vector3$1());var cameraDirectionCartesian=new Vector3$1(enuToFixedTransform.transformAsVector(new Vector3$1(cameraDirection).scale(metersPerUnit))).normalize();var cameraUpCartesian=new Vector3$1(enuToFixedTransform.transformAsVector(new Vector3$1(cameraUp).scale(metersPerUnit))).normalize();commonSpacePlanesToWGS84(viewport,viewportCenterCartesian);return {camera:{position:cameraPositionCartesian,direction:cameraDirectionCartesian,up:cameraUpCartesian},viewport,height,cullingVolume,frameNumber,sseDenominator:1.15};}function commonSpacePlanesToWGS84(viewport,viewportCenterCartesian){var frustumPlanes=viewport.getFrustumPlanes();var i=0;for(var dir in frustumPlanes){var plane=frustumPlanes[dir];var distanceToCenter=plane.normal.dot(viewport.center);scratchPosition.copy(plane.normal).scale(plane.distance-distanceToCenter).add(viewport.center);var cartographicPos=viewport.unprojectPosition(scratchPosition);var cartesianPos=Ellipsoid.WGS84.cartographicToCartesian(cartographicPos,new Vector3$1());cullingVolume.planes[i++].fromPointNormal(cartesianPos,scratchVector$2.copy(viewportCenterCartesian).subtract(cartesianPos));}}var WGS84_RADIUS_X=6378137.0;var WGS84_RADIUS_Y=6378137.0;var WGS84_RADIUS_Z=6356752.3142451793;var scratchVector$1=new Vector3$1();function getZoomFromBoundingVolume(boundingVolume){var halfAxes=boundingVolume.halfAxes,radius=boundingVolume.radius,width=boundingVolume.width,height=boundingVolume.height;if(halfAxes){var obbSize=getObbSize(halfAxes);return Math.log2(WGS84_RADIUS_Z/obbSize);}else if(radius){return Math.log2(WGS84_RADIUS_Z/radius);}else if(height&&width){var zoomX=Math.log2(WGS84_RADIUS_X/width);var zoomY=Math.log2(WGS84_RADIUS_Y/height);return (zoomX+zoomY)/2;}return 1;}function getObbSize(halfAxes){halfAxes.getColumn(0,scratchVector$1);var axeY=halfAxes.getColumn(1);var axeZ=halfAxes.getColumn(2);var farthestVertex=scratchVector$1.add(axeY).add(axeZ);var size=farthestVertex.len();return size;}var TILE_CONTENT_STATE={UNLOADED:0,LOADING:1,PROCESSING:2,READY:3,EXPIRED:4,FAILED:5};var TILE_REFINEMENT={ADD:1,REPLACE:2};var TILE_TYPE={EMPTY:'empty',SCENEGRAPH:'scenegraph',POINTCLOUD:'pointcloud',MESH:'mesh'};var TILESET_TYPE={I3S:'I3S',TILES3D:'TILES3D'};var LOD_METRIC_TYPE={GEOMETRIC_ERROR:'geometricError',MAX_SCREEN_THRESHOLD:'maxScreenThreshold'};var TILE3D_OPTIMIZATION_HINT={NOT_COMPUTED:-1,USE_OPTIMIZATION:1,SKIP_OPTIMIZATION:0};function defined$3(x){return x!==undefined&&x!==null;}var scratchScale=new Vector3$1();var scratchNorthWest=new Vector3$1();var scratchSouthEast=new Vector3$1();function createBoundingVolume(boundingVolumeHeader,transform,result){assert$7(boundingVolumeHeader,'3D Tile: boundingVolume must be defined');if(boundingVolumeHeader.box){return createBox(boundingVolumeHeader.box,transform,result);}if(boundingVolumeHeader.region){var _boundingVolumeHeader=_slicedToArray(boundingVolumeHeader.region,6),west=_boundingVolumeHeader[0],south=_boundingVolumeHeader[1],east=_boundingVolumeHeader[2],north=_boundingVolumeHeader[3],minHeight=_boundingVolumeHeader[4],maxHeight=_boundingVolumeHeader[5];var northWest=Ellipsoid.WGS84.cartographicToCartesian([degrees(west),degrees(north),minHeight],scratchNorthWest);var southEast=Ellipsoid.WGS84.cartographicToCartesian([degrees(east),degrees(south),maxHeight],scratchSouthEast);var centerInCartesian=new Vector3$1().addVectors(northWest,southEast).multiplyScalar(0.5);var radius=new Vector3$1().subVectors(northWest,southEast).len()/2.0;return createSphere([centerInCartesian[0],centerInCartesian[1],centerInCartesian[2],radius],new Matrix4());}if(boundingVolumeHeader.sphere){return createSphere(boundingVolumeHeader.sphere,transform,result);}throw new Error('3D Tile: boundingVolume must contain a sphere, region, or box');}function createBox(box,transform,result){var center=new Vector3$1(box[0],box[1],-box[2]);// !zeg改 box根据tileContent做调整
  42785. transform.transform(center,center);var origin=[];if(box.length===10){var halfSize=box.slice(3,6);var quaternion=new Quaternion();quaternion.fromArray(box,6);var x=new Vector3$1([1,0,0]);var y=new Vector3$1([0,1,0]);var z=new Vector3$1([0,0,1]);x.transformByQuaternion(quaternion);x.scale(halfSize[0]);y.transformByQuaternion(quaternion);y.scale(halfSize[1]);z.transformByQuaternion(quaternion);z.scale(halfSize[2]);origin=[].concat(_toConsumableArray(x.toArray()),_toConsumableArray(y.toArray()),_toConsumableArray(z.toArray()));}else {origin=[].concat(_toConsumableArray(box.slice(3,6)),_toConsumableArray(box.slice(6,9)),_toConsumableArray(box.slice(9,12)));}var xAxis=transform.transformAsVector(origin.slice(0,3));var yAxis=transform.transformAsVector(origin.slice(3,6));var zAxis=transform.transformAsVector(origin.slice(6,9));var halfAxes=new Matrix3([xAxis[0],xAxis[1],xAxis[2],yAxis[0],yAxis[1],yAxis[2],zAxis[0],zAxis[1],zAxis[2]]);if(defined$3(result)){result.center=center;result.halfAxes=halfAxes;return result;}return new OrientedBoundingBox(center,halfAxes);}function createSphere(sphere,transform,result){var center=new Vector3$1(sphere[0],sphere[1],sphere[2]);transform.transform(center,center);var scale=transform.getScale(scratchScale);var uniformScale=Math.max(Math.max(scale[0],scale[1]),scale[2]);var radius=sphere[3]*uniformScale;if(defined$3(result)){result.center=center;result.radius=radius;return result;}return new BoundingSphere(center,radius);}new Vector3$1();new Vector3$1();new Matrix4();new Vector3$1();new Vector3$1();new Vector3$1();function fog(distanceToCamera,density){var scalar=distanceToCamera*density;return 1.0-Math.exp(-(scalar*scalar));}function getDynamicScreenSpaceError(tileset,distanceToCamera){if(tileset.dynamicScreenSpaceError&&tileset.dynamicScreenSpaceErrorComputedDensity){var density=tileset.dynamicScreenSpaceErrorComputedDensity;var factor=tileset.dynamicScreenSpaceErrorFactor;var dynamicError=fog(distanceToCamera,density)*factor;return dynamicError;}return 0;}function getTiles3DScreenSpaceError(tile,frameState,useParentLodMetric){var tileset=tile.tileset;var parentLodMetricValue=tile.parent&&tile.parent.lodMetricValue||tile.lodMetricValue;var lodMetricValue=useParentLodMetric?parentLodMetricValue:tile.lodMetricValue;if(lodMetricValue===0.0){return 0.0;}var distance=frameState.camera.type=='OrthographicCamera'?1:Math.max(tile._distanceToCamera,1e-7);//xzw 改
  42786. var height=frameState.height,sseDenominator=frameState.sseDenominator;var viewDistanceScale=tileset.options.viewDistanceScale;// 屏幕空间误差SSE = (几何误差geometricError * canvas高度) / (相机到tile的距离 * 相机指数)
  42787. var error=lodMetricValue*height*(viewDistanceScale||1.0)/(distance*sseDenominator);error-=getDynamicScreenSpaceError(tileset,distance);return error;}function getLodStatus(tile,frameState){if(tile.lodMetricValue===0||isNaN(tile.lodMetricValue)){return 'DIG';}var screenSize=2*getProjectedRadius(tile,frameState);if(screenSize<2){return 'OUT';}if(!tile.header.children||screenSize<=tile.lodMetricValue){return 'DRAW';}else if(tile.header.children){return 'DIG';}return 'OUT';}function getProjectedRadius(tile,frameState){var originalViewport=frameState.viewport;var ViewportClass=originalViewport.constructor;var longitude=originalViewport.longitude,latitude=originalViewport.latitude,height=originalViewport.height,width=originalViewport.width,bearing=originalViewport.bearing,zoom=originalViewport.zoom;var viewport=new ViewportClass({longitude,latitude,height,width,bearing,zoom,pitch:0});var mbsLat=tile.header.mbs[1];var mbsLon=tile.header.mbs[0];var mbsZ=tile.header.mbs[2];var mbsR=tile.header.mbs[3];var mbsCenterCartesian=_toConsumableArray(tile.boundingVolume.center);var cameraPositionCartographic=viewport.unprojectPosition(viewport.cameraPosition);var cameraPositionCartesian=Ellipsoid.WGS84.cartographicToCartesian(cameraPositionCartographic,new Vector3$1());var toEye=new Vector3$1(cameraPositionCartesian).subtract(mbsCenterCartesian).normalize();var enuToCartesianMatrix=new Matrix4();Ellipsoid.WGS84.eastNorthUpToFixedFrame(mbsCenterCartesian,enuToCartesianMatrix);var cartesianToEnuMatrix=new Matrix4(enuToCartesianMatrix).invert();var cameraPositionEnu=new Vector3$1(cameraPositionCartesian).transform(cartesianToEnuMatrix);var projection=Math.sqrt(cameraPositionEnu[0]*cameraPositionEnu[0]+cameraPositionEnu[1]*cameraPositionEnu[1]);var extraZ=projection*projection/cameraPositionEnu[2];var extraVertexEnu=new Vector3$1([cameraPositionEnu[0],cameraPositionEnu[1],extraZ]);var extraVertexCartesian=extraVertexEnu.transform(enuToCartesianMatrix);var extraVectorCartesian=new Vector3$1(extraVertexCartesian).subtract(mbsCenterCartesian).normalize();var radiusVector=toEye.cross(extraVectorCartesian).normalize().scale(mbsR);var sphereMbsBorderVertexCartesian=new Vector3$1(mbsCenterCartesian).add(radiusVector);var sphereMbsBorderVertexCartographic=Ellipsoid.WGS84.cartesianToCartographic(sphereMbsBorderVertexCartesian);var projectedOrigin=viewport.project([mbsLon,mbsLat,mbsZ]);var projectedMbsBorderVertex=viewport.project(sphereMbsBorderVertexCartographic);var projectedRadius=new Vector3$1(projectedOrigin).subtract(projectedMbsBorderVertex).magnitude();return projectedRadius;}function get3dTilesOptions(tileset){return {assetGltfUpAxis:tileset.asset&&tileset.asset.gltfUpAxis||'Y'};}var ManagedArray=/*#__PURE__*/function(){function ManagedArray(){var length=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0;_classCallCheck(this,ManagedArray);_defineProperty(this,'_map',new Map());_defineProperty(this,'_array',void 0);_defineProperty(this,'_length',void 0);this._array=new Array(length);this._length=length;}_createClass(ManagedArray,[{key:"length",get:function get(){return this._length;},set:function set(length){this._length=length;if(length>this._array.length){this._array.length=length;}}},{key:"values",get:function get(){return this._array;}},{key:"get",value:function get(index){assert$7(index<this._array.length);return this._array[index];}},{key:"set",value:function set(index,element){assert$7(index>=0);if(index>=this.length){this.length=index+1;}if(this._map.has(this._array[index])){this._map.delete(this._array[index]);}this._array[index]=element;this._map.set(element,index);}},{key:"delete",value:function _delete(element){var index=this._map.get(element);if(index>=0){this._array.splice(index,1);this._map.delete(element);this.length--;}}},{key:"peek",value:function peek(){return this._array[this._length-1];}},{key:"push",value:function push(element){if(!this._map.has(element)){var index=this.length++;this._array[index]=element;this._map.set(element,index);}}},{key:"pop",value:function pop(){var element=this._array[--this.length];this._map.delete(element);return element;}},{key:"reserve",value:function reserve(length){assert$7(length>=0);if(length>this._array.length){this._array.length=length;}}},{key:"resize",value:function resize(length){assert$7(length>=0);this.length=length;}},{key:"trim",value:function trim(length){if(length===null||length===undefined){length=this.length;}this._array.length=length;}},{key:"reset",value:function reset(){this._array=[];this._map=new Map();this._length=0;}},{key:"find",value:function find(target){return this._map.has(target);}}]);return ManagedArray;}();var DEFAULT_PROPS$1={loadSiblings:false,skipLevelOfDetail:false,maximumScreenSpaceError:2,updateTransforms:true,onTraversalEnd:function onTraversalEnd(){},viewportTraversersMap:{},basePath:''};var TilesetTraverser=/*#__PURE__*/function(){function TilesetTraverser(options){_classCallCheck(this,TilesetTraverser);_defineProperty(this,'options',void 0);_defineProperty(this,'root',void 0);_defineProperty(this,'requestedTiles',void 0);_defineProperty(this,'selectedTiles',void 0);_defineProperty(this,'emptyTiles',void 0);_defineProperty(this,'_traversalStack',void 0);_defineProperty(this,'_emptyTraversalStack',void 0);_defineProperty(this,'_frameNumber',void 0);this.options=_objectSpread$3(_objectSpread$3({},DEFAULT_PROPS$1),options);this._traversalStack=new ManagedArray();this._emptyTraversalStack=new ManagedArray();this._frameNumber=null;this.root=null;this.selectedTiles={};this.requestedTiles={};this.emptyTiles={};}// 每次tileload都会遍历一次root
  42788. _createClass(TilesetTraverser,[{key:"traverse",value:function traverse(root,frameState,options){this.root=root;this.options=_objectSpread$3(_objectSpread$3({},this.options),options);this.reset();this.updateTile(root,frameState);this._frameNumber=frameState.frameNumber;this.executeTraversal(root,frameState);}},{key:"reset",value:function reset(){this.requestedTiles={};this.selectedTiles={};this.emptyTiles={};this._traversalStack.reset();this._emptyTraversalStack.reset();}// 遍历root
  42789. },{key:"executeTraversal",value:function executeTraversal(root,frameState){var stack=this._traversalStack;root._selectionDepth=1;stack.push(root);while(stack.length>0){var tile=stack.pop();var shouldRefine=false;// !zeg改 判断tile所在floor是否隐藏,如果是,则只显示最低精度不细化(tile.floorIndex为void 0,即代表该tile没有glb模型)
  42790. var isFloorShow=tile.tileset.options.currentFloorId=='all'||tile.floorIndex==void 0||tile.floorIndex==tile.tileset.options.currentFloorId;// 循环遍历子tile
  42791. if(this.canTraverse(tile,frameState)&&isFloorShow){this.updateChildTiles(tile,frameState);// 根据isVisibleAndInRequestVolume判断是否select
  42792. shouldRefine=this.updateAndPushChildren(tile,frameState,stack,tile.hasRenderContent?tile._selectionDepth+1:tile._selectionDepth);}var parent=tile.parent;var parentRefines=Boolean(!parent||parent._shouldRefine);var stoppedRefining=!shouldRefine;if(!tile.hasRenderContent){this.emptyTiles[tile.id]=tile;this.loadTile(tile,frameState);if(stoppedRefining){this.selectTile(tile,frameState);}}else if(tile.refine===TILE_REFINEMENT.ADD){this.loadTile(tile,frameState);this.selectTile(tile,frameState);}else if(tile.refine===TILE_REFINEMENT.REPLACE){this.loadTile(tile,frameState);if(stoppedRefining){this.selectTile(tile,frameState);}}this.touchTile(tile,frameState);tile._shouldRefine=shouldRefine&&parentRefines;}this.options.onTraversalEnd(frameState);}},{key:"updateChildTiles",value:function updateChildTiles(tile,frameState){var children=tile.children;var _iterator16=_createForOfIteratorHelper$3(children),_step16;try{for(_iterator16.s();!(_step16=_iterator16.n()).done;){var child=_step16.value;this.updateTile(child,frameState);}}catch(err){_iterator16.e(err);}finally{_iterator16.f();}return true;}},{key:"updateAndPushChildren",value:function updateAndPushChildren(tile,frameState,stack,depth){var _this$options=this.options,loadSiblings=_this$options.loadSiblings,skipLevelOfDetail=_this$options.skipLevelOfDetail;var children=tile.children;children.sort(this.compareDistanceToCamera.bind(this)).reverse();// !zeg改 从近到远加载tile
  42793. var checkRefines=tile.refine===TILE_REFINEMENT.REPLACE&&tile.hasRenderContent&&!skipLevelOfDetail;var hasVisibleChild=false;var refines=true;var _iterator17=_createForOfIteratorHelper$3(children),_step17;try{for(_iterator17.s();!(_step17=_iterator17.n()).done;){var child=_step17.value;child._selectionDepth=depth;// !zeg改 全部显示子tile,isVisibleAndInRequestVolume只判断是否选中。如果在这里过滤视野外tile,模型会需要重新加载
  42794. if(stack.find(child)){stack.delete(child);}stack.push(child);// 如果hasVisibleChild全都不为true,则tile全在可视范围外,不会被selectTile
  42795. if(child.isVisibleAndInRequestVolume){hasVisibleChild=true;}else if(checkRefines||loadSiblings){this.loadTile(child,frameState);this.touchTile(child,frameState);}if(checkRefines){var childRefines=void 0;if(!child._inRequestVolume){childRefines=false;}else if(!child.hasRenderContent){childRefines=this.executeEmptyTraversal(child,frameState);}else {childRefines=child.contentAvailable;}refines=refines&&childRefines;if(!refines){return false;}}}}catch(err){_iterator17.e(err);}finally{_iterator17.f();}if(!hasVisibleChild){refines=false;}return refines;}},{key:"updateTile",value:function updateTile(tile,frameState){this.updateTileVisibility(tile,frameState);}},{key:"selectTile",value:function selectTile(tile,frameState){if(this.shouldSelectTile(tile)){tile._selectedFrame=frameState.frameNumber;this.selectedTiles[tile.id]=tile;}}},{key:"loadTile",value:function loadTile(tile,frameState){if(this.shouldLoadTile(tile)){tile._requestedFrame=frameState.frameNumber;tile._priority=tile._getPriority();this.requestedTiles[tile.id]=tile;}}},{key:"touchTile",value:function touchTile(tile,frameState){tile.tileset._cache.touch(tile);tile._touchedFrame=frameState.frameNumber;}// 判断是否遍历(即判断是否更新更精细的模型)
  42796. },{key:"canTraverse",value:function canTraverse(tile,frameState){var useParentMetric=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(!tile.hasChildren){return false;}// !zeg改 ios防崩 当模型体积大于10e5立方米时,不加载最精细那层tile(注意:如果当模型只有一层tile时,会加载不出模型,不过体积大于10e5一般不可能只有一层)
  42797. var modelSize=tile.tileset.options.modelSize;if(browser$1.detectIOS()&&modelSize&&modelSize.x*modelSize.y*modelSize.z>10e5){if(!tile.children[0].hasChildren){return false;}}if(tile.hasTilesetContent){return !tile.contentExpired;}// !zeg改 不判断可视范围,否则把rootTile移出再移回屏幕后,所有tile都将重新加载
  42798. // // 如果tile不在可视范围内,则不加载更精细的模型
  42799. // if (!ignoreVisibility && !tile.isVisibleAndInRequestVolume) {
  42800. // return false
  42801. // }
  42802. return this.shouldRefine(tile,frameState,useParentMetric);}},{key:"shouldLoadTile",value:function shouldLoadTile(tile){return tile.hasUnloadedContent||tile.contentExpired;}},{key:"shouldSelectTile",value:function shouldSelectTile(tile){return tile.contentAvailable&&!this.options.skipLevelOfDetail;}// 是否更新更精细的模型
  42803. },{key:"shouldRefine",value:function shouldRefine(tile,frameState,useParentMetric){if(tile.tileset.options.loadMaxLevelDirect){return true;//xzw add : 直接加载到最高清晰度,用于截图
  42804. }var screenSpaceError=tile._screenSpaceError;if(useParentMetric){screenSpaceError=tile.getScreenSpaceError(frameState,true);}// 距离越近,SSE越大
  42805. return screenSpaceError>this.options.maximumScreenSpaceError;}},{key:"updateTileVisibility",value:function updateTileVisibility(tile,frameState){var viewportIds=[];if(this.options.viewportTraversersMap){for(var key in this.options.viewportTraversersMap){var value=this.options.viewportTraversersMap[key];if(value===frameState.viewport.id){viewportIds.push(key);}}}else {viewportIds.push(frameState.viewport.id);}tile.updateVisibility(frameState,viewportIds);}},{key:"compareDistanceToCamera",value:function compareDistanceToCamera(b,a){return b._distanceToCamera-a._distanceToCamera;}// 检测tile是否有任意child可视
  42806. },{key:"anyChildrenVisible",value:function anyChildrenVisible(tile,frameState){var anyVisible=false;var _iterator18=_createForOfIteratorHelper$3(tile.children),_step18;try{for(_iterator18.s();!(_step18=_iterator18.n()).done;){var child=_step18.value;child.updateVisibility(frameState);anyVisible=anyVisible||child.isVisibleAndInRequestVolume;}}catch(err){_iterator18.e(err);}finally{_iterator18.f();}return anyVisible;}},{key:"executeEmptyTraversal",value:function executeEmptyTraversal(root,frameState){var allDescendantsLoaded=true;var stack=this._emptyTraversalStack;stack.push(root);while(stack.length>0&&allDescendantsLoaded){var tile=stack.pop();this.updateTile(tile,frameState);if(!tile.isVisibleAndInRequestVolume){this.loadTile(tile,frameState);}this.touchTile(tile,frameState);var traverse=!tile.hasRenderContent&&this.canTraverse(tile,frameState,false,true);if(traverse){var children=tile.children;var _iterator19=_createForOfIteratorHelper$3(children),_step19;try{for(_iterator19.s();!(_step19=_iterator19.n()).done;){var child=_step19.value;if(stack.find(child)){stack.delete(child);}stack.push(child);}}catch(err){_iterator19.e(err);}finally{_iterator19.f();}}else if(!tile.contentAvailable){allDescendantsLoaded=false;}}return allDescendantsLoaded;}}]);return TilesetTraverser;}();var scratchVector=new Vector3$1();function defined$2(x){return x!==undefined&&x!==null;}var TileHeader=/*#__PURE__*/function(){function TileHeader(tileset,header,parentHeader){var extendedId=arguments.length>3&&arguments[3]!==undefined?arguments[3]:'';_classCallCheck(this,TileHeader);_defineProperty(this,'tileset',void 0);_defineProperty(this,'header',void 0);_defineProperty(this,'id',void 0);_defineProperty(this,'url',void 0);_defineProperty(this,'parent',void 0);_defineProperty(this,'refine',void 0);_defineProperty(this,'type',void 0);_defineProperty(this,'contentUrl',void 0);_defineProperty(this,'lodMetricType',void 0);_defineProperty(this,'lodMetricValue',void 0);_defineProperty(this,'boundingVolume',void 0);_defineProperty(this,'content',void 0);_defineProperty(this,'contentState',void 0);_defineProperty(this,'gpuMemoryUsageInBytes',void 0);_defineProperty(this,'children',void 0);_defineProperty(this,'depth',void 0);_defineProperty(this,'viewportIds',void 0);_defineProperty(this,'transform',void 0);_defineProperty(this,'extensions',void 0);_defineProperty(this,'userData',void 0);_defineProperty(this,'computedTransform',void 0);_defineProperty(this,'hasEmptyContent',void 0);_defineProperty(this,'hasTilesetContent',void 0);_defineProperty(this,'traverser',void 0);_defineProperty(this,'_cacheNode',void 0);_defineProperty(this,'_frameNumber',void 0);_defineProperty(this,'_lodJudge',void 0);_defineProperty(this,'_expireDate',void 0);_defineProperty(this,'_expiredContent',void 0);_defineProperty(this,'_shouldRefine',void 0);_defineProperty(this,'_distanceToCamera',void 0);_defineProperty(this,'_centerZDepth',void 0);_defineProperty(this,'_screenSpaceError',void 0);_defineProperty(this,'_visibilityPlaneMask',void 0);_defineProperty(this,'_visible',void 0);_defineProperty(this,'_inRequestVolume',void 0);_defineProperty(this,'_stackLength',void 0);_defineProperty(this,'_selectionDepth',void 0);_defineProperty(this,'_touchedFrame',void 0);_defineProperty(this,'_visitedFrame',void 0);_defineProperty(this,'_selectedFrame',void 0);_defineProperty(this,'_requestedFrame',void 0);_defineProperty(this,'_priority',void 0);_defineProperty(this,'_contentBoundingVolume',void 0);_defineProperty(this,'_viewerRequestVolume',void 0);_defineProperty(this,'_initialTransform',void 0);_defineProperty(this,'floorIndex',void 0);// !zeg改 用于记录tile所在楼层
  42807. this.header=header;this.tileset=tileset;this.id=extendedId||header.id;this.url=header.url;this.parent=parentHeader;this.refine=this._getRefine(header.refine);this.type=header.type;this.contentUrl=header.contentUrl;this.lodMetricType='geometricError';this.lodMetricValue=0;this.boundingVolume=null;this.content=null;this.contentState=TILE_CONTENT_STATE.UNLOADED;this.gpuMemoryUsageInBytes=0;this.children=[];this.hasEmptyContent=false;this.hasTilesetContent=false;this.depth=0;this.viewportIds=[];this.userData={};this.extensions=null;this._priority=0;this._touchedFrame=0;this._visitedFrame=0;this._selectedFrame=0;this._requestedFrame=0;this._screenSpaceError=0;this._cacheNode=null;this._frameNumber=null;this._cacheNode=null;this.traverser=new TilesetTraverser({});this._shouldRefine=false;this._distanceToCamera=0;this._centerZDepth=0;this._visible=undefined;this._inRequestVolume=false;this._stackLength=0;this._selectionDepth=0;this._initialTransform=new Matrix4();this.transform=new Matrix4();this.controller=null;this._initializeLodMetric(header);this._initializeTransforms(header);this._initializeBoundingVolumes(header);this._initializeContent(header);this._initializeRenderingState(header);this._lodJudge=null;this._expireDate=null;this._expiredContent=null;Object.seal(this);}_createClass(TileHeader,[{key:"destroy",value:function destroy(){this.header=null;}},{key:"isDestroyed",value:function isDestroyed(){return this.header===null;}},{key:"selected",get:function get(){return this._selectedFrame===this.tileset._frameNumber;}},{key:"isVisible",get:function get(){return this._visible;}// 是否在可视范围内
  42808. },{key:"isVisibleAndInRequestVolume",get:function get(){return this._visible&&this._inRequestVolume;}},{key:"hasRenderContent",get:function get(){return !this.hasEmptyContent&&!this.hasTilesetContent;}},{key:"hasChildren",get:function get(){return this.children.length>0||this.header.children&&this.header.children.length>0;}},{key:"contentReady",get:function get(){return this.contentState===TILE_CONTENT_STATE.READY||this.hasEmptyContent;}},{key:"contentAvailable",get:function get(){return Boolean(this.contentReady&&this.hasRenderContent||this._expiredContent&&!this.contentFailed);}},{key:"hasUnloadedContent",get:function get(){return this.hasRenderContent&&this.contentUnloaded;}},{key:"contentUnloaded",get:function get(){return this.contentState===TILE_CONTENT_STATE.UNLOADED;}},{key:"contentExpired",get:function get(){return this.contentState===TILE_CONTENT_STATE.EXPIRED;}},{key:"contentFailed",get:function get(){return this.contentState===TILE_CONTENT_STATE.FAILED;}},{key:"getScreenSpaceError",value:function getScreenSpaceError(frameState,useParentLodMetric){switch(this.tileset.type){case TILESET_TYPE.I3S:return getProjectedRadius(this,frameState);case TILESET_TYPE.TILES3D:return getTiles3DScreenSpaceError(this,frameState,useParentLodMetric);default:throw new Error('Unsupported tileset type');}}},{key:"_getPriority",value:function _getPriority(){var traverser=this.tileset._traverser;var skipLevelOfDetail=traverser.options.skipLevelOfDetail;var maySkipTile=this.refine===TILE_REFINEMENT.ADD||skipLevelOfDetail;if(maySkipTile&&!this.isVisible&&this._visible!==undefined){return -1;}if(this.tileset._frameNumber-this._touchedFrame>=1){return -1;}if(this.contentState===TILE_CONTENT_STATE.UNLOADED){return -1;}var parent=this.parent;var useParentScreenSpaceError=parent&&(!maySkipTile||this._screenSpaceError===0.0||parent.hasTilesetContent);var screenSpaceError=useParentScreenSpaceError?parent._screenSpaceError:this._screenSpaceError;var rootScreenSpaceError=traverser.root?traverser.root._screenSpaceError:0.0;return Math.max(rootScreenSpaceError-screenSpaceError,0);}},{key:"loadContent",value:function(){var _loadContent=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee6(){var expired,requestToken,contentUrl,loader,options;return regenerator.wrap(function _callee6$(_context9){while(1){switch(_context9.prev=_context9.next){case 0:if(!this.hasEmptyContent){_context9.next=2;break;}return _context9.abrupt("return",false);case 2:if(!this.content){_context9.next=4;break;}return _context9.abrupt("return",true);case 4:expired=this.contentExpired;if(expired){this._expireDate=null;}this.contentState=TILE_CONTENT_STATE.LOADING;_context9.next=9;return this.tileset._requestScheduler.scheduleRequest(this.id,this._getPriority.bind(this));case 9:requestToken=_context9.sent;if(requestToken){_context9.next=13;break;}this.contentState=TILE_CONTENT_STATE.UNLOADED;return _context9.abrupt("return",false);case 13:_context9.prev=13;// !zeg改 使用AbortController中止tile的fetch请求
  42809. this.controller=new AbortController();contentUrl=this.tileset.getTileUrl(this.contentUrl)+"?_=".concat(this.tileset.options.imageVersion);// !zeg改 添加version后缀
  42810. loader=this.tileset.loader;options=_objectSpread$3(_objectSpread$3({},this.tileset.loadOptions),{},{fetch:{signal:this.controller.signal},[loader.id]:_objectSpread$3(_objectSpread$3({},this.tileset.loadOptions[loader.id]),{},{isTileset:this.type==='json'},this._getLoaderSpecificOptions(loader.id))});_context9.next=20;return _load2(contentUrl,loader,options);case 20:this.content=_context9.sent;// !zeg改 加载glb的byteLength
  42811. if(this.content.type=='glTF'){this.content.byteLength=this.content.gltf.buffers[0].byteLength;}if(!this.tileset.options.contentLoader){_context9.next=25;break;}_context9.next=25;return this.tileset.options.contentLoader(this);case 25:if(this._isTileset()){this.tileset._initializeTileHeaders(this.content,this);}this.contentState=TILE_CONTENT_STATE.READY;this._onContentLoaded();return _context9.abrupt("return",true);case 31:_context9.prev=31;_context9.t0=_context9["catch"](13);if(!(_context9.t0.message.indexOf('The user aborted a request')>-1)){_context9.next=36;break;}this.contentState=TILE_CONTENT_STATE.UNLOADED;return _context9.abrupt("return",false);case 36:this.contentState=TILE_CONTENT_STATE.FAILED;throw _context9.t0;case 38:_context9.prev=38;requestToken.done();return _context9.finish(38);case 41:case"end":return _context9.stop();}}},_callee6,this,[[13,31,38,41]]);}));function loadContent(){return _loadContent.apply(this,arguments);}return loadContent;}()},{key:"unloadContent",value:function unloadContent(){if(this.content&&this.content.destroy){this.content.destroy();}this.content=null;if(this.header.content&&this.header.content.destroy){this.header.content.destroy();}this.header.content=null;this.contentState=TILE_CONTENT_STATE.UNLOADED;return true;}},{key:"updateVisibility",value:function updateVisibility(frameState,viewportIds){if(this._frameNumber===frameState.frameNumber){return;}var parent=this.parent;var parentVisibilityPlaneMask=parent?parent._visibilityPlaneMask:CullingVolume.MASK_INDETERMINATE;if(this.tileset._traverser.options.updateTransforms){var parentTransform=parent?parent.computedTransform:this.tileset.modelMatrix;this._updateTransform(parentTransform);}this._distanceToCamera=this.distanceToTile(frameState);this._screenSpaceError=this.getScreenSpaceError(frameState,false);this._visibilityPlaneMask=this.visibility(frameState,parentVisibilityPlaneMask);this._visible=this._visibilityPlaneMask!==CullingVolume.MASK_OUTSIDE;this._inRequestVolume=this.insideViewerRequestVolume(frameState);this._frameNumber=frameState.frameNumber;this.viewportIds=viewportIds;}},{key:"visibility",value:function visibility(frameState,parentVisibilityPlaneMask){var cullingVolume=frameState.cullingVolume;var boundingVolume=this.boundingVolume;return cullingVolume.computeVisibilityWithPlaneMask(boundingVolume,parentVisibilityPlaneMask);}},{key:"contentVisibility",value:function contentVisibility(){return true;}},{key:"distanceToTile",value:function distanceToTile(frameState){var boundingVolume=this.boundingVolume;return Math.sqrt(Math.max(boundingVolume.distanceSquaredTo(frameState.camera.position),0));}},{key:"cameraSpaceZDepth",value:function cameraSpaceZDepth(_ref15){var camera=_ref15.camera;var boundingVolume=this.boundingVolume;scratchVector.subVectors(boundingVolume.center,camera.position);return camera.direction.dot(scratchVector);}},{key:"insideViewerRequestVolume",value:function insideViewerRequestVolume(frameState){var viewerRequestVolume=this._viewerRequestVolume;return !viewerRequestVolume||viewerRequestVolume.distanceSquaredTo(frameState.camera.position)<=0;}},{key:"updateExpiration",value:function updateExpiration(){if(defined$2(this._expireDate)&&this.contentReady&&!this.hasEmptyContent){var now=Date.now();if(Date.lessThan(this._expireDate,now)){this.contentState=TILE_CONTENT_STATE.EXPIRED;this._expiredContent=this.content;}}}},{key:"extras",get:function get(){return this.header.extras;}},{key:"_initializeLodMetric",value:function _initializeLodMetric(header){if('lodMetricType'in header){this.lodMetricType=header.lodMetricType;}else {this.lodMetricType=this.parent&&this.parent.lodMetricType||this.tileset.lodMetricType;console.warn('3D Tile: Required prop lodMetricType is undefined. Using parent lodMetricType');}if('lodMetricValue'in header){this.lodMetricValue=header.lodMetricValue;}else {this.lodMetricValue=this.parent&&this.parent.lodMetricValue||this.tileset.lodMetricValue;console.warn('3D Tile: Required prop lodMetricValue is undefined. Using parent lodMetricValue');}}},{key:"_initializeTransforms",value:function _initializeTransforms(tileHeader){this.transform=tileHeader.transform?new Matrix4(tileHeader.transform):new Matrix4();var parent=this.parent;var tileset=this.tileset;var parentTransform=parent&&parent.computedTransform?parent.computedTransform.clone():tileset.modelMatrix.clone();this.computedTransform=new Matrix4(parentTransform).multiplyRight(this.transform);var parentInitialTransform=parent&&parent._initialTransform?parent._initialTransform.clone():new Matrix4();this._initialTransform=new Matrix4(parentInitialTransform).multiplyRight(this.transform);}},{key:"_initializeBoundingVolumes",value:function _initializeBoundingVolumes(tileHeader){this._contentBoundingVolume=null;this._viewerRequestVolume=null;this._updateBoundingVolume(tileHeader);}},{key:"_initializeContent",value:function _initializeContent(tileHeader){this.content={_tileset:this.tileset,_tile:this};this.hasEmptyContent=true;this.contentState=TILE_CONTENT_STATE.UNLOADED;this.hasTilesetContent=false;if(tileHeader.contentUrl){this.content=null;this.hasEmptyContent=false;}}},{key:"_initializeRenderingState",value:function _initializeRenderingState(header){this.depth=header.level||(this.parent?this.parent.depth+1:0);this._shouldRefine=false;this._distanceToCamera=0;this._centerZDepth=0;this._screenSpaceError=0;this._visibilityPlaneMask=CullingVolume.MASK_INDETERMINATE;this._visible=undefined;this._inRequestVolume=false;this._stackLength=0;this._selectionDepth=0;this._frameNumber=0;this._touchedFrame=0;this._visitedFrame=0;this._selectedFrame=0;this._requestedFrame=0;this._priority=0.0;}},{key:"_getRefine",value:function _getRefine(refine){return refine||this.parent&&this.parent.refine||TILE_REFINEMENT.REPLACE;}},{key:"_isTileset",value:function _isTileset(){return this.contentUrl.indexOf('.json')!==-1;}},{key:"_onContentLoaded",value:function _onContentLoaded(){switch(this.content&&this.content.type){case'vctr':case'geom':this.tileset._traverser.disableSkipLevelOfDetail=true;break;}if(this._isTileset()){this.hasTilesetContent=true;}}},{key:"_updateBoundingVolume",value:function _updateBoundingVolume(header){this.boundingVolume=createBoundingVolume(header.boundingVolume,this.computedTransform,this.boundingVolume);var content=header.content;if(!content){return;}if(content.boundingVolume){this._contentBoundingVolume=createBoundingVolume(content.boundingVolume,this.computedTransform,this._contentBoundingVolume);}if(header.viewerRequestVolume){this._viewerRequestVolume=createBoundingVolume(header.viewerRequestVolume,this.computedTransform,this._viewerRequestVolume);}}},{key:"_updateTransform",value:function _updateTransform(){var parentTransform=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Matrix4();var computedTransform=parentTransform.clone().multiplyRight(this.transform);var didTransformChange=!computedTransform.equals(this.computedTransform);if(!didTransformChange){return;}this.computedTransform=computedTransform;this._updateBoundingVolume(this.header);}},{key:"_getLoaderSpecificOptions",value:function _getLoaderSpecificOptions(loaderId){switch(loaderId){case'i3s':return _objectSpread$3(_objectSpread$3({},this.tileset.options.i3s),{},{tile:this.header,tileset:this.tileset.tileset,isTileHeader:false});case'3d-tiles':case'cesium-ion':default:return get3dTilesOptions(this.tileset.tileset);}}}]);return TileHeader;}();var Tileset3DTraverser=/*#__PURE__*/function(_TilesetTraverser){_inherits(Tileset3DTraverser,_TilesetTraverser);var _super9=_createSuper$E(Tileset3DTraverser);function Tileset3DTraverser(){_classCallCheck(this,Tileset3DTraverser);return _super9.apply(this,arguments);}_createClass(Tileset3DTraverser,[{key:"compareDistanceToCamera",value:function compareDistanceToCamera(a,b){return b._distanceToCamera===0&&a._distanceToCamera===0?b._centerZDepth-a._centerZDepth:b._distanceToCamera-a._distanceToCamera;}},{key:"updateTileVisibility",value:function updateTileVisibility(tile,frameState){_get(_getPrototypeOf(Tileset3DTraverser.prototype),"updateTileVisibility",this).call(this,tile,frameState);// !zeg改 强制显示所有tile
  42812. if(this.options.ingoreVisibleCompute){tile._visible=true;return;}if(!tile.isVisibleAndInRequestVolume){return;}var hasChildren=tile.children.length>0;if(tile.hasTilesetContent&&hasChildren){var firstChild=tile.children[0];this.updateTileVisibility(firstChild,frameState);tile._visible=firstChild._visible;return;}if(this.meetsScreenSpaceErrorEarly(tile,frameState)){tile._visible=false;return;}var replace=tile.refine===TILE_REFINEMENT.REPLACE;var useOptimization=tile._optimChildrenWithinParent===TILE3D_OPTIMIZATION_HINT.USE_OPTIMIZATION;// 当没有child可视时,tile也不可视
  42813. if(replace&&useOptimization&&hasChildren){if(!this.anyChildrenVisible(tile,frameState)){tile._visible=false;return;}}}},{key:"meetsScreenSpaceErrorEarly",value:function meetsScreenSpaceErrorEarly(tile,frameState){var parent=tile.parent;if(!parent||parent.hasTilesetContent||parent.refine!==TILE_REFINEMENT.ADD){return false;}return !this.shouldRefine(tile,frameState,true);}}]);return Tileset3DTraverser;}(TilesetTraverser);var STATUS={REQUESTED:'REQUESTED',COMPLETED:'COMPLETED',ERROR:'ERROR'};var I3STileManager=/*#__PURE__*/function(){function I3STileManager(){_classCallCheck(this,I3STileManager);_defineProperty(this,'_statusMap',void 0);this._statusMap={};}_createClass(I3STileManager,[{key:"add",value:function add(request,key,callback,frameState){var _this12=this;if(!this._statusMap[key]){this._statusMap[key]={request,callback,key,frameState,status:STATUS.REQUESTED};request().then(function(data){_this12._statusMap[key].status=STATUS.COMPLETED;_this12._statusMap[key].callback(data,frameState);}).catch(function(error){_this12._statusMap[key].status=STATUS.ERROR;callback(error);});}}},{key:"update",value:function update(key,frameState){if(this._statusMap[key]){this._statusMap[key].frameState=frameState;}}},{key:"find",value:function find(key){return this._statusMap[key];}}]);return I3STileManager;}();var I3STilesetTraverser=/*#__PURE__*/function(_TilesetTraverser2){_inherits(I3STilesetTraverser,_TilesetTraverser2);var _super10=_createSuper$E(I3STilesetTraverser);function I3STilesetTraverser(options){var _this13;_classCallCheck(this,I3STilesetTraverser);_this13=_super10.call(this,options);_defineProperty(_assertThisInitialized(_this13),'_tileManager',void 0);_this13._tileManager=new I3STileManager();return _this13;}_createClass(I3STilesetTraverser,[{key:"shouldRefine",value:function shouldRefine(tile,frameState){tile._lodJudge=getLodStatus(tile,frameState);return tile._lodJudge==='DIG';}},{key:"updateChildTiles",value:function updateChildTiles(tile,frameState){var _this14=this;var children=tile.header.children||[];var childTiles=tile.children;var tileset=tile.tileset;var _iterator20=_createForOfIteratorHelper$3(children),_step20;try{var _loop2=function _loop2(){var child=_step20.value;var extendedId=''.concat(child.id,'-').concat(frameState.viewport.id);var childTile=childTiles&&childTiles.find(function(t){return t.id===extendedId;});if(!childTile){var request=function request(){return _this14._loadTile(child.id,tileset);};var cachedRequest=_this14._tileManager.find(extendedId);if(!cachedRequest){if(tileset.tileset.nodePages){request=function request(){return tileset.tileset.nodePagesTile.formTileFromNodePages(child.id);};}_this14._tileManager.add(request,extendedId,function(header){return _this14._onTileLoad(header,tile,extendedId);},frameState);}else {_this14._tileManager.update(extendedId,frameState);}}else if(childTile){_this14.updateTile(childTile,frameState);}};for(_iterator20.s();!(_step20=_iterator20.n()).done;){_loop2();}}catch(err){_iterator20.e(err);}finally{_iterator20.f();}return false;}},{key:"_loadTile",value:function(){var _loadTile2=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee7(nodeId,tileset){var loader,nodeUrl,options;return regenerator.wrap(function _callee7$(_context10){while(1){switch(_context10.prev=_context10.next){case 0:loader=tileset.loader;nodeUrl=tileset.getTileUrl(''.concat(tileset.url,'/nodes/').concat(nodeId));options=_objectSpread$3(_objectSpread$3({},tileset.loadOptions),{},{i3s:_objectSpread$3(_objectSpread$3({},tileset.loadOptions.i3s),{},{isTileHeader:true,loadContent:false})});_context10.next=5;return _load2(nodeUrl,loader,options);case 5:return _context10.abrupt("return",_context10.sent);case 6:case"end":return _context10.stop();}}},_callee7);}));function _loadTile(_x41,_x42){return _loadTile2.apply(this,arguments);}return _loadTile;}()},{key:"_onTileLoad",value:function _onTileLoad(header,tile,extendedId){var childTile=new TileHeader(tile.tileset,header,tile,extendedId);tile.children.push(childTile);var frameState=this._tileManager.find(childTile.id).frameState;this.updateTile(childTile,frameState);if(this._frameNumber===frameState.frameNumber){this.executeTraversal(childTile,frameState);}}}]);return I3STilesetTraverser;}(TilesetTraverser);var DEFAULT_PROPS={description:'',ellipsoid:Ellipsoid.WGS84,modelMatrix:new Matrix4(),throttleRequests:true,maxRequests:64,maximumMemoryUsage:32,onTileLoad:function onTileLoad(){},onTileUnload:function onTileUnload(){},onTileError:function onTileError(){},onTraversalComplete:function onTraversalComplete(selectedTiles){return selectedTiles;},contentLoader:undefined,viewDistanceScale:1.0,maximumScreenSpaceError:8,loadTiles:true,updateTransforms:true,viewportTraversersMap:null,loadOptions:{fetch:{}},attributions:[],basePath:'',i3s:{}};var TILES_TOTAL='Tiles In Tileset(s)';var TILES_IN_MEMORY='Tiles In Memory';var TILES_IN_VIEW='Tiles In View';var TILES_RENDERABLE='Tiles To Render';var TILES_LOADED='Tiles Loaded';var TILES_LOADING='Tiles Loading';var TILES_UNLOADED='Tiles Unloaded';var TILES_LOAD_FAILED='Failed Tile Loads';var POINTS_COUNT='Points';var TILES_GPU_MEMORY='Tile Memory Use';var Tileset3D=/*#__PURE__*/function(_Emiter){_inherits(Tileset3D,_Emiter);var _super11=_createSuper$E(Tileset3D);function Tileset3D(json,options){var _this15;_classCallCheck(this,Tileset3D);_this15=_super11.call(this);_defineProperty(_assertThisInitialized(_this15),'options',void 0);_defineProperty(_assertThisInitialized(_this15),'loadOptions',void 0);_defineProperty(_assertThisInitialized(_this15),'type',void 0);_defineProperty(_assertThisInitialized(_this15),'tileset',void 0);_defineProperty(_assertThisInitialized(_this15),'loader',void 0);_defineProperty(_assertThisInitialized(_this15),'url',void 0);_defineProperty(_assertThisInitialized(_this15),'basePath',void 0);_defineProperty(_assertThisInitialized(_this15),'modelMatrix',void 0);_defineProperty(_assertThisInitialized(_this15),'ellipsoid',void 0);_defineProperty(_assertThisInitialized(_this15),'lodMetricType',void 0);_defineProperty(_assertThisInitialized(_this15),'lodMetricValue',void 0);_defineProperty(_assertThisInitialized(_this15),'refine',void 0);_defineProperty(_assertThisInitialized(_this15),'root',void 0);_defineProperty(_assertThisInitialized(_this15),'roots',void 0);_defineProperty(_assertThisInitialized(_this15),'asset',void 0);_defineProperty(_assertThisInitialized(_this15),'description',void 0);_defineProperty(_assertThisInitialized(_this15),'properties',void 0);_defineProperty(_assertThisInitialized(_this15),'extras',void 0);_defineProperty(_assertThisInitialized(_this15),'attributions',void 0);_defineProperty(_assertThisInitialized(_this15),'credits',void 0);_defineProperty(_assertThisInitialized(_this15),'stats',void 0);_defineProperty(_assertThisInitialized(_this15),'traverseCounter',void 0);_defineProperty(_assertThisInitialized(_this15),'geometricError',void 0);_defineProperty(_assertThisInitialized(_this15),'selectedTiles',void 0);_defineProperty(_assertThisInitialized(_this15),'cartographicCenter',void 0);_defineProperty(_assertThisInitialized(_this15),'cartesianCenter',void 0);_defineProperty(_assertThisInitialized(_this15),'zoom',void 0);_defineProperty(_assertThisInitialized(_this15),'boundingVolume',void 0);_defineProperty(_assertThisInitialized(_this15),'gpuMemoryUsageInBytes',void 0);_defineProperty(_assertThisInitialized(_this15),'dynamicScreenSpaceErrorComputedDensity',void 0);_defineProperty(_assertThisInitialized(_this15),'_traverser',void 0);_defineProperty(_assertThisInitialized(_this15),'_cache',void 0);_defineProperty(_assertThisInitialized(_this15),'_requestScheduler',void 0);_defineProperty(_assertThisInitialized(_this15),'_frameNumber',void 0);_defineProperty(_assertThisInitialized(_this15),'_queryParamsString',void 0);_defineProperty(_assertThisInitialized(_this15),'_queryParams',void 0);_defineProperty(_assertThisInitialized(_this15),'_extensionsUsed',void 0);_defineProperty(_assertThisInitialized(_this15),'_tiles',void 0);_defineProperty(_assertThisInitialized(_this15),'_pendingCount',void 0);_defineProperty(_assertThisInitialized(_this15),'lastUpdatedVieports',void 0);_defineProperty(_assertThisInitialized(_this15),'_requestedTiles',void 0);_defineProperty(_assertThisInitialized(_this15),'_emptyTiles',void 0);_defineProperty(_assertThisInitialized(_this15),'frameStateData',void 0);_defineProperty(_assertThisInitialized(_this15),'maximumMemoryUsage',void 0);_defineProperty(_assertThisInitialized(_this15),'loadingTiles',void 0);// !zeg改 用于记录正在加载中的tile
  42814. assert$7(json);_this15.options=_objectSpread$3(_objectSpread$3({},DEFAULT_PROPS),options);_this15.tileset=json;_this15.loader=json.loader;_this15.type=json.type;_this15.url=json.url;_this15.basePath=json.basePath||dirname(_this15.url);_this15.modelMatrix=_this15.options.modelMatrix;_this15.ellipsoid=_this15.options.ellipsoid;_this15.lodMetricType=json.lodMetricType;_this15.lodMetricValue=json.lodMetricValue;_this15.refine=json.root.refine;_this15.loadOptions=_this15.options.loadOptions||{};_this15.root=null;_this15.roots={};_this15.cartographicCenter=null;_this15.cartesianCenter=null;_this15.zoom=1;_this15.boundingVolume=null;_this15.traverseCounter=0;_this15.geometricError=0;_this15._traverser=_this15._initializeTraverser();_this15._cache=new TilesetCache();_this15._requestScheduler=new RequestScheduler({throttleRequests:_this15.options.throttleRequests,maxRequests:_this15.options.maxRequests});_this15._frameNumber=0;_this15._pendingCount=0;_this15._tiles={};_this15.selectedTiles=[];_this15._emptyTiles=[];_this15._requestedTiles=[];_this15.frameStateData={};_this15.lastUpdatedVieports=null;_this15._queryParams={};_this15._queryParamsString='';_this15.maximumMemoryUsage=_this15.options.maximumMemoryUsage||32;_this15.gpuMemoryUsageInBytes=0;_this15.stats=new Stats({id:_this15.url});_this15.loadingTiles=[];_this15._initializeStats();_this15._extensionsUsed=undefined;_this15.dynamicScreenSpaceErrorComputedDensity=0.0;_this15.extras=null;_this15.asset={};_this15.credits={};_this15.description=_this15.options.description||'';_this15._initializeTileSet(json);return _this15;}_createClass(Tileset3D,[{key:"destroy",value:function destroy(){this._destroy();}},{key:"isLoaded",value:function isLoaded(){return this._pendingCount===0&&this._frameNumber!==0;}},{key:"tiles",get:function get(){return Object.values(this._tiles);}},{key:"frameNumber",get:function get(){return this._frameNumber;}},{key:"queryParams",get:function get(){if(!this._queryParamsString){this._queryParamsString=getQueryParamString(this._queryParams);}return this._queryParamsString;}},{key:"setProps",value:function setProps(props){this.options=_objectSpread$3(_objectSpread$3({},this.options),props);}},{key:"setOptions",value:function setOptions(options){this.options=_objectSpread$3(_objectSpread$3({},this.options),options);}},{key:"getTileUrl",value:function getTileUrl(tilePath){var isDataUrl=tilePath.startsWith('data:');if(isDataUrl){return tilePath;}return ''.concat(tilePath).concat(this.queryParams);}},{key:"hasExtension",value:function hasExtension(extensionName){return Boolean(this._extensionsUsed&&this._extensionsUsed.indexOf(extensionName)>-1);}},{key:"update",value:function update(viewports){if('loadTiles'in this.options&&!this.options.loadTiles){return;}if(this.traverseCounter>0){return;}if(!viewports&&this.lastUpdatedVieports){viewports=this.lastUpdatedVieports;}else {this.lastUpdatedVieports=viewports;}if(!(viewports instanceof Array)){viewports=[viewports];}this._cache.reset();this._frameNumber++;this.traverseCounter=viewports.length;var viewportsToTraverse=[];var _iterator21=_createForOfIteratorHelper$3(viewports),_step21;try{for(_iterator21.s();!(_step21=_iterator21.n()).done;){var viewport=_step21.value;var id=viewport.id;if(this._needTraverse(id)){viewportsToTraverse.push(id);}else {this.traverseCounter--;}}}catch(err){_iterator21.e(err);}finally{_iterator21.f();}var _iterator22=_createForOfIteratorHelper$3(viewports),_step22;try{for(_iterator22.s();!(_step22=_iterator22.n()).done;){var _viewport=_step22.value;var _id=_viewport.id;if(!this.roots[_id]){this.roots[_id]=this._initializeTileHeaders(this.tileset,null);}if(!viewportsToTraverse.includes(_id)){continue;}var frameState=getFrameState(_viewport,this._frameNumber);this._traverser.traverse(this.roots[_id],frameState,this.options);}}catch(err){_iterator22.e(err);}finally{_iterator22.f();}}},{key:"_needTraverse",value:function _needTraverse(viewportId){var traverserId=viewportId;if(this.options.viewportTraversersMap){traverserId=this.options.viewportTraversersMap[viewportId];}if(traverserId!==viewportId){return false;}return true;}},{key:"_onTraversalEnd",value:function _onTraversalEnd(frameState){var id=frameState.viewport.id;if(!this.frameStateData[id]){this.frameStateData[id]={selectedTiles:[],_requestedTiles:[],_emptyTiles:[]};}var currentFrameStateData=this.frameStateData[id];var selectedTiles=Object.values(this._traverser.selectedTiles);currentFrameStateData.selectedTiles=selectedTiles;currentFrameStateData._requestedTiles=Object.values(this._traverser.requestedTiles);currentFrameStateData._emptyTiles=Object.values(this._traverser.emptyTiles);this.traverseCounter--;if(this.traverseCounter>0){return;}this._updateTiles();}},{key:"_updateTiles",value:function _updateTiles(){this.selectedTiles=[];this._requestedTiles=[];this._emptyTiles=[];for(var frameStateKey in this.frameStateData){var frameStateDataValue=this.frameStateData[frameStateKey];this.selectedTiles=this.selectedTiles.concat(frameStateDataValue.selectedTiles);this._requestedTiles=this._requestedTiles.concat(frameStateDataValue._requestedTiles);this._emptyTiles=this._emptyTiles.concat(frameStateDataValue._emptyTiles);}this.selectedTiles=this.options.onTraversalComplete(this.selectedTiles);var _iterator23=_createForOfIteratorHelper$3(this.selectedTiles),_step23;try{for(_iterator23.s();!(_step23=_iterator23.n()).done;){var tile=_step23.value;this._tiles[tile.id]=tile;}}catch(err){_iterator23.e(err);}finally{_iterator23.f();}this._loadTiles();this._unloadTiles();this._updateStats();}},{key:"_tilesChanged",value:function _tilesChanged(oldSelectedTiles,selectedTiles){if(oldSelectedTiles.length!==selectedTiles.length){return true;}var set1=new Set(oldSelectedTiles.map(function(t){return t.id;}));var set2=new Set(selectedTiles.map(function(t){return t.id;}));var changed=oldSelectedTiles.filter(function(x){return !set2.has(x.id);}).length>0;changed=changed||selectedTiles.filter(function(x){return !set1.has(x.id);}).length>0;return changed;}},{key:"_loadTiles",value:function _loadTiles(){var _iterator24=_createForOfIteratorHelper$3(this._requestedTiles),_step24;try{for(_iterator24.s();!(_step24=_iterator24.n()).done;){var tile=_step24.value;if(tile.contentUnloaded){this._loadTile(tile);}}}catch(err){_iterator24.e(err);}finally{_iterator24.f();}}},{key:"_unloadTiles",value:function _unloadTiles(){this._cache.unloadTiles(this,function(tileset,tile){return tileset._unloadTile(tile);});}},{key:"_updateStats",value:function _updateStats(){var tilesRenderable=0;var pointsRenderable=0;var _iterator25=_createForOfIteratorHelper$3(this.selectedTiles),_step25;try{for(_iterator25.s();!(_step25=_iterator25.n()).done;){var tile=_step25.value;if(tile.contentAvailable&&tile.content){tilesRenderable++;if(tile.content.pointCount){pointsRenderable+=tile.content.pointCount;}}}}catch(err){_iterator25.e(err);}finally{_iterator25.f();}this.stats.get(TILES_IN_VIEW).count=this.selectedTiles.length;this.stats.get(TILES_RENDERABLE).count=tilesRenderable;this.stats.get(POINTS_COUNT).count=pointsRenderable;}},{key:"_initializeTileSet",value:function _initializeTileSet(tilesetJson){this.root=this._initializeTileHeaders(tilesetJson,null);if(this.type===TILESET_TYPE.TILES3D){this._initializeCesiumTileset(tilesetJson);}if(this.type===TILESET_TYPE.I3S){this._initializeI3STileset();}this._calculateViewProps();}},{key:"_calculateViewProps",value:function _calculateViewProps(){var root=this.root;assert$7(root);var center=root.boundingVolume.center;if(!center){console.warn('center was not pre-calculated for the root tile');this.cartographicCenter=new Vector3$1();this.zoom=1;return;}this.cartographicCenter=Ellipsoid.WGS84.cartesianToCartographic(center,new Vector3$1());this.cartesianCenter=center;this.zoom=getZoomFromBoundingVolume(root.boundingVolume);}},{key:"_initializeStats",value:function _initializeStats(){this.stats.get(TILES_TOTAL);this.stats.get(TILES_LOADING);this.stats.get(TILES_IN_MEMORY);this.stats.get(TILES_IN_VIEW);this.stats.get(TILES_RENDERABLE);this.stats.get(TILES_LOADED);this.stats.get(TILES_UNLOADED);this.stats.get(TILES_LOAD_FAILED);this.stats.get(POINTS_COUNT,'memory');this.stats.get(TILES_GPU_MEMORY,'memory');}},{key:"_initializeTileHeaders",value:function _initializeTileHeaders(tilesetJson,parentTileHeader){var rootTile=new TileHeader(this,tilesetJson.root,parentTileHeader);if(parentTileHeader){parentTileHeader.children.push(rootTile);rootTile.depth=parentTileHeader.depth+1;}if(this.type===TILESET_TYPE.TILES3D){var _stack=[];_stack.push(rootTile);while(_stack.length>0){var tile=_stack.pop();this.stats.get(TILES_TOTAL).incrementCount();var children=tile.header.children||[];var _iterator26=_createForOfIteratorHelper$3(children),_step26;try{for(_iterator26.s();!(_step26=_iterator26.n()).done;){var childHeader=_step26.value;var childTile=new TileHeader(this,childHeader,tile);tile.children.push(childTile);childTile.depth=tile.depth+1;_stack.push(childTile);}}catch(err){_iterator26.e(err);}finally{_iterator26.f();}}}return rootTile;}},{key:"_initializeTraverser",value:function _initializeTraverser(){var TraverserClass;var type=this.type;switch(type){case TILESET_TYPE.TILES3D:TraverserClass=Tileset3DTraverser;break;case TILESET_TYPE.I3S:TraverserClass=I3STilesetTraverser;break;default:TraverserClass=TilesetTraverser;}return new TraverserClass({basePath:this.basePath,onTraversalEnd:this._onTraversalEnd.bind(this)});}},{key:"_destroyTileHeaders",value:function _destroyTileHeaders(parentTile){this._destroySubtree(parentTile);}},{key:"_loadTile",value:function(){var _loadTile3=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee8(tile){var loaded;return regenerator.wrap(function _callee8$(_context11){while(1){switch(_context11.prev=_context11.next){case 0:_context11.prev=0;this._onStartTileLoading(tile);_context11.next=4;return tile.loadContent();case 4:loaded=_context11.sent;_context11.next=10;break;case 7:_context11.prev=7;_context11.t0=_context11["catch"](0);this._onTileLoadError(tile,_context11.t0);case 10:_context11.prev=10;this._onEndTileLoading(tile);this._onTileLoad(tile,loaded);return _context11.finish(10);case 14:case"end":return _context11.stop();}}},_callee8,this,[[0,7,10,14]]);}));function _loadTile(_x43){return _loadTile3.apply(this,arguments);}return _loadTile;}()},{key:"_onTileLoadError",value:function _onTileLoadError(tile,error){this.stats.get(TILES_LOAD_FAILED).incrementCount();var message=error.message||error.toString();var url=tile.url;console.error('A 3D tile failed to load: '.concat(tile.url,' ').concat(message));this.options.onTileError(tile,message,url);}},{key:"_onTileLoad",value:function _onTileLoad(tile,loaded){if(!loaded){return;}if(tile&&tile.content){calculateTransformProps(tile,tile.content);}this._addTileToCache(tile);this.options.onTileLoad(tile);}},{key:"_onStartTileLoading",value:function _onStartTileLoading(tile){this.loadingTiles.push(tile);this._pendingCount++;this.stats.get(TILES_LOADING).incrementCount();}},{key:"_onEndTileLoading",value:function _onEndTileLoading(tile){this.loadingTiles=this.loadingTiles.filter(function(t){return t!=tile;});this._pendingCount--;this.stats.get(TILES_LOADING).decrementCount();this.emit('endTileLoading',{tile,loadingCount:this._pendingCount});// !zeg改
  42815. }},{key:"_addTileToCache",value:function _addTileToCache(tile){this._cache.add(this,tile,function(tileset){return tileset._updateCacheStats(tile);});}},{key:"_updateCacheStats",value:function _updateCacheStats(tile){this.stats.get(TILES_LOADED).incrementCount();this.stats.get(TILES_IN_MEMORY).incrementCount();this.gpuMemoryUsageInBytes+=tile.content.byteLength||0;this.stats.get(TILES_GPU_MEMORY).count=this.gpuMemoryUsageInBytes;}},{key:"_unloadTile",value:function _unloadTile(tile){this.gpuMemoryUsageInBytes-=tile.content&&tile.content.byteLength||0;this.stats.get(TILES_IN_MEMORY).decrementCount();this.stats.get(TILES_UNLOADED).incrementCount();this.stats.get(TILES_GPU_MEMORY).count=this.gpuMemoryUsageInBytes;this.options.onTileUnload(tile);tile.unloadContent();}},{key:"_destroy",value:function _destroy(){var stack=[];if(this.root){stack.push(this.root);}while(stack.length>0){var tile=stack.pop();var _iterator27=_createForOfIteratorHelper$3(tile.children),_step27;try{for(_iterator27.s();!(_step27=_iterator27.n()).done;){var child=_step27.value;stack.push(child);}}catch(err){_iterator27.e(err);}finally{_iterator27.f();}this._destroyTile(tile);}this.root=null;}},{key:"_destroySubtree",value:function _destroySubtree(tile){var root=tile;var stack=[];stack.push(root);while(stack.length>0){tile=stack.pop();var _iterator28=_createForOfIteratorHelper$3(tile.children),_step28;try{for(_iterator28.s();!(_step28=_iterator28.n()).done;){var child=_step28.value;stack.push(child);}}catch(err){_iterator28.e(err);}finally{_iterator28.f();}if(tile!==root){this._destroyTile(tile);}}root.children=[];}},{key:"_destroyTile",value:function _destroyTile(tile){this._cache.unloadTile(this,tile);this._unloadTile(tile);tile.destroy();}},{key:"_initializeCesiumTileset",value:function _initializeCesiumTileset(tilesetJson){this.asset=tilesetJson.asset;if(!this.asset){throw new Error('Tileset must have an asset property.');}if(this.asset.version!=='0.0'&&this.asset.version!=='1.0'){throw new Error('The tileset must be 3D Tiles version 0.0 or 1.0.');}if('tilesetVersion'in this.asset){this._queryParams.v=this.asset.tilesetVersion;}this.credits={attributions:this.options.attributions||[]};this.description=this.options.description||'';this.properties=tilesetJson.properties;this.geometricError=tilesetJson.geometricError;this._extensionsUsed=tilesetJson.extensionsUsed;this.extras=tilesetJson.extras;}},{key:"_initializeI3STileset",value:function _initializeI3STileset(){if(this.loadOptions.i3s&&'token'in this.loadOptions.i3s){this._queryParams.token=this.loadOptions.i3s.token;}}}]);return Tileset3D;}(tinyEmitter);function getQueryParamString(queryParams){var queryParamStrings=[];for(var _i41=0,_Object$keys=Object.keys(queryParams);_i41<_Object$keys.length;_i41++){var key=_Object$keys[_i41];queryParamStrings.push(''.concat(key,'=').concat(queryParams[key]));}switch(queryParamStrings.length){case 0:return '';case 1:return '?'.concat(queryParamStrings[0]);default:return '?'.concat(queryParamStrings.join('&'));}}var VERSION$5='3.1.4';var TILE3D_TYPE={COMPOSITE:'cmpt',POINT_CLOUD:'pnts',BATCHED_3D_MODEL:'b3dm',INSTANCED_3D_MODEL:'i3dm',GEOMETRY:'geom',VECTOR:'vect',GLTF:'glTF'};function getStringFromArrayBuffer(arrayBuffer,byteOffset,byteLength){assert$7(arrayBuffer instanceof ArrayBuffer);var textDecoder=new TextDecoder('utf8');var typedArray=new Uint8Array(arrayBuffer,byteOffset,byteLength);var string=textDecoder.decode(typedArray);return string;}function getMagicString$1(arrayBuffer){var byteOffset=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var dataView=new DataView(arrayBuffer);return ''.concat(String.fromCharCode(dataView.getUint8(byteOffset+0))).concat(String.fromCharCode(dataView.getUint8(byteOffset+1))).concat(String.fromCharCode(dataView.getUint8(byteOffset+2))).concat(String.fromCharCode(dataView.getUint8(byteOffset+3)));}var VERSION$4='3.1.4';var DEFAULT_DRACO_OPTIONS={draco:{decoderType:typeof WebAssembly==='object'?'wasm':'js',libraryPath:'libs/',extraAttributes:{},attributeNameEntry:undefined}};var DracoLoader$1={name:'Draco',id:'draco',module:'draco',shapes:['mesh'],version:VERSION$4,worker:true,extensions:['drc'],mimeTypes:['application/octet-stream'],binary:true,tests:['DRACO'],options:DEFAULT_DRACO_OPTIONS};function getMeshBoundingBox(attributes){var minX=Infinity;var minY=Infinity;var minZ=Infinity;var maxX=-Infinity;var maxY=-Infinity;var maxZ=-Infinity;var positions=attributes.POSITION?attributes.POSITION.value:[];var len=positions&&positions.length;for(var _i42=0;_i42<len;_i42+=3){var x=positions[_i42];var y=positions[_i42+1];var z=positions[_i42+2];minX=x<minX?x:minX;minY=y<minY?y:minY;minZ=z<minZ?z:minZ;maxX=x>maxX?x:maxX;maxY=y>maxY?y:maxY;maxZ=z>maxZ?z:maxZ;}return [[minX,minY,minZ],[maxX,maxY,maxZ]];}function assert$3(condition,message){if(!condition){throw new Error(message||'loader assertion failed.');}}var Schema=/*#__PURE__*/function(){function Schema(fields,metadata){_classCallCheck(this,Schema);_defineProperty(this,'fields',void 0);_defineProperty(this,'metadata',void 0);assert$3(Array.isArray(fields));checkNames(fields);this.fields=fields;this.metadata=metadata||new Map();}_createClass(Schema,[{key:"compareTo",value:function compareTo(other){if(this.metadata!==other.metadata){return false;}if(this.fields.length!==other.fields.length){return false;}for(var _i43=0;_i43<this.fields.length;++_i43){if(!this.fields[_i43].compareTo(other.fields[_i43])){return false;}}return true;}},{key:"select",value:function select(){var nameMap=Object.create(null);for(var _len11=arguments.length,columnNames=new Array(_len11),_key11=0;_key11<_len11;_key11++){columnNames[_key11]=arguments[_key11];}for(var _i44=0,_columnNames=columnNames;_i44<_columnNames.length;_i44++){var _name2=_columnNames[_i44];nameMap[_name2]=true;}var selectedFields=this.fields.filter(function(field){return nameMap[field.name];});return new Schema(selectedFields,this.metadata);}},{key:"selectAt",value:function selectAt(){var _this16=this;for(var _len12=arguments.length,columnIndices=new Array(_len12),_key12=0;_key12<_len12;_key12++){columnIndices[_key12]=arguments[_key12];}var selectedFields=columnIndices.map(function(index){return _this16.fields[index];}).filter(Boolean);return new Schema(selectedFields,this.metadata);}},{key:"assign",value:function assign(schemaOrFields){var fields;var metadata=this.metadata;if(schemaOrFields instanceof Schema){var otherSchema=schemaOrFields;fields=otherSchema.fields;metadata=mergeMaps(mergeMaps(new Map(),this.metadata),otherSchema.metadata);}else {fields=schemaOrFields;}var fieldMap=Object.create(null);var _iterator29=_createForOfIteratorHelper$3(this.fields),_step29;try{for(_iterator29.s();!(_step29=_iterator29.n()).done;){var field=_step29.value;fieldMap[field.name]=field;}}catch(err){_iterator29.e(err);}finally{_iterator29.f();}var _iterator30=_createForOfIteratorHelper$3(fields),_step30;try{for(_iterator30.s();!(_step30=_iterator30.n()).done;){var _field=_step30.value;fieldMap[_field.name]=_field;}}catch(err){_iterator30.e(err);}finally{_iterator30.f();}var mergedFields=Object.values(fieldMap);return new Schema(mergedFields,metadata);}}]);return Schema;}();function checkNames(fields){var usedNames={};var _iterator31=_createForOfIteratorHelper$3(fields),_step31;try{for(_iterator31.s();!(_step31=_iterator31.n()).done;){var field=_step31.value;if(usedNames[field.name]){console.warn('Schema: duplicated field name',field.name,field);}usedNames[field.name]=true;}}catch(err){_iterator31.e(err);}finally{_iterator31.f();}}function mergeMaps(m1,m2){return new Map([].concat(_toConsumableArray(m1||new Map()),_toConsumableArray(m2||new Map())));}var Field=/*#__PURE__*/function(){function Field(name,type){var nullable=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var metadata=arguments.length>3&&arguments[3]!==undefined?arguments[3]:new Map();_classCallCheck(this,Field);_defineProperty(this,'name',void 0);_defineProperty(this,'type',void 0);_defineProperty(this,'nullable',void 0);_defineProperty(this,'metadata',void 0);this.name=name;this.type=type;this.nullable=nullable;this.metadata=metadata;}_createClass(Field,[{key:"typeId",get:function get(){return this.type&&this.type.typeId;}},{key:"clone",value:function clone(){return new Field(this.name,this.type,this.nullable,this.metadata);}},{key:"compareTo",value:function compareTo(other){return this.name===other.name&&this.type===other.type&&this.nullable===other.nullable&&this.metadata===other.metadata;}},{key:"toString",value:function toString(){return ''.concat(this.type).concat(this.nullable?', nullable':'').concat(this.metadata?', metadata: '.concat(this.metadata):'');}}]);return Field;}();var Type;(function(Type){Type[Type['NONE']=0]='NONE';Type[Type['Null']=1]='Null';Type[Type['Int']=2]='Int';Type[Type['Float']=3]='Float';Type[Type['Binary']=4]='Binary';Type[Type['Utf8']=5]='Utf8';Type[Type['Bool']=6]='Bool';Type[Type['Decimal']=7]='Decimal';Type[Type['Date']=8]='Date';Type[Type['Time']=9]='Time';Type[Type['Timestamp']=10]='Timestamp';Type[Type['Interval']=11]='Interval';Type[Type['List']=12]='List';Type[Type['Struct']=13]='Struct';Type[Type['Union']=14]='Union';Type[Type['FixedSizeBinary']=15]='FixedSizeBinary';Type[Type['FixedSizeList']=16]='FixedSizeList';Type[Type['Map']=17]='Map';Type[Type['Dictionary']=-1]='Dictionary';Type[Type['Int8']=-2]='Int8';Type[Type['Int16']=-3]='Int16';Type[Type['Int32']=-4]='Int32';Type[Type['Int64']=-5]='Int64';Type[Type['Uint8']=-6]='Uint8';Type[Type['Uint16']=-7]='Uint16';Type[Type['Uint32']=-8]='Uint32';Type[Type['Uint64']=-9]='Uint64';Type[Type['Float16']=-10]='Float16';Type[Type['Float32']=-11]='Float32';Type[Type['Float64']=-12]='Float64';Type[Type['DateDay']=-13]='DateDay';Type[Type['DateMillisecond']=-14]='DateMillisecond';Type[Type['TimestampSecond']=-15]='TimestampSecond';Type[Type['TimestampMillisecond']=-16]='TimestampMillisecond';Type[Type['TimestampMicrosecond']=-17]='TimestampMicrosecond';Type[Type['TimestampNanosecond']=-18]='TimestampNanosecond';Type[Type['TimeSecond']=-19]='TimeSecond';Type[Type['TimeMillisecond']=-20]='TimeMillisecond';Type[Type['TimeMicrosecond']=-21]='TimeMicrosecond';Type[Type['TimeNanosecond']=-22]='TimeNanosecond';Type[Type['DenseUnion']=-23]='DenseUnion';Type[Type['SparseUnion']=-24]='SparseUnion';Type[Type['IntervalDayTime']=-25]='IntervalDayTime';Type[Type['IntervalYearMonth']=-26]='IntervalYearMonth';})(Type||(Type={}));var _Symbol$toStringTag,_Symbol$toStringTag2,_Symbol$toStringTag7;var DataType=/*#__PURE__*/function(){function DataType(){_classCallCheck(this,DataType);}_createClass(DataType,[{key:"typeId",get:function get(){return Type.NONE;}},{key:"compareTo",value:function compareTo(other){return this===other;}}],[{key:"isNull",value:function isNull(x){return x&&x.typeId===Type.Null;}},{key:"isInt",value:function isInt(x){return x&&x.typeId===Type.Int;}},{key:"isFloat",value:function isFloat(x){return x&&x.typeId===Type.Float;}},{key:"isBinary",value:function isBinary(x){return x&&x.typeId===Type.Binary;}},{key:"isUtf8",value:function isUtf8(x){return x&&x.typeId===Type.Utf8;}},{key:"isBool",value:function isBool(x){return x&&x.typeId===Type.Bool;}},{key:"isDecimal",value:function isDecimal(x){return x&&x.typeId===Type.Decimal;}},{key:"isDate",value:function isDate(x){return x&&x.typeId===Type.Date;}},{key:"isTime",value:function isTime(x){return x&&x.typeId===Type.Time;}},{key:"isTimestamp",value:function isTimestamp(x){return x&&x.typeId===Type.Timestamp;}},{key:"isInterval",value:function isInterval(x){return x&&x.typeId===Type.Interval;}},{key:"isList",value:function isList(x){return x&&x.typeId===Type.List;}},{key:"isStruct",value:function isStruct(x){return x&&x.typeId===Type.Struct;}},{key:"isUnion",value:function isUnion(x){return x&&x.typeId===Type.Union;}},{key:"isFixedSizeBinary",value:function isFixedSizeBinary(x){return x&&x.typeId===Type.FixedSizeBinary;}},{key:"isFixedSizeList",value:function isFixedSizeList(x){return x&&x.typeId===Type.FixedSizeList;}},{key:"isMap",value:function isMap(x){return x&&x.typeId===Type.Map;}},{key:"isDictionary",value:function isDictionary(x){return x&&x.typeId===Type.Dictionary;}}]);return DataType;}();_Symbol$toStringTag=Symbol.toStringTag;var Int=/*#__PURE__*/function(_DataType,_Symbol$toStringTag3){_inherits(Int,_DataType);var _super12=_createSuper$E(Int);function Int(isSigned,bitWidth){var _this17;_classCallCheck(this,Int);_this17=_super12.call(this);_defineProperty(_assertThisInitialized(_this17),'isSigned',void 0);_defineProperty(_assertThisInitialized(_this17),'bitWidth',void 0);_this17.isSigned=isSigned;_this17.bitWidth=bitWidth;return _this17;}_createClass(Int,[{key:"typeId",get:function get(){return Type.Int;}},{key:_Symbol$toStringTag3,get:function get(){return 'Int';}},{key:"toString",value:function toString(){return ''.concat(this.isSigned?'I':'Ui','nt').concat(this.bitWidth);}}]);return Int;}(DataType,_Symbol$toStringTag);var Int8=/*#__PURE__*/function(_Int){_inherits(Int8,_Int);var _super13=_createSuper$E(Int8);function Int8(){_classCallCheck(this,Int8);return _super13.call(this,true,8);}return Int8;}(Int);var Int16=/*#__PURE__*/function(_Int2){_inherits(Int16,_Int2);var _super14=_createSuper$E(Int16);function Int16(){_classCallCheck(this,Int16);return _super14.call(this,true,16);}return Int16;}(Int);var Int32=/*#__PURE__*/function(_Int3){_inherits(Int32,_Int3);var _super15=_createSuper$E(Int32);function Int32(){_classCallCheck(this,Int32);return _super15.call(this,true,32);}return Int32;}(Int);var Uint8=/*#__PURE__*/function(_Int4){_inherits(Uint8,_Int4);var _super16=_createSuper$E(Uint8);function Uint8(){_classCallCheck(this,Uint8);return _super16.call(this,false,8);}return Uint8;}(Int);var Uint16=/*#__PURE__*/function(_Int5){_inherits(Uint16,_Int5);var _super17=_createSuper$E(Uint16);function Uint16(){_classCallCheck(this,Uint16);return _super17.call(this,false,16);}return Uint16;}(Int);var Uint32=/*#__PURE__*/function(_Int6){_inherits(Uint32,_Int6);var _super18=_createSuper$E(Uint32);function Uint32(){_classCallCheck(this,Uint32);return _super18.call(this,false,32);}return Uint32;}(Int);var Precision={HALF:16,SINGLE:32,DOUBLE:64};_Symbol$toStringTag2=Symbol.toStringTag;var Float=/*#__PURE__*/function(_DataType2,_Symbol$toStringTag4){_inherits(Float,_DataType2);var _super19=_createSuper$E(Float);function Float(precision){var _this18;_classCallCheck(this,Float);_this18=_super19.call(this);_defineProperty(_assertThisInitialized(_this18),'precision',void 0);_this18.precision=precision;return _this18;}_createClass(Float,[{key:"typeId",get:function get(){return Type.Float;}},{key:_Symbol$toStringTag4,get:function get(){return 'Float';}},{key:"toString",value:function toString(){return 'Float'.concat(this.precision);}}]);return Float;}(DataType,_Symbol$toStringTag2);var Float32=/*#__PURE__*/function(_Float){_inherits(Float32,_Float);var _super20=_createSuper$E(Float32);function Float32(){_classCallCheck(this,Float32);return _super20.call(this,Precision.SINGLE);}return Float32;}(Float);var Float64=/*#__PURE__*/function(_Float2){_inherits(Float64,_Float2);var _super21=_createSuper$E(Float64);function Float64(){_classCallCheck(this,Float64);return _super21.call(this,Precision.DOUBLE);}return Float64;}(Float);_Symbol$toStringTag7=Symbol.toStringTag;var FixedSizeList=/*#__PURE__*/function(_DataType3,_Symbol$toStringTag5){_inherits(FixedSizeList,_DataType3);var _super22=_createSuper$E(FixedSizeList);function FixedSizeList(listSize,child){var _this19;_classCallCheck(this,FixedSizeList);_this19=_super22.call(this);_defineProperty(_assertThisInitialized(_this19),'listSize',void 0);_defineProperty(_assertThisInitialized(_this19),'children',void 0);_this19.listSize=listSize;_this19.children=[child];return _this19;}_createClass(FixedSizeList,[{key:"typeId",get:function get(){return Type.FixedSizeList;}},{key:"valueType",get:function get(){return this.children[0].type;}},{key:"valueField",get:function get(){return this.children[0];}},{key:_Symbol$toStringTag5,get:function get(){return 'FixedSizeList';}},{key:"toString",value:function toString(){return 'FixedSizeList['.concat(this.listSize,']<').concat(this.valueType,'>');}}]);return FixedSizeList;}(DataType,_Symbol$toStringTag7);function getArrowTypeFromTypedArray(array){switch(array.constructor){case Int8Array:return new Int8();case Uint8Array:return new Uint8();case Int16Array:return new Int16();case Uint16Array:return new Uint16();case Int32Array:return new Int32();case Uint32Array:return new Uint32();case Float32Array:return new Float32();case Float64Array:return new Float64();default:throw new Error('array type not supported');}}function deduceMeshField(attributeName,attribute,optionalMetadata){var type=getArrowTypeFromTypedArray(attribute.value);var metadata=optionalMetadata?optionalMetadata:makeMeshAttributeMetadata(attribute);var field=new Field(attributeName,new FixedSizeList(attribute.size,new Field('value',type)),false,metadata);return field;}function makeMeshAttributeMetadata(attribute){var result=new Map();if('byteOffset'in attribute){result.set('byteOffset',attribute.byteOffset.toString(10));}if('byteStride'in attribute){result.set('byteStride',attribute.byteStride.toString(10));}if('normalized'in attribute){result.set('normalized',attribute.normalized.toString());}return result;}function getDracoSchema(attributes,loaderData,indices){var metadataMap=makeMetadata(loaderData.metadata);var fields=[];var namedLoaderDataAttributes=transformAttributesLoaderData(loaderData.attributes);for(var attributeName in attributes){var attribute=attributes[attributeName];var field=getArrowFieldFromAttribute(attributeName,attribute,namedLoaderDataAttributes[attributeName]);fields.push(field);}if(indices){var indicesField=getArrowFieldFromAttribute('indices',indices);fields.push(indicesField);}return new Schema(fields,metadataMap);}function transformAttributesLoaderData(loaderData){var result={};for(var key in loaderData){var dracoAttribute=loaderData[key];result[dracoAttribute.name||'undefined']=dracoAttribute;}return result;}function getArrowFieldFromAttribute(attributeName,attribute,loaderData){var metadataMap=loaderData?makeMetadata(loaderData.metadata):undefined;var field=deduceMeshField(attributeName,attribute,metadataMap);return field;}function makeMetadata(metadata){var metadataMap=new Map();for(var key in metadata){metadataMap.set(''.concat(key,'.string'),JSON.stringify(metadata[key]));}return metadataMap;}var DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP={POSITION:'POSITION',NORMAL:'NORMAL',COLOR:'COLOR_0',TEX_COORD:'TEXCOORD_0'};var DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP={1:Int8Array,2:Uint8Array,3:Int16Array,4:Uint16Array,5:Int32Array,6:Uint32Array,9:Float32Array};var INDEX_ITEM_SIZE=4;var DracoParser=/*#__PURE__*/function(){function DracoParser(draco){_classCallCheck(this,DracoParser);_defineProperty(this,'draco',void 0);_defineProperty(this,'decoder',void 0);_defineProperty(this,'metadataQuerier',void 0);this.draco=draco;this.decoder=new this.draco.Decoder();this.metadataQuerier=new this.draco.MetadataQuerier();}_createClass(DracoParser,[{key:"destroy",value:function destroy(){this.draco.destroy(this.decoder);this.draco.destroy(this.metadataQuerier);}},{key:"parseSync",value:function parseSync(arrayBuffer){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var buffer=new this.draco.DecoderBuffer();buffer.Init(new Int8Array(arrayBuffer),arrayBuffer.byteLength);this._disableAttributeTransforms(options);var geometry_type=this.decoder.GetEncodedGeometryType(buffer);var dracoGeometry=geometry_type===this.draco.TRIANGULAR_MESH?new this.draco.Mesh():new this.draco.PointCloud();try{var dracoStatus;switch(geometry_type){case this.draco.TRIANGULAR_MESH:dracoStatus=this.decoder.DecodeBufferToMesh(buffer,dracoGeometry);break;case this.draco.POINT_CLOUD:dracoStatus=this.decoder.DecodeBufferToPointCloud(buffer,dracoGeometry);break;default:throw new Error('DRACO: Unknown geometry type.');}if(!dracoStatus.ok()||!dracoGeometry.ptr){var message='DRACO decompression failed: '.concat(dracoStatus.error_msg());throw new Error(message);}var loaderData=this._getDracoLoaderData(dracoGeometry,geometry_type,options);var geometry=this._getMeshData(dracoGeometry,loaderData,options);var boundingBox=getMeshBoundingBox(geometry.attributes);var schema=getDracoSchema(geometry.attributes,loaderData,geometry.indices);var data=_objectSpread$3(_objectSpread$3({loader:'draco',loaderData,header:{vertexCount:dracoGeometry.num_points(),boundingBox}},geometry),{},{schema});return data;}finally{this.draco.destroy(buffer);if(dracoGeometry){this.draco.destroy(dracoGeometry);}}}},{key:"_getDracoLoaderData",value:function _getDracoLoaderData(dracoGeometry,geometry_type,options){var metadata=this._getTopLevelMetadata(dracoGeometry);var attributes=this._getDracoAttributes(dracoGeometry,options);return {geometry_type,num_attributes:dracoGeometry.num_attributes(),num_points:dracoGeometry.num_points(),num_faces:dracoGeometry instanceof this.draco.Mesh?dracoGeometry.num_faces():0,metadata,attributes};}},{key:"_getDracoAttributes",value:function _getDracoAttributes(dracoGeometry,options){var dracoAttributes={};for(var attributeId=0;attributeId<dracoGeometry.num_attributes();attributeId++){var dracoAttribute=this.decoder.GetAttribute(dracoGeometry,attributeId);var metadata=this._getAttributeMetadata(dracoGeometry,attributeId);dracoAttributes[dracoAttribute.unique_id()]={unique_id:dracoAttribute.unique_id(),attribute_type:dracoAttribute.attribute_type(),data_type:dracoAttribute.data_type(),num_components:dracoAttribute.num_components(),byte_offset:dracoAttribute.byte_offset(),byte_stride:dracoAttribute.byte_stride(),normalized:dracoAttribute.normalized(),attribute_index:attributeId,metadata};var quantization=this._getQuantizationTransform(dracoAttribute,options);if(quantization){dracoAttributes[dracoAttribute.unique_id()].quantization_transform=quantization;}var octahedron=this._getOctahedronTransform(dracoAttribute,options);if(octahedron){dracoAttributes[dracoAttribute.unique_id()].octahedron_transform=octahedron;}}return dracoAttributes;}},{key:"_getMeshData",value:function _getMeshData(dracoGeometry,loaderData,options){var attributes=this._getMeshAttributes(loaderData,dracoGeometry,options);var positionAttribute=attributes.POSITION;if(!positionAttribute){throw new Error('DRACO: No position attribute found.');}if(dracoGeometry instanceof this.draco.Mesh){switch(options.topology){case'triangle-strip':return {topology:'triangle-strip',mode:4,attributes,indices:{value:this._getTriangleStripIndices(dracoGeometry),size:1}};case'triangle-list':default:return {topology:'triangle-list',mode:5,attributes,indices:{value:this._getTriangleListIndices(dracoGeometry),size:1}};}}return {topology:'point-list',mode:0,attributes};}},{key:"_getMeshAttributes",value:function _getMeshAttributes(loaderData,dracoGeometry,options){var attributes={};for(var _i45=0,_Object$values=Object.values(loaderData.attributes);_i45<_Object$values.length;_i45++){var loaderAttribute=_Object$values[_i45];var attributeName=this._deduceAttributeName(loaderAttribute,options);loaderAttribute.name=attributeName;var _this$_getAttributeVa=this._getAttributeValues(dracoGeometry,loaderAttribute),value=_this$_getAttributeVa.value,size=_this$_getAttributeVa.size;attributes[attributeName]={value,size,byteOffset:loaderAttribute.byte_offset,byteStride:loaderAttribute.byte_stride,normalized:loaderAttribute.normalized};}return attributes;}},{key:"_getTriangleListIndices",value:function _getTriangleListIndices(dracoGeometry){var numFaces=dracoGeometry.num_faces();var numIndices=numFaces*3;var byteLength=numIndices*INDEX_ITEM_SIZE;var ptr=this.draco._malloc(byteLength);try{this.decoder.GetTrianglesUInt32Array(dracoGeometry,byteLength,ptr);return new Uint32Array(this.draco.HEAPF32.buffer,ptr,numIndices).slice();}finally{this.draco._free(ptr);}}},{key:"_getTriangleStripIndices",value:function _getTriangleStripIndices(dracoGeometry){var dracoArray=new this.draco.DracoInt32Array();try{this.decoder.GetTriangleStripsFromMesh(dracoGeometry,dracoArray);return getUint32Array(dracoArray);}finally{this.draco.destroy(dracoArray);}}},{key:"_getAttributeValues",value:function _getAttributeValues(dracoGeometry,attribute){var TypedArrayCtor=DRACO_DATA_TYPE_TO_TYPED_ARRAY_MAP[attribute.data_type];var numComponents=attribute.num_components;var numPoints=dracoGeometry.num_points();var numValues=numPoints*numComponents;var byteLength=numValues*TypedArrayCtor.BYTES_PER_ELEMENT;var dataType=getDracoDataType(this.draco,TypedArrayCtor);var value;var ptr=this.draco._malloc(byteLength);try{var dracoAttribute=this.decoder.GetAttribute(dracoGeometry,attribute.attribute_index);this.decoder.GetAttributeDataArrayForAllPoints(dracoGeometry,dracoAttribute,dataType,byteLength,ptr);value=new TypedArrayCtor(this.draco.HEAPF32.buffer,ptr,numValues).slice();}finally{this.draco._free(ptr);}return {value,size:numComponents};}},{key:"_deduceAttributeName",value:function _deduceAttributeName(attribute,options){var uniqueId=attribute.unique_id;for(var _i46=0,_Object$entries=Object.entries(options.extraAttributes||{});_i46<_Object$entries.length;_i46++){var _Object$entries$_i=_slicedToArray(_Object$entries[_i46],2),attributeName=_Object$entries$_i[0],attributeUniqueId=_Object$entries$_i[1];if(attributeUniqueId===uniqueId){return attributeName;}}var thisAttributeType=attribute.attribute_type;for(var dracoAttributeConstant in DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP){var attributeType=this.draco[dracoAttributeConstant];if(attributeType===thisAttributeType){return DRACO_TO_GLTF_ATTRIBUTE_NAME_MAP[dracoAttributeConstant];}}var entryName=options.attributeNameEntry||'name';if(attribute.metadata[entryName]){return attribute.metadata[entryName].string;}return 'CUSTOM_ATTRIBUTE_'.concat(uniqueId);}},{key:"_getTopLevelMetadata",value:function _getTopLevelMetadata(dracoGeometry){var dracoMetadata=this.decoder.GetMetadata(dracoGeometry);return this._getDracoMetadata(dracoMetadata);}},{key:"_getAttributeMetadata",value:function _getAttributeMetadata(dracoGeometry,attributeId){var dracoMetadata=this.decoder.GetAttributeMetadata(dracoGeometry,attributeId);return this._getDracoMetadata(dracoMetadata);}},{key:"_getDracoMetadata",value:function _getDracoMetadata(dracoMetadata){if(!dracoMetadata||!dracoMetadata.ptr){return {};}var result={};var numEntries=this.metadataQuerier.NumEntries(dracoMetadata);for(var entryIndex=0;entryIndex<numEntries;entryIndex++){var entryName=this.metadataQuerier.GetEntryName(dracoMetadata,entryIndex);result[entryName]=this._getDracoMetadataField(dracoMetadata,entryName);}return result;}},{key:"_getDracoMetadataField",value:function _getDracoMetadataField(dracoMetadata,entryName){var dracoArray=new this.draco.DracoInt32Array();try{this.metadataQuerier.GetIntEntryArray(dracoMetadata,entryName,dracoArray);var intArray=getInt32Array(dracoArray);return {int:this.metadataQuerier.GetIntEntry(dracoMetadata,entryName),string:this.metadataQuerier.GetStringEntry(dracoMetadata,entryName),double:this.metadataQuerier.GetDoubleEntry(dracoMetadata,entryName),intArray};}finally{this.draco.destroy(dracoArray);}}},{key:"_disableAttributeTransforms",value:function _disableAttributeTransforms(options){var _options$quantizedAtt=options.quantizedAttributes,quantizedAttributes=_options$quantizedAtt===void 0?[]:_options$quantizedAtt,_options$octahedronAt=options.octahedronAttributes,octahedronAttributes=_options$octahedronAt===void 0?[]:_options$octahedronAt;var skipAttributes=[].concat(_toConsumableArray(quantizedAttributes),_toConsumableArray(octahedronAttributes));var _iterator32=_createForOfIteratorHelper$3(skipAttributes),_step32;try{for(_iterator32.s();!(_step32=_iterator32.n()).done;){var dracoAttributeName=_step32.value;this.decoder.SkipAttributeTransform(this.draco[dracoAttributeName]);}}catch(err){_iterator32.e(err);}finally{_iterator32.f();}}},{key:"_getQuantizationTransform",value:function _getQuantizationTransform(dracoAttribute,options){var _this20=this;var _options$quantizedAtt2=options.quantizedAttributes,quantizedAttributes=_options$quantizedAtt2===void 0?[]:_options$quantizedAtt2;var attribute_type=dracoAttribute.attribute_type();var skip=quantizedAttributes.map(function(type){return _this20.decoder[type];}).includes(attribute_type);if(skip){var transform=new this.draco.AttributeQuantizationTransform();try{if(transform.InitFromAttribute(dracoAttribute)){return {quantization_bits:transform.quantization_bits(),range:transform.range(),min_values:new Float32Array([1,2,3]).map(function(i){return transform.min_value(i);})};}}finally{this.draco.destroy(transform);}}return null;}},{key:"_getOctahedronTransform",value:function _getOctahedronTransform(dracoAttribute,options){var _this21=this;var _options$octahedronAt2=options.octahedronAttributes,octahedronAttributes=_options$octahedronAt2===void 0?[]:_options$octahedronAt2;var attribute_type=dracoAttribute.attribute_type();var octahedron=octahedronAttributes.map(function(type){return _this21.decoder[type];}).includes(attribute_type);if(octahedron){var transform=new this.draco.AttributeQuantizationTransform();try{if(transform.InitFromAttribute(dracoAttribute)){return {quantization_bits:transform.quantization_bits()};}}finally{this.draco.destroy(transform);}}return null;}}]);return DracoParser;}();function getDracoDataType(draco,attributeType){switch(attributeType){case Float32Array:return draco.DT_FLOAT32;case Int8Array:return draco.DT_INT8;case Int16Array:return draco.DT_INT16;case Int32Array:return draco.DT_INT32;case Uint8Array:return draco.DT_UINT8;case Uint16Array:return draco.DT_UINT16;case Uint32Array:return draco.DT_UINT32;default:return draco.DT_INVALID;}}function getInt32Array(dracoArray){var numValues=dracoArray.size();var intArray=new Int32Array(numValues);for(var _i47=0;_i47<numValues;_i47++){intArray[_i47]=dracoArray.GetValue(_i47);}return intArray;}function getUint32Array(dracoArray){var numValues=dracoArray.size();var intArray=new Int32Array(numValues);for(var _i48=0;_i48<numValues;_i48++){intArray[_i48]=dracoArray.GetValue(_i48);}return intArray;}var DRACO_VERSION='1.4.1';var DRACO_JS_DECODER_URL='https://www.gstatic.com/draco/versioned/decoders/'.concat(DRACO_VERSION,'/draco_decoder.js');var DRACO_WASM_WRAPPER_URL='https://www.gstatic.com/draco/versioned/decoders/'.concat(DRACO_VERSION,'/draco_wasm_wrapper.js');var DRACO_WASM_DECODER_URL='https://www.gstatic.com/draco/versioned/decoders/'.concat(DRACO_VERSION,'/draco_decoder.wasm');var loadDecoderPromise;function loadDracoDecoderModule(_x44){return _loadDracoDecoderModule.apply(this,arguments);}function _loadDracoDecoderModule(){_loadDracoDecoderModule=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee28(options){var modules;return regenerator.wrap(function _callee28$(_context32){while(1){switch(_context32.prev=_context32.next){case 0:modules=options.modules||{};if(modules.draco3d){loadDecoderPromise=loadDecoderPromise||modules.draco3d.createDecoderModule({}).then(function(draco){return {draco};});}else {loadDecoderPromise=loadDecoderPromise||loadDracoDecoder(options);}_context32.next=4;return loadDecoderPromise;case 4:return _context32.abrupt("return",_context32.sent);case 5:case"end":return _context32.stop();}}},_callee28);}));return _loadDracoDecoderModule.apply(this,arguments);}function loadDracoDecoder(_x45){return _loadDracoDecoder.apply(this,arguments);}function _loadDracoDecoder(){_loadDracoDecoder=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee29(options){var DracoDecoderModule,wasmBinary,_yield$Promise$all,_yield$Promise$all2;return regenerator.wrap(function _callee29$(_context33){while(1){switch(_context33.prev=_context33.next){case 0:_context33.t0=options.draco&&options.draco.decoderType;_context33.next=_context33.t0==='js'?3:_context33.t0==='wasm'?7:7;break;case 3:_context33.next=5;return loadLibrary(DRACO_JS_DECODER_URL,'draco',options);case 5:DracoDecoderModule=_context33.sent;return _context33.abrupt("break",22);case 7:_context33.t1=Promise;_context33.next=11;return loadLibrary(DRACO_WASM_WRAPPER_URL,'draco',options);case 11:_context33.t2=_context33.sent;_context33.next=14;return loadLibrary(DRACO_WASM_DECODER_URL,'draco',options);case 14:_context33.t3=_context33.sent;_context33.t4=[_context33.t2,_context33.t3];_context33.next=18;return _context33.t1.all.call(_context33.t1,_context33.t4);case 18:_yield$Promise$all=_context33.sent;_yield$Promise$all2=_slicedToArray(_yield$Promise$all,2);DracoDecoderModule=_yield$Promise$all2[0];wasmBinary=_yield$Promise$all2[1];case 22:DracoDecoderModule=DracoDecoderModule||globalThis$1.DracoDecoderModule;_context33.next=25;return initializeDracoDecoder(DracoDecoderModule,wasmBinary);case 25:return _context33.abrupt("return",_context33.sent);case 26:case"end":return _context33.stop();}}},_callee29);}));return _loadDracoDecoder.apply(this,arguments);}function initializeDracoDecoder(DracoDecoderModule,wasmBinary){var options={};if(wasmBinary){options.wasmBinary=wasmBinary;}return new Promise(function(resolve){DracoDecoderModule(_objectSpread$3(_objectSpread$3({},options),{},{onModuleLoaded:function onModuleLoaded(draco){return resolve({draco});}}));});}var DracoLoader=_objectSpread$3(_objectSpread$3({},DracoLoader$1),{},{parse:parse$2});function parse$2(_x46,_x47){return _parse$2.apply(this,arguments);}function _parse$2(){_parse$2=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee30(arrayBuffer,options){var _yield$loadDracoDecod,draco,dracoParser;return regenerator.wrap(function _callee30$(_context34){while(1){switch(_context34.prev=_context34.next){case 0:_context34.next=2;return loadDracoDecoderModule(options);case 2:_yield$loadDracoDecod=_context34.sent;draco=_yield$loadDracoDecod.draco;dracoParser=new DracoParser(draco);_context34.prev=5;return _context34.abrupt("return",dracoParser.parseSync(arrayBuffer,options===null||options===void 0?void 0:options.draco));case 7:_context34.prev=7;dracoParser.destroy();return _context34.finish(7);case 10:case"end":return _context34.stop();}}},_callee30,null,[[5,,7,10]]);}));return _parse$2.apply(this,arguments);}var GL_PRIMITIVE_MODE={POINTS:0x0000,LINES:0x0001,LINE_LOOP:0x0002,LINE_STRIP:0x0003,TRIANGLES:0x0004,TRIANGLE_STRIP:0x0005,TRIANGLE_FAN:0x0006};var GL_TYPE={BYTE:5120,UNSIGNED_BYTE:5121,SHORT:5122,UNSIGNED_SHORT:5123,INT:5124,UNSIGNED_INT:5125,FLOAT:5126,DOUBLE:5130};var GL$1=_objectSpread$3(_objectSpread$3({},GL_PRIMITIVE_MODE),GL_TYPE);var GL_TYPE_TO_ARRAY_TYPE={[GL_TYPE.DOUBLE]:Float64Array,[GL_TYPE.FLOAT]:Float32Array,[GL_TYPE.UNSIGNED_SHORT]:Uint16Array,[GL_TYPE.UNSIGNED_INT]:Uint32Array,[GL_TYPE.UNSIGNED_BYTE]:Uint8Array,[GL_TYPE.BYTE]:Int8Array,[GL_TYPE.SHORT]:Int16Array,[GL_TYPE.INT]:Int32Array};var NAME_TO_GL_TYPE={DOUBLE:GL_TYPE.DOUBLE,FLOAT:GL_TYPE.FLOAT,UNSIGNED_SHORT:GL_TYPE.UNSIGNED_SHORT,UNSIGNED_INT:GL_TYPE.UNSIGNED_INT,UNSIGNED_BYTE:GL_TYPE.UNSIGNED_BYTE,BYTE:GL_TYPE.BYTE,SHORT:GL_TYPE.SHORT,INT:GL_TYPE.INT};var ERR_TYPE_CONVERSION='Failed to convert GL type';var GLType=/*#__PURE__*/function(){function GLType(){_classCallCheck(this,GLType);}_createClass(GLType,null,[{key:"fromTypedArray",value:function fromTypedArray(arrayOrType){arrayOrType=ArrayBuffer.isView(arrayOrType)?arrayOrType.constructor:arrayOrType;for(var glType in GL_TYPE_TO_ARRAY_TYPE){var ArrayType=GL_TYPE_TO_ARRAY_TYPE[glType];if(ArrayType===arrayOrType){return glType;}}throw new Error(ERR_TYPE_CONVERSION);}},{key:"fromName",value:function fromName(name){var glType=NAME_TO_GL_TYPE[name];if(!glType){throw new Error(ERR_TYPE_CONVERSION);}return glType;}},{key:"getArrayType",value:function getArrayType(glType){switch(glType){case GL_TYPE.UNSIGNED_SHORT_5_6_5:case GL_TYPE.UNSIGNED_SHORT_4_4_4_4:case GL_TYPE.UNSIGNED_SHORT_5_5_5_1:return Uint16Array;default:var ArrayType=GL_TYPE_TO_ARRAY_TYPE[glType];if(!ArrayType){throw new Error(ERR_TYPE_CONVERSION);}return ArrayType;}}},{key:"getByteSize",value:function getByteSize(glType){var ArrayType=GLType.getArrayType(glType);return ArrayType.BYTES_PER_ELEMENT;}},{key:"validate",value:function validate(glType){return Boolean(GLType.getArrayType(glType));}},{key:"createTypedArray",value:function createTypedArray(glType,buffer){var byteOffset=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;var length=arguments.length>3?arguments[3]:undefined;if(length===undefined){length=(buffer.byteLength-byteOffset)/GLType.getByteSize(glType);}var ArrayType=GLType.getArrayType(glType);return new ArrayType(buffer,byteOffset,length);}}]);return GLType;}();function assert$2(condition,message){if(!condition){throw new Error('math.gl assertion failed. '.concat(message));}}function decodeRGB565(rgb565){var target=arguments.length>1&&arguments[1]!==undefined?arguments[1]:[0,0,0];var r5=rgb565>>11&31;var g6=rgb565>>5&63;var b5=rgb565&31;target[0]=r5<<3;target[1]=g6<<2;target[2]=b5<<3;return target;}new Vector2();new Vector3$1();new Vector2();new Vector2();function fromSNorm(value){var rangeMaximum=arguments.length>1&&arguments[1]!==undefined?arguments[1]:255;return clamp(value,0.0,rangeMaximum)/rangeMaximum*2.0-1.0;}function signNotZero(value){return value<0.0?-1.0:1.0;}function octDecodeInRange(x,y,rangeMax,result){assert$2(result);if(x<0||x>rangeMax||y<0||y>rangeMax){throw new Error('x and y must be unsigned normalized integers between 0 and '.concat(rangeMax));}result.x=fromSNorm(x,rangeMax);result.y=fromSNorm(y,rangeMax);result.z=1.0-(Math.abs(result.x)+Math.abs(result.y));if(result.z<0.0){var oldVX=result.x;result.x=(1.0-Math.abs(result.y))*signNotZero(oldVX);result.y=(1.0-Math.abs(oldVX))*signNotZero(result.y);}return result.normalize();}function octDecode(x,y,result){return octDecodeInRange(x,y,255,result);}var Tile3DFeatureTable=/*#__PURE__*/function(){function Tile3DFeatureTable(featureTableJson,featureTableBinary){_classCallCheck(this,Tile3DFeatureTable);_defineProperty(this,'json',void 0);_defineProperty(this,'buffer',void 0);_defineProperty(this,'featuresLength',0);_defineProperty(this,'_cachedTypedArrays',{});this.json=featureTableJson;this.buffer=featureTableBinary;}_createClass(Tile3DFeatureTable,[{key:"getExtension",value:function getExtension(extensionName){return this.json.extensions&&this.json.extensions[extensionName];}},{key:"hasProperty",value:function hasProperty(propertyName){return Boolean(this.json[propertyName]);}},{key:"getGlobalProperty",value:function getGlobalProperty(propertyName){var componentType=arguments.length>1&&arguments[1]!==undefined?arguments[1]:GL$1.UNSIGNED_INT;var componentLength=arguments.length>2&&arguments[2]!==undefined?arguments[2]:1;var jsonValue=this.json[propertyName];if(jsonValue&&Number.isFinite(jsonValue.byteOffset)){return this._getTypedArrayFromBinary(propertyName,componentType,componentLength,1,jsonValue.byteOffset);}return jsonValue;}},{key:"getPropertyArray",value:function getPropertyArray(propertyName,componentType,componentLength){var jsonValue=this.json[propertyName];if(jsonValue&&Number.isFinite(jsonValue.byteOffset)){if('componentType'in jsonValue){componentType=GLType.fromName(jsonValue.componentType);}return this._getTypedArrayFromBinary(propertyName,componentType,componentLength,this.featuresLength,jsonValue.byteOffset);}return this._getTypedArrayFromArray(propertyName,componentType,jsonValue);}},{key:"getProperty",value:function getProperty(propertyName,componentType,componentLength,featureId,result){var jsonValue=this.json[propertyName];if(!jsonValue){return jsonValue;}var typedArray=this.getPropertyArray(propertyName,componentType,componentLength);if(componentLength===1){return typedArray[featureId];}for(var _i49=0;_i49<componentLength;++_i49){result[_i49]=typedArray[componentLength*featureId+_i49];}return result;}},{key:"_getTypedArrayFromBinary",value:function _getTypedArrayFromBinary(propertyName,componentType,componentLength,count,byteOffset){var cachedTypedArrays=this._cachedTypedArrays;var typedArray=cachedTypedArrays[propertyName];if(!typedArray){typedArray=GLType.createTypedArray(componentType,this.buffer.buffer,this.buffer.byteOffset+byteOffset,count*componentLength);cachedTypedArrays[propertyName]=typedArray;}return typedArray;}},{key:"_getTypedArrayFromArray",value:function _getTypedArrayFromArray(propertyName,componentType,array){var cachedTypedArrays=this._cachedTypedArrays;var typedArray=cachedTypedArrays[propertyName];if(!typedArray){typedArray=GLType.createTypedArray(componentType,array);cachedTypedArrays[propertyName]=typedArray;}return typedArray;}}]);return Tile3DFeatureTable;}();var COMPONENTS_PER_ATTRIBUTE={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16};var UNPACKER={SCALAR:function SCALAR(values,i){return values[i];},VEC2:function VEC2(values,i){return [values[2*i+0],values[2*i+1]];},VEC3:function VEC3(values,i){return [values[3*i+0],values[3*i+1],values[3*i+2]];},VEC4:function VEC4(values,i){return [values[4*i+0],values[4*i+1],values[4*i+2],values[4*i+3]];},MAT2:function MAT2(values,i){return [values[4*i+0],values[4*i+1],values[4*i+2],values[4*i+3]];},MAT3:function MAT3(values,i){return [values[9*i+0],values[9*i+1],values[9*i+2],values[9*i+3],values[9*i+4],values[9*i+5],values[9*i+6],values[9*i+7],values[9*i+8]];},MAT4:function MAT4(values,i){return [values[16*i+0],values[16*i+1],values[16*i+2],values[16*i+3],values[16*i+4],values[16*i+5],values[16*i+6],values[16*i+7],values[16*i+8],values[16*i+9],values[16*i+10],values[16*i+11],values[16*i+12],values[16*i+13],values[16*i+14],values[16*i+15]];}};var PACKER={SCALAR:function SCALAR(x,values,i){values[i]=x;},VEC2:function VEC2(x,values,i){values[2*i+0]=x[0];values[2*i+1]=x[1];},VEC3:function VEC3(x,values,i){values[3*i+0]=x[0];values[3*i+1]=x[1];values[3*i+2]=x[2];},VEC4:function VEC4(x,values,i){values[4*i+0]=x[0];values[4*i+1]=x[1];values[4*i+2]=x[2];values[4*i+3]=x[3];},MAT2:function MAT2(x,values,i){values[4*i+0]=x[0];values[4*i+1]=x[1];values[4*i+2]=x[2];values[4*i+3]=x[3];},MAT3:function MAT3(x,values,i){values[9*i+0]=x[0];values[9*i+1]=x[1];values[9*i+2]=x[2];values[9*i+3]=x[3];values[9*i+4]=x[4];values[9*i+5]=x[5];values[9*i+6]=x[6];values[9*i+7]=x[7];values[9*i+8]=x[8];values[9*i+9]=x[9];},MAT4:function MAT4(x,values,i){values[16*i+0]=x[0];values[16*i+1]=x[1];values[16*i+2]=x[2];values[16*i+3]=x[3];values[16*i+4]=x[4];values[16*i+5]=x[5];values[16*i+6]=x[6];values[16*i+7]=x[7];values[16*i+8]=x[8];values[16*i+9]=x[9];values[16*i+10]=x[10];values[16*i+11]=x[11];values[16*i+12]=x[12];values[16*i+13]=x[13];values[16*i+14]=x[14];values[16*i+15]=x[15];}};function createTypedArrayFromAccessor(tile3DAccessor,buffer,byteOffset,length){var componentType=tile3DAccessor.componentType;assert$7(tile3DAccessor.componentType);var type=typeof componentType==='string'?GLType.fromName(componentType):componentType;var size=COMPONENTS_PER_ATTRIBUTE[tile3DAccessor.type];var unpacker=UNPACKER[tile3DAccessor.type];var packer=PACKER[tile3DAccessor.type];byteOffset+=tile3DAccessor.byteOffset;var values=GLType.createTypedArray(type,buffer,byteOffset,size*length);return {values,type,size,unpacker,packer};}var defined$1=function defined$1(x){return x!==undefined;};function initializeHierarchy(batchTable,jsonHeader,binaryBody){if(!jsonHeader){return null;}var hierarchy=batchTable.getExtension('3DTILES_batch_table_hierarchy');var legacyHierarchy=jsonHeader.HIERARCHY;if(legacyHierarchy){console.warn('3D Tile Parser: HIERARCHY is deprecated. Use 3DTILES_batch_table_hierarchy.');jsonHeader.extensions=jsonHeader.extensions||{};jsonHeader.extensions['3DTILES_batch_table_hierarchy']=legacyHierarchy;hierarchy=legacyHierarchy;}if(!hierarchy){return null;}return initializeHierarchyValues(hierarchy,binaryBody);}function initializeHierarchyValues(hierarchyJson,binaryBody){var i;var classId;var binaryAccessor;var instancesLength=hierarchyJson.instancesLength;var classes=hierarchyJson.classes;var classIds=hierarchyJson.classIds;var parentCounts=hierarchyJson.parentCounts;var parentIds=hierarchyJson.parentIds;var parentIdsLength=instancesLength;if(defined$1(classIds.byteOffset)){classIds.componentType=defaultValue(classIds.componentType,GL.UNSIGNED_SHORT);classIds.type=AttributeType.SCALAR;binaryAccessor=getBinaryAccessor(classIds);classIds=binaryAccessor.createArrayBufferView(binaryBody.buffer,binaryBody.byteOffset+classIds.byteOffset,instancesLength);}var parentIndexes;if(defined$1(parentCounts)){if(defined$1(parentCounts.byteOffset)){parentCounts.componentType=defaultValue(parentCounts.componentType,GL.UNSIGNED_SHORT);parentCounts.type=AttributeType.SCALAR;binaryAccessor=getBinaryAccessor(parentCounts);parentCounts=binaryAccessor.createArrayBufferView(binaryBody.buffer,binaryBody.byteOffset+parentCounts.byteOffset,instancesLength);}parentIndexes=new Uint16Array(instancesLength);parentIdsLength=0;for(i=0;i<instancesLength;++i){parentIndexes[i]=parentIdsLength;parentIdsLength+=parentCounts[i];}}if(defined$1(parentIds)&&defined$1(parentIds.byteOffset)){parentIds.componentType=defaultValue(parentIds.componentType,GL.UNSIGNED_SHORT);parentIds.type=AttributeType.SCALAR;binaryAccessor=getBinaryAccessor(parentIds);parentIds=binaryAccessor.createArrayBufferView(binaryBody.buffer,binaryBody.byteOffset+parentIds.byteOffset,parentIdsLength);}var classesLength=classes.length;for(i=0;i<classesLength;++i){var classInstancesLength=classes[i].length;var properties=classes[i].instances;var binaryProperties=getBinaryProperties(classInstancesLength,properties,binaryBody);classes[i].instances=combine(binaryProperties,properties);}var classCounts=new Array(classesLength).fill(0);var classIndexes=new Uint16Array(instancesLength);for(i=0;i<instancesLength;++i){classId=classIds[i];classIndexes[i]=classCounts[classId];++classCounts[classId];}var hierarchy={classes,classIds,classIndexes,parentCounts,parentIndexes,parentIds};validateHierarchy(hierarchy);return hierarchy;}function traverseHierarchy(hierarchy,instanceIndex,endConditionCallback){if(!hierarchy){return;}var parentCounts=hierarchy.parentCounts;var parentIds=hierarchy.parentIds;if(parentIds){return endConditionCallback(hierarchy,instanceIndex);}if(parentCounts>0){return traverseHierarchyMultipleParents(hierarchy,instanceIndex,endConditionCallback);}return traverseHierarchySingleParent(hierarchy,instanceIndex,endConditionCallback);}function traverseHierarchyMultipleParents(hierarchy,instanceIndex,endConditionCallback){var classIds=hierarchy.classIds;var parentCounts=hierarchy.parentCounts;var parentIds=hierarchy.parentIds;var parentIndexes=hierarchy.parentIndexes;var instancesLength=classIds.length;var visited=scratchVisited;visited.length=Math.max(visited.length,instancesLength);var visitedMarker=++marker;var stack=scratchStack;stack.length=0;stack.push(instanceIndex);while(stack.length>0){instanceIndex=stack.pop();if(visited[instanceIndex]===visitedMarker){continue;}visited[instanceIndex]=visitedMarker;var result=endConditionCallback(hierarchy,instanceIndex);if(defined$1(result)){return result;}var parentCount=parentCounts[instanceIndex];var parentIndex=parentIndexes[instanceIndex];for(var _i50=0;_i50<parentCount;++_i50){var parentId=parentIds[parentIndex+_i50];if(parentId!==instanceIndex){stack.push(parentId);}}}return null;}function traverseHierarchySingleParent(hierarchy,instanceIndex,endConditionCallback){var hasParent=true;while(hasParent){var result=endConditionCallback(hierarchy,instanceIndex);if(defined$1(result)){return result;}var parentId=hierarchy.parentIds[instanceIndex];hasParent=parentId!==instanceIndex;instanceIndex=parentId;}throw new Error('traverseHierarchySingleParent');}function validateHierarchy(hierarchy){var classIds=hierarchy.classIds;var instancesLength=classIds.length;for(var _i51=0;_i51<instancesLength;++_i51){validateInstance(hierarchy,_i51,stack);}}function validateInstance(hierarchy,instanceIndex,stack){var parentCounts=hierarchy.parentCounts;var parentIds=hierarchy.parentIds;var parentIndexes=hierarchy.parentIndexes;var classIds=hierarchy.classIds;var instancesLength=classIds.length;if(!defined$1(parentIds)){return;}assert(instanceIndex<instancesLength,'Parent index '.concat(instanceIndex,' exceeds the total number of instances: ').concat(instancesLength));assert(stack.indexOf(instanceIndex)===-1,'Circular dependency detected in the batch table hierarchy.');stack.push(instanceIndex);var parentCount=defined$1(parentCounts)?parentCounts[instanceIndex]:1;var parentIndex=defined$1(parentCounts)?parentIndexes[instanceIndex]:instanceIndex;for(var _i52=0;_i52<parentCount;++_i52){var parentId=parentIds[parentIndex+_i52];if(parentId!==instanceIndex){validateInstance(hierarchy,parentId,stack);}}stack.pop(instanceIndex);}function defined(x){return x!==undefined&&x!==null;}var clone=function clone(x,y){return x;};var IGNORED_PROPERTY_FIELDS={HIERARCHY:true,extensions:true,extras:true};var Tile3DBatchTableParser=/*#__PURE__*/function(){function Tile3DBatchTableParser(json,binary,featureCount){var options=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};_classCallCheck(this,Tile3DBatchTableParser);var _this$json;_defineProperty(this,'json',void 0);_defineProperty(this,'binary',void 0);_defineProperty(this,'featureCount',void 0);_defineProperty(this,'_extensions',void 0);_defineProperty(this,'_properties',void 0);_defineProperty(this,'_binaryProperties',void 0);_defineProperty(this,'_hierarchy',void 0);assert$7(featureCount>=0);this.json=json||{};this.binary=binary;this.featureCount=featureCount;this._extensions=((_this$json=this.json)===null||_this$json===void 0?void 0:_this$json.extensions)||{};this._properties={};for(var propertyName in this.json){if(!IGNORED_PROPERTY_FIELDS[propertyName]){this._properties[propertyName]=this.json[propertyName];}}this._binaryProperties=this._initializeBinaryProperties();if(options['3DTILES_batch_table_hierarchy']){this._hierarchy=initializeHierarchy(this,this.json,this.binary);}}_createClass(Tile3DBatchTableParser,[{key:"getExtension",value:function getExtension(extensionName){return this.json&&this.json.extensions&&this.json.extensions[extensionName];}},{key:"memorySizeInBytes",value:function memorySizeInBytes(){return 0;}},{key:"isClass",value:function isClass(batchId,className){this._checkBatchId(batchId);assert$7(typeof className==='string',className);if(this._hierarchy){var result=traverseHierarchy(this._hierarchy,batchId,function(hierarchy,instanceIndex){var classId=hierarchy.classIds[instanceIndex];var instanceClass=hierarchy.classes[classId];return instanceClass.name===className;});return defined(result);}return false;}},{key:"isExactClass",value:function isExactClass(batchId,className){assert$7(typeof className==='string',className);return this.getExactClassName(batchId)===className;}},{key:"getExactClassName",value:function getExactClassName(batchId){this._checkBatchId(batchId);if(this._hierarchy){var classId=this._hierarchy.classIds[batchId];var instanceClass=this._hierarchy.classes[classId];return instanceClass.name;}return undefined;}},{key:"hasProperty",value:function hasProperty(batchId,name){this._checkBatchId(batchId);assert$7(typeof name==='string',name);return defined(this._properties[name])||this._hasPropertyInHierarchy(batchId,name);}},{key:"getPropertyNames",value:function getPropertyNames(batchId,results){var _results;this._checkBatchId(batchId);results=defined(results)?results:[];results.length=0;var propertyNames=Object.keys(this._properties);(_results=results).push.apply(_results,_toConsumableArray(propertyNames));if(this._hierarchy){this._getPropertyNamesInHierarchy(batchId,results);}return results;}},{key:"getProperty",value:function getProperty(batchId,name){this._checkBatchId(batchId);assert$7(typeof name==='string',name);if(this._binaryProperties){var binaryProperty=this._binaryProperties[name];if(defined(binaryProperty)){return this._getBinaryProperty(binaryProperty,batchId);}}var propertyValues=this._properties[name];if(defined(propertyValues)){return clone(propertyValues[batchId]);}if(this._hierarchy){var hierarchyProperty=this._getHierarchyProperty(batchId,name);if(defined(hierarchyProperty)){return hierarchyProperty;}}return undefined;}},{key:"setProperty",value:function setProperty(batchId,name,value){var featureCount=this.featureCount;this._checkBatchId(batchId);assert$7(typeof name==='string',name);if(this._binaryProperties){var binaryProperty=this._binaryProperties[name];if(binaryProperty){this._setBinaryProperty(binaryProperty,batchId,value);return;}}if(this._hierarchy){if(this._setHierarchyProperty(this,batchId,name,value)){return;}}var propertyValues=this._properties[name];if(!defined(propertyValues)){this._properties[name]=new Array(featureCount);propertyValues=this._properties[name];}propertyValues[batchId]=clone(value);}},{key:"_checkBatchId",value:function _checkBatchId(batchId){var valid=batchId>=0&&batchId<this.featureCount;if(!valid){throw new Error('batchId not in range [0, featureCount - 1].');}}},{key:"_getBinaryProperty",value:function _getBinaryProperty(binaryProperty,index){return binaryProperty.unpack(binaryProperty.typedArray,index);}},{key:"_setBinaryProperty",value:function _setBinaryProperty(binaryProperty,index,value){binaryProperty.pack(value,binaryProperty.typedArray,index);}},{key:"_initializeBinaryProperties",value:function _initializeBinaryProperties(){var binaryProperties=null;for(var _name3 in this._properties){var property=this._properties[_name3];var binaryProperty=this._initializeBinaryProperty(_name3,property);if(binaryProperty){binaryProperties=binaryProperties||{};binaryProperties[_name3]=binaryProperty;}}return binaryProperties;}},{key:"_initializeBinaryProperty",value:function _initializeBinaryProperty(name,property){if('byteOffset'in property){var tile3DAccessor=property;assert$7(this.binary,'Property '.concat(name,' requires a batch table binary.'));assert$7(tile3DAccessor.type,'Property '.concat(name,' requires a type.'));var accessor=createTypedArrayFromAccessor(tile3DAccessor,this.binary.buffer,this.binary.byteOffset|0,this.featureCount);return {typedArray:accessor.values,componentCount:accessor.size,unpack:accessor.unpacker,pack:accessor.packer};}return null;}},{key:"_hasPropertyInHierarchy",value:function _hasPropertyInHierarchy(batchId,name){if(!this._hierarchy){return false;}var result=traverseHierarchy(this._hierarchy,batchId,function(hierarchy,instanceIndex){var classId=hierarchy.classIds[instanceIndex];var instances=hierarchy.classes[classId].instances;return defined(instances[name]);});return defined(result);}},{key:"_getPropertyNamesInHierarchy",value:function _getPropertyNamesInHierarchy(batchId,results){traverseHierarchy(this._hierarchy,batchId,function(hierarchy,instanceIndex){var classId=hierarchy.classIds[instanceIndex];var instances=hierarchy.classes[classId].instances;for(var _name4 in instances){if(instances.hasOwnProperty(_name4)){if(results.indexOf(_name4)===-1){results.push(_name4);}}}});}},{key:"_getHierarchyProperty",value:function _getHierarchyProperty(batchId,name){var _this22=this;return traverseHierarchy(this._hierarchy,batchId,function(hierarchy,instanceIndex){var classId=hierarchy.classIds[instanceIndex];var instanceClass=hierarchy.classes[classId];var indexInClass=hierarchy.classIndexes[instanceIndex];var propertyValues=instanceClass.instances[name];if(defined(propertyValues)){if(defined(propertyValues.typedArray)){return _this22._getBinaryProperty(propertyValues,indexInClass);}return clone(propertyValues[indexInClass]);}return null;});}},{key:"_setHierarchyProperty",value:function _setHierarchyProperty(batchTable,batchId,name,value){var _this23=this;var result=traverseHierarchy(this._hierarchy,batchId,function(hierarchy,instanceIndex){var classId=hierarchy.classIds[instanceIndex];var instanceClass=hierarchy.classes[classId];var indexInClass=hierarchy.classIndexes[instanceIndex];var propertyValues=instanceClass.instances[name];if(defined(propertyValues)){assert$7(instanceIndex===batchId,'Inherited property "'.concat(name,'" is read-only.'));if(defined(propertyValues.typedArray)){_this23._setBinaryProperty(propertyValues,indexInClass,value);}else {propertyValues[indexInClass]=clone(value);}return true;}return false;});return defined(result);}}]);return Tile3DBatchTableParser;}();var SIZEOF_UINT32$1=4;function parse3DTileHeaderSync(tile,arrayBuffer){var byteOffset=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;var view=new DataView(arrayBuffer);tile.magic=view.getUint32(byteOffset,true);byteOffset+=SIZEOF_UINT32$1;tile.version=view.getUint32(byteOffset,true);byteOffset+=SIZEOF_UINT32$1;tile.byteLength=view.getUint32(byteOffset,true);byteOffset+=SIZEOF_UINT32$1;if(tile.version!==1){throw new Error('3D Tile Version '.concat(tile.version,' not supported'));}return byteOffset;}var SIZEOF_UINT32=4;var DEPRECATION_WARNING='b3dm tile in legacy format.';function parse3DTileTablesHeaderSync(tile,arrayBuffer,byteOffset){var view=new DataView(arrayBuffer);var batchLength;tile.header=tile.header||{};var featureTableJsonByteLength=view.getUint32(byteOffset,true);byteOffset+=SIZEOF_UINT32;var featureTableBinaryByteLength=view.getUint32(byteOffset,true);byteOffset+=SIZEOF_UINT32;var batchTableJsonByteLength=view.getUint32(byteOffset,true);byteOffset+=SIZEOF_UINT32;var batchTableBinaryByteLength=view.getUint32(byteOffset,true);byteOffset+=SIZEOF_UINT32;if(batchTableJsonByteLength>=570425344){byteOffset-=SIZEOF_UINT32*2;batchLength=featureTableJsonByteLength;batchTableJsonByteLength=featureTableBinaryByteLength;batchTableBinaryByteLength=0;featureTableJsonByteLength=0;featureTableBinaryByteLength=0;console.warn(DEPRECATION_WARNING);}else if(batchTableBinaryByteLength>=570425344){byteOffset-=SIZEOF_UINT32;batchLength=batchTableJsonByteLength;batchTableJsonByteLength=featureTableJsonByteLength;batchTableBinaryByteLength=featureTableBinaryByteLength;featureTableJsonByteLength=0;featureTableBinaryByteLength=0;console.warn(DEPRECATION_WARNING);}tile.header.featureTableJsonByteLength=featureTableJsonByteLength;tile.header.featureTableBinaryByteLength=featureTableBinaryByteLength;tile.header.batchTableJsonByteLength=batchTableJsonByteLength;tile.header.batchTableBinaryByteLength=batchTableBinaryByteLength;tile.header.batchLength=batchLength;return byteOffset;}function parse3DTileTablesSync(tile,arrayBuffer,byteOffset,options){byteOffset=parse3DTileFeatureTable(tile,arrayBuffer,byteOffset);byteOffset=parse3DTileBatchTable(tile,arrayBuffer,byteOffset);return byteOffset;}function parse3DTileFeatureTable(tile,arrayBuffer,byteOffset,options){var _tile$header=tile.header,featureTableJsonByteLength=_tile$header.featureTableJsonByteLength,featureTableBinaryByteLength=_tile$header.featureTableBinaryByteLength,batchLength=_tile$header.batchLength;tile.featureTableJson={BATCH_LENGTH:batchLength||0};if(featureTableJsonByteLength>0){var featureTableString=getStringFromArrayBuffer(arrayBuffer,byteOffset,featureTableJsonByteLength);tile.featureTableJson=JSON.parse(featureTableString);}byteOffset+=featureTableJsonByteLength;tile.featureTableBinary=new Uint8Array(arrayBuffer,byteOffset,featureTableBinaryByteLength);byteOffset+=featureTableBinaryByteLength;return byteOffset;}function parse3DTileBatchTable(tile,arrayBuffer,byteOffset,options){var _tile$header2=tile.header,batchTableJsonByteLength=_tile$header2.batchTableJsonByteLength,batchTableBinaryByteLength=_tile$header2.batchTableBinaryByteLength;if(batchTableJsonByteLength>0){var batchTableString=getStringFromArrayBuffer(arrayBuffer,byteOffset,batchTableJsonByteLength);tile.batchTableJson=JSON.parse(batchTableString);byteOffset+=batchTableJsonByteLength;if(batchTableBinaryByteLength>0){tile.batchTableBinary=new Uint8Array(arrayBuffer,byteOffset,batchTableBinaryByteLength);tile.batchTableBinary=new Uint8Array(tile.batchTableBinary);byteOffset+=batchTableBinaryByteLength;}}return byteOffset;}function normalize3DTileColorAttribute(tile,colors,batchTable){if(!colors&&(!tile||!tile.batchIds||!batchTable)){return null;}var batchIds=tile.batchIds,isRGB565=tile.isRGB565,pointCount=tile.pointCount;if(batchIds&&batchTable){var colorArray=new Uint8ClampedArray(pointCount*3);for(var _i53=0;_i53<pointCount;_i53++){var batchId=batchIds[_i53];var dimensions=batchTable.getProperty(batchId,'dimensions');var color=dimensions.map(function(d){return d*255;});colorArray[_i53*3]=color[0];colorArray[_i53*3+1]=color[1];colorArray[_i53*3+2]=color[2];}return {type:GL$1.UNSIGNED_BYTE,value:colorArray,size:3,normalized:true};}if(isRGB565){var _colorArray=new Uint8ClampedArray(pointCount*3);for(var _i54=0;_i54<pointCount;_i54++){var _color=decodeRGB565(colors[_i54]);_colorArray[_i54*3]=_color[0];_colorArray[_i54*3+1]=_color[1];_colorArray[_i54*3+2]=_color[2];}return {type:GL$1.UNSIGNED_BYTE,value:_colorArray,size:3,normalized:true};}if(colors&&colors.length===pointCount*3){return {type:GL$1.UNSIGNED_BYTE,value:colors,size:3,normalized:true};}return {type:GL$1.UNSIGNED_BYTE,value:colors,size:4,normalized:true};}var scratchNormal=new Vector3$1();function normalize3DTileNormalAttribute(tile,normals){if(!normals){return null;}if(tile.isOctEncoded16P){var decodedArray=new Float32Array(tile.pointsLength*3);for(var _i55=0;_i55<tile.pointsLength;_i55++){octDecode(normals[_i55*2],normals[_i55*2+1],scratchNormal);scratchNormal.toArray(decodedArray,_i55*3);}return {type:GL$1.FLOAT,size:2,value:decodedArray};}return {type:GL$1.FLOAT,size:2,value:normals};}function normalize3DTilePositionAttribute(tile,positions,options){if(!tile.isQuantized){return positions;}if(options['3d-tiles']&&options['3d-tiles'].decodeQuantizedPositions){tile.isQuantized=false;return decodeQuantizedPositions(tile,positions);}return {type:GL$1.UNSIGNED_SHORT,value:positions,size:3,normalized:true};}function decodeQuantizedPositions(tile,positions){var scratchPosition=new Vector3$1();var decodedArray=new Float32Array(tile.pointCount*3);for(var _i56=0;_i56<tile.pointCount;_i56++){scratchPosition.set(positions[_i56*3],positions[_i56*3+1],positions[_i56*3+2]).scale(1/tile.quantizedRange).multiply(tile.quantizedVolumeScale).add(tile.quantizedVolumeOffset).toArray(decodedArray,_i56*3);}return decodedArray;}function parsePointCloud3DTile(_x48,_x49,_x50,_x51,_x52){return _parsePointCloud3DTile.apply(this,arguments);}function _parsePointCloud3DTile(){_parsePointCloud3DTile=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee31(tile,arrayBuffer,byteOffset,options,context){var _parsePointCloudTable,featureTable,batchTable;return regenerator.wrap(function _callee31$(_context35){while(1){switch(_context35.prev=_context35.next){case 0:byteOffset=parse3DTileHeaderSync(tile,arrayBuffer,byteOffset);byteOffset=parse3DTileTablesHeaderSync(tile,arrayBuffer,byteOffset);byteOffset=parse3DTileTablesSync(tile,arrayBuffer,byteOffset);initializeTile(tile);_parsePointCloudTable=parsePointCloudTables(tile),featureTable=_parsePointCloudTable.featureTable,batchTable=_parsePointCloudTable.batchTable;_context35.next=7;return parseDraco(tile,featureTable,batchTable,options,context);case 7:parsePositions(tile,featureTable,options);parseColors(tile,featureTable,batchTable);parseNormals(tile,featureTable);return _context35.abrupt("return",byteOffset);case 11:case"end":return _context35.stop();}}},_callee31);}));return _parsePointCloud3DTile.apply(this,arguments);}function initializeTile(tile){tile.attributes={positions:null,colors:null,normals:null,batchIds:null};tile.isQuantized=false;tile.isTranslucent=false;tile.isRGB565=false;tile.isOctEncoded16P=false;}function parsePointCloudTables(tile){var featureTable=new Tile3DFeatureTable(tile.featureTableJson,tile.featureTableBinary);var pointsLength=featureTable.getGlobalProperty('POINTS_LENGTH');if(!Number.isFinite(pointsLength)){throw new Error('POINTS_LENGTH must be defined');}featureTable.featuresLength=pointsLength;tile.featuresLength=pointsLength;tile.pointsLength=pointsLength;tile.pointCount=pointsLength;tile.rtcCenter=featureTable.getGlobalProperty('RTC_CENTER',GL$1.FLOAT,3);var batchTable=parseBatchIds(tile,featureTable);return {featureTable,batchTable};}function parsePositions(tile,featureTable,options){if(!tile.attributes.positions){if(featureTable.hasProperty('POSITION')){tile.attributes.positions=featureTable.getPropertyArray('POSITION',GL$1.FLOAT,3);}else if(featureTable.hasProperty('POSITION_QUANTIZED')){var positions=featureTable.getPropertyArray('POSITION_QUANTIZED',GL$1.UNSIGNED_SHORT,3);tile.isQuantized=true;tile.quantizedRange=(1<<16)-1;tile.quantizedVolumeScale=featureTable.getGlobalProperty('QUANTIZED_VOLUME_SCALE',GL$1.FLOAT,3);if(!tile.quantizedVolumeScale){throw new Error('QUANTIZED_VOLUME_SCALE must be defined for quantized positions.');}tile.quantizedVolumeOffset=featureTable.getGlobalProperty('QUANTIZED_VOLUME_OFFSET',GL$1.FLOAT,3);if(!tile.quantizedVolumeOffset){throw new Error('QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.');}tile.attributes.positions=normalize3DTilePositionAttribute(tile,positions,options);}}if(!tile.attributes.positions){throw new Error('Either POSITION or POSITION_QUANTIZED must be defined.');}}function parseColors(tile,featureTable,batchTable){if(!tile.attributes.colors){var colors=null;if(featureTable.hasProperty('RGBA')){colors=featureTable.getPropertyArray('RGBA',GL$1.UNSIGNED_BYTE,4);tile.isTranslucent=true;}else if(featureTable.hasProperty('RGB')){colors=featureTable.getPropertyArray('RGB',GL$1.UNSIGNED_BYTE,3);}else if(featureTable.hasProperty('RGB565')){colors=featureTable.getPropertyArray('RGB565',GL$1.UNSIGNED_SHORT,1);tile.isRGB565=true;}tile.attributes.colors=normalize3DTileColorAttribute(tile,colors,batchTable);}if(featureTable.hasProperty('CONSTANT_RGBA')){tile.constantRGBA=featureTable.getGlobalProperty('CONSTANT_RGBA',GL$1.UNSIGNED_BYTE,4);}}function parseNormals(tile,featureTable){if(!tile.attributes.normals){var normals=null;if(featureTable.hasProperty('NORMAL')){normals=featureTable.getPropertyArray('NORMAL',GL$1.FLOAT,3);}else if(featureTable.hasProperty('NORMAL_OCT16P')){normals=featureTable.getPropertyArray('NORMAL_OCT16P',GL$1.UNSIGNED_BYTE,2);tile.isOctEncoded16P=true;}tile.attributes.normals=normalize3DTileNormalAttribute(tile,normals);}}function parseBatchIds(tile,featureTable){var batchTable=null;if(!tile.batchIds&&featureTable.hasProperty('BATCH_ID')){tile.batchIds=featureTable.getPropertyArray('BATCH_ID',GL$1.UNSIGNED_SHORT,1);if(tile.batchIds){var batchFeatureLength=featureTable.getGlobalProperty('BATCH_LENGTH');if(!batchFeatureLength){throw new Error('Global property: BATCH_LENGTH must be defined when BATCH_ID is defined.');}var batchTableJson=tile.batchTableJson,batchTableBinary=tile.batchTableBinary;batchTable=new Tile3DBatchTableParser(batchTableJson,batchTableBinary,batchFeatureLength);}}return batchTable;}function parseDraco(_x53,_x54,_x55,_x56,_x57){return _parseDraco.apply(this,arguments);}function _parseDraco(){_parseDraco=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee32(tile,featureTable,batchTable,options,context){var dracoBuffer,dracoFeatureTableProperties,dracoBatchTableProperties,batchTableDraco,featureTableDraco,dracoByteOffset,dracoByteLength,dracoData;return regenerator.wrap(function _callee32$(_context36){while(1){switch(_context36.prev=_context36.next){case 0:batchTableDraco=tile.batchTableJson&&tile.batchTableJson.extensions&&tile.batchTableJson.extensions['3DTILES_draco_point_compression'];if(batchTableDraco){dracoBatchTableProperties=batchTableDraco.properties;}featureTableDraco=featureTable.getExtension('3DTILES_draco_point_compression');if(!featureTableDraco){_context36.next=15;break;}dracoFeatureTableProperties=featureTableDraco.properties;dracoByteOffset=featureTableDraco.byteOffset;dracoByteLength=featureTableDraco.byteLength;if(!(!dracoFeatureTableProperties||!Number.isFinite(dracoByteOffset)||!dracoByteLength)){_context36.next=9;break;}throw new Error('Draco properties, byteOffset, and byteLength must be defined');case 9:dracoBuffer=tile.featureTableBinary.slice(dracoByteOffset,dracoByteOffset+dracoByteLength);tile.hasPositions=Number.isFinite(dracoFeatureTableProperties.POSITION);tile.hasColors=Number.isFinite(dracoFeatureTableProperties.RGB)||Number.isFinite(dracoFeatureTableProperties.RGBA);tile.hasNormals=Number.isFinite(dracoFeatureTableProperties.NORMAL);tile.hasBatchIds=Number.isFinite(dracoFeatureTableProperties.BATCH_ID);tile.isTranslucent=Number.isFinite(dracoFeatureTableProperties.RGBA);case 15:if(dracoBuffer){_context36.next=17;break;}return _context36.abrupt("return",true);case 17:dracoData={buffer:dracoBuffer,properties:_objectSpread$3(_objectSpread$3({},dracoFeatureTableProperties),dracoBatchTableProperties),featureTableProperties:dracoFeatureTableProperties,batchTableProperties:dracoBatchTableProperties,dequantizeInShader:false};_context36.next=20;return loadDraco(tile,dracoData,options,context);case 20:return _context36.abrupt("return",_context36.sent);case 21:case"end":return _context36.stop();}}},_callee32);}));return _parseDraco.apply(this,arguments);}function loadDraco(_x58,_x59,_x60,_x61){return _loadDraco.apply(this,arguments);}/**
  42816. * -----------------------CesiumIonLoader--------------------------
  42817. */function _loadDraco(){_loadDraco=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee33(tile,dracoData,options,context){var parse,dracoOptions,data,decodedPositions,decodedColors,decodedNormals,decodedBatchIds,isQuantizedDraco,isOctEncodedDraco,quantization,range,batchTableAttributes,_i66,_Object$keys2,attributeName;return regenerator.wrap(function _callee33$(_context37){while(1){switch(_context37.prev=_context37.next){case 0:parse=context.parse;dracoOptions=_objectSpread$3(_objectSpread$3({},options),{},{draco:_objectSpread$3(_objectSpread$3({},options.draco),{},{extraAttributes:dracoData.batchTableProperties||{}})});delete dracoOptions['3d-tiles'];_context37.next=5;return parse(dracoData.buffer,DracoLoader,dracoOptions);case 5:data=_context37.sent;decodedPositions=data.attributes.POSITION&&data.attributes.POSITION.value;decodedColors=data.attributes.COLOR_0&&data.attributes.COLOR_0.value;decodedNormals=data.attributes.NORMAL&&data.attributes.NORMAL.value;decodedBatchIds=data.attributes.BATCH_ID&&data.attributes.BATCH_ID.value;isQuantizedDraco=decodedPositions&&data.attributes.POSITION.value.quantization;isOctEncodedDraco=decodedNormals&&data.attributes.NORMAL.value.quantization;if(isQuantizedDraco){quantization=data.POSITION.data.quantization;range=quantization.range;tile.quantizedVolumeScale=new Vector3$1(range,range,range);tile.quantizedVolumeOffset=new Vector3$1(quantization.minValues);tile.quantizedRange=(1<<quantization.quantizationBits)-1.0;tile.isQuantizedDraco=true;}if(isOctEncodedDraco){tile.octEncodedRange=(1<<data.NORMAL.data.quantization.quantizationBits)-1.0;tile.isOctEncodedDraco=true;}batchTableAttributes={};if(dracoData.batchTableProperties){for(_i66=0,_Object$keys2=Object.keys(dracoData.batchTableProperties);_i66<_Object$keys2.length;_i66++){attributeName=_Object$keys2[_i66];if(data.attributes[attributeName]&&data.attributes[attributeName].value){batchTableAttributes[attributeName.toLowerCase()]=data.attributes[attributeName].value;}}}tile.attributes=_objectSpread$3({positions:decodedPositions,colors:normalize3DTileColorAttribute(tile,decodedColors,undefined),normals:decodedNormals,batchIds:decodedBatchIds},batchTableAttributes);case 17:case"end":return _context37.stop();}}},_callee33);}));return _loadDraco.apply(this,arguments);}var VERSION$3='3.1.4';var VERSION$2='3.1.4';var VERSION$1='3.1.4';var BASIS_CDN_ENCODER_WASM='https://unpkg.com/@loaders.gl/textures@'.concat(VERSION$1,'/dist/libs/basis_encoder.wasm');var BASIS_CDN_ENCODER_JS='https://unpkg.com/@loaders.gl/textures@'.concat(VERSION$1,'/dist/libs/basis_encoder.js');var loadBasisTranscoderPromise;function loadBasisTrascoderModule(_x62){return _loadBasisTrascoderModule.apply(this,arguments);}function _loadBasisTrascoderModule(){_loadBasisTrascoderModule=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee34(options){var modules;return regenerator.wrap(function _callee34$(_context38){while(1){switch(_context38.prev=_context38.next){case 0:modules=options.modules||{};if(!modules.basis){_context38.next=3;break;}return _context38.abrupt("return",modules.basis);case 3:loadBasisTranscoderPromise=loadBasisTranscoderPromise||loadBasisTrascoder(options);_context38.next=6;return loadBasisTranscoderPromise;case 6:return _context38.abrupt("return",_context38.sent);case 7:case"end":return _context38.stop();}}},_callee34);}));return _loadBasisTrascoderModule.apply(this,arguments);}function loadBasisTrascoder(_x63){return _loadBasisTrascoder.apply(this,arguments);}function _loadBasisTrascoder(){_loadBasisTrascoder=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee35(options){var BASIS,wasmBinary,_yield$Promise$all3,_yield$Promise$all4;return regenerator.wrap(function _callee35$(_context39){while(1){switch(_context39.prev=_context39.next){case 0:BASIS=null;wasmBinary=null;_context39.t0=Promise;_context39.next=5;return loadLibrary('basis_transcoder.js','textures',options);case 5:_context39.t1=_context39.sent;_context39.next=8;return loadLibrary('basis_transcoder.wasm','textures',options);case 8:_context39.t2=_context39.sent;_context39.t3=[_context39.t1,_context39.t2];_context39.next=12;return _context39.t0.all.call(_context39.t0,_context39.t3);case 12:_yield$Promise$all3=_context39.sent;_yield$Promise$all4=_slicedToArray(_yield$Promise$all3,2);BASIS=_yield$Promise$all4[0];wasmBinary=_yield$Promise$all4[1];BASIS=BASIS||globalThis$1.BASIS;_context39.next=19;return initializeBasisTrascoderModule(BASIS,wasmBinary);case 19:return _context39.abrupt("return",_context39.sent);case 20:case"end":return _context39.stop();}}},_callee35);}));return _loadBasisTrascoder.apply(this,arguments);}function initializeBasisTrascoderModule(BasisModule,wasmBinary){var options={};if(wasmBinary){options.wasmBinary=wasmBinary;}return new Promise(function(resolve){BasisModule(options).then(function(module){var BasisFile=module.BasisFile,initializeBasis=module.initializeBasis;initializeBasis();resolve({BasisFile});});});}var loadBasisEncoderPromise;function loadBasisEncoderModule(_x64){return _loadBasisEncoderModule.apply(this,arguments);}function _loadBasisEncoderModule(){_loadBasisEncoderModule=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee36(options){var modules;return regenerator.wrap(function _callee36$(_context40){while(1){switch(_context40.prev=_context40.next){case 0:modules=options.modules||{};if(!modules.basisEncoder){_context40.next=3;break;}return _context40.abrupt("return",modules.basisEncoder);case 3:loadBasisEncoderPromise=loadBasisEncoderPromise||loadBasisEncoder(options);_context40.next=6;return loadBasisEncoderPromise;case 6:return _context40.abrupt("return",_context40.sent);case 7:case"end":return _context40.stop();}}},_callee36);}));return _loadBasisEncoderModule.apply(this,arguments);}function loadBasisEncoder(_x65){return _loadBasisEncoder.apply(this,arguments);}function _loadBasisEncoder(){_loadBasisEncoder=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee37(options){var BASIS_ENCODER,wasmBinary,_yield$Promise$all5,_yield$Promise$all6;return regenerator.wrap(function _callee37$(_context41){while(1){switch(_context41.prev=_context41.next){case 0:BASIS_ENCODER=null;wasmBinary=null;_context41.t0=Promise;_context41.next=5;return loadLibrary(BASIS_CDN_ENCODER_JS,'textures',options);case 5:_context41.t1=_context41.sent;_context41.next=8;return loadLibrary(BASIS_CDN_ENCODER_WASM,'textures',options);case 8:_context41.t2=_context41.sent;_context41.t3=[_context41.t1,_context41.t2];_context41.next=12;return _context41.t0.all.call(_context41.t0,_context41.t3);case 12:_yield$Promise$all5=_context41.sent;_yield$Promise$all6=_slicedToArray(_yield$Promise$all5,2);BASIS_ENCODER=_yield$Promise$all6[0];wasmBinary=_yield$Promise$all6[1];BASIS_ENCODER=BASIS_ENCODER||globalThis$1.BASIS;_context41.next=19;return initializeBasisEncoderModule(BASIS_ENCODER,wasmBinary);case 19:return _context41.abrupt("return",_context41.sent);case 20:case"end":return _context41.stop();}}},_callee37);}));return _loadBasisEncoder.apply(this,arguments);}function initializeBasisEncoderModule(BasisEncoderModule,wasmBinary){var options={};if(wasmBinary){options.wasmBinary=wasmBinary;}return new Promise(function(resolve){BasisEncoderModule(options).then(function(module){var BasisFile=module.BasisFile,KTX2File=module.KTX2File,initializeBasis=module.initializeBasis,BasisEncoder=module.BasisEncoder;initializeBasis();resolve({BasisFile,KTX2File,BasisEncoder});});});}var GL_EXTENSIONS_CONSTANTS={COMPRESSED_RGB_S3TC_DXT1_EXT:0x83f0,COMPRESSED_RGBA_S3TC_DXT1_EXT:0x83f1,COMPRESSED_RGBA_S3TC_DXT3_EXT:0x83f2,COMPRESSED_RGBA_S3TC_DXT5_EXT:0x83f3,COMPRESSED_R11_EAC:0x9270,COMPRESSED_SIGNED_R11_EAC:0x9271,COMPRESSED_RG11_EAC:0x9272,COMPRESSED_SIGNED_RG11_EAC:0x9273,COMPRESSED_RGB8_ETC2:0x9274,COMPRESSED_RGBA8_ETC2_EAC:0x9275,COMPRESSED_SRGB8_ETC2:0x9276,COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:0x9277,COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:0x9278,COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:0x9279,COMPRESSED_RGB_PVRTC_4BPPV1_IMG:0x8c00,COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:0x8c02,COMPRESSED_RGB_PVRTC_2BPPV1_IMG:0x8c01,COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:0x8c03,COMPRESSED_RGB_ETC1_WEBGL:0x8d64,COMPRESSED_RGB_ATC_WEBGL:0x8c92,COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL:0x8c93,COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL:0x87ee,COMPRESSED_RGBA_ASTC_4X4_KHR:0x93b0,COMPRESSED_RGBA_ASTC_5X4_KHR:0x93b1,COMPRESSED_RGBA_ASTC_5X5_KHR:0x93b2,COMPRESSED_RGBA_ASTC_6X5_KHR:0x93b3,COMPRESSED_RGBA_ASTC_6X6_KHR:0x93b4,COMPRESSED_RGBA_ASTC_8X5_KHR:0x93b5,COMPRESSED_RGBA_ASTC_8X6_KHR:0x93b6,COMPRESSED_RGBA_ASTC_8X8_KHR:0x93b7,COMPRESSED_RGBA_ASTC_10X5_KHR:0x93b8,COMPRESSED_RGBA_ASTC_10X6_KHR:0x93b9,COMPRESSED_RGBA_ASTC_10X8_KHR:0x93ba,COMPRESSED_RGBA_ASTC_10X10_KHR:0x93bb,COMPRESSED_RGBA_ASTC_12X10_KHR:0x93bc,COMPRESSED_RGBA_ASTC_12X12_KHR:0x93bd,COMPRESSED_SRGB8_ALPHA8_ASTC_4X4_KHR:0x93d0,COMPRESSED_SRGB8_ALPHA8_ASTC_5X4_KHR:0x93d1,COMPRESSED_SRGB8_ALPHA8_ASTC_5X5_KHR:0x93d2,COMPRESSED_SRGB8_ALPHA8_ASTC_6X5_KHR:0x93d3,COMPRESSED_SRGB8_ALPHA8_ASTC_6X6_KHR:0x93d4,COMPRESSED_SRGB8_ALPHA8_ASTC_8X5_KHR:0x93d5,COMPRESSED_SRGB8_ALPHA8_ASTC_8X6_KHR:0x93d6,COMPRESSED_SRGB8_ALPHA8_ASTC_8X8_KHR:0x93d7,COMPRESSED_SRGB8_ALPHA8_ASTC_10X5_KHR:0x93d8,COMPRESSED_SRGB8_ALPHA8_ASTC_10X6_KHR:0x93d9,COMPRESSED_SRGB8_ALPHA8_ASTC_10X8_KHR:0x93da,COMPRESSED_SRGB8_ALPHA8_ASTC_10X10_KHR:0x93db,COMPRESSED_SRGB8_ALPHA8_ASTC_12X10_KHR:0x93dc,COMPRESSED_SRGB8_ALPHA8_ASTC_12X12_KHR:0x93dd,COMPRESSED_RED_RGTC1_EXT:0x8dbb,COMPRESSED_SIGNED_RED_RGTC1_EXT:0x8dbc,COMPRESSED_RED_GREEN_RGTC2_EXT:0x8dbd,COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT:0x8dbe,COMPRESSED_SRGB_S3TC_DXT1_EXT:0x8c4c,COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:0x8c4d,COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:0x8c4e,COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:0x8c4f};var BROWSER_PREFIXES=['','WEBKIT_','MOZ_'];var WEBGL_EXTENSIONS={WEBGL_compressed_texture_s3tc:'dxt',WEBGL_compressed_texture_s3tc_srgb:'dxt-srgb',WEBGL_compressed_texture_etc1:'etc1',WEBGL_compressed_texture_etc:'etc2',WEBGL_compressed_texture_pvrtc:'pvrtc',WEBGL_compressed_texture_atc:'atc',WEBGL_compressed_texture_astc:'astc',EXT_texture_compression_rgtc:'rgtc'};var formats=null;function getSupportedGPUTextureFormats(gl){if(!formats){gl=gl||getWebGLContext()||undefined;formats=new Set();var _iterator33=_createForOfIteratorHelper$3(BROWSER_PREFIXES),_step33;try{for(_iterator33.s();!(_step33=_iterator33.n()).done;){var prefix=_step33.value;for(var extension in WEBGL_EXTENSIONS){if(gl&&gl.getExtension(''.concat(prefix).concat(extension))){var gpuTextureFormat=WEBGL_EXTENSIONS[extension];formats.add(gpuTextureFormat);}}}}catch(err){_iterator33.e(err);}finally{_iterator33.f();}}return formats;}function getWebGLContext(){try{var canvas=document.createElement('canvas');return canvas.getContext('webgl');}catch(error){return null;}}var n$1,i,s$1,a$1,r$1,o,l$1,f;!function(t){t[t.NONE=0]='NONE',t[t.BASISLZ=1]='BASISLZ',t[t.ZSTD=2]='ZSTD',t[t.ZLIB=3]='ZLIB';}(n$1||(n$1={})),function(t){t[t.BASICFORMAT=0]='BASICFORMAT';}(i||(i={})),function(t){t[t.UNSPECIFIED=0]='UNSPECIFIED',t[t.ETC1S=163]='ETC1S',t[t.UASTC=166]='UASTC';}(s$1||(s$1={})),function(t){t[t.UNSPECIFIED=0]='UNSPECIFIED',t[t.SRGB=1]='SRGB';}(a$1||(a$1={})),function(t){t[t.UNSPECIFIED=0]='UNSPECIFIED',t[t.LINEAR=1]='LINEAR',t[t.SRGB=2]='SRGB',t[t.ITU=3]='ITU',t[t.NTSC=4]='NTSC',t[t.SLOG=5]='SLOG',t[t.SLOG2=6]='SLOG2';}(r$1||(r$1={})),function(t){t[t.ALPHA_STRAIGHT=0]='ALPHA_STRAIGHT',t[t.ALPHA_PREMULTIPLIED=1]='ALPHA_PREMULTIPLIED';}(o||(o={})),function(t){t[t.RGB=0]='RGB',t[t.RRR=3]='RRR',t[t.GGG=4]='GGG',t[t.AAA=15]='AAA';}(l$1||(l$1={})),function(t){t[t.RGB=0]='RGB',t[t.RGBA=3]='RGBA',t[t.RRR=4]='RRR',t[t.RRRG=5]='RRRG';}(f||(f={}));var KTX2_ID=[0xab,0x4b,0x54,0x58,0x20,0x32,0x30,0xbb,0x0d,0x0a,0x1a,0x0a];function isKTX(data){var id=new Uint8Array(data);var notKTX=id.byteLength<KTX2_ID.length||id[0]!==KTX2_ID[0]||id[1]!==KTX2_ID[1]||id[2]!==KTX2_ID[2]||id[3]!==KTX2_ID[3]||id[4]!==KTX2_ID[4]||id[5]!==KTX2_ID[5]||id[6]!==KTX2_ID[6]||id[7]!==KTX2_ID[7]||id[8]!==KTX2_ID[8]||id[9]!==KTX2_ID[9]||id[10]!==KTX2_ID[10]||id[11]!==KTX2_ID[11];return !notKTX;}var OutputFormat={etc1:{basisFormat:0,compressed:true,format:GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_ETC1_WEBGL},etc2:{basisFormat:1,compressed:true},bc1:{basisFormat:2,compressed:true,format:GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_S3TC_DXT1_EXT},bc3:{basisFormat:3,compressed:true,format:GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_S3TC_DXT5_EXT},bc4:{basisFormat:4,compressed:true},bc5:{basisFormat:5,compressed:true},'bc7-m6-opaque-only':{basisFormat:6,compressed:true},'bc7-m5':{basisFormat:7,compressed:true},'pvrtc1-4-rgb':{basisFormat:8,compressed:true,format:GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGB_PVRTC_4BPPV1_IMG},'pvrtc1-4-rgba':{basisFormat:9,compressed:true,format:GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG},'astc-4x4':{basisFormat:10,compressed:true,format:GL_EXTENSIONS_CONSTANTS.COMPRESSED_RGBA_ASTC_4X4_KHR},'atc-rgb':{basisFormat:11,compressed:true},'atc-rgba-interpolated-alpha':{basisFormat:12,compressed:true},rgba32:{basisFormat:13,compressed:false},rgb565:{basisFormat:14,compressed:false},bgr565:{basisFormat:15,compressed:false},rgba4444:{basisFormat:16,compressed:false}};function parseBasis(_x66,_x67){return _parseBasis.apply(this,arguments);}function _parseBasis(){_parseBasis=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee38(data,options){var fileConstructors,_yield$loadBasisTrasc,BasisFile,_fileConstructors,_yield$loadBasisTrasc2,_BasisFile;return regenerator.wrap(function _callee38$(_context42){while(1){switch(_context42.prev=_context42.next){case 0:if(!(options.basis.containerFormat==='auto')){_context42.next=11;break;}if(!isKTX(data)){_context42.next=6;break;}_context42.next=4;return loadBasisEncoderModule(options);case 4:fileConstructors=_context42.sent;return _context42.abrupt("return",parseKTX2File(fileConstructors.KTX2File,data,options));case 6:_context42.next=8;return loadBasisTrascoderModule(options);case 8:_yield$loadBasisTrasc=_context42.sent;BasisFile=_yield$loadBasisTrasc.BasisFile;return _context42.abrupt("return",parseBasisFile(BasisFile,data,options));case 11:_context42.t0=options.basis.module;_context42.next=_context42.t0==='encoder'?14:_context42.t0==='transcoder'?22:22;break;case 14:_context42.next=16;return loadBasisEncoderModule(options);case 16:_fileConstructors=_context42.sent;_context42.t1=options.basis.containerFormat;_context42.next=_context42.t1==='ktx2'?20:_context42.t1==='basis'?21:21;break;case 20:return _context42.abrupt("return",parseKTX2File(_fileConstructors.KTX2File,data,options));case 21:return _context42.abrupt("return",parseBasisFile(_fileConstructors.BasisFile,data,options));case 22:_context42.next=24;return loadBasisTrascoderModule(options);case 24:_yield$loadBasisTrasc2=_context42.sent;_BasisFile=_yield$loadBasisTrasc2.BasisFile;return _context42.abrupt("return",parseBasisFile(_BasisFile,data,options));case 27:case"end":return _context42.stop();}}},_callee38);}));return _parseBasis.apply(this,arguments);}function parseBasisFile(BasisFile,data,options){var basisFile=new BasisFile(new Uint8Array(data));try{if(!basisFile.startTranscoding()){return null;}var imageCount=basisFile.getNumImages();var images=[];for(var imageIndex=0;imageIndex<imageCount;imageIndex++){var levelsCount=basisFile.getNumLevels(imageIndex);var levels=[];for(var levelIndex=0;levelIndex<levelsCount;levelIndex++){levels.push(transcodeImage(basisFile,imageIndex,levelIndex,options));}images.push(levels);}return images;}finally{basisFile.close();basisFile.delete();}}function transcodeImage(basisFile,imageIndex,levelIndex,options){var width=basisFile.getImageWidth(imageIndex,levelIndex);var height=basisFile.getImageHeight(imageIndex,levelIndex);var hasAlpha=basisFile.getHasAlpha();var _getBasisOptions=getBasisOptions(options,hasAlpha),compressed=_getBasisOptions.compressed,format=_getBasisOptions.format,basisFormat=_getBasisOptions.basisFormat;var decodedSize=basisFile.getImageTranscodedSizeInBytes(imageIndex,levelIndex,basisFormat);var decodedData=new Uint8Array(decodedSize);if(!basisFile.transcodeImage(decodedData,imageIndex,levelIndex,basisFormat,0,0)){return null;}return {width,height,data:decodedData,compressed,hasAlpha,format};}function parseKTX2File(KTX2File,data,options){var ktx2File=new KTX2File(new Uint8Array(data));try{if(!ktx2File.startTranscoding()){return null;}var levelsCount=ktx2File.getLevels();var levels=[];for(var levelIndex=0;levelIndex<levelsCount;levelIndex++){levels.push(transcodeKTX2Image(ktx2File,levelIndex,options));break;}return levels;}finally{ktx2File.close();ktx2File.delete();}}function transcodeKTX2Image(ktx2File,levelIndex,options){var _ktx2File$getImageLev=ktx2File.getImageLevelInfo(levelIndex,0,0),alphaFlag=_ktx2File$getImageLev.alphaFlag,height=_ktx2File$getImageLev.height,width=_ktx2File$getImageLev.width;var _getBasisOptions2=getBasisOptions(options,alphaFlag),compressed=_getBasisOptions2.compressed,format=_getBasisOptions2.format,basisFormat=_getBasisOptions2.basisFormat;var decodedSize=ktx2File.getImageTranscodedSizeInBytes(levelIndex,0,0,basisFormat);var decodedData=new Uint8Array(decodedSize);if(!ktx2File.transcodeImage(decodedData,levelIndex,0,0,basisFormat,0,-1,-1)){return null;}return {width,height,data:decodedData,compressed,alphaFlag,format};}function getBasisOptions(options,hasAlpha){var format=options&&options.basis&&options.basis.format;if(format==='auto'){format=selectSupportedBasisFormat();}if(typeof format==='object'){format=hasAlpha?format.alpha:format.noAlpha;}format=format.toLowerCase();return OutputFormat[format];}function selectSupportedBasisFormat(){var supportedFormats=getSupportedGPUTextureFormats();if(supportedFormats.has('astc')){return 'astc-4x4';}else if(supportedFormats.has('dxt')){return {alpha:'bc3',noAlpha:'bc1'};}else if(supportedFormats.has('pvrtc')){return {alpha:'pvrtc1-4-rgba',noAlpha:'pvrtc1-4-rgb'};}else if(supportedFormats.has('etc1')){return 'etc1';}else if(supportedFormats.has('etc2')){return 'etc2';}return 'rgb565';}var BasisWorkerLoader={name:'Basis',id:'basis',module:'textures',version:VERSION$2,worker:true,extensions:['basis','ktx2'],mimeTypes:['application/octet-stream','image/ktx2'],tests:['sB'],binary:true,options:{basis:{format:'auto',libraryPath:'libs/',containerFormat:'auto',module:'transcoder'}}};var BasisLoader=_objectSpread$3(_objectSpread$3({},BasisWorkerLoader),{},{parse:parseBasis});var VERSION='3.1.4';var _parseImageNode=globalThis$1._parseImageNode;var IMAGE_SUPPORTED=typeof Image!=='undefined';var IMAGE_BITMAP_SUPPORTED=typeof ImageBitmap!=='undefined';var NODE_IMAGE_SUPPORTED=Boolean(_parseImageNode);var DATA_SUPPORTED=isBrowser$2?true:NODE_IMAGE_SUPPORTED;function isImageTypeSupported(type){switch(type){case'auto':return IMAGE_BITMAP_SUPPORTED||IMAGE_SUPPORTED||DATA_SUPPORTED;case'imagebitmap':return IMAGE_BITMAP_SUPPORTED;case'image':return IMAGE_SUPPORTED;case'data':return DATA_SUPPORTED;default:throw new Error('@loaders.gl/images: image '.concat(type,' not supported in this environment'));}}function getDefaultImageType(){if(IMAGE_BITMAP_SUPPORTED){return 'imagebitmap';}if(IMAGE_SUPPORTED){return 'image';}if(DATA_SUPPORTED){return 'data';}throw new Error("Install '@loaders.gl/polyfills' to parse images under Node.js");}function getImageType(image){var format=getImageTypeOrNull(image);if(!format){throw new Error('Not an image');}return format;}function getImageData(image){switch(getImageType(image)){case'data':return image;case'image':case'imagebitmap':var canvas=document.createElement('canvas');var context=canvas.getContext('2d');if(!context){throw new Error('getImageData');}canvas.width=image.width;canvas.height=image.height;context.drawImage(image,0,0);return context.getImageData(0,0,image.width,image.height);default:throw new Error('getImageData');}}function getImageTypeOrNull(image){if(typeof ImageBitmap!=='undefined'&&image instanceof ImageBitmap){return 'imagebitmap';}if(typeof Image!=='undefined'&&image instanceof Image){return 'image';}if(image&&typeof image==='object'&&image.data&&image.width&&image.height){return 'data';}return null;}var SVG_DATA_URL_PATTERN=/^data:image\/svg\+xml/;var SVG_URL_PATTERN=/\.svg((\?|#).*)?$/;function isSVG(url){return url&&(SVG_DATA_URL_PATTERN.test(url)||SVG_URL_PATTERN.test(url));}function getBlobOrSVGDataUrl(arrayBuffer,url){if(isSVG(url)){var textDecoder=new TextDecoder();var xmlText=textDecoder.decode(arrayBuffer);try{if(typeof unescape==='function'&&typeof encodeURIComponent==='function'){xmlText=unescape(encodeURIComponent(xmlText));}}catch(error){throw new Error(error.message);}var src='data:image/svg+xml;base64,'.concat(btoa(xmlText));return src;}return getBlob(arrayBuffer,url);}function getBlob(arrayBuffer,url){if(isSVG(url)){throw new Error('SVG cannot be parsed directly to imagebitmap');}return new Blob([new Uint8Array(arrayBuffer)]);}function parseToImage(_x68,_x69,_x70){return _parseToImage.apply(this,arguments);}function _parseToImage(){_parseToImage=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee39(arrayBuffer,options,url){var blobOrDataUrl,URL,objectUrl;return regenerator.wrap(function _callee39$(_context43){while(1){switch(_context43.prev=_context43.next){case 0:blobOrDataUrl=getBlobOrSVGDataUrl(arrayBuffer,url);URL=self.URL||self.webkitURL;objectUrl=typeof blobOrDataUrl!=='string'&&URL.createObjectURL(blobOrDataUrl);_context43.prev=3;_context43.next=6;return loadToImage(objectUrl||blobOrDataUrl,options);case 6:return _context43.abrupt("return",_context43.sent);case 7:_context43.prev=7;if(objectUrl){URL.revokeObjectURL(objectUrl);}return _context43.finish(7);case 10:case"end":return _context43.stop();}}},_callee39,null,[[3,,7,10]]);}));return _parseToImage.apply(this,arguments);}function loadToImage(_x71,_x72){return _loadToImage.apply(this,arguments);}function _loadToImage(){_loadToImage=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee40(url,options){var image;return regenerator.wrap(function _callee40$(_context44){while(1){switch(_context44.prev=_context44.next){case 0:image=new Image();image.src=url;if(!(options.image&&options.image.decode&&image.decode)){_context44.next=6;break;}_context44.next=5;return image.decode();case 5:return _context44.abrupt("return",image);case 6:_context44.next=8;return new Promise(function(resolve,reject){try{image.onload=function(){return resolve(image);};image.onerror=function(err){return reject(new Error('Could not load image '.concat(url,': ').concat(err)));};}catch(error){reject(error);}});case 8:return _context44.abrupt("return",_context44.sent);case 9:case"end":return _context44.stop();}}},_callee40);}));return _loadToImage.apply(this,arguments);}var EMPTY_OBJECT={};var imagebitmapOptionsSupported=true;function parseToImageBitmap(_x73,_x74,_x75){return _parseToImageBitmap.apply(this,arguments);}function _parseToImageBitmap(){_parseToImageBitmap=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee41(arrayBuffer,options,url){var blob,image,imagebitmapOptions;return regenerator.wrap(function _callee41$(_context45){while(1){switch(_context45.prev=_context45.next){case 0:if(!isSVG(url)){_context45.next=7;break;}_context45.next=3;return parseToImage(arrayBuffer,options,url);case 3:image=_context45.sent;blob=image;_context45.next=8;break;case 7:blob=getBlob(arrayBuffer,url);case 8:imagebitmapOptions=options&&options.imagebitmap;_context45.next=11;return safeCreateImageBitmap(blob,imagebitmapOptions);case 11:return _context45.abrupt("return",_context45.sent);case 12:case"end":return _context45.stop();}}},_callee41);}));return _parseToImageBitmap.apply(this,arguments);}function safeCreateImageBitmap(_x76){return _safeCreateImageBitmap.apply(this,arguments);}function _safeCreateImageBitmap(){_safeCreateImageBitmap=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee42(blob){var imagebitmapOptions,_args46=arguments;return regenerator.wrap(function _callee42$(_context46){while(1){switch(_context46.prev=_context46.next){case 0:imagebitmapOptions=_args46.length>1&&_args46[1]!==undefined?_args46[1]:null;if(isEmptyObject(imagebitmapOptions)||!imagebitmapOptionsSupported){imagebitmapOptions=null;}if(!imagebitmapOptions){_context46.next=13;break;}_context46.prev=3;_context46.next=6;return createImageBitmap(blob,imagebitmapOptions);case 6:return _context46.abrupt("return",_context46.sent);case 9:_context46.prev=9;_context46.t0=_context46["catch"](3);console.warn(_context46.t0);imagebitmapOptionsSupported=false;case 13:_context46.next=15;return createImageBitmap(blob);case 15:return _context46.abrupt("return",_context46.sent);case 16:case"end":return _context46.stop();}}},_callee42,null,[[3,9]]);}));return _safeCreateImageBitmap.apply(this,arguments);}function isEmptyObject(object){for(var key in object||EMPTY_OBJECT){return false;}return true;}var BIG_ENDIAN=false;var LITTLE_ENDIAN=true;function getBinaryImageMetadata(binaryData){var dataView=toDataView(binaryData);return getPngMetadata(dataView)||getJpegMetadata(dataView)||getGifMetadata(dataView)||getBmpMetadata(dataView);}function getPngMetadata(binaryData){var dataView=toDataView(binaryData);var isPng=dataView.byteLength>=24&&dataView.getUint32(0,BIG_ENDIAN)===0x89504e47;if(!isPng){return null;}return {mimeType:'image/png',width:dataView.getUint32(16,BIG_ENDIAN),height:dataView.getUint32(20,BIG_ENDIAN)};}function getGifMetadata(binaryData){var dataView=toDataView(binaryData);var isGif=dataView.byteLength>=10&&dataView.getUint32(0,BIG_ENDIAN)===0x47494638;if(!isGif){return null;}return {mimeType:'image/gif',width:dataView.getUint16(6,LITTLE_ENDIAN),height:dataView.getUint16(8,LITTLE_ENDIAN)};}function getBmpMetadata(binaryData){var dataView=toDataView(binaryData);var isBmp=dataView.byteLength>=14&&dataView.getUint16(0,BIG_ENDIAN)===0x424d&&dataView.getUint32(2,LITTLE_ENDIAN)===dataView.byteLength;if(!isBmp){return null;}return {mimeType:'image/bmp',width:dataView.getUint32(18,LITTLE_ENDIAN),height:dataView.getUint32(22,LITTLE_ENDIAN)};}function getJpegMetadata(binaryData){var dataView=toDataView(binaryData);var isJpeg=dataView.byteLength>=3&&dataView.getUint16(0,BIG_ENDIAN)===0xffd8&&dataView.getUint8(2)===0xff;if(!isJpeg){return null;}var _getJpegMarkers=getJpegMarkers(),tableMarkers=_getJpegMarkers.tableMarkers,sofMarkers=_getJpegMarkers.sofMarkers;var i=2;while(i+9<dataView.byteLength){var _marker=dataView.getUint16(i,BIG_ENDIAN);if(sofMarkers.has(_marker)){return {mimeType:'image/jpeg',height:dataView.getUint16(i+5,BIG_ENDIAN),width:dataView.getUint16(i+7,BIG_ENDIAN)};}if(!tableMarkers.has(_marker)){return null;}i+=2;i+=dataView.getUint16(i,BIG_ENDIAN);}return null;}function getJpegMarkers(){var tableMarkers=new Set([0xffdb,0xffc4,0xffcc,0xffdd,0xfffe]);for(var _i57=0xffe0;_i57<0xfff0;++_i57){tableMarkers.add(_i57);}var sofMarkers=new Set([0xffc0,0xffc1,0xffc2,0xffc3,0xffc5,0xffc6,0xffc7,0xffc9,0xffca,0xffcb,0xffcd,0xffce,0xffcf,0xffde]);return {tableMarkers,sofMarkers};}function toDataView(data){if(data instanceof DataView){return data;}if(ArrayBuffer.isView(data)){return new DataView(data.buffer);}if(data instanceof ArrayBuffer){return new DataView(data);}throw new Error('toDataView');}function parseToNodeImage(_x77,_x78){return _parseToNodeImage.apply(this,arguments);}function _parseToNodeImage(){_parseToNodeImage=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee43(arrayBuffer,options){var _ref16,mimeType,_parseImageNode;return regenerator.wrap(function _callee43$(_context47){while(1){switch(_context47.prev=_context47.next){case 0:_ref16=getBinaryImageMetadata(arrayBuffer)||{},mimeType=_ref16.mimeType;_parseImageNode=globalThis$1._parseImageNode;assert$7(_parseImageNode);_context47.next=5;return _parseImageNode(arrayBuffer,mimeType);case 5:return _context47.abrupt("return",_context47.sent);case 6:case"end":return _context47.stop();}}},_callee43);}));return _parseToNodeImage.apply(this,arguments);}function parseImage(_x79,_x80,_x81){return _parseImage.apply(this,arguments);}function _parseImage(){_parseImage=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee44(arrayBuffer,options,context){var imageOptions,imageType,_ref17,url,loadType,image;return regenerator.wrap(function _callee44$(_context48){while(1){switch(_context48.prev=_context48.next){case 0:options=options||{};imageOptions=options.image||{};imageType=imageOptions.type||'auto';_ref17=context||{},url=_ref17.url;loadType=getLoadableImageType(imageType);_context48.t0=loadType;_context48.next=_context48.t0==='imagebitmap'?8:_context48.t0==='image'?12:_context48.t0==='data'?16:20;break;case 8:_context48.next=10;return parseToImageBitmap(arrayBuffer,options,url);case 10:image=_context48.sent;return _context48.abrupt("break",21);case 12:_context48.next=14;return parseToImage(arrayBuffer,options,url);case 14:image=_context48.sent;return _context48.abrupt("break",21);case 16:_context48.next=18;return parseToNodeImage(arrayBuffer);case 18:image=_context48.sent;return _context48.abrupt("break",21);case 20:assert$7(false);case 21:if(imageType==='data'){image=getImageData(image);}return _context48.abrupt("return",image);case 23:case"end":return _context48.stop();}}},_callee44);}));return _parseImage.apply(this,arguments);}function getLoadableImageType(type){switch(type){case'auto':case'data':return getDefaultImageType();default:isImageTypeSupported(type);return type;}}var EXTENSIONS$1=['png','jpg','jpeg','gif','webp','bmp','ico','svg'];var MIME_TYPES=['image/png','image/jpeg','image/gif','image/webp','image/bmp','image/vnd.microsoft.icon','image/svg+xml'];var DEFAULT_IMAGE_LOADER_OPTIONS={image:{type:'auto',decode:true}};var ImageLoader={id:'image',module:'images',name:'Images',version:VERSION,mimeTypes:MIME_TYPES,extensions:EXTENSIONS$1,parse:parseImage,tests:[function(arrayBuffer){return Boolean(getBinaryImageMetadata(new DataView(arrayBuffer)));}],options:DEFAULT_IMAGE_LOADER_OPTIONS};var NODE_FORMAT_SUPPORT=['image/png','image/jpeg','image/gif'];var mimeTypeSupported={};function _isImageFormatSupported(mimeType){if(mimeTypeSupported[mimeType]===undefined){mimeTypeSupported[mimeType]=checkFormatSupport(mimeType);}return mimeTypeSupported[mimeType];}function checkFormatSupport(mimeType){switch(mimeType){case'image/webp':return checkWebPSupport();case'image/svg':return isBrowser$2;default:if(!isBrowser$2){var _parseImageNode2=globalThis$1._parseImageNode;return Boolean(_parseImageNode2)&&NODE_FORMAT_SUPPORT.includes(mimeType);}return true;}}function checkWebPSupport(){if(!isBrowser$2){return false;}try{var element=document.createElement('canvas');return element.toDataURL('image/webp').indexOf('data:image/webp')===0;}catch(_unused){return false;}}function assert$1(condition,message){if(!condition){throw new Error(message||'assert failed: gltf');}}function resolveUrl(url,options){var absolute=url.startsWith('data:')||url.startsWith('http:')||url.startsWith('https:');if(absolute){return url;}var baseUrl=options.baseUri||options.uri;if(!baseUrl){throw new Error("'baseUri' must be provided to resolve relative url ".concat(url));}return baseUrl.substr(0,baseUrl.lastIndexOf('/')+1)+url;}function getTypedArrayForBufferView(json,buffers,bufferViewIndex){var bufferView=json.bufferViews[bufferViewIndex];assert$1(bufferView);var bufferIndex=bufferView.buffer;var binChunk=buffers[bufferIndex];assert$1(binChunk);var byteOffset=(bufferView.byteOffset||0)+binChunk.byteOffset;return new Uint8Array(binChunk.arrayBuffer,byteOffset,bufferView.byteLength);}var TYPES=['SCALAR','VEC2','VEC3','VEC4'];var ARRAY_CONSTRUCTOR_TO_WEBGL_CONSTANT=[[Int8Array,5120],[Uint8Array,5121],[Int16Array,5122],[Uint16Array,5123],[Uint32Array,5125],[Float32Array,5126],[Float64Array,5130]];var ARRAY_TO_COMPONENT_TYPE=new Map(ARRAY_CONSTRUCTOR_TO_WEBGL_CONSTANT);var ATTRIBUTE_TYPE_TO_COMPONENTS={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16};var ATTRIBUTE_COMPONENT_TYPE_TO_BYTE_SIZE={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};var ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array};function getAccessorTypeFromSize(size){var type=TYPES[size-1];return type||TYPES[0];}function getComponentTypeFromArray(typedArray){var componentType=ARRAY_TO_COMPONENT_TYPE.get(typedArray.constructor);if(!componentType){throw new Error('Illegal typed array');}return componentType;}function getAccessorArrayTypeAndLength(accessor,bufferView){var ArrayType=ATTRIBUTE_COMPONENT_TYPE_TO_ARRAY[accessor.componentType];var components=ATTRIBUTE_TYPE_TO_COMPONENTS[accessor.type];var bytesPerComponent=ATTRIBUTE_COMPONENT_TYPE_TO_BYTE_SIZE[accessor.componentType];var length=accessor.count*components;var byteLength=accessor.count*components*bytesPerComponent;assert$1(byteLength>=0&&byteLength<=bufferView.byteLength);return {ArrayType,length,byteLength};}var DEFAULT_GLTF_JSON={asset:{version:'2.0',generator:'loaders.gl'},buffers:[]};var GLTFScenegraph=/*#__PURE__*/function(){function GLTFScenegraph(gltf){_classCallCheck(this,GLTFScenegraph);_defineProperty(this,'gltf',void 0);_defineProperty(this,'sourceBuffers',void 0);_defineProperty(this,'byteLength',void 0);this.gltf=gltf||{json:_objectSpread$3({},DEFAULT_GLTF_JSON),buffers:[]};this.sourceBuffers=[];this.byteLength=0;if(this.gltf.buffers&&this.gltf.buffers[0]){this.byteLength=this.gltf.buffers[0].byteLength;this.sourceBuffers=[this.gltf.buffers[0]];}}_createClass(GLTFScenegraph,[{key:"json",get:function get(){return this.gltf.json;}},{key:"getApplicationData",value:function getApplicationData(key){var data=this.json[key];return data;}},{key:"getExtraData",value:function getExtraData(key){var extras=this.json.extras||{};return extras[key];}},{key:"getExtension",value:function getExtension(extensionName){var isExtension=this.getUsedExtensions().find(function(name){return name===extensionName;});var extensions=this.json.extensions||{};return isExtension?extensions[extensionName]||true:null;}},{key:"getRequiredExtension",value:function getRequiredExtension(extensionName){var isRequired=this.getRequiredExtensions().find(function(name){return name===extensionName;});return isRequired?this.getExtension(extensionName):null;}},{key:"getRequiredExtensions",value:function getRequiredExtensions(){return this.json.extensionsRequired||[];}},{key:"getUsedExtensions",value:function getUsedExtensions(){return this.json.extensionsUsed||[];}},{key:"getObjectExtension",value:function getObjectExtension(object,extensionName){var extensions=object.extensions||{};return extensions[extensionName];}},{key:"getScene",value:function getScene(index){return this.getObject('scenes',index);}},{key:"getNode",value:function getNode(index){return this.getObject('nodes',index);}},{key:"getSkin",value:function getSkin(index){return this.getObject('skins',index);}},{key:"getMesh",value:function getMesh(index){return this.getObject('meshes',index);}},{key:"getMaterial",value:function getMaterial(index){return this.getObject('materials',index);}},{key:"getAccessor",value:function getAccessor(index){return this.getObject('accessors',index);}},{key:"getTexture",value:function getTexture(index){return this.getObject('textures',index);}},{key:"getSampler",value:function getSampler(index){return this.getObject('samplers',index);}},{key:"getImage",value:function getImage(index){return this.getObject('images',index);}},{key:"getBufferView",value:function getBufferView(index){return this.getObject('bufferViews',index);}},{key:"getBuffer",value:function getBuffer(index){return this.getObject('buffers',index);}},{key:"getObject",value:function getObject(array,index){if(typeof index==='object'){return index;}var object=this.json[array]&&this.json[array][index];if(!object){throw new Error('glTF file error: Could not find '.concat(array,'[').concat(index,']'));}return object;}},{key:"getTypedArrayForBufferView",value:function getTypedArrayForBufferView(bufferView){bufferView=this.getBufferView(bufferView);var bufferIndex=bufferView.buffer;var binChunk=this.gltf.buffers[bufferIndex];assert$1(binChunk);var byteOffset=(bufferView.byteOffset||0)+binChunk.byteOffset;return new Uint8Array(binChunk.arrayBuffer,byteOffset,bufferView.byteLength);}},{key:"getTypedArrayForAccessor",value:function getTypedArrayForAccessor(accessor){accessor=this.getAccessor(accessor);var bufferView=this.getBufferView(accessor.bufferView);var buffer=this.getBuffer(bufferView.buffer);var arrayBuffer=buffer.data;var _getAccessorArrayType=getAccessorArrayTypeAndLength(accessor,bufferView),ArrayType=_getAccessorArrayType.ArrayType,length=_getAccessorArrayType.length;var byteOffset=bufferView.byteOffset+accessor.byteOffset;return new ArrayType(arrayBuffer,byteOffset,length);}},{key:"getTypedArrayForImageData",value:function getTypedArrayForImageData(image){image=this.getAccessor(image);var bufferView=this.getBufferView(image.bufferView);var buffer=this.getBuffer(bufferView.buffer);var arrayBuffer=buffer.data;var byteOffset=bufferView.byteOffset||0;return new Uint8Array(arrayBuffer,byteOffset,bufferView.byteLength);}},{key:"addApplicationData",value:function addApplicationData(key,data){this.json[key]=data;return this;}},{key:"addExtraData",value:function addExtraData(key,data){this.json.extras=this.json.extras||{};this.json.extras[key]=data;return this;}},{key:"addObjectExtension",value:function addObjectExtension(object,extensionName,data){object.extensions=object.extensions||{};object.extensions[extensionName]=data;this.registerUsedExtension(extensionName);return this;}},{key:"setObjectExtension",value:function setObjectExtension(object,extensionName,data){var extensions=object.extensions||{};extensions[extensionName]=data;}},{key:"removeObjectExtension",value:function removeObjectExtension(object,extensionName){var extensions=object.extensions||{};var extension=extensions[extensionName];delete extensions[extensionName];return extension;}},{key:"addExtension",value:function addExtension(extensionName){var extensionData=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};assert$1(extensionData);this.json.extensions=this.json.extensions||{};this.json.extensions[extensionName]=extensionData;this.registerUsedExtension(extensionName);return extensionData;}},{key:"addRequiredExtension",value:function addRequiredExtension(extensionName){var extensionData=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};assert$1(extensionData);this.addExtension(extensionName,extensionData);this.registerRequiredExtension(extensionName);return extensionData;}},{key:"registerUsedExtension",value:function registerUsedExtension(extensionName){this.json.extensionsUsed=this.json.extensionsUsed||[];if(!this.json.extensionsUsed.find(function(ext){return ext===extensionName;})){this.json.extensionsUsed.push(extensionName);}}},{key:"registerRequiredExtension",value:function registerRequiredExtension(extensionName){this.registerUsedExtension(extensionName);this.json.extensionsRequired=this.json.extensionsRequired||[];if(!this.json.extensionsRequired.find(function(ext){return ext===extensionName;})){this.json.extensionsRequired.push(extensionName);}}},{key:"removeExtension",value:function removeExtension(extensionName){if(this.json.extensionsRequired){this._removeStringFromArray(this.json.extensionsRequired,extensionName);}if(this.json.extensionsUsed){this._removeStringFromArray(this.json.extensionsUsed,extensionName);}if(this.json.extensions){delete this.json.extensions[extensionName];}}},{key:"setDefaultScene",value:function setDefaultScene(sceneIndex){this.json.scene=sceneIndex;}},{key:"addScene",value:function addScene(scene){var nodeIndices=scene.nodeIndices;this.json.scenes=this.json.scenes||[];this.json.scenes.push({nodes:nodeIndices});return this.json.scenes.length-1;}},{key:"addNode",value:function addNode(node){var meshIndex=node.meshIndex,matrix=node.matrix;this.json.nodes=this.json.nodes||[];var nodeData={mesh:meshIndex};if(matrix){nodeData.matrix=matrix;}this.json.nodes.push(nodeData);return this.json.nodes.length-1;}},{key:"addMesh",value:function addMesh(mesh){var attributes=mesh.attributes,indices=mesh.indices,material=mesh.material,_mesh$mode=mesh.mode,mode=_mesh$mode===void 0?4:_mesh$mode;var accessors=this._addAttributes(attributes);var glTFMesh={primitives:[{attributes:accessors,mode}]};if(indices){var indicesAccessor=this._addIndices(indices);glTFMesh.primitives[0].indices=indicesAccessor;}if(Number.isFinite(material)){glTFMesh.primitives[0].material=material;}this.json.meshes=this.json.meshes||[];this.json.meshes.push(glTFMesh);return this.json.meshes.length-1;}},{key:"addPointCloud",value:function addPointCloud(attributes){var accessorIndices=this._addAttributes(attributes);var glTFMesh={primitives:[{attributes:accessorIndices,mode:0}]};this.json.meshes=this.json.meshes||[];this.json.meshes.push(glTFMesh);return this.json.meshes.length-1;}},{key:"addImage",value:function addImage(imageData,mimeTypeOpt){var metadata=getBinaryImageMetadata(imageData);var mimeType=mimeTypeOpt||(metadata===null||metadata===void 0?void 0:metadata.mimeType);var bufferViewIndex=this.addBufferView(imageData);var glTFImage={bufferView:bufferViewIndex,mimeType};this.json.images=this.json.images||[];this.json.images.push(glTFImage);return this.json.images.length-1;}},{key:"addBufferView",value:function addBufferView(buffer){var byteLength=buffer.byteLength;assert$1(Number.isFinite(byteLength));this.sourceBuffers=this.sourceBuffers||[];this.sourceBuffers.push(buffer);var glTFBufferView={buffer:0,byteOffset:this.byteLength,byteLength};this.byteLength+=padToNBytes(byteLength,4);this.json.bufferViews=this.json.bufferViews||[];this.json.bufferViews.push(glTFBufferView);return this.json.bufferViews.length-1;}},{key:"addAccessor",value:function addAccessor(bufferViewIndex,accessor){var glTFAccessor={bufferView:bufferViewIndex,type:getAccessorTypeFromSize(accessor.size),componentType:accessor.componentType,count:accessor.count,max:accessor.max,min:accessor.min};this.json.accessors=this.json.accessors||[];this.json.accessors.push(glTFAccessor);return this.json.accessors.length-1;}},{key:"addBinaryBuffer",value:function addBinaryBuffer(sourceBuffer){var accessor=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{size:3};var bufferViewIndex=this.addBufferView(sourceBuffer);var minMax={min:accessor.min,max:accessor.max};if(!minMax.min||!minMax.max){minMax=this._getAccessorMinMax(sourceBuffer,accessor.size);}var accessorDefaults={size:accessor.size,componentType:getComponentTypeFromArray(sourceBuffer),count:Math.round(sourceBuffer.length/accessor.size),min:minMax.min,max:minMax.max};return this.addAccessor(bufferViewIndex,Object.assign(accessorDefaults,accessor));}},{key:"addTexture",value:function addTexture(texture){var imageIndex=texture.imageIndex;var glTFTexture={source:imageIndex};this.json.textures=this.json.textures||[];this.json.textures.push(glTFTexture);return this.json.textures.length-1;}},{key:"addMaterial",value:function addMaterial(pbrMaterialInfo){this.json.materials=this.json.materials||[];this.json.materials.push(pbrMaterialInfo);return this.json.materials.length-1;}},{key:"createBinaryChunk",value:function createBinaryChunk(){var _this$json,_this$json$buffers;this.gltf.buffers=[];var totalByteLength=this.byteLength;var arrayBuffer=new ArrayBuffer(totalByteLength);var targetArray=new Uint8Array(arrayBuffer);var dstByteOffset=0;var _iterator34=_createForOfIteratorHelper$3(this.sourceBuffers||[]),_step34;try{for(_iterator34.s();!(_step34=_iterator34.n()).done;){var sourceBuffer=_step34.value;dstByteOffset=copyToArray(sourceBuffer,targetArray,dstByteOffset);}}catch(err){_iterator34.e(err);}finally{_iterator34.f();}if((_this$json=this.json)!==null&&_this$json!==void 0&&(_this$json$buffers=_this$json.buffers)!==null&&_this$json$buffers!==void 0&&_this$json$buffers[0]){this.json.buffers[0].byteLength=totalByteLength;}else {this.json.buffers=[{byteLength:totalByteLength}];}this.gltf.binary=arrayBuffer;this.sourceBuffers=[arrayBuffer];}},{key:"_removeStringFromArray",value:function _removeStringFromArray(array,string){var found=true;while(found){var index=array.indexOf(string);if(index>-1){array.splice(index,1);}else {found=false;}}}},{key:"_addAttributes",value:function _addAttributes(){var attributes=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var result={};for(var attributeKey in attributes){var attributeData=attributes[attributeKey];var attrName=this._getGltfAttributeName(attributeKey);var accessor=this.addBinaryBuffer(attributeData.value,attributeData);result[attrName]=accessor;}return result;}},{key:"_addIndices",value:function _addIndices(indices){return this.addBinaryBuffer(indices,{size:1});}},{key:"_getGltfAttributeName",value:function _getGltfAttributeName(attributeName){switch(attributeName.toLowerCase()){case'position':case'positions':case'vertices':return 'POSITION';case'normal':case'normals':return 'NORMAL';case'color':case'colors':return 'COLOR_0';case'texcoord':case'texcoords':return 'TEXCOORD_0';default:return attributeName;}}},{key:"_getAccessorMinMax",value:function _getAccessorMinMax(buffer,size){var result={min:null,max:null};if(buffer.length<size){return result;}result.min=[];result.max=[];var initValues=buffer.subarray(0,size);var _iterator35=_createForOfIteratorHelper$3(initValues),_step35;try{for(_iterator35.s();!(_step35=_iterator35.n()).done;){var value=_step35.value;result.min.push(value);result.max.push(value);}}catch(err){_iterator35.e(err);}finally{_iterator35.f();}for(var index=size;index<buffer.length;index+=size){for(var componentIndex=0;componentIndex<size;componentIndex++){result.min[0+componentIndex]=Math.min(result.min[0+componentIndex],buffer[index+componentIndex]);result.max[0+componentIndex]=Math.max(result.max[0+componentIndex],buffer[index+componentIndex]);}}return result;}}]);return GLTFScenegraph;}();var isWebAssemblySupported=typeof WebAssembly!=='object';var wasm_base='B9h9z9tFBBBF8fL9gBB9gLaaaaaFa9gEaaaB9gFaFa9gEaaaFaEMcBFFFGGGEIIILF9wFFFLEFBFKNFaFCx/IFMO/LFVK9tv9t9vq95GBt9f9f939h9z9t9f9j9h9s9s9f9jW9vq9zBBp9tv9z9o9v9wW9f9kv9j9v9kv9WvqWv94h919m9mvqBF8Z9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv94h919m9mvqBGy9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv949TvZ91v9u9jvBEn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9P9jWBIi9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9R919hWBLn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9F949wBKI9z9iqlBOc+x8ycGBM/qQFTa8jUUUUBCU/EBlHL8kUUUUBC9+RKGXAGCFJAI9LQBCaRKAE2BBC+gF9HQBALAEAIJHOAGlAGTkUUUBRNCUoBAG9uC/wgBZHKCUGAKCUG9JyRVAECFJRICBRcGXEXAcAF9PQFAVAFAclAcAVJAF9JyRMGXGXAG9FQBAMCbJHKC9wZRSAKCIrCEJCGrRQANCUGJRfCBRbAIRTEXGXAOATlAQ9PQBCBRISEMATAQJRIGXAS9FQBCBRtCBREEXGXAOAIlCi9PQBCBRISLMANCU/CBJAEJRKGXGXGXGXGXATAECKrJ2BBAtCKZrCEZfIBFGEBMAKhB83EBAKCNJhB83EBSEMAKAI2BIAI2BBHmCKrHYAYCE6HYy86BBAKCFJAICIJAYJHY2BBAmCIrCEZHPAPCE6HPy86BBAKCGJAYAPJHY2BBAmCGrCEZHPAPCE6HPy86BBAKCEJAYAPJHY2BBAmCEZHmAmCE6Hmy86BBAKCIJAYAmJHY2BBAI2BFHmCKrHPAPCE6HPy86BBAKCLJAYAPJHY2BBAmCIrCEZHPAPCE6HPy86BBAKCKJAYAPJHY2BBAmCGrCEZHPAPCE6HPy86BBAKCOJAYAPJHY2BBAmCEZHmAmCE6Hmy86BBAKCNJAYAmJHY2BBAI2BGHmCKrHPAPCE6HPy86BBAKCVJAYAPJHY2BBAmCIrCEZHPAPCE6HPy86BBAKCcJAYAPJHY2BBAmCGrCEZHPAPCE6HPy86BBAKCMJAYAPJHY2BBAmCEZHmAmCE6Hmy86BBAKCSJAYAmJHm2BBAI2BEHICKrHYAYCE6HYy86BBAKCQJAmAYJHm2BBAICIrCEZHYAYCE6HYy86BBAKCfJAmAYJHm2BBAICGrCEZHYAYCE6HYy86BBAKCbJAmAYJHK2BBAICEZHIAICE6HIy86BBAKAIJRISGMAKAI2BNAI2BBHmCIrHYAYCb6HYy86BBAKCFJAICNJAYJHY2BBAmCbZHmAmCb6Hmy86BBAKCGJAYAmJHm2BBAI2BFHYCIrHPAPCb6HPy86BBAKCEJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCIJAmAYJHm2BBAI2BGHYCIrHPAPCb6HPy86BBAKCLJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCKJAmAYJHm2BBAI2BEHYCIrHPAPCb6HPy86BBAKCOJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCNJAmAYJHm2BBAI2BIHYCIrHPAPCb6HPy86BBAKCVJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCcJAmAYJHm2BBAI2BLHYCIrHPAPCb6HPy86BBAKCMJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCSJAmAYJHm2BBAI2BKHYCIrHPAPCb6HPy86BBAKCQJAmAPJHm2BBAYCbZHYAYCb6HYy86BBAKCfJAmAYJHm2BBAI2BOHICIrHYAYCb6HYy86BBAKCbJAmAYJHK2BBAICbZHIAICb6HIy86BBAKAIJRISFMAKAI8pBB83BBAKCNJAICNJ8pBB83BBAICTJRIMAtCGJRtAECTJHEAS9JQBMMGXAIQBCBRISEMGXAM9FQBANAbJ2BBRtCBRKAfREEXAEANCU/CBJAKJ2BBHTCFrCBATCFZl9zAtJHt86BBAEAGJREAKCFJHKAM9HQBMMAfCFJRfAIRTAbCFJHbAG9HQBMMABAcAG9sJANCUGJAMAG9sTkUUUBpANANCUGJAMCaJAG9sJAGTkUUUBpMAMCBAIyAcJRcAIQBMC9+RKSFMCBC99AOAIlAGCAAGCA9Ly6yRKMALCU/EBJ8kUUUUBAKM+OmFTa8jUUUUBCoFlHL8kUUUUBC9+RKGXAFCE9uHOCtJAI9LQBCaRKAE2BBHNC/wFZC/gF9HQBANCbZHVCF9LQBALCoBJCgFCUFT+JUUUBpALC84Jha83EBALC8wJha83EBALC8oJha83EBALCAJha83EBALCiJha83EBALCTJha83EBALha83ENALha83EBAEAIJC9wJRcAECFJHNAOJRMGXAF9FQBCQCbAVCF6yRSABRECBRVCBRQCBRfCBRICBRKEXGXAMAcuQBC9+RKSEMGXGXAN2BBHOC/vF9LQBALCoBJAOCIrCa9zAKJCbZCEWJHb8oGIRTAb8oGBRtGXAOCbZHbAS9PQBALAOCa9zAIJCbZCGWJ8oGBAVAbyROAb9FRbGXGXAGCG9HQBABAt87FBABCIJAO87FBABCGJAT87FBSFMAEAtjGBAECNJAOjGBAECIJATjGBMAVAbJRVALCoBJAKCEWJHmAOjGBAmATjGIALAICGWJAOjGBALCoBJAKCFJCbZHKCEWJHTAtjGBATAOjGIAIAbJRIAKCFJRKSGMGXGXAbCb6QBAQAbJAbC989zJCFJRQSFMAM1BBHbCgFZROGXGXAbCa9MQBAMCFJRMSFMAM1BFHbCgBZCOWAOCgBZqROGXAbCa9MQBAMCGJRMSFMAM1BGHbCgBZCfWAOqROGXAbCa9MQBAMCEJRMSFMAM1BEHbCgBZCdWAOqROGXAbCa9MQBAMCIJRMSFMAM2BIC8cWAOqROAMCLJRMMAOCFrCBAOCFZl9zAQJRQMGXGXAGCG9HQBABAt87FBABCIJAQ87FBABCGJAT87FBSFMAEAtjGBAECNJAQjGBAECIJATjGBMALCoBJAKCEWJHOAQjGBAOATjGIALAICGWJAQjGBALCoBJAKCFJCbZHKCEWJHOAtjGBAOAQjGIAICFJRIAKCFJRKSFMGXAOCDF9LQBALAIAcAOCbZJ2BBHbCIrHTlCbZCGWJ8oGBAVCFJHtATyROALAIAblCbZCGWJ8oGBAtAT9FHmJHtAbCbZHTyRbAT9FRTGXGXAGCG9HQBABAV87FBABCIJAb87FBABCGJAO87FBSFMAEAVjGBAECNJAbjGBAECIJAOjGBMALAICGWJAVjGBALCoBJAKCEWJHYAOjGBAYAVjGIALAICFJHICbZCGWJAOjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAIAmJCbZHICGWJAbjGBALCoBJAKCGJCbZHKCEWJHOAVjGBAOAbjGIAKCFJRKAIATJRIAtATJRVSFMAVCBAM2BBHYyHTAOC/+F6HPJROAYCbZRtGXGXAYCIrHmQBAOCFJRbSFMAORbALAIAmlCbZCGWJ8oGBROMGXGXAtQBAbCFJRVSFMAbRVALAIAYlCbZCGWJ8oGBRbMGXGXAP9FQBAMCFJRYSFMAM1BFHYCgFZRTGXGXAYCa9MQBAMCGJRYSFMAM1BGHYCgBZCOWATCgBZqRTGXAYCa9MQBAMCEJRYSFMAM1BEHYCgBZCfWATqRTGXAYCa9MQBAMCIJRYSFMAM1BIHYCgBZCdWATqRTGXAYCa9MQBAMCLJRYSFMAMCKJRYAM2BLC8cWATqRTMATCFrCBATCFZl9zAQJHQRTMGXGXAmCb6QBAYRPSFMAY1BBHMCgFZROGXGXAMCa9MQBAYCFJRPSFMAY1BFHMCgBZCOWAOCgBZqROGXAMCa9MQBAYCGJRPSFMAY1BGHMCgBZCfWAOqROGXAMCa9MQBAYCEJRPSFMAY1BEHMCgBZCdWAOqROGXAMCa9MQBAYCIJRPSFMAYCLJRPAY2BIC8cWAOqROMAOCFrCBAOCFZl9zAQJHQROMGXGXAtCb6QBAPRMSFMAP1BBHMCgFZRbGXGXAMCa9MQBAPCFJRMSFMAP1BFHMCgBZCOWAbCgBZqRbGXAMCa9MQBAPCGJRMSFMAP1BGHMCgBZCfWAbqRbGXAMCa9MQBAPCEJRMSFMAP1BEHMCgBZCdWAbqRbGXAMCa9MQBAPCIJRMSFMAPCLJRMAP2BIC8cWAbqRbMAbCFrCBAbCFZl9zAQJHQRbMGXGXAGCG9HQBABAT87FBABCIJAb87FBABCGJAO87FBSFMAEATjGBAECNJAbjGBAECIJAOjGBMALCoBJAKCEWJHYAOjGBAYATjGIALAICGWJATjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAICFJHICbZCGWJAOjGBALCoBJAKCGJCbZCEWJHOATjGBAOAbjGIALAIAm9FAmCb6qJHICbZCGWJAbjGBAIAt9FAtCb6qJRIAKCEJRKMANCFJRNABCKJRBAECSJREAKCbZRKAICbZRIAfCEJHfAF9JQBMMCBC99AMAc6yRKMALCoFJ8kUUUUBAKM/tIFGa8jUUUUBCTlRLC9+RKGXAFCLJAI9LQBCaRKAE2BBC/+FZC/QF9HQBALhB83ENAECFJRKAEAIJC98JREGXAF9FQBGXAGCG6QBEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMALCNJAICFZCGWqHGAICGrCBAICFrCFZl9zAG8oGBJHIjGBABAIjGBABCIJRBAFCaJHFQBSGMMEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMABAICGrCBAICFrCFZl9zALCNJAICFZCGWqHI8oGBJHG87FBAIAGjGBABCGJRBAFCaJHFQBMMCBC99AKAE6yRKMAKM+lLKFaF99GaG99FaG99GXGXAGCI9HQBAF9FQFEXGXGX9DBBB8/9DBBB+/ABCGJHG1BB+yAB1BBHE+yHI+L+TABCFJHL1BBHK+yHO+L+THN9DBBBB9gHVyAN9DBB/+hANAN+U9DBBBBANAVyHcAc+MHMAECa3yAI+SHIAI+UAcAMAKCa3yAO+SHcAc+U+S+S+R+VHO+U+SHN+L9DBBB9P9d9FQBAN+oRESFMCUUUU94REMAGAE86BBGXGX9DBBB8/9DBBB+/Ac9DBBBB9gyAcAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMALAG86BBGXGX9DBBB8/9DBBB+/AI9DBBBB9gyAIAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMABAG86BBABCIJRBAFCaJHFQBSGMMAF9FQBEXGXGX9DBBB8/9DBBB+/ABCIJHG8uFB+yAB8uFBHE+yHI+L+TABCGJHL8uFBHK+yHO+L+THN9DBBBB9gHVyAN9DB/+g6ANAN+U9DBBBBANAVyHcAc+MHMAECa3yAI+SHIAI+UAcAMAKCa3yAO+SHcAc+U+S+S+R+VHO+U+SHN+L9DBBB9P9d9FQBAN+oRESFMCUUUU94REMAGAE87FBGXGX9DBBB8/9DBBB+/Ac9DBBBB9gyAcAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMALAG87FBGXGX9DBBB8/9DBBB+/AI9DBBBB9gyAIAO+U+SHN+L9DBBB9P9d9FQBAN+oRGSFMCUUUU94RGMABAG87FBABCNJRBAFCaJHFQBMMM/SEIEaE99EaF99GXAF9FQBCBREABRIEXGXGX9D/zI818/AICKJ8uFBHLCEq+y+VHKAI8uFB+y+UHO9DB/+g6+U9DBBB8/9DBBB+/AO9DBBBB9gy+SHN+L9DBBB9P9d9FQBAN+oRVSFMCUUUU94RVMAICIJ8uFBRcAICGJ8uFBRMABALCFJCEZAEqCFWJAV87FBGXGXAKAM+y+UHN9DB/+g6+U9DBBB8/9DBBB+/AN9DBBBB9gy+SHS+L9DBBB9P9d9FQBAS+oRMSFMCUUUU94RMMABALCGJCEZAEqCFWJAM87FBGXGXAKAc+y+UHK9DB/+g6+U9DBBB8/9DBBB+/AK9DBBBB9gy+SHS+L9DBBB9P9d9FQBAS+oRcSFMCUUUU94RcMABALCaJCEZAEqCFWJAc87FBGXGX9DBBU8/AOAO+U+TANAN+U+TAKAK+U+THO9DBBBBAO9DBBBB9gy+R9DB/+g6+U9DBBB8/+SHO+L9DBBB9P9d9FQBAO+oRcSFMCUUUU94RcMABALCEZAEqCFWJAc87FBAICNJRIAECIJREAFCaJHFQBMMM9JBGXAGCGrAF9sHF9FQBEXABAB8oGBHGCNWCN91+yAGCi91CnWCUUU/8EJ+++U84GBABCIJRBAFCaJHFQBMMM9TFEaCBCB8oGUkUUBHFABCEJC98ZJHBjGUkUUBGXGXAB8/BCTWHGuQBCaREABAGlCggEJCTrXBCa6QFMAFREMAEM/lFFFaGXGXAFABqCEZ9FQBABRESFMGXGXAGCT9PQBABRESFMABREEXAEAF8oGBjGBAECIJAFCIJ8oGBjGBAECNJAFCNJ8oGBjGBAECSJAFCSJ8oGBjGBAECTJREAFCTJRFAGC9wJHGCb9LQBMMAGCI9JQBEXAEAF8oGBjGBAFCIJRFAECIJREAGC98JHGCE9LQBMMGXAG9FQBEXAEAF2BB86BBAECFJREAFCFJRFAGCaJHGQBMMABMoFFGaGXGXABCEZ9FQBABRESFMAFCgFZC+BwsN9sRIGXGXAGCT9PQBABRESFMABREEXAEAIjGBAECSJAIjGBAECNJAIjGBAECIJAIjGBAECTJREAGC9wJHGCb9LQBMMAGCI9JQBEXAEAIjGBAECIJREAGC98JHGCE9LQBMMGXAG9FQBEXAEAF86BBAECFJREAGCaJHGQBMMABMMMFBCUNMIT9kBB';var wasm_simd='B9h9z9tFBBBF8dL9gBB9gLaaaaaFa9gEaaaB9gGaaB9gFaFaEQSBBFBFFGEGEGIILF9wFFFLEFBFKNFaFCx/aFMO/LFVK9tv9t9vq95GBt9f9f939h9z9t9f9j9h9s9s9f9jW9vq9zBBp9tv9z9o9v9wW9f9kv9j9v9kv9WvqWv94h919m9mvqBG8Z9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv94h919m9mvqBIy9tv9z9o9v9wW9f9kv9j9v9kv9J9u9kv949TvZ91v9u9jvBLn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9P9jWBKi9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9R919hWBNn9tv9z9o9v9wW9f9kv9j9v9kv69p9sWvq9F949wBcI9z9iqlBMc/j9JSIBTEM9+FLa8jUUUUBCTlRBCBRFEXCBRGCBREEXABCNJAGJAECUaAFAGrCFZHIy86BBAEAIJREAGCFJHGCN9HQBMAFCx+YUUBJAE86BBAFCEWCxkUUBJAB8pEN83EBAFCFJHFCUG9HQBMMkRIbaG97FaK978jUUUUBCU/KBlHL8kUUUUBC9+RKGXAGCFJAI9LQBCaRKAE2BBC+gF9HQBALAEAIJHOAGlAG/8cBBCUoBAG9uC/wgBZHKCUGAKCUG9JyRNAECFJRKCBRVGXEXAVAF9PQFANAFAVlAVANJAF9JyRcGXGXAG9FQBAcCbJHIC9wZHMCE9sRSAMCFWRQAICIrCEJCGrRfCBRbEXAKRTCBRtGXEXGXAOATlAf9PQBCBRKSLMALCU/CBJAtAM9sJRmATAfJRKCBREGXAMCoB9JQBAOAKlC/gB9JQBCBRIEXAmAIJREGXGXGXGXGXATAICKrJ2BBHYCEZfIBFGEBMAECBDtDMIBSEMAEAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBAeCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIBAKCIJAnDeBJAeCx+YUUBJ2BBJRKSGMAEAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBAeCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIBAKCNJAnDeBJAeCx+YUUBJ2BBJRKSFMAEAKDBBBDMIBAKCTJRKMGXGXGXGXGXAYCGrCEZfIBFGEBMAECBDtDMITSEMAEAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBAeCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMITAKCIJAnDeBJAeCx+YUUBJ2BBJRKSGMAEAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBAeCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMITAKCNJAnDeBJAeCx+YUUBJ2BBJRKSFMAEAKDBBBDMITAKCTJRKMGXGXGXGXGXAYCIrCEZfIBFGEBMAECBDtDMIASEMAEAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBAeCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIAAKCIJAnDeBJAeCx+YUUBJ2BBJRKSGMAEAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBAeCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIAAKCNJAnDeBJAeCx+YUUBJ2BBJRKSFMAEAKDBBBDMIAAKCTJRKMGXGXGXGXGXAYCKrfIBFGEBMAECBDtDMI8wSEMAEAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HYCEWCxkUUBJDBEBAYCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HYCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMI8wAKCIJAnDeBJAYCx+YUUBJ2BBJRKSGMAEAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HYCEWCxkUUBJDBEBAYCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HYCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMI8wAKCNJAnDeBJAYCx+YUUBJ2BBJRKSFMAEAKDBBBDMI8wAKCTJRKMAICoBJREAICUFJAM9LQFAERIAOAKlC/fB9LQBMMGXAEAM9PQBAECErRIEXGXAOAKlCi9PQBCBRKSOMAmAEJRYGXGXGXGXGXATAECKrJ2BBAICKZrCEZfIBFGEBMAYCBDtDMIBSEMAYAKDBBIAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnHPCGD+MFAPDQBTFtGmEYIPLdKeOnC0+G+MiDtD9OHdCEDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBAeCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIBAKCIJAnDeBJAeCx+YUUBJ2BBJRKSGMAYAKDBBNAKDBBBHPCID+MFAPDQBTFtGmEYIPLdKeOnC+P+e+8/4BDtD9OHdCbDbD8jHPD8dBhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBAeCx+YUUBJDBBBHnAnDQBBBBBBBBBBBBBBBBAPD8dFhUg/8/4/w/goB9+h84k7HeCEWCxkUUBJDBEBD9uDQBFGEILKOTtmYPdenDfAdAPD9SDMIBAKCNJAnDeBJAeCx+YUUBJ2BBJRKSFMAYAKDBBBDMIBAKCTJRKMAICGJRIAECTJHEAM9JQBMMGXAK9FQBAKRTAtCFJHtCI6QGSFMMCBRKSEMGXAM9FQBALCUGJAbJREALAbJDBGBRnCBRYEXAEALCU/CBJAYJHIDBIBHdCFD9tAdCFDbHPD9OD9hD9RHdAIAMJDBIBHiCFD9tAiAPD9OD9hD9RHiDQBTFtGmEYIPLdKeOnH8ZAIAQJDBIBHpCFD9tApAPD9OD9hD9RHpAIASJDBIBHyCFD9tAyAPD9OD9hD9RHyDQBTFtGmEYIPLdKeOnH8cDQBFTtGEmYILPdKOenHPAPDQBFGEBFGEBFGEBFGEAnD9uHnDyBjGBAEAGJHIAnAPAPDQILKOILKOILKOILKOD9uHnDyBjGBAIAGJHIAnAPAPDQNVcMNVcMNVcMNVcMD9uHnDyBjGBAIAGJHIAnAPAPDQSQfbSQfbSQfbSQfbD9uHnDyBjGBAIAGJHIAnA8ZA8cDQNVi8ZcMpySQ8c8dfb8e8fHPAPDQBFGEBFGEBFGEBFGED9uHnDyBjGBAIAGJHIAnAPAPDQILKOILKOILKOILKOD9uHnDyBjGBAIAGJHIAnAPAPDQNVcMNVcMNVcMNVcMD9uHnDyBjGBAIAGJHIAnAPAPDQSQfbSQfbSQfbSQfbD9uHnDyBjGBAIAGJHIAnAdAiDQNiV8ZcpMyS8cQ8df8eb8fHdApAyDQNiV8ZcpMyS8cQ8df8eb8fHiDQBFTtGEmYILPdKOenHPAPDQBFGEBFGEBFGEBFGED9uHnDyBjGBAIAGJHIAnAPAPDQILKOILKOILKOILKOD9uHnDyBjGBAIAGJHIAnAPAPDQNVcMNVcMNVcMNVcMD9uHnDyBjGBAIAGJHIAnAPAPDQSQfbSQfbSQfbSQfbD9uHnDyBjGBAIAGJHIAnAdAiDQNVi8ZcMpySQ8c8dfb8e8fHPAPDQBFGEBFGEBFGEBFGED9uHnDyBjGBAIAGJHIAnAPAPDQILKOILKOILKOILKOD9uHnDyBjGBAIAGJHIAnAPAPDQNVcMNVcMNVcMNVcMD9uHnDyBjGBAIAGJHIAnAPAPDQSQfbSQfbSQfbSQfbD9uHnDyBjGBAIAGJREAYCTJHYAM9JQBMMAbCIJHbAG9JQBMMABAVAG9sJALCUGJAcAG9s/8cBBALALCUGJAcCaJAG9sJAG/8cBBMAcCBAKyAVJRVAKQBMC9+RKSFMCBC99AOAKlAGCAAGCA9Ly6yRKMALCU/KBJ8kUUUUBAKMNBT+BUUUBM+KmFTa8jUUUUBCoFlHL8kUUUUBC9+RKGXAFCE9uHOCtJAI9LQBCaRKAE2BBHNC/wFZC/gF9HQBANCbZHVCF9LQBALCoBJCgFCUF/8MBALC84Jha83EBALC8wJha83EBALC8oJha83EBALCAJha83EBALCiJha83EBALCTJha83EBALha83ENALha83EBAEAIJC9wJRcAECFJHNAOJRMGXAF9FQBCQCbAVCF6yRSABRECBRVCBRQCBRfCBRICBRKEXGXAMAcuQBC9+RKSEMGXGXAN2BBHOC/vF9LQBALCoBJAOCIrCa9zAKJCbZCEWJHb8oGIRTAb8oGBRtGXAOCbZHbAS9PQBALAOCa9zAIJCbZCGWJ8oGBAVAbyROAb9FRbGXGXAGCG9HQBABAt87FBABCIJAO87FBABCGJAT87FBSFMAEAtjGBAECNJAOjGBAECIJATjGBMAVAbJRVALCoBJAKCEWJHmAOjGBAmATjGIALAICGWJAOjGBALCoBJAKCFJCbZHKCEWJHTAtjGBATAOjGIAIAbJRIAKCFJRKSGMGXGXAbCb6QBAQAbJAbC989zJCFJRQSFMAM1BBHbCgFZROGXGXAbCa9MQBAMCFJRMSFMAM1BFHbCgBZCOWAOCgBZqROGXAbCa9MQBAMCGJRMSFMAM1BGHbCgBZCfWAOqROGXAbCa9MQBAMCEJRMSFMAM1BEHbCgBZCdWAOqROGXAbCa9MQBAMCIJRMSFMAM2BIC8cWAOqROAMCLJRMMAOCFrCBAOCFZl9zAQJRQMGXGXAGCG9HQBABAt87FBABCIJAQ87FBABCGJAT87FBSFMAEAtjGBAECNJAQjGBAECIJATjGBMALCoBJAKCEWJHOAQjGBAOATjGIALAICGWJAQjGBALCoBJAKCFJCbZHKCEWJHOAtjGBAOAQjGIAICFJRIAKCFJRKSFMGXAOCDF9LQBALAIAcAOCbZJ2BBHbCIrHTlCbZCGWJ8oGBAVCFJHtATyROALAIAblCbZCGWJ8oGBAtAT9FHmJHtAbCbZHTyRbAT9FRTGXGXAGCG9HQBABAV87FBABCIJAb87FBABCGJAO87FBSFMAEAVjGBAECNJAbjGBAECIJAOjGBMALAICGWJAVjGBALCoBJAKCEWJHYAOjGBAYAVjGIALAICFJHICbZCGWJAOjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAIAmJCbZHICGWJAbjGBALCoBJAKCGJCbZHKCEWJHOAVjGBAOAbjGIAKCFJRKAIATJRIAtATJRVSFMAVCBAM2BBHYyHTAOC/+F6HPJROAYCbZRtGXGXAYCIrHmQBAOCFJRbSFMAORbALAIAmlCbZCGWJ8oGBROMGXGXAtQBAbCFJRVSFMAbRVALAIAYlCbZCGWJ8oGBRbMGXGXAP9FQBAMCFJRYSFMAM1BFHYCgFZRTGXGXAYCa9MQBAMCGJRYSFMAM1BGHYCgBZCOWATCgBZqRTGXAYCa9MQBAMCEJRYSFMAM1BEHYCgBZCfWATqRTGXAYCa9MQBAMCIJRYSFMAM1BIHYCgBZCdWATqRTGXAYCa9MQBAMCLJRYSFMAMCKJRYAM2BLC8cWATqRTMATCFrCBATCFZl9zAQJHQRTMGXGXAmCb6QBAYRPSFMAY1BBHMCgFZROGXGXAMCa9MQBAYCFJRPSFMAY1BFHMCgBZCOWAOCgBZqROGXAMCa9MQBAYCGJRPSFMAY1BGHMCgBZCfWAOqROGXAMCa9MQBAYCEJRPSFMAY1BEHMCgBZCdWAOqROGXAMCa9MQBAYCIJRPSFMAYCLJRPAY2BIC8cWAOqROMAOCFrCBAOCFZl9zAQJHQROMGXGXAtCb6QBAPRMSFMAP1BBHMCgFZRbGXGXAMCa9MQBAPCFJRMSFMAP1BFHMCgBZCOWAbCgBZqRbGXAMCa9MQBAPCGJRMSFMAP1BGHMCgBZCfWAbqRbGXAMCa9MQBAPCEJRMSFMAP1BEHMCgBZCdWAbqRbGXAMCa9MQBAPCIJRMSFMAPCLJRMAP2BIC8cWAbqRbMAbCFrCBAbCFZl9zAQJHQRbMGXGXAGCG9HQBABAT87FBABCIJAb87FBABCGJAO87FBSFMAEATjGBAECNJAbjGBAECIJAOjGBMALCoBJAKCEWJHYAOjGBAYATjGIALAICGWJATjGBALCoBJAKCFJCbZCEWJHYAbjGBAYAOjGIALAICFJHICbZCGWJAOjGBALCoBJAKCGJCbZCEWJHOATjGBAOAbjGIALAIAm9FAmCb6qJHICbZCGWJAbjGBAIAt9FAtCb6qJRIAKCEJRKMANCFJRNABCKJRBAECSJREAKCbZRKAICbZRIAfCEJHfAF9JQBMMCBC99AMAc6yRKMALCoFJ8kUUUUBAKM/tIFGa8jUUUUBCTlRLC9+RKGXAFCLJAI9LQBCaRKAE2BBC/+FZC/QF9HQBALhB83ENAECFJRKAEAIJC98JREGXAF9FQBGXAGCG6QBEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMALCNJAICFZCGWqHGAICGrCBAICFrCFZl9zAG8oGBJHIjGBABAIjGBABCIJRBAFCaJHFQBSGMMEXGXAKAE9JQBC9+bMAK1BBHGCgFZRIGXGXAGCa9MQBAKCFJRKSFMAK1BFHGCgBZCOWAICgBZqRIGXAGCa9MQBAKCGJRKSFMAK1BGHGCgBZCfWAIqRIGXAGCa9MQBAKCEJRKSFMAK1BEHGCgBZCdWAIqRIGXAGCa9MQBAKCIJRKSFMAK2BIC8cWAIqRIAKCLJRKMABAICGrCBAICFrCFZl9zALCNJAICFZCGWqHI8oGBJHG87FBAIAGjGBABCGJRBAFCaJHFQBMMCBC99AKAE6yRKMAKM/xLGEaK978jUUUUBCAlHE8kUUUUBGXGXAGCI9HQBGXAFC98ZHI9FQBABRGCBRLEXAGAGDBBBHKCiD+rFCiD+sFD/6FHOAKCND+rFCiD+sFD/6FAOD/gFAKCTD+rFCiD+sFD/6FHND/gFD/kFD/lFHVCBDtD+2FHcAOCUUUU94DtHMD9OD9RD/kFHO9DBB/+hDYAOAOD/mFAVAVD/mFANAcANAMD9OD9RD/kFHOAOD/mFD/kFD/kFD/jFD/nFHND/mF9DBBX9LDYHcD/kFCgFDtD9OAKCUUU94DtD9OD9QAOAND/mFAcD/kFCND+rFCU/+EDtD9OD9QAVAND/mFAcD/kFCTD+rFCUU/8ODtD9OD9QDMBBAGCTJRGALCIJHLAI9JQBMMAIAF9PQFAEAFCEZHLCGWHGqCBCTAGl/8MBAEABAICGWJHIAG/8cBBGXAL9FQBAEAEDBIBHKCiD+rFCiD+sFD/6FHOAKCND+rFCiD+sFD/6FAOD/gFAKCTD+rFCiD+sFD/6FHND/gFD/kFD/lFHVCBDtD+2FHcAOCUUUU94DtHMD9OD9RD/kFHO9DBB/+hDYAOAOD/mFAVAVD/mFANAcANAMD9OD9RD/kFHOAOD/mFD/kFD/kFD/jFD/nFHND/mF9DBBX9LDYHcD/kFCgFDtD9OAKCUUU94DtD9OD9QAOAND/mFAcD/kFCND+rFCU/+EDtD9OD9QAVAND/mFAcD/kFCTD+rFCUU/8ODtD9OD9QDMIBMAIAEAG/8cBBSFMABAFC98ZHGT+HUUUBAGAF9PQBAEAFCEZHICEWHLJCBCAALl/8MBAEABAGCEWJHGAL/8cBBAEAIT+HUUUBAGAEAL/8cBBMAECAJ8kUUUUBM+yEGGaO97GXAF9FQBCBRGEXABCTJHEAEDBBBHICBDtHLCUU98D8cFCUU98D8cEHKD9OABDBBBHOAIDQILKOSQfbPden8c8d8e8fCggFDtD9OD/6FAOAIDQBFGENVcMTtmYi8ZpyHICTD+sFD/6FHND/gFAICTD+rFCTD+sFD/6FHVD/gFD/kFD/lFHI9DB/+g6DYAVAIALD+2FHLAVCUUUU94DtHcD9OD9RD/kFHVAVD/mFAIAID/mFANALANAcD9OD9RD/kFHIAID/mFD/kFD/kFD/jFD/nFHND/mF9DBBX9LDYHLD/kFCTD+rFAVAND/mFALD/kFCggEDtD9OD9QHVAIAND/mFALD/kFCaDbCBDnGCBDnECBDnKCBDnOCBDncCBDnMCBDnfCBDnbD9OHIDQNVi8ZcMpySQ8c8dfb8e8fD9QDMBBABAOAKD9OAVAIDQBFTtGEmYILPdKOenD9QDMBBABCAJRBAGCIJHGAF9JQBMMM94FEa8jUUUUBCAlHE8kUUUUBABAFC98ZHIT+JUUUBGXAIAF9PQBAEAFCEZHLCEWHFJCBCAAFl/8MBAEABAICEWJHBAF/8cBBAEALT+JUUUBABAEAF/8cBBMAECAJ8kUUUUBM/hEIGaF97FaL978jUUUUBCTlRGGXAF9FQBCBREEXAGABDBBBHIABCTJHLDBBBHKDQILKOSQfbPden8c8d8e8fHOCTD+sFHNCID+rFDMIBAB9DBBU8/DY9D/zI818/DYANCEDtD9QD/6FD/nFHNAIAKDQBFGENVcMTtmYi8ZpyHICTD+rFCTD+sFD/6FD/mFHKAKD/mFANAICTD+sFD/6FD/mFHVAVD/mFANAOCTD+rFCTD+sFD/6FD/mFHOAOD/mFD/kFD/kFD/lFCBDtD+4FD/jF9DB/+g6DYHND/mF9DBBX9LDYHID/kFCggEDtHcD9OAVAND/mFAID/kFCTD+rFD9QHVAOAND/mFAID/kFCTD+rFAKAND/mFAID/kFAcD9OD9QHNDQBFTtGEmYILPdKOenHID8dBAGDBIBDyB+t+J83EBABCNJAID8dFAGDBIBDyF+t+J83EBALAVANDQNVi8ZcMpySQ8c8dfb8e8fHND8dBAGDBIBDyG+t+J83EBABCiJAND8dFAGDBIBDyE+t+J83EBABCAJRBAECIJHEAF9JQBMMM/3FGEaF978jUUUUBCoBlREGXAGCGrAF9sHIC98ZHL9FQBCBRGABRFEXAFAFDBBBHKCND+rFCND+sFD/6FAKCiD+sFCnD+rFCUUU/8EDtD+uFD/mFDMBBAFCTJRFAGCIJHGAL9JQBMMGXALAI9PQBAEAICEZHGCGWHFqCBCoBAFl/8MBAEABALCGWJHLAF/8cBBGXAG9FQBAEAEDBIBHKCND+rFCND+sFD/6FAKCiD+sFCnD+rFCUUU/8EDtD+uFD/mFDMIBMALAEAF/8cBBMM9TFEaCBCB8oGUkUUBHFABCEJC98ZJHBjGUkUUBGXGXAB8/BCTWHGuQBCaREABAGlCggEJCTrXBCa6QFMAFREMAEMMMFBCUNMIT9tBB';var 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]);var wasmpack=new Uint8Array([32,0,65,253,3,1,2,34,4,106,6,5,11,8,7,20,13,33,12,16,128,9,116,64,19,113,127,15,10,21,22,14,255,66,24,54,136,107,18,23,192,26,114,118,132,17,77,101,130,144,27,87,131,44,45,74,156,154,70,167]);var FILTERS={0:'',1:'meshopt_decodeFilterOct',2:'meshopt_decodeFilterQuat',3:'meshopt_decodeFilterExp',NONE:'',OCTAHEDRAL:'meshopt_decodeFilterOct',QUATERNION:'meshopt_decodeFilterQuat',EXPONENTIAL:'meshopt_decodeFilterExp'};var DECODERS={0:'meshopt_decodeVertexBuffer',1:'meshopt_decodeIndexBuffer',2:'meshopt_decodeIndexSequence',ATTRIBUTES:'meshopt_decodeVertexBuffer',TRIANGLES:'meshopt_decodeIndexBuffer',INDICES:'meshopt_decodeIndexSequence'};function isMeshoptSupported(){return isWebAssemblySupported;}function meshoptDecodeGltfBuffer(_x82,_x83,_x84,_x85,_x86){return _meshoptDecodeGltfBuffer.apply(this,arguments);}function _meshoptDecodeGltfBuffer(){_meshoptDecodeGltfBuffer=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee45(target,count,size,source,mode){var filter,instance,_args49=arguments;return regenerator.wrap(function _callee45$(_context49){while(1){switch(_context49.prev=_context49.next){case 0:filter=_args49.length>5&&_args49[5]!==undefined?_args49[5]:'NONE';_context49.next=3;return loadWasmInstance();case 3:instance=_context49.sent;decode$5(instance,instance.exports[DECODERS[mode]],target,count,size,source,instance.exports[FILTERS[filter||'NONE']]);case 5:case"end":return _context49.stop();}}},_callee45);}));return _meshoptDecodeGltfBuffer.apply(this,arguments);}var wasmPromise;function loadWasmInstance(){return _loadWasmInstance.apply(this,arguments);}function _loadWasmInstance(){_loadWasmInstance=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee46(){return regenerator.wrap(function _callee46$(_context50){while(1){switch(_context50.prev=_context50.next){case 0:if(!wasmPromise){wasmPromise=loadWasmModule();}return _context50.abrupt("return",wasmPromise);case 2:case"end":return _context50.stop();}}},_callee46);}));return _loadWasmInstance.apply(this,arguments);}function loadWasmModule(){return _loadWasmModule.apply(this,arguments);}function _loadWasmModule(){_loadWasmModule=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee47(){var wasm,result;return regenerator.wrap(function _callee47$(_context51){while(1){switch(_context51.prev=_context51.next){case 0:wasm=wasm_base;if(WebAssembly.validate(detector)){wasm=wasm_simd;console.log('Warning: meshopt_decoder is using experimental SIMD support');}_context51.next=4;return WebAssembly.instantiate(unpack(wasm),{});case 4:result=_context51.sent;_context51.next=7;return result.instance.exports.__wasm_call_ctors();case 7:return _context51.abrupt("return",result.instance);case 8:case"end":return _context51.stop();}}},_callee47);}));return _loadWasmModule.apply(this,arguments);}function unpack(data){var result=new Uint8Array(data.length);for(var _i58=0;_i58<data.length;++_i58){var ch=data.charCodeAt(_i58);result[_i58]=ch>96?ch-71:ch>64?ch-65:ch>47?ch+4:ch>46?63:62;}var write=0;for(var _i59=0;_i59<data.length;++_i59){result[write++]=result[_i59]<60?wasmpack[result[_i59]]:(result[_i59]-60)*64+result[++_i59];}return result.buffer.slice(0,write);}function decode$5(instance,fun,target,count,size,source,filter){var sbrk=instance.exports.sbrk;var count4=count+3&~3;var tp=sbrk(count4*size);var sp=sbrk(source.length);var heap=new Uint8Array(instance.exports.memory.buffer);heap.set(source,sp);var res=fun(tp,count,size,sp,source.length);if(res===0&&filter){filter(tp,count4,size);}target.set(heap.subarray(tp,tp+count*size));sbrk(tp-sbrk(0));if(res!==0){throw new Error('Malformed buffer data: '.concat(res));}}var EXT_MESHOPT_COMPRESSION='EXT_meshopt_compression';var name$6=EXT_MESHOPT_COMPRESSION;function preprocess$4(gltfData){var scenegraph=new GLTFScenegraph(gltfData);if(scenegraph.getRequiredExtensions().includes(EXT_MESHOPT_COMPRESSION)&&!isMeshoptSupported()){throw new Error('gltf: Required extension '.concat(EXT_MESHOPT_COMPRESSION,' not supported by browser'));}}function decode$4(_x87,_x88){return _decode$.apply(this,arguments);}function _decode$(){_decode$=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee48(gltfData,options){var _options$gltf,scenegraph,promises,_iterator58,_step58,bufferViewIndex;return regenerator.wrap(function _callee48$(_context52){while(1){switch(_context52.prev=_context52.next){case 0:scenegraph=new GLTFScenegraph(gltfData);if(options!==null&&options!==void 0&&(_options$gltf=options.gltf)!==null&&_options$gltf!==void 0&&_options$gltf.decompressMeshes){_context52.next=3;break;}return _context52.abrupt("return");case 3:promises=[];_iterator58=_createForOfIteratorHelper$3(gltfData.json.bufferViews||[]);try{for(_iterator58.s();!(_step58=_iterator58.n()).done;){bufferViewIndex=_step58.value;promises.push(decodeMeshoptBufferView(scenegraph,bufferViewIndex));}}catch(err){_iterator58.e(err);}finally{_iterator58.f();}_context52.next=8;return Promise.all(promises);case 8:scenegraph.removeExtension(EXT_MESHOPT_COMPRESSION);case 9:case"end":return _context52.stop();}}},_callee48);}));return _decode$.apply(this,arguments);}function decodeMeshoptBufferView(_x89,_x90){return _decodeMeshoptBufferView.apply(this,arguments);}function _decodeMeshoptBufferView(){_decodeMeshoptBufferView=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee49(scenegraph,bufferView){var meshoptExtension,buffer,_meshoptExtension$byt,byteOffset,_meshoptExtension$byt2,byteLength,byteStride,count,mode,_meshoptExtension$fil,filter,source,result;return regenerator.wrap(function _callee49$(_context53){while(1){switch(_context53.prev=_context53.next){case 0:meshoptExtension=scenegraph.getObjectExtension(bufferView,EXT_MESHOPT_COMPRESSION);if(!meshoptExtension){_context53.next=9;break;}buffer=bufferView.buffer;_meshoptExtension$byt=meshoptExtension.byteOffset,byteOffset=_meshoptExtension$byt===void 0?0:_meshoptExtension$byt,_meshoptExtension$byt2=meshoptExtension.byteLength,byteLength=_meshoptExtension$byt2===void 0?0:_meshoptExtension$byt2,byteStride=meshoptExtension.byteStride,count=meshoptExtension.count,mode=meshoptExtension.mode,_meshoptExtension$fil=meshoptExtension.filter,filter=_meshoptExtension$fil===void 0?'NONE':_meshoptExtension$fil;source=new Uint8Array(buffer,byteOffset,byteLength);result=new ArrayBuffer(count*byteStride);_context53.next=8;return meshoptDecodeGltfBuffer(new Uint8Array(result),count,byteStride,source,mode,filter);case 8:return _context53.abrupt("return",result);case 9:return _context53.abrupt("return",null);case 10:case"end":return _context53.stop();}}},_callee49);}));return _decodeMeshoptBufferView.apply(this,arguments);}var EXT_meshopt_compression=/*#__PURE__*/Object.freeze({__proto__:null,name:name$6,preprocess:preprocess$4,decode:decode$4});var EXT_TEXTURE_WEBP='EXT_texture_webp';var name$5=EXT_TEXTURE_WEBP;function preprocess$3(gltfData,options){var scenegraph=new GLTFScenegraph(gltfData);if(!_isImageFormatSupported('image/webp')){if(scenegraph.getRequiredExtensions().includes(EXT_TEXTURE_WEBP)){throw new Error('gltf: Required extension '.concat(EXT_TEXTURE_WEBP,' not supported by browser'));}return;}var json=scenegraph.json;var _iterator36=_createForOfIteratorHelper$3(json.textures||[]),_step36;try{for(_iterator36.s();!(_step36=_iterator36.n()).done;){var texture=_step36.value;var extension=scenegraph.getObjectExtension(texture,EXT_TEXTURE_WEBP);if(extension){texture.source=extension.source;}scenegraph.removeObjectExtension(texture,EXT_TEXTURE_WEBP);}}catch(err){_iterator36.e(err);}finally{_iterator36.f();}scenegraph.removeExtension(EXT_TEXTURE_WEBP);}var EXT_texture_webp=/*#__PURE__*/Object.freeze({__proto__:null,name:name$5,preprocess:preprocess$3});var KHR_TEXTURE_BASISU='KHR_texture_basisu';var name$4=KHR_TEXTURE_BASISU;function preprocess$2(gltfData,options){var scene=new GLTFScenegraph(gltfData);var json=scene.json;var _iterator37=_createForOfIteratorHelper$3(json.textures||[]),_step37;try{for(_iterator37.s();!(_step37=_iterator37.n()).done;){var texture=_step37.value;var extension=scene.getObjectExtension(texture,KHR_TEXTURE_BASISU);if(extension){texture.source=extension.source;}scene.removeObjectExtension(texture,KHR_TEXTURE_BASISU);}}catch(err){_iterator37.e(err);}finally{_iterator37.f();}scene.removeExtension(KHR_TEXTURE_BASISU);}var KHR_texture_basisu=/*#__PURE__*/Object.freeze({__proto__:null,name:name$4,preprocess:preprocess$2});function getGLTFAccessors(attributes){var accessors={};for(var _name5 in attributes){var attribute=attributes[_name5];if(_name5!=='indices'){var glTFAccessor=getGLTFAccessor(attribute);accessors[_name5]=glTFAccessor;}}return accessors;}function getGLTFAccessor(attribute){var _getAccessorData=getAccessorData(attribute),buffer=_getAccessorData.buffer,size=_getAccessorData.size,count=_getAccessorData.count;var glTFAccessor={value:buffer,size,byteOffset:0,count,type:getAccessorTypeFromSize(size),componentType:getComponentTypeFromArray(buffer)};return glTFAccessor;}function getAccessorData(attribute){var buffer=attribute;var size=1;var count=0;if(attribute&&attribute.value){buffer=attribute.value;size=attribute.size||1;}if(buffer){if(!ArrayBuffer.isView(buffer)){buffer=toTypedArray(buffer,Float32Array);}count=buffer.length/size;}return {buffer,size,count};}function toTypedArray(array,ArrayType){var convertTypedArrays=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;if(!array){return null;}if(Array.isArray(array)){return new ArrayType(array);}if(convertTypedArrays&&!(array instanceof ArrayType)){return new ArrayType(array);}return array;}var KHR_DRACO_MESH_COMPRESSION='KHR_draco_mesh_compression';var name$3=KHR_DRACO_MESH_COMPRESSION;function preprocess$1(gltfData,options,context){var scenegraph=new GLTFScenegraph(gltfData);var _iterator38=_createForOfIteratorHelper$3(makeMeshPrimitiveIterator(scenegraph)),_step38;try{for(_iterator38.s();!(_step38=_iterator38.n()).done;){var primitive=_step38.value;if(scenegraph.getObjectExtension(primitive,KHR_DRACO_MESH_COMPRESSION));}}catch(err){_iterator38.e(err);}finally{_iterator38.f();}}function decode$3(_x91,_x92,_x93){return _decode$2.apply(this,arguments);}function _decode$2(){_decode$2=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee50(gltfData,options,context){var _options$gltf,scenegraph,promises,_iterator59,_step59,primitive;return regenerator.wrap(function _callee50$(_context54){while(1){switch(_context54.prev=_context54.next){case 0:if(options!==null&&options!==void 0&&(_options$gltf=options.gltf)!==null&&_options$gltf!==void 0&&_options$gltf.decompressMeshes){_context54.next=2;break;}return _context54.abrupt("return");case 2:scenegraph=new GLTFScenegraph(gltfData);promises=[];_iterator59=_createForOfIteratorHelper$3(makeMeshPrimitiveIterator(scenegraph));try{for(_iterator59.s();!(_step59=_iterator59.n()).done;){primitive=_step59.value;if(scenegraph.getObjectExtension(primitive,KHR_DRACO_MESH_COMPRESSION)){promises.push(decompressPrimitive(scenegraph,primitive,options,context));}}}catch(err){_iterator59.e(err);}finally{_iterator59.f();}_context54.next=8;return Promise.all(promises);case 8:scenegraph.removeExtension(KHR_DRACO_MESH_COMPRESSION);case 9:case"end":return _context54.stop();}}},_callee50);}));return _decode$2.apply(this,arguments);}function encode$3(gltfData){var scenegraph=new GLTFScenegraph(gltfData);var _iterator39=_createForOfIteratorHelper$3(scenegraph.json.meshes||[]),_step39;try{for(_iterator39.s();!(_step39=_iterator39.n()).done;){var mesh=_step39.value;compressMesh(mesh);scenegraph.addRequiredExtension(KHR_DRACO_MESH_COMPRESSION);}}catch(err){_iterator39.e(err);}finally{_iterator39.f();}}function decompressPrimitive(_x94,_x95,_x96,_x97){return _decompressPrimitive.apply(this,arguments);}function _decompressPrimitive(){_decompressPrimitive=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee51(scenegraph,primitive,options,context){var dracoExtension,buffer,bufferCopy,parse,dracoOptions,decodedData,decodedAttributes,_i67,_Object$entries2,_Object$entries2$_i,attributeName,decodedAttribute,accessorIndex,accessor;return regenerator.wrap(function _callee51$(_context55){while(1){switch(_context55.prev=_context55.next){case 0:dracoExtension=scenegraph.getObjectExtension(primitive,KHR_DRACO_MESH_COMPRESSION);if(dracoExtension){_context55.next=3;break;}return _context55.abrupt("return");case 3:buffer=scenegraph.getTypedArrayForBufferView(dracoExtension.bufferView);bufferCopy=sliceArrayBuffer(buffer.buffer,buffer.byteOffset);parse=context.parse;dracoOptions=_objectSpread$3({},options);delete dracoOptions['3d-tiles'];_context55.next=10;return parse(bufferCopy,DracoLoader,dracoOptions,context);case 10:decodedData=_context55.sent;decodedAttributes=getGLTFAccessors(decodedData.attributes);for(_i67=0,_Object$entries2=Object.entries(decodedAttributes);_i67<_Object$entries2.length;_i67++){_Object$entries2$_i=_slicedToArray(_Object$entries2[_i67],2),attributeName=_Object$entries2$_i[0],decodedAttribute=_Object$entries2$_i[1];if(attributeName in primitive.attributes){accessorIndex=primitive.attributes[attributeName];accessor=scenegraph.getAccessor(accessorIndex);if(accessor!==null&&accessor!==void 0&&accessor.min&&accessor!==null&&accessor!==void 0&&accessor.max){decodedAttribute.min=accessor.min;decodedAttribute.max=accessor.max;}}}primitive.attributes=decodedAttributes;if(decodedData.indices){primitive.indices=getGLTFAccessor(decodedData.indices);}checkPrimitive(primitive);case 16:case"end":return _context55.stop();}}},_callee51);}));return _decompressPrimitive.apply(this,arguments);}function compressMesh(attributes,indices){var mode=arguments.length>2&&arguments[2]!==undefined?arguments[2]:4;var options=arguments.length>3?arguments[3]:undefined;var context=arguments.length>4?arguments[4]:undefined;var _context$parseSync;if(!options.DracoWriter){throw new Error('options.gltf.DracoWriter not provided');}var compressedData=options.DracoWriter.encodeSync({attributes});var decodedData=context===null||context===void 0?void 0:(_context$parseSync=context.parseSync)===null||_context$parseSync===void 0?void 0:_context$parseSync.call(context,{attributes});var fauxAccessors=options._addFauxAttributes(decodedData.attributes);var bufferViewIndex=options.addBufferView(compressedData);var glTFMesh={primitives:[{attributes:fauxAccessors,mode,extensions:{[KHR_DRACO_MESH_COMPRESSION]:{bufferView:bufferViewIndex,attributes:fauxAccessors}}}]};return glTFMesh;}function checkPrimitive(primitive){if(!primitive.attributes&&Object.keys(primitive.attributes).length>0){throw new Error('glTF: Empty primitive detected: Draco decompression failure?');}}function makeMeshPrimitiveIterator(scenegraph){var _iterator40,_step40,mesh,_iterator41,_step41,primitive;return regenerator.wrap(function makeMeshPrimitiveIterator$(_context12){while(1){switch(_context12.prev=_context12.next){case 0:_iterator40=_createForOfIteratorHelper$3(scenegraph.json.meshes||[]);_context12.prev=1;_iterator40.s();case 3:if((_step40=_iterator40.n()).done){_context12.next=24;break;}mesh=_step40.value;_iterator41=_createForOfIteratorHelper$3(mesh.primitives);_context12.prev=6;_iterator41.s();case 8:if((_step41=_iterator41.n()).done){_context12.next=14;break;}primitive=_step41.value;_context12.next=12;return primitive;case 12:_context12.next=8;break;case 14:_context12.next=19;break;case 16:_context12.prev=16;_context12.t0=_context12["catch"](6);_iterator41.e(_context12.t0);case 19:_context12.prev=19;_iterator41.f();return _context12.finish(19);case 22:_context12.next=3;break;case 24:_context12.next=29;break;case 26:_context12.prev=26;_context12.t1=_context12["catch"](1);_iterator40.e(_context12.t1);case 29:_context12.prev=29;_iterator40.f();return _context12.finish(29);case 32:case"end":return _context12.stop();}}},_marked3,null,[[1,26,29,32],[6,16,19,22]]);}var KHR_draco_mesh_compression=/*#__PURE__*/Object.freeze({__proto__:null,name:name$3,preprocess:preprocess$1,decode:decode$3,encode:encode$3});var KHR_LIGHTS_PUNCTUAL='KHR_lights_punctual';var name$2=KHR_LIGHTS_PUNCTUAL;function decode$2(_x98){return _decode$3.apply(this,arguments);}function _decode$3(){_decode$3=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee52(gltfData){var gltfScenegraph,json,extension,_iterator60,_step60,_node3,nodeExtension;return regenerator.wrap(function _callee52$(_context56){while(1){switch(_context56.prev=_context56.next){case 0:gltfScenegraph=new GLTFScenegraph(gltfData);json=gltfScenegraph.json;extension=gltfScenegraph.getExtension(KHR_LIGHTS_PUNCTUAL);if(extension){gltfScenegraph.json.lights=extension.lights;gltfScenegraph.removeExtension(KHR_LIGHTS_PUNCTUAL);}_iterator60=_createForOfIteratorHelper$3(json.nodes||[]);try{for(_iterator60.s();!(_step60=_iterator60.n()).done;){_node3=_step60.value;nodeExtension=gltfScenegraph.getObjectExtension(_node3,KHR_LIGHTS_PUNCTUAL);if(nodeExtension){_node3.light=nodeExtension.light;}gltfScenegraph.removeObjectExtension(_node3,KHR_LIGHTS_PUNCTUAL);}}catch(err){_iterator60.e(err);}finally{_iterator60.f();}case 6:case"end":return _context56.stop();}}},_callee52);}));return _decode$3.apply(this,arguments);}function encode$2(_x99){return _encode$.apply(this,arguments);}function _encode$(){_encode$=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee53(gltfData){var gltfScenegraph,json,extension,_iterator61,_step61,light,_node4;return regenerator.wrap(function _callee53$(_context57){while(1){switch(_context57.prev=_context57.next){case 0:gltfScenegraph=new GLTFScenegraph(gltfData);json=gltfScenegraph.json;if(json.lights){extension=gltfScenegraph.addExtension(KHR_LIGHTS_PUNCTUAL);assert$1(!extension.lights);extension.lights=json.lights;delete json.lights;}if(gltfScenegraph.json.lights){_iterator61=_createForOfIteratorHelper$3(gltfScenegraph.json.lights);try{for(_iterator61.s();!(_step61=_iterator61.n()).done;){light=_step61.value;_node4=light.node;gltfScenegraph.addObjectExtension(_node4,KHR_LIGHTS_PUNCTUAL,light);}}catch(err){_iterator61.e(err);}finally{_iterator61.f();}delete gltfScenegraph.json.lights;}case 4:case"end":return _context57.stop();}}},_callee53);}));return _encode$.apply(this,arguments);}var KHR_lights_punctual=/*#__PURE__*/Object.freeze({__proto__:null,name:name$2,decode:decode$2,encode:encode$2});var KHR_MATERIALS_UNLIT='KHR_materials_unlit';var name$1=KHR_MATERIALS_UNLIT;function decode$1(_x100){return _decode$4.apply(this,arguments);}function _decode$4(){_decode$4=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee54(gltfData){var gltfScenegraph,json,_iterator62,_step62,material,extension;return regenerator.wrap(function _callee54$(_context58){while(1){switch(_context58.prev=_context58.next){case 0:gltfScenegraph=new GLTFScenegraph(gltfData);json=gltfScenegraph.json;gltfScenegraph.removeExtension(KHR_MATERIALS_UNLIT);_iterator62=_createForOfIteratorHelper$3(json.materials||[]);try{for(_iterator62.s();!(_step62=_iterator62.n()).done;){material=_step62.value;extension=material.extensions&&material.extensions.KHR_materials_unlit;if(extension){material.unlit=true;}gltfScenegraph.removeObjectExtension(material,KHR_MATERIALS_UNLIT);}}catch(err){_iterator62.e(err);}finally{_iterator62.f();}case 5:case"end":return _context58.stop();}}},_callee54);}));return _decode$4.apply(this,arguments);}function encode$1(gltfData){var gltfScenegraph=new GLTFScenegraph(gltfData);var json=gltfScenegraph.json;if(gltfScenegraph.materials){var _iterator42=_createForOfIteratorHelper$3(json.materials||[]),_step42;try{for(_iterator42.s();!(_step42=_iterator42.n()).done;){var material=_step42.value;if(material.unlit){delete material.unlit;gltfScenegraph.addObjectExtension(material,KHR_MATERIALS_UNLIT,{});gltfScenegraph.addExtension(KHR_MATERIALS_UNLIT);}}}catch(err){_iterator42.e(err);}finally{_iterator42.f();}}}var KHR_materials_unlit=/*#__PURE__*/Object.freeze({__proto__:null,name:name$1,decode:decode$1,encode:encode$1});var KHR_TECHNIQUES_WEBGL='KHR_techniques_webgl';var name=KHR_TECHNIQUES_WEBGL;function decode(_x101){return _decode.apply(this,arguments);}function _decode(){_decode=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee55(gltfData){var gltfScenegraph,json,extension,techniques,_iterator63,_step63,material,materialExtension;return regenerator.wrap(function _callee55$(_context59){while(1){switch(_context59.prev=_context59.next){case 0:gltfScenegraph=new GLTFScenegraph(gltfData);json=gltfScenegraph.json;extension=gltfScenegraph.getExtension(KHR_TECHNIQUES_WEBGL);if(extension){techniques=resolveTechniques(extension,gltfScenegraph);_iterator63=_createForOfIteratorHelper$3(json.materials||[]);try{for(_iterator63.s();!(_step63=_iterator63.n()).done;){material=_step63.value;materialExtension=gltfScenegraph.getObjectExtension(material,KHR_TECHNIQUES_WEBGL);if(materialExtension){material.technique=Object.assign({},materialExtension,techniques[materialExtension.technique]);material.technique.values=resolveValues(material.technique,gltfScenegraph);}gltfScenegraph.removeObjectExtension(material,KHR_TECHNIQUES_WEBGL);}}catch(err){_iterator63.e(err);}finally{_iterator63.f();}gltfScenegraph.removeExtension(KHR_TECHNIQUES_WEBGL);}case 4:case"end":return _context59.stop();}}},_callee55);}));return _decode.apply(this,arguments);}function encode(_x102,_x103){return _encode.apply(this,arguments);}function _encode(){_encode=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee56(gltfData,options){return regenerator.wrap(function _callee56$(_context60){while(1){switch(_context60.prev=_context60.next){case 0:case"end":return _context60.stop();}}},_callee56);}));return _encode.apply(this,arguments);}function resolveTechniques(techniquesExtension,gltfScenegraph){var _techniquesExtension$=techniquesExtension.programs,programs=_techniquesExtension$===void 0?[]:_techniquesExtension$,_techniquesExtension$2=techniquesExtension.shaders,shaders=_techniquesExtension$2===void 0?[]:_techniquesExtension$2,_techniquesExtension$3=techniquesExtension.techniques,techniques=_techniquesExtension$3===void 0?[]:_techniquesExtension$3;var textDecoder=new TextDecoder();shaders.forEach(function(shader){if(Number.isFinite(shader.bufferView)){shader.code=textDecoder.decode(gltfScenegraph.getTypedArrayForBufferView(shader.bufferView));}else {throw new Error('KHR_techniques_webgl: no shader code');}});programs.forEach(function(program){program.fragmentShader=shaders[program.fragmentShader];program.vertexShader=shaders[program.vertexShader];});techniques.forEach(function(technique){technique.program=programs[technique.program];});return techniques;}function resolveValues(technique,gltfScenegraph){var values=Object.assign({},technique.values);Object.keys(technique.uniforms||{}).forEach(function(uniform){if(technique.uniforms[uniform].value&&!(uniform in values)){values[uniform]=technique.uniforms[uniform].value;}});Object.keys(values).forEach(function(uniform){if(typeof values[uniform]==='object'&&values[uniform].index!==undefined){values[uniform].texture=gltfScenegraph.getTexture(values[uniform].index);}});return values;}var KHR_techniques_webgl=/*#__PURE__*/Object.freeze({__proto__:null,name:name,decode:decode,encode:encode});var EXTENSIONS=[EXT_meshopt_compression,EXT_texture_webp,KHR_texture_basisu,KHR_draco_mesh_compression,KHR_lights_punctual,KHR_materials_unlit,KHR_techniques_webgl];function preprocessExtensions(gltf){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var context=arguments.length>2?arguments[2]:undefined;var extensions=EXTENSIONS.filter(function(extension){return useExtension(extension.name,options);});var _iterator43=_createForOfIteratorHelper$3(extensions),_step43;try{for(_iterator43.s();!(_step43=_iterator43.n()).done;){var extension=_step43.value;var _extension$preprocess;(_extension$preprocess=extension.preprocess)===null||_extension$preprocess===void 0?void 0:_extension$preprocess.call(extension,gltf,options,context);}}catch(err){_iterator43.e(err);}finally{_iterator43.f();}}function decodeExtensions(_x104){return _decodeExtensions.apply(this,arguments);}function _decodeExtensions(){_decodeExtensions=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee57(gltf){var options,context,extensions,_iterator64,_step64,extension,_extension$decode,_args61=arguments;return regenerator.wrap(function _callee57$(_context61){while(1){switch(_context61.prev=_context61.next){case 0:options=_args61.length>1&&_args61[1]!==undefined?_args61[1]:{};context=_args61.length>2?_args61[2]:undefined;extensions=EXTENSIONS.filter(function(extension){return useExtension(extension.name,options);});_iterator64=_createForOfIteratorHelper$3(extensions);_context61.prev=4;_iterator64.s();case 6:if((_step64=_iterator64.n()).done){_context61.next=12;break;}extension=_step64.value;_context61.next=10;return (_extension$decode=extension.decode)===null||_extension$decode===void 0?void 0:_extension$decode.call(extension,gltf,options,context);case 10:_context61.next=6;break;case 12:_context61.next=17;break;case 14:_context61.prev=14;_context61.t0=_context61["catch"](4);_iterator64.e(_context61.t0);case 17:_context61.prev=17;_iterator64.f();return _context61.finish(17);case 20:case"end":return _context61.stop();}}},_callee57,null,[[4,14,17,20]]);}));return _decodeExtensions.apply(this,arguments);}function useExtension(extensionName,options){var _options$gltf;var excludes=(options===null||options===void 0?void 0:(_options$gltf=options.gltf)===null||_options$gltf===void 0?void 0:_options$gltf.excludeExtensions)||{};var exclude=extensionName in excludes&&!excludes[extensionName];return !exclude;}var KHR_BINARY_GLTF='KHR_binary_glTF';function preprocess(gltfData){var gltfScenegraph=new GLTFScenegraph(gltfData);var json=gltfScenegraph.json;var _iterator44=_createForOfIteratorHelper$3(json.images||[]),_step44;try{for(_iterator44.s();!(_step44=_iterator44.n()).done;){var image=_step44.value;var extension=gltfScenegraph.getObjectExtension(image,KHR_BINARY_GLTF);if(extension){Object.assign(image,extension);}gltfScenegraph.removeObjectExtension(image,KHR_BINARY_GLTF);}}catch(err){_iterator44.e(err);}finally{_iterator44.f();}if(json.buffers&&json.buffers[0]){delete json.buffers[0].uri;}gltfScenegraph.removeExtension(KHR_BINARY_GLTF);}var GLTF_ARRAYS={accessors:'accessor',animations:'animation',buffers:'buffer',bufferViews:'bufferView',images:'image',materials:'material',meshes:'mesh',nodes:'node',samplers:'sampler',scenes:'scene',skins:'skin',textures:'texture'};var GLTF_KEYS={accessor:'accessors',animations:'animation',buffer:'buffers',bufferView:'bufferViews',image:'images',material:'materials',mesh:'meshes',node:'nodes',sampler:'samplers',scene:'scenes',skin:'skins',texture:'textures'};var GLTFV1Normalizer=/*#__PURE__*/function(){function GLTFV1Normalizer(){_classCallCheck(this,GLTFV1Normalizer);_defineProperty(this,'idToIndexMap',{animations:{},accessors:{},buffers:{},bufferViews:{},images:{},materials:{},meshes:{},nodes:{},samplers:{},scenes:{},skins:{},textures:{}});_defineProperty(this,'json',void 0);}_createClass(GLTFV1Normalizer,[{key:"normalize",value:function normalize(gltf,options){this.json=gltf.json;var json=gltf.json;switch(json.asset&&json.asset.version){case'2.0':return;case undefined:case'1.0':break;default:console.warn('glTF: Unknown version '.concat(json.asset.version));return;}if(!options.normalize){throw new Error('glTF v1 is not supported.');}console.warn('Converting glTF v1 to glTF v2 format. This is experimental and may fail.');this._addAsset(json);this._convertTopLevelObjectsToArrays(json);preprocess(gltf);this._convertObjectIdsToArrayIndices(json);this._updateObjects(json);this._updateMaterial(json);}},{key:"_addAsset",value:function _addAsset(json){json.asset=json.asset||{};json.asset.version='2.0';json.asset.generator=json.asset.generator||'Normalized to glTF 2.0 by loaders.gl';}},{key:"_convertTopLevelObjectsToArrays",value:function _convertTopLevelObjectsToArrays(json){for(var arrayName in GLTF_ARRAYS){this._convertTopLevelObjectToArray(json,arrayName);}}},{key:"_convertTopLevelObjectToArray",value:function _convertTopLevelObjectToArray(json,mapName){var objectMap=json[mapName];if(!objectMap||Array.isArray(objectMap)){return;}json[mapName]=[];for(var id in objectMap){var object=objectMap[id];object.id=object.id||id;var index=json[mapName].length;json[mapName].push(object);this.idToIndexMap[mapName][id]=index;}}},{key:"_convertObjectIdsToArrayIndices",value:function _convertObjectIdsToArrayIndices(json){for(var arrayName in GLTF_ARRAYS){this._convertIdsToIndices(json,arrayName);}if('scene'in json){json.scene=this._convertIdToIndex(json.scene,'scene');}var _iterator45=_createForOfIteratorHelper$3(json.textures),_step45;try{for(_iterator45.s();!(_step45=_iterator45.n()).done;){var texture=_step45.value;this._convertTextureIds(texture);}}catch(err){_iterator45.e(err);}finally{_iterator45.f();}var _iterator46=_createForOfIteratorHelper$3(json.meshes),_step46;try{for(_iterator46.s();!(_step46=_iterator46.n()).done;){var mesh=_step46.value;this._convertMeshIds(mesh);}}catch(err){_iterator46.e(err);}finally{_iterator46.f();}var _iterator47=_createForOfIteratorHelper$3(json.nodes),_step47;try{for(_iterator47.s();!(_step47=_iterator47.n()).done;){var _node=_step47.value;this._convertNodeIds(_node);}}catch(err){_iterator47.e(err);}finally{_iterator47.f();}var _iterator48=_createForOfIteratorHelper$3(json.scenes),_step48;try{for(_iterator48.s();!(_step48=_iterator48.n()).done;){var _node2=_step48.value;this._convertSceneIds(_node2);}}catch(err){_iterator48.e(err);}finally{_iterator48.f();}}},{key:"_convertTextureIds",value:function _convertTextureIds(texture){if(texture.source){texture.source=this._convertIdToIndex(texture.source,'image');}}},{key:"_convertMeshIds",value:function _convertMeshIds(mesh){var _iterator49=_createForOfIteratorHelper$3(mesh.primitives),_step49;try{for(_iterator49.s();!(_step49=_iterator49.n()).done;){var primitive=_step49.value;var attributes=primitive.attributes,indices=primitive.indices,material=primitive.material;for(var attributeName in attributes){attributes[attributeName]=this._convertIdToIndex(attributes[attributeName],'accessor');}if(indices){primitive.indices=this._convertIdToIndex(indices,'accessor');}if(material){primitive.material=this._convertIdToIndex(material,'material');}}}catch(err){_iterator49.e(err);}finally{_iterator49.f();}}},{key:"_convertNodeIds",value:function _convertNodeIds(node){var _this24=this;if(node.children){node.children=node.children.map(function(child){return _this24._convertIdToIndex(child,'node');});}if(node.meshes){node.meshes=node.meshes.map(function(mesh){return _this24._convertIdToIndex(mesh,'mesh');});}}},{key:"_convertSceneIds",value:function _convertSceneIds(scene){var _this25=this;if(scene.nodes){scene.nodes=scene.nodes.map(function(node){return _this25._convertIdToIndex(node,'node');});}}},{key:"_convertIdsToIndices",value:function _convertIdsToIndices(json,topLevelArrayName){if(!json[topLevelArrayName]){console.warn("gltf v1: json doesn't contain attribute ".concat(topLevelArrayName));json[topLevelArrayName]=[];}var _iterator50=_createForOfIteratorHelper$3(json[topLevelArrayName]),_step50;try{for(_iterator50.s();!(_step50=_iterator50.n()).done;){var object=_step50.value;for(var key in object){var id=object[key];var index=this._convertIdToIndex(id,key);object[key]=index;}}}catch(err){_iterator50.e(err);}finally{_iterator50.f();}}},{key:"_convertIdToIndex",value:function _convertIdToIndex(id,key){var arrayName=GLTF_KEYS[key];if(arrayName in this.idToIndexMap){var index=this.idToIndexMap[arrayName][id];if(!Number.isFinite(index)){throw new Error('gltf v1: failed to resolve '.concat(key,' with id ').concat(id));}return index;}return id;}},{key:"_updateObjects",value:function _updateObjects(json){var _iterator51=_createForOfIteratorHelper$3(this.json.buffers),_step51;try{for(_iterator51.s();!(_step51=_iterator51.n()).done;){var buffer=_step51.value;delete buffer.type;}}catch(err){_iterator51.e(err);}finally{_iterator51.f();}}},{key:"_updateMaterial",value:function _updateMaterial(json){var _iterator52=_createForOfIteratorHelper$3(json.materials),_step52;try{var _loop3=function _loop3(){var material=_step52.value;material.pbrMetallicRoughness={baseColorFactor:[1,1,1,1],metallicFactor:1,roughnessFactor:1};var textureId=material.values&&material.values.tex;var textureIndex=json.textures.findIndex(function(texture){return texture.id===textureId;});if(textureIndex!==-1){material.pbrMetallicRoughness.baseColorTexture={index:textureIndex};}};for(_iterator52.s();!(_step52=_iterator52.n()).done;){_loop3();}}catch(err){_iterator52.e(err);}finally{_iterator52.f();}}}]);return GLTFV1Normalizer;}();function normalizeGLTFV1(gltf){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};return new GLTFV1Normalizer().normalize(gltf,options);}var COMPONENTS={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16};var BYTES={5120:1,5121:1,5122:2,5123:2,5125:4,5126:4};var GL_SAMPLER={TEXTURE_MAG_FILTER:0x2800,TEXTURE_MIN_FILTER:0x2801,TEXTURE_WRAP_S:0x2802,TEXTURE_WRAP_T:0x2803,REPEAT:0x2901,LINEAR:0x2601,NEAREST_MIPMAP_LINEAR:0x2702};var SAMPLER_PARAMETER_GLTF_TO_GL={magFilter:GL_SAMPLER.TEXTURE_MAG_FILTER,minFilter:GL_SAMPLER.TEXTURE_MIN_FILTER,wrapS:GL_SAMPLER.TEXTURE_WRAP_S,wrapT:GL_SAMPLER.TEXTURE_WRAP_T};var DEFAULT_SAMPLER={[GL_SAMPLER.TEXTURE_MAG_FILTER]:GL_SAMPLER.LINEAR,[GL_SAMPLER.TEXTURE_MIN_FILTER]:GL_SAMPLER.NEAREST_MIPMAP_LINEAR,[GL_SAMPLER.TEXTURE_WRAP_S]:GL_SAMPLER.REPEAT,[GL_SAMPLER.TEXTURE_WRAP_T]:GL_SAMPLER.REPEAT};function getBytesFromComponentType(componentType){return BYTES[componentType];}function getSizeFromAccessorType(type){return COMPONENTS[type];}var GLTFPostProcessor=/*#__PURE__*/function(){function GLTFPostProcessor(){_classCallCheck(this,GLTFPostProcessor);_defineProperty(this,'baseUri','');_defineProperty(this,'json',{});_defineProperty(this,'buffers',[]);_defineProperty(this,'images',[]);}_createClass(GLTFPostProcessor,[{key:"postProcess",value:function postProcess(gltf){var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var json=gltf.json,_gltf$buffers=gltf.buffers,buffers=_gltf$buffers===void 0?[]:_gltf$buffers,_gltf$images=gltf.images,images=_gltf$images===void 0?[]:_gltf$images,_gltf$baseUri=gltf.baseUri,baseUri=_gltf$baseUri===void 0?'':_gltf$baseUri;assert$1(json);this.baseUri=baseUri;this.json=json;this.buffers=buffers;this.images=images;this._resolveTree(this.json,options);return this.json;}},{key:"_resolveTree",value:function _resolveTree(json){var _this26=this;if(json.bufferViews){json.bufferViews=json.bufferViews.map(function(bufView,i){return _this26._resolveBufferView(bufView,i);});}if(json.images){json.images=json.images.map(function(image,i){return _this26._resolveImage(image,i);});}if(json.samplers){json.samplers=json.samplers.map(function(sampler,i){return _this26._resolveSampler(sampler,i);});}if(json.textures){json.textures=json.textures.map(function(texture,i){return _this26._resolveTexture(texture,i);});}if(json.accessors){json.accessors=json.accessors.map(function(accessor,i){return _this26._resolveAccessor(accessor,i);});}if(json.materials){json.materials=json.materials.map(function(material,i){return _this26._resolveMaterial(material,i);});}if(json.meshes){json.meshes=json.meshes.map(function(mesh,i){return _this26._resolveMesh(mesh,i);});}if(json.nodes){json.nodes=json.nodes.map(function(node,i){return _this26._resolveNode(node,i);});}if(json.skins){json.skins=json.skins.map(function(skin,i){return _this26._resolveSkin(skin,i);});}if(json.scenes){json.scenes=json.scenes.map(function(scene,i){return _this26._resolveScene(scene,i);});}if(json.scene!==undefined){json.scene=json.scenes[this.json.scene];}}},{key:"getScene",value:function getScene(index){return this._get('scenes',index);}},{key:"getNode",value:function getNode(index){return this._get('nodes',index);}},{key:"getSkin",value:function getSkin(index){return this._get('skins',index);}},{key:"getMesh",value:function getMesh(index){return this._get('meshes',index);}},{key:"getMaterial",value:function getMaterial(index){return this._get('materials',index);}},{key:"getAccessor",value:function getAccessor(index){return this._get('accessors',index);}},{key:"getCamera",value:function getCamera(index){return null;}},{key:"getTexture",value:function getTexture(index){return this._get('textures',index);}},{key:"getSampler",value:function getSampler(index){return this._get('samplers',index);}},{key:"getImage",value:function getImage(index){return this._get('images',index);}},{key:"getBufferView",value:function getBufferView(index){return this._get('bufferViews',index);}},{key:"getBuffer",value:function getBuffer(index){return this._get('buffers',index);}},{key:"_get",value:function _get(array,index){if(typeof index==='object'){return index;}var object=this.json[array]&&this.json[array][index];if(!object){console.warn('glTF file error: Could not find '.concat(array,'[').concat(index,']'));}return object;}},{key:"_resolveScene",value:function _resolveScene(scene,index){var _this27=this;scene.id=scene.id||'scene-'.concat(index);scene.nodes=(scene.nodes||[]).map(function(node){return _this27.getNode(node);});return scene;}},{key:"_resolveNode",value:function _resolveNode(node,index){var _this28=this;node.id=node.id||'node-'.concat(index);if(node.children){node.children=node.children.map(function(child){return _this28.getNode(child);});}if(node.mesh!==undefined){node.mesh=this.getMesh(node.mesh);}else if(node.meshes!==undefined&&node.meshes.length){node.mesh=node.meshes.reduce(function(accum,meshIndex){var mesh=_this28.getMesh(meshIndex);accum.id=mesh.id;accum.primitives=accum.primitives.concat(mesh.primitives);return accum;},{primitives:[]});}if(node.camera!==undefined){node.camera=this.getCamera(node.camera);}if(node.skin!==undefined){node.skin=this.getSkin(node.skin);}return node;}},{key:"_resolveSkin",value:function _resolveSkin(skin,index){skin.id=skin.id||'skin-'.concat(index);skin.inverseBindMatrices=this.getAccessor(skin.inverseBindMatrices);return skin;}},{key:"_resolveMesh",value:function _resolveMesh(mesh,index){var _this29=this;mesh.id=mesh.id||'mesh-'.concat(index);if(mesh.primitives){mesh.primitives=mesh.primitives.map(function(primitive){primitive=_objectSpread$3({},primitive);var attributes=primitive.attributes;primitive.attributes={};for(var attribute in attributes){primitive.attributes[attribute]=_this29.getAccessor(attributes[attribute]);}if(primitive.indices!==undefined){primitive.indices=_this29.getAccessor(primitive.indices);}if(primitive.material!==undefined){primitive.material=_this29.getMaterial(primitive.material);}return primitive;});}return mesh;}},{key:"_resolveMaterial",value:function _resolveMaterial(material,index){material.id=material.id||'material-'.concat(index);if(material.normalTexture){material.normalTexture=_objectSpread$3({},material.normalTexture);material.normalTexture.texture=this.getTexture(material.normalTexture.index);}if(material.occlusionTexture){material.occlustionTexture=_objectSpread$3({},material.occlustionTexture);material.occlusionTexture.texture=this.getTexture(material.occlusionTexture.index);}if(material.emissiveTexture){material.emmisiveTexture=_objectSpread$3({},material.emmisiveTexture);material.emissiveTexture.texture=this.getTexture(material.emissiveTexture.index);}if(!material.emissiveFactor){material.emissiveFactor=material.emmisiveTexture?[1,1,1]:[0,0,0];}if(material.pbrMetallicRoughness){material.pbrMetallicRoughness=_objectSpread$3({},material.pbrMetallicRoughness);var mr=material.pbrMetallicRoughness;if(mr.baseColorTexture){mr.baseColorTexture=_objectSpread$3({},mr.baseColorTexture);mr.baseColorTexture.texture=this.getTexture(mr.baseColorTexture.index);}if(mr.metallicRoughnessTexture){mr.metallicRoughnessTexture=_objectSpread$3({},mr.metallicRoughnessTexture);mr.metallicRoughnessTexture.texture=this.getTexture(mr.metallicRoughnessTexture.index);}}return material;}},{key:"_resolveAccessor",value:function _resolveAccessor(accessor,index){accessor.id=accessor.id||'accessor-'.concat(index);if(accessor.bufferView!==undefined){accessor.bufferView=this.getBufferView(accessor.bufferView);}accessor.bytesPerComponent=getBytesFromComponentType(accessor.componentType);accessor.components=getSizeFromAccessorType(accessor.type);accessor.bytesPerElement=accessor.bytesPerComponent*accessor.components;if(accessor.bufferView){var buffer=accessor.bufferView.buffer;var _getAccessorArrayType2=getAccessorArrayTypeAndLength(accessor,accessor.bufferView),ArrayType=_getAccessorArrayType2.ArrayType,byteLength=_getAccessorArrayType2.byteLength;var byteOffset=(accessor.bufferView.byteOffset||0)+(accessor.byteOffset||0)+buffer.byteOffset;var cutBuffer=buffer.arrayBuffer.slice(byteOffset,byteOffset+byteLength);if(accessor.bufferView.byteStride){cutBuffer=this._getValueFromInterleavedBuffer(buffer,byteOffset,accessor.bufferView.byteStride,accessor.bytesPerElement,accessor.count);}accessor.value=new ArrayType(cutBuffer);}return accessor;}},{key:"_getValueFromInterleavedBuffer",value:function _getValueFromInterleavedBuffer(buffer,byteOffset,byteStride,bytesPerElement,count){var result=new Uint8Array(count*bytesPerElement);for(var _i60=0;_i60<count;_i60++){var elementOffset=byteOffset+_i60*byteStride;result.set(new Uint8Array(buffer.arrayBuffer.slice(elementOffset,elementOffset+bytesPerElement)),_i60*bytesPerElement);}return result.buffer;}},{key:"_resolveTexture",value:function _resolveTexture(texture,index){texture.id=texture.id||'texture-'.concat(index);texture.sampler='sampler'in texture?this.getSampler(texture.sampler):DEFAULT_SAMPLER;texture.source=this.getImage(texture.source);return texture;}},{key:"_resolveSampler",value:function _resolveSampler(sampler,index){sampler.id=sampler.id||'sampler-'.concat(index);sampler.parameters={};for(var key in sampler){var glEnum=this._enumSamplerParameter(key);if(glEnum!==undefined){sampler.parameters[glEnum]=sampler[key];}}return sampler;}},{key:"_enumSamplerParameter",value:function _enumSamplerParameter(key){return SAMPLER_PARAMETER_GLTF_TO_GL[key];}},{key:"_resolveImage",value:function _resolveImage(image,index){image.id=image.id||'image-'.concat(index);if(image.bufferView!==undefined){image.bufferView=this.getBufferView(image.bufferView);}var preloadedImage=this.images[index];if(preloadedImage){image.image=preloadedImage;}return image;}},{key:"_resolveBufferView",value:function _resolveBufferView(bufferView,index){var bufferIndex=bufferView.buffer;var result=_objectSpread$3(_objectSpread$3({id:'bufferView-'.concat(index)},bufferView),{},{buffer:this.buffers[bufferIndex]});var arrayBuffer=this.buffers[bufferIndex].arrayBuffer;var byteOffset=this.buffers[bufferIndex].byteOffset||0;if('byteOffset'in bufferView){byteOffset+=bufferView.byteOffset;}result.data=new Uint8Array(arrayBuffer,byteOffset,bufferView.byteLength);return result;}},{key:"_resolveCamera",value:function _resolveCamera(camera,index){camera.id=camera.id||'camera-'.concat(index);if(camera.perspective);if(camera.orthographic);return camera;}}]);return GLTFPostProcessor;}();function postProcessGLTF(gltf,options){return new GLTFPostProcessor().postProcess(gltf,options);}var MAGIC_glTF=0x676c5446;var GLB_FILE_HEADER_SIZE=12;var GLB_CHUNK_HEADER_SIZE=8;var GLB_CHUNK_TYPE_JSON=0x4e4f534a;var GLB_CHUNK_TYPE_BIN=0x004e4942;var GLB_CHUNK_TYPE_JSON_XVIZ_DEPRECATED=0;var GLB_CHUNK_TYPE_BIX_XVIZ_DEPRECATED=1;var GLB_V1_CONTENT_FORMAT_JSON=0x0;var LE=true;function getMagicString(dataView){var byteOffset=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;return ''.concat(String.fromCharCode(dataView.getUint8(byteOffset+0))).concat(String.fromCharCode(dataView.getUint8(byteOffset+1))).concat(String.fromCharCode(dataView.getUint8(byteOffset+2))).concat(String.fromCharCode(dataView.getUint8(byteOffset+3)));}function isGLB(arrayBuffer){var byteOffset=arguments.length>1&&arguments[1]!==undefined?arguments[1]:0;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};var dataView=new DataView(arrayBuffer);var _options$magic=options.magic,magic=_options$magic===void 0?MAGIC_glTF:_options$magic;var magic1=dataView.getUint32(byteOffset,false);return magic1===magic||magic1===MAGIC_glTF;}function parseGLBSync(glb,arrayBuffer){var byteOffset=arguments.length>2&&arguments[2]!==undefined?arguments[2]:0;var dataView=new DataView(arrayBuffer);var type=getMagicString(dataView,byteOffset+0);var version=dataView.getUint32(byteOffset+4,LE);var byteLength=dataView.getUint32(byteOffset+8,LE);Object.assign(glb,{header:{byteOffset,byteLength,hasBinChunk:false},type,version,json:{},binChunks:[]});byteOffset+=GLB_FILE_HEADER_SIZE;switch(glb.version){case 1:return parseGLBV1(glb,dataView,byteOffset);case 2:return parseGLBV2(glb,dataView,byteOffset,{});default:throw new Error('Invalid GLB version '.concat(glb.version,'. Only supports v1 and v2.'));}}function parseGLBV1(glb,dataView,byteOffset){assert$7(glb.header.byteLength>GLB_FILE_HEADER_SIZE+GLB_CHUNK_HEADER_SIZE);var contentLength=dataView.getUint32(byteOffset+0,LE);var contentFormat=dataView.getUint32(byteOffset+4,LE);byteOffset+=GLB_CHUNK_HEADER_SIZE;assert$7(contentFormat===GLB_V1_CONTENT_FORMAT_JSON);parseJSONChunk(glb,dataView,byteOffset,contentLength);byteOffset+=contentLength;byteOffset+=parseBINChunk(glb,dataView,byteOffset,glb.header.byteLength);return byteOffset;}function parseGLBV2(glb,dataView,byteOffset,options){assert$7(glb.header.byteLength>GLB_FILE_HEADER_SIZE+GLB_CHUNK_HEADER_SIZE);parseGLBChunksSync(glb,dataView,byteOffset,options);return byteOffset+glb.header.byteLength;}function parseGLBChunksSync(glb,dataView,byteOffset,options){while(byteOffset+8<=glb.header.byteLength){var chunkLength=dataView.getUint32(byteOffset+0,LE);var chunkFormat=dataView.getUint32(byteOffset+4,LE);byteOffset+=GLB_CHUNK_HEADER_SIZE;switch(chunkFormat){case GLB_CHUNK_TYPE_JSON:parseJSONChunk(glb,dataView,byteOffset,chunkLength);break;case GLB_CHUNK_TYPE_BIN:parseBINChunk(glb,dataView,byteOffset,chunkLength);break;case GLB_CHUNK_TYPE_JSON_XVIZ_DEPRECATED:if(!options.strict){parseJSONChunk(glb,dataView,byteOffset,chunkLength);}break;case GLB_CHUNK_TYPE_BIX_XVIZ_DEPRECATED:if(!options.strict){parseBINChunk(glb,dataView,byteOffset,chunkLength);}break;}byteOffset+=padToNBytes(chunkLength,4);}return byteOffset;}function parseJSONChunk(glb,dataView,byteOffset,chunkLength){var jsonChunk=new Uint8Array(dataView.buffer,byteOffset,chunkLength);var textDecoder=new TextDecoder('utf8');var jsonText=textDecoder.decode(jsonChunk);glb.json=JSON.parse(jsonText);return padToNBytes(chunkLength,4);}function parseBINChunk(glb,dataView,byteOffset,chunkLength){glb.header.hasBinChunk=true;glb.binChunks.push({byteOffset,byteLength:chunkLength,arrayBuffer:dataView.buffer});return padToNBytes(chunkLength,4);}function parseGLTF(_x105,_x106){return _parseGLTF.apply(this,arguments);}function _parseGLTF(){_parseGLTF=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee58(gltf,arrayBufferOrString){var byteOffset,options,context,_options$gltf,_options$gltf2,_options$gltf3,_options$gltf4,promises,_promise,promise,_args62=arguments;return regenerator.wrap(function _callee58$(_context62){while(1){switch(_context62.prev=_context62.next){case 0:byteOffset=_args62.length>2&&_args62[2]!==undefined?_args62[2]:0;options=_args62.length>3?_args62[3]:undefined;context=_args62.length>4?_args62[4]:undefined;parseGLTFContainerSync(gltf,arrayBufferOrString,byteOffset,options);normalizeGLTFV1(gltf,{normalize:options===null||options===void 0?void 0:(_options$gltf=options.gltf)===null||_options$gltf===void 0?void 0:_options$gltf.normalize});preprocessExtensions(gltf,options,context);promises=[];if(!(options!==null&&options!==void 0&&(_options$gltf2=options.gltf)!==null&&_options$gltf2!==void 0&&_options$gltf2.loadBuffers&&gltf.json.buffers)){_context62.next=10;break;}_context62.next=10;return loadBuffers(gltf,options,context);case 10:if(options!==null&&options!==void 0&&(_options$gltf3=options.gltf)!==null&&_options$gltf3!==void 0&&_options$gltf3.loadImages){_promise=loadImages(gltf,options,context);promises.push(_promise);}promise=decodeExtensions(gltf,options,context);promises.push(promise);_context62.next=15;return Promise.all(promises);case 15:gltf.json.gltfArrayBuffer=arrayBufferOrString;// !zeg改 兼容gltf
  42818. return _context62.abrupt("return",options!==null&&options!==void 0&&(_options$gltf4=options.gltf)!==null&&_options$gltf4!==void 0&&_options$gltf4.postProcess?postProcessGLTF(gltf,options):gltf);case 17:case"end":return _context62.stop();}}},_callee58);}));return _parseGLTF.apply(this,arguments);}function parseGLTFContainerSync(gltf,data,byteOffset,options){if(options.uri){gltf.baseUri=options.uri;}if(data instanceof ArrayBuffer&&!isGLB(data,byteOffset,options)){var textDecoder=new TextDecoder();data=textDecoder.decode(data);}if(typeof data==='string'){gltf.json=parseJSON(data);}else if(data instanceof ArrayBuffer){var glb={};byteOffset=parseGLBSync(glb,data,byteOffset,options.glb);assert$1(glb.type==='glTF','Invalid GLB magic string '.concat(glb.type));gltf._glb=glb;gltf.json=glb.json;}else {assert$1(false,'GLTF: must be ArrayBuffer or string');}var buffers=gltf.json.buffers||[];gltf.buffers=new Array(buffers.length).fill(null);if(gltf._glb&&gltf._glb.header.hasBinChunk){var binChunks=gltf._glb.binChunks;gltf.buffers[0]={arrayBuffer:binChunks[0].arrayBuffer,byteOffset:binChunks[0].byteOffset,byteLength:binChunks[0].byteLength};}var images=gltf.json.images||[];gltf.images=new Array(images.length).fill({});}function loadBuffers(_x107,_x108,_x109){return _loadBuffers.apply(this,arguments);}function _loadBuffers(){_loadBuffers=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee59(gltf,options,context){var buffers,_i68,buffer,_context$fetch,_response$arrayBuffer,_fetch,uri,response,arrayBuffer;return regenerator.wrap(function _callee59$(_context63){while(1){switch(_context63.prev=_context63.next){case 0:buffers=gltf.json.buffers||[];_i68=0;case 2:if(!(_i68<buffers.length)){_context63.next=19;break;}buffer=buffers[_i68];if(!buffer.uri){_context63.next=16;break;}_fetch=context.fetch;assert$1(_fetch);uri=resolveUrl(buffer.uri,options);_context63.next=10;return context===null||context===void 0?void 0:(_context$fetch=context.fetch)===null||_context$fetch===void 0?void 0:_context$fetch.call(context,uri);case 10:response=_context63.sent;_context63.next=13;return response===null||response===void 0?void 0:(_response$arrayBuffer=response.arrayBuffer)===null||_response$arrayBuffer===void 0?void 0:_response$arrayBuffer.call(response);case 13:arrayBuffer=_context63.sent;gltf.buffers[_i68]={arrayBuffer,byteOffset:0,byteLength:arrayBuffer.byteLength};delete buffer.uri;case 16:++_i68;_context63.next=2;break;case 19:case"end":return _context63.stop();}}},_callee59);}));return _loadBuffers.apply(this,arguments);}function loadImages(_x110,_x111,_x112){return _loadImages.apply(this,arguments);}function _loadImages(){_loadImages=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee60(gltf,options,context){var imageIndices,images,promises,_iterator65,_step65,imageIndex;return regenerator.wrap(function _callee60$(_context64){while(1){switch(_context64.prev=_context64.next){case 0:imageIndices=getReferencesImageIndices(gltf);images=gltf.json.images||[];promises=[];_iterator65=_createForOfIteratorHelper$3(imageIndices);try{for(_iterator65.s();!(_step65=_iterator65.n()).done;){imageIndex=_step65.value;promises.push(loadImage(gltf,images[imageIndex],imageIndex,options,context));}}catch(err){_iterator65.e(err);}finally{_iterator65.f();}_context64.next=7;return Promise.all(promises);case 7:return _context64.abrupt("return",_context64.sent);case 8:case"end":return _context64.stop();}}},_callee60);}));return _loadImages.apply(this,arguments);}function getReferencesImageIndices(gltf){var imageIndices=new Set();var textures=gltf.json.textures||[];var _iterator53=_createForOfIteratorHelper$3(textures),_step53;try{for(_iterator53.s();!(_step53=_iterator53.n()).done;){var texture=_step53.value;if(texture.source!==undefined){imageIndices.add(texture.source);}}}catch(err){_iterator53.e(err);}finally{_iterator53.f();}return Array.from(imageIndices).sort();}function loadImage(_x113,_x114,_x115,_x116,_x117){return _loadImage.apply(this,arguments);}function _loadImage(){_loadImage=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee61(gltf,image,index,options,context){var fetch,parse,arrayBuffer,uri,response,array,parsedImage;return regenerator.wrap(function _callee61$(_context65){while(1){switch(_context65.prev=_context65.next){case 0:fetch=context.fetch,parse=context.parse;if(!image.uri){_context65.next=9;break;}uri=resolveUrl(image.uri,options);_context65.next=5;return fetch(uri);case 5:response=_context65.sent;_context65.next=8;return response.arrayBuffer();case 8:arrayBuffer=_context65.sent;case 9:if(Number.isFinite(image.bufferView)){array=getTypedArrayForBufferView(gltf.json,gltf.buffers,image.bufferView);arrayBuffer=sliceArrayBuffer(array.buffer,array.byteOffset,array.byteLength);}assert$1(arrayBuffer,'glTF image has no data');_context65.next=13;return parse(arrayBuffer,[ImageLoader,BasisLoader],{mimeType:image.mimeType,basis:options.basis||{format:selectSupportedBasisFormat()}},context);case 13:parsedImage=_context65.sent;if(parsedImage&&parsedImage[0]){parsedImage={compressed:true,mipmaps:false,width:parsedImage[0].width,height:parsedImage[0].height,data:parsedImage};}gltf.images=gltf.images||[];gltf.images[index]=parsedImage;case 17:case"end":return _context65.stop();}}},_callee61);}));return _loadImage.apply(this,arguments);}var GLTFLoader={name:'glTF',id:'gltf',module:'gltf',version:VERSION$3,extensions:['gltf','glb'],mimeTypes:['model/gltf+json','model/gltf-binary'],text:true,binary:true,tests:['glTF'],parse:parse$1,options:{gltf:{normalize:true,loadBuffers:true,loadImages:true,decompressMeshes:true,postProcess:true},log:console},deprecatedOptions:{fetchImages:'gltf.loadImages',createImages:'gltf.loadImages',decompress:'gltf.decompressMeshes',postProcess:'gltf.postProcess',gltf:{decompress:'gltf.decompressMeshes'}}};function parse$1(_x118){return _parse$3.apply(this,arguments);}function _parse$3(){_parse$3=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee62(arrayBuffer){var options,context,_options2,_options2$byteOffset,byteOffset,gltf,_args66=arguments;return regenerator.wrap(function _callee62$(_context66){while(1){switch(_context66.prev=_context66.next){case 0:options=_args66.length>1&&_args66[1]!==undefined?_args66[1]:{};context=_args66.length>2?_args66[2]:undefined;options=_objectSpread$3(_objectSpread$3({},GLTFLoader.options),options);options.gltf=_objectSpread$3(_objectSpread$3({},GLTFLoader.options.gltf),options.gltf);_options2=options,_options2$byteOffset=_options2.byteOffset,byteOffset=_options2$byteOffset===void 0?0:_options2$byteOffset;gltf={};_context66.next=8;return parseGLTF(gltf,arrayBuffer,byteOffset,options,context);case 8:return _context66.abrupt("return",_context66.sent);case 9:case"end":return _context66.stop();}}},_callee62);}));return _parse$3.apply(this,arguments);}var GLTF_FORMAT={URI:0,EMBEDDED:1};function parse3DTileGLTFViewSync(tile,arrayBuffer,byteOffset,options){tile.rotateYtoZ=true;var gltfByteLength=tile.byteOffset+tile.byteLength-byteOffset;if(gltfByteLength===0){throw new Error('glTF byte length must be greater than 0.');}tile.gltfUpAxis=options['3d-tiles']&&options['3d-tiles'].assetGltfUpAxis?options['3d-tiles'].assetGltfUpAxis:'Y';tile.gltfArrayBuffer=sliceArrayBuffer(arrayBuffer,byteOffset,gltfByteLength);tile.gltfByteOffset=0;tile.gltfByteLength=gltfByteLength;if(byteOffset%4===0);else {console.warn(''.concat(tile.type,': embedded glb is not aligned to a 4-byte boundary.'));}return tile.byteOffset+tile.byteLength;}function extractGLTF(_x119,_x120,_x121,_x122){return _extractGLTF.apply(this,arguments);}function _extractGLTF(){_extractGLTF=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee63(tile,gltfFormat,options,context){var tile3DOptions,_parse3,_fetch2;return regenerator.wrap(function _callee63$(_context67){while(1){switch(_context67.prev=_context67.next){case 0:tile3DOptions=options['3d-tiles']||{};extractGLTFBufferOrURL(tile,gltfFormat);if(!tile3DOptions.loadGLTF){_context67.next=16;break;}_parse3=context.parse,_fetch2=context.fetch;if(!tile.gltfUrl){_context67.next=9;break;}_context67.next=7;return _fetch2(tile.gltfUrl,options);case 7:tile.gltfArrayBuffer=_context67.sent;tile.gltfByteOffset=0;case 9:if(!tile.gltfArrayBuffer){_context67.next=16;break;}_context67.next=12;return _parse3(tile.gltfArrayBuffer,GLTFLoader,options,context);case 12:tile.gltf=_context67.sent;delete tile.gltfArrayBuffer;delete tile.gltfByteOffset;delete tile.gltfByteLength;case 16:case"end":return _context67.stop();}}},_callee63);}));return _extractGLTF.apply(this,arguments);}function extractGLTFBufferOrURL(tile,gltfFormat,options){switch(gltfFormat){case GLTF_FORMAT.URI:var gltfUrlBytes=new Uint8Array(tile.gltfArrayBuffer,tile.gltfByteOffset);var textDecoder=new TextDecoder();var gltfUrl=textDecoder.decode(gltfUrlBytes);tile.gltfUrl=gltfUrl.replace(/[\s\0]+$/,'');delete tile.gltfArrayBuffer;delete tile.gltfByteOffset;delete tile.gltfByteLength;break;case GLTF_FORMAT.EMBEDDED:break;default:throw new Error('b3dm: Illegal glTF format field');}}function parseBatchedModel3DTile(_x123,_x124,_x125,_x126,_x127){return _parseBatchedModel3DTile.apply(this,arguments);}function _parseBatchedModel3DTile(){_parseBatchedModel3DTile=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee64(tile,arrayBuffer,byteOffset,options,context){var _tile$gltf,extensions;return regenerator.wrap(function _callee64$(_context68){while(1){switch(_context68.prev=_context68.next){case 0:byteOffset=parseBatchedModel(tile,arrayBuffer,byteOffset,options);_context68.next=3;return extractGLTF(tile,GLTF_FORMAT.EMBEDDED,options,context);case 3:extensions=tile===null||tile===void 0?void 0:(_tile$gltf=tile.gltf)===null||_tile$gltf===void 0?void 0:_tile$gltf.extensions;if(extensions&&extensions.CESIUM_RTC){tile.rtcCenter=extensions.CESIUM_RTC.center;}return _context68.abrupt("return",byteOffset);case 6:case"end":return _context68.stop();}}},_callee64);}));return _parseBatchedModel3DTile.apply(this,arguments);}function parseBatchedModel(tile,arrayBuffer,byteOffset,options,context){byteOffset=parse3DTileHeaderSync(tile,arrayBuffer,byteOffset);byteOffset=parse3DTileTablesHeaderSync(tile,arrayBuffer,byteOffset);byteOffset=parse3DTileTablesSync(tile,arrayBuffer,byteOffset);byteOffset=parse3DTileGLTFViewSync(tile,arrayBuffer,byteOffset,options);var featureTable=new Tile3DFeatureTable(tile.featureTableJson,tile.featureTableBinary);tile.rtcCenter=featureTable.getGlobalProperty('RTC_CENTER',GL$1.FLOAT,3);return byteOffset;}function parseInstancedModel3DTile(_x128,_x129,_x130,_x131,_x132){return _parseInstancedModel3DTile.apply(this,arguments);}function _parseInstancedModel3DTile(){_parseInstancedModel3DTile=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee65(tile,arrayBuffer,byteOffset,options,context){return regenerator.wrap(function _callee65$(_context69){while(1){switch(_context69.prev=_context69.next){case 0:byteOffset=parseInstancedModel(tile,arrayBuffer,byteOffset,options);_context69.next=3;return extractGLTF(tile,tile.gltfFormat,options,context);case 3:return _context69.abrupt("return",byteOffset);case 4:case"end":return _context69.stop();}}},_callee65);}));return _parseInstancedModel3DTile.apply(this,arguments);}function parseInstancedModel(tile,arrayBuffer,byteOffset,options,context){byteOffset=parse3DTileHeaderSync(tile,arrayBuffer,byteOffset);if(tile.version!==1){throw new Error('Instanced 3D Model version '.concat(tile.version,' is not supported'));}byteOffset=parse3DTileTablesHeaderSync(tile,arrayBuffer,byteOffset);var view=new DataView(arrayBuffer);tile.gltfFormat=view.getUint32(byteOffset,true);byteOffset+=4;byteOffset=parse3DTileTablesSync(tile,arrayBuffer,byteOffset);byteOffset=parse3DTileGLTFViewSync(tile,arrayBuffer,byteOffset,options);if(tile.featureTableJsonByteLength===0){throw new Error('i3dm parser: featureTableJsonByteLength is zero.');}var featureTable=new Tile3DFeatureTable(tile.featureTableJson,tile.featureTableBinary);var instancesLength=featureTable.getGlobalProperty('INSTANCES_LENGTH');featureTable.featuresLength=instancesLength;if(!Number.isFinite(instancesLength)){throw new Error('i3dm parser: INSTANCES_LENGTH must be defined');}tile.eastNorthUp=featureTable.getGlobalProperty('EAST_NORTH_UP');tile.rtcCenter=featureTable.getGlobalProperty('RTC_CENTER',GL$1.FLOAT,3);var batchTable=new Tile3DBatchTableParser(tile.batchTableJson,tile.batchTableBinary,instancesLength);extractInstancedAttributes(tile,featureTable,batchTable,instancesLength);return byteOffset;}function extractInstancedAttributes(tile,featureTable,batchTable,instancesLength){var collectionOptions={instances:new Array(instancesLength),batchTable:tile._batchTable,cull:false,url:undefined,gltf:undefined,basePath:undefined,incrementallyLoadTextures:false,forwardAxis:[1,0,0]};var instances=collectionOptions.instances;var instancePosition=new Vector3$1();new Vector3$1();new Vector3$1();new Vector3$1();var instanceRotation=new Matrix3();var instanceQuaternion=new Quaternion();var instanceScale=new Vector3$1();var instanceTranslationRotationScale={};var instanceTransform=new Matrix4();var scratch1=[];var scratch2=[];var scratchVector1=new Vector3$1();var scratchVector2=new Vector3$1();for(var _i61=0;_i61<instancesLength;_i61++){var position=void 0;if(featureTable.hasProperty('POSITION')){position=featureTable.getProperty('POSITION',GL$1.FLOAT,3,_i61,instancePosition);}else if(featureTable.hasProperty('POSITION_QUANTIZED')){position=featureTable.getProperty('POSITION_QUANTIZED',GL$1.UNSIGNED_SHORT,3,_i61,instancePosition);var quantizedVolumeOffset=featureTable.getGlobalProperty('QUANTIZED_VOLUME_OFFSET',GL$1.FLOAT,3,scratchVector1);if(!quantizedVolumeOffset){throw new Error('i3dm parser: QUANTIZED_VOLUME_OFFSET must be defined for quantized positions.');}var quantizedVolumeScale=featureTable.getGlobalProperty('QUANTIZED_VOLUME_SCALE',GL$1.FLOAT,3,scratchVector2);if(!quantizedVolumeScale){throw new Error('i3dm parser: QUANTIZED_VOLUME_SCALE must be defined for quantized positions.');}var MAX_UNSIGNED_SHORT=65535.0;for(var j=0;j<3;j++){position[j]=position[j]/MAX_UNSIGNED_SHORT*quantizedVolumeScale[j]+quantizedVolumeOffset[j];}}if(!position){throw new Error('i3dm: POSITION or POSITION_QUANTIZED must be defined for each instance.');}instancePosition.copy(position);instanceTranslationRotationScale.translation=instancePosition;tile.normalUp=featureTable.getProperty('NORMAL_UP',GL$1.FLOAT,3,_i61,scratch1);tile.normalRight=featureTable.getProperty('NORMAL_RIGHT',GL$1.FLOAT,3,_i61,scratch2);if(tile.normalUp){if(!tile.normalRight){throw new Error('i3dm: Custom orientation requires both NORMAL_UP and NORMAL_RIGHT.');}tile.hasCustomOrientation=true;}else {tile.octNormalUp=featureTable.getProperty('NORMAL_UP_OCT32P',GL$1.UNSIGNED_SHORT,2,scratch1);tile.octNormalRight=featureTable.getProperty('NORMAL_RIGHT_OCT32P',GL$1.UNSIGNED_SHORT,2,scratch2);if(tile.octNormalUp){if(!tile.octNormalRight){throw new Error('i3dm: oct-encoded orientation requires NORMAL_UP_OCT32P and NORMAL_RIGHT_OCT32P');}throw new Error('i3dm: oct-encoded orientation not implemented');}else if(tile.eastNorthUp){Ellipsoid.WGS84.eastNorthUpToFixedFrame(instancePosition,instanceTransform);instanceTransform.getRotationMatrix3(instanceRotation);}else {instanceRotation.identity();}}instanceQuaternion.fromMatrix3(instanceRotation);instanceTranslationRotationScale.rotation=instanceQuaternion;instanceScale.set(1.0,1.0,1.0);var scale=featureTable.getProperty('SCALE',GL$1.FLOAT,1,_i61);if(Number.isFinite(scale)){instanceScale.multiplyByScalar(scale);}var nonUniformScale=featureTable.getProperty('SCALE_NON_UNIFORM',GL$1.FLOAT,3,_i61,scratch1);if(nonUniformScale){instanceScale.scale(nonUniformScale);}instanceTranslationRotationScale.scale=instanceScale;var batchId=featureTable.getProperty('BATCH_ID',GL$1.UNSIGNED_SHORT,1,_i61);if(batchId===undefined){batchId=_i61;}var rotationMatrix=new Matrix4().fromQuaternion(instanceTranslationRotationScale.rotation);instanceTransform.identity();instanceTransform.translate(instanceTranslationRotationScale.translation);instanceTransform.multiplyRight(rotationMatrix);instanceTransform.scale(instanceTranslationRotationScale.scale);var modelMatrix=instanceTransform.clone();instances[_i61]={modelMatrix,batchId};}tile.instances=instances;}function parseComposite3DTile(_x133,_x134,_x135,_x136,_x137,_x138){return _parseComposite3DTile.apply(this,arguments);}function _parseComposite3DTile(){_parseComposite3DTile=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee66(tile,arrayBuffer,byteOffset,options,context,parse3DTile){var view,subtile;return regenerator.wrap(function _callee66$(_context70){while(1){switch(_context70.prev=_context70.next){case 0:byteOffset=parse3DTileHeaderSync(tile,arrayBuffer,byteOffset);view=new DataView(arrayBuffer);tile.tilesLength=view.getUint32(byteOffset,true);byteOffset+=4;tile.tiles=[];case 5:if(!(tile.tiles.length<tile.tilesLength&&tile.byteLength-byteOffset>12)){_context70.next=13;break;}subtile={};tile.tiles.push(subtile);_context70.next=10;return parse3DTile(arrayBuffer,byteOffset,options,context,subtile);case 10:byteOffset=_context70.sent;_context70.next=5;break;case 13:return _context70.abrupt("return",byteOffset);case 14:case"end":return _context70.stop();}}},_callee66);}));return _parseComposite3DTile.apply(this,arguments);}function parseGltf3DTile(_x139,_x140,_x141,_x142){return _parseGltf3DTile.apply(this,arguments);}function _parseGltf3DTile(){_parseGltf3DTile=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee67(tile,arrayBuffer,options,context){var parse;return regenerator.wrap(function _callee67$(_context71){while(1){switch(_context71.prev=_context71.next){case 0:tile.rotateYtoZ=true;tile.gltfUpAxis=options['3d-tiles']&&options['3d-tiles'].assetGltfUpAxis?options['3d-tiles'].assetGltfUpAxis:'Y';parse=context.parse;_context71.next=5;return parse(arrayBuffer,GLTFLoader,options,context);case 5:tile.gltf=_context71.sent;case 6:case"end":return _context71.stop();}}},_callee67);}));return _parseGltf3DTile.apply(this,arguments);}function parse3DTile(_x143){return _parse3DTile.apply(this,arguments);}function _parse3DTile(){_parse3DTile=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee68(arrayBuffer){var byteOffset,options,context,tile,_args72=arguments;return regenerator.wrap(function _callee68$(_context72){while(1){switch(_context72.prev=_context72.next){case 0:byteOffset=_args72.length>1&&_args72[1]!==undefined?_args72[1]:0;options=_args72.length>2?_args72[2]:undefined;context=_args72.length>3?_args72[3]:undefined;tile=_args72.length>4&&_args72[4]!==undefined?_args72[4]:{};tile.byteOffset=byteOffset;tile.type=getMagicString$1(arrayBuffer,byteOffset);_context72.t0=tile.type;_context72.next=_context72.t0===TILE3D_TYPE.COMPOSITE?9:_context72.t0===TILE3D_TYPE.BATCHED_3D_MODEL?12:_context72.t0===TILE3D_TYPE.GLTF?15:_context72.t0===TILE3D_TYPE.INSTANCED_3D_MODEL?18:_context72.t0===TILE3D_TYPE.POINT_CLOUD?21:24;break;case 9:_context72.next=11;return parseComposite3DTile(tile,arrayBuffer,byteOffset,options,context,parse3DTile);case 11:return _context72.abrupt("return",_context72.sent);case 12:_context72.next=14;return parseBatchedModel3DTile(tile,arrayBuffer,byteOffset,options,context);case 14:return _context72.abrupt("return",_context72.sent);case 15:_context72.next=17;return parseGltf3DTile(tile,arrayBuffer,options,context);case 17:return _context72.abrupt("return",_context72.sent);case 18:_context72.next=20;return parseInstancedModel3DTile(tile,arrayBuffer,byteOffset,options,context);case 20:return _context72.abrupt("return",_context72.sent);case 21:_context72.next=23;return parsePointCloud3DTile(tile,arrayBuffer,byteOffset,options,context);case 23:return _context72.abrupt("return",_context72.sent);case 24:throw new Error('3DTileLoader: unknown type '.concat(tile.type));case 25:case"end":return _context72.stop();}}},_callee68);}));return _parse3DTile.apply(this,arguments);}var SUBTREE_FILE_MAGIC=0x74627573;var SUBTREE_FILE_VERSION=1;function parse3DTilesSubtree(_x144){return _parse3DTilesSubtree.apply(this,arguments);}function _parse3DTilesSubtree(){_parse3DTilesSubtree=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee69(data){var magic,version,jsonByteLength,stringAttribute,textDecoder,string,subtree,binaryByteLength,internalBinaryBuffer;return regenerator.wrap(function _callee69$(_context73){while(1){switch(_context73.prev=_context73.next){case 0:magic=new Uint32Array(data.slice(0,4));if(!(magic[0]!==SUBTREE_FILE_MAGIC)){_context73.next=3;break;}throw new Error('Wrong subtree file magic number');case 3:version=new Uint32Array(data.slice(4,8));if(!(version[0]!==SUBTREE_FILE_VERSION)){_context73.next=6;break;}throw new Error('Wrong subtree file verson, must be 1');case 6:jsonByteLength=parseUint64Value(data.slice(8,16));stringAttribute=new Uint8Array(data,24,jsonByteLength);textDecoder=new TextDecoder('utf8');string=textDecoder.decode(stringAttribute);subtree=JSON.parse(string);binaryByteLength=parseUint64Value(data.slice(16,24));internalBinaryBuffer=new ArrayBuffer(0);if(binaryByteLength){internalBinaryBuffer=data.slice(24+jsonByteLength);}if(!('bufferView'in subtree.tileAvailability)){_context73.next=18;break;}_context73.next=17;return getExplicitBitstream(subtree,'tileAvailability',internalBinaryBuffer);case 17:subtree.tileAvailability.explicitBitstream=_context73.sent;case 18:if(!('bufferView'in subtree.contentAvailability)){_context73.next=22;break;}_context73.next=21;return getExplicitBitstream(subtree,'contentAvailability',internalBinaryBuffer);case 21:subtree.contentAvailability.explicitBitstream=_context73.sent;case 22:if(!('bufferView'in subtree.childSubtreeAvailability)){_context73.next=26;break;}_context73.next=25;return getExplicitBitstream(subtree,'childSubtreeAvailability',internalBinaryBuffer);case 25:subtree.childSubtreeAvailability.explicitBitstream=_context73.sent;case 26:return _context73.abrupt("return",subtree);case 27:case"end":return _context73.stop();}}},_callee69);}));return _parse3DTilesSubtree.apply(this,arguments);}function getExplicitBitstream(_x145,_x146,_x147){return _getExplicitBitstream.apply(this,arguments);}function _getExplicitBitstream(){_getExplicitBitstream=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee70(subtree,name,internalBinaryBuffer){var bufferViewIndex,bufferView,buffer,response,data;return regenerator.wrap(function _callee70$(_context74){while(1){switch(_context74.prev=_context74.next){case 0:bufferViewIndex=subtree[name].bufferView;bufferView=subtree.bufferViews[bufferViewIndex];buffer=subtree.buffers[bufferView.buffer];if(!buffer.uri){_context74.next=11;break;}_context74.next=6;return fetchFile(buffer.uri);case 6:response=_context74.sent;_context74.next=9;return response.arrayBuffer();case 9:data=_context74.sent;return _context74.abrupt("return",new Uint8Array(data,bufferView.byteOffset,bufferView.byteLength));case 11:return _context74.abrupt("return",new Uint8Array(internalBinaryBuffer,bufferView.byteOffset,bufferView.byteLength));case 12:case"end":return _context74.stop();}}},_callee70);}));return _getExplicitBitstream.apply(this,arguments);}function parseUint64Value(buffer){var dataView=new DataView(buffer);var left=dataView.getUint32(0,true);var right=dataView.getUint32(4,true);return left+Math.pow(2,32)*right;}var Tile3DSubtreeLoader={id:'3d-tiles-subtree',name:'3D Tiles Subtree',module:'3d-tiles',version:VERSION$5,extensions:['subtree'],mimeTypes:['application/octet-stream'],tests:['subtree'],parse:parse3DTilesSubtree,options:{}};var QUADTREE_DEVISION_COUNT=4;var OCTREE_DEVISION_COUNT=8;var SUBDIVISION_COUNT_MAP={QUADTREE:QUADTREE_DEVISION_COUNT,OCTREE:OCTREE_DEVISION_COUNT};function parseImplicitTiles(_x148,_x149){return _parseImplicitTiles.apply(this,arguments);}function _parseImplicitTiles(){_parseImplicitTiles=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee71(subtree,options){var parentData,childIndex,level,globalData,subdivisionScheme,subtreeLevels,maximumLevel,contentUrlTemplate,subtreesUriTemplate,basePath,tile,childrenPerTile,childX,childY,childZ,levelOffset,childTileMortonIndex,tileAvailabilityIndex,childTileX,childTileY,childTileZ,isChildSubtreeAvailable,x,y,z,lev,subtreePath,childSubtreeUrl,childSubtree,isTileAvailable,isContentAvailable,childTileLevel,pData,index,currentTile,globalLevel,childCoordinates,formattedTile,_args75=arguments;return regenerator.wrap(function _callee71$(_context75){while(1){switch(_context75.prev=_context75.next){case 0:parentData=_args75.length>2&&_args75[2]!==undefined?_args75[2]:{mortonIndex:0,x:0,y:0,z:0};childIndex=_args75.length>3&&_args75[3]!==undefined?_args75[3]:0;level=_args75.length>4&&_args75[4]!==undefined?_args75[4]:0;globalData=_args75.length>5&&_args75[5]!==undefined?_args75[5]:{level:0,mortonIndex:0,x:0,y:0,z:0};subdivisionScheme=options.subdivisionScheme,subtreeLevels=options.subtreeLevels,maximumLevel=options.maximumLevel,contentUrlTemplate=options.contentUrlTemplate,subtreesUriTemplate=options.subtreesUriTemplate,basePath=options.basePath;tile={children:[],lodMetricValue:0,contentUrl:''};childrenPerTile=SUBDIVISION_COUNT_MAP[subdivisionScheme];childX=childIndex&0b01;childY=childIndex>>1&0b01;childZ=childIndex>>2&0b01;levelOffset=(Math.pow(childrenPerTile,level)-1)/(childrenPerTile-1);childTileMortonIndex=concatBits(parentData.mortonIndex,childIndex);tileAvailabilityIndex=levelOffset+childTileMortonIndex;childTileX=concatBits(parentData.x,childX);childTileY=concatBits(parentData.y,childY);childTileZ=concatBits(parentData.z,childZ);isChildSubtreeAvailable=false;if(level+1>subtreeLevels){isChildSubtreeAvailable=getAvailabilityResult(subtree.childSubtreeAvailability,childTileMortonIndex);}x=concatBits(globalData.x,childTileX);y=concatBits(globalData.y,childTileY);z=concatBits(globalData.z,childTileZ);lev=level+globalData.level;if(!isChildSubtreeAvailable){_context75.next=40;break;}subtreePath=''.concat(basePath,'/').concat(subtreesUriTemplate);childSubtreeUrl=replaceContentUrlTemplate(subtreePath,lev,x,y,z);_context75.next=27;return _load2(childSubtreeUrl,Tile3DSubtreeLoader);case 27:childSubtree=_context75.sent;subtree=childSubtree;globalData.mortonIndex=childTileMortonIndex;globalData.x=childTileX;globalData.y=childTileY;globalData.z=childTileZ;globalData.level=level;childTileMortonIndex=0;tileAvailabilityIndex=0;childTileX=0;childTileY=0;childTileZ=0;level=0;case 40:isTileAvailable=getAvailabilityResult(subtree.tileAvailability,tileAvailabilityIndex);if(!(!isTileAvailable||level>maximumLevel)){_context75.next=43;break;}return _context75.abrupt("return",tile);case 43:isContentAvailable=getAvailabilityResult(subtree.contentAvailability,tileAvailabilityIndex);if(isContentAvailable){tile.contentUrl=replaceContentUrlTemplate(contentUrlTemplate,lev,x,y,z);}childTileLevel=level+1;pData={mortonIndex:childTileMortonIndex,x:childTileX,y:childTileY,z:childTileZ};index=0;case 48:if(!(index<childrenPerTile)){_context75.next=56;break;}_context75.next=51;return parseImplicitTiles(subtree,options,pData,index,childTileLevel,globalData);case 51:currentTile=_context75.sent;if(currentTile.contentUrl||currentTile.children.length){globalLevel=lev+1;childCoordinates={childTileX,childTileY,childTileZ};formattedTile=formatTileData(currentTile,globalLevel,childCoordinates,options);tile.children.push(formattedTile);}case 53:index++;_context75.next=48;break;case 56:return _context75.abrupt("return",tile);case 57:case"end":return _context75.stop();}}},_callee71);}));return _parseImplicitTiles.apply(this,arguments);}function getAvailabilityResult(availabilityData,index){if('constant'in availabilityData){return Boolean(availabilityData.constant);}if(availabilityData.explicitBitstream){return getBooleanValueFromBitstream(index,availabilityData.explicitBitstream);}return false;}function formatTileData(tile,level,childCoordinates,options){var basePath=options.basePath,refine=options.refine,getRefine=options.getRefine,lodMetricType=options.lodMetricType,getTileType=options.getTileType,rootLodMetricValue=options.rootLodMetricValue,rootBoundingVolume=options.rootBoundingVolume;var uri=tile.contentUrl&&tile.contentUrl.replace(''.concat(basePath,'/'),'');var lodMetricValue=rootLodMetricValue/Math.pow(2,level);var boundingVolume=calculateBoundingVolumeForChildTile(level,rootBoundingVolume,childCoordinates);return {children:tile.children,contentUrl:tile.contentUrl,content:{uri},id:tile.contentUrl,refine:getRefine(refine),type:getTileType(tile),lodMetricType,lodMetricValue,boundingVolume};}function calculateBoundingVolumeForChildTile(level,rootBoundingVolume,childCoordinates){if(rootBoundingVolume.region){var childTileX=childCoordinates.childTileX,childTileY=childCoordinates.childTileY,childTileZ=childCoordinates.childTileZ;var _rootBoundingVolume$r=_slicedToArray(rootBoundingVolume.region,6),west=_rootBoundingVolume$r[0],south=_rootBoundingVolume$r[1],east=_rootBoundingVolume$r[2],north=_rootBoundingVolume$r[3],minimumHeight=_rootBoundingVolume$r[4],maximumHeight=_rootBoundingVolume$r[5];var boundingVolumesCount=Math.pow(2,level);var sizeX=(east-west)/boundingVolumesCount;var sizeY=(north-south)/boundingVolumesCount;var sizeZ=(maximumHeight-minimumHeight)/boundingVolumesCount;var childWest=west+sizeX*childTileX,childEast=west+sizeX*(childTileX+1);var childSouth=south+sizeY*childTileY,childNorth=south+sizeY*(childTileY+1);var childMinimumHeight=minimumHeight+sizeZ*childTileZ,childMaximumHeight=minimumHeight+sizeZ*(childTileZ+1);return {region:[childWest,childSouth,childEast,childNorth,childMinimumHeight,childMaximumHeight]};}console.warn('Unsupported bounding volume type: ',rootBoundingVolume);return null;}function concatBits(first,second){return parseInt(first.toString(2)+second.toString(2),2);}function replaceContentUrlTemplate(templateUrl,level,x,y,z){var mapUrl=generateMapUrl({level,x,y,z});return templateUrl.replace(/{level}|{x}|{y}|{z}/gi,function(matched){return mapUrl[matched];});}function generateMapUrl(items){var mapUrl={};for(var key in items){mapUrl['{'.concat(key,'}')]=items[key];}return mapUrl;}function getBooleanValueFromBitstream(availabilityIndex,availabilityBuffer){var byteIndex=Math.floor(availabilityIndex/8);var bitIndex=availabilityIndex%8;var bitValue=availabilityBuffer[byteIndex]>>bitIndex&1;return bitValue===1;}function getTileType(tile){if(!tile.contentUrl){return TILE_TYPE.EMPTY;}var contentUrl=tile.contentUrl;var fileExtension=contentUrl.split('.').pop();switch(fileExtension){case'pnts':return TILE_TYPE.POINTCLOUD;case'i3dm':case'b3dm':case'glb':case'gltf':return TILE_TYPE.SCENEGRAPH;default:return fileExtension;}}function getRefine(refine){switch(refine){case'REPLACE':case'replace':return TILE_REFINEMENT.REPLACE;case'ADD':case'add':return TILE_REFINEMENT.ADD;default:return refine;}}function normalizeTileData(tile,options){if(!tile){return null;}if(tile.content){var contentUri=tile.content.uri||tile.content.url;tile.contentUrl=''.concat(options.basePath,'/').concat(contentUri);}tile.id=tile.contentUrl;tile.lodMetricType=LOD_METRIC_TYPE.GEOMETRIC_ERROR;tile.lodMetricValue=tile.geometricError;tile.transformMatrix=tile.transform;tile.type=getTileType(tile);tile.refine=getRefine(tile.refine);return tile;}function normalizeTileHeaders(tileset){var basePath=tileset.basePath;var root=normalizeTileData(tileset.root,tileset);var stack=[];stack.push(root);while(stack.length>0){var tile=stack.pop()||{};var children=tile.children||[];var _iterator54=_createForOfIteratorHelper$3(children),_step54;try{for(_iterator54.s();!(_step54=_iterator54.n()).done;){var childHeader=_step54.value;normalizeTileData(childHeader,{basePath});stack.push(childHeader);}}catch(err){_iterator54.e(err);}finally{_iterator54.f();}}return root;}function normalizeImplicitTileHeaders(_x150){return _normalizeImplicitTileHeaders.apply(this,arguments);}function _normalizeImplicitTileHeaders(){_normalizeImplicitTileHeaders=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee72(tileset){var basePath,implicitTilingExtension,subdivisionScheme,maximumLevel,subtreeLevels,subtreesUriTemplate,subtreeUrl,rootSubtreeUrl,rootSubtree,contentUrlTemplate,refine,rootLodMetricValue,rootBoundingVolume,options;return regenerator.wrap(function _callee72$(_context76){while(1){switch(_context76.prev=_context76.next){case 0:if(tileset.root){_context76.next=2;break;}return _context76.abrupt("return",null);case 2:basePath=tileset.basePath;implicitTilingExtension=tileset.root.extensions['3DTILES_implicit_tiling'];subdivisionScheme=implicitTilingExtension.subdivisionScheme,maximumLevel=implicitTilingExtension.maximumLevel,subtreeLevels=implicitTilingExtension.subtreeLevels,subtreesUriTemplate=implicitTilingExtension.subtrees.uri;subtreeUrl=replaceContentUrlTemplate(subtreesUriTemplate,0,0,0,0);rootSubtreeUrl=''.concat(basePath,'/').concat(subtreeUrl);_context76.next=9;return _load2(rootSubtreeUrl,Tile3DSubtreeLoader);case 9:rootSubtree=_context76.sent;contentUrlTemplate=''.concat(basePath,'/').concat(tileset.root.content.uri);refine=tileset.root.refine;rootLodMetricValue=tileset.root.geometricError;rootBoundingVolume=tileset.root.boundingVolume;options={contentUrlTemplate,subtreesUriTemplate,subdivisionScheme,subtreeLevels,maximumLevel,refine,basePath,lodMetricType:LOD_METRIC_TYPE.GEOMETRIC_ERROR,rootLodMetricValue,rootBoundingVolume,getTileType,getRefine};_context76.next=17;return normalizeImplicitTileData(tileset.root,rootSubtree,options);case 17:return _context76.abrupt("return",_context76.sent);case 18:case"end":return _context76.stop();}}},_callee72);}));return _normalizeImplicitTileHeaders.apply(this,arguments);}function normalizeImplicitTileData(_x151,_x152,_x153){return _normalizeImplicitTileData.apply(this,arguments);}function _normalizeImplicitTileData(){_normalizeImplicitTileData=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee73(tile,rootSubtree,options){var _yield$parseImplicitT,children,contentUrl;return regenerator.wrap(function _callee73$(_context77){while(1){switch(_context77.prev=_context77.next){case 0:if(tile){_context77.next=2;break;}return _context77.abrupt("return",null);case 2:tile.lodMetricType=LOD_METRIC_TYPE.GEOMETRIC_ERROR;tile.lodMetricValue=tile.geometricError;tile.transformMatrix=tile.transform;_context77.next=7;return parseImplicitTiles(rootSubtree,options);case 7:_yield$parseImplicitT=_context77.sent;children=_yield$parseImplicitT.children;contentUrl=_yield$parseImplicitT.contentUrl;if(contentUrl){tile.contentUrl=contentUrl;tile.content={uri:contentUrl.replace(''.concat(options.basePath,'/'),'')};}tile.refine=getRefine(tile.refine);tile.type=getTileType(tile);tile.children=children;tile.id=tile.contentUrl;return _context77.abrupt("return",tile);case 16:case"end":return _context77.stop();}}},_callee73);}));return _normalizeImplicitTileData.apply(this,arguments);}var IMPLICIT_TILING_EXTENSION_NAME='3DTILES_implicit_tiling';var Tiles3DLoader={id:'3d-tiles',name:'3D Tiles',module:'3d-tiles',version:VERSION$5,extensions:['cmpt','pnts','b3dm','i3dm'],mimeTypes:['application/octet-stream'],tests:['cmpt','pnts','b3dm','i3dm'],parse,options:{'3d-tiles':{loadGLTF:true,decodeQuantizedPositions:false,isTileset:'auto',assetGltfUpAxis:null}}};function getBaseUri(tileset){return dirname(tileset.url);}function parseTile(_x154,_x155,_x156){return _parseTile.apply(this,arguments);}function _parseTile(){_parseTile=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee74(arrayBuffer,options,context){var tile,byteOffset;return regenerator.wrap(function _callee74$(_context78){while(1){switch(_context78.prev=_context78.next){case 0:tile={content:{featureIds:null}};byteOffset=0;_context78.next=4;return parse3DTile(arrayBuffer,byteOffset,options,context,tile.content);case 4:return _context78.abrupt("return",tile.content);case 5:case"end":return _context78.stop();}}},_callee74);}));return _parseTile.apply(this,arguments);}function parseTileset(_x157,_x158,_x159){return _parseTileset.apply(this,arguments);}function _parseTileset(){_parseTileset=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee75(data,options,context){var _tilesetJson$root,tilesetJson;return regenerator.wrap(function _callee75$(_context79){while(1){switch(_context79.prev=_context79.next){case 0:tilesetJson=JSON.parse(new TextDecoder().decode(data));tilesetJson.loader=options.loader||Tiles3DLoader;tilesetJson.url=context.url;tilesetJson.basePath=getBaseUri(tilesetJson);if(!hasImplicitTilingExtension(tilesetJson)){_context79.next=10;break;}_context79.next=7;return normalizeImplicitTileHeaders(tilesetJson);case 7:_context79.t0=_context79.sent;_context79.next=11;break;case 10:_context79.t0=normalizeTileHeaders(tilesetJson);case 11:tilesetJson.root=_context79.t0;tilesetJson.type=TILESET_TYPE.TILES3D;tilesetJson.lodMetricType=LOD_METRIC_TYPE.GEOMETRIC_ERROR;tilesetJson.lodMetricValue=((_tilesetJson$root=tilesetJson.root)===null||_tilesetJson$root===void 0?void 0:_tilesetJson$root.lodMetricValue)||0;return _context79.abrupt("return",tilesetJson);case 16:case"end":return _context79.stop();}}},_callee75);}));return _parseTileset.apply(this,arguments);}function parse(_x160,_x161,_x162){return _parse.apply(this,arguments);}function _parse(){_parse=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee76(data,options,context){var loaderOptions,isTileset;return regenerator.wrap(function _callee76$(_context80){while(1){switch(_context80.prev=_context80.next){case 0:loaderOptions=options['3d-tiles']||{};if(loaderOptions.isTileset==='auto'){isTileset=context.url&&context.url.indexOf('.json')!==-1;}else {isTileset=loaderOptions.isTileset;}if(!isTileset){_context80.next=8;break;}_context80.next=5;return parseTileset(data,options,context);case 5:data=_context80.sent;_context80.next=11;break;case 8:_context80.next=10;return parseTile(data,options,context);case 10:data=_context80.sent;case 11:return _context80.abrupt("return",data);case 12:case"end":return _context80.stop();}}},_callee76);}));return _parse.apply(this,arguments);}function hasImplicitTilingExtension(tilesetJson){var _tilesetJson$extensio,_tilesetJson$extensio2;return (tilesetJson===null||tilesetJson===void 0?void 0:(_tilesetJson$extensio=tilesetJson.extensionsRequired)===null||_tilesetJson$extensio===void 0?void 0:_tilesetJson$extensio.includes(IMPLICIT_TILING_EXTENSION_NAME))&&(tilesetJson===null||tilesetJson===void 0?void 0:(_tilesetJson$extensio2=tilesetJson.extensionsUsed)===null||_tilesetJson$extensio2===void 0?void 0:_tilesetJson$extensio2.includes(IMPLICIT_TILING_EXTENSION_NAME));}var CESIUM_ION_URL='https://api.cesium.com/v1/assets';function getIonTilesetMetadata(_x163,_x164){return _getIonTilesetMetadata.apply(this,arguments);}function _getIonTilesetMetadata(){_getIonTilesetMetadata=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee77(accessToken,assetId){var assets,_iterator66,_step66,item,ionAssetMetadata,type,url;return regenerator.wrap(function _callee77$(_context81){while(1){switch(_context81.prev=_context81.next){case 0:if(assetId){_context81.next=6;break;}_context81.next=3;return getIonAssets(accessToken);case 3:assets=_context81.sent;_iterator66=_createForOfIteratorHelper$3(assets.items);try{for(_iterator66.s();!(_step66=_iterator66.n()).done;){item=_step66.value;if(item.type==='3DTILES'){assetId=item.id;}}}catch(err){_iterator66.e(err);}finally{_iterator66.f();}case 6:_context81.next=8;return getIonAssetMetadata(accessToken,assetId);case 8:ionAssetMetadata=_context81.sent;type=ionAssetMetadata.type,url=ionAssetMetadata.url;assert$7(type==='3DTILES'&&url);ionAssetMetadata.headers={Authorization:'Bearer '.concat(ionAssetMetadata.accessToken)};return _context81.abrupt("return",ionAssetMetadata);case 13:case"end":return _context81.stop();}}},_callee77);}));return _getIonTilesetMetadata.apply(this,arguments);}function getIonAssets(_x165){return _getIonAssets.apply(this,arguments);}function _getIonAssets(){_getIonAssets=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee78(accessToken){var url,headers,response;return regenerator.wrap(function _callee78$(_context82){while(1){switch(_context82.prev=_context82.next){case 0:assert$7(accessToken);url=CESIUM_ION_URL;headers={Authorization:'Bearer '.concat(accessToken)};_context82.next=5;return fetchFile(url,{fetch:{headers}});case 5:response=_context82.sent;if(response.ok){_context82.next=8;break;}throw new Error(response.statusText);case 8:_context82.next=10;return response.json();case 10:return _context82.abrupt("return",_context82.sent);case 11:case"end":return _context82.stop();}}},_callee78);}));return _getIonAssets.apply(this,arguments);}function getIonAssetMetadata(_x166,_x167){return _getIonAssetMetadata.apply(this,arguments);}function _getIonAssetMetadata(){_getIonAssetMetadata=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee79(accessToken,assetId){var headers,url,response,metadata,tilesetInfo;return regenerator.wrap(function _callee79$(_context83){while(1){switch(_context83.prev=_context83.next){case 0:assert$7(accessToken,assetId);headers={Authorization:'Bearer '.concat(accessToken)};url=''.concat(CESIUM_ION_URL,'/').concat(assetId);_context83.next=5;return fetchFile(''.concat(url),{fetch:{headers}});case 5:response=_context83.sent;if(response.ok){_context83.next=8;break;}throw new Error(response.statusText);case 8:_context83.next=10;return response.json();case 10:metadata=_context83.sent;_context83.next=13;return fetchFile(''.concat(url,'/endpoint'),{fetch:{headers}});case 13:response=_context83.sent;if(response.ok){_context83.next=16;break;}throw new Error(response.statusText);case 16:_context83.next=18;return response.json();case 18:tilesetInfo=_context83.sent;metadata=_objectSpread$3(_objectSpread$3({},metadata),tilesetInfo);return _context83.abrupt("return",metadata);case 21:case"end":return _context83.stop();}}},_callee79);}));return _getIonAssetMetadata.apply(this,arguments);}function preload(_x168){return _preload.apply(this,arguments);}function _preload(){_preload=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee80(url){var options,_options3,accessToken,assetId,matched,_args84=arguments;return regenerator.wrap(function _callee80$(_context84){while(1){switch(_context84.prev=_context84.next){case 0:options=_args84.length>1&&_args84[1]!==undefined?_args84[1]:{};options=options['cesium-ion']||{};_options3=options,accessToken=_options3.accessToken;assetId=options.assetId;if(!Number.isFinite(assetId)){matched=url.match(/\/([0-9]+)\/tileset.json/);assetId=matched&&matched[1];}return _context84.abrupt("return",getIonTilesetMetadata(accessToken,assetId));case 6:case"end":return _context84.stop();}}},_callee80);}));return _preload.apply(this,arguments);}var CesiumIonLoader=_objectSpread$3(_objectSpread$3({},Tiles3DLoader),{},{id:'cesium-ion',name:'Cesium Ion',preload,parse:function(){var _parse2=_asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee9(data,options,context){return regenerator.wrap(function _callee9$(_context13){while(1){switch(_context13.prev=_context13.next){case 0:options=_objectSpread$3({},options);options['3d-tiles']=options['cesium-ion'];options.loader=CesiumIonLoader;return _context13.abrupt("return",Tiles3DLoader.parse(data,options,context));case 4:case"end":return _context13.stop();}}},_callee9);}));function parse(_x169,_x170,_x171){return _parse2.apply(this,arguments);}return parse;}(),options:{'cesium-ion':_objectSpread$3(_objectSpread$3({},Tiles3DLoader.options['3d-tiles']),{},{accessToken:null})}});// From https://github.com/potree/potree/blob/master/src/materials/PointCloudMaterial.js
  42819. function generateGradientTexture(gradient){var size=64;// create canvas
  42820. var canvas=document.createElement('canvas');canvas.width=size;canvas.height=size;// get context
  42821. var context=canvas.getContext('2d');// draw gradient
  42822. context.rect(0,0,size,size);var ctxGradient=context.createLinearGradient(0,0,size,size);for(var _i62=0;_i62<gradient.length;_i62++){var step=gradient[_i62];ctxGradient.addColorStop(step[0],'#'+step[1].getHexString());}context.fillStyle=ctxGradient;context.fill();//let texture = new THREE.Texture(canvas);
  42823. var texture=new THREE$1.CanvasTexture(canvas);texture.needsUpdate=true;texture.minFilter=THREE$1.LinearFilter;texture.wrapS=THREE$1.RepeatWrapping;texture.wrapT=THREE$1.RepeatWrapping;texture.repeat.set(2,2);// textureImage = texture.image;
  42824. return texture;}function _getCameraFrustum(camera){camera.updateMatrix();// make sure camera's local matrix is updated
  42825. camera.updateMatrixWorld();// make sure camera's world matrix is updated
  42826. camera.matrixWorldInverse.copy(camera.matrixWorld).invert();var frustum=new THREE$1.Frustum();frustum.setFromProjectionMatrix(new THREE$1.Matrix4().multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse));return frustum;}function loadersPlaneToMesh(plane){var group=new THREE$1.Group();// Create a basic rectangle geometry from math.gl plane
  42827. var planeGeometry=new THREE$1.PlaneGeometry(10,5);// Align the geometry to the plane
  42828. var coplanarPoint=_construct(THREE$1.Vector3,_toConsumableArray(plane.projectPointOntoPlane([0,0,0])));var normal=new THREE$1.Vector3(plane.normal.x,plane.normal.y,plane.normal.z);var focalPoint=new THREE$1.Vector3().copy(coplanarPoint).add(normal);planeGeometry.lookAt(focalPoint);planeGeometry.translate(coplanarPoint.x,coplanarPoint.y,coplanarPoint.z);// Edges
  42829. /*
  42830. const edges = new EdgesGeometry(planeGeometry)
  42831. var dispPlane = new LineSegments(edges, new LineBasicMaterial({ color: 0x00ffff }))*/ //plane
  42832. var material=new THREE$1.MeshBasicMaterial({color:0x00ffff,side:THREE$1.DoubleSide});var mesh=new THREE$1.Mesh(planeGeometry,material);var arrowHelper=new THREE$1.ArrowHelper(normal,coplanarPoint,5,0xffff00);group.add(arrowHelper);group.add(mesh);return group;}function loadersBoundingBoxToMesh(tile){// Create a basic rectangle geometry from math.gl half-axes
  42833. var boundingVolume=tile.boundingVolume;var redColor=0;if(tile.content){redColor=Math.min(tile.content.byteLength/500000,1.0);}var boxColor=new THREE$1.Color(redColor,1.0,0.0);var boxGeometry=new THREE$1.BoxGeometry(1,1,1);var boxTransform=new THREE$1.Matrix4();if(boundingVolume.halfAxes){boxTransform.copy(getMatrix4FromHalfAxes(boundingVolume.halfAxes));}else if(boundingVolume.radius){boxGeometry.scale(boundingVolume.radius*2,boundingVolume.radius*2,boundingVolume.radius*2);}boxGeometry.applyMatrix4(boxTransform);var edges=new THREE$1.EdgesGeometry(boxGeometry);var dispPlane=new THREE$1.LineSegments(edges,new THREE$1.LineBasicMaterial({color:boxColor}));dispPlane.position.copy(_construct(THREE$1.Vector3,_toConsumableArray(boundingVolume.center)));return dispPlane;}function getMatrix4FromHalfAxes(halfAxes){var m=halfAxes;var rotateMatrix=new THREE$1.Matrix4().fromArray([m[0]*2,m[1]*2,m[2]*2,0,m[3]*2,m[4]*2,m[5]*2,0,m[6]*2,m[7]*2,m[8]*2,0,0,0,0,1]);return rotateMatrix;}/*
  42834. * from https://github.com/tentone/geo-three
  42835. * Tree-shaking did not work, probably due to static class methods
  42836. */function datumsToSpherical(latitude,longitude){var EARTH_RADIUS=6378137;var EARTH_PERIMETER=2*Math.PI*EARTH_RADIUS;var EARTH_ORIGIN=EARTH_PERIMETER/2.0;var x=longitude*EARTH_ORIGIN/180.0;var y=Math.log(Math.tan((90+latitude)*Math.PI/360.0))/(Math.PI/180.0);y=y*EARTH_ORIGIN/180.0;return new THREE$1.Vector2(x,y);}var Gradients={// From chroma spectral http://gka.github.io/chroma.js/
  42837. SPECTRAL:[[0,new THREE$1.Color(0.3686,0.3098,0.6353)],[0.1,new THREE$1.Color(0.1961,0.5333,0.7412)],[0.2,new THREE$1.Color(0.4,0.7608,0.6471)],[0.3,new THREE$1.Color(0.6706,0.8667,0.6431)],[0.4,new THREE$1.Color(0.902,0.9608,0.5961)],[0.5,new THREE$1.Color(1.0,1.0,0.749)],[0.6,new THREE$1.Color(0.9961,0.8784,0.5451)],[0.7,new THREE$1.Color(0.9922,0.6824,0.3804)],[0.8,new THREE$1.Color(0.9569,0.4275,0.2627)],[0.9,new THREE$1.Color(0.8353,0.2431,0.3098)],[1,new THREE$1.Color(0.6196,0.0039,0.2588)]],PLASMA:[[0.0,new THREE$1.Color(0.241,0.015,0.61)],[0.1,new THREE$1.Color(0.387,0.001,0.654)],[0.2,new THREE$1.Color(0.524,0.025,0.653)],[0.3,new THREE$1.Color(0.651,0.125,0.596)],[0.4,new THREE$1.Color(0.752,0.227,0.513)],[0.5,new THREE$1.Color(0.837,0.329,0.431)],[0.6,new THREE$1.Color(0.907,0.435,0.353)],[0.7,new THREE$1.Color(0.963,0.554,0.272)],[0.8,new THREE$1.Color(0.992,0.681,0.195)],[0.9,new THREE$1.Color(0.987,0.822,0.144)],[1.0,new THREE$1.Color(0.94,0.975,0.131)]],YELLOW_GREEN:[[0,new THREE$1.Color(0.1647,0.2824,0.3451)],[0.1,new THREE$1.Color(0.1338,0.3555,0.4227)],[0.2,new THREE$1.Color(0.061,0.4319,0.4864)],[0.3,new THREE$1.Color(0.0,0.5099,0.5319)],[0.4,new THREE$1.Color(0.0,0.5881,0.5569)],[0.5,new THREE$1.Color(0.137,0.665,0.5614)],[0.6,new THREE$1.Color(0.2906,0.7395,0.5477)],[0.7,new THREE$1.Color(0.4453,0.8099,0.5201)],[0.8,new THREE$1.Color(0.6102,0.8748,0.485)],[0.9,new THREE$1.Color(0.7883,0.9323,0.4514)],[1,new THREE$1.Color(0.9804,0.9804,0.4314)]],VIRIDIS:[[0.0,new THREE$1.Color(0.267,0.005,0.329)],[0.1,new THREE$1.Color(0.283,0.141,0.458)],[0.2,new THREE$1.Color(0.254,0.265,0.53)],[0.3,new THREE$1.Color(0.207,0.372,0.553)],[0.4,new THREE$1.Color(0.164,0.471,0.558)],[0.5,new THREE$1.Color(0.128,0.567,0.551)],[0.6,new THREE$1.Color(0.135,0.659,0.518)],[0.7,new THREE$1.Color(0.267,0.749,0.441)],[0.8,new THREE$1.Color(0.478,0.821,0.318)],[0.9,new THREE$1.Color(0.741,0.873,0.15)],[1.0,new THREE$1.Color(0.993,0.906,0.144)]],INFERNO:[[0.0,new THREE$1.Color(0.077,0.042,0.206)],[0.1,new THREE$1.Color(0.225,0.036,0.388)],[0.2,new THREE$1.Color(0.373,0.074,0.432)],[0.3,new THREE$1.Color(0.522,0.128,0.42)],[0.4,new THREE$1.Color(0.665,0.182,0.37)],[0.5,new THREE$1.Color(0.797,0.255,0.287)],[0.6,new THREE$1.Color(0.902,0.364,0.184)],[0.7,new THREE$1.Color(0.969,0.516,0.063)],[0.8,new THREE$1.Color(0.988,0.683,0.072)],[0.9,new THREE$1.Color(0.961,0.859,0.298)],[1.0,new THREE$1.Color(0.988,0.998,0.645)]],GRAYSCALE:[[0,new THREE$1.Color(0,0,0)],[1,new THREE$1.Color(1,1,1)]],// 16 samples of the TURBU color scheme
  42838. // values taken from: https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f
  42839. // original file licensed under Apache-2.0
  42840. TURBO:[[0.0,new THREE$1.Color(0.18995,0.07176,0.23217)],[0.07,new THREE$1.Color(0.25107,0.25237,0.63374)],[0.13,new THREE$1.Color(0.27628,0.42118,0.89123)],[0.2,new THREE$1.Color(0.25862,0.57958,0.99876)],[0.27,new THREE$1.Color(0.15844,0.73551,0.92305)],[0.33,new THREE$1.Color(0.09267,0.86554,0.7623)],[0.4,new THREE$1.Color(0.19659,0.94901,0.59466)],[0.47,new THREE$1.Color(0.42778,0.99419,0.38575)],[0.53,new THREE$1.Color(0.64362,0.98999,0.23356)],[0.6,new THREE$1.Color(0.80473,0.92452,0.20459)],[0.67,new THREE$1.Color(0.93301,0.81236,0.22667)],[0.73,new THREE$1.Color(0.99314,0.67408,0.20348)],[0.8,new THREE$1.Color(0.9836,0.49291,0.12849)],[0.87,new THREE$1.Color(0.92105,0.31489,0.05475)],[0.93,new THREE$1.Color(0.81608,0.18462,0.01809)],[1.0,new THREE$1.Color(0.66449,0.08436,0.00424)]],RAINBOW:[[0,new THREE$1.Color(0.278,0,0.714)],[1/6,new THREE$1.Color(0,0,1)],[2/6,new THREE$1.Color(0,1,1)],[3/6,new THREE$1.Color(0,1,0)],[4/6,new THREE$1.Color(1,1,0)],[5/6,new THREE$1.Color(1,0.64,0)],[1,new THREE$1.Color(1,0,0)]],CONTOUR:[[0.0,new THREE$1.Color(0,0,0)],[0.03,new THREE$1.Color(0,0,0)],[0.04,new THREE$1.Color(1,1,1)],[1.0,new THREE$1.Color(1,1,1)]]};var PointCloudFS="\n varying vec3 vColor;\n uniform float alpha;\n\n void main() {\n if (vColor == vec3(0.0, 0.0, 0.0)) {\n discard;\n } else {\n gl_FragColor = vec4( vColor, alpha);\n }\n }\n";var PointCloudVS="\n varying vec3 vColor;\n uniform sampler2D gradient;\n uniform sampler2D grayscale;\n attribute float intensity;\n attribute float classification;\n uniform vec3 rootCenter;\n uniform vec3 rootNormal;\n uniform vec2 elevationRange;\n uniform int coloring;\n uniform bool hideGround;\n uniform float maxIntensity;\n uniform float intensityContrast;\n uniform float pointSize;\n\n #ifdef USE_COLOR\n vec3 getRGB() {\n vec3 rgb = color;\n return rgb;\n }\n #endif\n\n vec3 getElevation(){\n vec4 world = modelMatrix * vec4( position, 1.0 );\n float diff = abs(dot(rootNormal, (vec3(world) - rootCenter)));\n float w = max(diff - elevationRange.x,0.0) / max(elevationRange.y - elevationRange.x,1.0);\n vec3 cElevation = texture2D(gradient, vec2(w,1.0-w)).rgb;\n\n return cElevation;\n }\n\n vec3 getIntensity(){\n // TODO: real contrast enhancement. Check https://github.com/yuki-koyama/enhancer/blob/master/shaders/enhancer.fs\n float intmod = pow(intensity, intensityContrast);\n vec3 cIntensity = texture2D(grayscale, vec2(intmod / maxIntensity ,1.0-(intmod / maxIntensity))).rgb;\n return cIntensity;\n }\n\n vec3 getClassification(){\n float classNormalized = classification / 255.0;\n vec3 cClassification = texture2D(gradient, vec2(classNormalized * 5.0,1.0-classNormalized * 5.0)).rgb;\n return cClassification;\n }\n\n vec3 getColor(){\n vec3 color;\n if (hideGround && classification == 2.0) {\n return vec3(0.0, 0.0, 0.0); \n }\n\n if (coloring == 1) {\n color = getIntensity();\n }\n else if (coloring == 2) {\n color = getClassification();\n } else if (coloring == 3) {\n color = getElevation();\n } \n #ifdef USE_COLOR\n else if (coloring == 4) {\n color = getRGB();\n }\n #endif\n else {\n color = vec3(1.0, 1.0, 1.0);\n }\n return color;\n }\n\n void main() {\n vColor = getColor();\n\n gl_PointSize = pointSize;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }\n";/** Types of coloring used when viewing point cloud tiles */var PointCloudColoring;(function(PointCloudColoring){PointCloudColoring[PointCloudColoring['Intensity']=1]='Intensity';PointCloudColoring[PointCloudColoring['Classification']=2]='Classification';PointCloudColoring[PointCloudColoring['Elevation']=3]='Elevation';PointCloudColoring[PointCloudColoring['RGB']=4]='RGB';PointCloudColoring[PointCloudColoring['White']=5]='White';})(PointCloudColoring||(PointCloudColoring={}));/** Types of shading used when viewing b3dm (mesh) tiles */var Shading;(function(Shading){Shading[Shading['FlatTexture']=1]='FlatTexture';Shading[Shading['ShadedTexture']=2]='ShadedTexture';Shading[Shading['ShadedNoTexture']=3]='ShadedNoTexture';})(Shading||(Shading={}));var GeoTransform;(function(GeoTransform){GeoTransform[GeoTransform['Reset']=1]='Reset';GeoTransform[GeoTransform['Mercator']=2]='Mercator';GeoTransform[GeoTransform['WGS84Cartesian']=3]='WGS84Cartesian';})(GeoTransform||(GeoTransform={}));var gradient=Gradients.RAINBOW;var gradientTexture=typeof document!='undefined'?generateGradientTexture(gradient):null;var grayscale=Gradients.GRAYSCALE;var grayscaleTexture=typeof document!='undefined'?generateGradientTexture(grayscale):null;var defaultOptions={throttleRequests:true,maxRequests:64,updateInterval:0.1,maxConcurrency:1,maximumScreenSpaceError:16,maximumMemoryUsage:32,viewDistanceScale:1.0,skipLevelOfDetail:false,updateTransforms:true,shading:Shading.FlatTexture,transparent:false,pointCloudColoring:PointCloudColoring.White,pointSize:1.0,worker:true,wireframe:false,debug:false,basisTranscoderPath:null,dracoDecoderPath:null,material:null,computeNormals:false,shaderCallback:null,geoTransform:GeoTransform.Reset,preloadTilesCount:null,isLowestDepth:false};/** 3D Tiles Loader */var Loader3DTiles=/*#__PURE__*/function(){function Loader3DTiles(){_classCallCheck(this,Loader3DTiles);}_createClass(Loader3DTiles,null,[{key:"load",value:/**
  42841. * Loads a tileset of 3D Tiles according to the given {@link LoaderProps}
  42842. * @public
  42843. *
  42844. * @param props - Properties for this load call {@link LoaderProps}.
  42845. * @returns An object containing the 3D Model to be added to the scene
  42846. * and a runtime engine to be updated every frame.
  42847. */function load(props){return __awaiter(this,void 0,void 0,/*#__PURE__*/regenerator.mark(function _callee12(){var _this30=this;var options,url,UPDATE_INTERVAL,MAX_DEPTH_FOR_ORIENTATION,loadersGLOptions,metadata,tilesetJson,_i63,_arr,_i64,renderMap,boxMap,unloadQueue,root,tileBoxes,pointcloudUniforms,pointcloudMaterial,cameraReference,rendererReference,gltfLoader,ktx2Loader,dracoLoader,unlitMaterial,tileOptions,tileset,threeMat,tileTrasnform,rootCenter,orientationDetected,box,disposeFlag,loadingEnded,timer,lastCameraAspect,lastCameraTop,lastCameraLeft,lastCameraPosition,sseDenominator,lastRootTransform,rootTransformInverse,coords,detectOrientation,updateResetTransform,tilesetUpdate;return regenerator.wrap(function _callee12$(_context16){while(1){switch(_context16.prev=_context16.next){case 0:tilesetUpdate=function _tilesetUpdate(tileset,renderMap,renderer,camera){// !zeg改 pauseTilesetUpdate
  42848. if(disposeFlag||options.pauseTilesetUpdate){return;}// Assumes camera fov, near and far are not changing
  42849. if(!sseDenominator||camera.aspect!=lastCameraAspect||camera.left!=lastCameraLeft||camera.top!=lastCameraTop){var loadersFrustum=new PerspectiveFrustum({fov:camera.fov/180*Math.PI,aspectRatio:camera.aspect,near:camera.near,far:camera.far});sseDenominator=loadersFrustum.sseDenominator;if(camera.type=='OrthographicCamera'){//xzw add
  42850. sseDenominator=0.34*(camera.top-camera.bottom);//等同于相机距离,因为越远看的越广//camera.aspect > 1 ? (camera.right - camera.left) : (camera.top - camera.bottom)
  42851. //越大越粗糙
  42852. }lastCameraAspect=camera.aspect;lastCameraTop=camera.top;//add
  42853. lastCameraLeft=camera.left;//add
  42854. if(options.debug){console.log('Updated sse denonimator:',sseDenominator);}}var frustum=_getCameraFrustum(camera);var planes=frustum.planes.map(function(plane){return new Plane(plane.normal.toArray(),plane.constant);});var cullingVolume=new CullingVolume(planes);var rendererSize=new THREE$1.Vector2();renderer.getSize(rendererSize);var frameState={camera:{position:options.isLowestDepth?[0,100,0]:lastCameraPosition.toArray(),// !zeg改 将相机坐标改成一个很远的位置,来加载lowestDepth
  42855. type:camera.type,//xzw add
  42856. left:camera.left,right:camera.right,top:camera.top,bottom:camera.bottom//xzw add
  42857. },height:rendererSize.y,frameNumber:tileset._frameNumber,sseDenominator:sseDenominator,cullingVolume:cullingVolume,viewport:{id:0}};tileset.options.currentFloorId=root.currentFloorId===void 0?'all':root.currentFloorId;// !zeg改 用于停止隐藏楼层的tile更新
  42858. tileset._cache.reset();tileset._traverser.traverse(tileset.root,frameState,tileset.options);// 遍历更新
  42859. var _iterator55=_createForOfIteratorHelper$3(tileset.tiles),_step55;try{for(_iterator55.s();!(_step55=_iterator55.n()).done;){var _tile=_step55.value;if(_tile.selected){if(!renderMap[_tile.id]){console.error('TILE SELECTED BUT NOT LOADED!!',_tile.id);}else {// Make sure it's visible
  42860. renderMap[_tile.id].visible=true;}}else {if(renderMap[_tile.id]){renderMap[_tile.id].visible=false;}}}}catch(err){_iterator55.e(err);}finally{_iterator55.f();}while(unloadQueue.length>0){var tile=unloadQueue.pop();if(renderMap[tile.id]&&tile.contentState==TILE_CONTENT_STATE.UNLOADED){if(options.type=='4dkk'){root.removeTile(renderMap[tile.id]);// !zeg改 removeTile
  42861. }else {root.remove(renderMap[tile.id]);}disposeNode(renderMap[tile.id]);delete renderMap[tile.id];}if(boxMap[tile.id]){disposeNode(boxMap[tile.id]);tileBoxes.remove(boxMap[tile.id]);delete boxMap[tile.id];}}var tilesLoaded=tileset.stats.get('Tiles Loaded').count;var tilesLoading=tileset.stats.get('Tiles Loading').count;if(props.onProgress){props.onProgress(tilesLoaded,tilesLoaded+tilesLoading);}if(props.loadingManager&&!loadingEnded){if(tilesLoading==0&&(options.preloadTilesCount==null||tilesLoaded>=options.preloadTilesCount)){loadingEnded=true;props.loadingManager.itemEnd(props.url);}}return frameState;};updateResetTransform=function _updateResetTransform(){if(options.geoTransform!=GeoTransform.WGS84Cartesian){// Reset the current model matrix and apply our own transformation
  42862. threeMat.copy(tileTrasnform).invert();threeMat.premultiply(lastRootTransform);threeMat.copy(lastRootTransform).multiply(new THREE$1.Matrix4().copy(tileTrasnform).invert());tileset.modelMatrix=new Matrix4(threeMat.toArray());}};detectOrientation=function _detectOrientation(tile){if(!tile.boundingVolume.halfAxes){return;}var halfAxes=tile.boundingVolume.halfAxes;var orientationMatrix=new THREE$1.Matrix4().extractRotation(getMatrix4FromHalfAxes(halfAxes)).premultiply(new THREE$1.Matrix4().extractRotation(rootTransformInverse));var rotation=new THREE$1.Euler().setFromRotationMatrix(orientationMatrix);if(!rotation.equals(new THREE$1.Euler())){orientationDetected=true;var pos=new THREE$1.Vector3(tileTrasnform.elements[12],tileTrasnform.elements[13],tileTrasnform.elements[14]);tileTrasnform.extractRotation(orientationMatrix);tileTrasnform.setPosition(pos);updateResetTransform();}};options=Object.assign(Object.assign({},defaultOptions),props.options);url=props.url;UPDATE_INTERVAL=options.updateInterval;MAX_DEPTH_FOR_ORIENTATION=2;loadersGLOptions={};if(!options.cesiumIONToken){_context16.next=14;break;}loadersGLOptions['cesium-ion']={accessToken:options.cesiumIONToken};_context16.next=12;return CesiumIonLoader.preload(url,loadersGLOptions);case 12:metadata=_context16.sent;loadersGLOptions['fetch']={headers:metadata.headers};case 14:if(props.loadingManager){props.loadingManager.itemStart(url);}_context16.next=17;return _load2(url,Tiles3DLoader,Object.assign({},loadersGLOptions));case 17:tilesetJson=_context16.sent;for(_i63=0,_arr=[0,1,2];_i63<_arr.length;_i63++){_i64=_arr[_i63];tilesetJson.root.boundingVolume.box[_i64]=0;}// !zeg改 root的坐标必须归0,否则会与原数据坐标以及collider对不上
  42863. renderMap={};boxMap={};unloadQueue=[];// !zeg改 使用4dkankan里传入的model
  42864. root=props.model||new THREE$1.Group();tileBoxes=new THREE$1.Group();if(options.debug){root.add(tileBoxes);// 只在debug的时候才把tileBoxes添加进root
  42865. }else {tileBoxes.visible=false;}pointcloudUniforms={pointSize:{type:'f',value:options.pointSize},gradient:{type:'t',value:gradientTexture},grayscale:{type:'t',value:grayscaleTexture},rootCenter:{type:'vec3',value:new THREE$1.Vector3()},rootNormal:{type:'vec3',value:new THREE$1.Vector3()},coloring:{type:'i',value:options.pointCloudColoring},hideGround:{type:'b',value:true},elevationRange:{type:'vec2',value:new THREE$1.Vector2(0,400)},maxIntensity:{type:'f',value:1.0},intensityContrast:{type:'f',value:1.0},alpha:{type:'f',value:1.0}};pointcloudMaterial=new THREE$1.ShaderMaterial({uniforms:pointcloudUniforms,vertexShader:PointCloudVS,fragmentShader:PointCloudFS,transparent:options.transparent,vertexColors:true});cameraReference=null;rendererReference=null;gltfLoader=new GLTFLoader$1();ktx2Loader=undefined;dracoLoader=undefined;if(options.basisTranscoderPath){ktx2Loader=new KTX2Loader();ktx2Loader.detectSupport(props.renderer);ktx2Loader.setTranscoderPath(options.basisTranscoderPath+'/');ktx2Loader.setWorkerLimit(2);gltfLoader.setKTX2Loader(ktx2Loader);}if(options.dracoDecoderPath){dracoLoader=new DRACOLoader();dracoLoader.setDecoderPath(options.dracoDecoderPath+'/');dracoLoader.setWorkerLimit(options.maxConcurrency);gltfLoader.setDRACOLoader(dracoLoader);}unlitMaterial=new THREE$1.MeshBasicMaterial({transparent:options.transparent});tileOptions={maximumMemoryUsage:options.maximumMemoryUsage,maximumScreenSpaceError:options.maximumScreenSpaceError,viewDistanceScale:options.viewDistanceScale,skipLevelOfDetail:options.skipLevelOfDetail,updateTransforms:options.updateTransforms,throttleRequests:options.throttleRequests,maxRequests:options.maxRequests,type:options.type,// !zeg改 用于兼容专属逻辑
  42866. imageVersion:options.imageVersion,// !zeg改 用于更新瓦片模型的version
  42867. ingoreVisibleCompute:!!options.ingoreVisibleCompute,// !zeg改 禁用屏幕外瓦片计算
  42868. contentLoader:function contentLoader(tile){return __awaiter(_this30,void 0,void 0,/*#__PURE__*/regenerator.mark(function _callee10(){var tileContent,floorMatch,box;return regenerator.wrap(function _callee10$(_context14){while(1){switch(_context14.prev=_context14.next){case 0:tileContent=null;_context14.t0=tile.type;_context14.next=_context14.t0===TILE_TYPE.POINTCLOUD?4:_context14.t0===TILE_TYPE.SCENEGRAPH?6:_context14.t0===TILE_TYPE.MESH?6:10;break;case 4:tileContent=createPointNodes(tile,pointcloudMaterial,options,rootTransformInverse);return _context14.abrupt("break",10);case 6:_context14.next=8;return createGLTFNodes(gltfLoader,tile,unlitMaterial,options,rootTransformInverse);case 8:tileContent=_context14.sent;return _context14.abrupt("break",10);case 10:if(tileContent){tileContent.visible=false;tileContent.name='tileContent';renderMap[tile.id]=tileContent;if(options.type=='4dkk'){// !zeg改 addTile
  42869. floorMatch=tile.contentUrl.match(/floor_([0-9]+)./);tile.floorIndex=floorMatch?parseInt(floorMatch[1]):0;root.addTile(tile.floorIndex,tileContent);}else {root.add(tileContent);}if(options.debug){box=loadersBoundingBoxToMesh(tile);tileBoxes.add(box);boxMap[tile.id]=box;}}case 11:case"end":return _context14.stop();}}},_callee10);}));},onTileLoad:function onTileLoad(tile){return __awaiter(_this30,void 0,void 0,/*#__PURE__*/regenerator.mark(function _callee11(){return regenerator.wrap(function _callee11$(_context15){while(1){switch(_context15.prev=_context15.next){case 0:if(tileset){if(!orientationDetected&&(tile===null||tile===void 0?void 0:tile.depth)<=MAX_DEPTH_FOR_ORIENTATION){detectOrientation(tile);}tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);}case 1:case"end":return _context15.stop();}}},_callee11);}));},onTileUnload:function onTileUnload(tile){unloadQueue.push(tile);},onTileError:function onTileError(tile,message){console.error('Tile error',tile.id,message);}};tileset=new Tileset3D(tilesetJson,Object.assign(Object.assign({},tileOptions),{loadOptions:Object.assign(Object.assign({},loadersGLOptions),{maxConcurrency:options.maxConcurrency,worker:options.worker,gltf:{loadImages:false},'3d-tiles':{loadGLTF:false}})}));//
  42870. // transformations
  42871. threeMat=new THREE$1.Matrix4();tileTrasnform=new THREE$1.Matrix4();rootCenter=new THREE$1.Vector3();orientationDetected=false;if(tileset.root.boundingVolume){if(tileset.root.header.boundingVolume.region){// TODO: Handle region type bounding volumes
  42872. // https://github.com/visgl/loaders.gl/issues/1994
  42873. console.warn('Cannot apply a model matrix to bounding volumes of type region. Tileset stays in original geo-coordinates.');options.geoTransform=GeoTransform.WGS84Cartesian;}tileTrasnform.setPosition(tileset.root.boundingVolume.center[0],tileset.root.boundingVolume.center[1],tileset.root.boundingVolume.center[2]);}else {console.warn('Bounding volume not found, no transformations applied');}if(options.debug){box=loadersBoundingBoxToMesh(tileset.root);tileBoxes.add(box);boxMap[tileset.root.id]=box;}disposeFlag=false;loadingEnded=false;pointcloudUniforms.rootCenter.value.copy(rootCenter);pointcloudUniforms.rootNormal.value.copy(new THREE$1.Vector3(0,0,1).normalize());// Extra stats
  42874. tileset.stats.get('Loader concurrency').count=options.maxConcurrency;tileset.stats.get('Maximum SSE').count=options.maximumScreenSpaceError;tileset.stats.get('Maximum mem usage').count=options.maximumMemoryUsage;timer=UPDATE_INTERVAL;// !zeg改 首次tilesetUpdate无需等待
  42875. //let lastCameraTransform = null
  42876. lastCameraAspect=null,lastCameraTop=null,lastCameraLeft=null;lastCameraPosition=new THREE$1.Vector3(Infinity,Infinity,Infinity);sseDenominator=null;root.updateMatrixWorld(true);lastRootTransform=new THREE$1.Matrix4().copy(root.matrixWorld);rootTransformInverse=new THREE$1.Matrix4().copy(lastRootTransform).invert();detectOrientation(tileset.root);updateResetTransform();if(options.debug){boxMap[tileset.root.id].applyMatrix4(threeMat);tileBoxes.matrixWorld.copy(root.matrixWorld);}if(options.geoTransform==GeoTransform.Mercator){coords=datumsToSpherical(tileset.cartographicCenter[1],tileset.cartographicCenter[0]);rootCenter.set(coords.x,0,-coords.y);root.position.copy(rootCenter);root.rotation.set(-Math.PI/2,0,0);root.updateMatrixWorld(true);}else if(options.geoTransform==GeoTransform.WGS84Cartesian){root.applyMatrix4(tileTrasnform);root.updateMatrixWorld(true);rootCenter.copy(root.position);}return _context16.abrupt("return",{model:root,runtime:{getTileset:function getTileset(){return tileset;},getStats:function getStats(){return tileset.stats;},showTiles:function showTiles(visible){tileBoxes.visible=visible;},setWireframe:function setWireframe(wireframe){options.wireframe=wireframe;root.traverse(function(object){if(object instanceof THREE$1.Mesh){object.material.wireframe=wireframe;}});},setDebug:function setDebug(debug){options.debug=debug;tileBoxes.visible=debug;},setShading:function setShading(shading){options.shading=shading;},getTileBoxes:function getTileBoxes(){return tileBoxes;},setViewDistanceScale:function setViewDistanceScale(scale){tileset.options.viewDistanceScale=scale;tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);},setHideGround:function setHideGround(enabled){pointcloudUniforms.hideGround.value=enabled;},setPointCloudColoring:function setPointCloudColoring(selection){pointcloudUniforms.coloring.value=selection;},setElevationRange:function setElevationRange(range){pointcloudUniforms.elevationRange.value.set(range[0],range[1]);},setMaxIntensity:function setMaxIntensity(intensity){pointcloudUniforms.maxIntensity.value=intensity;},setIntensityContrast:function setIntensityContrast(contrast){pointcloudUniforms.intensityContrast.value=contrast;},setPointAlpha:function setPointAlpha(alpha){pointcloudUniforms.alpha.value=alpha;},getLatLongHeightFromPosition:function getLatLongHeightFromPosition(position){var cartographicPosition=tileset.ellipsoid.cartesianToCartographic(new THREE$1.Vector3().copy(position).applyMatrix4(new THREE$1.Matrix4().copy(threeMat).invert()).toArray());return {lat:cartographicPosition[1],long:cartographicPosition[0],height:cartographicPosition[2]};},getPositionFromLatLongHeight:function getPositionFromLatLongHeight(coord){var cartesianPosition=tileset.ellipsoid.cartographicToCartesian([coord.long,coord.lat,coord.height]);return _construct(THREE$1.Vector3,_toConsumableArray(cartesianPosition)).applyMatrix4(threeMat);},getCameraFrustum:function getCameraFrustum(camera){var frustum=_getCameraFrustum(camera);var meshes=frustum.planes.map(function(plane){return new Plane(plane.normal.toArray(),plane.constant);}).map(function(loadersPlane){return loadersPlaneToMesh(loadersPlane);});var model=new THREE$1.Group();var _iterator56=_createForOfIteratorHelper$3(meshes),_step56;try{for(_iterator56.s();!(_step56=_iterator56.n()).done;){var mesh=_step56.value;model.add(mesh);}}catch(err){_iterator56.e(err);}finally{_iterator56.f();}return model;},// !zeg改 isForse 强制tilesetUpdate
  42877. update:function update(dt,renderer,camera,isForse){cameraReference=camera;rendererReference=renderer;timer+=isForse?9999:dt;if(tileset&&timer>=UPDATE_INTERVAL){if(!lastRootTransform.equals(root.matrixWorld)){timer=0;lastRootTransform.copy(root.matrixWorld);updateResetTransform();var _rootCenter=new THREE$1.Vector3().setFromMatrixPosition(lastRootTransform);pointcloudUniforms.rootCenter.value.copy(_rootCenter);pointcloudUniforms.rootNormal.value.copy(new THREE$1.Vector3(0,0,1).applyMatrix4(lastRootTransform).normalize());rootTransformInverse.copy(lastRootTransform).invert();if(options.debug){boxMap[tileset.root.id].matrixWorld.copy(threeMat);boxMap[tileset.root.id].applyMatrix4(lastRootTransform);}}//if (lastCameraTransform == null) {
  42878. // lastCameraTransform = new Matrix4$1().copy(camera.matrixWorld)
  42879. //} else {
  42880. //const cameraChanged = !camera.matrixWorld.equals(lastCameraTransform) || !(camera.aspect == lastCameraAspect)
  42881. //if (cameraChanged || isForse) {
  42882. //if (lastCameraTransform == null) {
  42883. // lastCameraTransform = new Matrix4$1().copy(camera.matrixWorld)
  42884. //} else {
  42885. //const cameraChanged = !camera.matrixWorld.equals(lastCameraTransform) || !(camera.aspect == lastCameraAspect)
  42886. //if (cameraChanged || isForse) {
  42887. timer=0;tileset._frameNumber++;camera.getWorldPosition(lastCameraPosition);//lastCameraTransform.copy(camera.matrixWorld)
  42888. //lastCameraTransform.copy(camera.matrixWorld)
  42889. tilesetUpdate(tileset,renderMap,renderer,camera);//}
  42890. //}
  42891. }},dispose:function dispose(){disposeFlag=true;tileset._destroy();while(root.children.length>0){var obj=root.children[0];disposeNode(obj);root.remove(obj);}while(tileBoxes.children.length>0){var _obj=tileBoxes.children[0];tileBoxes.remove(_obj);_obj.geometry.dispose();_obj.material.dispose();}if(ktx2Loader){ktx2Loader.dispose();}if(dracoLoader){dracoLoader.dispose();}},// !zeg改
  42892. // 显示并让所有tile按照相机位置细化,不受可视范围影响
  42893. ingoreVisibleCompute:function ingoreVisibleCompute(visi){tileset.options.ingoreVisibleCompute=visi;tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);},// 暂停tile更新,保持当前tile的显隐和depth
  42894. pauseTilesetUpdate:function pauseTilesetUpdate(isPause){options.pauseTilesetUpdate=isPause;if(!isPause){tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);}},// 设置是否限制为最低精度tile深度
  42895. limit2lowestDepth:function limit2lowestDepth(isLowest){options.isLowestDepth=!!isLowest;if(cameraReference){tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);}},// 清空正在加载的tile
  42896. clearLoadingTiles:function clearLoadingTiles(){tileset.loadingTiles.forEach(function(tile){return tile.controller&&tile.controller.abort();});},// 模型的总体积
  42897. setModelSize:function setModelSize(size){tileset.options.modelSize=size;console.error(size);},getRenderMap:function getRenderMap(){return renderMap;}}});case 62:case"end":return _context16.stop();}}},_callee12);}));}}]);return Loader3DTiles;}();function createGLTFNodes(gltfLoader,tile,unlitMaterial,options,rootTransformInverse){return __awaiter(this,void 0,void 0,/*#__PURE__*/regenerator.mark(function _callee13(){return regenerator.wrap(function _callee13$(_context17){while(1){switch(_context17.prev=_context17.next){case 0:return _context17.abrupt("return",new Promise(function(resolve,reject){var shouldRotate=tile.tileset.asset&&tile.tileset.asset.gltfUpAxis!=='Z';// The computed trasnform already contains the root's transform, so we have to invert it
  42898. // The computed trasnform already contains the root's transform, so we have to invert it
  42899. var contentTransform=new THREE$1.Matrix4().fromArray(tile.computedTransform).premultiply(rootTransformInverse);if(shouldRotate){var rotateX=new THREE$1.Matrix4().makeRotationAxis(new THREE$1.Vector3(1,0,0),Math.PI/2);contentTransform.multiply(rotateX);// convert from GLTF Y-up to Z-up
  42900. }gltfLoader.parse(tile.content.type=='glTF'?tile.content.gltf.gltfArrayBuffer:tile.content.gltfArrayBuffer,tile.contentUrl?tile.contentUrl.substr(0,tile.contentUrl.lastIndexOf('/')+1):'',function(gltf){// !zeg改 Chunk
  42901. // 模型加载成功
  42902. var tileContent=gltf.scenes[0];var meshes=[];tileContent.traverse(function(object){if(object.type=='Mesh'){meshes.push(object);// 提取tileContent里面的所有mesh
  42903. }});tileContent.clear();// 清空tileContent
  42904. // 清空tileContent
  42905. meshes.forEach(function(mesh){var originalMaterial=mesh.material;var originalMap=originalMaterial.map;if(options.material){mesh.material=options.material.clone();originalMaterial.dispose();}else if(options.shading==Shading.FlatTexture){mesh.material=unlitMaterial.clone();originalMaterial.dispose();}if(options.shading!=Shading.ShadedNoTexture){if(mesh.material.type=='ShaderMaterial'){mesh.material.uniforms.map={value:originalMap};}else {mesh.material.map=originalMap;}}else {if(originalMap){originalMap.dispose();}mesh.material.map=null;}if(options.shaderCallback){mesh.onBeforeRender=options.shaderCallback;}mesh.material.wireframe=options.wireframe;if(options.computeNormals){mesh.geometry.computeVertexNormals();}mesh.geometry.applyMatrix4(contentTransform);if(tile.content.rtcCenter){// 有些b3dm模型会将坐标写在源码的rtcCenter里
  42906. mesh.geometry.translate(tile.content.rtcCenter[0],tile.content.rtcCenter[1],tile.content.rtcCenter[2]);}else {mesh.geometry.scale(1,1,-1);// 调整缩放,对应box也要进行变换(scaleZ对应box[2])
  42907. }if(tile.tileset.options.type=='4dkk'){// 将mesh转为chunk
  42908. mesh.geometry.computeBoundingBox();mesh.material.dispose();var chunk=new Chunk({geometry:mesh.geometry,texture:mesh.material.map,name:mesh.name,meshUrl:tile.contentUrl,tileId:tile.id});tileContent.add(chunk);// 将chunk添加进tileContent
  42909. }else {tileContent.add(mesh);}});resolve(tileContent);},function(e){reject(new Error("error parsing gltf in tile ".concat(tile.id,": ").concat(e)));});}));case 1:case"end":return _context17.stop();}}},_callee13);}));}function createPointNodes(tile,pointcloudMaterial,options,rootTransformInverse){var d={rtc_center:tile.content.rtcCenter,points:tile.content.attributes.positions,intensities:tile.content.attributes.intensity,classifications:tile.content.attributes.classification,rgb:null,rgba:null};var colors=tile.content.attributes.colors;if(colors&&colors.size===3){d.rgb=colors.value;}if(colors&&colors.size===4){d.rgba=colors.value;}var geometry=new THREE$1.BufferGeometry();geometry.setAttribute('position',new THREE$1.Float32BufferAttribute(d.points,3));var contentTransform=new THREE$1.Matrix4().fromArray(tile.computedTransform).premultiply(rootTransformInverse);if(d.rgba){geometry.setAttribute('color',new THREE$1.Float32BufferAttribute(d.rgba,4));}else if(d.rgb){geometry.setAttribute('color',new THREE$1.Uint8BufferAttribute(d.rgb,3,true));}if(d.intensities){geometry.setAttribute('intensity',// Handles both 16bit or 8bit intensity values
  42910. new THREE$1.BufferAttribute(d.intensities,1,true));}if(d.classifications){geometry.setAttribute('classification',new THREE$1.Uint8BufferAttribute(d.classifications,1,false));}var tileContent=new THREE$1.Points(geometry,options.material||pointcloudMaterial);if(d.rtc_center){var c=d.rtc_center;contentTransform.multiply(new THREE$1.Matrix4().makeTranslation(c[0],c[1],c[2]));}tileContent.applyMatrix4(contentTransform);return tileContent;}function disposeMaterial(material){var _a,_b,_c,_d;if((_a=material===null||material===void 0?void 0:material.uniforms)===null||_a===void 0?void 0:_a.map){(_c=(_b=material===null||material===void 0?void 0:material.uniforms)===null||_b===void 0?void 0:_b.map.value)===null||_c===void 0?void 0:_c.dispose();}else if(material.map){(_d=material.map)===null||_d===void 0?void 0:_d.dispose();}material.dispose();}function disposeNode(node){node.traverse(function(object){if(object.isMesh){object.geometry.dispose();if(object.material.isMaterial){disposeMaterial(object.material);}else {// an array of materials
  42911. var _iterator57=_createForOfIteratorHelper$3(object.material),_step57;try{for(_iterator57.s();!(_step57=_iterator57.n()).done;){var material=_step57.value;disposeMaterial(material);}}catch(err){_iterator57.e(err);}finally{_iterator57.f();}}}});for(var _i65=node.children.length-1;_i65>=0;_i65--){var obj=node.children[_i65];node.remove(obj);}}
  42912. var baseURL = getScriptURL(); // 兼容V2
  42913. var compatiblev2 = function compatiblev2(data) {
  42914. if (!data.floors) {
  42915. data = {
  42916. floors: [data]
  42917. };
  42918. }
  42919. data.floors.map(function (data) {
  42920. data.column = data.column || [];
  42921. data.window = data.window || [];
  42922. data.door = data.door || [];
  42923. data.groundCase = data.groundCase || [];
  42924. data.bayCase = data.bayCase || [];
  42925. data.slideDoor = data.slideDoor || [];
  42926. data.tagging = data.tagging || [];
  42927. data.furnColumn = data.furnColumn || [];
  42928. data.furnFlue = data.furnFlue || [];
  42929. if (data.rooms || data.room || data.points) {
  42930. data.room = data.rooms || data.room || data.points;
  42931. data.room.forEach(function (room) {
  42932. if (!isNumber(room.top)) {
  42933. room.top = isNumber(data.top) ? data.top : 1;
  42934. }
  42935. if (!isNumber(room.bottom)) {
  42936. room.bottom = isNumber(data.bottom) ? data.bottom : 1;
  42937. }
  42938. if (!room.ground && room.points) {
  42939. room.ground = room.points;
  42940. }
  42941. if (!room.hole) {
  42942. room.hole = [];
  42943. }
  42944. room.close = true;
  42945. });
  42946. }
  42947. return data;
  42948. });
  42949. return data;
  42950. };
  42951. defineComponent('resource', function () {
  42952. return /*#__PURE__*/function () {
  42953. function Resource() {
  42954. _classCallCheck(this, Resource);
  42955. this.reload = false;
  42956. this.version = Date.now();
  42957. this.nowTime = Date.now();
  42958. this.imageVersion = 0;
  42959. this.linkVersion = 0;
  42960. }
  42961. _createClass(Resource, [{
  42962. key: "num",
  42963. get: function get() {
  42964. return this.$app.config.num;
  42965. }
  42966. }, {
  42967. key: "mode",
  42968. get: function get() {
  42969. return this.$app.config.view ? 'view' : 'edit';
  42970. }
  42971. }, {
  42972. key: "time",
  42973. get: function get() {
  42974. if (this.reload || this.refresh) {
  42975. if (this.reload) {
  42976. this.reload = false;
  42977. this.refresh = Date.now();
  42978. }
  42979. return this.refresh;
  42980. }
  42981. return this.version;
  42982. }
  42983. }, {
  42984. key: "base",
  42985. value: function base(path) {
  42986. return baseURL + path;
  42987. }
  42988. }, {
  42989. key: "auth",
  42990. value: function () {
  42991. var _auth = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  42992. var data;
  42993. return regenerator.wrap(function _callee$(_context) {
  42994. while (1) {
  42995. switch (_context.prev = _context.next) {
  42996. case 0:
  42997. if (!(this.mode != 'edit')) {
  42998. _context.next = 2;
  42999. break;
  43000. }
  43001. return _context.abrupt("return");
  43002. case 2:
  43003. _context.prev = 2;
  43004. _context.next = 5;
  43005. return this.$app.remote_editor.getAuth({
  43006. num: this.num
  43007. });
  43008. case 5:
  43009. data = _context.sent;
  43010. if (data.success) {
  43011. this.$app.store.set('auth', data.data);
  43012. }
  43013. return _context.abrupt("return", data);
  43014. case 10:
  43015. _context.prev = 10;
  43016. _context.t0 = _context["catch"](2);
  43017. throw _context.t0;
  43018. case 13:
  43019. case "end":
  43020. return _context.stop();
  43021. }
  43022. }
  43023. }, _callee, this, [[2, 10]]);
  43024. }));
  43025. function auth() {
  43026. return _auth.apply(this, arguments);
  43027. }
  43028. return auth;
  43029. }()
  43030. }, {
  43031. key: "metadata",
  43032. value: function () {
  43033. var _metadata = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
  43034. var data, resp;
  43035. return regenerator.wrap(function _callee2$(_context2) {
  43036. while (1) {
  43037. switch (_context2.prev = _context2.next) {
  43038. case 0:
  43039. logger$1.time("".concat(this.$app.config.num, "[load metadata]").concat(this.$app.uid));
  43040. data = null;
  43041. resp = null;
  43042. if (!this.$app.config.view) {
  43043. _context2.next = 19;
  43044. break;
  43045. }
  43046. if (!(this.$app.config.deploy == 'local' && !this.$app.config.server)) {
  43047. _context2.next = 10;
  43048. break;
  43049. }
  43050. _context2.next = 7;
  43051. return http.get(this.getViewResourceURL("data/scene.json?_=".concat(this.time)));
  43052. case 7:
  43053. resp = _context2.sent;
  43054. _context2.next = 17;
  43055. break;
  43056. case 10:
  43057. if (!window.__KANKAN_DATA) {
  43058. _context2.next = 14;
  43059. break;
  43060. }
  43061. resp = window.__KANKAN_DATA;
  43062. _context2.next = 17;
  43063. break;
  43064. case 14:
  43065. _context2.next = 16;
  43066. return http.get("/service/scene/getInfo?num=".concat(this.$app.config.num, "&_=").concat(this.time));
  43067. case 16:
  43068. resp = _context2.sent;
  43069. case 17:
  43070. _context2.next = 22;
  43071. break;
  43072. case 19:
  43073. _context2.next = 21;
  43074. return http.get("/service/scene/edit/getInfo?num=".concat(this.$app.config.num, "&_=").concat(this.time));
  43075. case 21:
  43076. resp = _context2.sent;
  43077. case 22:
  43078. if (!(resp.success != void 0)) {
  43079. _context2.next = 30;
  43080. break;
  43081. }
  43082. if (!resp.success) {
  43083. _context2.next = 27;
  43084. break;
  43085. }
  43086. data = resp.data;
  43087. _context2.next = 28;
  43088. break;
  43089. case 27:
  43090. return _context2.abrupt("return");
  43091. case 28:
  43092. _context2.next = 31;
  43093. break;
  43094. case 30:
  43095. data = resp;
  43096. case 31:
  43097. if (data.entry) {
  43098. if (typeof data.entry === 'string') {
  43099. data.entry = JSON.parse(data.entry);
  43100. }
  43101. }
  43102. if (data.boxVideos) {
  43103. if (typeof data.boxVideos === 'string') {
  43104. data.boxVideos = JSON.parse(data.boxVideos);
  43105. }
  43106. }
  43107. if (data.boxPhotos) {
  43108. if (typeof data.boxPhotos === 'string') {
  43109. data.boxPhotos = JSON.parse(data.boxPhotos);
  43110. }
  43111. }
  43112. if (data.boxModels) {
  43113. if (typeof data.boxModels === 'string') {
  43114. data.boxModels = JSON.parse(data.boxModels);
  43115. }
  43116. }
  43117. if (data.videos) {
  43118. if (typeof data.videos === 'string') {
  43119. data.videos = JSON.parse(data.videos);
  43120. }
  43121. }
  43122. if (data.version) {
  43123. this.version = data.version;
  43124. this.imageVersion = data.imgVersion || 0;
  43125. this.linkVersion = data.linkVersion || 0;
  43126. }
  43127. if (data.sns == void 0) {
  43128. data.sns = {};
  43129. if (data.sns.share == void 0) {
  43130. data.sns.share = {};
  43131. data.sns.share = {
  43132. __init__: true,
  43133. title: data.title,
  43134. keywords: '',
  43135. description: data.description,
  43136. image: data.entry ? 'thumb-1k.jpg' : null
  43137. };
  43138. }
  43139. }
  43140. logger$1.timeEnd("".concat(this.$app.config.num, "[load metadata]").concat(this.$app.uid));
  43141. this.$app.store.set('metadata', data);
  43142. return _context2.abrupt("return", data);
  43143. case 41:
  43144. case "end":
  43145. return _context2.stop();
  43146. }
  43147. }
  43148. }, _callee2, this);
  43149. }));
  43150. function metadata() {
  43151. return _metadata.apply(this, arguments);
  43152. }
  43153. return metadata;
  43154. }()
  43155. /**
  43156. * 加载漫游点
  43157. */
  43158. }, {
  43159. key: "visions",
  43160. value: function () {
  43161. var _visions = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {
  43162. var _this = this;
  43163. var data, metadata, decompress;
  43164. return regenerator.wrap(function _callee3$(_context3) {
  43165. while (1) {
  43166. switch (_context3.prev = _context3.next) {
  43167. case 0:
  43168. logger$1.time("".concat(this.$app.config.num, "[load visions]").concat(this.$app.uid));
  43169. _context3.next = 3;
  43170. return http.getBueffer(this.getResourceURL("scene_view_data/{num}/images/vision.modeldata?_=".concat(this.version)));
  43171. case 3:
  43172. data = _context3.sent;
  43173. _context3.next = 6;
  43174. return this.$app.store.get('metadata');
  43175. case 6:
  43176. metadata = _context3.sent;
  43177. logger$1.timeEnd("".concat(this.$app.config.num, "[load visions]").concat(this.$app.uid));
  43178. decompress = function decompress(buffer) {
  43179. logger$1.time("".concat(_this.$app.config.num, "[parse modeldata]").concat(_this.$app.uid));
  43180. var sweepLocations = Deompress.decompressModeldata(buffer);
  43181. if (metadata.dataSync == 'ajk') {
  43182. //同步漫游点数据(安居客需要)
  43183. _this.$app.DataSYNC.use('DataAJK', {
  43184. sweepLocations: sweepLocations
  43185. });
  43186. }
  43187. var modeldata = Process.visionModeldata(sweepLocations);
  43188. logger$1.timeEnd("".concat(_this.$app.config.num, "[parse modeldata]").concat(_this.$app.uid)); // todo
  43189. //将vision.modeldata数据进行处理,生成Panorama对象数组,以及设置邻居点, metadata用于检测球幕视频
  43190. _this.$app.core.get('Player').model.panos = Process.panos(_this.$app, modeldata, metadata);
  43191. _this.$app.core.get('Player').model.dispatchEvent({
  43192. type: 'gotPanos'
  43193. });
  43194. };
  43195. decompress(data);
  43196. case 10:
  43197. case "end":
  43198. return _context3.stop();
  43199. }
  43200. }
  43201. }, _callee3, this);
  43202. }));
  43203. function visions() {
  43204. return _visions.apply(this, arguments);
  43205. }
  43206. return visions;
  43207. }()
  43208. /**
  43209. * 加载辅助点位
  43210. */
  43211. }, {
  43212. key: "visions2",
  43213. value: function () {
  43214. var _visions2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4() {
  43215. var _this2 = this;
  43216. var model, data, decompress;
  43217. return regenerator.wrap(function _callee4$(_context4) {
  43218. while (1) {
  43219. switch (_context4.prev = _context4.next) {
  43220. case 0:
  43221. model = this.$app.core.get('Player').model;
  43222. logger$1.time("".concat(this.$app.config.num, "[load visions2]").concat(this.$app.uid));
  43223. _context4.next = 4;
  43224. return http.getBueffer(this.getResourceURL("scene_view_data/{num}/images/vision2.modeldata?_=".concat(this.version)));
  43225. case 4:
  43226. data = _context4.sent;
  43227. logger$1.timeEnd("".concat(this.$app.config.num, "[load visions2]").concat(this.$app.uid));
  43228. decompress = function decompress(buffer) {
  43229. logger$1.time("".concat(_this2.$app.config.num, "[parse modeldata2]").concat(_this2.$app.uid));
  43230. var sweepLocations = Deompress.decompressModeldata(buffer);
  43231. var modeldata = Process.visionModeldata(sweepLocations);
  43232. logger$1.timeEnd("".concat(_this2.$app.config.num, "[parse modeldata2]").concat(_this2.$app.uid));
  43233. var panos = Process.panosAssist(modeldata, _this2.$app);
  43234. panos.forEach(function (pano) {
  43235. model.panos.index[pano.id - 1].assistPano = pano;
  43236. });
  43237. };
  43238. decompress(data);
  43239. case 8:
  43240. case "end":
  43241. return _context4.stop();
  43242. }
  43243. }
  43244. }, _callee4, this);
  43245. }));
  43246. function visions2() {
  43247. return _visions2.apply(this, arguments);
  43248. }
  43249. return visions2;
  43250. }()
  43251. /**
  43252. * 加载模型
  43253. */
  43254. }, {
  43255. key: "modelmesh3dTiles",
  43256. value: function () {
  43257. var _modelmesh3dTiles = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5() {
  43258. var _this3 = this;
  43259. var player, sceneRenderer, result, runtime;
  43260. return regenerator.wrap(function _callee5$(_context5) {
  43261. while (1) {
  43262. switch (_context5.prev = _context5.next) {
  43263. case 0:
  43264. logger$1.time("".concat(this.$app.config.num, "[load modelmesh]").concat(this.$app.uid));
  43265. player = this.$app.core.get('Player');
  43266. sceneRenderer = this.$app.core.get('SceneRenderer');
  43267. _context5.next = 5;
  43268. return Loader3DTiles.load({
  43269. // url: texture.getImageURL('images/3dtiles/tileset.json'),
  43270. // url: texture.getImageURL('images/3dtiles_tianranqi/tileset.json'),
  43271. // url: 'https://4dkk.4dage.com/scene_view_data/SS-Ds19qsmuFA/images/3dtiles/tileset.json',
  43272. // url: 'https://testgis.4dage.com/LVBADUI_qp/tileset.json',
  43273. url: this.getResourceURL("scene_view_data/{num}/images/3dtiles/tileset.json?_=".concat(Date.now())),
  43274. renderer: sceneRenderer.renderer,
  43275. options: {
  43276. dracoDecoderPath: texture.getImageURL('images/loaders/DRACOLoader/draco'),
  43277. basisTranscoderPath: texture.getImageURL('images/loaders/KTX2Loader/basis'),
  43278. maximumScreenSpaceError: browser$1.isMobile() ? 16 / 3 : 16,
  43279. // 和geometryError的计算有关,值越小,瓦片细化所需距离越远
  43280. maxConcurrency: 2,
  43281. isLowestDepth: true,
  43282. // 限制为最低精度
  43283. // debug: true, // 显示tiles的boundingVolume线框
  43284. // updateInterval: 0.01, // update的频率(ms)
  43285. ingoreVisibleCompute: true,
  43286. // 禁用屏幕外瓦片计算,防止初始画面没有模型时不加载tiles
  43287. maximumMemoryUsage: browser$1.detectIOS() ? 0.1 : 32,
  43288. // 最大tiles缓存,默认32(ios防崩)
  43289. imageVersion: this.imageVersion,
  43290. // 用于更新瓦片模型的version
  43291. type: '4dkk' // 用于兼容专属逻辑
  43292. },
  43293. model: player.model
  43294. });
  43295. case 5:
  43296. result = _context5.sent;
  43297. runtime = result.runtime;
  43298. player.model._3dTilesRuntime = runtime;
  43299. sceneRenderer.autoUpdate3dTiles = true; // // 3dtiles调试面板
  43300. // // ---------------- stats-widget -------------------
  43301. // const statsParent = document.createElement('div')
  43302. // statsParent.id = 'stats-widget'
  43303. // statsParent.style.position = 'absolute'
  43304. // statsParent.style.top = '20px'
  43305. // statsParent.style.left = '100px'
  43306. // statsParent.style.backgroundColor = 'rgb(255 255 255 / 83%)'
  43307. // statsParent.style.padding = '10px'
  43308. // statsParent.style.width = '300px'
  43309. // statsParent.style.wordBreak = 'break-all'
  43310. // statsParent.style.zIndex = '9999'
  43311. // statsParent.style.fontSize = '18px'
  43312. // document.querySelector('body').appendChild(statsParent)
  43313. // player.model._3dTilesRuntime.stats = new StatsWidget(runtime.getStats(), { container: statsParent })
  43314. // // -------------------------------------------------
  43315. // 当瓦片都加载完时,继续加载其他场景数据
  43316. runtime.getTileset().on('endTileLoading', function (data) {
  43317. if (data.loadingCount == 0 && !player.model.mesh3dTilesLoaded) {
  43318. player.model.mesh3dTilesLoaded = true;
  43319. player.model.floors.sort();
  43320. if (browser$1.detectIOS()) {
  43321. // ios要计算模型体积,当体积过大时,不会加载最精细一层
  43322. var modelBox = new THREE.Box3();
  43323. player.model.floors.forEach(function (floor) {
  43324. return modelBox.union(floor.boundingBox);
  43325. });
  43326. player.model._3dTilesRuntime.setModelSize(modelBox.getSize(new THREE.Vector3()));
  43327. }
  43328. _this3.$app.Scene.emit('3dTilesLoaded');
  43329. player.model._3dTilesRuntime.pauseTilesetUpdate(false); // 先update一次
  43330. player.model._3dTilesRuntime.pauseTilesetUpdate(true);
  43331. logger$1.timeEnd("".concat(_this3.$app.config.num, "[load modelmesh]").concat(_this3.$app.uid));
  43332. }
  43333. });
  43334. case 10:
  43335. case "end":
  43336. return _context5.stop();
  43337. }
  43338. }
  43339. }, _callee5, this);
  43340. }));
  43341. function modelmesh3dTiles() {
  43342. return _modelmesh3dTiles.apply(this, arguments);
  43343. }
  43344. return modelmesh3dTiles;
  43345. }()
  43346. }, {
  43347. key: "modelmeshDam",
  43348. value: function () {
  43349. var _modelmeshDam = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee6() {
  43350. var _this4 = this;
  43351. var dam, data, addToModel, decompress;
  43352. return regenerator.wrap(function _callee6$(_context6) {
  43353. while (1) {
  43354. switch (_context6.prev = _context6.next) {
  43355. case 0:
  43356. addToModel = function _addToModel(chunks, player) {
  43357. if (0 === chunks.length) {
  43358. logger$1.warn('No geometry found for model, loading faux geometry, disabling outside mode');
  43359. player.model.supportedModes[Viewmode$1.DOLLHOUSE] = !1;
  43360. player.model.supportedModes[Viewmode$1.FLOORPLAN] = !1;
  43361. var chunk = new Chunk({
  43362. geometry: new THREE.PlaneBufferGeometry(5, 5, 1, 1)
  43363. });
  43364. chunk.material.visible = !1;
  43365. chunk.rotateX(-Math.PI / 2);
  43366. chunk.geometry.computeBoundingBox();
  43367. chunks = [chunk];
  43368. }
  43369. chunks.forEach(function (mesh) {
  43370. var floorIndex = 0;
  43371. if (player.model.floorsEnabled) {
  43372. floorIndex = Chunks.parseFloor(mesh.name);
  43373. }
  43374. player.model.addChunk(floorIndex, mesh);
  43375. });
  43376. player.model.floors.sort(); //deferred.resolve(player.model);
  43377. };
  43378. dam = settings$3.job + settings$3.format; //dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam
  43379. if (this.$app.config.model.name) {
  43380. dam = this.$app.config.model.name;
  43381. }
  43382. logger$1.time("".concat(this.$app.config.num, "[load modelmesh]").concat(this.$app.uid));
  43383. _context6.next = 6;
  43384. return http.getBueffer(this.getResourceURL("scene_view_data/{num}/images/".concat(dam, "?_=").concat(this.imageVersion)));
  43385. case 6:
  43386. data = _context6.sent;
  43387. logger$1.timeEnd("".concat(this.$app.config.num, "[load modelmesh]").concat(this.$app.uid));
  43388. decompress = function decompress(buffer) {
  43389. logger$1.time("".concat(_this4.$app.config.num, "[parse dam]").concat(_this4.$app.uid));
  43390. var meshdata = Deompress.decompressMesh(buffer);
  43391. var chunks = Process.convertProtobufToSceneObject(_this4.$app, meshdata);
  43392. logger$1.timeEnd("".concat(_this4.$app.config.num, "[parse dam]").concat(_this4.$app.uid));
  43393. addToModel(chunks, _this4.$app.core.get('Player'));
  43394. };
  43395. decompress(data);
  43396. case 10:
  43397. case "end":
  43398. return _context6.stop();
  43399. }
  43400. }
  43401. }, _callee6, this);
  43402. }));
  43403. function modelmeshDam() {
  43404. return _modelmeshDam.apply(this, arguments);
  43405. }
  43406. return modelmeshDam;
  43407. }()
  43408. }, {
  43409. key: "textures",
  43410. value: function () {
  43411. var _textures = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee7() {
  43412. return regenerator.wrap(function _callee7$(_context7) {
  43413. while (1) {
  43414. switch (_context7.prev = _context7.next) {
  43415. case 0:
  43416. logger$1.time("".concat(this.$app.config.num, "[load textures]").concat(this.$app.uid));
  43417. _context7.next = 3;
  43418. return ModelTextureLoader.load(this.$app.core.get('Player').model, this.$app.core.get('Player').model.meshTextures, this);
  43419. case 3:
  43420. logger$1.timeEnd("".concat(this.$app.config.num, "[load textures]").concat(this.$app.uid));
  43421. this.$app.core.get('Player').model.meshTexturesLoaded = !0;
  43422. case 5:
  43423. case "end":
  43424. return _context7.stop();
  43425. }
  43426. }
  43427. }, _callee7, this);
  43428. }));
  43429. function textures() {
  43430. return _textures.apply(this, arguments);
  43431. }
  43432. return textures;
  43433. }()
  43434. /**
  43435. * 原始算法楼层数据(数据同步使用)
  43436. * @returns
  43437. */
  43438. }, {
  43439. key: "floor",
  43440. value: function () {
  43441. var _floor = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee8() {
  43442. var data;
  43443. return regenerator.wrap(function _callee8$(_context8) {
  43444. while (1) {
  43445. switch (_context8.prev = _context8.next) {
  43446. case 0:
  43447. data = null;
  43448. _context8.prev = 1;
  43449. logger$1.time("".concat(this.$app.config.num, "[load floor]").concat(this.$app.uid));
  43450. _context8.next = 5;
  43451. return http.get(this.getResourceURL("scene_view_data/{num}/data/floor.json?_=".concat(this.time)));
  43452. case 5:
  43453. data = _context8.sent;
  43454. logger$1.timeEnd("".concat(this.$app.config.num, "[load floor]").concat(this.$app.uid));
  43455. _context8.next = 12;
  43456. break;
  43457. case 9:
  43458. _context8.prev = 9;
  43459. _context8.t0 = _context8["catch"](1);
  43460. logger$1.warn('loaded [floor] error');
  43461. case 12:
  43462. return _context8.abrupt("return", data);
  43463. case 13:
  43464. case "end":
  43465. return _context8.stop();
  43466. }
  43467. }
  43468. }, _callee8, this, [[1, 9]]);
  43469. }));
  43470. function floor() {
  43471. return _floor.apply(this, arguments);
  43472. }
  43473. return floor;
  43474. }()
  43475. }, {
  43476. key: "floorcad",
  43477. value: function () {
  43478. var _floorcad = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee9() {
  43479. var data;
  43480. return regenerator.wrap(function _callee9$(_context9) {
  43481. while (1) {
  43482. switch (_context9.prev = _context9.next) {
  43483. case 0:
  43484. data = null;
  43485. _context9.prev = 1;
  43486. logger$1.time("".concat(this.$app.config.num, "[load floorcad]").concat(this.$app.uid));
  43487. _context9.next = 5;
  43488. return http.get(this.getResourceURL("scene_view_data/{num}/data/floorplan_cad.json?_=".concat(this.time)));
  43489. case 5:
  43490. data = _context9.sent;
  43491. if (!data.floors) {
  43492. data = compatiblev2(data);
  43493. }
  43494. if (data && data.floors) {
  43495. data.floors = data.floors.filter(function (floor) {
  43496. return floor.segment && floor.segment.length > 0;
  43497. });
  43498. }
  43499. logger$1.timeEnd("".concat(this.$app.config.num, "[load floorcad]").concat(this.$app.uid));
  43500. _context9.next = 14;
  43501. break;
  43502. case 11:
  43503. _context9.prev = 11;
  43504. _context9.t0 = _context9["catch"](1);
  43505. logger$1.warn('loaded [floorcad] error');
  43506. case 14:
  43507. this.$app.store.set('floorcad', data);
  43508. return _context9.abrupt("return", data);
  43509. case 16:
  43510. case "end":
  43511. return _context9.stop();
  43512. }
  43513. }
  43514. }, _callee9, this, [[1, 11]]);
  43515. }));
  43516. function floorcad() {
  43517. return _floorcad.apply(this, arguments);
  43518. }
  43519. return floorcad;
  43520. }()
  43521. }, {
  43522. key: "flooruser",
  43523. value: function () {
  43524. var _flooruser = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee10() {
  43525. var data, meta;
  43526. return regenerator.wrap(function _callee10$(_context10) {
  43527. while (1) {
  43528. switch (_context10.prev = _context10.next) {
  43529. case 0:
  43530. data = null;
  43531. meta = this.$app.store.getValue('metadata');
  43532. _context10.prev = 2;
  43533. logger$1.time("".concat(this.$app.config.num, "[load flooruser]").concat(this.$app.uid));
  43534. if (!meta.floorPlanUser) {
  43535. _context10.next = 10;
  43536. break;
  43537. }
  43538. _context10.next = 7;
  43539. return http.get(this.getUserResourceURL("floorplan.json", this.reload));
  43540. case 7:
  43541. data = _context10.sent;
  43542. _context10.next = 13;
  43543. break;
  43544. case 10:
  43545. _context10.next = 12;
  43546. return http.get(this.getViewDataURL("floorplan.json"));
  43547. case 12:
  43548. data = _context10.sent;
  43549. case 13:
  43550. logger$1.timeEnd("".concat(this.$app.config.num, "[load flooruser]").concat(this.$app.uid));
  43551. _context10.next = 30;
  43552. break;
  43553. case 16:
  43554. _context10.prev = 16;
  43555. _context10.t0 = _context10["catch"](2);
  43556. logger$1.warn('loaded [flooruser] error');
  43557. if (!meta.floorPlanUser) {
  43558. _context10.next = 29;
  43559. break;
  43560. }
  43561. _context10.prev = 20;
  43562. _context10.next = 23;
  43563. return http.get(this.getViewDataURL("floorplan.json"));
  43564. case 23:
  43565. data = _context10.sent;
  43566. _context10.next = 29;
  43567. break;
  43568. case 26:
  43569. _context10.prev = 26;
  43570. _context10.t1 = _context10["catch"](20);
  43571. logger$1.warn('loaded [flooruser] error');
  43572. case 29:
  43573. if (!data) {
  43574. data = {
  43575. unit: 'm',
  43576. floors: [{
  43577. walls: {
  43578. Wall7: {
  43579. important: false,
  43580. geoType: 'Wall',
  43581. children: [],
  43582. start: 'Point3',
  43583. vectorId: 'Wall7',
  43584. width: 0.2,
  43585. end: 'Point0',
  43586. out: false
  43587. },
  43588. Wall6: {
  43589. important: false,
  43590. geoType: 'Wall',
  43591. children: [],
  43592. start: 'Point2',
  43593. vectorId: 'Wall6',
  43594. width: 0.2,
  43595. end: 'Point3',
  43596. out: false
  43597. },
  43598. Wall5: {
  43599. important: false,
  43600. geoType: 'Wall',
  43601. children: [],
  43602. start: 'Point1',
  43603. vectorId: 'Wall5',
  43604. width: 0.2,
  43605. end: 'Point2',
  43606. out: false
  43607. },
  43608. Wall4: {
  43609. important: false,
  43610. geoType: 'Wall',
  43611. children: [],
  43612. start: 'Point0',
  43613. vectorId: 'Wall4',
  43614. width: 0.2,
  43615. end: 'Point1',
  43616. out: false
  43617. }
  43618. },
  43619. subgroup: 0,
  43620. name: '1楼',
  43621. id: 0,
  43622. points: {
  43623. Point1: {
  43624. parent: {
  43625. Wall5: 'start',
  43626. Wall4: 'end'
  43627. },
  43628. geoType: 'Point',
  43629. vectorId: 'Point1',
  43630. x: 5.531,
  43631. y: 5.777
  43632. },
  43633. Point0: {
  43634. parent: {
  43635. Wall7: 'end',
  43636. Wall4: 'start'
  43637. },
  43638. geoType: 'Point',
  43639. vectorId: 'Point0',
  43640. x: 5.531,
  43641. y: -6.046
  43642. },
  43643. Point3: {
  43644. parent: {
  43645. Wall7: 'start',
  43646. Wall6: 'end'
  43647. },
  43648. geoType: 'Point',
  43649. vectorId: 'Point3',
  43650. x: -2.663,
  43651. y: -6.046
  43652. },
  43653. Point2: {
  43654. parent: {
  43655. Wall6: 'start',
  43656. Wall5: 'end'
  43657. },
  43658. geoType: 'Point',
  43659. vectorId: 'Point2',
  43660. x: -2.663,
  43661. y: 5.777
  43662. }
  43663. }
  43664. }],
  43665. currentId: 8,
  43666. angle: 0,
  43667. type: 'cad',
  43668. version: 'v4.0'
  43669. };
  43670. }
  43671. case 30:
  43672. this.$app.store.set('flooruser', data);
  43673. return _context10.abrupt("return", data);
  43674. case 32:
  43675. case "end":
  43676. return _context10.stop();
  43677. }
  43678. }
  43679. }, _callee10, this, [[2, 16], [20, 26]]);
  43680. }));
  43681. function flooruser() {
  43682. return _flooruser.apply(this, arguments);
  43683. }
  43684. return flooruser;
  43685. }()
  43686. }, {
  43687. key: "billboards",
  43688. value: function () {
  43689. var _billboards = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee11() {
  43690. var _metadata2, data;
  43691. return regenerator.wrap(function _callee11$(_context11) {
  43692. while (1) {
  43693. switch (_context11.prev = _context11.next) {
  43694. case 0:
  43695. _context11.prev = 0;
  43696. _context11.next = 3;
  43697. return this.$app.store.get('metadata');
  43698. case 3:
  43699. _metadata2 = _context11.sent;
  43700. data = null;
  43701. if (!(this.mode === 'view')) {
  43702. _context11.next = 14;
  43703. break;
  43704. }
  43705. if (_metadata2.billboards) {
  43706. _context11.next = 8;
  43707. break;
  43708. }
  43709. return _context11.abrupt("return");
  43710. case 8:
  43711. _context11.next = 10;
  43712. return http.get(this.getUserResourceURL("billboards.json"));
  43713. case 10:
  43714. data = _context11.sent;
  43715. this.$app.store.set('billboards', data);
  43716. _context11.next = 18;
  43717. break;
  43718. case 14:
  43719. _context11.next = 16;
  43720. return this.$app.remote_editor.billboards_list({
  43721. num: this.num
  43722. });
  43723. case 16:
  43724. data = _context11.sent;
  43725. this.$app.store.set('billboards', data.data);
  43726. case 18:
  43727. _context11.next = 23;
  43728. break;
  43729. case 20:
  43730. _context11.prev = 20;
  43731. _context11.t0 = _context11["catch"](0);
  43732. logger$1.error('loaded [billboards] error', _context11.t0);
  43733. case 23:
  43734. case "end":
  43735. return _context11.stop();
  43736. }
  43737. }
  43738. }, _callee11, this, [[0, 20]]);
  43739. }));
  43740. function billboards() {
  43741. return _billboards.apply(this, arguments);
  43742. }
  43743. return billboards;
  43744. }()
  43745. }, {
  43746. key: "cutModel",
  43747. value: function () {
  43748. var _cutModel = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee12() {
  43749. var _metadata3, data;
  43750. return regenerator.wrap(function _callee12$(_context12) {
  43751. while (1) {
  43752. switch (_context12.prev = _context12.next) {
  43753. case 0:
  43754. _context12.prev = 0;
  43755. _context12.next = 3;
  43756. return this.$app.store.get('metadata');
  43757. case 3:
  43758. _metadata3 = _context12.sent;
  43759. data = null;
  43760. if (_metadata3.cutModel) {
  43761. _context12.next = 7;
  43762. break;
  43763. }
  43764. return _context12.abrupt("return");
  43765. case 7:
  43766. if (!(this.mode === 'view')) {
  43767. _context12.next = 14;
  43768. break;
  43769. }
  43770. _context12.next = 10;
  43771. return http.get(this.getUserResourceURL("cutModel.json"));
  43772. case 10:
  43773. data = _context12.sent;
  43774. this.$app.store.set('cutModel', data);
  43775. _context12.next = 18;
  43776. break;
  43777. case 14:
  43778. _context12.next = 16;
  43779. return this.$app.remote_editor.cutModel_list({
  43780. num: this.num
  43781. });
  43782. case 16:
  43783. data = _context12.sent;
  43784. this.$app.store.set('cutModel', data.data);
  43785. case 18:
  43786. _context12.next = 23;
  43787. break;
  43788. case 20:
  43789. _context12.prev = 20;
  43790. _context12.t0 = _context12["catch"](0);
  43791. logger$1.error('loaded [cutModel] error', _context12.t0);
  43792. case 23:
  43793. case "end":
  43794. return _context12.stop();
  43795. }
  43796. }
  43797. }, _callee12, this, [[0, 20]]);
  43798. }));
  43799. function cutModel() {
  43800. return _cutModel.apply(this, arguments);
  43801. }
  43802. return cutModel;
  43803. }()
  43804. }, {
  43805. key: "tags",
  43806. value: function () {
  43807. var _tags = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee13(tagsURL) {
  43808. var _this5 = this;
  43809. var response, _metadata4;
  43810. return regenerator.wrap(function _callee13$(_context13) {
  43811. while (1) {
  43812. switch (_context13.prev = _context13.next) {
  43813. case 0:
  43814. if (!(!this.$app.config.isLoadTags && !tagsURL)) {
  43815. _context13.next = 2;
  43816. break;
  43817. }
  43818. return _context13.abrupt("return");
  43819. case 2:
  43820. response = {
  43821. data: {
  43822. icons: [],
  43823. tags: []
  43824. }
  43825. };
  43826. _context13.prev = 3;
  43827. _context13.next = 6;
  43828. return this.$app.store.get('metadata');
  43829. case 6:
  43830. _metadata4 = _context13.sent;
  43831. // if (metadata.tags) {
  43832. logger$1.time("".concat(this.num, "[load tags]").concat(this.$app.uid));
  43833. if (!(this.mode == 'view')) {
  43834. _context13.next = 24;
  43835. break;
  43836. }
  43837. if (_metadata4.tags) {
  43838. _context13.next = 11;
  43839. break;
  43840. }
  43841. return _context13.abrupt("return");
  43842. case 11:
  43843. response.success = true;
  43844. if (!tagsURL) {
  43845. _context13.next = 18;
  43846. break;
  43847. }
  43848. _context13.next = 15;
  43849. return http.get(tagsURL);
  43850. case 15:
  43851. _context13.t0 = _context13.sent;
  43852. _context13.next = 21;
  43853. break;
  43854. case 18:
  43855. _context13.next = 20;
  43856. return http.get(this.getUserResourceURL("hot.json"));
  43857. case 20:
  43858. _context13.t0 = _context13.sent;
  43859. case 21:
  43860. response.data.tags = _context13.t0;
  43861. _context13.next = 27;
  43862. break;
  43863. case 24:
  43864. _context13.next = 26;
  43865. return this.$app.remote_editor.tag_list({
  43866. num: this.num
  43867. });
  43868. case 26:
  43869. response = _context13.sent;
  43870. case 27:
  43871. if (response.success && response.data && response.data.tags) {
  43872. response.data.tags.map(function (tag) {
  43873. if (tag.position) {
  43874. tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z); // visiblePanos不知为何在obj场景里会有重复id,保险起见初始化统一去重
  43875. tag.visiblePanos ? tag.visiblePanos = Array.from(new Set(tag.visiblePanos)).map(function (id) {
  43876. return _this5.$app.core.get('Player').model.panos.index[id];
  43877. }) : tag.visiblePanos = _this5.$app.TagManager.getVisiblePano(tag.position, {
  43878. maxDis: 5
  43879. });
  43880. }
  43881. return tag;
  43882. });
  43883. }
  43884. logger$1.timeEnd("".concat(this.num, "[load tags]").concat(this.$app.uid)); // }
  43885. _context13.next = 34;
  43886. break;
  43887. case 31:
  43888. _context13.prev = 31;
  43889. _context13.t1 = _context13["catch"](3);
  43890. logger$1.error('loaded [tags] error', _context13.t1);
  43891. case 34:
  43892. this.$app.store.set('tags', response.data);
  43893. return _context13.abrupt("return", response.data);
  43894. case 36:
  43895. case "end":
  43896. return _context13.stop();
  43897. }
  43898. }
  43899. }, _callee13, this, [[3, 31]]);
  43900. }));
  43901. function tags(_x) {
  43902. return _tags.apply(this, arguments);
  43903. }
  43904. return tags;
  43905. }()
  43906. }, {
  43907. key: "tours",
  43908. value: function () {
  43909. var _tours = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee14() {
  43910. var data, _metadata5;
  43911. return regenerator.wrap(function _callee14$(_context14) {
  43912. while (1) {
  43913. switch (_context14.prev = _context14.next) {
  43914. case 0:
  43915. data = [];
  43916. _context14.prev = 1;
  43917. _context14.next = 4;
  43918. return this.$app.store.get('metadata');
  43919. case 4:
  43920. _metadata5 = _context14.sent;
  43921. if (!_metadata5.tours) {
  43922. _context14.next = 9;
  43923. break;
  43924. }
  43925. _context14.next = 8;
  43926. return http.get(this.getUserResourceURL("tour.json"));
  43927. case 8:
  43928. data = _context14.sent;
  43929. case 9:
  43930. _context14.next = 14;
  43931. break;
  43932. case 11:
  43933. _context14.prev = 11;
  43934. _context14.t0 = _context14["catch"](1);
  43935. logger$1.error('loaded [tour] error', _context14.t0);
  43936. case 14:
  43937. this.$app.store.set('tours', data);
  43938. return _context14.abrupt("return", data);
  43939. case 16:
  43940. case "end":
  43941. return _context14.stop();
  43942. }
  43943. }
  43944. }, _callee14, this, [[1, 11]]);
  43945. }));
  43946. function tours() {
  43947. return _tours.apply(this, arguments);
  43948. }
  43949. return tours;
  43950. }()
  43951. }, {
  43952. key: "links",
  43953. value: function () {
  43954. var _links = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee15() {
  43955. var _this6 = this;
  43956. var _metadata6, data;
  43957. return regenerator.wrap(function _callee15$(_context15) {
  43958. while (1) {
  43959. switch (_context15.prev = _context15.next) {
  43960. case 0:
  43961. _context15.prev = 0;
  43962. _context15.next = 3;
  43963. return this.$app.store.get('metadata');
  43964. case 3:
  43965. _metadata6 = _context15.sent;
  43966. data = null;
  43967. if (!(this.mode === 'view')) {
  43968. _context15.next = 15;
  43969. break;
  43970. }
  43971. if (_metadata6.links) {
  43972. _context15.next = 8;
  43973. break;
  43974. }
  43975. return _context15.abrupt("return");
  43976. case 8:
  43977. _context15.next = 10;
  43978. return http.get(this.getUserResourceURL("links.json"));
  43979. case 10:
  43980. data = _context15.sent;
  43981. data = data.filter(function (tag) {
  43982. return _this6.$app.core.get('Player').model.panos.get(tag.nearestPano);
  43983. }); // 过滤掉无效Pano
  43984. this.$app.store.set('links', data);
  43985. _context15.next = 20;
  43986. break;
  43987. case 15:
  43988. _context15.next = 17;
  43989. return this.$app.remote_editor.linkPan_list({
  43990. num: this.num
  43991. });
  43992. case 17:
  43993. data = _context15.sent;
  43994. data.data.tags = data.data.tags.filter(function (tag) {
  43995. return _this6.$app.core.get('Player').model.panos.get(tag.nearestPano);
  43996. }); // 过滤掉无效Pano
  43997. this.$app.store.set('links', data.data);
  43998. case 20:
  43999. _context15.next = 25;
  44000. break;
  44001. case 22:
  44002. _context15.prev = 22;
  44003. _context15.t0 = _context15["catch"](0);
  44004. logger$1.error('loaded [tour] error', _context15.t0);
  44005. case 25:
  44006. case "end":
  44007. return _context15.stop();
  44008. }
  44009. }
  44010. }, _callee15, this, [[0, 22]]);
  44011. }));
  44012. function links() {
  44013. return _links.apply(this, arguments);
  44014. }
  44015. return links;
  44016. }()
  44017. }, {
  44018. key: "cameras",
  44019. value: function () {
  44020. var _cameras = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee16() {
  44021. var _metadata7, data;
  44022. return regenerator.wrap(function _callee16$(_context16) {
  44023. while (1) {
  44024. switch (_context16.prev = _context16.next) {
  44025. case 0:
  44026. _context16.prev = 0;
  44027. _context16.next = 3;
  44028. return this.$app.store.get('metadata');
  44029. case 3:
  44030. _metadata7 = _context16.sent;
  44031. if (_metadata7.surveillances) {
  44032. _context16.next = 6;
  44033. break;
  44034. }
  44035. return _context16.abrupt("return");
  44036. case 6:
  44037. data = null;
  44038. if (!(this.mode === 'view')) {
  44039. _context16.next = 14;
  44040. break;
  44041. }
  44042. _context16.next = 10;
  44043. return http.get(this.getUserResourceURL("surveillance.json"));
  44044. case 10:
  44045. data = _context16.sent;
  44046. this.$app.store.set('cameras', data);
  44047. _context16.next = 18;
  44048. break;
  44049. case 14:
  44050. _context16.next = 16;
  44051. return this.$app.remote_editor.surveillance_list({
  44052. num: this.num
  44053. });
  44054. case 16:
  44055. data = _context16.sent;
  44056. this.$app.store.set('cameras', data.data);
  44057. case 18:
  44058. _context16.next = 23;
  44059. break;
  44060. case 20:
  44061. _context16.prev = 20;
  44062. _context16.t0 = _context16["catch"](0);
  44063. logger$1.error('loaded [cameras] error', _context16.t0);
  44064. case 23:
  44065. case "end":
  44066. return _context16.stop();
  44067. }
  44068. }
  44069. }, _callee16, this, [[0, 20]]);
  44070. }));
  44071. function cameras() {
  44072. return _cameras.apply(this, arguments);
  44073. }
  44074. return cameras;
  44075. }()
  44076. }, {
  44077. key: "sceneDraw",
  44078. value: function () {
  44079. var _sceneDraw = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee17() {
  44080. var _metadata8, data;
  44081. return regenerator.wrap(function _callee17$(_context17) {
  44082. while (1) {
  44083. switch (_context17.prev = _context17.next) {
  44084. case 0:
  44085. _context17.prev = 0;
  44086. _context17.next = 3;
  44087. return this.$app.store.get('metadata');
  44088. case 3:
  44089. _metadata8 = _context17.sent;
  44090. if (_metadata8.sceneDraw) {
  44091. _context17.next = 6;
  44092. break;
  44093. }
  44094. return _context17.abrupt("return");
  44095. case 6:
  44096. data = null;
  44097. if (!(this.mode === 'view')) {
  44098. _context17.next = 14;
  44099. break;
  44100. }
  44101. _context17.next = 10;
  44102. return http.get(this.getUserResourceURL("sceneDraw.json"));
  44103. case 10:
  44104. data = _context17.sent;
  44105. this.$app.store.set('sceneDraw', data);
  44106. _context17.next = 18;
  44107. break;
  44108. case 14:
  44109. _context17.next = 16;
  44110. return this.$app.remote_editor.sceneDraw_list({
  44111. num: this.num
  44112. });
  44113. case 16:
  44114. data = _context17.sent;
  44115. this.$app.store.set('sceneDraw', data.data);
  44116. case 18:
  44117. _context17.next = 23;
  44118. break;
  44119. case 20:
  44120. _context17.prev = 20;
  44121. _context17.t0 = _context17["catch"](0);
  44122. logger$1.error('loaded [sceneDraw] error', _context17.t0);
  44123. case 23:
  44124. case "end":
  44125. return _context17.stop();
  44126. }
  44127. }
  44128. }, _callee17, this, [[0, 20]]);
  44129. }));
  44130. function sceneDraw() {
  44131. return _sceneDraw.apply(this, arguments);
  44132. }
  44133. return sceneDraw;
  44134. }()
  44135. }, {
  44136. key: "mosaics",
  44137. value: function () {
  44138. var _mosaics = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee18() {
  44139. var _metadata9, data;
  44140. return regenerator.wrap(function _callee18$(_context18) {
  44141. while (1) {
  44142. switch (_context18.prev = _context18.next) {
  44143. case 0:
  44144. _context18.prev = 0;
  44145. _context18.next = 3;
  44146. return this.$app.store.get('metadata');
  44147. case 3:
  44148. _metadata9 = _context18.sent;
  44149. if (_metadata9.mosaic) {
  44150. _context18.next = 6;
  44151. break;
  44152. }
  44153. return _context18.abrupt("return");
  44154. case 6:
  44155. data = null;
  44156. if (!(this.mode === 'view')) {
  44157. _context18.next = 14;
  44158. break;
  44159. }
  44160. _context18.next = 10;
  44161. return http.get(this.getUserResourceURL("mosaic.json"));
  44162. case 10:
  44163. data = _context18.sent;
  44164. this.$app.store.set('mosaics', data);
  44165. _context18.next = 18;
  44166. break;
  44167. case 14:
  44168. _context18.next = 16;
  44169. return this.$app.remote_editor.mosaics_list({
  44170. num: this.num
  44171. });
  44172. case 16:
  44173. data = _context18.sent;
  44174. this.$app.store.set('mosaics', data.data);
  44175. case 18:
  44176. _context18.next = 23;
  44177. break;
  44178. case 20:
  44179. _context18.prev = 20;
  44180. _context18.t0 = _context18["catch"](0);
  44181. logger$1.error('loaded [tour] error', _context18.t0);
  44182. case 23:
  44183. case "end":
  44184. return _context18.stop();
  44185. }
  44186. }
  44187. }, _callee18, this, [[0, 20]]);
  44188. }));
  44189. function mosaics() {
  44190. return _mosaics.apply(this, arguments);
  44191. }
  44192. return mosaics;
  44193. }()
  44194. }, {
  44195. key: "filters",
  44196. value: function () {
  44197. var _filters = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee19() {
  44198. var _metadata10, data;
  44199. return regenerator.wrap(function _callee19$(_context19) {
  44200. while (1) {
  44201. switch (_context19.prev = _context19.next) {
  44202. case 0:
  44203. _context19.prev = 0;
  44204. _context19.next = 3;
  44205. return this.$app.store.get('metadata');
  44206. case 3:
  44207. _metadata10 = _context19.sent;
  44208. if (_metadata10.filters) {
  44209. _context19.next = 6;
  44210. break;
  44211. }
  44212. return _context19.abrupt("return");
  44213. case 6:
  44214. data = null;
  44215. if (!(this.mode === 'view')) {
  44216. _context19.next = 14;
  44217. break;
  44218. }
  44219. _context19.next = 10;
  44220. return http.get(this.getUserResourceURL("filter.json"));
  44221. case 10:
  44222. data = _context19.sent;
  44223. this.$app.store.set('filters', data);
  44224. _context19.next = 18;
  44225. break;
  44226. case 14:
  44227. _context19.next = 16;
  44228. return this.$app.remote_editor.filter_list({
  44229. num: this.num
  44230. });
  44231. case 16:
  44232. data = _context19.sent;
  44233. this.$app.store.set('filters', data.data);
  44234. case 18:
  44235. _context19.next = 23;
  44236. break;
  44237. case 20:
  44238. _context19.prev = 20;
  44239. _context19.t0 = _context19["catch"](0);
  44240. logger$1.error('loaded [tour] error', _context19.t0);
  44241. case 23:
  44242. case "end":
  44243. return _context19.stop();
  44244. }
  44245. }
  44246. }, _callee19, this, [[0, 20]]);
  44247. }));
  44248. function filters() {
  44249. return _filters.apply(this, arguments);
  44250. }
  44251. return filters;
  44252. }()
  44253. /**
  44254. * 获取场景相关的资源图片
  44255. * @param {*} path
  44256. * @returns
  44257. */
  44258. }, {
  44259. key: "getImage",
  44260. value: function () {
  44261. var _getImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee20(path) {
  44262. var data;
  44263. return regenerator.wrap(function _callee20$(_context20) {
  44264. while (1) {
  44265. switch (_context20.prev = _context20.next) {
  44266. case 0:
  44267. _context20.next = 2;
  44268. return http.getImage("".concat(this.$app.config.resource).concat(path));
  44269. case 2:
  44270. data = _context20.sent;
  44271. this.$app.store.set(path, data);
  44272. return _context20.abrupt("return", data);
  44273. case 5:
  44274. case "end":
  44275. return _context20.stop();
  44276. }
  44277. }
  44278. }, _callee20, this);
  44279. }));
  44280. function getImage(_x2) {
  44281. return _getImage.apply(this, arguments);
  44282. }
  44283. return getImage;
  44284. }()
  44285. }, {
  44286. key: "getUserImage",
  44287. value: function () {
  44288. var _getUserImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee21(path) {
  44289. var data;
  44290. return regenerator.wrap(function _callee21$(_context21) {
  44291. while (1) {
  44292. switch (_context21.prev = _context21.next) {
  44293. case 0:
  44294. data = http.getImage(this.getUserResourceURL(path));
  44295. this.$app.store.set(path, data);
  44296. return _context21.abrupt("return", data);
  44297. case 3:
  44298. case "end":
  44299. return _context21.stop();
  44300. }
  44301. }
  44302. }, _callee21, this);
  44303. }));
  44304. function getUserImage(_x3) {
  44305. return _getUserImage.apply(this, arguments);
  44306. }
  44307. return getUserImage;
  44308. }()
  44309. /**
  44310. * 获取SDK相关的资源图片
  44311. * @param {*} path
  44312. * @returns
  44313. */
  44314. }, {
  44315. key: "getAppImage",
  44316. value: function () {
  44317. var _getAppImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee22(path) {
  44318. var data;
  44319. return regenerator.wrap(function _callee22$(_context22) {
  44320. while (1) {
  44321. switch (_context22.prev = _context22.next) {
  44322. case 0:
  44323. _context22.next = 2;
  44324. return http.getImage(this.base(path));
  44325. case 2:
  44326. data = _context22.sent;
  44327. this.$app.store.set(path, data);
  44328. return _context22.abrupt("return", data);
  44329. case 5:
  44330. case "end":
  44331. return _context22.stop();
  44332. }
  44333. }
  44334. }, _callee22, this);
  44335. }));
  44336. function getAppImage(_x4) {
  44337. return _getAppImage.apply(this, arguments);
  44338. }
  44339. return getAppImage;
  44340. }()
  44341. }, {
  44342. key: "getAppURL",
  44343. value: function getAppURL(url) {
  44344. return this.base(url);
  44345. }
  44346. /**
  44347. * 获取服务器资源
  44348. */
  44349. }, {
  44350. key: "getServerURL",
  44351. value: function getServerURL(url) {
  44352. return this.$app.config.server + url;
  44353. }
  44354. /**
  44355. * 获取场景资源地址
  44356. * @param {*} url
  44357. * @returns
  44358. */
  44359. }, {
  44360. key: "getResourceURL",
  44361. value: function getResourceURL(url) {
  44362. return this.$app.config.resource + url.replace(/\{num\}/g, this.num);
  44363. }
  44364. /**
  44365. * 获取用户资源地址
  44366. * @param {*} url
  44367. * @returns
  44368. */
  44369. }, {
  44370. key: "getUserResourceURL",
  44371. value: function getUserResourceURL(url, clearCache, now) {
  44372. if (!url || !url.trim()) {
  44373. return url;
  44374. }
  44375. if (url.indexOf('data:image') === 0 || url.indexOf('blob:') === 0 || url.indexOf('http') === 0 || url.indexOf('file') === 0) {
  44376. return url;
  44377. }
  44378. if (clearCache) {
  44379. this.reload = true;
  44380. }
  44381. var full;
  44382. if (url.indexOf('?t=') != -1) {
  44383. full = this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/").concat(url);
  44384. } else {
  44385. if (now) {
  44386. //防止热点icon第一次查看抖动问题
  44387. full = this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/").concat(url, "?_=").concat(this.nowTime);
  44388. } else {
  44389. full = this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/").concat(url, "?_=").concat(this.time);
  44390. }
  44391. var search = url.split('?')[1];
  44392. if (search) {
  44393. full += '&' + search;
  44394. }
  44395. }
  44396. return full;
  44397. }
  44398. /**
  44399. * 获取用户空间模型资源地址
  44400. * @param {*} url
  44401. * @returns
  44402. */
  44403. }, {
  44404. key: "getUserModelResourceURL",
  44405. value: function getUserModelResourceURL(url, clearCache) {
  44406. if (!url || !url.trim()) {
  44407. return url;
  44408. }
  44409. if (url.indexOf('blob:') === 0 || url.indexOf('http') === 0 || url.indexOf('file') === 0) {
  44410. return url;
  44411. }
  44412. if (clearCache) {
  44413. this.reload = true;
  44414. }
  44415. return this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/boxModels/").concat(url, "?_=").concat(this.time);
  44416. }
  44417. /**
  44418. * 获取导览视频上传oss地址
  44419. * @param {*} url
  44420. * @returns
  44421. */
  44422. }, {
  44423. key: "getTourVideoURL",
  44424. value: function getTourVideoURL(url, clearCache) {
  44425. if (clearCache) {
  44426. this.reload = true;
  44427. }
  44428. return this.$app.config.resource + "".concat(url, "?_=").concat(this.time);
  44429. }
  44430. /**
  44431. * 获取展示资源地址
  44432. * @param {*} url
  44433. * @returns
  44434. */
  44435. }, {
  44436. key: "getViewResourceURL",
  44437. value: function getViewResourceURL(url) {
  44438. return this.$app.config.resource + "scene_view_data/".concat(this.num, "/").concat(url);
  44439. }
  44440. /**
  44441. * 获取展示数据地址
  44442. * @param {*} url
  44443. * @returns
  44444. */
  44445. }, {
  44446. key: "getViewDataURL",
  44447. value: function getViewDataURL(url) {
  44448. return this.$app.config.resource + "scene_view_data/".concat(this.num, "/data/").concat(url, "?_=").concat(this.version);
  44449. }
  44450. /**
  44451. * 获取编辑数据地址
  44452. * @param {*} url
  44453. * @returns
  44454. */
  44455. }, {
  44456. key: "getEditDataURL",
  44457. value: function getEditDataURL(url) {
  44458. return this.$app.config.resource + "scene_edit_data/".concat(this.num, "/data/").concat(url, "?_=").concat(this.version);
  44459. }
  44460. /**
  44461. * 获取展示全景图地址
  44462. * @param {*} url
  44463. * @returns
  44464. */
  44465. }, {
  44466. key: "getViewImagesURL",
  44467. value: function getViewImagesURL(url) {
  44468. if (url.indexOf('&_=') !== -1) {
  44469. return url;
  44470. }
  44471. var version = url.indexOf('/panorama/') !== -1 ? this.linkVersion : this.imageVersion;
  44472. if (url.indexOf('?') !== -1) {
  44473. return this.$app.config.resource + "scene_view_data/".concat(this.num, "/images/").concat(url, "&_=").concat(version);
  44474. }
  44475. return this.$app.config.resource + "scene_view_data/".concat(this.num, "/images/").concat(url, "?_=").concat(version);
  44476. }
  44477. /**
  44478. * 获取编辑页全景图地址
  44479. * @param {*} url
  44480. * @returns
  44481. */
  44482. }, {
  44483. key: "getUserImagesURL",
  44484. value: function getUserImagesURL(url) {
  44485. var str;
  44486. if (this.mode == 'view') {
  44487. str = 'scene_view_data';
  44488. } else {
  44489. str = 'scene_edit_data';
  44490. }
  44491. if (url.indexOf('&_=') !== -1) {
  44492. return url;
  44493. } else if (url.indexOf('?') !== -1) {
  44494. return this.$app.config.resource + "".concat(str, "/").concat(this.num, "/images/").concat(url, "&_=").concat(this.version);
  44495. }
  44496. return this.$app.config.resource + "".concat(str, "/").concat(this.num, "/images/").concat(url, "?_=").concat(this.version);
  44497. }
  44498. }]);
  44499. return Resource;
  44500. }();
  44501. });
  44502. /**
  44503. * Make a map and return a function for checking if a key
  44504. * is in that map.
  44505. * IMPORTANT: all calls of this function must be prefixed with
  44506. * \/\*#\_\_PURE\_\_\*\/
  44507. * So that rollup can tree-shake them if necessary.
  44508. */
  44509. function makeMap(str, expectsLowerCase) {
  44510. var map = Object.create(null);
  44511. var list = str.split(',');
  44512. for (var i = 0; i < list.length; i++) {
  44513. map[list[i]] = true;
  44514. }
  44515. return expectsLowerCase ? function (val) {
  44516. return !!map[val.toLowerCase()];
  44517. } : function (val) {
  44518. return !!map[val];
  44519. };
  44520. }
  44521. Object.freeze({}) ;
  44522. Object.freeze([]) ;
  44523. var extend = Object.assign;
  44524. var hasOwnProperty = Object.prototype.hasOwnProperty;
  44525. var hasOwn = function hasOwn(val, key) {
  44526. return hasOwnProperty.call(val, key);
  44527. };
  44528. var isArray$1 = Array.isArray;
  44529. var isMap = function isMap(val) {
  44530. return toTypeString(val) === '[object Map]';
  44531. };
  44532. var isString$1 = function isString(val) {
  44533. return typeof val === 'string';
  44534. };
  44535. var isSymbol = function isSymbol(val) {
  44536. return typeof val === 'symbol';
  44537. };
  44538. var isObject$1 = function isObject(val) {
  44539. return val !== null && typeof val === 'object';
  44540. };
  44541. var objectToString = Object.prototype.toString;
  44542. var toTypeString = function toTypeString(value) {
  44543. return objectToString.call(value);
  44544. };
  44545. var toRawType = function toRawType(value) {
  44546. // extract "RawType" from strings like "[object RawType]"
  44547. return toTypeString(value).slice(8, -1);
  44548. };
  44549. var isIntegerKey = function isIntegerKey(key) {
  44550. return isString$1(key) && key !== 'NaN' && key[0] !== '-' && '' + parseInt(key, 10) === key;
  44551. };
  44552. var cacheStringFunction$1 = function cacheStringFunction(fn) {
  44553. var cache = Object.create(null);
  44554. return function (str) {
  44555. var hit = cache[str];
  44556. return hit || (cache[str] = fn(str));
  44557. };
  44558. };
  44559. /**
  44560. * @private
  44561. */
  44562. var capitalize = cacheStringFunction$1(function (str) {
  44563. return str.charAt(0).toUpperCase() + str.slice(1);
  44564. });
  44565. var hasChanged = function hasChanged(value, oldValue) {
  44566. return !Object.is(value, oldValue);
  44567. };
  44568. function _createForOfIteratorHelper$2(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$2(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  44569. function _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$2(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$2(o, minLen); }
  44570. function _arrayLikeToArray$2(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  44571. var activeEffectScope;
  44572. function recordEffectScope(effect) {
  44573. var scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : activeEffectScope;
  44574. if (scope && scope.active) {
  44575. scope.effects.push(effect);
  44576. }
  44577. }
  44578. var createDep = function createDep(effects) {
  44579. var dep = new Set(effects);
  44580. dep.w = 0;
  44581. dep.n = 0;
  44582. return dep;
  44583. };
  44584. var wasTracked = function wasTracked(dep) {
  44585. return (dep.w & trackOpBit) > 0;
  44586. };
  44587. var newTracked = function newTracked(dep) {
  44588. return (dep.n & trackOpBit) > 0;
  44589. };
  44590. var initDepMarkers = function initDepMarkers(_ref) {
  44591. var deps = _ref.deps;
  44592. if (deps.length) {
  44593. for (var i = 0; i < deps.length; i++) {
  44594. deps[i].w |= trackOpBit; // set was tracked
  44595. }
  44596. }
  44597. };
  44598. var finalizeDepMarkers = function finalizeDepMarkers(effect) {
  44599. var deps = effect.deps;
  44600. if (deps.length) {
  44601. var ptr = 0;
  44602. for (var i = 0; i < deps.length; i++) {
  44603. var dep = deps[i];
  44604. if (wasTracked(dep) && !newTracked(dep)) {
  44605. dep.delete(effect);
  44606. } else {
  44607. deps[ptr++] = dep;
  44608. } // clear bits
  44609. dep.w &= ~trackOpBit;
  44610. dep.n &= ~trackOpBit;
  44611. }
  44612. deps.length = ptr;
  44613. }
  44614. };
  44615. var targetMap = new WeakMap(); // The number of effects currently being tracked recursively.
  44616. var effectTrackDepth = 0;
  44617. var trackOpBit = 1;
  44618. /**
  44619. * The bitwise track markers support at most 30 levels of recursion.
  44620. * This value is chosen to enable modern JS engines to use a SMI on all platforms.
  44621. * When recursion depth is greater, fall back to using a full cleanup.
  44622. */
  44623. var maxMarkerBits = 30;
  44624. var activeEffect;
  44625. var ITERATE_KEY = Symbol('iterate' );
  44626. var MAP_KEY_ITERATE_KEY = Symbol('Map key iterate' );
  44627. var ReactiveEffect = /*#__PURE__*/function () {
  44628. function ReactiveEffect(fn) {
  44629. var scheduler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  44630. var scope = arguments.length > 2 ? arguments[2] : undefined;
  44631. _classCallCheck(this, ReactiveEffect);
  44632. this.fn = fn;
  44633. this.scheduler = scheduler;
  44634. this.active = true;
  44635. this.deps = [];
  44636. this.parent = undefined;
  44637. recordEffectScope(this, scope);
  44638. }
  44639. _createClass(ReactiveEffect, [{
  44640. key: "run",
  44641. value: function run() {
  44642. if (!this.active) {
  44643. return this.fn();
  44644. }
  44645. var parent = activeEffect;
  44646. var lastShouldTrack = shouldTrack;
  44647. while (parent) {
  44648. if (parent === this) {
  44649. return;
  44650. }
  44651. parent = parent.parent;
  44652. }
  44653. try {
  44654. this.parent = activeEffect;
  44655. activeEffect = this;
  44656. shouldTrack = true;
  44657. trackOpBit = 1 << ++effectTrackDepth;
  44658. if (effectTrackDepth <= maxMarkerBits) {
  44659. initDepMarkers(this);
  44660. } else {
  44661. cleanupEffect(this);
  44662. }
  44663. return this.fn();
  44664. } finally {
  44665. if (effectTrackDepth <= maxMarkerBits) {
  44666. finalizeDepMarkers(this);
  44667. }
  44668. trackOpBit = 1 << --effectTrackDepth;
  44669. activeEffect = this.parent;
  44670. shouldTrack = lastShouldTrack;
  44671. this.parent = undefined;
  44672. }
  44673. }
  44674. }, {
  44675. key: "stop",
  44676. value: function stop() {
  44677. if (this.active) {
  44678. cleanupEffect(this);
  44679. if (this.onStop) {
  44680. this.onStop();
  44681. }
  44682. this.active = false;
  44683. }
  44684. }
  44685. }]);
  44686. return ReactiveEffect;
  44687. }();
  44688. function cleanupEffect(effect) {
  44689. var deps = effect.deps;
  44690. if (deps.length) {
  44691. for (var i = 0; i < deps.length; i++) {
  44692. deps[i].delete(effect);
  44693. }
  44694. deps.length = 0;
  44695. }
  44696. }
  44697. function effect$1(fn, options) {
  44698. if (fn.effect) {
  44699. fn = fn.effect.fn;
  44700. }
  44701. var _effect = new ReactiveEffect(fn);
  44702. if (options) {
  44703. extend(_effect, options);
  44704. if (options.scope) recordEffectScope(_effect, options.scope);
  44705. }
  44706. if (!options || !options.lazy) {
  44707. _effect.run();
  44708. }
  44709. var runner = _effect.run.bind(_effect);
  44710. runner.effect = _effect;
  44711. return runner;
  44712. }
  44713. function stop(runner) {
  44714. runner.effect.stop();
  44715. }
  44716. var shouldTrack = true;
  44717. var trackStack = [];
  44718. function pauseTracking() {
  44719. trackStack.push(shouldTrack);
  44720. shouldTrack = false;
  44721. }
  44722. function resetTracking() {
  44723. var last = trackStack.pop();
  44724. shouldTrack = last === undefined ? true : last;
  44725. }
  44726. function track(target, type, key) {
  44727. if (shouldTrack && activeEffect) {
  44728. var depsMap = targetMap.get(target);
  44729. if (!depsMap) {
  44730. targetMap.set(target, depsMap = new Map());
  44731. }
  44732. var dep = depsMap.get(key);
  44733. if (!dep) {
  44734. depsMap.set(key, dep = createDep());
  44735. }
  44736. var eventInfo = {
  44737. effect: activeEffect,
  44738. target,
  44739. type,
  44740. key
  44741. } ;
  44742. trackEffects(dep, eventInfo);
  44743. }
  44744. }
  44745. function trackEffects(dep, debuggerEventExtraInfo) {
  44746. var shouldTrack = false;
  44747. if (effectTrackDepth <= maxMarkerBits) {
  44748. if (!newTracked(dep)) {
  44749. dep.n |= trackOpBit; // set newly tracked
  44750. shouldTrack = !wasTracked(dep);
  44751. }
  44752. } else {
  44753. // Full cleanup mode.
  44754. shouldTrack = !dep.has(activeEffect);
  44755. }
  44756. if (shouldTrack) {
  44757. dep.add(activeEffect);
  44758. activeEffect.deps.push(dep);
  44759. if (activeEffect.onTrack) {
  44760. activeEffect.onTrack(Object.assign({
  44761. effect: activeEffect
  44762. }, debuggerEventExtraInfo));
  44763. }
  44764. }
  44765. }
  44766. function trigger$1(target, type, key, newValue, oldValue, oldTarget) {
  44767. var depsMap = targetMap.get(target);
  44768. if (!depsMap) {
  44769. // never been tracked
  44770. return;
  44771. }
  44772. var deps = [];
  44773. if (type === "clear"
  44774. /* CLEAR */
  44775. ) {
  44776. // collection being cleared
  44777. // trigger all effects for target
  44778. deps = _toConsumableArray(depsMap.values());
  44779. } else if (key === 'length' && isArray$1(target)) {
  44780. depsMap.forEach(function (dep, key) {
  44781. if (key === 'length' || key >= newValue) {
  44782. deps.push(dep);
  44783. }
  44784. });
  44785. } else {
  44786. // schedule runs for SET | ADD | DELETE
  44787. if (key !== void 0) {
  44788. deps.push(depsMap.get(key));
  44789. } // also run for iteration key on ADD | DELETE | Map.SET
  44790. switch (type) {
  44791. case "add"
  44792. /* ADD */
  44793. :
  44794. if (!isArray$1(target)) {
  44795. deps.push(depsMap.get(ITERATE_KEY));
  44796. if (isMap(target)) {
  44797. deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
  44798. }
  44799. } else if (isIntegerKey(key)) {
  44800. // new index added to array -> length changes
  44801. deps.push(depsMap.get('length'));
  44802. }
  44803. break;
  44804. case "delete"
  44805. /* DELETE */
  44806. :
  44807. if (!isArray$1(target)) {
  44808. deps.push(depsMap.get(ITERATE_KEY));
  44809. if (isMap(target)) {
  44810. deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
  44811. }
  44812. }
  44813. break;
  44814. case "set"
  44815. /* SET */
  44816. :
  44817. if (isMap(target)) {
  44818. deps.push(depsMap.get(ITERATE_KEY));
  44819. }
  44820. break;
  44821. }
  44822. }
  44823. var eventInfo = {
  44824. target,
  44825. type,
  44826. key,
  44827. newValue,
  44828. oldValue,
  44829. oldTarget
  44830. } ;
  44831. if (deps.length === 1) {
  44832. if (deps[0]) {
  44833. {
  44834. triggerEffects(deps[0], eventInfo);
  44835. }
  44836. }
  44837. } else {
  44838. var effects = [];
  44839. var _iterator = _createForOfIteratorHelper$2(deps),
  44840. _step;
  44841. try {
  44842. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  44843. var dep = _step.value;
  44844. if (dep) {
  44845. effects.push.apply(effects, _toConsumableArray(dep));
  44846. }
  44847. }
  44848. } catch (err) {
  44849. _iterator.e(err);
  44850. } finally {
  44851. _iterator.f();
  44852. }
  44853. {
  44854. triggerEffects(createDep(effects), eventInfo);
  44855. }
  44856. }
  44857. }
  44858. function triggerEffects(dep, debuggerEventExtraInfo) {
  44859. // spread into array for stabilization
  44860. var _iterator2 = _createForOfIteratorHelper$2(isArray$1(dep) ? dep : _toConsumableArray(dep)),
  44861. _step2;
  44862. try {
  44863. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  44864. var _effect2 = _step2.value;
  44865. if (_effect2 !== activeEffect || _effect2.allowRecurse) {
  44866. if ("development" !== 'production' && _effect2.onTrigger) {
  44867. _effect2.onTrigger(extend({
  44868. effect: _effect2
  44869. }, debuggerEventExtraInfo));
  44870. }
  44871. if (_effect2.scheduler) {
  44872. _effect2.scheduler();
  44873. } else {
  44874. _effect2.run();
  44875. }
  44876. }
  44877. }
  44878. } catch (err) {
  44879. _iterator2.e(err);
  44880. } finally {
  44881. _iterator2.f();
  44882. }
  44883. }
  44884. var isNonTrackableKeys = /*#__PURE__*/makeMap("__proto__,__v_isRef,__isVue");
  44885. var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map(function (key) {
  44886. return Symbol[key];
  44887. }).filter(isSymbol));
  44888. var get = /*#__PURE__*/createGetter();
  44889. var readonlyGet = /*#__PURE__*/createGetter(true);
  44890. var arrayInstrumentations = /*#__PURE__*/createArrayInstrumentations();
  44891. function createArrayInstrumentations() {
  44892. var instrumentations = {};
  44893. ['includes', 'indexOf', 'lastIndexOf'].forEach(function (key) {
  44894. instrumentations[key] = function () {
  44895. var arr = toRaw(this);
  44896. for (var i = 0, l = this.length; i < l; i++) {
  44897. track(arr, "get"
  44898. /* GET */
  44899. , i + '');
  44900. } // we run the method using the original args first (which may be reactive)
  44901. for (var _len2 = arguments.length, args = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {
  44902. args[_key3] = arguments[_key3];
  44903. }
  44904. var res = arr[key].apply(arr, args);
  44905. if (res === -1 || res === false) {
  44906. // if that didn't work, run it again using raw values.
  44907. return arr[key].apply(arr, _toConsumableArray(args.map(toRaw)));
  44908. } else {
  44909. return res;
  44910. }
  44911. };
  44912. });
  44913. ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(function (key) {
  44914. instrumentations[key] = function () {
  44915. pauseTracking();
  44916. for (var _len3 = arguments.length, args = new Array(_len3), _key4 = 0; _key4 < _len3; _key4++) {
  44917. args[_key4] = arguments[_key4];
  44918. }
  44919. var res = toRaw(this)[key].apply(this, args);
  44920. resetTracking();
  44921. return res;
  44922. };
  44923. });
  44924. return instrumentations;
  44925. }
  44926. function createGetter() {
  44927. var isReadonly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  44928. var shallow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  44929. return function get(target, key, receiver) {
  44930. if (key === "__v_isReactive"
  44931. /* IS_REACTIVE */
  44932. ) {
  44933. return !isReadonly;
  44934. } else if (key === "__v_isReadonly"
  44935. /* IS_READONLY */
  44936. ) {
  44937. return isReadonly;
  44938. } else if (key === "__v_isShallow"
  44939. /* IS_SHALLOW */
  44940. ) {
  44941. return shallow;
  44942. } else if (key === "__v_raw"
  44943. /* RAW */
  44944. && receiver === (isReadonly ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {
  44945. return target;
  44946. }
  44947. var targetIsArray = isArray$1(target);
  44948. if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {
  44949. return Reflect.get(arrayInstrumentations, key, receiver);
  44950. }
  44951. var res = Reflect.get(target, key, receiver);
  44952. if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
  44953. return res;
  44954. }
  44955. if (!isReadonly) {
  44956. track(target, "get"
  44957. /* GET */
  44958. , key);
  44959. }
  44960. if (shallow) {
  44961. return res;
  44962. }
  44963. if (isRef(res)) {
  44964. // ref unwrapping - does not apply for Array + integer key.
  44965. var shouldUnwrap = !targetIsArray || !isIntegerKey(key);
  44966. return shouldUnwrap ? res.value : res;
  44967. }
  44968. if (isObject$1(res)) {
  44969. // Convert returned value into a proxy as well. we do the isObject check
  44970. // here to avoid invalid value warning. Also need to lazy access readonly
  44971. // and reactive here to avoid circular dependency.
  44972. return isReadonly ? readonly(res) : reactive(res);
  44973. }
  44974. return res;
  44975. };
  44976. }
  44977. var set = /*#__PURE__*/createSetter();
  44978. function createSetter() {
  44979. var shallow = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  44980. return function set(target, key, value, receiver) {
  44981. var oldValue = target[key];
  44982. if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
  44983. return false;
  44984. }
  44985. if (!shallow && !isReadonly(value)) {
  44986. if (!isShallow(value)) {
  44987. value = toRaw(value);
  44988. oldValue = toRaw(oldValue);
  44989. }
  44990. if (!isArray$1(target) && isRef(oldValue) && !isRef(value)) {
  44991. oldValue.value = value;
  44992. return true;
  44993. }
  44994. }
  44995. var hadKey = isArray$1(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
  44996. var result = Reflect.set(target, key, value, receiver); // don't trigger if target is something up in the prototype chain of original
  44997. if (target === toRaw(receiver)) {
  44998. if (!hadKey) {
  44999. trigger$1(target, "add"
  45000. /* ADD */
  45001. , key, value);
  45002. } else if (hasChanged(value, oldValue)) {
  45003. trigger$1(target, "set"
  45004. /* SET */
  45005. , key, value, oldValue);
  45006. }
  45007. }
  45008. return result;
  45009. };
  45010. }
  45011. function deleteProperty(target, key) {
  45012. var hadKey = hasOwn(target, key);
  45013. var oldValue = target[key];
  45014. var result = Reflect.deleteProperty(target, key);
  45015. if (result && hadKey) {
  45016. trigger$1(target, "delete"
  45017. /* DELETE */
  45018. , key, undefined, oldValue);
  45019. }
  45020. return result;
  45021. }
  45022. function has(target, key) {
  45023. var result = Reflect.has(target, key);
  45024. if (!isSymbol(key) || !builtInSymbols.has(key)) {
  45025. track(target, "has"
  45026. /* HAS */
  45027. , key);
  45028. }
  45029. return result;
  45030. }
  45031. function ownKeys$3(target) {
  45032. track(target, "iterate"
  45033. /* ITERATE */
  45034. , isArray$1(target) ? 'length' : ITERATE_KEY);
  45035. return Reflect.ownKeys(target);
  45036. }
  45037. var mutableHandlers = {
  45038. get,
  45039. set,
  45040. deleteProperty,
  45041. has,
  45042. ownKeys: ownKeys$3
  45043. };
  45044. var readonlyHandlers = {
  45045. get: readonlyGet,
  45046. set(target, key) {
  45047. {
  45048. console.warn("Set operation on key \"".concat(String(key), "\" failed: target is readonly."), target);
  45049. }
  45050. return true;
  45051. },
  45052. deleteProperty(target, key) {
  45053. {
  45054. console.warn("Delete operation on key \"".concat(String(key), "\" failed: target is readonly."), target);
  45055. }
  45056. return true;
  45057. }
  45058. };
  45059. var toShallow = function toShallow(value) {
  45060. return value;
  45061. };
  45062. var getProto = function getProto(v) {
  45063. return Reflect.getPrototypeOf(v);
  45064. };
  45065. function get$1(target, key) {
  45066. var isReadonly = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  45067. var isShallow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  45068. // #1772: readonly(reactive(Map)) should return readonly + reactive version
  45069. // of the value
  45070. target = target["__v_raw"
  45071. /* RAW */
  45072. ];
  45073. var rawTarget = toRaw(target);
  45074. var rawKey = toRaw(key);
  45075. if (key !== rawKey) {
  45076. !isReadonly && track(rawTarget, "get"
  45077. /* GET */
  45078. , key);
  45079. }
  45080. !isReadonly && track(rawTarget, "get"
  45081. /* GET */
  45082. , rawKey);
  45083. var _getProto = getProto(rawTarget),
  45084. has = _getProto.has;
  45085. var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  45086. if (has.call(rawTarget, key)) {
  45087. return wrap(target.get(key));
  45088. } else if (has.call(rawTarget, rawKey)) {
  45089. return wrap(target.get(rawKey));
  45090. } else if (target !== rawTarget) {
  45091. // #3602 readonly(reactive(Map))
  45092. // ensure that the nested reactive `Map` can do tracking for itself
  45093. target.get(key);
  45094. }
  45095. }
  45096. function has$1(key) {
  45097. var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  45098. var target = this["__v_raw"
  45099. /* RAW */
  45100. ];
  45101. var rawTarget = toRaw(target);
  45102. var rawKey = toRaw(key);
  45103. if (key !== rawKey) {
  45104. !isReadonly && track(rawTarget, "has"
  45105. /* HAS */
  45106. , key);
  45107. }
  45108. !isReadonly && track(rawTarget, "has"
  45109. /* HAS */
  45110. , rawKey);
  45111. return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
  45112. }
  45113. function size$2(target) {
  45114. var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  45115. target = target["__v_raw"
  45116. /* RAW */
  45117. ];
  45118. !isReadonly && track(toRaw(target), "iterate"
  45119. /* ITERATE */
  45120. , ITERATE_KEY);
  45121. return Reflect.get(target, 'size', target);
  45122. }
  45123. function add(value) {
  45124. value = toRaw(value);
  45125. var target = toRaw(this);
  45126. var proto = getProto(target);
  45127. var hadKey = proto.has.call(target, value);
  45128. if (!hadKey) {
  45129. target.add(value);
  45130. trigger$1(target, "add"
  45131. /* ADD */
  45132. , value, value);
  45133. }
  45134. return this;
  45135. }
  45136. function set$1(key, value) {
  45137. value = toRaw(value);
  45138. var target = toRaw(this);
  45139. var _getProto2 = getProto(target),
  45140. has = _getProto2.has,
  45141. get = _getProto2.get;
  45142. var hadKey = has.call(target, key);
  45143. if (!hadKey) {
  45144. key = toRaw(key);
  45145. hadKey = has.call(target, key);
  45146. } else {
  45147. checkIdentityKeys(target, has, key);
  45148. }
  45149. var oldValue = get.call(target, key);
  45150. target.set(key, value);
  45151. if (!hadKey) {
  45152. trigger$1(target, "add"
  45153. /* ADD */
  45154. , key, value);
  45155. } else if (hasChanged(value, oldValue)) {
  45156. trigger$1(target, "set"
  45157. /* SET */
  45158. , key, value, oldValue);
  45159. }
  45160. return this;
  45161. }
  45162. function deleteEntry(key) {
  45163. var target = toRaw(this);
  45164. var _getProto3 = getProto(target),
  45165. has = _getProto3.has,
  45166. get = _getProto3.get;
  45167. var hadKey = has.call(target, key);
  45168. if (!hadKey) {
  45169. key = toRaw(key);
  45170. hadKey = has.call(target, key);
  45171. } else {
  45172. checkIdentityKeys(target, has, key);
  45173. }
  45174. var oldValue = get ? get.call(target, key) : undefined; // forward the operation before queueing reactions
  45175. var result = target.delete(key);
  45176. if (hadKey) {
  45177. trigger$1(target, "delete"
  45178. /* DELETE */
  45179. , key, undefined, oldValue);
  45180. }
  45181. return result;
  45182. }
  45183. function clear() {
  45184. var target = toRaw(this);
  45185. var hadItems = target.size !== 0;
  45186. var oldTarget = isMap(target) ? new Map(target) : new Set(target) ; // forward the operation before queueing reactions
  45187. var result = target.clear();
  45188. if (hadItems) {
  45189. trigger$1(target, "clear"
  45190. /* CLEAR */
  45191. , undefined, undefined, oldTarget);
  45192. }
  45193. return result;
  45194. }
  45195. function createForEach(isReadonly, isShallow) {
  45196. return function forEach(callback, thisArg) {
  45197. var observed = this;
  45198. var target = observed["__v_raw"
  45199. /* RAW */
  45200. ];
  45201. var rawTarget = toRaw(target);
  45202. var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  45203. !isReadonly && track(rawTarget, "iterate"
  45204. /* ITERATE */
  45205. , ITERATE_KEY);
  45206. return target.forEach(function (value, key) {
  45207. // important: make sure the callback is
  45208. // 1. invoked with the reactive map as `this` and 3rd arg
  45209. // 2. the value received should be a corresponding reactive/readonly.
  45210. return callback.call(thisArg, wrap(value), wrap(key), observed);
  45211. });
  45212. };
  45213. }
  45214. function createIterableMethod(method, isReadonly, isShallow) {
  45215. return function () {
  45216. var target = this["__v_raw"
  45217. /* RAW */
  45218. ];
  45219. var rawTarget = toRaw(target);
  45220. var targetIsMap = isMap(rawTarget);
  45221. var isPair = method === 'entries' || method === Symbol.iterator && targetIsMap;
  45222. var isKeyOnly = method === 'keys' && targetIsMap;
  45223. var innerIterator = target[method].apply(target, arguments);
  45224. var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  45225. !isReadonly && track(rawTarget, "iterate"
  45226. /* ITERATE */
  45227. , isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); // return a wrapped iterator which returns observed versions of the
  45228. // values emitted from the real iterator
  45229. return {
  45230. // iterator protocol
  45231. next() {
  45232. var _innerIterator$next = innerIterator.next(),
  45233. value = _innerIterator$next.value,
  45234. done = _innerIterator$next.done;
  45235. return done ? {
  45236. value,
  45237. done
  45238. } : {
  45239. value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
  45240. done
  45241. };
  45242. },
  45243. // iterable protocol
  45244. [Symbol.iterator]() {
  45245. return this;
  45246. }
  45247. };
  45248. };
  45249. }
  45250. function createReadonlyMethod(type) {
  45251. return function () {
  45252. {
  45253. var key = (arguments.length <= 0 ? undefined : arguments[0]) ? "on key \"".concat(arguments.length <= 0 ? undefined : arguments[0], "\" ") : "";
  45254. console.warn("".concat(capitalize(type), " operation ").concat(key, "failed: target is readonly."), toRaw(this));
  45255. }
  45256. return type === "delete"
  45257. /* DELETE */
  45258. ? false : this;
  45259. };
  45260. }
  45261. function createInstrumentations() {
  45262. var mutableInstrumentations = {
  45263. get(key) {
  45264. return get$1(this, key);
  45265. },
  45266. get size() {
  45267. return size$2(this);
  45268. },
  45269. has: has$1,
  45270. add,
  45271. set: set$1,
  45272. delete: deleteEntry,
  45273. clear,
  45274. forEach: createForEach(false, false)
  45275. };
  45276. var shallowInstrumentations = {
  45277. get(key) {
  45278. return get$1(this, key, false, true);
  45279. },
  45280. get size() {
  45281. return size$2(this);
  45282. },
  45283. has: has$1,
  45284. add,
  45285. set: set$1,
  45286. delete: deleteEntry,
  45287. clear,
  45288. forEach: createForEach(false, true)
  45289. };
  45290. var readonlyInstrumentations = {
  45291. get(key) {
  45292. return get$1(this, key, true);
  45293. },
  45294. get size() {
  45295. return size$2(this, true);
  45296. },
  45297. has(key) {
  45298. return has$1.call(this, key, true);
  45299. },
  45300. add: createReadonlyMethod("add"
  45301. /* ADD */
  45302. ),
  45303. set: createReadonlyMethod("set"
  45304. /* SET */
  45305. ),
  45306. delete: createReadonlyMethod("delete"
  45307. /* DELETE */
  45308. ),
  45309. clear: createReadonlyMethod("clear"
  45310. /* CLEAR */
  45311. ),
  45312. forEach: createForEach(true, false)
  45313. };
  45314. var shallowReadonlyInstrumentations = {
  45315. get(key) {
  45316. return get$1(this, key, true, true);
  45317. },
  45318. get size() {
  45319. return size$2(this, true);
  45320. },
  45321. has(key) {
  45322. return has$1.call(this, key, true);
  45323. },
  45324. add: createReadonlyMethod("add"
  45325. /* ADD */
  45326. ),
  45327. set: createReadonlyMethod("set"
  45328. /* SET */
  45329. ),
  45330. delete: createReadonlyMethod("delete"
  45331. /* DELETE */
  45332. ),
  45333. clear: createReadonlyMethod("clear"
  45334. /* CLEAR */
  45335. ),
  45336. forEach: createForEach(true, true)
  45337. };
  45338. var iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator];
  45339. iteratorMethods.forEach(function (method) {
  45340. mutableInstrumentations[method] = createIterableMethod(method, false, false);
  45341. readonlyInstrumentations[method] = createIterableMethod(method, true, false);
  45342. shallowInstrumentations[method] = createIterableMethod(method, false, true);
  45343. shallowReadonlyInstrumentations[method] = createIterableMethod(method, true, true);
  45344. });
  45345. return [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations];
  45346. }
  45347. var _createInstrumentatio = /* #__PURE__*/createInstrumentations(),
  45348. _createInstrumentatio2 = _slicedToArray(_createInstrumentatio, 4),
  45349. mutableInstrumentations = _createInstrumentatio2[0],
  45350. readonlyInstrumentations = _createInstrumentatio2[1],
  45351. shallowInstrumentations = _createInstrumentatio2[2],
  45352. shallowReadonlyInstrumentations = _createInstrumentatio2[3];
  45353. function createInstrumentationGetter(isReadonly, shallow) {
  45354. var instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;
  45355. return function (target, key, receiver) {
  45356. if (key === "__v_isReactive"
  45357. /* IS_REACTIVE */
  45358. ) {
  45359. return !isReadonly;
  45360. } else if (key === "__v_isReadonly"
  45361. /* IS_READONLY */
  45362. ) {
  45363. return isReadonly;
  45364. } else if (key === "__v_raw"
  45365. /* RAW */
  45366. ) {
  45367. return target;
  45368. }
  45369. return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);
  45370. };
  45371. }
  45372. var mutableCollectionHandlers = {
  45373. get: /*#__PURE__*/createInstrumentationGetter(false, false)
  45374. };
  45375. var readonlyCollectionHandlers = {
  45376. get: /*#__PURE__*/createInstrumentationGetter(true, false)
  45377. };
  45378. function checkIdentityKeys(target, has, key) {
  45379. var rawKey = toRaw(key);
  45380. if (rawKey !== key && has.call(target, rawKey)) {
  45381. var type = toRawType(target);
  45382. console.warn("Reactive ".concat(type, " contains both the raw and reactive ") + "versions of the same object".concat(type === "Map" ? " as keys" : "", ", ") + "which can lead to inconsistencies. " + "Avoid differentiating between the raw and reactive versions " + "of an object and only use the reactive version if possible.");
  45383. }
  45384. }
  45385. var reactiveMap = new WeakMap();
  45386. var shallowReactiveMap = new WeakMap();
  45387. var readonlyMap = new WeakMap();
  45388. var shallowReadonlyMap = new WeakMap();
  45389. function targetTypeMap(rawType) {
  45390. switch (rawType) {
  45391. case 'Object':
  45392. case 'Array':
  45393. return 1
  45394. /* COMMON */
  45395. ;
  45396. case 'Map':
  45397. case 'Set':
  45398. case 'WeakMap':
  45399. case 'WeakSet':
  45400. return 2
  45401. /* COLLECTION */
  45402. ;
  45403. default:
  45404. return 0
  45405. /* INVALID */
  45406. ;
  45407. }
  45408. }
  45409. function getTargetType(value) {
  45410. return value["__v_skip"
  45411. /* SKIP */
  45412. ] || !Object.isExtensible(value) ? 0
  45413. /* INVALID */
  45414. : targetTypeMap(toRawType(value));
  45415. }
  45416. function reactive(target) {
  45417. // if trying to observe a readonly proxy, return the readonly version.
  45418. if (isReadonly(target)) {
  45419. return target;
  45420. }
  45421. return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
  45422. }
  45423. /**
  45424. * Creates a readonly copy of the original object. Note the returned copy is not
  45425. * made reactive, but `readonly` can be called on an already reactive object.
  45426. */
  45427. function readonly(target) {
  45428. return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);
  45429. }
  45430. function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) {
  45431. if (!isObject$1(target)) {
  45432. {
  45433. console.warn("value cannot be made reactive: ".concat(String(target)));
  45434. }
  45435. return target;
  45436. } // target is already a Proxy, return it.
  45437. // exception: calling readonly() on a reactive object
  45438. if (target["__v_raw"
  45439. /* RAW */
  45440. ] && !(isReadonly && target["__v_isReactive"
  45441. /* IS_REACTIVE */
  45442. ])) {
  45443. return target;
  45444. } // target already has corresponding Proxy
  45445. var existingProxy = proxyMap.get(target);
  45446. if (existingProxy) {
  45447. return existingProxy;
  45448. } // only a whitelist of value types can be observed.
  45449. var targetType = getTargetType(target);
  45450. if (targetType === 0
  45451. /* INVALID */
  45452. ) {
  45453. return target;
  45454. }
  45455. var proxy = new Proxy(target, targetType === 2
  45456. /* COLLECTION */
  45457. ? collectionHandlers : baseHandlers);
  45458. proxyMap.set(target, proxy);
  45459. return proxy;
  45460. }
  45461. function isReadonly(value) {
  45462. return !!(value && value["__v_isReadonly"
  45463. /* IS_READONLY */
  45464. ]);
  45465. }
  45466. function isShallow(value) {
  45467. return !!(value && value["__v_isShallow"
  45468. /* IS_SHALLOW */
  45469. ]);
  45470. }
  45471. function toRaw(observed) {
  45472. var raw = observed && observed["__v_raw"
  45473. /* RAW */
  45474. ];
  45475. return raw ? toRaw(raw) : observed;
  45476. }
  45477. var toReactive = function toReactive(value) {
  45478. return isObject$1(value) ? reactive(value) : value;
  45479. };
  45480. var toReadonly = function toReadonly(value) {
  45481. return isObject$1(value) ? readonly(value) : value;
  45482. };
  45483. function isRef(r) {
  45484. return !!(r && r.__v_isRef === true);
  45485. }
  45486. Promise.resolve();
  45487. function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  45488. function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); }
  45489. function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  45490. var queued = false;
  45491. var queue = [];
  45492. var p = Promise.resolve();
  45493. var nextTick = function nextTick(fn) {
  45494. return p.then(fn);
  45495. };
  45496. var queueJob = function queueJob(job) {
  45497. if (!queue.includes(job)) queue.push(job);
  45498. if (!queued) {
  45499. queued = true;
  45500. nextTick(flushJobs);
  45501. }
  45502. };
  45503. var flushJobs = function flushJobs() {
  45504. var _iterator = _createForOfIteratorHelper$1(queue),
  45505. _step;
  45506. try {
  45507. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  45508. var job = _step.value;
  45509. job();
  45510. }
  45511. } catch (err) {
  45512. _iterator.e(err);
  45513. } finally {
  45514. _iterator.f();
  45515. }
  45516. queue.length = 0;
  45517. queued = false;
  45518. };
  45519. function normalizeStyle(value) {
  45520. if (isArray(value)) {
  45521. var res = {};
  45522. for (var i = 0; i < value.length; i++) {
  45523. var item = value[i];
  45524. var normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
  45525. if (normalized) {
  45526. for (var key in normalized) {
  45527. res[key] = normalized[key];
  45528. }
  45529. }
  45530. }
  45531. return res;
  45532. } else if (isString(value)) {
  45533. return value;
  45534. } else if (isObject(value)) {
  45535. return value;
  45536. }
  45537. }
  45538. var listDelimiterRE = /;(?![^(]*\))/g;
  45539. var propertyDelimiterRE = /:(.+)/;
  45540. function parseStringStyle(cssText) {
  45541. var ret = {};
  45542. cssText.split(listDelimiterRE).forEach(function (item) {
  45543. if (item) {
  45544. var tmp = item.split(propertyDelimiterRE);
  45545. tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
  45546. }
  45547. });
  45548. return ret;
  45549. }
  45550. function normalizeClass(value) {
  45551. var res = '';
  45552. if (isString(value)) {
  45553. res = value;
  45554. } else if (isArray(value)) {
  45555. for (var i = 0; i < value.length; i++) {
  45556. var normalized = normalizeClass(value[i]);
  45557. if (normalized) {
  45558. res += normalized + ' ';
  45559. }
  45560. }
  45561. } else if (isObject(value)) {
  45562. for (var name in value) {
  45563. if (value[name]) {
  45564. res += name + ' ';
  45565. }
  45566. }
  45567. }
  45568. return res.trim();
  45569. }
  45570. function looseCompareArrays(a, b) {
  45571. if (a.length !== b.length) return false;
  45572. var equal = true;
  45573. for (var i = 0; equal && i < a.length; i++) {
  45574. equal = looseEqual(a[i], b[i]);
  45575. }
  45576. return equal;
  45577. }
  45578. function looseEqual(a, b) {
  45579. if (a === b) return true;
  45580. var aValidType = isDate(a);
  45581. var bValidType = isDate(b);
  45582. if (aValidType || bValidType) {
  45583. return aValidType && bValidType ? a.getTime() === b.getTime() : false;
  45584. }
  45585. aValidType = isArray(a);
  45586. bValidType = isArray(b);
  45587. if (aValidType || bValidType) {
  45588. return aValidType && bValidType ? looseCompareArrays(a, b) : false;
  45589. }
  45590. aValidType = isObject(a);
  45591. bValidType = isObject(b);
  45592. if (aValidType || bValidType) {
  45593. /* istanbul ignore if: this if will probably never be called */
  45594. if (!aValidType || !bValidType) {
  45595. return false;
  45596. }
  45597. var aKeysCount = Object.keys(a).length;
  45598. var bKeysCount = Object.keys(b).length;
  45599. if (aKeysCount !== bKeysCount) {
  45600. return false;
  45601. }
  45602. for (var key in a) {
  45603. var aHasKey = a.hasOwnProperty(key);
  45604. var bHasKey = b.hasOwnProperty(key);
  45605. if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {
  45606. return false;
  45607. }
  45608. }
  45609. }
  45610. return String(a) === String(b);
  45611. }
  45612. function looseIndexOf(arr, val) {
  45613. return arr.findIndex(function (item) {
  45614. return looseEqual(item, val);
  45615. });
  45616. }
  45617. Object.freeze({}) ;
  45618. Object.freeze([]) ;
  45619. var remove = function remove(arr, el) {
  45620. var i = arr.indexOf(el);
  45621. if (i > -1) {
  45622. arr.splice(i, 1);
  45623. }
  45624. };
  45625. var isArray = Array.isArray;
  45626. var isDate = function isDate(val) {
  45627. return val instanceof Date;
  45628. };
  45629. var isString = function isString(val) {
  45630. return typeof val === 'string';
  45631. };
  45632. var isObject = function isObject(val) {
  45633. return val !== null && typeof val === 'object';
  45634. };
  45635. var cacheStringFunction = function cacheStringFunction(fn) {
  45636. var cache = Object.create(null);
  45637. return function (str) {
  45638. var hit = cache[str];
  45639. return hit || (cache[str] = fn(str));
  45640. };
  45641. };
  45642. var camelizeRE = /-(\w)/g;
  45643. /**
  45644. * @private
  45645. */
  45646. var camelize = cacheStringFunction(function (str) {
  45647. return str.replace(camelizeRE, function (_, c) {
  45648. return c ? c.toUpperCase() : '';
  45649. });
  45650. });
  45651. var hyphenateRE = /\B([A-Z])/g;
  45652. /**
  45653. * @private
  45654. */
  45655. var hyphenate = cacheStringFunction(function (str) {
  45656. return str.replace(hyphenateRE, '-$1').toLowerCase();
  45657. });
  45658. var toNumber = function toNumber(val) {
  45659. var n = parseFloat(val);
  45660. return isNaN(n) ? val : n;
  45661. };
  45662. var forceAttrRE = /^(spellcheck|draggable|form|list|type)$/;
  45663. var bind = function bind(_ref) {
  45664. var el = _ref.el,
  45665. get = _ref.get,
  45666. effect = _ref.effect,
  45667. arg = _ref.arg,
  45668. modifiers = _ref.modifiers;
  45669. var prevValue; // record static class
  45670. if (arg === 'class') {
  45671. el._class = el.className;
  45672. }
  45673. effect(function () {
  45674. var value = get();
  45675. if (arg) {
  45676. if (modifiers === null || modifiers === void 0 ? void 0 : modifiers.camel) {
  45677. arg = camelize(arg);
  45678. }
  45679. setProp(el, arg, value, prevValue);
  45680. } else {
  45681. for (var key in value) {
  45682. setProp(el, key, value[key], prevValue && prevValue[key]);
  45683. }
  45684. for (var _key in prevValue) {
  45685. if (!value || !(_key in value)) {
  45686. setProp(el, _key, null);
  45687. }
  45688. }
  45689. }
  45690. prevValue = value;
  45691. });
  45692. };
  45693. var setProp = function setProp(el, key, value, prevValue) {
  45694. if (key === 'class') {
  45695. el.setAttribute('class', normalizeClass(el._class ? [el._class, value] : value) || '');
  45696. } else if (key === 'style') {
  45697. value = normalizeStyle(value);
  45698. var style = el.style;
  45699. if (!value) {
  45700. el.removeAttribute('style');
  45701. } else if (isString(value)) {
  45702. if (value !== prevValue) style.cssText = value;
  45703. } else {
  45704. for (var _key2 in value) {
  45705. setStyle(style, _key2, value[_key2]);
  45706. }
  45707. if (prevValue && !isString(prevValue)) {
  45708. for (var _key3 in prevValue) {
  45709. if (value[_key3] == null) {
  45710. setStyle(style, _key3, '');
  45711. }
  45712. }
  45713. }
  45714. }
  45715. } else if (!(el instanceof SVGElement) && key in el && !forceAttrRE.test(key)) {
  45716. // @ts-ignore
  45717. el[key] = value;
  45718. if (key === 'value') {
  45719. // @ts-ignore
  45720. el._value = value;
  45721. }
  45722. } else {
  45723. // special case for <input v-model type="checkbox"> with
  45724. // :true-value & :false-value
  45725. // store value as dom properties since non-string values will be
  45726. // stringified.
  45727. if (key === 'true-value') {
  45728. el._trueValue = value;
  45729. } else if (key === 'false-value') {
  45730. el._falseValue = value;
  45731. } else if (value != null) {
  45732. el.setAttribute(key, value);
  45733. } else {
  45734. el.removeAttribute(key);
  45735. }
  45736. }
  45737. };
  45738. var importantRE = /\s*!important$/;
  45739. var setStyle = function setStyle(style, name, val) {
  45740. if (isArray(val)) {
  45741. val.forEach(function (v) {
  45742. return setStyle(style, name, v);
  45743. });
  45744. } else {
  45745. if (name.startsWith('--')) {
  45746. // custom property definition
  45747. style.setProperty(name, val);
  45748. } else {
  45749. if (importantRE.test(val)) {
  45750. // !important
  45751. style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');
  45752. } else {
  45753. style[name] = val;
  45754. }
  45755. }
  45756. }
  45757. };
  45758. var checkAttr = function checkAttr(el, name) {
  45759. var val = el.getAttribute(name);
  45760. if (val != null) el.removeAttribute(name);
  45761. return val;
  45762. };
  45763. var listen = function listen(el, event, handler, options) {
  45764. el.addEventListener(event, handler, options);
  45765. };
  45766. var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/;
  45767. var systemModifiers = ['ctrl', 'shift', 'alt', 'meta'];
  45768. var modifierGuards = {
  45769. stop: function stop(e) {
  45770. return e.stopPropagation();
  45771. },
  45772. prevent: function prevent(e) {
  45773. return e.preventDefault();
  45774. },
  45775. self: function self(e) {
  45776. return e.target !== e.currentTarget;
  45777. },
  45778. ctrl: function ctrl(e) {
  45779. return !e.ctrlKey;
  45780. },
  45781. shift: function shift(e) {
  45782. return !e.shiftKey;
  45783. },
  45784. alt: function alt(e) {
  45785. return !e.altKey;
  45786. },
  45787. meta: function meta(e) {
  45788. return !e.metaKey;
  45789. },
  45790. left: function left(e) {
  45791. return 'button' in e && e.button !== 0;
  45792. },
  45793. middle: function middle(e) {
  45794. return 'button' in e && e.button !== 1;
  45795. },
  45796. right: function right(e) {
  45797. return 'button' in e && e.button !== 2;
  45798. },
  45799. exact: function exact(e, modifiers) {
  45800. return systemModifiers.some(function (m) {
  45801. return e["".concat(m, "Key")] && !modifiers[m];
  45802. });
  45803. }
  45804. };
  45805. var on = function on(_ref) {
  45806. var el = _ref.el,
  45807. get = _ref.get,
  45808. exp = _ref.exp,
  45809. arg = _ref.arg,
  45810. modifiers = _ref.modifiers;
  45811. if (!arg) {
  45812. {
  45813. console.error("v-on=\"obj\" syntax is not supported in petite-vue.");
  45814. }
  45815. return;
  45816. }
  45817. var handler = simplePathRE.test(exp) ? get("(e => ".concat(exp, "(e))")) : get("($event => { ".concat(exp, " })")); // special lifecycle events
  45818. if ((arg === 'mounted' || arg === 'unmounted')) {
  45819. console.error("mounted and unmounted hooks now need to be prefixed with vue: " + "- use @vue:".concat(arg, "=\"handler\" instead."));
  45820. }
  45821. if (arg === 'vue:mounted') {
  45822. nextTick(handler);
  45823. return;
  45824. } else if (arg === 'vue:unmounted') {
  45825. return function () {
  45826. return handler();
  45827. };
  45828. }
  45829. if (modifiers) {
  45830. // map modifiers
  45831. if (arg === 'click') {
  45832. if (modifiers.right) arg = 'contextmenu';
  45833. if (modifiers.middle) arg = 'mouseup';
  45834. }
  45835. var raw = handler;
  45836. handler = function handler(e) {
  45837. if ('key' in e && !(hyphenate(e.key) in modifiers)) {
  45838. return;
  45839. }
  45840. for (var key in modifiers) {
  45841. var guard = modifierGuards[key];
  45842. if (guard && guard(e, modifiers)) {
  45843. return;
  45844. }
  45845. }
  45846. return raw(e);
  45847. };
  45848. }
  45849. listen(el, arg, handler, modifiers);
  45850. };
  45851. var show = function show(_ref) {
  45852. var el = _ref.el,
  45853. get = _ref.get,
  45854. effect = _ref.effect;
  45855. var initialDisplay = el.style.display;
  45856. effect(function () {
  45857. el.style.display = get() ? initialDisplay : 'none';
  45858. });
  45859. };
  45860. var text = function text(_ref) {
  45861. var el = _ref.el,
  45862. get = _ref.get,
  45863. effect = _ref.effect;
  45864. effect(function () {
  45865. el.textContent = toDisplayString(get());
  45866. });
  45867. };
  45868. var toDisplayString = function toDisplayString(value) {
  45869. return value == null ? '' : isObject(value) ? JSON.stringify(value, null, 2) : String(value);
  45870. };
  45871. var html = function html(_ref) {
  45872. var el = _ref.el,
  45873. get = _ref.get,
  45874. effect = _ref.effect;
  45875. effect(function () {
  45876. el.innerHTML = get();
  45877. });
  45878. };
  45879. var model = function model(_ref) {
  45880. var el = _ref.el,
  45881. exp = _ref.exp,
  45882. get = _ref.get,
  45883. effect = _ref.effect,
  45884. modifiers = _ref.modifiers;
  45885. var type = el.type;
  45886. var assign = get("(val) => { ".concat(exp, " = val }"));
  45887. var _ref2 = modifiers || {},
  45888. trim = _ref2.trim,
  45889. _ref2$number = _ref2.number,
  45890. number = _ref2$number === void 0 ? type === 'number' : _ref2$number;
  45891. if (el.tagName === 'SELECT') {
  45892. var sel = el;
  45893. listen(el, 'change', function () {
  45894. var selectedVal = Array.prototype.filter.call(sel.options, function (o) {
  45895. return o.selected;
  45896. }).map(function (o) {
  45897. return number ? toNumber(getValue(o)) : getValue(o);
  45898. });
  45899. assign(sel.multiple ? selectedVal : selectedVal[0]);
  45900. });
  45901. effect(function () {
  45902. var value = get();
  45903. var isMultiple = sel.multiple;
  45904. for (var i = 0, l = sel.options.length; i < l; i++) {
  45905. var option = sel.options[i];
  45906. var optionValue = getValue(option);
  45907. if (isMultiple) {
  45908. if (isArray(value)) {
  45909. option.selected = looseIndexOf(value, optionValue) > -1;
  45910. } else {
  45911. option.selected = value.has(optionValue);
  45912. }
  45913. } else {
  45914. if (looseEqual(getValue(option), value)) {
  45915. if (sel.selectedIndex !== i) sel.selectedIndex = i;
  45916. return;
  45917. }
  45918. }
  45919. }
  45920. if (!isMultiple && sel.selectedIndex !== -1) {
  45921. sel.selectedIndex = -1;
  45922. }
  45923. });
  45924. } else if (type === 'checkbox') {
  45925. listen(el, 'change', function () {
  45926. var modelValue = get();
  45927. var checked = el.checked;
  45928. if (isArray(modelValue)) {
  45929. var elementValue = getValue(el);
  45930. var index = looseIndexOf(modelValue, elementValue);
  45931. var found = index !== -1;
  45932. if (checked && !found) {
  45933. assign(modelValue.concat(elementValue));
  45934. } else if (!checked && found) {
  45935. var filtered = _toConsumableArray(modelValue);
  45936. filtered.splice(index, 1);
  45937. assign(filtered);
  45938. }
  45939. } else {
  45940. assign(getCheckboxValue(el, checked));
  45941. }
  45942. });
  45943. var oldValue;
  45944. effect(function () {
  45945. var value = get();
  45946. if (isArray(value)) {
  45947. el.checked = looseIndexOf(value, getValue(el)) > -1;
  45948. } else if (value !== oldValue) {
  45949. el.checked = looseEqual(value, getCheckboxValue(el, true));
  45950. }
  45951. oldValue = value;
  45952. });
  45953. } else if (type === 'radio') {
  45954. listen(el, 'change', function () {
  45955. assign(getValue(el));
  45956. });
  45957. var _oldValue;
  45958. effect(function () {
  45959. var value = get();
  45960. if (value !== _oldValue) {
  45961. el.checked = looseEqual(value, getValue(el));
  45962. }
  45963. });
  45964. } else {
  45965. // text-like
  45966. var resolveValue = function resolveValue(val) {
  45967. if (trim) return val.trim();
  45968. if (number) return toNumber(val);
  45969. return val;
  45970. };
  45971. listen(el, 'compositionstart', onCompositionStart);
  45972. listen(el, 'compositionend', onCompositionEnd);
  45973. listen(el, (modifiers === null || modifiers === void 0 ? void 0 : modifiers.lazy) ? 'change' : 'input', function () {
  45974. if (el.composing) return;
  45975. assign(resolveValue(el.value));
  45976. });
  45977. if (trim) {
  45978. listen(el, 'change', function () {
  45979. el.value = el.value.trim();
  45980. });
  45981. }
  45982. effect(function () {
  45983. if (el.composing) {
  45984. return;
  45985. }
  45986. var curVal = el.value;
  45987. var newVal = get();
  45988. if (document.activeElement === el && resolveValue(curVal) === newVal) {
  45989. return;
  45990. }
  45991. if (curVal !== newVal) {
  45992. el.value = newVal;
  45993. }
  45994. });
  45995. }
  45996. };
  45997. var getValue = function getValue(el) {
  45998. return '_value' in el ? el._value : el.value;
  45999. }; // retrieve raw value for true-value and false-value set via :true-value or :false-value bindings
  46000. var getCheckboxValue = function getCheckboxValue(el, checked) {
  46001. var key = checked ? '_trueValue' : '_falseValue';
  46002. return key in el ? el[key] : checked;
  46003. };
  46004. var onCompositionStart = function onCompositionStart(e) {
  46005. e.target.composing = true;
  46006. };
  46007. var onCompositionEnd = function onCompositionEnd(e) {
  46008. var target = e.target;
  46009. if (target.composing) {
  46010. target.composing = false;
  46011. trigger(target, 'input');
  46012. }
  46013. };
  46014. var trigger = function trigger(el, type) {
  46015. var e = document.createEvent('HTMLEvents');
  46016. e.initEvent(type, true, true);
  46017. el.dispatchEvent(e);
  46018. };
  46019. var evalCache = Object.create(null);
  46020. var evaluate = function evaluate(scope, exp, el) {
  46021. return execute(scope, "return(".concat(exp, ")"), el);
  46022. };
  46023. var execute = function execute(scope, exp, el) {
  46024. var fn = evalCache[exp] || (evalCache[exp] = toFunction(exp));
  46025. try {
  46026. return fn(scope, el);
  46027. } catch (e) {
  46028. {
  46029. console.warn("Error when evaluating expression \"".concat(exp, "\":"));
  46030. }
  46031. console.error(e);
  46032. }
  46033. };
  46034. var toFunction = function toFunction(exp) {
  46035. try {
  46036. return new Function("$data", "$el", "with($data){".concat(exp, "}"));
  46037. } catch (e) {
  46038. console.error("".concat(e.message, " in expression: ").concat(exp));
  46039. return function () {};
  46040. }
  46041. };
  46042. var effect = function effect(_ref) {
  46043. var el = _ref.el,
  46044. ctx = _ref.ctx,
  46045. exp = _ref.exp,
  46046. effect = _ref.effect;
  46047. nextTick(function () {
  46048. return effect(function () {
  46049. return execute(ctx.scope, exp, el);
  46050. });
  46051. });
  46052. };
  46053. var builtInDirectives = {
  46054. bind,
  46055. on,
  46056. show,
  46057. text,
  46058. html,
  46059. model,
  46060. effect
  46061. };
  46062. var _if = function _if(el, exp, ctx) {
  46063. if (!exp.trim()) {
  46064. console.warn("v-if expression cannot be empty.");
  46065. }
  46066. var parent = el.parentElement;
  46067. var anchor = new Comment('v-if');
  46068. parent.insertBefore(anchor, el);
  46069. var branches = [{
  46070. exp,
  46071. el
  46072. }]; // locate else branch
  46073. var elseEl;
  46074. var elseExp;
  46075. while (elseEl = el.nextElementSibling) {
  46076. elseExp = null;
  46077. if (checkAttr(elseEl, 'v-else') === '' || (elseExp = checkAttr(elseEl, 'v-else-if'))) {
  46078. parent.removeChild(elseEl);
  46079. branches.push({
  46080. exp: elseExp,
  46081. el: elseEl
  46082. });
  46083. } else {
  46084. break;
  46085. }
  46086. }
  46087. var nextNode = el.nextSibling;
  46088. parent.removeChild(el);
  46089. var block;
  46090. var activeBranchIndex = -1;
  46091. var removeActiveBlock = function removeActiveBlock() {
  46092. if (block) {
  46093. parent.insertBefore(anchor, block.el);
  46094. block.remove();
  46095. block = undefined;
  46096. }
  46097. };
  46098. ctx.effect(function () {
  46099. for (var i = 0; i < branches.length; i++) {
  46100. var _branches$i = branches[i],
  46101. _exp = _branches$i.exp,
  46102. _el = _branches$i.el;
  46103. if (!_exp || evaluate(ctx.scope, _exp)) {
  46104. if (i !== activeBranchIndex) {
  46105. removeActiveBlock();
  46106. block = new Block(_el, ctx);
  46107. block.insert(parent, anchor);
  46108. parent.removeChild(anchor);
  46109. activeBranchIndex = i;
  46110. }
  46111. return;
  46112. }
  46113. } // no matched branch.
  46114. activeBranchIndex = -1;
  46115. removeActiveBlock();
  46116. });
  46117. return nextNode;
  46118. };
  46119. var forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
  46120. var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
  46121. var stripParensRE = /^\(|\)$/g;
  46122. var destructureRE = /^[{[]\s*((?:[\w_$]+\s*,?\s*)+)[\]}]$/;
  46123. var _for = function _for(el, exp, ctx) {
  46124. var inMatch = exp.match(forAliasRE);
  46125. if (!inMatch) {
  46126. console.warn("invalid v-for expression: ".concat(exp));
  46127. return;
  46128. }
  46129. var nextNode = el.nextSibling;
  46130. var parent = el.parentElement;
  46131. var anchor = new Text('');
  46132. parent.insertBefore(anchor, el);
  46133. parent.removeChild(el);
  46134. var sourceExp = inMatch[2].trim();
  46135. var valueExp = inMatch[1].trim().replace(stripParensRE, '').trim();
  46136. var destructureBindings;
  46137. var isArrayDestructure = false;
  46138. var indexExp;
  46139. var objIndexExp;
  46140. var keyAttr = 'key';
  46141. var keyExp = el.getAttribute(keyAttr) || el.getAttribute(keyAttr = ':key') || el.getAttribute(keyAttr = 'v-bind:key');
  46142. if (keyExp) {
  46143. el.removeAttribute(keyAttr);
  46144. if (keyAttr === 'key') keyExp = JSON.stringify(keyExp);
  46145. }
  46146. var match;
  46147. if (match = valueExp.match(forIteratorRE)) {
  46148. valueExp = valueExp.replace(forIteratorRE, '').trim();
  46149. indexExp = match[1].trim();
  46150. if (match[2]) {
  46151. objIndexExp = match[2].trim();
  46152. }
  46153. }
  46154. if (match = valueExp.match(destructureRE)) {
  46155. destructureBindings = match[1].split(',').map(function (s) {
  46156. return s.trim();
  46157. });
  46158. isArrayDestructure = valueExp[0] === '[';
  46159. }
  46160. var mounted = false;
  46161. var blocks;
  46162. var childCtxs;
  46163. var keyToIndexMap;
  46164. var createChildContexts = function createChildContexts(source) {
  46165. var map = new Map();
  46166. var ctxs = [];
  46167. if (isArray(source)) {
  46168. for (var i = 0; i < source.length; i++) {
  46169. ctxs.push(createChildContext(map, source[i], i));
  46170. }
  46171. } else if (typeof source === 'number') {
  46172. for (var _i = 0; _i < source; _i++) {
  46173. ctxs.push(createChildContext(map, _i + 1, _i));
  46174. }
  46175. } else if (isObject(source)) {
  46176. var _i2 = 0;
  46177. for (var key in source) {
  46178. ctxs.push(createChildContext(map, source[key], _i2++, key));
  46179. }
  46180. }
  46181. return [ctxs, map];
  46182. };
  46183. var createChildContext = function createChildContext(map, value, index, objKey) {
  46184. var data = {};
  46185. if (destructureBindings) {
  46186. destructureBindings.forEach(function (b, i) {
  46187. return data[b] = value[isArrayDestructure ? i : b];
  46188. });
  46189. } else {
  46190. data[valueExp] = value;
  46191. }
  46192. if (objKey) {
  46193. indexExp && (data[indexExp] = objKey);
  46194. objIndexExp && (data[objIndexExp] = index);
  46195. } else {
  46196. indexExp && (data[indexExp] = index);
  46197. }
  46198. var childCtx = createScopedContext(ctx, data);
  46199. var key = keyExp ? evaluate(childCtx.scope, keyExp) : index;
  46200. map.set(key, index);
  46201. childCtx.key = key;
  46202. return childCtx;
  46203. };
  46204. var mountBlock = function mountBlock(ctx, ref) {
  46205. var block = new Block(el, ctx);
  46206. block.key = ctx.key;
  46207. block.insert(parent, ref);
  46208. return block;
  46209. };
  46210. ctx.effect(function () {
  46211. var source = evaluate(ctx.scope, sourceExp);
  46212. var prevKeyToIndexMap = keyToIndexMap;
  46213. var _createChildContexts = createChildContexts(source);
  46214. var _createChildContexts2 = _slicedToArray(_createChildContexts, 2);
  46215. childCtxs = _createChildContexts2[0];
  46216. keyToIndexMap = _createChildContexts2[1];
  46217. if (!mounted) {
  46218. blocks = childCtxs.map(function (s) {
  46219. return mountBlock(s, anchor);
  46220. });
  46221. mounted = true;
  46222. } else {
  46223. for (var _i3 = 0; _i3 < blocks.length; _i3++) {
  46224. if (!keyToIndexMap.has(blocks[_i3].key)) {
  46225. blocks[_i3].remove();
  46226. }
  46227. }
  46228. var nextBlocks = [];
  46229. var i = childCtxs.length;
  46230. var nextBlock;
  46231. var prevMovedBlock;
  46232. while (i--) {
  46233. var childCtx = childCtxs[i];
  46234. var oldIndex = prevKeyToIndexMap.get(childCtx.key);
  46235. var block = void 0;
  46236. if (oldIndex == null) {
  46237. // new
  46238. block = mountBlock(childCtx, nextBlock ? nextBlock.el : anchor);
  46239. } else {
  46240. // update
  46241. block = blocks[oldIndex];
  46242. Object.assign(block.ctx.scope, childCtx.scope);
  46243. if (oldIndex !== i) {
  46244. // moved
  46245. if (blocks[oldIndex + 1] !== nextBlock || // If the next has moved, it must move too
  46246. prevMovedBlock === nextBlock) {
  46247. prevMovedBlock = block;
  46248. block.insert(parent, nextBlock ? nextBlock.el : anchor);
  46249. }
  46250. }
  46251. }
  46252. nextBlocks.unshift(nextBlock = block);
  46253. }
  46254. blocks = nextBlocks;
  46255. }
  46256. });
  46257. return nextNode;
  46258. };
  46259. var ref = function ref(_ref) {
  46260. var el = _ref.el,
  46261. $refs = _ref.ctx.scope.$refs,
  46262. get = _ref.get,
  46263. effect = _ref.effect;
  46264. var prevRef;
  46265. effect(function () {
  46266. var ref = get();
  46267. $refs[ref] = el;
  46268. if (prevRef && ref !== prevRef) {
  46269. delete $refs[prevRef];
  46270. }
  46271. prevRef = ref;
  46272. });
  46273. return function () {
  46274. prevRef && delete $refs[prevRef];
  46275. };
  46276. };
  46277. var dirRE = /^(?:v-|:|@)/;
  46278. var modifierRE = /\.([\w-]+)/g;
  46279. var inOnce = false;
  46280. var walk = function walk(node, ctx) {
  46281. var type = node.nodeType;
  46282. if (type === 1) {
  46283. // Element
  46284. var el = node;
  46285. if (el.hasAttribute('v-pre')) {
  46286. return;
  46287. }
  46288. checkAttr(el, 'v-cloak');
  46289. var exp; // v-if
  46290. if (exp = checkAttr(el, 'v-if')) {
  46291. return _if(el, exp, ctx);
  46292. } // v-for
  46293. if (exp = checkAttr(el, 'v-for')) {
  46294. return _for(el, exp, ctx);
  46295. } // v-scope
  46296. if ((exp = checkAttr(el, 'v-scope')) || exp === '') {
  46297. var scope = exp ? evaluate(ctx.scope, exp) : {};
  46298. ctx = createScopedContext(ctx, scope);
  46299. if (scope.$template) {
  46300. resolveTemplate(el, scope.$template);
  46301. }
  46302. } // v-once
  46303. var hasVOnce = checkAttr(el, 'v-once') != null;
  46304. if (hasVOnce) {
  46305. inOnce = true;
  46306. } // ref
  46307. if (exp = checkAttr(el, 'ref')) {
  46308. applyDirective(el, ref, "\"".concat(exp, "\""), ctx);
  46309. } // process children first before self attrs
  46310. walkChildren(el, ctx); // other directives
  46311. var deferred = [];
  46312. for (var _i = 0, _arr = _toConsumableArray(el.attributes); _i < _arr.length; _i++) {
  46313. var _arr$_i = _arr[_i],
  46314. name = _arr$_i.name,
  46315. value = _arr$_i.value;
  46316. if (dirRE.test(name) && name !== 'v-cloak') {
  46317. if (name === 'v-model') {
  46318. // defer v-model since it relies on :value bindings to be processed
  46319. // first, but also before v-on listeners (#73)
  46320. deferred.unshift([name, value]);
  46321. } else if (name[0] === '@' || /^v-on\b/.test(name)) {
  46322. deferred.push([name, value]);
  46323. } else {
  46324. processDirective(el, name, value, ctx);
  46325. }
  46326. }
  46327. }
  46328. for (var _i2 = 0, _deferred = deferred; _i2 < _deferred.length; _i2++) {
  46329. var _deferred$_i = _slicedToArray(_deferred[_i2], 2),
  46330. _name = _deferred$_i[0],
  46331. _value = _deferred$_i[1];
  46332. processDirective(el, _name, _value, ctx);
  46333. }
  46334. if (hasVOnce) {
  46335. inOnce = false;
  46336. }
  46337. } else if (type === 3) {
  46338. // Text
  46339. var data = node.data;
  46340. if (data.includes(ctx.delimiters[0])) {
  46341. var segments = [];
  46342. var lastIndex = 0;
  46343. var match;
  46344. while (match = ctx.delimitersRE.exec(data)) {
  46345. var leading = data.slice(lastIndex, match.index);
  46346. if (leading) segments.push(JSON.stringify(leading));
  46347. segments.push("$s(".concat(match[1], ")"));
  46348. lastIndex = match.index + match[0].length;
  46349. }
  46350. if (lastIndex < data.length) {
  46351. segments.push(JSON.stringify(data.slice(lastIndex)));
  46352. }
  46353. applyDirective(node, text, segments.join('+'), ctx);
  46354. }
  46355. } else if (type === 11) {
  46356. walkChildren(node, ctx);
  46357. }
  46358. };
  46359. var walkChildren = function walkChildren(node, ctx) {
  46360. var child = node.firstChild;
  46361. while (child) {
  46362. child = walk(child, ctx) || child.nextSibling;
  46363. }
  46364. };
  46365. var processDirective = function processDirective(el, raw, exp, ctx) {
  46366. var dir;
  46367. var arg;
  46368. var modifiers; // modifiers
  46369. raw = raw.replace(modifierRE, function (_, m) {
  46370. (modifiers || (modifiers = {}))[m] = true;
  46371. return '';
  46372. });
  46373. if (raw[0] === ':') {
  46374. dir = bind;
  46375. arg = raw.slice(1);
  46376. } else if (raw[0] === '@') {
  46377. dir = on;
  46378. arg = raw.slice(1);
  46379. } else {
  46380. var argIndex = raw.indexOf(':');
  46381. var dirName = argIndex > 0 ? raw.slice(2, argIndex) : raw.slice(2);
  46382. dir = builtInDirectives[dirName] || ctx.dirs[dirName];
  46383. arg = argIndex > 0 ? raw.slice(argIndex + 1) : undefined;
  46384. }
  46385. if (dir) {
  46386. if (dir === bind && arg === 'ref') dir = ref;
  46387. applyDirective(el, dir, exp, ctx, arg, modifiers);
  46388. el.removeAttribute(raw);
  46389. } else {
  46390. console.error("unknown custom directive ".concat(raw, "."));
  46391. }
  46392. };
  46393. var applyDirective = function applyDirective(el, dir, exp, ctx, arg, modifiers) {
  46394. var get = function get() {
  46395. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : exp;
  46396. return evaluate(ctx.scope, e, el);
  46397. };
  46398. var cleanup = dir({
  46399. el,
  46400. get,
  46401. effect: ctx.effect,
  46402. ctx,
  46403. exp,
  46404. arg,
  46405. modifiers
  46406. });
  46407. if (cleanup) {
  46408. ctx.cleanups.push(cleanup);
  46409. }
  46410. };
  46411. var resolveTemplate = function resolveTemplate(el, template) {
  46412. if (template[0] === '#') {
  46413. var templateEl = document.querySelector(template);
  46414. if (!templateEl) {
  46415. console.error("template selector ".concat(template, " has no matching <template> element."));
  46416. }
  46417. el.appendChild(templateEl.content.cloneNode(true));
  46418. return;
  46419. }
  46420. el.innerHTML = template;
  46421. };
  46422. var createContext = function createContext(parent) {
  46423. var ctx = Object.assign(Object.assign({
  46424. delimiters: ['{{', '}}'],
  46425. delimitersRE: /\{\{([^]+?)\}\}/g
  46426. }, parent), {
  46427. scope: parent ? parent.scope : reactive({}),
  46428. dirs: parent ? parent.dirs : {},
  46429. effects: [],
  46430. blocks: [],
  46431. cleanups: [],
  46432. effect: function effect(fn) {
  46433. if (inOnce) {
  46434. queueJob(fn);
  46435. return fn;
  46436. }
  46437. var e = effect$1(fn, {
  46438. scheduler: function scheduler() {
  46439. return queueJob(e);
  46440. }
  46441. });
  46442. ctx.effects.push(e);
  46443. return e;
  46444. }
  46445. });
  46446. return ctx;
  46447. };
  46448. var createScopedContext = function createScopedContext(ctx) {
  46449. var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  46450. var parentScope = ctx.scope;
  46451. var mergedScope = Object.create(parentScope);
  46452. Object.defineProperties(mergedScope, Object.getOwnPropertyDescriptors(data));
  46453. mergedScope.$refs = Object.create(parentScope.$refs);
  46454. var reactiveProxy = reactive(new Proxy(mergedScope, {
  46455. set(target, key, val, receiver) {
  46456. // when setting a property that doesn't exist on current scope,
  46457. // do not create it on the current scope and fallback to parent scope.
  46458. if (receiver === reactiveProxy && !target.hasOwnProperty(key)) {
  46459. return Reflect.set(parentScope, key, val);
  46460. }
  46461. return Reflect.set(target, key, val, receiver);
  46462. }
  46463. }));
  46464. bindContextMethods(reactiveProxy);
  46465. return Object.assign(Object.assign({}, ctx), {
  46466. scope: reactiveProxy
  46467. });
  46468. };
  46469. var bindContextMethods = function bindContextMethods(scope) {
  46470. for (var _i = 0, _Object$keys = Object.keys(scope); _i < _Object$keys.length; _i++) {
  46471. var key = _Object$keys[_i];
  46472. if (typeof scope[key] === 'function') {
  46473. scope[key] = scope[key].bind(scope);
  46474. }
  46475. }
  46476. };
  46477. var Block = /*#__PURE__*/function () {
  46478. function Block(template, parentCtx) {
  46479. var isRoot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  46480. _classCallCheck(this, Block);
  46481. this.isFragment = template instanceof HTMLTemplateElement;
  46482. if (isRoot) {
  46483. this.template = template;
  46484. } else if (this.isFragment) {
  46485. this.template = template.content.cloneNode(true);
  46486. } else {
  46487. this.template = template.cloneNode(true);
  46488. }
  46489. if (isRoot) {
  46490. this.ctx = parentCtx;
  46491. } else {
  46492. // create child context
  46493. this.parentCtx = parentCtx;
  46494. parentCtx.blocks.push(this);
  46495. this.ctx = createContext(parentCtx);
  46496. }
  46497. walk(this.template, this.ctx);
  46498. }
  46499. _createClass(Block, [{
  46500. key: "el",
  46501. get: function get() {
  46502. return this.start || this.template;
  46503. }
  46504. }, {
  46505. key: "insert",
  46506. value: function insert(parent) {
  46507. var anchor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  46508. if (this.isFragment) {
  46509. if (this.start) {
  46510. // already inserted, moving
  46511. var node = this.start;
  46512. var next;
  46513. while (node) {
  46514. next = node.nextSibling;
  46515. parent.insertBefore(node, anchor);
  46516. if (node === this.end) break;
  46517. node = next;
  46518. }
  46519. } else {
  46520. this.start = new Text('');
  46521. this.end = new Text('');
  46522. parent.insertBefore(this.end, anchor);
  46523. parent.insertBefore(this.start, this.end);
  46524. parent.insertBefore(this.template, this.end);
  46525. }
  46526. } else {
  46527. parent.insertBefore(this.template, anchor);
  46528. }
  46529. }
  46530. }, {
  46531. key: "remove",
  46532. value: function remove$1() {
  46533. if (this.parentCtx) {
  46534. remove(this.parentCtx.blocks, this);
  46535. }
  46536. if (this.start) {
  46537. var parent = this.start.parentNode;
  46538. var node = this.start;
  46539. var next;
  46540. while (node) {
  46541. next = node.nextSibling;
  46542. parent.removeChild(node);
  46543. if (node === this.end) break;
  46544. node = next;
  46545. }
  46546. } else {
  46547. this.template.parentNode.removeChild(this.template);
  46548. }
  46549. this.teardown();
  46550. }
  46551. }, {
  46552. key: "teardown",
  46553. value: function teardown() {
  46554. this.ctx.blocks.forEach(function (child) {
  46555. child.teardown();
  46556. });
  46557. this.ctx.effects.forEach(stop);
  46558. this.ctx.cleanups.forEach(function (fn) {
  46559. return fn();
  46560. });
  46561. }
  46562. }]);
  46563. return Block;
  46564. }();
  46565. var escapeRegex = function escapeRegex(str) {
  46566. return str.replace(/[-.*+?^${}()|[\]\/\\]/g, '\\$&');
  46567. };
  46568. var createApp = function createApp(initialData) {
  46569. // root context
  46570. var ctx = createContext();
  46571. if (initialData) {
  46572. ctx.scope = reactive(initialData);
  46573. bindContextMethods(ctx.scope); // handle custom delimiters
  46574. if (initialData.$delimiters) {
  46575. var _ctx$delimiters = ctx.delimiters = initialData.$delimiters,
  46576. _ctx$delimiters2 = _slicedToArray(_ctx$delimiters, 2),
  46577. open = _ctx$delimiters2[0],
  46578. close = _ctx$delimiters2[1];
  46579. ctx.delimitersRE = new RegExp(escapeRegex(open) + '([^]+?)' + escapeRegex(close), 'g');
  46580. }
  46581. } // global internal helpers
  46582. ctx.scope.$s = toDisplayString;
  46583. ctx.scope.$nextTick = nextTick;
  46584. ctx.scope.$refs = Object.create(null);
  46585. var rootBlocks;
  46586. return {
  46587. directive(name, def) {
  46588. if (def) {
  46589. ctx.dirs[name] = def;
  46590. return this;
  46591. } else {
  46592. return ctx.dirs[name];
  46593. }
  46594. },
  46595. mount(el) {
  46596. if (typeof el === 'string') {
  46597. el = document.querySelector(el);
  46598. if (!el) {
  46599. console.error("selector ".concat(el, " has no matching element."));
  46600. return;
  46601. }
  46602. }
  46603. el = el || document.documentElement;
  46604. var roots;
  46605. if (el.hasAttribute('v-scope')) {
  46606. roots = [el];
  46607. } else {
  46608. roots = _toConsumableArray(el.querySelectorAll("[v-scope]")).filter(function (root) {
  46609. return !root.matches("[v-scope] [v-scope]");
  46610. });
  46611. }
  46612. if (!roots.length) {
  46613. roots = [el];
  46614. }
  46615. if (roots.length === 1 && roots[0] === document.documentElement) {
  46616. console.warn("Mounting on documentElement - this is non-optimal as petite-vue " + "will be forced to crawl the entire page's DOM. " + "Consider explicitly marking elements controlled by petite-vue " + "with `v-scope`.");
  46617. }
  46618. rootBlocks = roots.map(function (el) {
  46619. return new Block(el, ctx, true);
  46620. });
  46621. return this;
  46622. },
  46623. unmount() {
  46624. rootBlocks.forEach(function (block) {
  46625. return block.teardown();
  46626. });
  46627. }
  46628. };
  46629. };
  46630. var s = document.currentScript;
  46631. if (s && s.hasAttribute('init')) {
  46632. createApp().mount();
  46633. }
  46634. var PetiteVue = /*#__PURE__*/Object.freeze({
  46635. __proto__: null,
  46636. createApp: createApp,
  46637. nextTick: nextTick,
  46638. reactive: reactive
  46639. });
  46640. var base64ToBlob = function base64ToBlob(base64) {
  46641. var arr = base64.split(','),
  46642. mime = arr[0].match(/:(.*?);/)[1],
  46643. bstr = atob(arr[1]),
  46644. n = bstr.length,
  46645. u8arr = new Uint8Array(n);
  46646. while (n--) {
  46647. u8arr[n] = bstr.charCodeAt(n);
  46648. }
  46649. return new Blob([u8arr], {
  46650. type: mime
  46651. });
  46652. };
  46653. function convertBlob2File(blob, name) {
  46654. return new File([blob], name, {
  46655. type: blob.type
  46656. });
  46657. }
  46658. function download(blob, name) {
  46659. if (!blob || !name) {
  46660. return;
  46661. }
  46662. var objectUrl = window.URL.createObjectURL(blob);
  46663. var a = document.createElement('a');
  46664. a.href = objectUrl;
  46665. a.download = name;
  46666. a.click();
  46667. a.remove();
  46668. window.URL.revokeObjectURL(objectUrl);
  46669. }
  46670. function downloadFromURL(url, name) {
  46671. return new Promise( /*#__PURE__*/function () {
  46672. var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(resolve, reject) {
  46673. var response, blob;
  46674. return regenerator.wrap(function _callee$(_context) {
  46675. while (1) {
  46676. switch (_context.prev = _context.next) {
  46677. case 0:
  46678. if (!(!url || !name)) {
  46679. _context.next = 2;
  46680. break;
  46681. }
  46682. return _context.abrupt("return", reject("url or name is null"));
  46683. case 2:
  46684. if (!(url instanceof Blob)) {
  46685. _context.next = 7;
  46686. break;
  46687. }
  46688. download(url, name);
  46689. resolve(true);
  46690. _context.next = 19;
  46691. break;
  46692. case 7:
  46693. if (!(url.indexOf('data:') === 0)) {
  46694. _context.next = 12;
  46695. break;
  46696. }
  46697. download(base64ToBlob(url), name);
  46698. resolve(true);
  46699. _context.next = 19;
  46700. break;
  46701. case 12:
  46702. _context.next = 14;
  46703. return fetch(url);
  46704. case 14:
  46705. response = _context.sent;
  46706. _context.next = 17;
  46707. return response.blob();
  46708. case 17:
  46709. blob = _context.sent;
  46710. // 创建隐藏的可下载链接
  46711. if (blob) {
  46712. download(blob, name);
  46713. resolve(true);
  46714. } else {
  46715. reject(false);
  46716. }
  46717. case 19:
  46718. case "end":
  46719. return _context.stop();
  46720. }
  46721. }
  46722. }, _callee);
  46723. }));
  46724. return function (_x, _x2) {
  46725. return _ref.apply(this, arguments);
  46726. };
  46727. }());
  46728. }
  46729. var file = /*#__PURE__*/Object.freeze({
  46730. __proto__: null,
  46731. base64ToBlob: base64ToBlob,
  46732. convertBlob2File: convertBlob2File,
  46733. download: download,
  46734. downloadFromURL: downloadFromURL
  46735. });
  46736. function _createSuper$D(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$D(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  46737. function _isNativeReflectConstruct$D() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  46738. var vec1 = new THREE.Vector3(),
  46739. vec2 = new THREE.Vector3(),
  46740. vec3 = new THREE.Vector3();
  46741. var quat1 = new THREE.Quaternion(),
  46742. quat2 = new THREE.Quaternion();
  46743. var cameraModel; // 监控相机颜色
  46744. var normalColor = new THREE.Color(1, 1, 1);
  46745. var hoverColor = new THREE.Color(2, 2, 2);
  46746. /**
  46747. * 监控相机
  46748. */
  46749. var SecurityCamera = /*#__PURE__*/function (_THREE$PerspectiveCam) {
  46750. _inherits(SecurityCamera, _THREE$PerspectiveCam);
  46751. var _super = _createSuper$D(SecurityCamera);
  46752. function SecurityCamera(control, options, videoPlayer) {
  46753. var _this;
  46754. _classCallCheck(this, SecurityCamera);
  46755. _this = _super.call(this, options.fov || cameraLight.clampVFOV(constants$4.dollhouseFOV), options.aspect || control.player.cameraControls.cameras.dollhouse.aspect, constants$4.dollhouseNear, constants$4.dollhouseFar);
  46756. _this.shake = function () {
  46757. var id0 = transitions$1.getUniqueId(),
  46758. id1 = transitions$1.getUniqueId();
  46759. var _self = _assertThisInitialized(_this);
  46760. var targetQuat;
  46761. return function shake(needsShake) {
  46762. targetQuat = targetQuat && targetQuat.equals(_self.shakingRange.to) ? _self.shakingRange.from : _self.shakingRange.to;
  46763. if (needsShake) {
  46764. transitions$1.start(lerp.quaternion(_self.quaternion, targetQuat), _self.shakingDuration, null, 0, null, null, id0);
  46765. transitions$1.start(lerp.quaternion(_self.cylinder.quaternion, targetQuat), _self.shakingDuration, function () {
  46766. return shake(true);
  46767. }, 0, null, null, id1);
  46768. } else {
  46769. transitions$1.cancelById(id0);
  46770. transitions$1.cancelById(id1);
  46771. }
  46772. };
  46773. }();
  46774. _this.options = options;
  46775. _this.control = control;
  46776. _this.player = _this.control.player;
  46777. _this.videoPlayer = videoPlayer;
  46778. _this.sid = options.sid;
  46779. _this.name = options.name || '';
  46780. _this.videoType = options.videoType;
  46781. _this.type = 'SecurityCamera';
  46782. _this.panoId = options.panoId;
  46783. _this.videoSrc = options.video;
  46784. _this.videoActive = false;
  46785. _this.shakingDuration = options.duration || 2000;
  46786. _this.shakingRange = {
  46787. from: new THREE.Quaternion(),
  46788. to: new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI / 2)
  46789. };
  46790. options.from && _this.shakingRange.from.setFromEuler(options.from);
  46791. options.to && _this.shakingRange.to.setFromEuler(options.to);
  46792. _this.posOri = options.posOri || new THREE.Vector3();
  46793. _this.posOffset = options.posOffset || new THREE.Vector3(); // options.position && this.position.copy(options.position)
  46794. _this.position.copy(_this.posOri).add(_this.posOffset); // target的优先级大于rotation
  46795. if (options.target) {
  46796. _this.target = options.target;
  46797. _this.lookAt(options.target);
  46798. } else {
  46799. options.rotation && _this.quaternion.setFromEuler(options.rotation);
  46800. _this.target = new THREE.Vector3(0, 0, -1).applyQuaternion(_this.quaternion).add(_this.position);
  46801. }
  46802. _this.cylinderNear = options.near || 0.03;
  46803. _this.cylinderFar = options.far || 3;
  46804. _this.roll = 0;
  46805. _this.init(); // this.layers.toggle(RenderLayers.DEFAULT)
  46806. _this.layers.enable(RenderLayers.PANOMARKERS);
  46807. _this.layers.enable(RenderLayers.RETICULE);
  46808. _this.player.model.add(_assertThisInitialized(_this));
  46809. /* this.events = {
  46810. onDomElementTouchStart: () => {
  46811. if (this.shouldPlay) {
  46812. console.log('onDomElementTouchStart')
  46813. this.video.play()
  46814. this.player.domElement.removeEventListener('touchstart', this.events.onDomElementTouchStart)
  46815. }
  46816. },
  46817. } */
  46818. return _this;
  46819. } // 横滚角
  46820. _createClass(SecurityCamera, [{
  46821. key: "setRoll",
  46822. value: function setRoll(angle) {
  46823. this.roll = angle % 360;
  46824. this.obj3d.quaternion.setFromAxisAngle(vec1.set(0, 0, -1), THREE.MathUtils.degToRad(angle));
  46825. }
  46826. }, {
  46827. key: "yaw",
  46828. get: function get() {
  46829. // 左右转角
  46830. var lookAt = vec1.copy(this.cylinder.bottom.position).applyQuaternion(this.quaternion);
  46831. var lookAtXZ = lookAt.setY(0);
  46832. var frontDir = vec2.set(0, 0, 1);
  46833. var frontCross = vec3.set(1, 0, 0);
  46834. var angle = (THREE.MathUtils.radToDeg(lookAtXZ.angleTo(frontDir) * Math.sign(lookAtXZ.dot(frontCross))) + 180) % 360;
  46835. if (angle > 180) angle = angle - 360;
  46836. return angle;
  46837. },
  46838. set: function set(yaw) {
  46839. var pitch = this.pitch; // 要先计算pitch,防止窜数据
  46840. var upDir = vec1.set(0, 1, 0);
  46841. var rightDir = vec2.set(1, 0, 0);
  46842. var yawQuat = quat1.setFromAxisAngle(upDir, THREE.MathUtils.degToRad(yaw));
  46843. var pitchQuat = quat2.setFromAxisAngle(rightDir, THREE.MathUtils.degToRad(pitch));
  46844. this.quaternion.multiplyQuaternions(yawQuat, pitchQuat);
  46845. this.updateTarget();
  46846. }
  46847. }, {
  46848. key: "pitch",
  46849. get: function get() {
  46850. // 上下转角
  46851. var lookAt = vec1.copy(this.cylinder.bottom.position).applyQuaternion(this.quaternion);
  46852. var projectVec = vec2.copy(lookAt).projectOnPlane(vec3.set(0, 1, 0));
  46853. var pitch = THREE.MathUtils.radToDeg(lookAt.angleTo(projectVec) * Math.sign(lookAt.y)) % 180;
  46854. if (pitch > 90) pitch = 90 - pitch;
  46855. return pitch;
  46856. },
  46857. set: function set(pitch) {
  46858. pitch = Math.min(Math.max(pitch, -89.9), 89.9); // 防止万向锁
  46859. var yaw = this.yaw < 0 ? this.yaw + 360 : this.yaw;
  46860. var upDir = vec1.set(0, 1, 0);
  46861. var rightDir = vec2.set(1, 0, 0); //.applyQuaternion(this.quaternion)
  46862. var yawQuat = quat1.setFromAxisAngle(upDir, THREE.MathUtils.degToRad(yaw));
  46863. var pitchQuat = quat2.setFromAxisAngle(rightDir, THREE.MathUtils.degToRad(pitch));
  46864. this.quaternion.multiplyQuaternions(yawQuat, pitchQuat);
  46865. this.updateTarget();
  46866. } // 监控镜头摇晃(暂未使用)
  46867. }, {
  46868. key: "init",
  46869. value: function init() {
  46870. var _this2 = this;
  46871. // 投射体材质
  46872. this.normalMat = new THREE.MeshBasicMaterial({
  46873. color: 0x00c8af,
  46874. transparent: true,
  46875. opacity: 0.1,
  46876. side: THREE.DoubleSide,
  46877. depthTest: false
  46878. });
  46879. this.build();
  46880. this.options.pitch && (this.pitch = this.options.pitch);
  46881. this.options.yaw && (this.yaw = this.options.yaw);
  46882. this.options.roll && this.setRoll(this.options.roll);
  46883. this.updateInfo(true);
  46884. var video = this.createVideo();
  46885. if (this.videoSrc) {
  46886. //console.error('createVideo', this.videoSrc, this.sid)
  46887. video.onloadedmetadata = function () {
  46888. video.canPlayed = true;
  46889. video.masters.forEach(function (v) {
  46890. //一个video可以对应多个camera,因为它们链接一样
  46891. v.dispatchEvent({
  46892. type: 'loadedmetadata'
  46893. });
  46894. });
  46895. };
  46896. var canPlayed = function canPlayed(e) {
  46897. _this2.player.$app.Camera.emit('SecurityCamera.videoActive', _this2.sid);
  46898. _this2.videoActive = true; //console.error(' videoActive ',this.sid)
  46899. // this.aspect = video.videoWidth / video.videoHeight
  46900. //this.rebuildCylinder()
  46901. _this2.updateInfo(true);
  46902. };
  46903. if (video.canPlayed) {
  46904. canPlayed();
  46905. } else {
  46906. this.addEventListener('loadedmetadata', canPlayed);
  46907. }
  46908. if (Hls.isSupported() && this.videoType !== 2) {
  46909. //似乎Hls不支持就无法播放
  46910. var hls = new Hls();
  46911. hls.loadSource(this.videoSrc);
  46912. hls.attachMedia(video);
  46913. hls.on(Hls.Events.ERROR, function (event, data) {
  46914. return console.log('HLS加载失败', event, data);
  46915. });
  46916. this.hlsVideoPlayer = hls;
  46917. } // else {
  46918. // console.log(video.src)
  46919. // video.onerror = () => {
  46920. // debugger
  46921. // console.log('###replace')
  46922. // video.src = this.videoSrc
  46923. // video.src = video.src.replace('.flv', '.mp4')
  46924. // }
  46925. // //console.error('Hls is not Supported')
  46926. // }
  46927. this.play(); // ios需要
  46928. this.pause();
  46929. } // 监控视频材质
  46930. this.videoMat = new THREE.MeshBasicMaterial({
  46931. map: new THREE.VideoTexture(video),
  46932. side: THREE.DoubleSide,
  46933. depthTest: false,
  46934. transparent: true // opacity: 0.5,
  46935. });
  46936. this.events = {
  46937. setSize: function setSize(width, height) {
  46938. if (_this2.isWatching) {
  46939. _this2.updateAspect();
  46940. }
  46941. }
  46942. };
  46943. this.player.on('setSize', this.events.setSize);
  46944. }
  46945. }, {
  46946. key: "updateAspect",
  46947. value: function updateAspect() {
  46948. //更新aspect且修改geometry
  46949. var aspect = this.player.cameraControls.cameras.dollhouse.aspect;
  46950. if (aspect != this.aspect) {
  46951. this.aspect = aspect;
  46952. this.updateMesh();
  46953. }
  46954. }
  46955. }, {
  46956. key: "updateMesh",
  46957. value: function updateMesh() {
  46958. var nearHeight, nearWidth, farHeight, farWidth;
  46959. nearHeight = Math.tan(THREE.MathUtils.degToRad(this.fov / 2)) * this.cylinderNear;
  46960. nearWidth = nearHeight * this.aspect;
  46961. farHeight = Math.tan(THREE.MathUtils.degToRad(this.fov / 2)) * this.cylinderFar;
  46962. farWidth = farHeight * this.aspect;
  46963. /* if (this.control.player.$app.config.mobile) {
  46964. ;[nearHeight, nearWidth] = [nearWidth, nearHeight]
  46965. ;[farHeight, farWidth] = [farWidth, farHeight]
  46966. } */
  46967. // 投射体(底面以外)
  46968. var vertices = [],
  46969. bottomVertices = [];
  46970. vertices.push(-nearWidth, nearHeight, -this.cylinderNear);
  46971. vertices.push(nearWidth, nearHeight, -this.cylinderNear);
  46972. vertices.push(nearWidth, -nearHeight, -this.cylinderNear);
  46973. vertices.push(-nearWidth, -nearHeight, -this.cylinderNear);
  46974. bottomVertices.push(-farWidth, farHeight, -this.cylinderFar);
  46975. bottomVertices.push(farWidth, farHeight, -this.cylinderFar);
  46976. bottomVertices.push(farWidth, -farHeight, -this.cylinderFar);
  46977. bottomVertices.push(-farWidth, -farHeight, -this.cylinderFar);
  46978. vertices = vertices.concat(bottomVertices);
  46979. var firstBuild = !this.cylinder;
  46980. if (firstBuild) {
  46981. var uvs = [];
  46982. uvs.push(0, 1, 1, 1, 1, 0, 0, 0);
  46983. uvs.push(0, 1, 1, 1, 1, 0, 0, 0);
  46984. var indexs = [];
  46985. indexs.push(0, 1, 3, 2, 3, 1);
  46986. indexs.push(0, 1, 4, 5, 4, 1);
  46987. indexs.push(1, 2, 5, 6, 5, 2);
  46988. indexs.push(2, 3, 6, 7, 6, 3);
  46989. indexs.push(3, 0, 7, 4, 7, 0); // indexs.push(4, 7, 5, 6, 5, 7)
  46990. var cylinderGeo = new THREE.BufferGeometry();
  46991. cylinderGeo.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvs), 2));
  46992. cylinderGeo.setIndex(new THREE.BufferAttribute(new Uint16Array(indexs), 1));
  46993. this.cylinder = new THREE.Mesh(cylinderGeo, this.normalMat); //if (this.control.player.$app.config.mobile) this.cylinder.rotateZ(-Math.PI / 2) //用户自己旋转屏幕吧
  46994. this.obj3d.add(this.cylinder);
  46995. }
  46996. this.cylinder.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3)); // 投射体底面 (视频)
  46997. var bottomGeo = new THREE.PlaneGeometry(farWidth * 2, farHeight * 2);
  46998. if (firstBuild) {
  46999. this.cylinder.bottom = new THREE.Mesh(bottomGeo, this.normalMat);
  47000. this.cylinder.add(this.cylinder.bottom);
  47001. } else {
  47002. this.cylinder.bottom.geometry.dispose();
  47003. this.cylinder.bottom.geometry = bottomGeo;
  47004. }
  47005. this.cylinder.bottom.position.set(0, 0, this.cylinderNear - this.cylinderFar); // 投射体线框
  47006. if (firstBuild) {
  47007. this.cylinder.line = new THREE.LineSegments(new THREE.EdgesGeometry(this.cylinder.geometry), new THREE.LineBasicMaterial({
  47008. color: 0xffffff,
  47009. opacity: 0.6,
  47010. transparent: true
  47011. }));
  47012. this.cylinder.add(this.cylinder.line);
  47013. } else {
  47014. this.cylinder.line.geometry.dispose();
  47015. this.cylinder.line.geometry = new THREE.EdgesGeometry(this.cylinder.geometry);
  47016. }
  47017. }
  47018. }, {
  47019. key: "createVideo",
  47020. value: function createVideo(src) {
  47021. src && (this.videoSrc = src);
  47022. var video = this.videoPlayer.getVideo(this.videoSrc, this);
  47023. this.video = video;
  47024. return video;
  47025. } // 创建投射体,加载摄像头模型
  47026. }, {
  47027. key: "build",
  47028. value: function build() {
  47029. this.obj3d = new THREE.Group();
  47030. this.obj3d.camera = this;
  47031. this.add(this.obj3d); // 摄像头
  47032. if (!cameraModel) {
  47033. var self = this;
  47034. loaders.gltf(texture.getImageURL('images/camera.glb'), function (gltf) {
  47035. self.tag = gltf.scene.children[0].children[0];
  47036. self.tag.geometry.translate(30, 50, -10);
  47037. self.tag.quaternion.setFromEuler(new THREE.Euler(Math.PI / 2, Math.PI, 0));
  47038. self.obj3d.add(self.tag);
  47039. cameraModel = self.tag.clone();
  47040. });
  47041. } else {
  47042. this.tag = cameraModel.clone();
  47043. this.obj3d.add(this.tag);
  47044. }
  47045. this.updateMesh();
  47046. this.titleLabel = new TextSprite({
  47047. text: this.name,
  47048. backgroundColor: {
  47049. r: 255,
  47050. g: 255,
  47051. b: 255,
  47052. a: 0
  47053. },
  47054. textColor: {
  47055. r: 255,
  47056. g: 255,
  47057. b: 255,
  47058. a: 1
  47059. },
  47060. textshadowColor: '#888',
  47061. borderRadius: 2,
  47062. fontsize: 34,
  47063. renderOrder: 5,
  47064. margin: {
  47065. x: 12,
  47066. y: 10
  47067. },
  47068. //fixOrient:true,
  47069. player: this.player,
  47070. sizeInfo: {
  47071. scale: 0.4,
  47072. nearBound: 3
  47073. }
  47074. });
  47075. this.titleLabel.sprite.material.depthTest = this.titleLabel.sprite.material.depthWrite = true;
  47076. this.titleLabel.position.set(0, -0.2, 0.1);
  47077. this.add(this.titleLabel);
  47078. this.dispatchEvent({
  47079. type: 'build'
  47080. });
  47081. } // 显示监控视频或显示投射体
  47082. }, {
  47083. key: "showVideo",
  47084. value: function showVideo(isShow) {
  47085. //console.warn('showVideo', this.info.sid, isShow )
  47086. if (this.player.cameraControls.activeControl) {
  47087. this.player.cameraControls.activeControl.enabled = isShow ? this.control.isEdit : true;
  47088. }
  47089. if (!this.videoActive) return;
  47090. if (isShow) {
  47091. /* if (browser.detectIOS()) {
  47092. this.player.domElement.addEventListener('touchstart', this.events.onDomElementTouchStart, true)
  47093. } */
  47094. this.play();
  47095. this.normalMat.opacity = 0;
  47096. common.updateVisible(this.cylinder, 'watch', true, 1, 'add');
  47097. this.cylinder.bottom.material = this.videoMat; // this.player.$app.core.get('SceneRenderer').camera = this
  47098. this.cylinder.bottom.renderOrder = RenderOrder.monitorPlane;
  47099. } else {
  47100. this.pause();
  47101. this.normalMat.opacity = 0.08;
  47102. common.updateVisible(this.cylinder, 'watch', false, 1, 'cancel');
  47103. this.cylinder.bottom.material = this.normalMat; // this.player.$app.core.get('SceneRenderer').camera = this.player.camera
  47104. this.cylinder.bottom.renderOrder = RenderOrder.visibleFloor;
  47105. }
  47106. }
  47107. }, {
  47108. key: "play",
  47109. value: function play() {
  47110. var _this3 = this;
  47111. //console.log('play monitor', this.sid, this.videoSrc)
  47112. this.shouldPlay = true;
  47113. if (browser$1.detectWeixin()) {
  47114. //用微信平台的 WeixinJSBridge 越过 Autoplay Policy
  47115. try {
  47116. top.WeixinJSBridge && top.WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
  47117. _this3.video.play();
  47118. }, false);
  47119. } catch (error) {
  47120. this.video.play();
  47121. }
  47122. } else {
  47123. this.video.play();
  47124. if (this.video.paused) {
  47125. console.log('播放不了');
  47126. /* this.player.once('pointerStart', () => {
  47127. this.play()
  47128. }) */
  47129. }
  47130. }
  47131. }
  47132. }, {
  47133. key: "pause",
  47134. value: function pause() {
  47135. this.shouldPlay = false;
  47136. this.video.pause();
  47137. } // 观看监控
  47138. }, {
  47139. key: "watch",
  47140. value: function watch(watchPosition) {
  47141. var _this4 = this;
  47142. this.player.compass.setDisplay(false, true); //产品修改需求监控隐藏指南针 2024/3/18
  47143. if (!this.player.$app.config.view) this.player.compass.switch('axis');
  47144. this.updateAspect(); //console.warn("watch", this.sid)
  47145. this.isWatching = true;
  47146. var dollhouseControl = this.player.cameraControls.controls.dollhouse;
  47147. dollhouseControl.minDistance = 0;
  47148. dollhouseControl.minPolarAngle = -Math.PI;
  47149. dollhouseControl.maxPolarAngle = Math.PI;
  47150. dollhouseControl.mode = 'security';
  47151. dollhouseControl.forbitSetRanges = true; //防止resize时minDistance改变
  47152. this.target.set(0, 0, -1).applyQuaternion(this.quaternion).add(this.position);
  47153. if (!this.videoActive && !this.isNew) {
  47154. //console.error('cannotWatchVideo', this.sid, this.videoSrc)
  47155. this.player.$app.Camera.emit('SecurityCamera.cannotWatchVideo', this.sid);
  47156. } // 切换当前楼层
  47157. var changeFloor = function changeFloor() {
  47158. if (!_this4.player.model.panos.get(_this4.panoId)) return; //当无法获取到pano.floorIndex时无需切换楼层(#43674 监控所绑定的点位被删除)
  47159. var floorIndex = _this4.player.model.panos.get(_this4.panoId).floorIndex;
  47160. var currentFloorId = _this4.player.model.currentFloorId;
  47161. if (currentFloorId != floorIndex
  47162. /*&& currentFloorId != 'all'*/
  47163. ) {
  47164. _this4.player.$app.Scene.emit('Scene.gotoFloor', floorIndex); // 直接emit事件给UI就行,不用额外再调Scene.gotoFloor()
  47165. }
  47166. };
  47167. transitions$1.cancelById('leaveMonitor');
  47168. if (this.player.mode == Viewmode$1.DOLLHOUSE) {
  47169. changeFloor();
  47170. var activeControl = this.player.cameraControls.activeControl;
  47171. transitions$1.start(lerp.property(dollhouseControl.camera, 'fov', this.fov, function (v) {
  47172. dollhouseControl.camera.staticFov = v;
  47173. }), 1000);
  47174. transitions$1.start(lerp.vector(activeControl.target, this.target), 1000, null, 0, easing[settings$3.flydown.rotationEasing], null, settings$3.freeze.LookRotationForPlay);
  47175. transitions$1.start(lerp.vector(activeControl.camera.position, watchPosition || this.position), 1000, function () {
  47176. if (_this4.player.mode != Viewmode$1.DOLLHOUSE) return;
  47177. _this4.showVideo(true);
  47178. _this4.tag.material.color.copy(hoverColor);
  47179. dollhouseControl.camera.near = 0.09; // 调太小的话摄像机会露出来
  47180. }, 0, easing[settings$3.flydown.movementEasing], null, settings$3.freeze.LookRotationForPlay);
  47181. } else {
  47182. dollhouseControl.camera.staticFov = dollhouseControl.camera.fov = this.fov;
  47183. dollhouseControl.camera.updateProjectionMatrix(); // console.error("watch")
  47184. this.player.flyToNewMode({
  47185. mode: Viewmode$1.DOLLHOUSE,
  47186. position: watchPosition || this.position,
  47187. target: this.target,
  47188. callback: function callback() {
  47189. changeFloor();
  47190. _this4.showVideo(true);
  47191. _this4.tag.material.color.copy(hoverColor);
  47192. dollhouseControl.camera.near = 0.09;
  47193. }
  47194. });
  47195. }
  47196. this.player.emit('beginShowMonitor');
  47197. } // 停止观看监控
  47198. }, {
  47199. key: "leave",
  47200. value: function leave() {
  47201. var _this5 = this;
  47202. this.player.compass.setDisplay(true, false); //产品修改需求监控隐藏指南针 2024/3/18
  47203. if (!this.player.$app.config.view) this.player.compass.switch('direction'); //console.warn("leave", this.sid)
  47204. this.showVideo(false);
  47205. this.isWatching = false; // if (this.control.isEdit) {
  47206. // this.player.reticule.visible = true
  47207. // }
  47208. this.tag.material.color.copy(normalColor);
  47209. var dollhouseControl = this.player.cameraControls.controls.dollhouse;
  47210. dollhouseControl.camera.near = 1;
  47211. dollhouseControl.minPolarAngle = 25 / 180 * Math.PI;
  47212. dollhouseControl.maxPolarAngle = Math.PI / 2;
  47213. dollhouseControl.mode = 'model'; // transitions.start(lerp.property(dollhouseControl.camera, 'fov', 70), 200, () => dollhouseControl.camera.updateProjectionMatrix())
  47214. transitions$1.cancelById('leaveMonitor');
  47215. transitions$1.cancelById(settings$3.freeze.LookRotationForPlay); //xzw add
  47216. var endFov = this.player.baseFov * (1 / this.player.zoomLevel);
  47217. transitions$1.start(lerp.property(dollhouseControl.camera, 'fov', endFov, function (v) {
  47218. dollhouseControl.camera.staticFov = v;
  47219. }), 1000, function () {
  47220. dollhouseControl.camera.staticFov = null;
  47221. dollhouseControl.camera.fov = endFov;
  47222. dollhouseControl.camera.updateProjectionMatrix();
  47223. dollhouseControl.forbitSetRanges = false;
  47224. dollhouseControl.updateDistance(dollhouseControl.camera.aspect);
  47225. _this5.player.emit('leavedShowMonitor');
  47226. }, null, null, null, 'leaveMonitor');
  47227. } // 设置position
  47228. }, {
  47229. key: "updatePosition",
  47230. value: function updatePosition(position) {
  47231. this.position.set(position.x, position.y, position.z);
  47232. this.updateTarget();
  47233. } // 设置rotation
  47234. }, {
  47235. key: "updateRotation",
  47236. value: function updateRotation(rotation) {
  47237. this.rotation.set(rotation.x, rotation.y, rotation.z);
  47238. this.updateTarget();
  47239. } // 设置target
  47240. }, {
  47241. key: "updateTarget",
  47242. value: function updateTarget(target) {
  47243. if (target) {
  47244. this.target.set(target.x, target.y, target.z); //.sub(this.position).multiplyScalar(-1).add(this.position)
  47245. this.lookAt(this.target);
  47246. } else {
  47247. this.target.set(0, 0, -1).applyQuaternion(this.quaternion).add(this.position);
  47248. }
  47249. } // 根据fov、cylinderFar等数据更新线框
  47250. /* rebuildCylinder() {
  47251. this.target.set(0, 0, -1).applyQuaternion(this.quaternion).add(this.position)
  47252. let nearHeight, nearWidth, farHeight, farWidth
  47253. if (this.aspect <= window.innerWidth / window.innerHeight) {
  47254. nearHeight = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderNear
  47255. nearWidth = nearHeight * this.aspect
  47256. farHeight = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderFar
  47257. farWidth = farHeight * this.aspect
  47258. if (this.control.player.$app.config.mobile) {
  47259. ;[nearHeight, nearWidth] = [nearWidth, nearHeight]
  47260. ;[farHeight, farWidth] = [farWidth, farHeight]
  47261. }
  47262. } else {
  47263. nearWidth = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderNear * (window.innerWidth / window.innerHeight)
  47264. nearHeight = nearWidth / this.aspect
  47265. farWidth = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderFar * (window.innerWidth / window.innerHeight)
  47266. farHeight = farWidth / this.aspect
  47267. }
  47268. // 投射体
  47269. let vertices = [],
  47270. bottomVertices = []
  47271. vertices.push(-nearWidth, nearHeight, -this.cylinderNear)
  47272. vertices.push(nearWidth, nearHeight, -this.cylinderNear)
  47273. vertices.push(nearWidth, -nearHeight, -this.cylinderNear)
  47274. vertices.push(-nearWidth, -nearHeight, -this.cylinderNear)
  47275. bottomVertices.push(-farWidth, farHeight, -this.cylinderFar)
  47276. bottomVertices.push(farWidth, farHeight, -this.cylinderFar)
  47277. bottomVertices.push(farWidth, -farHeight, -this.cylinderFar)
  47278. bottomVertices.push(-farWidth, -farHeight, -this.cylinderFar)
  47279. vertices = vertices.concat(bottomVertices)
  47280. this.cylinder.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3))
  47281. // this.cylinder.bottom.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(bottomVertices), 3))
  47282. this.cylinder.bottom.geometry.dispose()
  47283. this.cylinder.bottom.geometry = new THREE.PlaneGeometry(farWidth * 2, farHeight * 2)
  47284. // 投射体线框
  47285. this.cylinder.line.geometry.dispose()
  47286. this.cylinder.line.geometry = new THREE.EdgesGeometry(this.cylinder.geometry)
  47287. } */
  47288. /**
  47289. * @param {*} isSave 是否保存当前数据
  47290. * @returns 返回监控当前数据
  47291. */
  47292. }, {
  47293. key: "updateInfo",
  47294. value: function updateInfo(isSave) {
  47295. var info = {
  47296. sid: this.sid,
  47297. name: this.name,
  47298. panoId: this.panoId,
  47299. posOri: {
  47300. x: this.posOri.x,
  47301. y: this.posOri.y,
  47302. z: this.posOri.z
  47303. },
  47304. posOffset: {
  47305. x: this.posOffset.x,
  47306. y: this.posOffset.y,
  47307. z: this.posOffset.z
  47308. },
  47309. fov: this.fov,
  47310. aspect: this.aspect,
  47311. far: this.cylinderFar,
  47312. roll: Math.round(this.roll),
  47313. pitch: Math.round(this.pitch),
  47314. yaw: Math.round(this.yaw),
  47315. /* playUrl */
  47316. video: this.videoSrc,
  47317. videoType: this.videoType
  47318. };
  47319. if (isSave) this.info = info;
  47320. return info;
  47321. }
  47322. /* show(reason, level=0) {
  47323. console.warn('show',this.info.sid, reason, level)
  47324. if(!reason) common.updateVisible(this, 'common', true)
  47325. else common.updateVisible(this, reason, true, level, 'add')
  47326. }
  47327. hide(reason, level=0) {
  47328. if(!reason) common.updateVisible(this, 'common', true)
  47329. else common.updateVisible(this, reason, false, level, 'cancel')
  47330. } */
  47331. }, {
  47332. key: "dispose",
  47333. value: function dispose() {
  47334. var parent = this.parent;
  47335. parent.remove(this);
  47336. transitions$1.cancelById('cameraHighlight' + this.sid);
  47337. this.tag.geometry.dispose();
  47338. this.tag.material.dispose();
  47339. this.cylinder.line.geometry.dispose();
  47340. this.cylinder.line.material.dispose();
  47341. this.cylinder.geometry.dispose();
  47342. this.normalMat.dispose();
  47343. this.videoMat.dispose();
  47344. this.player.off('setSize', this.events.setSize);
  47345. this.titleLabel.dispose();
  47346. this.hlsVideoPlayer && this.hlsVideoPlayer.destroy();
  47347. }
  47348. }, {
  47349. key: "highlight",
  47350. value: function highlight(state) {
  47351. if (this.hightlighted == state) return;
  47352. this.hightlighted = state;
  47353. transitions$1.cancelById('cameraHighlight' + this.sid);
  47354. transitions$1.start(lerp.color(this.tag.material.color, state ? hoverColor : normalColor), 100, null, null, null, null, 'cameraHighlight' + this.sid);
  47355. }
  47356. }]);
  47357. return SecurityCamera;
  47358. }(THREE.PerspectiveCamera);
  47359. /*
  47360. xzw 2023.6.9
  47361. 新增需求:视频永远铺满屏幕,而非和场景背景对应。
  47362. 这样一来fov那些改变没有意义其实,只是mesh有直观变化,相机不变fov也行,只要能铺满。
  47363. 视频mesh不需要旋转,在手机端时用户可以自行旋转手机来观看。电脑的话就只能自己把屏幕变窄了。
  47364. */
  47365. var SecurityControls = /*#__PURE__*/function () {
  47366. function SecurityControls(player) {
  47367. _classCallCheck(this, SecurityControls);
  47368. this.app = player.$app;
  47369. this.player = player;
  47370. this.isEdit = false; // 是否进入编辑页面
  47371. this.unbindDollhouse = false; // dollhouseCamera是否跟随当前监控一起动
  47372. this.cameras = [];
  47373. this.hoverCamera = null;
  47374. this.watchingCamera = null; // 正在观看的相机
  47375. this.editingCamera = null; // 正在编辑的相机
  47376. this.selectType = null; // 相机还是投影面
  47377. this.transformType = 0;
  47378. this.hideCylinder = true; // 用于标明是否隐藏线框
  47379. this.isFloorplan = player.mode === Viewmode$1.FLOORPLAN; // 用于在FLOORPLAN模式下隐藏obj3d
  47380. // 退出监控的移动范围
  47381. this.maxVisiAngle = Math.PI / 6;
  47382. this.maxVisiZoom = 2;
  47383. this.maxVisiDistance = 1;
  47384. this.bindEvents();
  47385. }
  47386. _createClass(SecurityControls, [{
  47387. key: "currentCamera",
  47388. get: function get() {
  47389. if (this.isEdit) {
  47390. return this.editingCamera;
  47391. } else {
  47392. return this.watchingCamera;
  47393. }
  47394. }
  47395. }, {
  47396. key: "editingCamera",
  47397. get: function get() {
  47398. return this._editingCamera;
  47399. },
  47400. set: function set(c) {
  47401. if (c != this._editingCamera) {
  47402. this._editingCamera && common.updateVisible(this._editingCamera, 'edit', false, 2, 'cancel');
  47403. if (c) common.updateVisible(c, 'edit', true, 2, 'add');
  47404. this._editingCamera = c;
  47405. }
  47406. }
  47407. }, {
  47408. key: "addCamera",
  47409. value: function addCamera(camera) {
  47410. this.cameras.push(camera);
  47411. }
  47412. }, {
  47413. key: "removeCamera",
  47414. value: function removeCamera(camera) {
  47415. // this.disableTransformControl()
  47416. camera.isWatching && this.stopWatch();
  47417. this.cameras = this.cameras.filter(function (c) {
  47418. return c != camera;
  47419. });
  47420. camera.dispose();
  47421. }
  47422. /**
  47423. * 观看监控
  47424. * @param { Vector3 } watchPosition dollhose相机跳转位置,有则unbindDollhouse为true,无则默认监控位置
  47425. */
  47426. }, {
  47427. key: "watch",
  47428. value: function () {
  47429. var _watch = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(camera, watchPosition) {
  47430. return regenerator.wrap(function _callee$(_context) {
  47431. while (1) {
  47432. switch (_context.prev = _context.next) {
  47433. case 0:
  47434. if (!(this.player.mode == 'transitioning')) {
  47435. _context.next = 2;
  47436. break;
  47437. }
  47438. return _context.abrupt("return");
  47439. case 2:
  47440. if (!(this.app.Camera.monitor.locked && this.app.Camera.monitor.locked.then)) {
  47441. _context.next = 5;
  47442. break;
  47443. }
  47444. _context.next = 5;
  47445. return this.app.Camera.monitor.locked;
  47446. case 5:
  47447. if (this.watchingCamera) {
  47448. this.watchingCamera != camera && this.stopWatch();
  47449. } else {
  47450. // 只记录还没在watch时的状态
  47451. this.lastViewState = {
  47452. mode: this.player.mode,
  47453. floorIndex: this.player.model.allFloorsVisible ? 'all' : this.player.model.currentFloorId,
  47454. quaternion: this.player.quaternion.clone(),
  47455. position: this.player.position.clone(),
  47456. target: this.player.cameraControls.activeControl.target.clone(),
  47457. currentScale: this.player.cameraControls.activeControl.currentScale
  47458. };
  47459. }
  47460. camera.watch(watchPosition);
  47461. this.watchingCamera = camera;
  47462. this.player.$app.Camera.emit('SecurityCamera.watch', {
  47463. sid: camera.sid,
  47464. supportPlay: Hls.isSupported() || camera.videoActive
  47465. }); //
  47466. // // 进入监控后,使currentPano变为监控所在pano
  47467. // let pano = this.player.model.panos.get(camera.panoId)
  47468. // if (pano.neighbourUUIDs.filter(id => id != pano.id).length > 0) {
  47469. // this.player.currentPano = pano
  47470. // } else {
  47471. // let notAlonePano = this.player.model.panos.closestPanoTowardPoint({
  47472. // point: camera.position,
  47473. // require: [pano => pano.neighbourUUIDs.filter(id => id != pano.id).length > 0],
  47474. // })
  47475. // notAlonePano && (this.player.currentPano = notAlonePano)
  47476. // }
  47477. if (this.isEdit) {
  47478. this.unbindDollhouse = !!watchPosition;
  47479. this.editingCamera = camera;
  47480. this.selectType = 'camera';
  47481. this.player.$app.Camera.emit('SecurityCamera.select', this.currentCamera.updateInfo());
  47482. }
  47483. case 10:
  47484. case "end":
  47485. return _context.stop();
  47486. }
  47487. }
  47488. }, _callee, this);
  47489. }));
  47490. function watch(_x, _x2) {
  47491. return _watch.apply(this, arguments);
  47492. }
  47493. return watch;
  47494. }()
  47495. }, {
  47496. key: "stopWatch",
  47497. value: function stopWatch() {
  47498. if (this.watchingCamera) {
  47499. //console.error('stopWatch', this.watchingCamera.sid)
  47500. this.watchingCamera.isWatching && this.watchingCamera.leave();
  47501. this.player.$app.Camera.emit('SecurityCamera.stopWatch', this.watchingCamera.sid);
  47502. this.watchingCamera = null;
  47503. if (this.isEdit) {
  47504. this.editingCamera = null;
  47505. this.selectType = null;
  47506. this.player.$app.Camera.emit('SecurityCamera.unselect');
  47507. }
  47508. }
  47509. }
  47510. }, {
  47511. key: "hideAll",
  47512. value: function hideAll(floorIndex) {
  47513. var _this = this;
  47514. var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'common';
  47515. var level = arguments.length > 2 ? arguments[2] : undefined;
  47516. var type = arguments.length > 3 ? arguments[3] : undefined;
  47517. this.cameras.forEach(function (cam) {
  47518. if (floorIndex == void 0 || _this.player.model.panos.get(cam.panoId) && _this.player.model.panos.get(cam.panoId).floorIndex === floorIndex) {
  47519. // 当floorIndex有值时,该方法无法影响"获取不到floorIndex的监控" (#43674 监控所绑定的点位被删除)
  47520. // /* cam != this.editingCamera && */ cam.hide(reason) // 编辑中的监控不会被隐藏
  47521. common.updateVisible(cam, reason, false, level, type);
  47522. }
  47523. });
  47524. }
  47525. }, {
  47526. key: "showAll",
  47527. value: function showAll(floorIndex) {
  47528. var _this2 = this;
  47529. var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'common';
  47530. var level = arguments.length > 2 ? arguments[2] : undefined;
  47531. var type = arguments.length > 3 ? arguments[3] : undefined;
  47532. if (this.isFloorplan) return;
  47533. this.cameras.forEach(function (cam) {
  47534. if (floorIndex == void 0 || _this2.player.model.panos.get(cam.panoId) && _this2.player.model.panos.get(cam.panoId).floorIndex === floorIndex) {
  47535. // 当floorIndex有值时,该方法无法影响"获取不到floorIndex的监控" (#43674 监控所绑定的点位被删除)
  47536. //cam.show(reason)
  47537. common.updateVisible(cam, reason, true, level, type);
  47538. }
  47539. });
  47540. } // enableTransformControl() {
  47541. // this.player.model.transformControls.switchEditState('overlay')
  47542. // }
  47543. // disableTransformControl() {
  47544. // this.player.model.transformControls.detach()
  47545. // this.editingCamera && this.editingCamera.showVideo(false)
  47546. // this.editingCamera = null
  47547. // this.selectType = null
  47548. // this.player.$app.Camera.emit('SecurityCamera.unselect')
  47549. // }
  47550. }, {
  47551. key: "bindEvents",
  47552. value: function bindEvents() {
  47553. var _this3 = this;
  47554. this.player.on('pointerUp', this.onMouseUp.bind(this));
  47555. this.player.on('touchend', this.onMouseUp.bind(this));
  47556. this.player.on('pointerMove', this.onMouseMove.bind(this));
  47557. this.player.domElement.addEventListener('mousewheel', this.onMouseWheel.bind(this));
  47558. {
  47559. var cameraMeshes = [];
  47560. this.player.on('collectIntersectMesh', function (meshes, e) {
  47561. //推送要intersect的mesh
  47562. cameraMeshes = _this3.cameras.filter(function (camera) {
  47563. return camera.tag && camera.obj3d.visible;
  47564. }).map(function (camera) {
  47565. return camera.tag;
  47566. });
  47567. meshes.push.apply(meshes, _toConsumableArray(cameraMeshes));
  47568. });
  47569. this.player.on('judgeIntersect', function (intersect, e) {
  47570. //判断是否intersect了overlay
  47571. if (e.getConsumed()) return;
  47572. if (intersect && cameraMeshes.includes(intersect.object)) {
  47573. _this3.hoverCamera = intersect.object.parent.camera;
  47574. _this3.player.$app.Camera.emit('SecurityCamera.hover', _this3.hoverCamera.sid);
  47575. _this3.hoverCamera.highlight(true);
  47576. CursorDeal.add('hoverMonitor');
  47577. e.consume();
  47578. } else {
  47579. if (_this3.hoverCamera) {
  47580. _this3.hoverCamera.highlight(false);
  47581. _this3.hoverCamera = null;
  47582. _this3.player.$app.Camera.emit('SecurityCamera.nothover');
  47583. CursorDeal.remove('hoverMonitor');
  47584. }
  47585. }
  47586. });
  47587. }
  47588. this.player.on(PlayerEvents.PanoChosen, function () {
  47589. _this3.isEdit || _this3.stopWatch(); // 在浏览监控时退出当前监控
  47590. });
  47591. this.player.on(PlayerEvents.ModeChanging, function (currentMode, mode) {
  47592. _this3.isEdit || _this3.stopWatch(); // 在浏览监控时退出当前监控
  47593. // 在floorplan隐藏(编辑时跳到floorplan不用隐藏)
  47594. if (currentMode === Viewmode$1.FLOORPLAN) {
  47595. _this3.isFloorplan = false;
  47596. _this3.isEdit || _this3.cameras.forEach(function (cam) {
  47597. return common.updateVisible(cam, 'common', true);
  47598. }
  47599. /* cam.show() */
  47600. );
  47601. }
  47602. if (mode === Viewmode$1.FLOORPLAN) {
  47603. _this3.isFloorplan = true;
  47604. _this3.isEdit || _this3.cameras.forEach(function (cam) {
  47605. return common.updateVisible(cam, 'common', false);
  47606. }
  47607. /* cam.hide() */
  47608. );
  47609. }
  47610. });
  47611. }
  47612. }, {
  47613. key: "onMouseUp",
  47614. value: function onMouseUp(e) {
  47615. if (!this.hoverCamera) this.onMouseMove();
  47616. if (this.hoverCamera && this.hoverCamera.visible === true) {
  47617. e.consume();
  47618. if (!this.hoverCamera.videoActive && !this.hoverCamera.isNew && this.app.config.view == true) {
  47619. // #42503 在展示页时若监控无法播放不飞入
  47620. this.player.$app.Camera.emit('SecurityCamera.cannotWatchVideo', this.hoverCamera.sid);
  47621. return;
  47622. }
  47623. this.watch(this.hoverCamera);
  47624. }
  47625. }
  47626. }, {
  47627. key: "onMouseMove",
  47628. value: function onMouseMove() {
  47629. if (this.watchingCamera && this.watchingCamera.isWatching) {
  47630. if (this.isEdit) {
  47631. if (this.player.mouseDown) {
  47632. this.unbindDollhouse = true;
  47633. }
  47634. }
  47635. }
  47636. /* // hover 高亮
  47637. let intersect = this.player.getMouseIntersect(
  47638. null,
  47639. this.cameras.filter(camera => camera.tag && camera.obj3d.visible).map(camera => camera.tag)
  47640. )
  47641. if (intersect) {
  47642. this.hoverCamera = intersect.object.parent.camera
  47643. if (!this.watchingCamera) {
  47644. transitions.start(lerp.color(this.hoverCamera.tag.material.color, this.hoverColor), 100)
  47645. this.player.$app.Camera.emit('SecurityCamera.hover', this.hoverCamera.sid)
  47646. }
  47647. } else if (this.hoverCamera) {
  47648. if (!this.watchingCamera) {
  47649. transitions.start(lerp.color(this.hoverCamera.tag.material.color, this.normalColor), 100)
  47650. this.player.$app.Camera.emit('SecurityCamera.nothover')
  47651. }
  47652. this.hoverCamera = null
  47653. } */
  47654. }
  47655. }, {
  47656. key: "onMouseWheel",
  47657. value: function onMouseWheel() {
  47658. if (this.watchingCamera && this.watchingCamera.isWatching) {
  47659. if (this.isEdit) {
  47660. this.unbindDollhouse = true;
  47661. }
  47662. }
  47663. }
  47664. }]);
  47665. return SecurityControls;
  47666. }();
  47667. function _createSuper$C(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$C(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  47668. function _isNativeReflectConstruct$C() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  47669. var TagSpot = /*#__PURE__*/function (_THREE$Group) {
  47670. _inherits(TagSpot, _THREE$Group);
  47671. var _super = _createSuper$C(TagSpot);
  47672. function TagSpot(player) {
  47673. var _this;
  47674. _classCallCheck(this, TagSpot);
  47675. _this = _super.call(this);
  47676. _this.player = player;
  47677. _this.renderOrder = RenderOrder.reticule;
  47678. _this.name = 'TagSpot3d';
  47679. _this.visible = false;
  47680. _this.height = new THREE.Vector3(0, 0, 0.12);
  47681. player.model.add(_assertThisInitialized(_this));
  47682. _this.build();
  47683. return _this;
  47684. }
  47685. _createClass(TagSpot, [{
  47686. key: "build",
  47687. value: function build() {
  47688. var tag = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.15, 0.15, 1, 1), new THREE.MeshLambertMaterial({
  47689. transparent: true,
  47690. depthTest: false,
  47691. map: common.loadTextureFromCache(texture.getImageURL('images/tag_icon_default.svg'))
  47692. }));
  47693. tag.renderOrder = RenderOrder.tagDisc;
  47694. tag.position.copy(this.height);
  47695. this.topMesh = tag;
  47696. this.add(tag);
  47697. var stemLine = LineDraw.createLine([this.height, new THREE.Vector3(0, 0, 0)], {
  47698. width: 2,
  47699. color: '#eee'
  47700. }); //垂线
  47701. this.line = stemLine;
  47702. this.add(stemLine);
  47703. var arrow = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.35, 0.35, 1, 1), new THREE.MeshLambertMaterial({
  47704. transparent: true,
  47705. depthTest: false,
  47706. map: common.loadTextureFromCache(texture.getImageURL('images/tag_pointer.png'))
  47707. }));
  47708. this.bottomMesh = arrow;
  47709. this.add(arrow);
  47710. }
  47711. }, {
  47712. key: "updateSize",
  47713. value: function updateSize() {
  47714. var s = math$1.getScaleForConstantSize({
  47715. width2d: 500,
  47716. position: this.position,
  47717. camera: this.player.camera,
  47718. dom: this.player.$app.dom
  47719. });
  47720. this.topMesh.scale.set(s, s, s);
  47721. }
  47722. }]);
  47723. return TagSpot;
  47724. }(THREE.Group);
  47725. function _createSuper$B(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$B(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  47726. function _isNativeReflectConstruct$B() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  47727. var Monitor = /*#__PURE__*/function () {
  47728. function Monitor(app) {
  47729. var _this = this;
  47730. _classCallCheck(this, Monitor);
  47731. this.app = app;
  47732. this.edit = {};
  47733. this.isSingleView = false;
  47734. this.locked = null;
  47735. this.deferred = Deferred$1();
  47736. if (!Hls.isSupported()) {
  47737. console.error('Hls is not Supported, 部分监控视频可能不支持'); //iphoneX不支持 小米Civi 1S支持。
  47738. }
  47739. this.app.Scene.on('loaded', function () {
  47740. var player = _this.app.core.get('Player');
  47741. _this.control = new SecurityControls(player);
  47742. var canEdit = !_this.app.config.view && !_this.app.config.mobile; //手机编辑页无法编辑监控所以当做展示页面处理
  47743. //if (!Hls.isSupported() && !canEdit) return //不支持
  47744. var nonsupportH5Video = window.MediaSource && browser$1.detectAndroidMobile();
  47745. _this.videoPlayer = nonsupportH5Video ? new FlvVideoPlayer(player) : new H5VideoPlayer(player); // if (!this.app.config.mobile) {
  47746. // // 移动端禁用监控
  47747. // 初始数据
  47748. var addMonitorsFromData = function addMonitorsFromData(arr) {
  47749. // 编辑页要先隐藏cylinder
  47750. _this.control.hideCylinder = canEdit;
  47751. arr.forEach(function (data) {
  47752. var option = {
  47753. sid: data.sid,
  47754. name: data.name,
  47755. panoId: data.panoId,
  47756. video: data.urlType === 2 ? app.resource.getUserResourceURL(data.fileName) : data.playUrl,
  47757. //1=m3u8 2=mp4
  47758. posOri: new THREE.Vector3(parseFloat(data.data['posOri-x']), parseFloat(data.data['posOri-y']), parseFloat(data.data['posOri-z'])),
  47759. posOffset: new THREE.Vector3(parseFloat(data.data['posOffset-x']), parseFloat(data.data['posOffset-y']), parseFloat(data.data['posOffset-z'])),
  47760. fov: parseInt(data.data.fov),
  47761. //纵向fov
  47762. far: parseFloat(data.data.far),
  47763. yaw: parseInt(data.data.yaw),
  47764. roll: parseInt(data.data.roll),
  47765. pitch: parseInt(data.data.pitch),
  47766. videoType: data.urlType
  47767. };
  47768. if (nonsupportH5Video && data.urlType === 2) {
  47769. option.video = option.video.replace('.mp4', '.flv');
  47770. }
  47771. var camera = new SecurityCamera(_this.control, option, _this.videoPlayer);
  47772. camera.cylinder.visible = !_this.control.hideCylinder;
  47773. _this.control.addCamera(camera);
  47774. });
  47775. if (!_this.app.store.getValue('metadata').controls.showCameraTitle) {
  47776. _this.changeTitlesShow(false);
  47777. }
  47778. _this.deferred && _this.deferred.resolve();
  47779. };
  47780. var monitorData = _this.app.store.getValue('cameras');
  47781. if (monitorData) addMonitorsFromData(monitorData);else _this.app.store.on('cameras', function (data) {
  47782. return addMonitorsFromData(data);
  47783. }); // }
  47784. // 判断,激光场景在单屏内添加热点
  47785. var metadata = _this.app.store.getValue('metadata');
  47786. if (metadata) _this.isSingleView = metadata.sceneFrom == 'laser';else _this.app.store.on('metadata', function (data) {
  47787. return _this.isSingleView = data.sceneFrom == 'laser';
  47788. }); // spot3d,用于单屏 -----------------------------------
  47789. if (_this.isSingleView) {
  47790. _this.spot3d = new TagSpot(player);
  47791. _this.spot3d.visible = false;
  47792. var intersectSpot3d;
  47793. var lookAt = new THREE.Vector3(); // spot3d相关事件
  47794. player.on('pointerStart', function (e) {
  47795. if (!_this.isSingleView) return;
  47796. if (!_this.editingCamera) return;
  47797. if (intersectSpot3d) {
  47798. _this.updateTagPos = true;
  47799. player.cameraControls.activeControl.enabled = false;
  47800. }
  47801. });
  47802. player.on('pointerMove', function (e) {
  47803. if (!_this.isSingleView) return;
  47804. if (!_this.editingCamera && !_this.updateTagPos) return;
  47805. intersectSpot3d = player.getMouseIntersect(null, [_this.spot3d.topMesh, _this.spot3d.bottomMesh]);
  47806. if (intersectSpot3d) {
  47807. player.domElement.style.cursor = 'move';
  47808. } else if (_this.editingCamera && !_this.updateTagPos) {
  47809. player.domElement.style.cursor = 'default';
  47810. }
  47811. if (_this.updateTagPos) {
  47812. var intersect = player.getMouseIntersect(null, player.OverlayManager.group.children.concat(player.model.colliders));
  47813. if (intersect) {
  47814. _this.spot3d.visible = true;
  47815. _this.spot3d.position.copy(intersect.point);
  47816. _this.spot3d.lookAt(lookAt.addVectors(intersect.point, intersect.normal));
  47817. _this.spot3d.topMesh.lookAt(player.camera.position);
  47818. _this.spot3d.updateSize();
  47819. } else {
  47820. _this.spot3d.visible = false;
  47821. }
  47822. }
  47823. });
  47824. player.on('pointerUp', function (e) {
  47825. if (!_this.isSingleView) return;
  47826. if (_this.spot3d && _this.spot3d.visible) {
  47827. player.cameraControls.activeControl.enabled = true;
  47828. player.cameraControls.activeControl.pointerDragOn = false;
  47829. _this.updateTagPos = false;
  47830. if (!_this.editingCamera) {
  47831. _this.editingCamera = {
  47832. position: _this.spot3d.position,
  47833. sid: common.getRandomSid()
  47834. };
  47835. }
  47836. }
  47837. });
  47838. } // --------------------------------------------------
  47839. player.on('update', function () {
  47840. // 显隐过滤
  47841. if (_this.camPosChosing || // 选择监控位置时
  47842. _this.control.isEdit || // 编辑监控时
  47843. _this.app.TagManager.tagPosChosing || // 选择热点位置时
  47844. _this.app.TagManager.tagInfoEditing || // 编辑热点时
  47845. _this.app.TourManager.editing || // 进入导览模块
  47846. _this.app.ViewLinkEdit.markView || // 编辑场景关联时
  47847. player.currentPano.panoType == '360view' || player.paintEditor && player.paintEditor.painting || player.linkEditor && player.linkEditor.setPanoVisible || player.linkEditor && player.linkEditor.setTagVisible // 设置热点可视时
  47848. ) {
  47849. // 只显示正在观看的监控
  47850. _this.control.cameras.forEach(function (camera) {
  47851. //camera.obj3d.visible = !!camera.isWatching
  47852. common.updateVisible(camera, 'hideAtSomePage', !!camera.isWatching);
  47853. });
  47854. } else {
  47855. _this.control.cameras.forEach(function (camera) {
  47856. //camera.obj3d.visible = true
  47857. common.updateVisible(camera, 'hideAtSomePage', true);
  47858. });
  47859. }
  47860. });
  47861. });
  47862. /**
  47863. * ------------------------进入或离开当前模块--------------------------
  47864. */
  47865. this.edit.enterModule = function (isShowCylinder) {
  47866. if (_this.control) {
  47867. _this.edit.hideCylinder(!isShowCylinder); // 在进入模块的时候还必须传videoActive给UI
  47868. setTimeout(function () {
  47869. //等待侦听加上
  47870. _this.control.cameras.forEach(function (camera) {
  47871. camera.videoActive && _this.app.Camera.emit('SecurityCamera.videoActive', camera.sid);
  47872. });
  47873. }, 1);
  47874. } else {
  47875. _this.deferred.then(function () {
  47876. return _this.edit.enterModule(isShowCylinder);
  47877. });
  47878. }
  47879. };
  47880. this.edit.leaveModule = function () {
  47881. if (_this.control) {
  47882. _this.edit.hideCylinder(true);
  47883. } else {
  47884. _this.deferred = null;
  47885. }
  47886. };
  47887. /**
  47888. * ------------------------新增或编辑(确定坐标)---------------------
  47889. */
  47890. this.edit.enter = function (camera) {
  47891. _this.editingCamera = camera;
  47892. _this.camPosChosing = true;
  47893. if (_this.isSingleView) {
  47894. _this.app.TagManager.hideAll();
  47895. var player = _this.app.core.get('Player');
  47896. player.reticule.visible = false;
  47897. if (camera) {
  47898. // 修改
  47899. player.flyToPano({
  47900. pano: player.model.panos.get(camera.panoId),
  47901. lookAtPoint: camera.position.clone(),
  47902. aimDuration: 500,
  47903. checkAlone: true
  47904. }, function () {
  47905. player.locked = true;
  47906. _this.updateTagPos = false;
  47907. _this.spot3d.position.set(camera.position.x, camera.position.y, camera.position.z);
  47908. _this.spot3d.updateSize();
  47909. setTimeout(function () {
  47910. var tagScreenPos = new THREE.Vector3(0, 0, 0);
  47911. var tagNDCPos = new THREE.Vector3(0, 0, 0.5);
  47912. math$1.projectPositionToCanvas(camera.position, player.camera, tagScreenPos, player.domElement);
  47913. math$1.convertScreenPositionToNDC(tagScreenPos.x, tagScreenPos.y, tagNDCPos, player.domElement);
  47914. var intersect = player.getMouseIntersect(tagNDCPos, player.OverlayManager.group.children.concat(player.model.colliders));
  47915. intersect && (_this.spot3d.lookAt(intersect.normal.add(_this.spot3d.position)), _this.spot3d.topMesh.lookAt(player.camera.position));
  47916. _this.spot3d.visible = true;
  47917. }, 10);
  47918. });
  47919. } else {
  47920. // 新增
  47921. _this.edit.cancelWatching();
  47922. player.locked = true;
  47923. _this.updateTagPos = true;
  47924. _this.spot3d.position.set(0, 1000, 0);
  47925. _this.spot3d.updateSize();
  47926. _this.spot3d.visible = true;
  47927. }
  47928. } else {
  47929. _this.app.core.get('Scene').getSplit('TAG').then(function (view) {
  47930. if (_this.editHandle == void 0) {
  47931. _this.editHandle = _this.app.withNewComponent('TagEditManager', view, {
  47932. spotA: _this.app.dom.querySelector('.player[name="main"] .player-mark'),
  47933. spotB: _this.app.dom.querySelector('.player[name="copy"] .player-mark')
  47934. });
  47935. }
  47936. if (camera) {
  47937. // 修改
  47938. _this.editHandle.reSetPos(camera.position);
  47939. } else {
  47940. // 新增
  47941. _this.editHandle.enter();
  47942. }
  47943. });
  47944. }
  47945. camera && common.updateVisible(camera.titleLabel, 'editPos', false);
  47946. }; // 修改监控坐标
  47947. this.edit.modify = function (sid) {
  47948. _this.checkMonitorExist(sid, function (camera) {
  47949. _this.edit.enter(camera);
  47950. });
  47951. }; // 退出坐标选择
  47952. this.edit.exit = function () {
  47953. var player = _this.app.core.get('Player');
  47954. if (_this.isSingleView) {
  47955. player.domElement.style.cursor = 'default';
  47956. player.locked = false;
  47957. player.reticule.visible = true;
  47958. _this.spot3d.visible = false;
  47959. _this.updateTagPos = false;
  47960. _this.app.TagManager.showAll();
  47961. } else {
  47962. if (!_this.editHandle) {
  47963. return;
  47964. }
  47965. app.core.get('Scene').restore('TAG');
  47966. _this.editHandle.exit({
  47967. cancel: true
  47968. });
  47969. setTimeout(function () {
  47970. player.cameraControls.activeControl.camera.fov = 70;
  47971. player.camera.fov = player.baseFov * (1 / player.zoomLevel);
  47972. }, 50);
  47973. }
  47974. _this.editingCamera && _this.editingCamera.titleLabel && common.updateVisible(_this.editingCamera.titleLabel, 'editPos', true);
  47975. _this.editingCamera = null;
  47976. _this.camPosChosing = false;
  47977. }; // 确认监控坐标
  47978. this.edit.confirm = function (onlyExitWithPosition) {
  47979. var player = _this.app.core.get('Player');
  47980. if (_this.isSingleView) {
  47981. if (!_this.editingCamera) return;
  47982. if (!_this.spot3d.visible) {
  47983. _this.edit.exit();
  47984. return null;
  47985. }
  47986. var sid = _this.editingCamera.sid;
  47987. var position = _this.spot3d.position;
  47988. if (_this.editingCamera.type != 'SecurityCamera') {
  47989. var panoId = player.currentPano.id;
  47990. var camera = new SecurityCamera(_this.control, {
  47991. sid,
  47992. posOri: position,
  47993. panoId,
  47994. target: player.currentPano.position.clone()
  47995. }, _this.videoPlayer);
  47996. camera.isNew = true;
  47997. _this.control.addCamera(camera);
  47998. _this.control.editingCamera = camera;
  47999. } else {
  48000. _this.editingCamera.updatePosition(position);
  48001. _this.editingCamera.posOri.copy(position);
  48002. _this.editingCamera.posOffset.set(0, 0, 0);
  48003. }
  48004. _this.edit.exit();
  48005. _this.edit.watch(sid, true, true);
  48006. return sid;
  48007. } else {
  48008. if (!_this.editHandle) {
  48009. return null;
  48010. }
  48011. var _this$editHandle$conf = _this.editHandle.confirmPos(),
  48012. _position = _this$editHandle$conf.position,
  48013. _sid = _this$editHandle$conf.sid;
  48014. if (!_position) {
  48015. onlyExitWithPosition || _this.edit.exit(); // 未选定位置时不用退出
  48016. return null;
  48017. }
  48018. if (!_this.editingCamera) {
  48019. var _panoId = player.currentPano.id;
  48020. var _camera = new SecurityCamera(_this.control, {
  48021. sid: _sid,
  48022. posOri: _position,
  48023. panoId: _panoId,
  48024. target: player.currentPano.position.clone()
  48025. }, _this.videoPlayer);
  48026. _camera.isNew = true;
  48027. _this.control.addCamera(_camera);
  48028. _this.control.editingCamera = _camera;
  48029. } else {
  48030. _sid = _this.editingCamera.sid;
  48031. _this.editingCamera.updatePosition(_position);
  48032. _this.editingCamera.posOri.copy(_position);
  48033. _this.editingCamera.posOffset.set(0, 0, 0);
  48034. _this.control.editingCamera = _this.editingCamera;
  48035. }
  48036. _this.edit.exit();
  48037. setTimeout(function () {
  48038. _this.edit.watch(_sid, true, true);
  48039. }, 100);
  48040. return _sid;
  48041. }
  48042. };
  48043. /**
  48044. * ----------------------------查看、删除、保存等---------------------------------
  48045. */
  48046. /**
  48047. * 观看监控
  48048. * @param { true | false } isEdit 是否是进入编辑
  48049. * @param { true | false } isAdd 是否是新增监控
  48050. */
  48051. this.edit.watch = function () {
  48052. var watchPosition = new THREE.Vector3();
  48053. return function (sid, isEdit, isAdd) {
  48054. _this.checkMonitorExist(sid, function (camera) {
  48055. _this.control.isEdit = !!isEdit;
  48056. if (isEdit) {
  48057. _this.app.core.get('Player').locked = true;
  48058. _this.app.core.get('Player').cameraControls.activeControl.enabled = true;
  48059. common.updateVisible(camera.cylinder, 'enterEdit', true, 1, 'add');
  48060. }
  48061. if (isAdd) {
  48062. watchPosition.set(-1.5, 0, 0.2).applyQuaternion(camera.quaternion).add(camera.position);
  48063. _this.control.watch(camera, watchPosition);
  48064. } else {
  48065. _this.control.watch(camera);
  48066. }
  48067. });
  48068. if (isEdit || isAdd) {
  48069. _this.app.core.get('Player').modelSideManager.tempAuto();
  48070. }
  48071. };
  48072. }(); // 保存监控数据
  48073. this.edit.save = function () {
  48074. _this.control.currentCamera.isNew = false;
  48075. return _this.control.currentCamera.updateInfo(true);
  48076. }; // 退出监控编辑或查看
  48077. this.edit.cancel = function () {
  48078. var player = _this.app.core.get('Player'); // this.control.editingCamera.videoMat.opacity = 1
  48079. // 查看时退出,没有selectCamera,直接cancelWatching
  48080. // 新增时退出,selectCamera会被undoEdit的removeCamera清除,然后cancelWatching
  48081. if (_this.control.editingCamera) {
  48082. common.updateVisible(_this.control.editingCamera.cylinder, 'enterEdit', false, 1, 'cancel');
  48083. player.modelSideManager.recover();
  48084. }
  48085. if (!_this.control.editingCamera) {
  48086. _this.edit.cancelWatching();
  48087. }
  48088. _this.control.isEdit = false;
  48089. _this.control.editingCamera = null;
  48090. _this.control.selectType = null;
  48091. player.locked = false; // 如果没有cancelWatching,则重新watch一次,保证镜头正对着监控视频
  48092. if (_this.control.watchingCamera) {
  48093. _this.control.watch(_this.control.watchingCamera);
  48094. }
  48095. }; // 退出监控查看
  48096. this.edit.cancelWatching = function () {
  48097. var player = _this.app.core.get('Player');
  48098. if (!_this.control.watchingCamera) return;
  48099. _this.control.stopWatch(); // 回到查看前的位置和视角
  48100. var _this$control$lastVie = _this.control.lastViewState,
  48101. mode = _this$control$lastVie.mode,
  48102. floorIndex = _this$control$lastVie.floorIndex,
  48103. target = _this$control$lastVie.target,
  48104. quaternion = _this$control$lastVie.quaternion,
  48105. position = _this$control$lastVie.position,
  48106. currentScale = _this$control$lastVie.currentScale;
  48107. if (mode == Viewmode$1.DOLLHOUSE && player.mode == Viewmode$1.DOLLHOUSE) {
  48108. // 切换当前楼层
  48109. var currentFloorId = player.model.allFloorsVisible ? 'all' : player.model.currentFloorId;
  48110. if (currentFloorId != floorIndex) {
  48111. player.$app.Scene.gotoFloor(floorIndex);
  48112. }
  48113. var activeControl = player.cameraControls.activeControl;
  48114. transitions$1.start(lerp.vector(activeControl.target, target), 1000, null, 0, easing[settings$3.flydown.rotationEasing], null, settings$3.freeze.LookRotationForPlay);
  48115. transitions$1.start(lerp.vector(activeControl.camera.position, position), 1000, function () {}, 0, easing[settings$3.flydown.movementEasing], null, settings$3.freeze.LookRotationForPlay);
  48116. } else if (mode == Viewmode$1.PANORAMA) {
  48117. player.flyToNewMode({
  48118. mode: Viewmode$1.PANORAMA,
  48119. pano: player.currentPano,
  48120. quaternion,
  48121. callback: function callback() {}
  48122. });
  48123. } else {
  48124. player.flyToNewMode({
  48125. mode,
  48126. quaternion,
  48127. target,
  48128. position,
  48129. currentScale,
  48130. floor: floorIndex,
  48131. callback: function callback() {}
  48132. });
  48133. }
  48134. }; // 删除监控
  48135. this.edit.delete = function (sid) {
  48136. _this.checkMonitorExist(sid, function (camera) {
  48137. camera.isWatching && _this.edit.cancelWatching();
  48138. _this.control.removeCamera(camera);
  48139. });
  48140. }; // 隐藏监控线框
  48141. this.edit.hideCylinder = function (isHide) {
  48142. _this.control.hideCylinder = isHide;
  48143. _this.control.cameras.forEach(function (camera) {
  48144. common.updateVisible(camera.cylinder, 'force', !isHide);
  48145. });
  48146. };
  48147. /**
  48148. * ---------------------属性设置-------------------------------
  48149. */
  48150. // 设置监控名称
  48151. this.edit.setName = function (name) {
  48152. _this.control.currentCamera.name = name;
  48153. _this.control.currentCamera.titleLabel.setText(name);
  48154. }; // 设置监控坐标
  48155. this.edit.setPosition = function (position) {
  48156. _this.control.currentCamera.updatePosition(position);
  48157. if (!_this.control.unbindDollhouse) {
  48158. var dollhouseControl = _this.app.core.get('Player').cameraControls.controls.dollhouse;
  48159. dollhouseControl.camera.position.copy(_this.control.currentCamera.position);
  48160. dollhouseControl.target.copy(_this.control.currentCamera.target);
  48161. }
  48162. };
  48163. /**
  48164. * 根据xyz分别设置监控坐标,传入的是posOffset的值
  48165. * key: 'x' | 'y' | 'z'
  48166. */
  48167. this.edit.setSeparatePosition = function () {
  48168. var position = new THREE.Vector3();
  48169. return function (key, value) {
  48170. if (isNaN(parseFloat(value))) return;
  48171. _this.control.currentCamera.posOffset[key] = parseFloat(value);
  48172. position.copy(_this.control.currentCamera.posOri).add(_this.control.currentCamera.posOffset);
  48173. _this.edit.setPosition(position);
  48174. };
  48175. }(); // 设置监控fov
  48176. this.edit.setFov = function (fov) {
  48177. if (_this.control.currentCamera.isWatching && !_this.control.unbindDollhouse) _this.app.core.get('Player').cameraControls.cameras.dollhouse.fov = fov;
  48178. _this.control.currentCamera.fov = fov;
  48179. _this.control.currentCamera.updateProjectionMatrix();
  48180. _this.control.currentCamera.updateMesh();
  48181. }; // 设置视频长宽比
  48182. this.edit.setAspect = function (aspect) {
  48183. _this.control.currentCamera.updateAspect(aspect);
  48184. }; // 设置视频透明度
  48185. this.edit.setOpacity = function (opacity) {
  48186. _this.control.currentCamera.videoMat.opacity = opacity / 100;
  48187. }; // 设置横向角
  48188. this.edit.setRoll = function (angle) {
  48189. _this.control.currentCamera.setRoll(angle);
  48190. }; // 设置左右转角
  48191. this.edit.setYaw = function (angle) {
  48192. _this.control.currentCamera.yaw = angle;
  48193. if (_this.control.watchingCamera && !_this.control.unbindDollhouse) {
  48194. var dollhouseControl = _this.app.core.get('Player').cameraControls.controls.dollhouse;
  48195. dollhouseControl.target.copy(_this.control.currentCamera.target);
  48196. }
  48197. }; // 设置上下转角
  48198. this.edit.setPitch = function (angle) {
  48199. _this.control.currentCamera.pitch = angle;
  48200. if (_this.control.watchingCamera && !_this.control.unbindDollhouse) {
  48201. var dollhouseControl = _this.app.core.get('Player').cameraControls.controls.dollhouse;
  48202. dollhouseControl.target.copy(_this.control.currentCamera.target);
  48203. }
  48204. }; // 设置监控视频地址
  48205. this.edit.setVideoSrc = function (videoSrc, reload) {
  48206. //videoSrc = {src:xxx, urlType:xxx}
  48207. // let time0 = new Date().getTime()
  48208. var currentCamera = _this.control.currentCamera;
  48209. currentCamera.videoActive = false;
  48210. currentCamera.showVideo(false); // 1秒内没load好就reload一次,防止在路径正确的情况下偶尔不知为何加载不出来
  48211. var reloadHandle = setTimeout(function () {
  48212. if (!reload) {
  48213. console.error('reload');
  48214. _this.edit.setVideoSrc(videoSrc, true);
  48215. }
  48216. }, 1000);
  48217. var video = currentCamera.createVideo(videoSrc.src);
  48218. video.onloadedmetadata = function () {
  48219. clearTimeout(reloadHandle);
  48220. _this.app.Camera.emit('SecurityCamera.videoActive', currentCamera.sid);
  48221. currentCamera.videoActive = true; // currentCamera.aspect = video.videoWidth / video.videoHeight
  48222. //currentCamera.updateMesh()
  48223. currentCamera.showVideo(true);
  48224. };
  48225. currentCamera.hlsVideoPlayer && currentCamera.hlsVideoPlayer.destroy();
  48226. currentCamera.videoType = videoSrc.urlType;
  48227. if (Hls.isSupported() && currentCamera.videoType === 1) {
  48228. var hls = new Hls();
  48229. hls.loadSource(videoSrc.src);
  48230. hls.attachMedia(video);
  48231. hls.on(Hls.Events.ERROR, function (event, data) {
  48232. return console.log('HLS加载失败', event, data);
  48233. });
  48234. currentCamera.hlsVideoPlayer = hls;
  48235. } else {
  48236. video.src = videoSrc.src;
  48237. }
  48238. currentCamera.play();
  48239. currentCamera.videoMat.map = new THREE.VideoTexture(currentCamera.video);
  48240. }; // 设置线框距离
  48241. this.edit.setCylinderFar = function (far) {
  48242. _this.control.currentCamera.cylinderFar = far;
  48243. _this.control.currentCamera.cylinder.bottom.position.set(0, 0, -far);
  48244. _this.control.currentCamera.updateMesh(); // if (this.control.watchingCamera) {
  48245. // let dollhouseControl = this.app.core.get('Player').cameraControls.controls.dollhouse
  48246. // dollhouseControl.target.copy(this.control.currentCamera.target)
  48247. // }
  48248. }; // 切换控制器(暂时用不到)
  48249. // this.edit.switchTransformType = type => {
  48250. // if (type == this.control.transformType) return
  48251. // if (this.control.transformType == 0) {
  48252. // this.control.enableTransformControl()
  48253. // }
  48254. // this.control.transformType = type
  48255. // if (type == 0) {
  48256. // this.control.disableTransformControl()
  48257. // }
  48258. // if (type == 1) {
  48259. // this.app.core.get('Player').model.transformControls.space = 'world'
  48260. // this.app.core.get('Player').model.transformControls.setMode('translate')
  48261. // }
  48262. // if (type == 2) {
  48263. // this.app.core.get('Player').model.transformControls.space = 'world'
  48264. // this.app.core.get('Player').model.transformControls.setMode('rotate')
  48265. // }
  48266. // }
  48267. /**
  48268. * ------------------------数据回退------------------------------
  48269. */
  48270. // Transform改为默认值
  48271. this.edit.undoTransform = function () {
  48272. // let info = this.control.currentCamera.info
  48273. // this.edit.setSeparatePosition('x', info.posOffset.x)
  48274. // this.edit.setSeparatePosition('y', info.posOffset.y)
  48275. // this.edit.setSeparatePosition('z', info.posOffset.z)
  48276. // this.edit.setRoll(info.roll)
  48277. // this.edit.setPitch(info.pitch)
  48278. // this.edit.setYaw(info.yaw)
  48279. _this.edit.setRoll(0);
  48280. _this.edit.setPitch(0);
  48281. _this.edit.setYaw(0);
  48282. _this.app.Camera.emit('SecurityCamera.select', _this.control.currentCamera.updateInfo());
  48283. }; // fov和线框距离改为默认值
  48284. this.edit.undoScope = function () {
  48285. // let info = this.control.currentCamera.info
  48286. // this.edit.setCylinderFar(info.far)
  48287. // this.edit.setFov(info.fov)
  48288. _this.edit.setCylinderFar(3);
  48289. _this.edit.setFov(70);
  48290. _this.app.Camera.emit('SecurityCamera.select', _this.control.currentCamera.updateInfo());
  48291. }; // 回撤
  48292. this.edit.undoEdit = function () {
  48293. var camera = _this.control.currentCamera;
  48294. if (camera.isNew) {
  48295. // 删除添加的模型
  48296. _this.control.removeCamera(camera);
  48297. } else {
  48298. // 回退数据
  48299. var info = camera.info;
  48300. if (info.far != camera.cylinderFar) _this.edit.setCylinderFar(info.far); // 需要将far放在第一个
  48301. camera.posOri.x = info.posOri.x;
  48302. camera.posOri.y = info.posOri.y;
  48303. camera.posOri.z = info.posOri.z;
  48304. _this.edit.setSeparatePosition('x', info.posOffset.x);
  48305. _this.edit.setSeparatePosition('y', info.posOffset.y);
  48306. _this.edit.setSeparatePosition('z', info.posOffset.z);
  48307. if (info.fov != camera.fov) _this.edit.setFov(info.fov); //if (info.aspect != camera.aspect) this.edit.setAspect(info.aspect)
  48308. if (info.roll != camera.roll) _this.edit.setRoll(info.roll);
  48309. if (info.pitch != camera.pitch) _this.edit.setPitch(info.pitch);
  48310. if (info.yaw != camera.yaw) _this.edit.setYaw(info.yaw);
  48311. if (info.video != camera.videoSrc) _this.edit.setVideoSrc({
  48312. src: info.video,
  48313. urlType: info.videoType
  48314. });
  48315. _this.app.Camera.emit('SecurityCamera.select', _this.control.currentCamera.updateInfo());
  48316. }
  48317. };
  48318. }
  48319. _createClass(Monitor, [{
  48320. key: "showAll",
  48321. value: function showAll(reason, level, type) {
  48322. var _this2 = this;
  48323. this.waitSecurityControls(function () {
  48324. _this2.control.showAll(null, reason, level, type);
  48325. }, this.showAll.bind(this));
  48326. }
  48327. }, {
  48328. key: "hideAll",
  48329. value: function hideAll(reason, level, type) {
  48330. var _this3 = this;
  48331. this.waitSecurityControls(function () {
  48332. _this3.control.hideAll(null, reason, level, type);
  48333. }, this.hideAll.bind(this));
  48334. }
  48335. /**
  48336. * 显示监控范围
  48337. * @param {*} value
  48338. */
  48339. }, {
  48340. key: "showRange",
  48341. value: function showRange(show) {
  48342. this.edit.hideCylinder(!show);
  48343. }
  48344. }, {
  48345. key: "changeTitlesShow",
  48346. value: function changeTitlesShow(state) {
  48347. var cause = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'onShow';
  48348. //xzw add
  48349. this.control.showTitles = !!state;
  48350. this.control.cameras.forEach(function (cam) {
  48351. common.updateVisible(cam.titleLabel, cause, !!state);
  48352. });
  48353. } // 等待SecurityControls
  48354. }, {
  48355. key: "waitSecurityControls",
  48356. value: function waitSecurityControls(func, waitFunc) {
  48357. if (this.control) {
  48358. func && func();
  48359. } else {
  48360. this.deferred.then(function () {
  48361. return waitFunc();
  48362. });
  48363. }
  48364. } // 检测监控sid是否存在
  48365. }, {
  48366. key: "checkMonitorExist",
  48367. value: function checkMonitorExist(sid, func) {
  48368. var camera = this.control.cameras.find(function (cam) {
  48369. return cam.sid == sid;
  48370. });
  48371. if (camera) {
  48372. func(camera);
  48373. } else {
  48374. console.error('监控sid不存在!');
  48375. }
  48376. }
  48377. }, {
  48378. key: "watch",
  48379. value: function watch(sid) {
  48380. var cameras = this.app.store.getValue('cameras');
  48381. if (cameras == void 0 || !cameras.length) {
  48382. return;
  48383. }
  48384. var find = cameras.find(function (c) {
  48385. return c.sid == sid;
  48386. });
  48387. if (find == void 0) {
  48388. return;
  48389. }
  48390. this.edit.watch(sid);
  48391. }
  48392. }, {
  48393. key: "lock",
  48394. value: function lock() {
  48395. this.locked = Deferred$1();
  48396. }
  48397. }, {
  48398. key: "unlock",
  48399. value: function unlock() {
  48400. if (this.locked && this.locked.resolve) {
  48401. this.locked.resolve();
  48402. }
  48403. this.locked = null;
  48404. }
  48405. }, {
  48406. key: "highlight",
  48407. value: function highlight(sid) {
  48408. var cam = this.control.cameras.find(function (c) {
  48409. return c.sid == sid;
  48410. });
  48411. this.control.cameras.forEach(function (e) {
  48412. return e.highlight(false);
  48413. }); //先取消,一次只能高亮一个camera
  48414. cam && cam.highlight(true);
  48415. }
  48416. }]);
  48417. return Monitor;
  48418. }();
  48419. var FlvVideoPlayer = /*#__PURE__*/function (_FlvVideoPlayerBase) {
  48420. _inherits(FlvVideoPlayer, _FlvVideoPlayerBase);
  48421. var _super = _createSuper$B(FlvVideoPlayer);
  48422. function FlvVideoPlayer(player) {
  48423. _classCallCheck(this, FlvVideoPlayer);
  48424. return _super.call(this, player);
  48425. }
  48426. _createClass(FlvVideoPlayer, [{
  48427. key: "_getVideoPath",
  48428. value: function _getVideoPath(src) {
  48429. return src;
  48430. }
  48431. }]);
  48432. return FlvVideoPlayer;
  48433. }(FlvVideoPlayerBase);
  48434. var H5VideoPlayer = /*#__PURE__*/function (_H5VideoPlayerBase) {
  48435. _inherits(H5VideoPlayer, _H5VideoPlayerBase);
  48436. var _super2 = _createSuper$B(H5VideoPlayer);
  48437. function H5VideoPlayer(player) {
  48438. _classCallCheck(this, H5VideoPlayer);
  48439. return _super2.call(this, player);
  48440. }
  48441. _createClass(H5VideoPlayer, [{
  48442. key: "_getVideoPath",
  48443. value: function _getVideoPath(src) {
  48444. return src;
  48445. }
  48446. }]);
  48447. return H5VideoPlayer;
  48448. }(H5VideoPlayerBase);
  48449. /*
  48450. note:
  48451. https的地址不能使用http的链接
  48452. 即使不支持hls,有的视频也支持播放,如 http://221.4.210.172:29080/F1F/201/hls.m3u8 见http://cam.4dkankan.com/spg.html?m=SS-tRNx2NyfFO&lang=zh#/tag iphonex可以播放但是 不支持hls
  48453. */
  48454. function _createSuper$A(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$A(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  48455. function _isNativeReflectConstruct$A() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  48456. /**
  48457. * 视角截取
  48458. */
  48459. var ViewExtract = /*#__PURE__*/function (_Emiter) {
  48460. _inherits(ViewExtract, _Emiter);
  48461. var _super = _createSuper$A(ViewExtract);
  48462. function ViewExtract(app) {
  48463. var _this;
  48464. _classCallCheck(this, ViewExtract);
  48465. _this = _super.call(this);
  48466. _this.app = app;
  48467. /**
  48468. * 数据状态
  48469. */
  48470. _this.state = {
  48471. /**
  48472. * 固定输出的图长宽比
  48473. */
  48474. scale: 1.78,
  48475. /**
  48476. * 缩放滑动条范围
  48477. */
  48478. range: {
  48479. min: 0.7,
  48480. max: 3,
  48481. current: 0
  48482. },
  48483. /**
  48484. * 默认设置
  48485. */
  48486. defaults: {
  48487. zoomMax: 0,
  48488. zoomMin: 0,
  48489. zoomEnabled: 0,
  48490. zoomToDefaultWhenToPano: 0
  48491. },
  48492. options: {
  48493. padding: {},
  48494. beforeExport: null,
  48495. afterExport: null
  48496. }
  48497. };
  48498. _this.player = null;
  48499. _this.__is_enter = false;
  48500. _this.__on_zoom = function (zoom) {
  48501. return _this.emit('zoom', zoom);
  48502. };
  48503. _this.__on_size = function () {
  48504. var domElement = _this.player.domElement;
  48505. var paddingTop = _this.state.options.padding.top || 0;
  48506. var paddingBottom = _this.state.options.padding.bottom || 0;
  48507. var paddingLeft = _this.state.options.padding.left || 0;
  48508. var paddingRight = _this.state.options.padding.right || 0;
  48509. var offsetWidth = paddingLeft + paddingRight;
  48510. var offsetHeight = paddingTop + paddingBottom;
  48511. var canvasWidth = window.innerWidth - offsetWidth;
  48512. var canvasHeight = window.innerHeight - offsetHeight;
  48513. if (canvasWidth / canvasHeight < _this.state.scale) {
  48514. //为了保证图片输出的fovH和画布上的一样,只能压缩一下高度了,否则要改截图的canvas的fov
  48515. var height = canvasWidth / _this.state.scale;
  48516. domElement.style.height = "".concat(height, "px");
  48517. domElement.style.top = (canvasHeight - height) / 2 + offsetHeight + 'px';
  48518. } else {
  48519. domElement.style.top = "".concat(offsetHeight, "px");
  48520. domElement.style.height = "calc(100% - ".concat(offsetHeight, "px)");
  48521. }
  48522. };
  48523. _this.__on_update = function () {
  48524. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  48525. _ref$hasChanged = _ref.hasChanged,
  48526. hasChanged = _ref$hasChanged === void 0 ? false : _ref$hasChanged;
  48527. var force = arguments.length > 1 ? arguments[1] : undefined;
  48528. if (!_this.__is_enter || !_this.player.lastFrameChanged && !force) {
  48529. return;
  48530. } //监听outside模式下的zoom
  48531. var control = _this.player.cameraControls.activeControl;
  48532. if (_this.player.mode == 'dollhouse') {
  48533. var dis = control.camera.position.distanceTo(control.target);
  48534. var zoomlevel = math$1.linearClamp(dis, control.minDistance, Math.max(control.maxDistance / 2, control.minDistance + 3), _this.state.range.max, _this.state.range.min);
  48535. _this.emit('zoom', zoomlevel);
  48536. } else if (_this.player.mode == 'floorplan' && hasChanged.cameraProjectionChanged) {
  48537. var absoluteScale = control.getDefaultAbsoluteScale(_this.player.model.size); //改
  48538. var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
  48539. var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
  48540. var _zoomlevel = math$1.linearClamp(control.absoluteScale, minS, maxS, _this.state.range.max, _this.state.range.min);
  48541. _this.emit('zoom', _zoomlevel);
  48542. }
  48543. };
  48544. return _this;
  48545. }
  48546. _createClass(ViewExtract, [{
  48547. key: "options",
  48548. value: function options(option) {
  48549. this.state.options = Object.assign(this.state.options, option || {});
  48550. return this;
  48551. }
  48552. }, {
  48553. key: "enter",
  48554. value: function enter() {
  48555. if (this.__is_enter) {
  48556. return;
  48557. }
  48558. if (this.player === null) {
  48559. this.player = this.app.core.get('Player');
  48560. }
  48561. this.__is_enter = true;
  48562. this.__on_size();
  48563. this.state.defaults.zoomMax = settings$3.zoom.max;
  48564. this.state.defaults.zoomMin = settings$3.zoom.min;
  48565. this.state.defaults.zoomEnabled = settings$3.zoom.enabled;
  48566. this.state.defaults.zoomToDefaultWhenToPano = settings$3.zoom.zoomToDefaultWhenToPano;
  48567. settings$3.zoom.max = this.state.range.max;
  48568. settings$3.zoom.min = this.state.range.min;
  48569. settings$3.zoom.enabled = true;
  48570. settings$3.zoom.zoomToDefaultWhenToPano = false;
  48571. settings$3.highestQualityTile = true;
  48572. this.player.on('zoomTo', this.__on_zoom);
  48573. this.player.on('setSize', this.__on_size);
  48574. this.player.on('update', this.__on_update);
  48575. this.__on_zoom(this.player.zoomLevel);
  48576. this.__on_update(0, true);
  48577. return this;
  48578. }
  48579. }, {
  48580. key: "leave",
  48581. value: function leave() {
  48582. if (this.__is_enter === false) {
  48583. return;
  48584. }
  48585. this.__is_enter = false;
  48586. settings$3.zoom.max = this.state.defaults.zoomMax = settings$3.zoom.max;
  48587. settings$3.zoom.min = this.state.defaults.zoomMin = settings$3.zoom.min;
  48588. settings$3.zoom.enabled = this.state.defaults.zoomEnabled = settings$3.zoom.enabled;
  48589. settings$3.zoom.zoomToDefaultWhenToPano = this.state.defaults.zoomToDefaultWhenToPano;
  48590. settings$3.highestQualityTile = false;
  48591. this.player.off('zoomTo', this.__on_zoom);
  48592. this.player.off('setSize', this.__on_size);
  48593. this.player.off('update', this.__on_update);
  48594. this.player.domElement.style.top = 0;
  48595. this.player.domElement.style.height = '100%';
  48596. return this;
  48597. }
  48598. /**
  48599. *
  48600. * @param {String} type camera | scale
  48601. * @returns
  48602. */
  48603. }, {
  48604. key: "reset",
  48605. value: function reset(type) {
  48606. var _this2 = this;
  48607. if (!this.__is_enter) {
  48608. return this;
  48609. }
  48610. if (type === 'camera') {
  48611. if (this.player.mode == 'panorama') {
  48612. this.player.cameraControls.activeControl.lat = 0;
  48613. }
  48614. } else if (type == 'scale') {
  48615. var control = this.player.cameraControls.activeControl;
  48616. if (this.player.mode == 'transitioning') {
  48617. return player.once('mode.changed', function (fromMode, toMode) {
  48618. if (!_this2.__is_enter) return;
  48619. _this2.reset(type);
  48620. });
  48621. } else if (this.player.mode == 'panorama') {
  48622. this.player.zoomTo(1);
  48623. } else if (this.player.mode == 'dollhouse') {
  48624. //自己定一个target
  48625. control.target.copy(this.player.model.center); //this.onRangeChange({ value: 100 })
  48626. } else if (this.player.mode == 'floorplan') {
  48627. //自己定一个target
  48628. control.target.setX(this.player.model.center.x);
  48629. control.target.setZ(this.player.model.center.z);
  48630. control.camera.position.setX(this.player.model.center.x); //使角度归零
  48631. control.camera.position.setZ(this.player.model.center.z);
  48632. control.rotateToView(this.player.model.size, this.player.getDirection()); //再旋转
  48633. control.zoomToContain(this.player.model.size);
  48634. }
  48635. }
  48636. return this;
  48637. }
  48638. }, {
  48639. key: "scale",
  48640. value: function scale(value) {
  48641. if (!this.__is_enter) {
  48642. return this;
  48643. }
  48644. value = value > 1 ? parseInt(value) / 100 : value;
  48645. if (value < this.state.range.min) {
  48646. value = this.state.range.min;
  48647. } else if (value > this.state.range.max) {
  48648. value = this.state.range.max;
  48649. }
  48650. this.state.range.current = value;
  48651. var control = this.player.cameraControls.activeControl;
  48652. var zoomLevel = value;
  48653. if (this.player.mode == 'panorama') {
  48654. settings$3.zoom.enabled = true;
  48655. this.player.zoomTo(zoomLevel);
  48656. } else if (this.player.mode == 'dollhouse') {
  48657. var disWanted = math$1.linearClamp(zoomLevel, this.state.range.min, this.state.range.max, Math.max(control.maxDistance / 2, control.minDistance + 3), control.minDistance); //control.minDistance + (control.maxDistance - control.minDistance) * ratio
  48658. control.camera.position.copy(control.target).add(this.player.getDirection().multiplyScalar(-disWanted));
  48659. } else if (this.player.mode == 'floorplan') {
  48660. var absoluteScale = control.getDefaultAbsoluteScale(this.player.model.size); //改
  48661. var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
  48662. var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
  48663. control.absoluteScale = math$1.linearClamp(zoomLevel, this.state.range.min, this.state.range.max, maxS, minS);
  48664. }
  48665. return this;
  48666. }
  48667. }, {
  48668. key: "ready",
  48669. value: function ready() {
  48670. var _this3 = this;
  48671. var deferre = Deferred$1();
  48672. if (this.__is_enter == false) {
  48673. deferre.reject('please call enter before');
  48674. } else if (this.player.mode == 'panorama') {
  48675. var timer = setInterval(function () {
  48676. if (_this3.player.currentPano && !_this3.player.flying) {
  48677. clearInterval(timer);
  48678. if (typeof _this3.state.options.beforeExport === 'function') {
  48679. _this3.state.options.beforeExport();
  48680. }
  48681. var tileSize = _this3.getTileSize();
  48682. var vec = new THREE.Vector3(0, 0, -1).applyQuaternion(_this3.player.quaternion);
  48683. var camera = _this3.player.cameraControls.activeControl.camera;
  48684. var vFov = camera.fov;
  48685. var hFov = cameraLight.getHFOVForCamera(camera, camera.aspect, 1);
  48686. var promise = _this3.player.currentPano.loadTiledPano(tileSize, vec, {
  48687. hFov,
  48688. vFov
  48689. }, !1, !1, !0);
  48690. promise.done(function () {
  48691. return deferre.resolve();
  48692. }).fail(function () {
  48693. return deferre.resolve();
  48694. });
  48695. }
  48696. }, 200);
  48697. } else {
  48698. deferre.resolve();
  48699. }
  48700. return deferre;
  48701. }
  48702. }, {
  48703. key: "export",
  48704. value: function _export(func) {
  48705. var _this4 = this;
  48706. if (typeof func !== 'function') {
  48707. return this;
  48708. }
  48709. this.ready().done( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  48710. var _this4$getViewSize, width, height, captures;
  48711. return regenerator.wrap(function _callee$(_context) {
  48712. while (1) {
  48713. switch (_context.prev = _context.next) {
  48714. case 0:
  48715. _this4$getViewSize = _this4.getViewSize(), width = _this4$getViewSize.width, height = _this4$getViewSize.height;
  48716. _context.next = 3;
  48717. return _this4.app.Camera.screenshot([{
  48718. width,
  48719. height,
  48720. name: 'capture'
  48721. }]);
  48722. case 3:
  48723. captures = _context.sent;
  48724. if (captures.length) {
  48725. func(captures[0]);
  48726. } else {
  48727. func(null);
  48728. }
  48729. if (typeof _this4.state.options.afterExport === 'function') {
  48730. _this4.state.options.afterExport();
  48731. }
  48732. case 6:
  48733. case "end":
  48734. return _context.stop();
  48735. }
  48736. }
  48737. }, _callee);
  48738. }))).fail(function () {
  48739. func(null);
  48740. if (typeof _this4.state.options.afterExport === 'function') {
  48741. _this4.state.options.afterExport();
  48742. }
  48743. });
  48744. return this;
  48745. }
  48746. /**
  48747. * 导出图片
  48748. * @param {*} filename
  48749. * @returns
  48750. */
  48751. }, {
  48752. key: "exportFile",
  48753. value: function exportFile(filename) {
  48754. this.export(function (capture) {
  48755. var url = window.URL.createObjectURL(capture.data);
  48756. var link = document.createElement('a');
  48757. link.href = url;
  48758. link.download = filename;
  48759. link.click();
  48760. });
  48761. return this;
  48762. }
  48763. /**
  48764. * 获取全景图高度
  48765. * @returns
  48766. */
  48767. }, {
  48768. key: "getMaxHeight",
  48769. value: function getMaxHeight() {
  48770. return this.app.core.get('QualityManager').tileClass == '2k' ? 4096 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 * 2 : 1024;
  48771. }
  48772. /**
  48773. * 获取单面大小
  48774. * @returns
  48775. */
  48776. }, {
  48777. key: "getTileSize",
  48778. value: function getTileSize() {
  48779. return this.app.core.get('QualityManager').tileClass == '2k' ? 2048 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 : 512;
  48780. }
  48781. }, {
  48782. key: "getViewSize",
  48783. value: function getViewSize() {
  48784. if (this.player.mode != 'panorama') {
  48785. return {
  48786. width: 1780,
  48787. height: 1000
  48788. };
  48789. }
  48790. var maxHeight = this.getMaxHeight();
  48791. var height = this.player.cameraControls.activeControl.camera.fov / 180 * maxHeight;
  48792. var width = height * this.state.scale;
  48793. var size = {
  48794. width: Math.round(width),
  48795. height: Math.round(height)
  48796. };
  48797. return size;
  48798. }
  48799. }]);
  48800. return ViewExtract;
  48801. }(tinyEmitter);
  48802. function _createSuper$z(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$z(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  48803. function _isNativeReflectConstruct$z() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  48804. var Camera = /*#__PURE__*/function (_Emiter) {
  48805. _inherits(Camera, _Emiter);
  48806. var _super = _createSuper$z(Camera);
  48807. function Camera(app) {
  48808. var _this;
  48809. _classCallCheck(this, Camera);
  48810. _this = _super.call(this);
  48811. _this.adjustControlAngel = function (target, quaternion) {
  48812. var player = this.app.core.get('Player'); //console.log("adjustControlAngel")
  48813. if (player.mode == 'panorama') {
  48814. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion || player.quaternion).add(player.position);
  48815. this.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
  48816. } else {
  48817. //专业录屏需要
  48818. if (!target) return;
  48819. this.cameraControls.activeControl && player.cameraControls.activeControl.target.copy(target);
  48820. }
  48821. };
  48822. _this.app = app;
  48823. _this.app.Scene.on('loaded', function () {
  48824. var player = _this.app.core.get('Player'); // 漫游点选择事件
  48825. player.on(PlayerEvents.PanoChosen, function (pano) {
  48826. _this.emit(PlayerEvents.PanoChosen, pano);
  48827. }); // 漫游点开始过渡事件
  48828. player.on(PlayerEvents.FlyingStarted, function (params) {
  48829. _this.emit(PlayerEvents.FlyingStarted, params);
  48830. }); // 漫游点结束过渡事件
  48831. player.on(PlayerEvents.FlyingEnded, function (params) {
  48832. _this.emit(PlayerEvents.FlyingEnded, params);
  48833. }); // 旋转
  48834. player.on(PlayerEvents.Rotate, function (params) {
  48835. _this.emit(PlayerEvents.Rotate, params);
  48836. }); // 终止旋转
  48837. player.on(PlayerEvents.EndRotation, function (params) {
  48838. _this.emit(PlayerEvents.EndRotation, params);
  48839. }); // 鼠标滚动
  48840. player.on(PlayerEvents.Zoom, function (params) {
  48841. _this.emit(PlayerEvents.Zoom, params);
  48842. }); // 移动模型
  48843. player.on(PlayerEvents.MoveModel, function (params) {
  48844. _this.emit(PlayerEvents.MoveModel, params);
  48845. }); // 模式切换
  48846. player.on(PlayerEvents.ModeChanging, function (fromMode, toMode) {
  48847. return _this.emit(PlayerEvents.ModeChanging, {
  48848. fromMode,
  48849. toMode
  48850. });
  48851. });
  48852. var model = _this.app.core.get('Player').model;
  48853. model.on('floor.changed', function (floor, mode, oldFloor) {
  48854. _this.emit('floor.changed', {
  48855. toMode: mode,
  48856. floorIndex: floor.floorIndex,
  48857. allVisible: model.allFloorsVisible
  48858. });
  48859. });
  48860. });
  48861. _this.monitor = new Monitor(app);
  48862. _this.extract = new ViewExtract(app);
  48863. return _this;
  48864. }
  48865. _createClass(Camera, [{
  48866. key: "mode",
  48867. get: function get() {
  48868. return this.app.core.get('Player').mode;
  48869. }
  48870. }, {
  48871. key: "locked",
  48872. get: function get() {
  48873. return this.app.core.get('Player').locked;
  48874. }
  48875. /**
  48876. * 判断当时点位是否有球幕视频
  48877. */
  48878. }, {
  48879. key: "isCurrentPanoHasVideo",
  48880. get: function get() {
  48881. return this.app.core.get('Player').currentPano.hasVideo;
  48882. }
  48883. }, {
  48884. key: "panorama",
  48885. value: function panorama() {
  48886. if (!this.app.Scene.ready) {
  48887. return Promise.resolve();
  48888. }
  48889. return this.app.core.get('Player').insideMode();
  48890. }
  48891. }, {
  48892. key: "floorplan",
  48893. value: function floorplan() {
  48894. var deferred = Deferred$1();
  48895. this.app.core.get('Player').flyToNewMode({
  48896. mode: Viewmode$1.FLOORPLAN
  48897. }, deferred);
  48898. return deferred;
  48899. }
  48900. }, {
  48901. key: "dollhouse",
  48902. value: function dollhouse() {
  48903. var deferred = Deferred$1();
  48904. return this.app.core.get('Player').flyToNewMode({
  48905. mode: Viewmode$1.DOLLHOUSE
  48906. }, deferred);
  48907. }
  48908. }, {
  48909. key: "vr",
  48910. value: function vr() {
  48911. var player = this.app.core.get('Player');
  48912. player.vrEnabled = !player.vrEnabled; //提前标记
  48913. return player.flyToMode('panorama', function () {
  48914. return player.vrModeChange();
  48915. });
  48916. }
  48917. }, {
  48918. key: "zoom",
  48919. value: function zoom(zoomLevel) {
  48920. this.app.core.get('Player').zoomTo(zoomLevel);
  48921. }
  48922. }, {
  48923. key: "rotate",
  48924. value: function rotate(data) {
  48925. var _this2 = this;
  48926. //{"quaternion":{"_x":-0.0030889924058959475,"_y":-0.7194824153023747,"_z":-0.003200125539693273,"_w":0.6944964156805331},"mode":"panorama","currentPanoId":"6",rotationSpeed: {x: 59.48871572048137, y: -2.0739152478003122}}
  48927. var player = this.app.core.get('Player');
  48928. function checkSamePano(data, player) {
  48929. if (data.mode == player.mode) {
  48930. //漫游模式情况下,还需要考虑当前漫游点是否对的上
  48931. if (data.mode == Viewmode$1.PANORAMA) {
  48932. if (data.currentPanoId == player.currentPano.id) {
  48933. return true;
  48934. }
  48935. }
  48936. }
  48937. return false;
  48938. }
  48939. var flag = checkSamePano(data, player);
  48940. if (flag) {
  48941. player.cameraControls.activeControl.locked = true;
  48942. player.cameraControls.activeControl.camera.quaternion.set(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  48943. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(player.cameraControls.activeControl.camera.quaternion).add(player.cameraControls.activeControl.camera.position);
  48944. player.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
  48945. if (data.rotationSpeed) {
  48946. setTimeout(function () {
  48947. _this2.rotateEnd(data);
  48948. }, 100);
  48949. }
  48950. }
  48951. }
  48952. }, {
  48953. key: "rotateEnd",
  48954. value: function rotateEnd(data) {
  48955. var player = this.app.core.get('Player');
  48956. player.cameraControls.activeControl.locked = false;
  48957. if (data.rotationSpeed) {
  48958. player.cameraControls.activeControl.rotationSpeed = new THREE.Vector2(data.rotationSpeed.x, data.rotationSpeed.y);
  48959. }
  48960. }
  48961. }, {
  48962. key: "getPose",
  48963. value: function getPose() {
  48964. var player = this.app.core.get('Player');
  48965. return JSON.parse(JSON.stringify({
  48966. mode: player.mode,
  48967. position: player.position,
  48968. quaternion: player.quaternion,
  48969. zoomLevel: player.zoomLevel,
  48970. //or fov, baseFov...
  48971. panoId: player.currentPano && player.currentPano.id,
  48972. currentScale: player.cameraControls.controls.floorplan.currentScale,
  48973. //when floorplan
  48974. modeTran: player.modeTran,
  48975. flying: player.flying,
  48976. nextPano: null
  48977. }));
  48978. }
  48979. /**
  48980. * 获取当前视角,转为URL参数
  48981. * @returns
  48982. */
  48983. }, {
  48984. key: "getPoseUrlParams",
  48985. value: function getPoseUrlParams() {
  48986. var getInfo = function getInfo(info) {
  48987. return "pose=pano:".concat(info.metadata.scan_id, ",qua:").concat(math$1.toPrecision(info.metadata.camera_quaternion.toArray(), 4));
  48988. };
  48989. return getInfo(this.app.core.get('Player').getSnapAngleInfo());
  48990. }
  48991. }, {
  48992. key: "setPose",
  48993. value: function setPose(info) {
  48994. //复刻player、camera的状态(如果要瞬间变化:duration:0)
  48995. var player = this.app.core.get('Player');
  48996. if (player.flying || info.flying) return;
  48997. if (info.position && info.position instanceof THREE.Vector3 === false) {
  48998. info.position = new THREE.Vector3(info.position.x, info.position.y, info.position.z);
  48999. }
  49000. if (info.quaternion && info.quaternion instanceof THREE.Quaternion === false) {
  49001. if (info.quaternion.hasOwnProperty('_x')) {
  49002. info.quaternion = new THREE.Quaternion(info.quaternion._x, info.quaternion._y, info.quaternion._z, info.quaternion._w);
  49003. } else {
  49004. info.quaternion = new THREE.Quaternion(info.quaternion.x, info.quaternion.y, info.quaternion.z, info.quaternion.w);
  49005. }
  49006. }
  49007. var pano = player.model.panos.index[info.panoId];
  49008. var options = {
  49009. mode: info.mode,
  49010. pano: pano,
  49011. quaternion: info.quaternion,
  49012. zoomLevel: info.zoomLevel,
  49013. position: info.position,
  49014. currentScale: info.currentScale,
  49015. duration: info.duration,
  49016. aimDuration: info.duration
  49017. };
  49018. if (player.mode != info.mode) {
  49019. /* if(player.mode == 'panorama' && info.mode == 'dollhouse'){
  49020. }else if(player.mode == 'panorama' && info.mode == 'dollhouse'){
  49021. }else if(info.mode == 'panorama'){
  49022. }else{
  49023. } */
  49024. player.flyToNewMode(options);
  49025. } else {
  49026. if (info.mode == 'panorama') {
  49027. pano && player.flyToPano(options);
  49028. } else {
  49029. var control = player.cameraControls.controls[info.mode];
  49030. var camera = control.camera;
  49031. info.target && control.target.copy(info.target);
  49032. info.position && camera.position.copy(info.position);
  49033. control.offset.copy(camera.position).sub(control.target); //offset才是决定此时camera转向的关键
  49034. if (info.mode == 'floorplan') {
  49035. if (info.zoom) {
  49036. //currentScale如果是要经过convertWorkshopOrthoZoom转换
  49037. info.currentScale = MathLight.convertWorkshopOrthoZoom(info.zoom); //根据屏幕适应性缩放
  49038. }
  49039. if (info.currentScale) {
  49040. control.currentScale = control.absoluteScale = info.currentScale;
  49041. control.updateZoom();
  49042. }
  49043. }
  49044. }
  49045. }
  49046. }
  49047. }, {
  49048. key: "flyToMode",
  49049. value: function flyToMode(func, mode) {
  49050. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  49051. //飞到某个模式,然后执行某函数
  49052. options.mode = mode;
  49053. if (this.mode == mode) {
  49054. func && func();
  49055. } else {
  49056. if (mode == 'panorama' && !options.pano) {
  49057. options.pano = this.currentPano;
  49058. }
  49059. if (this.mode == 'transitioning' && this.modeTran.split('-')[1] != mode) {
  49060. //正飞向其他模式,就要先飞完再飞进来然后执行
  49061. this.afterCModeFuc.unique = function () {
  49062. this.afterCModeFuc.unique = func;
  49063. this.flyToNewMode(options); //这个fuc在trainsitioning状态下传入是无效的,所以后面得用afterCModeFuc。但是执行完afterCModeFuc,afterCModeFuc会变为null,所以里面得用fuc。。orz
  49064. }.bind(this);
  49065. } else {
  49066. this.afterCModeFuc.unique = func; //飞入后执行
  49067. /* try{ //在场景刚开始加载 control还没建好时这句可能会报错所以用try。 不用callback而用 afterCModeFuc也是这个原因,因为会有别的函数可以飞入然后执行它
  49068. this.flyToNewMode(options);
  49069. }catch(e){
  49070. console.log('FlyToMode遇到问题?')
  49071. } */
  49072. this.flyToNewMode(options);
  49073. }
  49074. }
  49075. }
  49076. }, {
  49077. key: "flyToPano",
  49078. value: function flyToPano(panoId, aim, dur) {
  49079. //如果用的是quaternion,直接用setPose更好
  49080. var defe = Deferred$1();
  49081. var pano = this.app.core.get('Player').model.panos.index[panoId];
  49082. if (pano) {
  49083. this.app.core.get('Player').flyToPano({
  49084. mode: 'panorama',
  49085. pano,
  49086. lookAtPoint: aim,
  49087. duration: dur,
  49088. aimDuration: dur,
  49089. callback: function callback() {
  49090. return defe.resolve();
  49091. }
  49092. });
  49093. } else {
  49094. defe.resolve();
  49095. }
  49096. return defe;
  49097. }
  49098. }, {
  49099. key: "flyToTag",
  49100. value: function flyToTag(tag, force) {
  49101. //xzw 飞向热点
  49102. if (objects.tagManager.activeTag && objects.tagManager.activeTag != tag) {
  49103. this.tagManager.dismissActiveTag();
  49104. }
  49105. objects.tagManager.navigatingViaTag = true; //防止在examine时在tagManager.onPanoChange中dismissExaminedTag
  49106. //setTimeout(function(){
  49107. objects.tagManager.activateTag(tag, 'examine'); //"browse"
  49108. tag.updateBoardOrient = true;
  49109. tag.examine(this, force, function () {
  49110. if (this.following) {
  49111. this.play.control.noFly = true;
  49112. }
  49113. }.bind(this)); //}.bind(this),200)
  49114. }
  49115. }, {
  49116. key: "flyToPoint",
  49117. value: function flyToPoint(aim, o) {
  49118. //飞向某一点的近处看它,类同tag.examine
  49119. var pano;
  49120. if (o.dealDistance) {
  49121. if (this.app.core.get('Player').position.distanceTo(aim) < o.dealDistance) {
  49122. pano = this.app.core.get('Player').currentPano;
  49123. }
  49124. }
  49125. if (!pano) {
  49126. pano = this.app.core.get('Player').model.panos.closestPanoTowardPoint({
  49127. point: aim,
  49128. require: o && o.require,
  49129. rank: o && o.rank
  49130. }) || this.currentPano || this.app.core.get('Player').currentPano;
  49131. }
  49132. this.app.core.get('Player').flyToPano({
  49133. pano: pano,
  49134. lookAtPoint: aim,
  49135. duration: o && o.dur,
  49136. aimDuration: o && o.aimDur
  49137. }, o && o.done);
  49138. } //录屏时panorama关键部位的最后一帧设置一下control的lon lat等属性 否则update的时候视角会被恢复
  49139. }, {
  49140. key: "setCompassDisplay",
  49141. value:
  49142. /**
  49143. * 设置指南针是否可见
  49144. */
  49145. function setCompassDisplay(visible, force) {
  49146. this.app.core.get('Player').compass.setDisplay(visible, force);
  49147. }
  49148. /**
  49149. * 获取截图信息
  49150. * @returns
  49151. */
  49152. }, {
  49153. key: "getScreenshotInfo",
  49154. value: function getScreenshotInfo() {
  49155. var getInfo = function getInfo(info) {
  49156. // 转化得到和初始视角相关的所有信息
  49157. return {
  49158. camera: {
  49159. quaternion: math$1.toPrecision(info.metadata.camera_quaternion.toArray(), 4),
  49160. zoom: info.metadata.ortho_zoom || -1
  49161. },
  49162. mode: info.metadata.camera_mode || 0,
  49163. pano: info.metadata.scan_id || '',
  49164. lon: info.metadata.lon,
  49165. //兼容旧版
  49166. lat: info.metadata.lat
  49167. };
  49168. };
  49169. var info = getInfo(this.app.core.get('Player').getSnapAngleInfo());
  49170. this.app.core.get('Scene').firstView.updateByEntry(info, this.app.core.get('Player').model.panos);
  49171. return info;
  49172. }
  49173. }, {
  49174. key: "lock",
  49175. value: function lock() {
  49176. var player = this.app.core.get('Player');
  49177. player.locked = true;
  49178. }
  49179. }, {
  49180. key: "unlock",
  49181. value: function unlock() {
  49182. var player = this.app.core.get('Player');
  49183. player.locked = false;
  49184. }
  49185. }, {
  49186. key: "autoRotate",
  49187. value: function autoRotate(isRotate) {
  49188. var speed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.1;
  49189. var control = this.app.core.get('Player').cameraControls.activeControl;
  49190. var mode = this.app.core.get('Player').mode;
  49191. if (isRotate) {
  49192. // 开始
  49193. mode == 'dollhouse' && (control.autoRotateSpeed = speed * 10, control.autoRotate = true);
  49194. mode == 'panorama' && control.startRotating(speed, 0);
  49195. } else {
  49196. // 暂停
  49197. mode == 'dollhouse' && (control.autoRotate = false);
  49198. mode == 'panorama' && control.stopRotating(true);
  49199. }
  49200. }
  49201. /**
  49202. * 截图
  49203. * @param {*} options
  49204. * @returns
  49205. */
  49206. }, {
  49207. key: "screenshot",
  49208. value: function screenshot() {
  49209. var _this3 = this;
  49210. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  49211. var toBlob = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  49212. var prop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  49213. if (!options.length) {
  49214. options = [{
  49215. width: 2048,
  49216. height: 1024,
  49217. name: '2k'
  49218. }, {
  49219. width: 1024,
  49220. height: 512,
  49221. name: '1k'
  49222. }, {
  49223. width: 128,
  49224. height: 128,
  49225. name: '128'
  49226. }];
  49227. }
  49228. return new Promise(function (resolve) {
  49229. var _done = options.length;
  49230. var result = [];
  49231. var player = _this3.app.core.get('Player');
  49232. var timer = setInterval(function () {
  49233. if (player.path && player.path.currentPanoMarker) {
  49234. clearInterval(timer);
  49235. _this3.app.core.get('Screenshot').capture(Object.assign({
  49236. tasks: {
  49237. unFish: options
  49238. },
  49239. snapshotTopview: true,
  49240. notHideTags: true,
  49241. done: function done(data, name, o) {
  49242. if (toBlob) {
  49243. result.push({
  49244. data: base64ToBlob(data),
  49245. name,
  49246. type: 'blob'
  49247. });
  49248. } else {
  49249. result.push({
  49250. data,
  49251. name,
  49252. type: 'base64'
  49253. });
  49254. }
  49255. if (result.length == _done) {
  49256. result.name = name;
  49257. result.o = o;
  49258. resolve(result);
  49259. }
  49260. }
  49261. }, prop));
  49262. }
  49263. }, 50);
  49264. });
  49265. }
  49266. }, {
  49267. key: "screenshot2",
  49268. value: function screenshot2() {
  49269. var sceneRenderer = this.app.core.get('SceneRenderer');
  49270. var link = document.createElement('a');
  49271. var canvas = sceneRenderer.renderer.domElement;
  49272. sceneRenderer.render();
  49273. link.href = canvas.toDataURL().replace('image/png', 'image/octet-stream');
  49274. link.download = 'screenshot2.png';
  49275. link.click();
  49276. }
  49277. /**
  49278. * 设置无缝过渡
  49279. * @param {*} enabled
  49280. */
  49281. }, {
  49282. key: "setFastTransition",
  49283. value: function setFastTransition(enabled) {
  49284. this.app.core.get('Player').setPanoTaskEnable(enabled);
  49285. }
  49286. }, {
  49287. key: "checkXRSupport",
  49288. value: function checkXRSupport() {
  49289. return VR$1.isSupportXR();
  49290. }
  49291. /**
  49292. * 切换模型显示面
  49293. * @param {number} side 0 => auto || 1 => DoubleSide
  49294. */
  49295. }, {
  49296. key: "setModelSide",
  49297. value: function setModelSide(side) {
  49298. if (side === 0) {
  49299. ModelSide.setSide(null);
  49300. } else if (side === 1) {
  49301. ModelSide.setSide(2);
  49302. } else {
  49303. ModelSide.setSide(side);
  49304. }
  49305. this.app.core.get('Player').model.setMode('dollhouse');
  49306. }
  49307. }]);
  49308. return Camera;
  49309. }(tinyEmitter);
  49310. Camera.MODE = Viewmode$1;
  49311. function _createSuper$y(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$y(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  49312. function _isNativeReflectConstruct$y() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  49313. var Decoration = /*#__PURE__*/function (_Emiter) {
  49314. _inherits(Decoration, _Emiter);
  49315. var _super = _createSuper$y(Decoration);
  49316. function Decoration(scene) {
  49317. var _this;
  49318. _classCallCheck(this, Decoration);
  49319. _this = _super.call(this);
  49320. _this.app = scene.app;
  49321. _this.edit = {};
  49322. var player;
  49323. _this.deferred = Deferred$1();
  49324. scene.on('loaded', function () {
  49325. player = _this.app.core.get('Player');
  49326. player.GLTFEditor = new GLTFAddManager(player); // GLTFEditor初始化
  49327. // 初始数据加载
  49328. var init = function init(metadata) {
  49329. metadata.boxModels && metadata.boxModels.forEach(function (data) {
  49330. player.GLTFEditor.add(data);
  49331. });
  49332. };
  49333. var metadata = _this.app.store.getValue('metadata');
  49334. if (metadata) init(metadata);else _this.app.store.on('metadata', init);
  49335. _this.deferred.resolve();
  49336. }); // 进入空间装饰模块
  49337. _this.edit.enterModule = function () {
  49338. _this.waitGLTFEditor(function () {
  49339. player.GLTFEditor.editing = true;
  49340. }, _this.edit.enterModule.bind(_assertThisInitialized(_this)));
  49341. }; // 离开空间装饰模块
  49342. _this.edit.leaveModule = function () {
  49343. player.GLTFEditor.editing = false;
  49344. }; // 仅用于新增模型
  49345. _this.edit.addGLTF = function () {
  49346. player.GLTFEditor.add();
  49347. player.modelSideManager.tempAuto(); //#45013 #45011 产品要求编辑时恢复backside
  49348. player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  49349. }; // 删除
  49350. _this.edit.deleteGLTF = function (sid) {
  49351. var gltf = player.GLTFEditor.group.children.find(function (gltf) {
  49352. return gltf.sid === sid;
  49353. });
  49354. player.GLTFEditor.delete(gltf);
  49355. }; // 选中(isEdit为true时选中加编辑)
  49356. _this.edit.focusGLTF = function (sid, isEdit) {
  49357. var gltf = player.GLTFEditor.group.children.find(function (gltf) {
  49358. return gltf.sid === sid;
  49359. });
  49360. if (isEdit) {
  49361. player.modelSideManager.tempAuto(); //#45013 #45011 产品要求编辑时恢复backside
  49362. player.GLTFEditor.select(gltf);
  49363. player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  49364. }
  49365. player.flyToPano({
  49366. pano: player.model.panos.get(gltf.panoId),
  49367. lookAtPoint: gltf.position,
  49368. checkAlone: true
  49369. });
  49370. }; // 保存(返回data和successCallBack)
  49371. _this.edit.confirmGLTFEdit = function () {
  49372. return player.GLTFEditor.save(function () {
  49373. player.modelSideManager.recover(); //恢复modelside设置
  49374. player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.showCadPlane(); // 显示户型图
  49375. });
  49376. }; // 退出
  49377. _this.edit.cancelGLTFEdit = function () {
  49378. player.GLTFEditor.unselect();
  49379. player.GLTFEditor.group.children.forEach(function (gltf) {
  49380. if (gltf.isNew) {
  49381. player.GLTFEditor.delete(gltf);
  49382. } else {
  49383. gltf.setFromInfo(gltf.info);
  49384. }
  49385. });
  49386. player.modelSideManager.recover();
  49387. player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.showCadPlane(); // 显示户型图
  49388. }; // 重置三维变换
  49389. _this.edit.resetGLTFTranform = function () {
  49390. // player.GLTFEditor.selecting.setTransformFromInfo(player.GLTFEditor.selecting.info)
  49391. player.GLTFEditor.selecting.rotation.set(0, 0, 0);
  49392. player.GLTFEditor.selecting.axisAngle = {
  49393. x: 0,
  49394. y: 0,
  49395. z: 0
  49396. };
  49397. player.GLTFEditor.selecting.scale.set(1, 1, 1);
  49398. _this.emit('Decoration.GLTF.select', player.GLTFEditor.selecting.updateInfo());
  49399. }; // 设置新的模型路径
  49400. _this.edit.setGLTFUrl = function (info) {
  49401. player.GLTFEditor.selecting.zipName = info.zipName;
  49402. player.GLTFEditor.selecting.load(info.url);
  49403. }; // 设置坐标
  49404. _this.edit.setGLTFPosition = function (key, value) {
  49405. player.GLTFEditor.selecting.position[key] = value;
  49406. }; // 设置缩放
  49407. _this.edit.setGLTFScale = function (key, value) {
  49408. player.GLTFEditor.selecting.scale[key] = value;
  49409. }; // 设置旋转
  49410. _this.edit.setGLTFRotation = function (key, value) {
  49411. player.GLTFEditor.selecting.setAxisAngle(key, THREE.MathUtils.degToRad(value)); // player.GLTFEditor.selecting.rotation[key] = THREE.MathUtils.degToRad(value)
  49412. }; // 设置模型显隐
  49413. _this.edit.setGLTFVisible = function (visi) {
  49414. player.GLTFEditor.selecting.visible = !!visi;
  49415. if (visi) {
  49416. player.model.transformControls.attach(player.GLTFEditor.selecting);
  49417. } else {
  49418. player.model.transformControls.detach();
  49419. }
  49420. }; // 变换TransformControls(0 移动、1 旋转、2 缩放)
  49421. _this.edit.switchTransformControlsMode = function (mode) {
  49422. if (parseInt(mode) == 0) mode = 'translate';
  49423. if (parseInt(mode) == 1) mode = 'rotate';
  49424. if (parseInt(mode) == 2) mode = 'scale';
  49425. player.model.transformControls.mode = mode;
  49426. };
  49427. return _this;
  49428. }
  49429. _createClass(Decoration, [{
  49430. key: "showAll",
  49431. value: function showAll() {
  49432. var _this2 = this;
  49433. this.waitGLTFEditor(function () {
  49434. var player = _this2.app.core.get('Player');
  49435. player.GLTFEditor.group.visible = true;
  49436. }, this.showAll.bind(this));
  49437. }
  49438. }, {
  49439. key: "hideAll",
  49440. value: function hideAll() {
  49441. var _this3 = this;
  49442. this.waitGLTFEditor(function () {
  49443. var player = _this3.app.core.get('Player');
  49444. player.GLTFEditor.group.visible = false;
  49445. }, this.hideAll.bind(this));
  49446. } // 等待GLTFEditor
  49447. }, {
  49448. key: "waitGLTFEditor",
  49449. value: function waitGLTFEditor(func, waitFunc) {
  49450. var player = this.app.core.get('Player');
  49451. if (player && player.GLTFEditor) {
  49452. func && func();
  49453. } else {
  49454. this.deferred.then(function () {
  49455. return waitFunc();
  49456. });
  49457. }
  49458. }
  49459. }]);
  49460. return Decoration;
  49461. }(tinyEmitter);
  49462. function _createSuper$x(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$x(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  49463. function _isNativeReflectConstruct$x() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  49464. var global$1 = window; //----------------------复制以下内容---------------------------------
  49465. var player$4,
  49466. skyBoxTight,
  49467. meshGroup,
  49468. modelBound = new THREE.Box3(),
  49469. ray = new THREE.Raycaster(),
  49470. groundPlane = new THREE.Plane(),
  49471. groundY,
  49472. safeBound,
  49473. boundConfirmed,
  49474. startTime,
  49475. boxesSolid = [],
  49476. isExt,
  49477. isDiwei,
  49478. shelterFilterEnable = true;
  49479. var MinBoxInitialScore = 0.68; //找不到匹配时,若box分数低于该值,不createSinglePano
  49480. var colors = {
  49481. yellow: new THREE.Color(238 / 255, 217 / 255, 35 / 255),
  49482. green: new THREE.Color(39 / 255, 160 / 255, 146 / 255),
  49483. labelYellow: {
  49484. r: 238,
  49485. g: 217,
  49486. b: 35,
  49487. a: 0.5
  49488. },
  49489. labelGreen: {
  49490. r: 39,
  49491. g: 160,
  49492. b: 146,
  49493. a: 0.5
  49494. }
  49495. };
  49496. var standards = {
  49497. cabinet: {
  49498. widthNormal: {
  49499. min: 0.55,
  49500. max: 1.05
  49501. /* max: 0.65 */
  49502. },
  49503. //widthNormal是不计宽还是厚度的平均宽度 //个别场景如S9yepREK8Jl 宽0.8米
  49504. height: {
  49505. min: 0.3,
  49506. max: 2.5,
  49507. standard: 2
  49508. },
  49509. closeRatio: 0.7 //数值越小越容易findRest。一般在墙上的位置不准要设置大些,扎堆放置的设置小些
  49510. },
  49511. fire: {
  49512. widthNormal: {
  49513. min: 0.12,
  49514. max: 0.16
  49515. },
  49516. height: {
  49517. min: 0.4,
  49518. max: 0.58
  49519. },
  49520. widthSame: true,
  49521. //长宽相等
  49522. closeRatio: 4,
  49523. tinyXZ: true //可以通过它近似确定地面高度
  49524. },
  49525. air: {
  49526. widthNormal: {
  49527. min: 0.35,
  49528. max: 0.7
  49529. },
  49530. width: {
  49531. min: 0.48,
  49532. max: 0.75
  49533. },
  49534. //因为总是斜着放所以范围较大
  49535. thick: {
  49536. min: 0.33,
  49537. max: 0.5
  49538. },
  49539. height: {
  49540. min: 1.2,
  49541. max: 2.2,
  49542. standard: 1.8
  49543. },
  49544. atWall: 0.8,
  49545. closeRatio: 1.1
  49546. },
  49547. airSmart: {
  49548. widthNormal: {
  49549. min: 0.35,
  49550. max: 0.7
  49551. },
  49552. width: {
  49553. min: 0.48,
  49554. max: 0.75
  49555. },
  49556. //因为总是斜着放所以范围较大
  49557. thick: {
  49558. min: 0.33,
  49559. max: 0.5
  49560. },
  49561. height: {
  49562. min: 1.2,
  49563. max: 2.2,
  49564. standard: 1.8
  49565. },
  49566. atWall: 0.8,
  49567. closeRatio: 1.1
  49568. },
  49569. 'air-hanging': {
  49570. widthNormal: {
  49571. min: 0.3,
  49572. max: 1
  49573. },
  49574. width: {
  49575. min: 0.8,
  49576. max: 1.1
  49577. },
  49578. thick: {
  49579. min: 0.2,
  49580. max: 0.3
  49581. },
  49582. height: {
  49583. min: 0.3,
  49584. max: 0.5,
  49585. standard: 0.4
  49586. },
  49587. //standard是通常出现的最高高度. 有这个值的在离地的时候直接使用该高度
  49588. bottom: {
  49589. min: 0.8,
  49590. max: 2.0
  49591. },
  49592. // 不绝对,大部分
  49593. atWall: 1,
  49594. //在墙壁的可能性
  49595. closeRatio: 1.5
  49596. },
  49597. battery: {
  49598. widthNormal: {
  49599. min: 0.45,
  49600. max: 1.35
  49601. },
  49602. width: {
  49603. min: 0.7,
  49604. max: 1.4
  49605. },
  49606. thick: {
  49607. min: 0.35,
  49608. max: 0.5
  49609. },
  49610. height: {
  49611. min: 0.3,
  49612. max: 2.5
  49613. },
  49614. //maxHeight
  49615. //有的电池很小。考虑是否追加battery-little 并且限制大电池的长宽高比例
  49616. atWall: 0.9,
  49617. closeRatio: 0.9
  49618. },
  49619. groundBar: {
  49620. widthNormal: {
  49621. min: 0.06,
  49622. max: 0.4
  49623. },
  49624. width: {
  49625. min: 0.3,
  49626. max: 0.5
  49627. },
  49628. thick: {
  49629. min: 0.05,
  49630. max: 0.08
  49631. },
  49632. height: {
  49633. min: 0.1,
  49634. max: 0.2
  49635. },
  49636. bottom: {
  49637. min: 1.2,
  49638. max: 3
  49639. },
  49640. atWall: 1,
  49641. closeRatio: 2
  49642. },
  49643. hlkcWindow: {
  49644. widthNormal: {
  49645. min: 0.08,
  49646. max: 0.5
  49647. },
  49648. width: {
  49649. min: 0.35,
  49650. max: 0.5
  49651. },
  49652. thick: {
  49653. min: 0.03,
  49654. max: 0.06
  49655. },
  49656. height: {
  49657. min: 0.35,
  49658. max: 0.5
  49659. },
  49660. bottom: {
  49661. min: 1.2,
  49662. max: 3
  49663. },
  49664. atWall: 1,
  49665. closeRatio: 2
  49666. },
  49667. electric: {
  49668. widthNormal: {
  49669. min: 0.2,
  49670. max: 0.7
  49671. },
  49672. width: {
  49673. min: 0.5,
  49674. max: 0.65
  49675. },
  49676. thick: {
  49677. min: 0.2,
  49678. max: 0.3
  49679. },
  49680. height: {
  49681. min: 0.5,
  49682. max: 1
  49683. },
  49684. //maxHeight 4GqaqNdyjGf一米高
  49685. bottom: {
  49686. min: 0.8,
  49687. max: 1.8
  49688. },
  49689. atWall: 1,
  49690. closeRatio: 2
  49691. },
  49692. monitor: {
  49693. widthNormal: {
  49694. min: 0.08,
  49695. max: 0.11
  49696. },
  49697. height: {
  49698. min: 0.1,
  49699. max: 0.2,
  49700. standard: 0.15
  49701. },
  49702. //maxHeight
  49703. bottom: {
  49704. min: 1.2,
  49705. max: 3
  49706. },
  49707. atWall: 1,
  49708. closeRatio: 4,
  49709. tiny: true //因为较小且无方向,所以近似一个点,用射线算出的位置比墙面还准,所以其最终位置可用于expandModelBound
  49710. },
  49711. rowBigBox: {
  49712. widthNormal: {
  49713. min: 0.55,
  49714. max: Infinity
  49715. },
  49716. height: {
  49717. min: 0.7,
  49718. max: 2.4,
  49719. standard: 2
  49720. }
  49721. }
  49722. /*"cabling-wall":{
  49723. },
  49724. "cabling-ceil":{
  49725. atCeil:1
  49726. } */
  49727. };
  49728. /* const typeNames = {
  49729. cabinet : 'cabinet', //标准机柜
  49730. air : 'air', //普通空调柜式
  49731. battery : 'battery', //蓄电池组
  49732. }
  49733. */
  49734. var typeNames = {
  49735. fire: 'extinguisher',
  49736. //灭火器
  49737. monitor: 'surveillance_camera',
  49738. //监控摄像机 放第一个,用于继续确定边界
  49739. hlkcWindow: 'hlkc',
  49740. //馈线窗
  49741. groundBar: 'grounding_bar',
  49742. //接地排
  49743. cabinet: 'equipment_cabinet',
  49744. //标准机柜
  49745. battery: 'accumulator',
  49746. //蓄电池组
  49747. /* ac : 'ac_switchboard', //交流配电柜 //这两种合并,因为差别太小了,见QlJau21WP8G的,在全景图两侧识别的竟然一个ac一个dc
  49748. dc : 'dc_distribution', //直流配电设备 */
  49749. electric: ['ac_switchboard', 'dc_distribution'],
  49750. air: 'sdkt',
  49751. //普通空调柜式
  49752. airSmart: 'ventilation_installation' //智能通风设备
  49753. //cabling : 'cabling_rack', //单层走线架 因为在天花板的走线有点复杂,经常断开,无法确定方向所以放弃
  49754. };
  49755. var addLabel = function addLabel(pos, text) {
  49756. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  49757. bgcolor = _ref.bgcolor,
  49758. a = _ref.a;
  49759. new THREE.Vector3(0, -0.2, 0);
  49760. bgcolor = bgcolor ? new THREE.Color(bgcolor) : {
  49761. r: 1,
  49762. g: 1,
  49763. b: 1
  49764. }; //let endPos = new THREE.Vector3().addVectors(pos,shift);
  49765. text instanceof Array || (text = [text]);
  49766. var lineCount = Math.round(Math.random() * 6) + 1;
  49767. var lines = [];
  49768. while (lineCount-- > 0) {
  49769. lines.push('|');
  49770. }
  49771. text = [].concat(_toConsumableArray(text), lines, ['o']);
  49772. var textMesh = new TextSprite({
  49773. text,
  49774. textColor: {
  49775. r: 0,
  49776. g: 0,
  49777. b: 0,
  49778. a: 1
  49779. },
  49780. backgroundColor: {
  49781. r: bgcolor.r * 255,
  49782. g: bgcolor.g * 255,
  49783. b: bgcolor.b * 250,
  49784. a: a || 0
  49785. },
  49786. textBorderColor: {
  49787. r: bgcolor.r * 255,
  49788. g: bgcolor.g * 255,
  49789. b: bgcolor.b * 250,
  49790. a: a || 0.9
  49791. },
  49792. textBorderThick: 2,
  49793. margin: {
  49794. x: 0,
  49795. y: 0
  49796. },
  49797. borderRadius: 0,
  49798. player: player$4,
  49799. sizeInfo: {
  49800. minSize: 90,
  49801. maxSize: 300,
  49802. nearBound: 1,
  49803. farBound: 7
  49804. }
  49805. });
  49806. textMesh.position.copy(pos); //textMesh.scale.set(0.3, 0.3, 0.3)
  49807. meshGroup.add(textMesh);
  49808. textMesh.sprite.position.y += textMesh.sprite.scale.y * 0.4;
  49809. return textMesh;
  49810. };
  49811. var getBoxFinalPos = function getBoxFinalPos(info) {
  49812. //创建solidbox时的position
  49813. var position;
  49814. var center = getBoxPos(info);
  49815. if (standards[info.boxType].bottom) {
  49816. //悬挂
  49817. position = center;
  49818. } else {
  49819. position = center.clone().setY(groundY + info.size.y / 2); //使着地
  49820. }
  49821. return position;
  49822. };
  49823. var boxGeo = new THREE.BoxBufferGeometry();
  49824. var boxMat = new THREE.MeshBasicMaterial({
  49825. color: colors.yellow,
  49826. opacity: 0.3,
  49827. transparent: true,
  49828. depthTest: false
  49829. });
  49830. var axises = [new THREE.Vector3(-1, 1, -1), new THREE.Vector3(1, 1, -1), new THREE.Vector3(1, 1, 1), new THREE.Vector3(-1, 1, 1), new THREE.Vector3(-1, -1, -1), new THREE.Vector3(1, -1, -1), new THREE.Vector3(1, -1, 1), new THREE.Vector3(-1, -1, 1)];
  49831. var traverse = function traverse(info, fun) {
  49832. //忽略.infos的row 的信息
  49833. fun(info);
  49834. info.list && info.list.forEach(function (a) {
  49835. return traverse(a, fun);
  49836. });
  49837. info.mixedFrom && info.mixedFrom.forEach(function (a) {
  49838. return traverse(a, fun);
  49839. });
  49840. };
  49841. var Box = /*#__PURE__*/function () {
  49842. //结果
  49843. function Box(info) {
  49844. _classCallCheck(this, Box);
  49845. //preDealBox(info)
  49846. this.setFromInfo(info);
  49847. this.buildFromData || (this.name = this.boxType + '-' + this.name);
  49848. if ((this.buildFromData || boundConfirmed)) this.draw();
  49849. boxesSolid.push(this);
  49850. }
  49851. _createClass(Box, [{
  49852. key: "setFromInfo",
  49853. value: function setFromInfo(info) {
  49854. for (var i in info) {
  49855. this[i] = info[i];
  49856. }
  49857. /* let h = info.size.y
  49858. let standardH = standards[info.boxType].height.standard
  49859. if (h > standardH) {
  49860. h = standardH + Math.log(1 + (h - standardH) / 2) //Math.log2: 以2为底的对数 ,Math.log:自然对数
  49861. info.size.y = h
  49862. } */
  49863. this.position = this.buildFromData ? this.center : getBoxFinalPos(this);
  49864. var bound = new THREE.Box3().setFromCenterAndSize(this.position, this.size);
  49865. this.bound = bound;
  49866. }
  49867. }, {
  49868. key: "draw",
  49869. value: function draw() {
  49870. var color = colors.yellow; //green //new THREE.Color().setHSL(hue, 0.9, 0.85)
  49871. this.boxHelper = new THREE.Box3Helper(this.bound, color);
  49872. this.boxHelper.material.depthTest = false; //this.boxHelper.material.opacity = 0.5
  49873. this.boxHelper.material.transparent = true;
  49874. this.boxHelper.renderOrder = 30;
  49875. /* let { warnStr, exStr } = this
  49876. warnStr && (exStr += `【${warnStr}】`) */
  49877. //this.label = addLabel(this.position, /* exStr ? [this.name, exStr] : */ this.score ? [this.name, this.score.toFixed(1)] : this.name, { bgcolor: color })
  49878. this.label = new TextSprite({
  49879. text: this.external ? [this.external.eqpName || '', this.external.eqpType || ''] : this.name,
  49880. backgroundColor: Object.assign(colors.labelYellow
  49881. /* labelGreen */
  49882. ),
  49883. textColor: {
  49884. r: 255,
  49885. g: 255,
  49886. b: 255,
  49887. a: 1
  49888. },
  49889. borderRadius: 15,
  49890. renderOrder: 10,
  49891. fontSize: 20,
  49892. player: player$4
  49893. });
  49894. meshGroup.add(this.label);
  49895. this.label.position.copy(this.position);
  49896. this.label.position.y += 0.3;
  49897. var s = 0.2;
  49898. this.label.scale.set(s, s, s);
  49899. var box = new THREE.Mesh(boxGeo, boxMat);
  49900. box.position.copy(this.position);
  49901. box.scale.copy(this.size);
  49902. box.masterBox = this;
  49903. box.name = this.name;
  49904. box.renderOrder = 20;
  49905. meshGroup.add(box);
  49906. this.boxMesh = box;
  49907. meshGroup.add(this.boxHelper);
  49908. isDiwei && this.updateVisible(false, 'unhover');
  49909. }
  49910. }, {
  49911. key: "updateVisible",
  49912. value: function updateVisible(show, reason) {
  49913. common.updateVisible(this.boxHelper, reason, show);
  49914. common.updateVisible(this.label, reason, show);
  49915. common.updateVisible(this.boxMesh, reason, show);
  49916. }
  49917. }, {
  49918. key: "dispose",
  49919. value: function dispose() {
  49920. var index = boxesSolid.indexOf(this);
  49921. if (index > -1) {
  49922. boxesSolid.splice(index, 1);
  49923. if (boundConfirmed) {
  49924. this.label.sprite.material.opacity = 0.3;
  49925. this.boxHelper.material.opacity = 0.2;
  49926. this.boxMesh.removeFromParent();
  49927. }
  49928. }
  49929. }
  49930. }, {
  49931. key: "traversePair",
  49932. value: function traversePair(fun) {
  49933. traverse(this, fun);
  49934. }
  49935. }, {
  49936. key: "getDirection",
  49937. value: function getDirection() {
  49938. //获得正面朝向。 需要全部box都创建完再调用
  49939. var xProp = this.xProp;
  49940. var dir; //哪边pano多朝哪边
  49941. if (this.boxType == 'cabinet' && this.name.includes('row')) {
  49942. if (this.infos.rowboxs.length > 1) {
  49943. var k = this.infos.reduce(function (w, c) {
  49944. return w + c.k;
  49945. }, 0);
  49946. xProp = k > 1 ? 'width' : 'thick';
  49947. } else {
  49948. //直接使用别的多box的row的方向 ,大多数都相同(会有例外,无所谓了)
  49949. var rows = boxesSolid.filter(function (e) {
  49950. return e.boxType == 'cabinet' && e.name.includes('row') && e.dirQua;
  49951. });
  49952. rows.sort(function (a, b) {
  49953. return b.infos.rowboxs.length - a.infos.rowboxs.length;
  49954. });
  49955. var box = rows[0];
  49956. if (box) {
  49957. return this.dirQua = box.dirQua;
  49958. }
  49959. }
  49960. }
  49961. if (!xProp) {
  49962. //根据房间的长宽 散落的cabinet。 fire monitor
  49963. var _getBoxDirProp = getBoxDirProp(this, true);
  49964. _getBoxDirProp.xWidthPossible;
  49965. _getBoxDirProp.yWidthPossible;
  49966. xProp = this.xProp;
  49967. /* if(Math.abs(xWidthPossible - yWidthPossible) < 0.3){
  49968. let size = new THREE.Vector3()
  49969. safeBound.getSize(size)
  49970. xWidthPossible += (size.x - size.z) * 0.5
  49971. if(xWidthPossible > yWidthPossible){
  49972. xProp = 'width'
  49973. }
  49974. } */
  49975. }
  49976. if (xProp) {
  49977. if (!this.panosDir) getPanosDir(this);
  49978. if (xProp == 'width') {
  49979. if (Math.abs(this.panosDir['z+']) < Math.abs(this.panosDir['z-'])) {
  49980. //朝-z//也就是新坐标系的y
  49981. //this.dirQua='下'
  49982. dir = new THREE.Vector3(0, 1, 0);
  49983. } else {
  49984. //朝+z
  49985. //this.dirQua='上'
  49986. dir = new THREE.Vector3(0, -1, 0);
  49987. }
  49988. } else {
  49989. if (Math.abs(this.panosDir['x+']) < Math.abs(this.panosDir['x-'])) {
  49990. //朝-x
  49991. //this.dirQua='右'
  49992. dir = new THREE.Vector3(-1, 0, 0);
  49993. } else {
  49994. //朝+x
  49995. //this.dirQua='左'
  49996. dir = new THREE.Vector3(1, 0, 0);
  49997. }
  49998. }
  49999. } //addLabel(this.position, this.dirQua)
  50000. this.dirQua = convertTool.getQuaByAim(dir, new THREE.Vector3(), new THREE.Vector3(0, 1, 0));
  50001. return this.dirQua;
  50002. /*飞到俯视图查看(不旋转视图,x朝右,z朝下)。以下四个qua是四个墙壁每个墙壁上的dirQua。
  50003. _x: 0, _y: -0, _z: 1, _w: 0
  50004. _x: 0, _y: 0, _z: -0.707, _w: 0.707 _x: 0, _y: -0, _z: 0.707, _w: 0.707
  50005. x: 0, _y: 0, _z: 0, _w: 1
  50006. */
  50007. }
  50008. }, {
  50009. key: "toJson",
  50010. value: function toJson() {
  50011. var _this = this;
  50012. //转出的坐标系是z朝上的
  50013. var category = typeNames[this.boxType];
  50014. if (category instanceof Array) {
  50015. var scoreMap = new Map();
  50016. category = category.slice(0);
  50017. category.forEach(function (e) {
  50018. return scoreMap.set(e, 0);
  50019. }); //初始化
  50020. //判断boxType: 寻找所使用的box总分最高的boxType
  50021. var add = function add(box) {
  50022. if (!box) return;
  50023. var score = scoreMap.get(box.category) + box.score;
  50024. scoreMap.set(box.category, score);
  50025. };
  50026. this.traversePair(function (e) {
  50027. add(e.box0);
  50028. add(e.box1);
  50029. });
  50030. category = category.sort(function (a, b) {
  50031. return scoreMap.get(b) - scoreMap.get(a);
  50032. });
  50033. category = category[0]; //最高分
  50034. }
  50035. this.getDirection();
  50036. var json = {
  50037. points: axises.map(function (axis) {
  50038. return math$1.invertVisionVector(new THREE.Vector3().addVectors(_this.position, _this.size.clone().multiply(axis).multiplyScalar(0.5))).toArray();
  50039. }),
  50040. category,
  50041. type: this.boxType,
  50042. sid: this.name,
  50043. quaternion: this.dirQua.toArray()
  50044. };
  50045. return json;
  50046. }
  50047. }]);
  50048. return Box;
  50049. }(); // 2d坐标转3d坐标
  50050. var getDirByUV = function getDirByUV(uv, pano) {
  50051. // 计算方向向量
  50052. var yaw = -uv.x * (Math.PI * 2);
  50053. var pitch = Math.PI / 2 - uv.y * Math.PI;
  50054. var dir = new THREE.Vector3();
  50055. dir.copy(Vectors$1.RIGHT).applyAxisAngle(Vectors$1.BACK, pitch).applyAxisAngle(Vectors$1.UP, yaw).applyQuaternion(pano.quaternion);
  50056. return dir;
  50057. };
  50058. var getCenterDir = function getCenterDir(box) {
  50059. if (box.centerDir) return; //假设不存在在box中间拍摄的情况,所以y不会横跨两边
  50060. var bbox = box.bbox2;
  50061. var center = {
  50062. x: getBbox2center(bbox[0], bbox[2]),
  50063. y: (bbox[1] + bbox[3]) / 2
  50064. };
  50065. box.bbox2CenterX = center.x;
  50066. var dir = getDirByUV(center, box.pano);
  50067. box.centerDir = dir;
  50068. var centerTop = {
  50069. x: center.x,
  50070. y: bbox[1]
  50071. };
  50072. box.centerTopDir = getDirByUV(centerTop, box.pano);
  50073. var centerBtm = {
  50074. x: center.x,
  50075. y: bbox[3]
  50076. };
  50077. box.centerBtmDir = getDirByUV(centerBtm, box.pano);
  50078. var leftBtm = {
  50079. x: bbox[0],
  50080. y: bbox[3]
  50081. };
  50082. box.leftBtmDir = getDirByUV(leftBtm, box.pano);
  50083. var rightBtm = {
  50084. x: bbox[2],
  50085. y: bbox[3]
  50086. };
  50087. box.rightBtmDir = getDirByUV(rightBtm, box.pano);
  50088. };
  50089. var getOtherPos = function getOtherPos(box) {
  50090. if (!box.boxType) return;
  50091. var config = standards[box.boxType];
  50092. if (!boundConfirmed) {
  50093. if (!config.bottom) {
  50094. ray.set(box.pano.position, box.centerBtmDir);
  50095. box.btmPosPredict = ray.ray.intersectPlane(groundPlane, new THREE.Vector3()); //没有的话就在空中 (部分air-hanging也会有)。 fire的这个值会较大误差,因为groundY还不确定,但不影响,因只用它射线交点的位置。
  50096. if (box.btmPosPredict) {
  50097. var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
  50098. var _standards$box$boxTyp = standards[box.boxType].widthNormal,
  50099. min = _standards$box$boxTyp.min,
  50100. max = _standards$box$boxTyp.max;
  50101. min = min * 0.4;
  50102. max = max * 0.4;
  50103. var minA = Math.min(Math.abs(dir2d.x), Math.abs(dir2d.y));
  50104. var depth = math$1.linearClamp(minA, 0, 1, min, max);
  50105. /* const depth = box.category == typeNames.cabinet ? 0.5 : 0.4
  50106. */
  50107. dir2d = dir2d.clone().multiplyScalar(depth);
  50108. box.btmPosPredict.x += dir2d.x;
  50109. box.btmPosPredict.z += dir2d.y; //addLabel(box.btmPosPredict,'b_'+box.category+"_"+box.sid, {bgcolor:'#6ff',a:0.1})
  50110. //box.btmPosPredict.clamp(safeBound.min, safeBound.max)
  50111. }
  50112. }
  50113. return;
  50114. }
  50115. if (!box.posAtWall && config.atWall > 0) {
  50116. //console.log(box.sid, 'getPosWall')
  50117. var shrink = config.thick ? config.thick.min : config.widthNormal.min;
  50118. ray.set(box.pano.position, box.centerDir);
  50119. var o = ray.intersectObjects([skyBoxTight]);
  50120. if (o[0]) box.posAtWall = new THREE.Vector3().addVectors(box.pano.position, box.centerDir.clone().multiplyScalar(o[0].distance - shrink)); //因墙壁不准确,所以还是尽量不用墙的位置
  50121. /* if(box.btmPos){
  50122. let wallRatio = 0.5;
  50123. if(new THREE.Vector3().subVectors(box.btmPos, box.posAtWall).setY(0).length() > 1 )wallRatio = 0.2 //可能墙壁位置不准,靠后了
  50124. box.predictCenter = new THREE.Vector3().addVectors(box.btmPos.clone().multiplyScalar(1-wallRatio), box.posAtWall.clone().multiplyScalar(wallRatio))
  50125. //box.predictCenter = new THREE.Vector3().addVectors(box.posAtWall, box.btmPos).multiplyScalar(0.5) //也许能当中心点? 虽然y会低一些
  50126. addLabel(box.predictCenter, box.sid+'-preC')
  50127. } */
  50128. }
  50129. if (!box.btmPos) {
  50130. getBoxBtm(box);
  50131. }
  50132. if (!box.topPos) {
  50133. getBoxTop(box);
  50134. }
  50135. };
  50136. var getUVs = function getUVs(box, imageWidth, imageHeight) {
  50137. if (box.bbox2) return;
  50138. if (!imageWidth) {
  50139. imageWidth = global$1.boxFrame.datas[box.pano.id].imageWidth;
  50140. imageHeight = global$1.boxFrame.datas[box.pano.id].imageHeight;
  50141. }
  50142. if (imageWidth != imageWidth || imageHeight != imageHeight) {
  50143. console.log(imageWidth, imageHeight);
  50144. }
  50145. box.bbox2 = box.bbox.map(function (e, i) {
  50146. //(x1,y1,x2,y2)
  50147. return i % 2 == 0 ? e / imageWidth
  50148. /* + 0.25 */
  50149. : e / imageHeight;
  50150. });
  50151. };
  50152. var getBoxBase = function getBoxBase(box, imageWidth, imageHeight) {
  50153. getBoxType(box);
  50154. getUVs(box, imageWidth, imageHeight);
  50155. getCenterDir(box);
  50156. getOtherPos(box);
  50157. };
  50158. var getBbox2Diff = function getBbox2Diff(x1, x2) {
  50159. //获取x1-x2,如果x1在x2右边则为正
  50160. if (Math.abs(x1 - x2) < 0.5) return x1 - x2;else {
  50161. if (x1 > x2) x1 -= 1;else x2 -= 1;
  50162. return x1 - x2;
  50163. }
  50164. };
  50165. var getBbox2center = function getBbox2center(x1, x2) {
  50166. //找中间位置
  50167. if (Math.abs(x1 - x2) > 0.5) {
  50168. //永远找小于180度的那一边
  50169. return (x1 + x2 + 1) / 2; //另外半边
  50170. } else {
  50171. return (x1 + x2) / 2;
  50172. }
  50173. };
  50174. var getBoxTop = function getBoxTop(info) {
  50175. /* if(info.sid == 'pano0-11(mix4,8)'){
  50176. console.log(5)
  50177. } */
  50178. if (info.box1) {
  50179. var o2 = getIntersect2(info.box0.pano.position, info.box0.centerTopDir, info.box1.pano.position, info.box1.centerTopDir);
  50180. info.topPos = o2.pos3d;
  50181. info.diffHeight = o2.mid2 ? o2.mid2.distanceTo(o2.mid1) : 1;
  50182. if (info.box0.topPos && info.box1.topPos) {
  50183. info.topPos.y = (info.box0.topPos.y + info.box1.topPos.y) / 2; //原先的不准
  50184. }
  50185. } else {
  50186. //取btm上方对应的位置 ( 因为和skybox的交点会因离墙远而偏上或偏下)
  50187. var box = info.box0 || info;
  50188. var btm = box.btmPos;
  50189. if (!btm) {
  50190. btm = getBoxBtm(info);
  50191. }
  50192. box.topPos = btm.clone(); //xz同btm,要求y
  50193. var xDelta = btm.x - box.pano.position.x;
  50194. var zDelta = btm.z - box.pano.position.z;
  50195. var yDelta; //因为pano有旋转所以btm和top的xz其实是不一样的,所以会有误差。 故这里选择delta较大的
  50196. if (Math.abs(xDelta) < Math.abs(zDelta)) {
  50197. yDelta = zDelta * box.centerTopDir.y / box.centerTopDir.z;
  50198. /* console.log('use z', box)
  50199. if(Math.abs(xDelta)<0.1)console.error('!!!!!!!!!!!!!!!!!!!!!!! xDelta',xDelta, box.sid ) */
  50200. } else {
  50201. yDelta = xDelta * box.centerTopDir.y / box.centerTopDir.x; // console.log('use x', box)
  50202. }
  50203. box.topPos.y = yDelta + box.pano.position.y;
  50204. var minHeight =
  50205. /* info.boxType ? standards[info.boxType].height.min : box.category == typeNames.air ? 0.5 : */
  50206. standards[getBoxType(box)].height.min;
  50207. var diffH = Math.max(box.topPos.y - btm.y, minHeight);
  50208. box.topPos.y = btm.y + diffH;
  50209. info.topPos = box.topPos;
  50210. /* if (box.sid == 'pano2-1') {
  50211. addLabel(box.topPos,'t_'+box.sid,{bgcolor:'#ff4399'})
  50212. addLine(box.pano.position,box.centerTopDir, 20)
  50213. } */
  50214. }
  50215. return info.topPos;
  50216. };
  50217. var getBoxBtm = function getBoxBtm(info) {
  50218. if (info.box1) {
  50219. var o2 = getIntersect2(info.box0.pano.position, info.box0.centerBtmDir, info.box1.pano.position, info.box1.centerBtmDir);
  50220. info.btmPos = o2.pos3d; //info.btmPos.y = (info.box0.btmPos.y + info.box1.btmPos.y)/2 //原先的不准
  50221. } else {
  50222. var box = info.box0 || info;
  50223. if (!box.btmPos) {
  50224. /*if (box.sid == 'pano0-7') {
  50225. console.log(3)
  50226. addLine(box.pano.position, box.centerBtmDir, 20)
  50227. }*/
  50228. if (!boundConfirmed) {
  50229. return box.btmPosPredict;
  50230. }
  50231. ray.set(box.pano.position, box.centerBtmDir);
  50232. var o = ray.intersectObjects([skyBoxTight]); //如果skybound有问题,位置就会错
  50233. box.btmPosOri = o[0].point.clone();
  50234. var depth; //缩进 //let depth = Math.abs(o[0].face.normal.y) > 0.9 ? 0.4 : -0.4
  50235. getBoxType(box);
  50236. var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
  50237. if (standards[box.boxType].thick && standards[box.boxType].atWall
  50238. /* box.boxType == 'battery' */
  50239. ) {
  50240. //平贴于墙上,且厚度和宽度相差较大
  50241. //注:air-hanging主要用的是posAtWall
  50242. var _standards$box$boxTyp2 = standards[box.boxType].widthNormal,
  50243. min = _standards$box$boxTyp2.min,
  50244. max = _standards$box$boxTyp2.max;
  50245. min = min * 0.3;
  50246. max = max * 0.5;
  50247. if (!box.xProp) getBoxDirProp(box);
  50248. if (box.xProp == 'width') {
  50249. depth = math$1.linearClamp(Math.abs(dir2d.x), 0, 1, min, max);
  50250. } else {
  50251. depth = math$1.linearClamp(Math.abs(dir2d.y), 0, 1, min, max);
  50252. }
  50253. } else {
  50254. var w = standards[box.boxType].thick || standards[box.boxType].widthNormal;
  50255. var w0 = (w.min + w.max) / 2;
  50256. var _min = w0 * 0.5,
  50257. _max = w0 * 0.8;
  50258. var minA = Math.min(Math.abs(box.centerBtmDir.x), Math.abs(box.centerBtmDir.z));
  50259. depth = math$1.linearClamp(minA, 0, 0.707, _min
  50260. /* 0.3 */
  50261. , _max
  50262. /* 0.5 */
  50263. ); //在45度时需要最长的距离。主要针对cabinet
  50264. }
  50265. if (Math.abs(o[0].face.normal.y) < 0.9) {
  50266. if (standards[box.boxType].atWall || o[0].point.y - groundY > 0.3) {
  50267. //battery的识别框比较乱,有可能一个电池被识别出好几个,所以
  50268. depth *= -1; //at wall
  50269. }
  50270. }
  50271. var dir2d1 = dir2d.clone().multiplyScalar(depth);
  50272. box.btmPos = o[0].point.clone();
  50273. box.btmPos.x += dir2d1.x;
  50274. box.btmPos.z += dir2d1.y; //addLabel(box.btmPos,'b_'+box.sid,{bgcolor:'#ff4399'})
  50275. }
  50276. info.btmPos = box.btmPos;
  50277. }
  50278. return info.btmPos;
  50279. };
  50280. var getIntersect2 = function getIntersect2(pano0Pos, dir0, pano1Pos, dir1) {
  50281. var pos0 = new THREE.Vector3().addVectors(pano0Pos, dir0);
  50282. var pos1 = new THREE.Vector3().addVectors(pano1Pos, dir1);
  50283. var o = math$1.getLineIntersect2({
  50284. A: pano0Pos.clone(),
  50285. B: pano1Pos.clone(),
  50286. p1: pos0,
  50287. p2: pos1,
  50288. dir0,
  50289. dir1
  50290. }); //不用getLineIntersect,因为这个针对热点写的,当无交点时选用的点不是想要的
  50291. if (!o.pos3d) {
  50292. console.error('getIntersect2 no result? ?');
  50293. }
  50294. return o;
  50295. };
  50296. var getBoxPos = function getBoxPos(info) {
  50297. var boxType = getBoxType(info);
  50298. return info.preDealRes && info.preDealRes.position || info.center || boxType && (standards[boxType].atWall > 0.5 && standards[boxType].bottom ? info.posAtWall : info.btmPos || info.btmPosPredict) || info.posAtWall;
  50299. };
  50300. var isType = function isType(category, type) {
  50301. return type == category || typeNames[type] instanceof Array ? typeNames[type].includes(category) : typeNames[type] == category;
  50302. };
  50303. var getBoxType = function getBoxType(info) {
  50304. if (info.boxType) return info.boxType;
  50305. var category = info.category || info.box0.category;
  50306. if (category == 'rowBigBox') info.boxType = 'rowBigBox';else {
  50307. var type;
  50308. if (category == 'ac_switchboard') {
  50309. console.log(1);
  50310. }
  50311. for (var i in typeNames) {
  50312. /* if (i == category || typeNames[i] instanceof Array ? typeNames[i].includes(category) : typeNames[i] == category) {
  50313. type = i
  50314. break //type = typeNamesReverse[type]
  50315. } */
  50316. if (isType(category, i)) {
  50317. type = i;
  50318. break;
  50319. }
  50320. }
  50321. /* if(type == 'ac' || type == 'dc'){
  50322. type = 'electric' //合并
  50323. } */
  50324. info.boxType = type;
  50325. }
  50326. return info.boxType;
  50327. };
  50328. /* let getBoxType = info => {
  50329. let type = info.category || info.box0.category
  50330. if (type == 'air') {
  50331. let btm = info.btmPos || info.btmPos //btmPosAtWall
  50332. if (!btm) {
  50333. btm = getBoxBtm(info)
  50334. }
  50335. if (!btm) return
  50336. let center = info.posAtWall || (info.preDealRes && info.preDealRes.position) || info.center
  50337. const s = standards['air-hanging']
  50338. if (btm.y - groundY > s.bottom.min) {
  50339. let h0 = btm.y - groundY
  50340. let h1 = (modelBound.max.y - center.y) / (modelBound.max.y - modelBound.min.y)
  50341. let h2 = center.y - btm.y
  50342. let score = h0 * 2 - h1 * 3 - h2 * 3
  50343. if (score > 0) {
  50344. type = 'air-hanging'
  50345. }
  50346. //console.error( score, h0,h1,h2, info.sid||info.name)
  50347. } //注意:如果air被遮住底部,露出的部分只有一点,还是有可能被识别成air-hanging。只能希望
  50348. //console.error( type, info.sid||info.name)
  50349. }
  50350. if (info.box0) {
  50351. info.boxType = type
  50352. //info.box1 && (info.box1.type = type) //因为box0和box1不一定匹配,所以不能直接赋值
  50353. } else {
  50354. info.type = type
  50355. }
  50356. } */
  50357. var getPanosDir = function getPanosDir(info, center) {
  50358. center = center || getBoxPos(info);
  50359. var dirs = {
  50360. 'x+': 0,
  50361. 'x-': 0,
  50362. 'z+': 0,
  50363. 'z-': 0,
  50364. got: false
  50365. };
  50366. var getDirs = function getDirs() {
  50367. //靠墙的在它到墙之间是不会有漫游点的
  50368. if (dirs.got || !center) return;
  50369. player$4.model.panos.list.forEach(function (pano) {
  50370. var dir = new THREE.Vector3().subVectors(pano.position, center);
  50371. if (dir.x > 0) {
  50372. dirs['x+'] += dir.x;
  50373. } else {
  50374. dirs['x-'] += dir.x;
  50375. }
  50376. if (dir.z > 0) {
  50377. dirs['z+'] += dir.z;
  50378. } else {
  50379. dirs['z-'] += dir.z;
  50380. }
  50381. });
  50382. dirs.got = true;
  50383. };
  50384. getDirs();
  50385. if (info.panosDir) {
  50386. console.error('already has dir');
  50387. }
  50388. info.panosDir = dirs;
  50389. return dirs;
  50390. };
  50391. var getBoxDirProp = function getBoxDirProp(info, force) {
  50392. //仅适用于方形单个房间房间,不可以是多边形、两个房间
  50393. var xProp, yProp;
  50394. if (info.name == 'pano10-8&pano12-6') {
  50395. console.log(4);
  50396. } //if (info.boxType == 'battery' || info.boxType == 'air-hanging' || info.boxType == 'air' || info.category == 'battery' || info.category == 'air') {
  50397. if (standards[info.boxType].atWall && standards[info.boxType].thick || force) {
  50398. //根据比例判断
  50399. /* let r1 = Math.abs((center.x - skyBoxTight.position.x) / (center.z - skyBoxTight.position.z))
  50400. let r2 = player.model.size.x / player.model.size.z
  50401. if(!math.closeTo(r1,r2, 0.05)){
  50402. if (r1<r2) {
  50403. ;(xProp = 'width'), (yProp = 'thick') //贴附x(横)墙
  50404. } else {
  50405. ;(xProp = 'thick'), (yProp = 'width') //贴附y(竖)墙
  50406. }
  50407. matchInfo.xProp = xProp
  50408. matchInfo.yProp = yProp
  50409. } */
  50410. //根据距离判断
  50411. var center = getBoxPos(info);
  50412. var bound = safeBound;
  50413. var minXDiff = Math.min(center.x - bound.min.x, bound.max.x - center.x);
  50414. var minYDiff = Math.min(center.z - bound.min.z, bound.max.z - center.z);
  50415. var dirs = getPanosDir(info, center);
  50416. var noX = dirs['x+'] == 0 || dirs['x-'] == 0,
  50417. noZ = dirs['z+'] == 0 || dirs['z-'] == 0; //yi6dsPTWwFM klkcWindow pano0-1&pano2-0
  50418. if (dirs['x+'] == 0 && dirs['x-'] != 0) {
  50419. minXDiff = bound.max.x - center.x;
  50420. } else if (dirs['x-'] == 0 && dirs['x+'] != 0) {
  50421. minXDiff = center.x - bound.min.x;
  50422. }
  50423. if (dirs['z+'] == 0 && dirs['z-'] != 0) {
  50424. minYDiff = bound.max.z - center.z;
  50425. } else if (dirs['z-'] == 0 && dirs['z+'] != 0) {
  50426. minYDiff = center.z - bound.min.z;
  50427. }
  50428. var xWidthPossible = noZ ? 1 : 0,
  50429. yWidthPossible = noX ? 1 : 0;
  50430. xWidthPossible += minXDiff - minYDiff;
  50431. if (!math$1.closeTo(xWidthPossible, yWidthPossible, 0.2) && (minXDiff < 0.7 || minYDiff < 0.7)) {
  50432. if (xWidthPossible < yWidthPossible) {
  50433. xProp = 'thick', yProp = 'width'; //贴附y(竖)墙
  50434. } else {
  50435. xProp = 'width', yProp = 'thick'; //贴附x(横)墙
  50436. }
  50437. }
  50438. if (!xProp) {
  50439. if (!force) {
  50440. //force的话是fire等无方向的类型
  50441. if (info.category) {
  50442. //是box
  50443. info.pose || (info.pose = getBoxPoseByPos(info, center));
  50444. xWidthPossible += info.pose.xWidthPossible;
  50445. yWidthPossible += info.pose.yWidthPossible;
  50446. } else {
  50447. traverse(info, function (info) {
  50448. if (info.boxposes) {
  50449. //是matchInfo
  50450. info.boxposes.forEach(function (e) {
  50451. xWidthPossible += e.xWidthPossible;
  50452. yWidthPossible += e.yWidthPossible;
  50453. });
  50454. }
  50455. });
  50456. }
  50457. }
  50458. /* if(noX!=noZ){
  50459. if(noX)xWidthPossible
  50460. } */
  50461. if (xWidthPossible > yWidthPossible) {
  50462. xProp = 'width', yProp = 'thick'; //贴附x(横)墙
  50463. } else {
  50464. xProp = 'thick', yProp = 'width'; //贴附y(竖)墙
  50465. }
  50466. }
  50467. xProp && (info.xProp = xProp, info.yProp = yProp);
  50468. return {
  50469. xWidthPossible,
  50470. yWidthPossible
  50471. };
  50472. }
  50473. };
  50474. var preDealBox = function preDealBox(matchInfo) {
  50475. if (matchInfo.preDealRes || !matchInfo.center) return;
  50476. matchInfo.preDealRes = {};
  50477. matchInfo.boxType || getBoxType(matchInfo);
  50478. var config = standards[matchInfo.boxType];
  50479. config.widthNormal.min;
  50480. var needGetPose;
  50481. var dis = safeBound.distanceToPoint(matchInfo.center);
  50482. if (matchInfo.name == 'pano2-5') {
  50483. console.log(4);
  50484. }
  50485. if (dis > 0.3 && !config.tiny && !config.tinyXZ) {
  50486. //Tmo1vLp9Q13: hlkcWindow超出才准确
  50487. //tiny的位置优先级高于bound,因为他们可以确定bound
  50488. /* matchInfo.str && matchInfo.str.includes('outsideBound') */
  50489. //const shrink = minWidth * 0.85
  50490. //addLabel(matchInfo.center, '原')
  50491. var finalPos = matchInfo.center.clone().clamp(safeBound.min, safeBound.max);
  50492. matchInfo.preDealRes.position = finalPos; //addLabel(finalPos, 'finalPos')
  50493. getBoxType(matchInfo);
  50494. needGetPose = true;
  50495. }
  50496. var center = getBoxPos(matchInfo);
  50497. if (needGetPose || !matchInfo.boxposes) {
  50498. matchInfo.boxposes = [];
  50499. [matchInfo.box0, matchInfo.box1].forEach(function (box) {
  50500. box && matchInfo.boxposes.push(getBoxPoseByPos(box, center));
  50501. });
  50502. } //-----------------
  50503. getBoxDirProp(matchInfo);
  50504. };
  50505. var getBoxPoseByPos = function getBoxPoseByPos(box, centerPos) {
  50506. var addDis = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  50507. //当得知box的大概位置时,求box在这个角度上的宽度、朝向
  50508. //在这个方向看的box的宽度
  50509. var config = standards[box.boxType];
  50510. var angle = getBbox2Diff(box.bbox2[2], box.bbox2[0]) * Math.PI; //角度的一半
  50511. var dis = new THREE.Vector3().subVectors(box.pano.position, centerPos).setY(0).length() + addDis;
  50512. var projectWidth = 2 * Math.tan(angle) * dis; //投影宽度 (准确的投影宽度无法求得,只能近似)
  50513. var camDir =
  50514. /* new THREE.Vector2(centerPos.x-box.pano.position.x, centerPos.z-box.pano.position.z).normalize() */
  50515. box.centerDir.clone().setY(0).normalize();
  50516. var camTangent = math$1.getNormal({
  50517. points: [{
  50518. x: 0,
  50519. y: 0
  50520. },
  50521. /* camDir */
  50522. {
  50523. x: camDir.x,
  50524. y: camDir.z
  50525. }]
  50526. }); //视线切线方向
  50527. camTangent.x = Math.abs(camTangent.x);
  50528. camTangent.y = Math.abs(camTangent.y);
  50529. /* if (box.sid == 'pano4-6') {
  50530. console.log(7)
  50531. } */
  50532. var maxWidth = config.widthNormal.max;
  50533. var minWidth = config.widthNormal.min;
  50534. var minProjectWidth; //= (camTangent.x + camTangent.y) * minWidth
  50535. var maxProjectWidth; //= (camTangent.x + camTangent.y) * maxWidth
  50536. var maxX, maxY, minX, minY;
  50537. if (!standards[box.boxType].thick) {
  50538. minProjectWidth = (camTangent.x + camTangent.y) * minWidth;
  50539. maxProjectWidth = (camTangent.x + camTangent.y) * maxWidth; //该角度下该类型允许的最大投影距离
  50540. maxX = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最大值(假设y为最小值)
  50541. maxY = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最大值(假设x为最小值)
  50542. minX = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最小值(假设y为最大值)
  50543. minY = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最小值(假设x为最大值)
  50544. } else {
  50545. var minThick_ = config.thick.min;
  50546. var minWidth_ = config.width.min;
  50547. var maxThick_ = config.thick.max;
  50548. var maxWidth_ = config.width.max;
  50549. var maxProjectWidth1 = camTangent.x * maxWidth_ + camTangent.y * maxThick_;
  50550. var maxProjectWidth2 = camTangent.x * maxThick_ + camTangent.y * maxWidth_;
  50551. var minProjectWidth1 = camTangent.x * minWidth_ + camTangent.y * minThick_;
  50552. var minProjectWidth2 = camTangent.x * minThick_ + camTangent.y * minWidth_;
  50553. minProjectWidth = Math.min(minProjectWidth1, minProjectWidth2);
  50554. maxProjectWidth = Math.max(maxProjectWidth1, maxProjectWidth2);
  50555. (camTangent.x + camTangent.y) * maxWidth; //console.log('diffaaaaaa',maxProjectWidth,a, box.sid)
  50556. maxX = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.y) / camTangent.x, minThick_, maxWidth_); //可得x的最大值(假设y为最小值)
  50557. maxY = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.x) / camTangent.y, minThick_, maxWidth_); //可得y的最大值(假设x为最小值)
  50558. minX = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.y) / camTangent.x, minThick_, maxWidth_);
  50559. minY = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.x) / camTangent.y, minThick_, maxWidth_);
  50560. }
  50561. /*
  50562. let maxX = projectWidth / camTangent.x //可得x的最大值(假设y为0)
  50563. let maxY = projectWidth / camTangent.y //可得y的最大值(假设x为0)
  50564. */
  50565. //判断方向
  50566. var o = {
  50567. box,
  50568. projectWidth,
  50569. camTangent,
  50570. maxProjectWidth,
  50571. minProjectWidth,
  50572. dis,
  50573. maxX,
  50574. maxY,
  50575. minX,
  50576. minY
  50577. };
  50578. if (config.atWall > 0
  50579. /* isType(box.category,battery) || isType(box.category,air) */
  50580. ) {
  50581. //为了获取朝向
  50582. o.xWidthPossible = -Math.abs(projectWidth - camTangent.x * maxWidth - camTangent.y * minWidth);
  50583. o.yWidthPossible = -Math.abs(projectWidth - camTangent.x * minWidth - camTangent.y * maxWidth); //在接近45度时容易不准。另外如果被遮住一部分更会错,因此尽量不让被遮住的匹配
  50584. }
  50585. return o;
  50586. };
  50587. var getPoseScore = function getPoseScore(boxposes, boxType) {
  50588. var score = 0;
  50589. var minDis = 1.5;
  50590. /* if (boxposes[0].box.sid == 'pano12-13' && boxposes[1].box.sid == 'pano8-6') {
  50591. console.log(4)
  50592. } */
  50593. boxposes.forEach(function (pose) {
  50594. //pose.lowR = pose.dis < minDis ? Math.pow(THREE.MathUtils.smoothstep(pose.dis / minDis, 0, 1),2) : 1 //太近的话误差大
  50595. pose.lowR = pose.dis < minDis ? Math.pow(pose.dis / minDis, 1.4) : 1; //太近的话误差大
  50596. if (pose.projectWidth > pose.maxProjectWidth) {
  50597. score += Math.pow((pose.projectWidth / pose.maxProjectWidth - 1) * pose.lowR, 2) * 500; //超过的话数字较大所以乘的数小一些
  50598. } else if (
  50599. /* isSingle && */
  50600. pose.projectWidth < pose.minProjectWidth) {
  50601. score += Math.pow((pose.minProjectWidth / pose.projectWidth - 1) * pose.lowR, 2) * 500;
  50602. }
  50603. var _standards$boxType$wi = standards[boxType].widthNormal,
  50604. min = _standards$boxType$wi.min;
  50605. _standards$boxType$wi.max;
  50606. if (standards[boxType].atWall == 1 && min < 0.3 || boxposes.length == 2 && boxType == 'battery') {
  50607. var _standards$boxType$wi2 = standards[boxType].widthNormal,
  50608. _min2 = _standards$boxType$wi2.min,
  50609. _max2 = _standards$boxType$wi2.max; //let r = Math.max(0.001, (pose.projectWidth - min) / (max - min))
  50610. var diff = _max2 - _min2;
  50611. var r = math$1.linearClamp(pose.projectWidth, _min2, _min2 + diff * 0.5, 600, 0); //if(boxposes.length == 2 && boxType == 'battery'){//由于battery经常出现遮挡,导致方向出错,因此尽量不匹配projectWidth较短的,尽管这本有可能是对的
  50612. score += r; //}
  50613. /* if (min < 0.3 && r < 0.5) {
  50614. //从贴近墙面的位置看侧面的话,容易被挡住,不准,尤其是电箱
  50615. score += ((max - min) / r / min) * 5
  50616. } */
  50617. }
  50618. });
  50619. score = Math.min(score, 1300); //压低一点,因为得的宽度可能不准
  50620. if (boxposes.length == 2) {
  50621. //每一个方向对应有四个方向(每个象限一个)看到的projectWidth应该接近。
  50622. //先把camTangent转化为第一个象限的
  50623. var camTangent0 = new THREE.Vector2(Math.abs(boxposes[0].camTangent.x), Math.abs(boxposes[0].camTangent.y));
  50624. var camTangent1 = new THREE.Vector2(Math.abs(boxposes[1].camTangent.x), Math.abs(boxposes[1].camTangent.y));
  50625. var a = camTangent0.dot(camTangent1);
  50626. if (a > 0.8) {
  50627. //WcLVXvmV9AU
  50628. //0.9: 25度之内. 0.8: 36.8度之内
  50629. var diff = Math.abs(boxposes[0].projectWidth - boxposes[1].projectWidth);
  50630. boxposes.score2 = a * diff * 1300 * boxposes[0].lowR * boxposes[1].lowR;
  50631. score += boxposes.score2; //console.warn('在同一个方向看到的projectWidth应该接近。 ', diff)
  50632. }
  50633. boxposes.camTangentCos = a;
  50634. } //要不要加上minX等的差距?
  50635. score = Math.min(score, 1200);
  50636. return -score;
  50637. };
  50638. var getBoxSize = function getBoxSize(info) {
  50639. if (info.boxType == 'groundBar') {
  50640. console.log(1);
  50641. }
  50642. if (info.size) return; //console.warn('开始算 ' + info.name)
  50643. var exStr = '',
  50644. warnStr = '';
  50645. var x, y; //求对角线的向量 x>0,y>0
  50646. //假设盒子的长宽为x,y (x>0,y>0),视线切线单位向量为(k,m),投影距离:x'k+y'm.(x'是正负x,y'是正负y)
  50647. //由于盒子的对角线有四个可选方向,(类似四个象限) 则需要能使投影距离最长的一个对角线向量。
  50648. //如,当k<0,m>0时,要使xk+ym 最大,必有x<0,y>0. 故 x = -x', y = y', 故 投影距离:x'k+y'm = x(-k)+ym 。
  50649. //故无论km的符号如何,只要变为正数,再去联立方程即可得xy。(相当于切线转到第一象限)
  50650. //注:但是因为无法获取准确的投影距离(角平分线左右两边的端点到角平分线的距离不相等,垂足也无法确定),所以所算的误差非常大。
  50651. if (info.name == 'pano6-13&pano4-13') {
  50652. console.log(6);
  50653. }
  50654. var center = getBoxPos(info);
  50655. var oriX, oriY;
  50656. if (info.predictSize) {
  50657. x = oriX = info.predictSize.x, y = oriY = info.predictSize.y;
  50658. } else {
  50659. if (info.box1) {
  50660. var x1 = info.boxposes[0].camTangent.x,
  50661. x2 = info.boxposes[1].camTangent.x,
  50662. y1 = info.boxposes[0].camTangent.y,
  50663. y2 = info.boxposes[1].camTangent.y,
  50664. w1 =
  50665. /* info.boxposes[0].projectWidth, */
  50666. THREE.MathUtils.clamp(info.boxposes[0].projectWidth, info.boxposes[0].minProjectWidth, info.boxposes[0].maxProjectWidth * 1.1),
  50667. //校准。如果projectwidth不准那算出来更不准. 但XswQxwmn2ZC的里侧电池是前者更准
  50668. w2 =
  50669. /* info.boxposes[1].projectWidth */
  50670. THREE.MathUtils.clamp(info.boxposes[1].projectWidth, info.boxposes[1].minProjectWidth, info.boxposes[1].maxProjectWidth * 1.1); //如果识别到柜门上,(柜体被遮住了),整体中心就会在柜门上,且厚度小于真实值。
  50671. if (x1 == 0) {
  50672. y = w1;
  50673. x = (w2 - y2 * y) / x2;
  50674. } else {
  50675. //联立方程得:
  50676. y = (w2 - x2 / x1 * w1) / (y2 - x2 / x1 * y1);
  50677. x = (w1 - y1 * y) / x1;
  50678. } //console.log('xy', { x, y })
  50679. (x < 0.3 || x > 1.4) && (exStr += ' x:' + math$1.toPrecision(x, 2));
  50680. (y < 0.3 || y > 1.4) && (exStr += ' y:' + math$1.toPrecision(y, 2));
  50681. if (y < 0 || x < 0) {
  50682. //console.log('<0 ?????????')
  50683. warnStr = x < 0 ? 'x<0!' : 'y<0!';
  50684. }
  50685. oriX = x, oriY = y;
  50686. } else {
  50687. //single pano data
  50688. //将maxX maxY 限定在标准范围内
  50689. if (info.xProp) {
  50690. var widthValue = standards[info.boxType].width;
  50691. var thickValue = standards[info.boxType].thick;
  50692. var maxX, maxY, minX, minY;
  50693. if (info.xProp == 'width') {
  50694. /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max)
  50695. y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max)
  50696. */
  50697. maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max); //AG0bi2fhb3 需要将得到的minX等这四项都clamp后再平均
  50698. maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max);
  50699. minX = THREE.MathUtils.clamp(info.boxposes[0].minX, widthValue.min, widthValue.max);
  50700. minY = THREE.MathUtils.clamp(info.boxposes[0].minY, thickValue.min, thickValue.max);
  50701. } else {
  50702. /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max)
  50703. y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max)
  50704. */
  50705. maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max);
  50706. maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max);
  50707. minX = THREE.MathUtils.clamp(info.boxposes[0].minX, thickValue.min, thickValue.max);
  50708. minY = THREE.MathUtils.clamp(info.boxposes[0].minY, widthValue.min, widthValue.max);
  50709. }
  50710. x = oriX = (maxX + minX) / 2;
  50711. y = oriY = (maxY + minY) / 2;
  50712. } else {
  50713. //x = oriX = y = oriY = (min+max)/2
  50714. var standard = standards[info.boxType].widthNormal;
  50715. x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, standard.min, standard.max);
  50716. y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, standard.min, standard.max);
  50717. }
  50718. } //按正常来说,得到的x,y都应>0,但是由于箱子会被遮挡,导致投影宽度比真实的小,算出的也不准,可能是负数
  50719. //所以手动将过小的宽度矫正
  50720. }
  50721. /* if(info.name == "pano2-6"){
  50722. console.log(7)
  50723. } */
  50724. var height;
  50725. if (standards[info.boxType].bottom) {
  50726. //悬挂的
  50727. //挂式空调最好把长宽固定。 不过极少出错
  50728. //center.y -= 0.1 //很可能过高
  50729. height = standards[info.boxType].height.standard;
  50730. getBoxBtm(info);
  50731. if (height) {
  50732. var d = center.y - info.btmPos.y;
  50733. center.y -= THREE.MathUtils.clamp((d - height / 2) / 2, -0.1, 0.1); //如果中心点到底部的距离和height的一半不同,中心点移动差值的一半
  50734. } else {
  50735. var btmY = info.btmPos.y;
  50736. /* let ys = [info.btmPos.y]//info.btmPos.y蛮不准的
  50737. if(info.box0){
  50738. ys.push(info.box0.btmPos.y)
  50739. }
  50740. if(info.box1){
  50741. ys.push(info.box1.btmPos.y)
  50742. }
  50743. btmY = ys.reduce((w,c)=>{return w+c},0)
  50744. btmY/=ys.length //平均 */
  50745. height = (center.y - btmY) * 2;
  50746. }
  50747. } else {
  50748. if (!info.topPos) getBoxTop(info);
  50749. height = info.topPos.y - groundY;
  50750. }
  50751. var o = restrictSize(x, height, y, info);
  50752. x = o.x, height = o.y, y = o.z;
  50753. if (standards[info.boxType].widthSame) {
  50754. x = y = (x + y) / 2;
  50755. }
  50756. info.size = new THREE.Vector3(x, height, y);
  50757. info.sizeAdjust = Math.pow(Math.abs(x - oriX), 1.3) + Math.pow(Math.abs(y - oriY), 1.3); //计算得到的值和标准值之间的差距,可以反映该info的匹配分值
  50758. if (info.sizeAdjust) info.score = (info.score || 0) - Math.min(info.sizeAdjust * 100, 400);
  50759. info.size.oriX = oriX, info.size.oriY = oriY;
  50760. info.exStr = exStr, info.warnStr = warnStr;
  50761. };
  50762. var restrictSize = function restrictSize(x, y, z, info) {
  50763. var s;
  50764. var xProp = info.xProp,
  50765. yProp = info.yProp;
  50766. if (xProp != void 0) {
  50767. var _standards$info$boxTy = standards[info.boxType][xProp],
  50768. min = _standards$info$boxTy.min,
  50769. max = _standards$info$boxTy.max;
  50770. x = THREE.MathUtils.clamp(x, min, max);
  50771. var _standards$info$boxTy2 = standards[info.boxType][yProp],
  50772. min = _standards$info$boxTy2.min,
  50773. max = _standards$info$boxTy2.max;
  50774. z = THREE.MathUtils.clamp(z, min, max);
  50775. s = true;
  50776. }
  50777. if (!s) {
  50778. var _standards$info$boxTy3 = standards[info.boxType].widthNormal,
  50779. min = _standards$info$boxTy3.min,
  50780. max = _standards$info$boxTy3.max;
  50781. x = THREE.MathUtils.clamp(x, min, max);
  50782. z = THREE.MathUtils.clamp(z, min, max);
  50783. }
  50784. var _standards$info$boxTy4 = standards[info.boxType].height,
  50785. min = _standards$info$boxTy4.min,
  50786. max = _standards$info$boxTy4.max;
  50787. y = THREE.MathUtils.clamp(y, min, max);
  50788. return {
  50789. x,
  50790. y,
  50791. z
  50792. };
  50793. };
  50794. var getMixBox = function getMixBox(box0, box1) {
  50795. //重叠部分
  50796. var box = new THREE.Box2();
  50797. box.min.set(Math.max(box0.min.x, box1.min.x), Math.max(box0.min.y, box1.min.y));
  50798. box.max.set(Math.min(box0.max.x, box1.max.x), Math.min(box0.max.y, box1.max.y));
  50799. return box;
  50800. };
  50801. var getLeftRight = function getLeftRight(boxArr) {
  50802. //获取pano的boxes中最左和最右的bbox.x
  50803. var lefts = boxArr.map(function (e) {
  50804. return e.bbox2[0];
  50805. });
  50806. var rights = boxArr.map(function (e) {
  50807. return e.bbox2[2];
  50808. });
  50809. lefts.sort(function (a, b) {
  50810. return getBbox2Diff(a, b);
  50811. });
  50812. rights.sort(function (a, b) {
  50813. return getBbox2Diff(b, a);
  50814. });
  50815. var leftX = lefts[0]; //最左
  50816. var rightX = rights[0]; //最右
  50817. return {
  50818. leftX,
  50819. rightX
  50820. };
  50821. };
  50822. global$1.searchCount1 = 0, global$1.escapeCount1 = 0;
  50823. var searchPair = function searchPair(beginItem, group0_, group1_, parentPairs, resultPairs, evaluateFun, minScore) {
  50824. //配对结果个数为n!,其中n是每组的元素个数。注意当n=10时,已经有40320个,非常恐怖。
  50825. var pair = [],
  50826. parentExit = !!parentPairs;
  50827. var removeParent = function removeParent() {
  50828. //元结点裂变出多个,来装新的pair
  50829. if (parentExit) {
  50830. var i = resultPairs.indexOf(parentPairs);
  50831. resultPairs.splice(i, 1);
  50832. parentExit = false;
  50833. }
  50834. };
  50835. if (!parentPairs) {
  50836. //首次
  50837. if (group0_.length == 0 || group1_.length == 0) return; //保证第一个的个数<=第二个,否则第一组多出来的永远匹配不上
  50838. if (group0_.length > group1_.length) {
  50839. var t = group0_;
  50840. group0_ = group1_;
  50841. group1_ = t;
  50842. }
  50843. beginItem = group0_[0];
  50844. var complex = Object.keys(global$1.boxFrame.datas).length;
  50845. if (complex < 10) evaluateFun = null;else minScore = math$1.linearClamp(complex, 10, 80, -4000, -500); //console.log('searchPair length',group0_.length,group1_.length)
  50846. }
  50847. searchCount1++;
  50848. for (var j = 0; j < group1_.length; j++) {
  50849. pair = [beginItem, group1_[j]]; //if(pair[0].sid == 'void' || pair[1].sid == 'void')continue
  50850. var evaluate = void 0;
  50851. if (evaluateFun
  50852. /* && !(pair[0].sid == 'void' || pair[1].sid == 'void') */
  50853. ) {
  50854. evaluate = evaluateFun(pair[0], pair[1]);
  50855. if (evaluate == void 0 || evaluate.score <= minScore) {
  50856. //console.log('因为评估出匹配可能性低所以跳过',pair[0],pair[1],evaluate)
  50857. escapeCount1++;
  50858. continue;
  50859. }
  50860. }
  50861. var newPairs = void 0; //用来存放该组pair
  50862. if (parentPairs) {
  50863. removeParent();
  50864. newPairs = parentPairs.slice(0); //复制
  50865. newPairs.push(pair);
  50866. } else {
  50867. newPairs = [pair]; //新的容器
  50868. }
  50869. resultPairs.push(newPairs);
  50870. var newGroup0 = group0_.slice(0);
  50871. var newGroup1 = group1_.slice(0);
  50872. var index = newGroup0.indexOf(pair[0]);
  50873. newGroup0.splice(index, 1);
  50874. index = newGroup1.indexOf(pair[1]);
  50875. newGroup1.splice(index, 1);
  50876. if (newGroup0.length > 0 && newGroup1.length > 0) {
  50877. searchPair(newGroup0[0], newGroup0, newGroup1, newPairs, resultPairs, evaluateFun, minScore);
  50878. }
  50879. }
  50880. }; //如果第一个元素就和后面所有的都不匹配,就直接返回了怎么办?
  50881. var PanoBoxFrame = /*#__PURE__*/function (_THREE$Group) {
  50882. _inherits(PanoBoxFrame, _THREE$Group);
  50883. var _super = _createSuper$x(PanoBoxFrame);
  50884. function PanoBoxFrame(player_, ifAnalyze, dataList) {
  50885. var _this2;
  50886. _classCallCheck(this, PanoBoxFrame);
  50887. _this2 = _super.call(this);
  50888. _this2.clear();
  50889. player$4 = player_;
  50890. player$4.model.add(_assertThisInitialized(_this2));
  50891. global$1.boxFrame = _assertThisInitialized(_this2);
  50892. if (browser$1.urlHasValue('ext')) {
  50893. isExt = true;
  50894. isDiwei = isExt && !browser$1.urlHasValue('ctrl');
  50895. }
  50896. _this2.ifAnalyze = ifAnalyze;
  50897. _this2.wireframes = new THREE.Object3D();
  50898. _this2.wireframes.name = 'wireframes';
  50899. _this2.add(_this2.wireframes);
  50900. _this2.matchScoreMap = {};
  50901. _this2.bindEvents();
  50902. meshGroup = new THREE.Object3D();
  50903. meshGroup.name = 'testBox';
  50904. _this2.add(meshGroup);
  50905. _this2.visiInfos = {};
  50906. _this2.compute(dataList);
  50907. return _this2;
  50908. }
  50909. _createClass(PanoBoxFrame, [{
  50910. key: "compute",
  50911. value: function () {
  50912. var _compute = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(dataList) {
  50913. var _this3 = this;
  50914. var beginCompute, done, loadAll, _loadAll;
  50915. return regenerator.wrap(function _callee3$(_context3) {
  50916. while (1) {
  50917. switch (_context3.prev = _context3.next) {
  50918. case 0:
  50919. _loadAll = function _loadAll3() {
  50920. _loadAll = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
  50921. var _this5 = this;
  50922. var data, box4;
  50923. return regenerator.wrap(function _callee2$(_context2) {
  50924. while (1) {
  50925. switch (_context2.prev = _context2.next) {
  50926. case 0:
  50927. _context2.next = 2;
  50928. return http.post('/service/shapes/sceneMarkShape/getInfos', {
  50929. num: player$4.$app.config.num
  50930. });
  50931. case 2:
  50932. data = _context2.sent;
  50933. if (!(!data.data || !data.success)) {
  50934. _context2.next = 5;
  50935. break;
  50936. }
  50937. return _context2.abrupt("return");
  50938. case 5:
  50939. if (isExt) {
  50940. (data.data.box8.dataSet.boxes || data.data.box8.dataSet).forEach(function (e) {
  50941. // if (e.external && !e.external.show) {
  50942. // return
  50943. // }
  50944. // e.external = {
  50945. // eqpType: 'equipment_cabinet',
  50946. // eqpName: '送变电机房BATS_1',
  50947. // show: true,
  50948. // eqpId: '150035210000000000125288',
  50949. // url: 'http://120.194.14.251:40004/vr_3dWeb/deviceInfo?rackId=7a323f16-ac13-4434-bf97-c44d1783a217',
  50950. // }
  50951. var point1 = math$1.convertVisionVector(new THREE.Vector3().fromArray(e.points[0]));
  50952. var point2 = math$1.convertVisionVector(new THREE.Vector3().fromArray(e.points[1]));
  50953. var point3 = math$1.convertVisionVector(new THREE.Vector3().fromArray(e.points[2]));
  50954. var point4 = math$1.convertVisionVector(new THREE.Vector3().fromArray(e.points[4]));
  50955. var size = new THREE.Vector3(point1.distanceTo(point2), point1.y - point4.y, point3.distanceTo(point2));
  50956. var center = new THREE.Vector3().addVectors(point3, point4).multiplyScalar(0.5); //对角线中点
  50957. //可能需要考虑上rotation,现暂时不需要
  50958. new Box({
  50959. buildFromData: true,
  50960. center,
  50961. size,
  50962. boxType: e.type,
  50963. name: e.sid,
  50964. external: e.external
  50965. });
  50966. });
  50967. this.ifAnalyze = false;
  50968. this.visible = false;
  50969. }
  50970. if (!isExt || browser$1.urlHasValue('ctrl')) {
  50971. box4 = Array.isArray(data.data) ? data.data : data.data.box4; // 兼容旧数据
  50972. box4.forEach(function (e) {
  50973. var panoId = e.imagePath.split('.jpg')[0];
  50974. _this5.datas[panoId] = e;
  50975. });
  50976. this.visible = true;
  50977. }
  50978. done();
  50979. case 8:
  50980. case "end":
  50981. return _context2.stop();
  50982. }
  50983. }
  50984. }, _callee2, this);
  50985. }));
  50986. return _loadAll.apply(this, arguments);
  50987. };
  50988. loadAll = function _loadAll2() {
  50989. return _loadAll.apply(this, arguments);
  50990. };
  50991. startTime = Date.now();
  50992. this.datas = {};
  50993. this.datasMixed = {};
  50994. this.boxesSolid = boxesSolid;
  50995. beginCompute = function beginCompute() {
  50996. //获取匹配分数
  50997. var getMatchScore = function getMatchScore(box0, box1) {
  50998. var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  50999. isSingle = _ref2.isSingle,
  51000. center = _ref2.center,
  51001. onlyGet = _ref2.onlyGet,
  51002. dontCheckDis = _ref2.dontCheckDis;
  51003. var name0 = box0.sid + '&' + box1.sid;
  51004. var name1 = box1.sid + '&' + box0.sid;
  51005. var boxType = getBoxType(box0);
  51006. var matchInfo0 = _this3.matchScoreMap[boxType].get(name0);
  51007. var matchInfo1 = _this3.matchScoreMap[boxType].get(name1);
  51008. var matchInfo = matchInfo0 || matchInfo1;
  51009. if (onlyGet) return matchInfo;
  51010. var name;
  51011. if (!matchInfo) {
  51012. name = name0;
  51013. matchInfo = {
  51014. name,
  51015. box0,
  51016. box1,
  51017. center
  51018. };
  51019. _this3.matchScoreMap[boxType].set(name, matchInfo);
  51020. } else {
  51021. return matchInfo;
  51022. }
  51023. if (name == 'pano120-20&pano130-17') {
  51024. console.log(5);
  51025. }
  51026. getBoxBase(box0);
  51027. getBoxBase(box1);
  51028. var A = box0.pano.position.clone();
  51029. var B = box1.pano.position.clone();
  51030. var AB = new THREE.Vector3().subVectors(B, A);
  51031. var AB2d = new THREE.Vector2(AB.x, AB.z).normalize();
  51032. var AP12d = center ? new THREE.Vector2(center.x - A.x, center.z - A.z).normalize() : new THREE.Vector2(box0.centerDir.x, box0.centerDir.z).normalize();
  51033. var BP22d = center ? new THREE.Vector2(center.x - B.x, center.z - B.z).normalize() : new THREE.Vector2(box1.centerDir.x, box1.centerDir.z).normalize();
  51034. var angleA = Math.acos(AB2d.dot(AP12d));
  51035. var angleB = Math.PI - Math.acos(AB2d.dot(BP22d));
  51036. var score = 100,
  51037. str = [];
  51038. if (angleA + angleB > Math.PI + 0.2) {
  51039. //无交点(比180大是因为中心角度有误差,所以给一定的容错)
  51040. //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因角度大于180度 不匹配`)
  51041. return Object.assign(matchInfo, {
  51042. score: -5000,
  51043. str: ['angle>180']
  51044. });
  51045. }
  51046. if (box0.type != box1.type) {
  51047. return Object.assign(matchInfo, {
  51048. score: -5000,
  51049. str: ['typeNotSame']
  51050. });
  51051. }
  51052. if (matchInfo.dirAngleXZ == void 0) {
  51053. matchInfo.dirAngleXZ = THREE.MathUtils.radToDeg(Math.acos(AP12d.dot(BP22d))); //需要尽量接近90度算出来的交点会比较准
  51054. matchInfo.minAng = Math.min(180 - matchInfo.dirAngleXZ, matchInfo.dirAngleXZ); //角度小的getIntersect2容易算不准
  51055. if (isSingle) {
  51056. var bestDisSquared = 2; //单个匹配单个,而非多个匹配多个(没有固定到两个漫游点),所以可以直接寻找最优角度
  51057. score += Math.sin(THREE.MathUtils.degToRad(matchInfo.dirAngleXZ)) * 300;
  51058. score += matchInfo.dirAngleXZ; //另外角度越大越不容易偏向一边
  51059. score -= Math.abs(getBoxPos(box0).distanceToSquared(box0.pano.position) - bestDisSquared) * 10;
  51060. score -= Math.abs(getBoxPos(box1).distanceToSquared(box1.pano.position) - bestDisSquared) * 10;
  51061. }
  51062. }
  51063. var shinkRatio = 1;
  51064. var btmPos0 = box0.btmPos || box0.btmPosPredict; //fire类型先用btmPosPredict,测定groundY后才有btmPos
  51065. var btmPos1 = box1.btmPos || box1.btmPosPredict;
  51066. if (!dontCheckDis) {
  51067. //let r = box0.boxType == 'air' ? 1 : box0.boxType == 'cabinet' ? 0.9 : 0.7 //随着宽度增加而降低
  51068. var r = THREE.MathUtils.clamp(0.8 / standards[boxType].widthNormal.max, 0.6, 2); //随着宽度增加而降低 UWrshepp0G5的fire
  51069. if (!standards[boxType].bottom && btmPos0 && btmPos1) {
  51070. //注:挂空调不应使用btmPosPredict
  51071. var d = btmPos0.distanceToSquared(btmPos1);
  51072. matchInfo.btmPosPreDis = d;
  51073. score -= d * 1300 * r * shinkRatio;
  51074. if (box1.topPos) {
  51075. var a = box0.topPos.distanceToSquared(box1.topPos);
  51076. matchInfo.topPosPreDis = a;
  51077. var u = a * 700 * r * shinkRatio;
  51078. var AP0 = new THREE.Vector2(btmPos0.x - A.x, btmPos0.z - A.z).lengthSq();
  51079. var AP1 = new THREE.Vector2(btmPos1.x - B.x, btmPos1.z - B.z).lengthSq();
  51080. if (AP0 < 0.4 || AP1 < 0.4) u *= 0.3; //太近
  51081. score -= u;
  51082. }
  51083. } else if (box0.posAtWall && box1.posAtWall) {
  51084. //
  51085. var _d = box0.posAtWall.distanceToSquared(box1.posAtWall);
  51086. matchInfo.wallPosPreDis = _d;
  51087. score -= _d * 200 * r; //墙面不准所以分低 ftMTQIrs79
  51088. _d = box0.btmPosOri.distanceToSquared(box1.btmPosOri); //还是加一下
  51089. matchInfo.btmPosPreDis = _d;
  51090. score -= _d * 200 * r * shinkRatio;
  51091. /* let h0 = box0.topPos.y - box0.btmPos.y
  51092. let h1 = box1.topPos.y - box1.btmPos.y
  51093. score -= Math.abs(h0-h1) * 3000 * r * shinkRatio //高度差 倾斜角度大的不准
  51094. */
  51095. }
  51096. }
  51097. if (!matchInfo.center) {
  51098. var o = getIntersect2(A, box0.centerDir, B, box1.centerDir);
  51099. matchInfo.center = o.pos3d.clone();
  51100. /* let o2 = math.getLineIntersect({ A, B, p1: A.clone().add(box0.centerDir), p2:B.clone().add(box1.centerDir) })
  51101. matchInfo.center2 = o2.pos3d.clone() */
  51102. /* if (name == "pano16-4&pano18-5") {
  51103. addLine(A, box0.centerBtmDir, 10), addLine(B, box1.centerBtmDir, 10)
  51104. } */
  51105. //验证是否漫游点到中心点的方向和centerDir一样
  51106. var dir0 = new THREE.Vector3().subVectors(o.pos3d, A).normalize();
  51107. var dir1 = new THREE.Vector3().subVectors(o.pos3d, B).normalize();
  51108. var sum = dir0.dot(box0.centerDir) + dir1.dot(box1.centerDir);
  51109. var wrongDir = sum < 1.95;
  51110. score -= (2 - sum) * 10000;
  51111. if (wrongDir) {
  51112. str.push('wrongDir');
  51113. return Object.assign(matchInfo, {
  51114. score: score - 5000,
  51115. str
  51116. });
  51117. }
  51118. if (!dontCheckDis && !standards[boxType].bottom && box0.btmPos && box1.btmPos) {
  51119. //墙壁位置不准所以不用 KK-ftMTQIrs79
  51120. var p0 = new THREE.Vector2(box0.btmPos.x, box0.btmPos.z);
  51121. var p1 = new THREE.Vector2(box1.btmPos.x, box1.btmPos.z);
  51122. var p = new THREE.Vector2(matchInfo.center.x, matchInfo.center.z);
  51123. var dis = p0.distanceToSquared(p) + p1.distanceToSquared(p);
  51124. var s = math$1.linearClamp(matchInfo.minAng, 0, 20, 0, 1);
  51125. score -= dis * 1500 * s; //如果距离较远就说明算的center误差大,不可信。可能有一个框不准确
  51126. matchInfo.centerDrift = dis;
  51127. }
  51128. getBoxBtm(matchInfo);
  51129. var cr; //getIntersect2结果的权重
  51130. if (standards[box0.boxType].atWall == 1) {
  51131. cr = math$1.linearClamp(matchInfo.minAng, 2, 15, 0, 1); //墙壁误差大,所以尽量完全依赖cIntersect。。。后期如果该墙壁校准了可以调整
  51132. } else {
  51133. cr = math$1.linearClamp(matchInfo.minAng, 2, 20, 0, 0.4);
  51134. }
  51135. var predict0 = !standards[boxType].bottom && box0.btmPos || box0.posAtWall || matchInfo.topPos; //在墙上的除非角度小,否则不考虑cIntersect
  51136. var predict1 = !standards[boxType].bottom && box1.btmPos || box1.posAtWall || matchInfo.topPos; //相对来说btmPos要比center准一点?因为center有在两个维度上的误差
  51137. var btmRatio = 0.5;
  51138. var cIntersect = new THREE.Vector3().addVectors(matchInfo.center.clone().multiplyScalar(1 - btmRatio), matchInfo.btmPos.clone().multiplyScalar(btmRatio)).setY(o.pos3d.y);
  51139. if (predict0 && predict1) {
  51140. matchInfo.center = new THREE.Vector3().addVectors(cIntersect.clone().multiplyScalar(cr), predict0.clone().add(predict1).multiplyScalar(1 / 2 * (1 - cr))).setY(o.pos3d.y);
  51141. } else {
  51142. matchInfo.center = cIntersect;
  51143. }
  51144. matchInfo.cIntersect = cIntersect; //addLabel(matchInfo.center, matchInfo.name + '-c')
  51145. }
  51146. getBoxType(matchInfo);
  51147. /* if (matchInfo.boxType != box0.type || matchInfo.boxType != box1.type) {
  51148. ;(score -= 1000), str.push('typeNotSame2')
  51149. } */
  51150. {
  51151. var vec0 = new THREE.Vector3().subVectors(box0.pano.position, matchInfo.center);
  51152. var vec1 = new THREE.Vector3().subVectors(box1.pano.position, matchInfo.center);
  51153. if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0) {
  51154. //同一个象限(center会偏向一侧)
  51155. score -= 200;
  51156. }
  51157. }
  51158. if (!safeBound.containsPoint(matchInfo.center)) {
  51159. var _dis = safeBound.distanceToPoint(matchInfo.center) //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因中心点在bounding外不匹配`, center, 'dis: ' + dis)
  51160. ;
  51161. score -= 1000 * _dis * _dis, str.push('outsideBound');
  51162. Object.assign(matchInfo, {
  51163. score,
  51164. str,
  51165. center: matchInfo.center,
  51166. disToBound: _dis
  51167. });
  51168. if (_dis > 0.5) return matchInfo;
  51169. } //检查宽度
  51170. var boxposes;
  51171. var checkWidth = function checkWidth() {
  51172. boxposes = [];
  51173. [box0, box1].forEach(function (box) {
  51174. var pose = getBoxPoseByPos(box, matchInfo.center);
  51175. boxposes.push(pose); //如果超出标准,基本上这二者不匹配;但过小的话,有可能是被遮挡所以残缺,因此不予过滤
  51176. });
  51177. };
  51178. checkWidth();
  51179. score += getPoseScore(boxposes, boxType
  51180. /* isSingle */
  51181. ); //根据投影信息预测的长度再得匹配分数
  51182. return Object.assign(matchInfo, {
  51183. score: score,
  51184. str,
  51185. /* diffHalfHeight, */
  51186. boxposes
  51187. });
  51188. };
  51189. _this3.rows = {};
  51190. /* let getchainNext = (left, end, chain, boxes) => {
  51191. chain.push(left)
  51192. if (left == end) return boxes.chains.push(chain)
  51193. let nodes = boxes.relationships.filter(pair => pair.includes(left))
  51194. let rights = nodes.map(pair => pair.find(e => e != left))
  51195. rights = rights.filter(e => !chain.includes(e) && boxes.indexOf(e) > boxes.indexOf(left))
  51196. rights.forEach(right => {
  51197. getchainNext(right, end, chain.slice(), boxes)
  51198. })
  51199. } */
  51200. var getPanoBigRowBox = function getPanoBigRowBox(panoBoxes) {
  51201. var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  51202. _ref3$reason = _ref3.reason,
  51203. reason = _ref3$reason === void 0 ? 'row' : _ref3$reason;
  51204. //将一个pano中的所有boxes分组,识别哪些是一排的。也可用于识别融合
  51205. var pano = panoBoxes[0].pano;
  51206. var category = panoBoxes[0].category;
  51207. var type = category + '|' + reason;
  51208. _this3.rows[type] || (_this3.rows[type] = {});
  51209. if (_this3.rows[type][pano.id]) return _this3.rows[type][pano.id];
  51210. var bigBoxes;
  51211. var bigBox = {
  51212. sid: 'pano' + pano.id + (reason == 'mix' ? '-mix' : '-row'),
  51213. pano,
  51214. category: reason == 'mix' ? category : 'rowBigBox',
  51215. boxType: reason == 'mix' ? panoBoxes[0].boxType : 'rowBigBox'
  51216. };
  51217. var rows = [];
  51218. for (var i = 0; i < panoBoxes.length; i++) {
  51219. var box0 = panoBoxes[i];
  51220. getBoxBase(box0);
  51221. var _ref4 = [box0.bbox2[0], box0.bbox2[2]],
  51222. left0 = _ref4[0],
  51223. right0 = _ref4[1];
  51224. for (var j = i + 1; j < panoBoxes.length; j++) {
  51225. var box1 = panoBoxes[j];
  51226. getBoxBase(box1);
  51227. if (box0.boxType != box0.boxType) continue; //类型不同
  51228. var _ref5 = [box1.bbox2[0], box1.bbox2[2]],
  51229. left1 = _ref5[0],
  51230. right1 = _ref5[1];
  51231. var d1 = getBbox2Diff(left1, right0),
  51232. d2 = getBbox2Diff(left1, left0),
  51233. d3 = getBbox2Diff(left0, right1);
  51234. if (box0.sid == 'pano2-4' && box1.sid == 'pano2-5') {
  51235. console.log(9);
  51236. }
  51237. var min = reason == 'mix' ? 0.004 : 0.003; //mix代表寻找分裂的重新融合到一起
  51238. if (d1 <= min && d2 >= min || d3 <= min && d2 <= min) {
  51239. //边框交接
  51240. var atEdgeMight = left1 < 0.002 && right0 > 0.998 ? [left1, right0] : left0 < 0.002 && right1 > 0.998 ? [left0, right1] : null; //有在全景图的边界的可能性
  51241. //if (reason == 'mix' && box0.category == typeNames.cabinet && !atEdgeMight) continue //柜子容易并排,尽量不融合 //再看,啥意思,没懂
  51242. if (reason == 'mix' && !atEdgeMight) continue; //不在边缘
  51243. var max = standards[box0.boxType].widthNormal.max; //standards[box0.btmPos ? category : 'air-hanging'].widthNormal
  51244. var tolerate = max * max * (reason == 'mix' ? 0.7 : 1.8); //yDCiaTQvRYn:row不能低于1.5
  51245. var p0 = standards[box0.boxType].atWall == 1 ? box0.posAtWall : reason == 'mix' ? box0.btmPosOri || box0.btmPosPredict : box0.btmPos;
  51246. var p1 = standards[box1.boxType].atWall == 1 ? box1.posAtWall : reason == 'mix' ? box1.btmPosOri || box1.btmPosPredict : box1.btmPos; //let p0 = box0.type == 'air-hanging' ? box0.posAtWall : reason == 'mix' ? box0.btmPosOri : box0.btmPos
  51247. //let p1 = box1.type == 'air-hanging' ? box1.posAtWall : reason == 'mix' ? box1.btmPosOri : box1.btmPos
  51248. var dis = p0.distanceToSquared(p1);
  51249. if (reason == 'mix') {
  51250. var allY = box0.bbox2[3] - box0.bbox2[1] + (box1.bbox2[3] - box1.bbox2[1]); //各自高度和
  51251. var wholeY = Math.max(box0.bbox2[3], box1.bbox2[3]) - Math.min(box0.bbox2[1], box1.bbox2[1]); //总跨越高度
  51252. var coverY = allY - wholeY; //重合区域的y高度,可为负数
  51253. var disY = (1 - coverY / wholeY + (wholeY - coverY) * 3) * 4 * tolerate; //既要考虑占比也要考虑差值
  51254. dis += disY; //SGyhEzZNGP9案例:虽然是atEdge但并不应该融合,便通过disY来阻挡 ; MW6MEeCOy9Y:pano16-15
  51255. //console.log('disY',disY, box0.sid, box1.sid )
  51256. var atEdgePossib = atEdgeMight ? 0.002 / (atEdgeMight[0] + (1 - atEdgeMight[1])) : 0; // 两条线越接近越可能融合
  51257. atEdgePossib = Math.min(6, atEdgePossib); //原本计算得 min:1, max:Infinity
  51258. dis -= atEdgePossib * tolerate; //给点点优势
  51259. }
  51260. /* if(box0.sid == "pano2-0"){
  51261. console.log('dis',dis,'tolerate',tolerate,[box0, box1],disY)
  51262. }
  51263. if (box0.sid == 'pano2-1' && box1.sid == 'pano2-4') {
  51264. reason == 'mix' && console.log(dis, tolerate, box0.sid, box1.sid)
  51265. }*/
  51266. if (dis < tolerate) {
  51267. //reason == 'mix' && console.log('-------------------')
  51268. common.pushToGroupAuto([box0, box1], rows);
  51269. }
  51270. }
  51271. }
  51272. } //一排箱子的角度范围不可超过180度,因为不可能站在箱子上拍,所以超过的话肯定有边缘的不在这一排中。
  51273. //可判断边缘箱子的是否角度偏大,一般中间的被遮挡所以偏小
  51274. rows.forEach(function (boxes) {
  51275. //从左到右排序
  51276. boxes.sort(function (a, b) {
  51277. //但因有的box跨越到别的box区域,所以这个顺序不准确
  51278. return getBbox2Diff(a.bbox2CenterX, b.bbox2CenterX);
  51279. });
  51280. }); //去除不在一条直线上的连接. 当bound超出后就断开
  51281. if (reason == 'row') {
  51282. rows.slice(0).forEach(function (boxes) {
  51283. if (boxes.length >= 2) {
  51284. var removes = [],
  51285. bound = new THREE.Box2(),
  51286. size = new THREE.Vector2(),
  51287. maxW = 0.6;
  51288. for (var _i = 0, _j = boxes.length; _i < _j; _i++) {
  51289. var box = boxes[_i];
  51290. var pos2d = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
  51291. bound.expandByPoint(pos2d);
  51292. bound.getSize(size);
  51293. var _min3 = Math.min(size.x, size.y);
  51294. if (_min3 > maxW) {
  51295. removes.push([boxes[_i], boxes[_i - 1]]);
  51296. bound = new THREE.Box2();
  51297. bound.expandByPoint(pos2d); //console.log('removes', size)
  51298. } //console.log('removes',k, box1.sid)
  51299. }
  51300. if (removes.length) {
  51301. /* console.log(
  51302. '去除错误row连接',
  51303. removes.map(e => e.map(a => a.sid))
  51304. ) */
  51305. var _common$disconnectGro = common.disconnectGroup(removes, rows);
  51306. _common$disconnectGro.newGroups; //if(newGroups.length>1){//分裂成多组了,重新计算
  51307. // console.log(newGroups)
  51308. //}
  51309. }
  51310. }
  51311. });
  51312. rows.forEach(function (boxes) {
  51313. //从左到右重新排序
  51314. boxes.sort(function (a, b) {
  51315. //但因有的box跨越到别的box区域,所以这个顺序不准确
  51316. return getBbox2Diff(a.bbox2CenterX, b.bbox2CenterX);
  51317. });
  51318. });
  51319. }
  51320. rows.sort(function (a, b) {
  51321. return b.length - a.length;
  51322. }); //箱子数量从大到小排序
  51323. bigBoxes = rows.map(function (boxes, i) {
  51324. var _getLeftRight = getLeftRight(boxes),
  51325. leftX = _getLeftRight.leftX,
  51326. rightX = _getLeftRight.rightX; //最左
  51327. var topY = boxes.slice().sort(function (a, b) {
  51328. return a.bbox2[1] - b.bbox2[1];
  51329. })[0].bbox2[1];
  51330. var btmY = boxes.slice().sort(function (a, b) {
  51331. return b.bbox2[3] - a.bbox2[3];
  51332. })[0].bbox2[3];
  51333. var rowBigBox = Object.assign({}, bigBox, {
  51334. boxes,
  51335. bbox2: [leftX, topY, rightX, btmY],
  51336. //整排的bbox
  51337. left: boxes.find(function (e) {
  51338. return e.bbox2[0] == leftX;
  51339. }),
  51340. right: boxes.find(function (e) {
  51341. return e.bbox2[2] == rightX;
  51342. })
  51343. });
  51344. var p0 = getBoxPos(rowBigBox.left);
  51345. var p1 = getBoxPos(rowBigBox.right);
  51346. var vec = new THREE.Vector2(p0.x - p1.x, p0.z - p1.z);
  51347. rowBigBox.k = Math.abs(vec.x / vec.y);
  51348. rowBigBox.predictLen = (rowBigBox.k > 1 ? Math.abs(vec.x) : Math.abs(vec.y)) + 0.6; //加入一个宽度
  51349. /* if(boxes.length <= boxes.relationships.length){//多条链(为了识别一个box嵌套多个的情况。不过后来在开头时处理了一部分)
  51350. boxes.chains = []
  51351. getchainNext(left,right,[], boxes )
  51352. let aveAngle = (getBbox2Diff(left.bbox2[2], left.bbox2[0]) + getBbox2Diff(right.bbox2[2], right.bbox2[0]) ) / 2 -0.01 //首尾的angle平均数。但如果这两个不准那就导致整体出错了
  51353. let middleAngle = getBbox2Diff(right.bbox2[0], left.bbox2[2])
  51354. let counts = boxes.chains.map(e=>e.length)
  51355. counts.sort((a,b)=>a-b)
  51356. let min = counts[0],max = counts[counts.length-1]
  51357. let r = [], cur = min;
  51358. while(cur<=max){
  51359. r.push({cur, diff:Math.abs((middleAngle / (cur-2) - aveAngle)}) //加 0.01是因为增加边缘
  51360. cur++
  51361. }
  51362. r.sort((a,b)=>a.diff-b.diff)
  51363. rowBigBox.predictBoxCount = r[0].cur
  51364. //---------
  51365. let goodCountChains = boxes.chains.filter(e=>e.length == rowBigBox.predictBoxCount)
  51366. if(goodCountChains.length == 1) rowBigBox.bestChain = goodCountChains[0]
  51367. else{
  51368. goodCountChains = goodCountChains.map((chain,i)=>{
  51369. let j = 1, diff=0 //中间的box的angle的方差
  51370. while(j<rowBigBox.predictBoxCount){
  51371. let angle = getBbox2Diff(chain[j].bbox2[2], chain[j].bbox2[0])
  51372. diff += Math.pow(angle - aveAngle, 2)
  51373. j++;
  51374. }
  51375. return {diff, chain}
  51376. })
  51377. goodCountChains.sort((a,b)=>a.diff-b.diff)
  51378. rowBigBox.bestChain = goodCountChains[0].chain
  51379. }
  51380. console.log('getChains',boxes.chains, 'predictBoxCount',rowBigBox.predictBoxCount, r)
  51381. } */
  51382. return rowBigBox;
  51383. });
  51384. if (reason != 'mix') {
  51385. panoBoxes.forEach(function (box) {
  51386. //加入单个的
  51387. if (!rows.some(function (row) {
  51388. return row.includes(box);
  51389. })) {
  51390. var boxBig = Object.assign({}, bigBox, {
  51391. bbox2: box.bbox2,
  51392. boxes: [box],
  51393. left: box,
  51394. right: box
  51395. });
  51396. bigBoxes.push(boxBig);
  51397. }
  51398. });
  51399. } //mix的之前的btm因pose错误而延伸了不对的depth所以不准
  51400. bigBoxes.forEach(function (bigBox) {
  51401. bigBox.sid += '-' + bigBox.boxes.map(function (e) {
  51402. return e.index;
  51403. }).join(',');
  51404. /* if (bigBox.sid == 'pano0-rowBigBox-1,0,2,4') {
  51405. console.log(3)
  51406. } */
  51407. if (reason == 'row') {
  51408. //取平均值
  51409. if (bigBox.boxes[0].btmPos) {
  51410. bigBox.btmPos = bigBox.boxes.reduce(function (w, c) {
  51411. return w.add(c.btmPos);
  51412. }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length); //addLabel(bigBox.btmPos,'b_'+bigBox.sid, {bgcolor:'#f93',a:0.4})
  51413. }
  51414. if (bigBox.boxes[0].topPos) {
  51415. bigBox.topPos = bigBox.boxes.reduce(function (w, c) {
  51416. return w.add(c.topPos);
  51417. }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
  51418. }
  51419. if (bigBox.boxes[0].posAtWall) {
  51420. bigBox.posAtWall = bigBox.boxes.reduce(function (w, c) {
  51421. return w.add(c.posAtWall);
  51422. }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
  51423. }
  51424. } //mix的需要合并后计算才准确
  51425. });
  51426. _this3.rows[type][pano.id] = bigBoxes; //当前pano的所有row
  51427. return bigBoxes;
  51428. };
  51429. /* let getPanoBoxAngleTrend = rowBox => {
  51430. //顺时针方向该pano的box角度范围是越来越大还是越来越小
  51431. let diffs = []
  51432. let angles = rowBox.boxes.map(box => getBbox2Diff(box.bbox2[2], box.bbox2[0]))
  51433. for (let i = 0, j = angles.length; i < j - 1; i++) {
  51434. //得所有相邻之间的差
  51435. let a0 = angles[i],
  51436. a1 = angles[i + 1]
  51437. diffs.push(a1 - a0)
  51438. }
  51439. diffs.sort((a, b) => a - b)
  51440. return diffs[Math.floor(diffs.length / 2)] //中位数
  51441. } */
  51442. /* let getBoxCount = (rowBigBox)=>{
  51443. return rowBigBox.predictBoxCount || rowBigBox.boxes.length
  51444. } */
  51445. var getReverseInfo = function getReverseInfo(rowBigBox0, rowBigBox1) {
  51446. //两个row的方向对应
  51447. var reversed = false;
  51448. var lefts = [rowBigBox0.left, rowBigBox1.left];
  51449. var rights = [rowBigBox0.right, rowBigBox1.right];
  51450. var dis0 = lefts[0].btmPos.distanceToSquared(lefts[1].btmPos);
  51451. var dis1 = rights[0].btmPos.distanceToSquared(rights[1].btmPos);
  51452. var dis2 = lefts[0].btmPos.distanceToSquared(rights[1].btmPos);
  51453. var dis3 = rights[0].btmPos.distanceToSquared(lefts[1].btmPos);
  51454. var posLeft2, posRight2;
  51455. if (dis0 + dis1 > dis2 + dis3) {
  51456. //距离近的代表是同一端
  51457. reversed = true;
  51458. posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
  51459. posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
  51460. } else {
  51461. posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
  51462. posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
  51463. }
  51464. var vec = new THREE.Vector2(posLeft2.x - posRight2.x, posLeft2.z - posRight2.z);
  51465. var k = Math.abs(vec.x / vec.y); //这个算斜率更准,但位置容易偏向一侧(可能用边缘的bbox算会好些?)
  51466. return {
  51467. reversed,
  51468. k
  51469. };
  51470. };
  51471. var searchByRow = function searchByRow(groups, datas) {
  51472. //先查找row,匹配row,再slice row的方法
  51473. _this3.matchScoreMap['rowBigBox'] = new Map();
  51474. var rowInfos = new Map();
  51475. var getRowMatchInfo = function getRowMatchInfo(rowBigBox0, rowBigBox1, ignoreCountMatch) {
  51476. //获取row间的匹配信息
  51477. //获取bigBox位置。由于一排的盒子比较长,中心方向误差大,所以采用先获取两边位置,再求中点的方法
  51478. //if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return //太难了,不算不一样的情况了
  51479. var name = rowBigBox0.sid + '&' + rowBigBox1.sid;
  51480. var row = rowInfos.get(name);
  51481. if (row) {
  51482. return row;
  51483. }
  51484. if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return; //if (getBoxCount(rowBigBox0) != getBoxCount(rowBigBox1) && getBoxCount(rowBigBox0) != 1 && getBoxCount(rowBigBox1) != 1)return
  51485. /* if (rowBigBox0.sid == 'pano0-row-1,2,6' && rowBigBox1.sid == 'pano2-row-0,2,6') {
  51486. console.log(4)
  51487. } */
  51488. var rowInfo;
  51489. if (rowBigBox0.boxes.length > 1 && rowBigBox1.boxes.length > 1) {
  51490. //多对多,可以求两端的位置
  51491. var lefts = [rowBigBox0.left, rowBigBox1.left];
  51492. var rights = [rowBigBox0.right, rowBigBox1.right];
  51493. var leftInfo;
  51494. var rightInfo;
  51495. var info2 = getReverseInfo(rowBigBox0, rowBigBox1);
  51496. var len0 = rowBigBox0.predictLen,
  51497. //长度应该接近
  51498. len1 = rowBigBox1.predictLen;
  51499. var overLen = Math.abs(len0 - len1);
  51500. /* / (rowBigBox0.boxes.length + rowBigBox1.boxes.length) * 5 */
  51501. if (overLen > 1) {
  51502. //console.warn('overLen> 1', overLen, rowBigBox0.sid, '和', rowBigBox1.sid)
  51503. return done();
  51504. }
  51505. if (info2.reversed) {
  51506. leftInfo = getMatchScore(lefts[0], rights[1], {
  51507. isSingle: true
  51508. });
  51509. rightInfo = getMatchScore(rights[0], lefts[1], {
  51510. isSingle: true
  51511. });
  51512. } else {
  51513. leftInfo = getMatchScore(lefts[0], lefts[1], {
  51514. isSingle: true
  51515. });
  51516. rightInfo = getMatchScore(rights[0], rights[1], {
  51517. isSingle: true
  51518. });
  51519. }
  51520. var posLeft = getBoxPos(leftInfo);
  51521. var posRight = getBoxPos(rightInfo);
  51522. if (!posLeft || !posRight || leftInfo.score < -4000 || rightInfo.score < -4000) {
  51523. return done(); //漫游点重合、>180度会导致此问题
  51524. }
  51525. preDealBox(leftInfo); //getBoxSize(leftInfo)
  51526. preDealBox(rightInfo); //getBoxSize(rightInfo)
  51527. posLeft = getBoxPos(leftInfo);
  51528. posRight = getBoxPos(rightInfo); //验证是否是垂直或水平
  51529. var vec = new THREE.Vector2(posLeft.x - posRight.x, posLeft.z - posRight.z);
  51530. var k = Math.abs(vec.x / vec.y);
  51531. if (info2.k > 1 && k < 1 || info2.k < 1 && k > 1) {
  51532. console.error('请检查!info2.k > 1 && k < 1 || info2.k < 1 && k > 1', rowBigBox0.sid, '和', rowBigBox1.sid); //绘制的方向错误,尺寸错误
  51533. return done();
  51534. }
  51535. var wrongK = 0;
  51536. if (rowBigBox0.k > 1 && rowBigBox1.k < 1 || rowBigBox0.k < 1 && rowBigBox1.k > 1) {
  51537. wrongK = rowBigBox0.k / rowBigBox1.k;
  51538. if (wrongK < 1) wrongK = 1 / wrongK;
  51539. }
  51540. /*
  51541. let trend0 = getPanoBoxAngleTrend(rowBigBox0)
  51542. let trend1 = getPanoBoxAngleTrend(rowBigBox1)
  51543. let judgeReverse = () => { //这个方法有时不准
  51544. let disLeftSquared0 = new THREE.Vector2(posLeft.x - rowBigBox0.pano.position.x, posLeft.z - rowBigBox0.pano.position.z).lengthSq()
  51545. let disRightSquared0 = new THREE.Vector2(posRight.x - rowBigBox0.pano.position.x, posRight.z - rowBigBox0.pano.position.z).lengthSq()
  51546. let a = trend0 * (disLeftSquared0 - disRightSquared0)
  51547. if (a < 0 && Math.abs(a) > 0.1) return true
  51548. let posLeft2 = reversed ? posRight : posLeft, //反向过的对第二个漫游点来说左右是反的
  51549. posRight2 = reversed ? posLeft : posRight
  51550. let disLeftSquared1 = new THREE.Vector2(posLeft2.x - rowBigBox1.pano.position.x, posLeft2.z - rowBigBox1.pano.position.z).lengthSq()
  51551. let disRightSquared1 = new THREE.Vector2(posRight2.x - rowBigBox1.pano.position.x, posRight2.z - rowBigBox1.pano.position.z).lengthSq()
  51552. let b = trend1 * (disLeftSquared1 - disRightSquared1)
  51553. if (b < 0 && Math.abs(b) > 0.1) return true
  51554. }
  51555. if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
  51556. //反向试试
  51557. leftInfo = getMatchScore(lefts[0], rights[1], { isSingle: true })
  51558. rightInfo = getMatchScore(rights[0], lefts[1], { isSingle: true })
  51559. posLeft = getBoxPos(leftInfo)
  51560. posRight = getBoxPos(rightInfo)
  51561. reversed = true //rowBigBox1 反向了
  51562. }
  51563. if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
  51564. return console.log('getCenter ;两个方向都不符合', rowBigBox0.sid, rowBigBox1.sid)
  51565. } */
  51566. /*const maxK = Math.max(0.6 / Math.sqrt(rowBigBox0.boxes.length), 0.2) // 最大斜率
  51567. if (k < maxK && k > 1 / maxK) {
  51568. return //console.log('放弃,斜率', k)
  51569. } */
  51570. //横的话,按x从小到大,竖的按z从小到大
  51571. if (k < 1 && posLeft.z > posRight.z || k > 1 && posLeft.x > posRight.x) {
  51572. var temp = posRight;
  51573. posRight = posLeft, posLeft = temp;
  51574. } //addLabel(posLeft, 'left-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
  51575. //addLabel(posRight, 'right-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
  51576. /* if (rowBigBox0.pano.id + '&' + rowBigBox1.pano.id == '22&26') {
  51577. console.log(777)
  51578. } */
  51579. /* var line1 = LineDraw.createLine([posLeft, posRight])
  51580. meshGroup.add(line1) */
  51581. //根据btmPos矫正一下中心位置, 否则容易偏漫游点这一侧
  51582. var center = new THREE.Vector3().addVectors(posLeft, posRight).multiplyScalar(0.5);
  51583. center.add(rowBigBox0.btmPos).add(rowBigBox1.btmPos).multiplyScalar(1 / 3);
  51584. var _match = getMatchScore(rowBigBox0, rowBigBox1, {
  51585. isSingle: true,
  51586. center
  51587. }); //是否预先传送center ?
  51588. //rowInfo.minAngs = [leftInfo.minAng , rightInfo.minAng]
  51589. /* if (match.name == 'pano4-row-6,4,1,3&pano0-row-0,1,4,5') {
  51590. console.log(8)
  51591. } */
  51592. var sc = _match.score - overLen * 1000 - wrongK * 100 + leftInfo.score + rightInfo.score;
  51593. if (sc < -4000) {
  51594. //console.log('放弃,匹配分过低,可能不是一组', rowBigBox0.sid, '和', rowBigBox1.sid, sc)
  51595. return done();
  51596. } //console.log('getcenter', rowBigBox0.sid, '和', rowBigBox1.sid, overLen, match.score + overLen * 1000 + leftInfo.score + rightInfo.score)
  51597. rowInfo = {
  51598. rowBigBox0,
  51599. rowBigBox1,
  51600. match: _match,
  51601. k,
  51602. posLeft,
  51603. posRight,
  51604. score: sc / 3 + 500,
  51605. //700 + match.score*0.7 + (leftInfo.score + rightInfo.score)*0.3 ,
  51606. reversed: info2.reversed
  51607. };
  51608. } else {
  51609. if (rowBigBox0.boxes.length == 1 && rowBigBox1.boxes.length == 1) {
  51610. rowInfo = getMatchScore(rowBigBox0.boxes[0], rowBigBox1.boxes[0]); //直接匹配box
  51611. } else {
  51612. //一对多。getMatchScore计算误差大(长度越长中心误差越大、宽度计算也误差大)所以再写点限制。直接使用btm来预测长度和位置似乎更准
  51613. var mulBoxRow = rowBigBox0.boxes.length > 1 ? rowBigBox0 : rowBigBox1;
  51614. var singleBox = rowBigBox0.boxes.length == 1 ? rowBigBox0 : rowBigBox1;
  51615. /* if(rowBigBox0.sid == "pano12-row-3" && rowBigBox1.sid == "pano0-row-3,1,0" ){
  51616. console.log(5)
  51617. } */
  51618. rowInfo = getMatchScore(rowBigBox0, rowBigBox1, {
  51619. dontCheckDis: true
  51620. }); //一对多 也可以根据方向检查距离,如仅检查z
  51621. rowInfo.k = mulBoxRow.k;
  51622. if (rowInfo.center) {
  51623. rowInfo.center.add(getBoxPos(mulBoxRow)).multiplyScalar(0.5);
  51624. }
  51625. if (rowInfo.name == 'pano0-row-14&pano4-row-8,11') {
  51626. addLabel(rowInfo.center, 'c');
  51627. }
  51628. rowInfo.predictSize = rowInfo.k > 1 ? {
  51629. x: mulBoxRow.predictLen,
  51630. y: 0.6
  51631. } : {
  51632. y: mulBoxRow.predictLen,
  51633. x: 0.6
  51634. }; //单个的应该和多个的其中一端一样,且是离单个漫游点近的那端(也就是要走到箱子一端看不见其他箱子才行)
  51635. var dis0 = getBoxPos(mulBoxRow.left).distanceToSquared(singleBox.pano.position);
  51636. var dis1 = getBoxPos(mulBoxRow.right).distanceToSquared(singleBox.pano.position);
  51637. var near = dis0 < dis1 ? mulBoxRow.left : mulBoxRow.right;
  51638. var p0 = getBoxPos(singleBox);
  51639. var dis = getBoxPos(near).distanceToSquared(p0);
  51640. rowInfo.score -= dis * 1000;
  51641. var p1 = getBoxPos(mulBoxRow);
  51642. var vec1 = new THREE.Vector2(p1.x - singleBox.pano.position.x, p1.z - singleBox.pano.position.z).normalize(); //看向中心的方向
  51643. var vec2 = new THREE.Vector2(singleBox.centerDir.x, singleBox.centerDir.z).normalize();
  51644. rowInfo.score += (vec1.dot(vec2) - 1) * 1000; //同一个方向是最好
  51645. }
  51646. }
  51647. function done(rowInfo) {
  51648. //rowInfo && rowInfos.push(rowInfo)
  51649. rowInfos.set(name, rowInfo);
  51650. }
  51651. done(rowInfo);
  51652. return rowInfo;
  51653. };
  51654. var matchGroups = [];
  51655. var getK = function getK(info) {
  51656. var k;
  51657. if (info.left) {
  51658. var vec = new THREE.Vector2(info.left.x - info.right.x, info.left.z - info.right.z);
  51659. k = Math.abs(vec.x / vec.y);
  51660. } else {
  51661. k = Math.abs(Math.max(info.size.x, 0.6) / Math.max(info.size.z, 0.6));
  51662. }
  51663. return k;
  51664. };
  51665. var ignoreCountMatch = groups.filter(function (e) {
  51666. return e.length > 1;
  51667. }).length == 1; //是否不同数量box的row也能匹配
  51668. var minScore = boundConfirmed ? -2000 : -800;
  51669. var match = function match(searchType) {
  51670. if (searchType == 'second') ignoreCountMatch = true;
  51671. for (var i = 0; i < groups.length - 1; i++) {
  51672. var rowBigBoxes_0 = getPanoBigRowBox(groups[i]);
  51673. var pano0 = groups[i][0].pano;
  51674. if (searchType == 'second') rowBigBoxes_0 = rowBigBoxes_0.filter(function (e) {
  51675. return !matchGroups.some(function (u) {
  51676. return u.includes(e);
  51677. });
  51678. });
  51679. var _loop = function _loop(j) {
  51680. var rowBigBoxes_1 = getPanoBigRowBox(groups[j]);
  51681. if (searchType == 'second') rowBigBoxes_1 = rowBigBoxes_1.filter(function (e) {
  51682. return !matchGroups.some(function (u) {
  51683. return u.includes(e);
  51684. });
  51685. });
  51686. var pano1 = groups[j][0].pano;
  51687. if (pano0.id == 54 && pano1.id == 56) {
  51688. console.log(2);
  51689. }
  51690. var resultPairs = [];
  51691. var evaluateFun = function evaluateFun(row0, row1) {
  51692. return getRowMatchInfo(row0, row1, ignoreCountMatch);
  51693. };
  51694. searchPair(null
  51695. /* bigBoxes_0[0] */
  51696. , rowBigBoxes_0.slice(), rowBigBoxes_1.slice(), null, resultPairs, evaluateFun);
  51697. resultPairs = resultPairs.map(function (pairs) {
  51698. var infos = pairs.map(function (pair) {
  51699. return pair.some(function (e) {
  51700. return e.sid == 'void';
  51701. }) ? null : getRowMatchInfo(pair[0], pair[1], ignoreCountMatch);
  51702. }); //infos.sort((a,b)=>{return a.score-b.score});
  51703. var score = infos.reduce(function (s, e) {
  51704. return s + (e && e.score > minScore ? e.score : minScore / 2); //只考虑组成功的分数
  51705. }, 0);
  51706. return {
  51707. pairs,
  51708. infos,
  51709. score,
  51710. name: pairs.map(function (pair) {
  51711. return pair.map(function (item) {
  51712. return item.sid;
  51713. }).join(' & ');
  51714. })
  51715. };
  51716. });
  51717. resultPairs.sort(function (a, b) {
  51718. return b.score - a.score;
  51719. });
  51720. /* if (resultPairs[0].name[0].includes('pano8') && resultPairs[0].name[0].includes('pano0')) {
  51721. console.log(111)
  51722. } */
  51723. resultPairs[0] && resultPairs[0].pairs.forEach(function (pair, i) {
  51724. var info = resultPairs[0].infos[i];
  51725. if (info && info.score > minScore) {
  51726. var items = pair.filter(function (e) {
  51727. return e.sid != 'void';
  51728. });
  51729. common.pushToGroupAuto(items, matchGroups, null, function (atGroup) {
  51730. //需要朝向一致才行
  51731. if (!info.k) return true; //(box识别的宽高识别不准所以不需要)
  51732. var onePair = atGroup.relationships[0];
  51733. var name = onePair[0].sid + '&' + onePair[1].sid;
  51734. if (!rowInfos.get(name).k) return true; //不过不应该有这种情况,否则匹配不到一起才对
  51735. if (rowInfos.get(name).k < 1 && info.k < 1 || rowInfos.get(name).k > 1 && info.k > 1) {
  51736. return true;
  51737. } else {
  51738. console.log('k不一致无法匹配', info, atGroup);
  51739. }
  51740. }); //根据目前的规则应该是有端点的和有端点的匹配,box和box匹配
  51741. }
  51742. }); //console.log(resultPairs[0])
  51743. };
  51744. for (var j = i + 1; j < groups.length; j++) {
  51745. _loop(j);
  51746. }
  51747. }
  51748. };
  51749. match();
  51750. ignoreCountMatch || match('second'); //再次将剩余的匹配一下,这次允许个数不同的row匹配
  51751. //console.log('matchGroups', matchGroups)
  51752. //识别出来的多组,可能有重复的,因为box个数不同所以才没到一组
  51753. //整理一下,每个组整理出一个info,同时重新检查一下,挑去每组中和其他成员非常不同的
  51754. var groupInfo = [];
  51755. var getGroupInfo = function getGroupInfo(group) {
  51756. var left = new THREE.Vector3(),
  51757. right = new THREE.Vector3(),
  51758. pointsLen = 0;
  51759. var bigBoxes = [];
  51760. var info = {};
  51761. group.relationships.forEach(function (pair) {
  51762. var name = pair[0].sid + '&' + pair[1].sid;
  51763. var matchInfo = rowInfos.get(name); //this.matchScoreMap["rowBigBox"][name] || this.matchScoreMap["cabinet"][name];
  51764. if (matchInfo.posLeft) {
  51765. left.add(matchInfo.posLeft), right.add(matchInfo.posRight), pointsLen++;
  51766. } else {
  51767. bigBoxes.push(matchInfo);
  51768. preDealBox(matchInfo);
  51769. getBoxSize(matchInfo);
  51770. }
  51771. });
  51772. if (pointsLen > 0) {
  51773. left.multiplyScalar(1 / pointsLen);
  51774. right.multiplyScalar(1 / pointsLen); //addLabel(left, 'Left' + index, { bgcolor: '#F00', a: 0.2 })
  51775. //addLabel(right, 'Right' + index, { bgcolor: '#F00', a: 0.2 })
  51776. var center = new THREE.Vector3().addVectors(left, right).multiplyScalar(0.5) //addLabel(center, 'center' + index, { bgcolor: '#F00', a: 0.3 })
  51777. ;
  51778. info.left = left, info.right = right, info.center = center;
  51779. info.pointsLen = pointsLen;
  51780. }
  51781. if (bigBoxes.length > 0) {
  51782. var getAve = function getAve(bigBoxes) {
  51783. var center1 = new THREE.Vector3(),
  51784. size = new THREE.Vector3();
  51785. bigBoxes.forEach(function (box) {
  51786. var center0 = getBoxPos(box);
  51787. center1.add(center0);
  51788. size.add(box.size);
  51789. });
  51790. if (pointsLen > 0) {
  51791. var size0 = new THREE.Vector3(Math.abs(left.x - right.x), size.y, Math.abs(left.z - right.z));
  51792. size.add(size0.multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
  51793. center1.add(info.center.clone().multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
  51794. } else {
  51795. size.multiplyScalar(1 / bigBoxes.length);
  51796. center1.multiplyScalar(1 / bigBoxes.length);
  51797. }
  51798. return {
  51799. center1,
  51800. size
  51801. };
  51802. };
  51803. var getScores = function getScores(center, size) {
  51804. //获得相对于center,size的差别分数
  51805. bigBoxes.forEach(function (box) {
  51806. box.sc = -box.center.distanceToSquared(center1) - size.distanceToSquared(box.size) * 0.5;
  51807. });
  51808. };
  51809. var _getAve = getAve(bigBoxes),
  51810. center1 = _getAve.center1,
  51811. size = _getAve.size; //console.log(center1, size)
  51812. getScores(center1, size);
  51813. bigBoxes.sort(function (a, b) {
  51814. return b.sc - a.sc;
  51815. });
  51816. var midItem = bigBoxes[Math.floor(bigBoxes.length / 2)]; //中位数
  51817. getScores(midItem.center, midItem.size);
  51818. var _minScore = -8;
  51819. var removes = bigBoxes.filter(function (e) {
  51820. return e.sc < _minScore;
  51821. });
  51822. if (removes.length) {
  51823. var _common$disconnectGro2 = common.disconnectGroup(removes.map(function (e) {
  51824. return [e.box0, e.box1];
  51825. }), matchGroups),
  51826. newGroups = _common$disconnectGro2.newGroups;
  51827. console.log('去除错误数据', removes);
  51828. if (newGroups.length > 1) {
  51829. //分裂成多组了,重新计算
  51830. newGroups.forEach(function (e) {
  51831. getGroupInfo(e);
  51832. });
  51833. return;
  51834. }
  51835. bigBoxes = bigBoxes.filter(function (e) {
  51836. return e.sc >= _minScore;
  51837. });
  51838. }
  51839. if (bigBoxes.length) {
  51840. var o = getAve(bigBoxes) //again
  51841. ;
  51842. info.center = o.center1, info.size = o.size;
  51843. }
  51844. }
  51845. info.k = getK(info);
  51846. info.bigBoxes = bigBoxes;
  51847. info.group = group;
  51848. groupInfo.push(info);
  51849. };
  51850. matchGroups.slice(0).forEach(function (group) {
  51851. getGroupInfo(group);
  51852. });
  51853. var getLength = function getLength(c) {
  51854. //获取bigbox长度
  51855. return c.size ? c.k > 1 ? c.size.x : c.size.z : c.k > 1 ? c.right.x - c.left.x : c.right.z - c.left.z + 0.6;
  51856. };
  51857. var getLeft = function getLeft(group, k) {
  51858. var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
  51859. return group.left ? group.left[dirAxis] - 0.3 : group.center[dirAxis] - group.size[dirAxis] / 2; //left和right加减半个宽度
  51860. };
  51861. var getRight = function getRight(group, k) {
  51862. var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
  51863. return group.right ? group.right[dirAxis] + 0.3 : group.center[dirAxis] + group.size[dirAxis] / 2;
  51864. }; //识别是否group之间有一样的, 去重
  51865. {
  51866. var _ret = function () {
  51867. var realGroups = [];
  51868. var getAveWidth = function getAveWidth(infos, len) {
  51869. //获取这些infos最合适的箱子平均宽度和个数
  51870. var boxCounts = [];
  51871. infos.forEach(function (e) {
  51872. boxCounts.push.apply(boxCounts, _toConsumableArray(e.group.map(function (bigBox) {
  51873. return bigBox.boxes.length;
  51874. })));
  51875. });
  51876. boxCounts.sort(function (a, b) {
  51877. return a - b;
  51878. });
  51879. var midCounts = [];
  51880. var r0 = 0.3,
  51881. r1 = 0.7; //取中间这部分的算最适合的个数,结果不一定是中位数
  51882. boxCounts.slice(Math.floor(boxCounts.length * r0), Math.floor(boxCounts.length * r1) + 1).forEach(function (c) {
  51883. if (!midCounts.includes(c)) midCounts.push(c);
  51884. });
  51885. var _standards$cabinet$wi = standards.cabinet.widthNormal,
  51886. min = _standards$cabinet$wi.min,
  51887. max = _standards$cabinet$wi.max;
  51888. var standardW = (min + max) / 2;
  51889. var aveWs = midCounts.map(function (e) {
  51890. return {
  51891. aveW: len / e,
  51892. count: e
  51893. };
  51894. });
  51895. aveWs.sort(function (a, b) {
  51896. return Math.abs(a.aveW - standardW) - Math.abs(b.aveW - standardW);
  51897. });
  51898. var aveW = aveWs[0].aveW;
  51899. var count = aveWs[0].count;
  51900. if (aveW > max || aveW < min) {
  51901. var w = THREE.MathUtils.clamp(aveW, min, max); //console.warn(`box aveW宽度不太对,从${aveW}修改到${w}`)
  51902. aveW = w;
  51903. }
  51904. return {
  51905. aveW,
  51906. count
  51907. };
  51908. };
  51909. var getBox2 = function getBox2(center, len, thick, k) {
  51910. var box2 = new THREE.Box2();
  51911. box2.expandByPoint(new THREE.Vector2(center.x, center.z));
  51912. var sizeVec = k > 1 ? new THREE.Vector2(len / 2, thick / 2) : new THREE.Vector2(thick / 2, len / 2);
  51913. box2.expandByVector(sizeVec);
  51914. return box2;
  51915. };
  51916. var standardW = 0.6; //两排之间最小距离
  51917. var _loop2 = function _loop2(m) {
  51918. var group0 = groupInfo[m];
  51919. var _loop3 = function _loop3(n) {
  51920. var _group1$bigBoxes$, _group0$bigBoxes$;
  51921. var group1 = groupInfo[n];
  51922. if (((_group1$bigBoxes$ = group1.bigBoxes[0]) === null || _group1$bigBoxes$ === void 0 ? void 0 : _group1$bigBoxes$.name) == 'pano4-row-4&pano6-row-5,1' && ((_group0$bigBoxes$ = group0.bigBoxes[0]) === null || _group0$bigBoxes$ === void 0 ? void 0 : _group0$bigBoxes$.name) == 'pano4-row-2,5&pano6-row-3') {
  51923. console.log(4);
  51924. }
  51925. if ((group0.k > 1 && group1.k < 1 || group0.k < 1 && group1.k > 1) && getLength(group0) > 1.5 && getLength(group1) > 1.5) return "continue"; //如果是方块状的无视k
  51926. //间距
  51927. var spaceAxis = (group0.k + group1.k) / 2 > 1 ? 'z' : 'x';
  51928. var spaceDis = Math.abs(group0.center[spaceAxis] - group1.center[spaceAxis]);
  51929. if (spaceDis > standardW * 1.5) return "continue";
  51930. var o0 = getAveWidth([group0], getLength(group0)); //因为有可能长度和箱子个数不匹配,所以需要得到限制后的宽度再比较
  51931. var o1 = getAveWidth([group1], getLength(group1));
  51932. var len0 = group0.predictLen = o0.aveW * o0.count;
  51933. var len1 = group1.predictLen = o1.aveW * o1.count;
  51934. // if( len0 / len1 < minR || len0 / len1 > 1/minR) continue
  51935. var area0 = group0.area = len0 * o0.aveW;
  51936. var area1 = group1.area = len1 * o1.aveW;
  51937. var getBoxMixArea = function getBoxMixArea(expandRatio1, expandRatio2) {
  51938. var box0 = getBox2(group0.center, len0 + expandRatio1, o0.aveW + expandRatio2, group0.k);
  51939. var box1 = getBox2(group1.center, len1 + expandRatio1, o1.aveW + expandRatio2, group1.k);
  51940. var mixBox = getMixBox(box0, box1); //重叠部分
  51941. var s = mixBox.getSize(new THREE.Vector2());
  51942. return {
  51943. box0,
  51944. box1,
  51945. areaMix: Math.max(0, s.x) * Math.max(0, s.y)
  51946. }; //可能是0
  51947. };
  51948. var areaMixExpand = getBoxMixArea(0.1, 0.3).areaMix;
  51949. if (areaMixExpand / area0 < 0.65 && areaMixExpand / area1 < 0.65) return "continue"; //包含的可以通过
  51950. /*let areaMix = getBoxMixArea(0, 0).areaMix //实际重合面积
  51951. group0.contains = group0.contains || []
  51952. group1.contains = group1.contains || []
  51953. group0.contains.push({ group: group1, selfPercent: areaMix / area0, percent2: areaMix / area1, areaMix })
  51954. group1.contains.push({ group: group0, selfPercent: areaMix / area1, percent2: areaMix / area0, areaMix })
  51955. */
  51956. //console.log('两个合并', group0, group1)
  51957. common.pushToGroupAuto([group0, group1], realGroups); //包含的直接合并吧 - - ,这样会使结果偏移,不过没办法了,多个重叠面积太难算了
  51958. };
  51959. for (var n = m + 1; n < groupInfo.length; n++) {
  51960. var _ret2 = _loop3(n);
  51961. if (_ret2 === "continue") continue;
  51962. }
  51963. };
  51964. for (var m = 0; m < groupInfo.length - 1; m++) {
  51965. _loop2(m);
  51966. } //但没合并前样本数量少,包含关系可能有错 - -
  51967. /*for(let m=0; m<groupInfo.length;m++){
  51968. let group = groupInfo[m]
  51969. let contains = group.contains.filter(e=> e.percent2 > 0.8) //所有包含的
  51970. contains.reduce
  51971. } */
  51972. groupInfo.forEach(function (info) {
  51973. //加入单个的
  51974. if (!realGroups.some(function (groups) {
  51975. return groups.includes(info);
  51976. })) {
  51977. realGroups.push([info]);
  51978. }
  51979. }); //console.log('realGroups', realGroups)
  51980. //get boxes
  51981. realGroups.forEach(function (infos, i) {
  51982. var sampleCount = infos.reduce(function (w, c) {
  51983. return w += c.pointsLen || c.bigBoxes.length;
  51984. }, 0);
  51985. var k;
  51986. /* {
  51987. //const k = infos.reduce((w, c) => (w += c.k), 0) / infos.length
  51988. let ks = infos.map(e => e.k)
  51989. ks.sort((a, b) => a - b)
  51990. let min = ks[0],
  51991. max = ks[ks.length - 1]
  51992. if (min < 1 && max > 1) {
  51993. //比较最小和最大,选取更极端的那个
  51994. let min_ = 1 / min
  51995. if (min_ < max) k = max
  51996. else k = min
  51997. } else k = (min + max) / 2
  51998. } */
  51999. {
  52000. //看>1的和<1的平均数哪个多用哪个
  52001. var ks = {
  52002. '<1': {
  52003. count: 0,
  52004. sum: 0
  52005. },
  52006. '>1': {
  52007. count: 0,
  52008. sum: 0
  52009. }
  52010. };
  52011. infos.forEach(function (e) {
  52012. if (e.k < 1) {
  52013. ks['<1'].count++, ks['<1'].sum += 1 / e.k;
  52014. } else {
  52015. ks['>1'].count++, ks['>1'].sum += e.k;
  52016. }
  52017. });
  52018. ks['<1'].count && (ks['<1'].ave = ks['<1'].sum / ks['<1'].count);
  52019. ks['>1'].count && (ks['>1'].ave = ks['>1'].sum / ks['>1'].count);
  52020. if (ks['<1'].ave > ks['>1'].ave) {
  52021. k = 1 / ks['<1'].ave;
  52022. } else {
  52023. k = ks['>1'].ave;
  52024. }
  52025. }
  52026. var centerPos = infos.reduce(function (w, c) {
  52027. return w.add(c.center.clone().multiplyScalar(c.pointsLen || c.bigBoxes.length));
  52028. }, new THREE.Vector3()).multiplyScalar(1 / sampleCount); //预得中心点
  52029. //获取左右端点(需要排除可能的误差,所以采用最靠近端点的三个点。但无法排除前三个点中万一含有包含box的、或者误差大的端点)
  52030. var lefts = infos.map(function (e) {
  52031. return getLeft(e, k);
  52032. }).sort(function (a, b) {
  52033. return a - b;
  52034. }).filter(function (a) {
  52035. return a < centerPos[k > 1 ? 'x' : 'z'];
  52036. }).slice(0, 3);
  52037. var rights = infos.map(function (e) {
  52038. return getRight(e, k);
  52039. }).sort(function (a, b) {
  52040. return b - a;
  52041. }).filter(function (a) {
  52042. return a > centerPos[k > 1 ? 'x' : 'z'];
  52043. }).slice(0, 3);
  52044. var left = 0,
  52045. right = 0;
  52046. var c0 = (lefts.length + 1) * lefts.length / 2;
  52047. lefts.forEach(function (e, i) {
  52048. //越靠近最外侧权重越高。
  52049. left += e * ((lefts.length - i) / c0);
  52050. });
  52051. c0 = (rights.length + 1) * rights.length / 2;
  52052. rights.forEach(function (e, i) {
  52053. right += e * ((rights.length - i) / c0);
  52054. });
  52055. centerPos[k > 1 ? 'x' : 'z'] = (left + right) / 2;
  52056. var len = right - left; //加一点值是因为之前计算长度,用的是最外box的中心点,会少box一半宽度
  52057. var infos2 = infos.filter(function (e) {
  52058. return !e.predictLen || e.predictLen / len > 0.7;
  52059. });
  52060. if (infos2.length == 0) {
  52061. infos2 = infos.sort(function (a, b) {
  52062. return b.predictLen - a.predictLen;
  52063. }).slice(0, 1);
  52064. }
  52065. var _getAveWidth = getAveWidth(infos2, len),
  52066. aveW = _getAveWidth.aveW,
  52067. count = _getAveWidth.count; //长宽比中心点的误差更大,尤其是box类型的、或样本少的
  52068. //获取高度
  52069. var heights = [];
  52070. {
  52071. var heightss;
  52072. /* infos.forEach(e => {
  52073. pairs.push(...e.group.relationships.filter(pair => pair[0].boxes.length == count && pair[1].boxes.length == count))
  52074. })
  52075. if (pairs.length) {
  52076. heightss = pairs.map(pair => {
  52077. let boxes = pair.map(e => {
  52078. return e.boxes.slice()
  52079. })
  52080. let match = rowInfos[pair[0].sid + '&' + pair[1].sid]
  52081. let ifReverse = match.reversed
  52082. if (match.reversed == void 0 && pair[0].boxes.length > 1 && pair[1].boxes.length > 1) {
  52083. let { reversed } = getReverseInfo(pair[0], pair[1])
  52084. ifReverse = reversed
  52085. }
  52086. if (ifReverse) {
  52087. boxes[1].reverse()
  52088. }
  52089. let heights1 = []
  52090. let topPoss = []
  52091. for (let i = 0; i < count; i++) {
  52092. let match1 = getMatchScore(boxes[0][i], boxes[1][i], { onlyGet: true })
  52093. let topPos = match1 && match1.topPos
  52094. if (!topPos) {
  52095. topPos = getBoxTop({ box0: boxes[0][i], box1: boxes[1][i] })
  52096. }
  52097. heights1.push(topPos.y - groundY)
  52098. if (topPos.y - groundY < 0) {
  52099. console.log('?')
  52100. }
  52101. topPoss.push(topPos)
  52102. }
  52103. if ((k < 1 && topPoss[0].z > topPoss[count - 1].z) || (k > 1 && topPoss[0].x > topPoss[count - 1].x)) {
  52104. heights1.reverse()
  52105. }
  52106. return heights1
  52107. })
  52108. } else { */
  52109. var bigBoxes = [];
  52110. infos.forEach(function (e) {
  52111. bigBoxes.push.apply(bigBoxes, _toConsumableArray(e.group.filter(function (e) {
  52112. return !bigBoxes.includes(e) && e.boxes.length == count;
  52113. })));
  52114. });
  52115. heightss = bigBoxes.map(function (bigBox) {
  52116. var topPoss = bigBox.boxes.map(function (box) {
  52117. var a = {
  52118. box0: box
  52119. };
  52120. getBoxTop(a);
  52121. return a.topPos;
  52122. });
  52123. if (k < 1 && topPoss[0].z > topPoss[count - 1].z || k > 1 && topPoss[0].x > topPoss[count - 1].x) {
  52124. topPoss.reverse();
  52125. }
  52126. var heights1 = topPoss.map(function (topPos) {
  52127. return topPos.y - groundY;
  52128. });
  52129. return heights1;
  52130. }); //}
  52131. heightss.forEach(function (arr) {
  52132. for (var _i2 = 0; _i2 < count; _i2++) {
  52133. heights[_i2] = (heights[_i2] || 0) + arr[_i2];
  52134. }
  52135. });
  52136. heights = heights.map(function (e) {
  52137. var h = e / heightss.length;
  52138. return h;
  52139. }); //console.log('heightss',heightss, pairs, heights)
  52140. } //拆分成小box
  52141. var size = new THREE.Vector3(aveW, 2, aveW);
  52142. var c = 0;
  52143. infos.rowboxs = [];
  52144. while (c < count) {
  52145. var center = void 0;
  52146. if (k > 1) {
  52147. var startX = centerPos.x - (count - 1) / 2 * aveW;
  52148. center = new THREE.Vector3(startX + c * aveW, centerPos.y, centerPos.z);
  52149. } else {
  52150. var startZ = centerPos.z - (count - 1) / 2 * aveW;
  52151. center = new THREE.Vector3(centerPos.x, centerPos.y, startZ + c * aveW);
  52152. }
  52153. var size1 = heights[c] ? size.clone().setY(heights[c]) : size; //如1*3的是得不到height的
  52154. var box = new Box({
  52155. name: 'row' + i + '-' + c,
  52156. center,
  52157. size: size1,
  52158. boxType: 'cabinet',
  52159. infos
  52160. });
  52161. c++;
  52162. infos.rowboxs.push(box);
  52163. }
  52164. });
  52165. return {
  52166. v: realGroups.length > 0
  52167. };
  52168. }();
  52169. if (typeof _ret === "object") return _ret.v;
  52170. }
  52171. };
  52172. var removeContain = function removeContain(arr) {
  52173. //去除嵌套
  52174. var len = arr.length;
  52175. if (len < 2) return;
  52176. for (var i = 0; i < len - 1; i++) {
  52177. var box0 = arr[i];
  52178. getBoxBase(box0);
  52179. box0.contains = box0.contains || [];
  52180. for (var j = i + 1; j < len; j++) {
  52181. var box1 = arr[j];
  52182. /* if (box0.sid == 'pano2-1' && box1.sid == 'pano2-7') {
  52183. console.log(6)
  52184. } */
  52185. getBoxBase(box1);
  52186. box1.contains = box1.contains || [];
  52187. var d3 = Math.abs(box1.bbox2CenterX - box0.bbox2CenterX); //限制d3是因为在相差180度两端可能也符合
  52188. //d4 = Math.abs(box1.bbox2[3] - box0.bbox2[3])
  52189. if (d3 > 0.4
  52190. /* || d4 > 0.01 */
  52191. ) continue;
  52192. var d0 = getBbox2Diff(box1.bbox2[0], box0.bbox2[0]),
  52193. d1 = getBbox2Diff(box0.bbox2[2], box1.bbox2[2]),
  52194. w0 = getBbox2Diff(box0.bbox2[2], box0.bbox2[0]),
  52195. w1 = getBbox2Diff(box1.bbox2[2], box1.bbox2[0]);
  52196. var min = Math.min(0.005, Math.min(w0, w1) * 0.2); //如果本身w0,w1宽度就小,差距更要小
  52197. if (d1 >= 0 && Math.abs(d0) < min || d0 >= 0 && Math.abs(d1) < min || d1 >= 0 && d0 >= 0) {
  52198. box0.contains.push(box1);
  52199. } else if (d0 <= 0 && Math.abs(d1) < min || d1 <= 0 && Math.abs(d0) < min || d1 <= 0 && d0 <= 0) {
  52200. box1.contains.push(box0);
  52201. }
  52202. }
  52203. }
  52204. var getWidthScore = function getWidthScore(box, type) {
  52205. var addDis = 0.1; //因为用的是btm的pos,比中心点近了一些,所以加上一段距离
  52206. var o = getBoxPoseByPos(box, getBoxPos(box), addDis);
  52207. var boxPjW = o.projectWidth;
  52208. var standardPjW = (o.maxProjectWidth + o.minProjectWidth) / 2;
  52209. var s = type == 'out' ? boxPjW - standardPjW : standardPjW - boxPjW;
  52210. return -Math.pow(s, 2) * 10;
  52211. };
  52212. var minChildCount = arr[0].boxType == 'battery' ? 1 : 2;
  52213. arr.slice().forEach(function (box) {
  52214. if (box.contains.length >= minChildCount) {
  52215. //假设不存在第二层嵌套, 假设每个只能被一个嵌套
  52216. //决定留大还是留小
  52217. //先只去掉包含两个以上的,且角度范围一致
  52218. //尽量保留内层,除非内层太小
  52219. var _getLeftRight2 = getLeftRight(box.contains),
  52220. leftX = _getLeftRight2.leftX,
  52221. rightX = _getLeftRight2.rightX;
  52222. if (box.contains.length > 1 && (Math.abs(getBbox2Diff(box.bbox2[0], leftX)) > 0.005 || Math.abs(getBbox2Diff(box.bbox2[2], rightX)) > 0.005)) return; //范围不一致
  52223. var remainChild = true;
  52224. if (box.contains.length == 1) {
  52225. //cdi6xzNiNdS 电池包含单个 感觉一般都是留大
  52226. remainChild = false;
  52227. } else {
  52228. var outScore = getWidthScore(box, 'out');
  52229. var childrenScores = box.contains.map(function (e) {
  52230. return getWidthScore(e, 'in');
  52231. });
  52232. var childAve = childrenScores.reduce(function (w, c) {
  52233. return w + c;
  52234. }, 0) / childrenScores.length;
  52235. if (childAve < -4) {
  52236. //let outScore = getWidthScore(box, 'out')
  52237. remainChild = childAve > outScore;
  52238. }
  52239. }
  52240. if (!remainChild) {
  52241. box.contains.forEach(function (e) {
  52242. var _console;
  52243. e.state = '因被嵌套被删除', e.containBy = box;
  52244. arr.splice(arr.indexOf(e), 1);
  52245. (_console = console).log.apply(_console, ['因被嵌套被删除'].concat(_toConsumableArray(box.contains)));
  52246. });
  52247. } else {
  52248. box.state = '因嵌套其他被删除';
  52249. console.log('因嵌套其他被删除', box);
  52250. arr.splice(arr.indexOf(box), 1);
  52251. }
  52252. }
  52253. });
  52254. };
  52255. var waitFindRest = [];
  52256. var Search = function Search(type) {
  52257. console.error('开始search', type);
  52258. var matchScoreMap = _this3.matchScoreMap[type] = new Map();
  52259. var datas = {};
  52260. var panoIds = [];
  52261. for (var id in _this3.datas) {
  52262. if (!_this3.datas[id]) continue;
  52263. datas[id] = _this3.datas[id].shapes.filter(function (e) {
  52264. return isType(e.category, type);
  52265. });
  52266. datas[id].length && panoIds.push(id);
  52267. }
  52268. var _loop4 = function _loop4(_id) {
  52269. //对data预处理
  52270. //(之后如果还出现不同类型重叠在一起的,需要先识别摘除下。 )4GqaqNdyjGf
  52271. if (!_this3.datas[_id]) return "continue";
  52272. removeContain(datas[_id]); //去除线框中的嵌套,主要是一个嵌套两个的。案例:KK-1Zjm9Rbl47
  52273. if (datas[_id].length) {
  52274. //融合。很多box被一分为二了,基本都是在全景图左右边界处。
  52275. var bigBoxes = getPanoBigRowBox(datas[_id], {
  52276. reason: 'mix'
  52277. });
  52278. bigBoxes.forEach(function (bigBox) {
  52279. if (bigBox.boxes.length > 1) {
  52280. bigBox.boxes.forEach(function (box) {
  52281. box.state = '被删除', box.mixTo = bigBox;
  52282. var i = datas[_id].indexOf(box);
  52283. datas[_id].splice(i, 1);
  52284. {
  52285. i = _this3.datasMixed[_id].shapes.findIndex(function (e) {
  52286. return e.sid == box.sid;
  52287. });
  52288. _this3.datasMixed[_id].shapes.splice(i, 1);
  52289. }
  52290. }); //console.log('因融合而删除', bigBox.boxes)
  52291. datas[_id].push(bigBox);
  52292. {
  52293. _this3.datasMixed[_id].shapes.push(bigBox);
  52294. }
  52295. var shapes = _this3.datas[_id].shapes;
  52296. bigBox.index = shapes.length > 1 ? shapes[shapes.length - 2].index + 1 : 0;
  52297. {
  52298. var a = bigBox.sid.split('mix-');
  52299. bigBox.sid = a[0] + bigBox.index + '(mix' + a[1] + ')'; //"pano20-mix-1,2"
  52300. }
  52301. }
  52302. });
  52303. }
  52304. };
  52305. for (var _id in _this3.datas) {
  52306. var _ret3 = _loop4(_id);
  52307. if (_ret3 === "continue") continue;
  52308. }
  52309. if (panoIds.length == 0) {
  52310. if (standards[type].tinyXZ) {
  52311. //fire 调试:nZrBdvRaDuC
  52312. _this3.expandModelBound();
  52313. }
  52314. return;
  52315. }
  52316. panoIds.sort(function (a, b) {
  52317. return datas[b].length - datas[a].length;
  52318. });
  52319. var groups = panoIds.map(function (e) {
  52320. return datas[e];
  52321. }); //console.log('按box个数排序:', groups.slice())
  52322. var group0 = groups[0],
  52323. len0 = group0.length;
  52324. if (groups.length == 1) {
  52325. //只有一个全景里有数据
  52326. if (standards[type].tinyXZ) {
  52327. //fire. 无法match以获取groundY, 就取消。 调试: eGhyf5QdVHA
  52328. _this3.expandModelBound(type);
  52329. }
  52330. group0.forEach(function (e) {
  52331. return createSinglePano(e);
  52332. });
  52333. return combines(type);
  52334. }
  52335. var finish = function finish(groups) {
  52336. waitFindRest.push({
  52337. type,
  52338. args: [groups]
  52339. }); //等待最后检查遗漏
  52340. if (standards[type].tinyXZ) {
  52341. //fire 调试:nZrBdvRaDuC
  52342. _this3.confirmGroundY(type);
  52343. }
  52344. if (standards[type].tiny) {
  52345. //monitor 调试:S9yepREK8Jl
  52346. _this3.expandModelBound2(type);
  52347. }
  52348. };
  52349. if (len0 == 1) {
  52350. //最多的也只有一个box。此情况大部分是空调
  52351. panoIds.forEach(function (e) {
  52352. return getBoxBase(datas[e][0]);
  52353. });
  52354. for (var i = 0; i < panoIds.length; i++) {
  52355. var box0 = datas[panoIds[i]][0];
  52356. for (var j = i + 1; j < panoIds.length; j++) {
  52357. var box1 = datas[panoIds[j]][0];
  52358. getMatchScore(box0, box1, {
  52359. isSingle: true
  52360. });
  52361. }
  52362. }
  52363. /* let list = Object.keys(matchScoreMap)
  52364. list.sort((a, b) => {
  52365. return matchScoreMap[b].score - matchScoreMap[a].score
  52366. })
  52367. let match = matchScoreMap[list[0]] */
  52368. var list = Array.from(matchScoreMap).map(function (e) {
  52369. return e[1];
  52370. }).sort(function (a, b) {
  52371. return b.score - a.score;
  52372. });
  52373. var match = list[0];
  52374. preDealBox(match);
  52375. if (match.score > -100) {
  52376. getBoxSize(match);
  52377. if (match.score > 0 && match.sizeAdjust < 0.1) {
  52378. new Box(match); //waitFindRest.push({ type, args: [groups] }) //等待最后检查遗漏
  52379. finish(groups);
  52380. return;
  52381. }
  52382. } //根据分数重排序,前两个已匹配的pano放在第一第二(reMatchLowScores会跳过),获得groups2
  52383. var panoIds2 = [];
  52384. /* list.forEach(e => {
  52385. let info = matchScoreMap[e]
  52386. if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id)
  52387. if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id)
  52388. }) */
  52389. list.forEach(function (info) {
  52390. if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id);
  52391. if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id);
  52392. });
  52393. var groups2 = panoIds2.map(function (e) {
  52394. return datas[e];
  52395. }); //继续match
  52396. reMatchLowScores([match], groups2);
  52397. finish(groups2);
  52398. return;
  52399. }
  52400. {
  52401. //重新根据距离排序,挑选离所有box距离最近的两个pano (远的可能看不到box,或者得到的线框计算的位置不准。不过其实太近也不准-,-)
  52402. var counts = {};
  52403. groups.forEach(function (e) {
  52404. e.forEach(function (a) {
  52405. return getBoxBase(a);
  52406. });
  52407. counts[e.length] || (counts[e.length] = []);
  52408. counts[e.length].push(e);
  52409. });
  52410. groups = [];
  52411. standards[type].atWall;
  52412. var nums = Object.keys(counts);
  52413. var bestDisSquared = 2;
  52414. nums.reverse();
  52415. nums.forEach(function (count) {
  52416. var _groups;
  52417. var groups_ = counts[count];
  52418. if (groups_.length > 1) {
  52419. groups_.forEach(function (e) {
  52420. e.disSc = e.reduce(function (w, c) {
  52421. var pos = getBoxPos(c); //let s = atWall ? Math.pow(Math.abs(c.centerDir.y), 3)*100 : 0 //在墙上的话尽量平视
  52422. //console.log(c.sid,s)
  52423. return w + Math.abs(c.pano.position.distanceToSquared(pos) - bestDisSquared); //+ s
  52424. }, 0);
  52425. });
  52426. groups_.sort(function (a, b) {
  52427. return a.disSc - b.disSc;
  52428. });
  52429. }
  52430. (_groups = groups).push.apply(_groups, _toConsumableArray(groups_));
  52431. }); //console.log('按距离和个数排序:', groups)
  52432. group0 = groups[0];
  52433. len0 = group0.length;
  52434. }
  52435. if (type == 'cabinet') {
  52436. //转化为分组
  52437. if (searchByRow(groups)) {
  52438. waitFindRest.push({
  52439. type,
  52440. args: [groups, 0]
  52441. }); //等待最后检查遗漏
  52442. return;
  52443. }
  52444. } //零散匹配。
  52445. var match2Group = function match2Group(group0, group1) {
  52446. var _ref6 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  52447. fake = _ref6.fake;
  52448. group0.length;
  52449. group1.length;
  52450. /* for (let i = 0; i < len0; i++) {
  52451. //复杂度:n的平方次
  52452. for (let j = 0; j < len1; j++) {
  52453. let box1 = group0[i]
  52454. let box2 = group1[j]
  52455. let result = getMatchScore(box1, box2)
  52456. }
  52457. } */
  52458. //寻找最佳配对 n!种组合(是否要限制个数多的情况?) 超过8个就很恐怖
  52459. //仅先查找选中的两个pano配对
  52460. var resultPairs = [];
  52461. var newGroup0 = group0.slice(0);
  52462. var newGroup1 = group1.slice(0);
  52463. /* while (newGroup1.length < newGroup0.length) {
  52464. newGroup1.push({ sid: 'void' }) //为了使排列正确,补个空,使左右两边个数相等,过后和void匹配的不会计算box
  52465. } */
  52466. var evaluateFun = getMatchScore.bind(_this3);
  52467. searchPair(
  52468. /* group0[0] */
  52469. null, newGroup0, newGroup1, null, resultPairs, evaluateFun);
  52470. /* console.log(
  52471. 'resultPairs',
  52472. resultPairs.map(pairs => pairs.map(pair => pair.map(item => item.sid).join(' & ')))
  52473. ) */
  52474. resultPairs = resultPairs.map(function (pairs) {
  52475. var infos = pairs.map(function (pair) {
  52476. return getMatchScore(pair[0], pair[1]);
  52477. }); //matchScoreMap[pair[0].sid + '&' + pair[1].sid])
  52478. var score = infos.reduce(function (s, e) {
  52479. return s + (e ? e.score : 0);
  52480. }, 0);
  52481. var o = {
  52482. infos,
  52483. score,
  52484. pairs,
  52485. name: pairs.map(function (pair) {
  52486. return pair.map(function (item) {
  52487. return item.sid;
  52488. }).join(' & ');
  52489. })
  52490. };
  52491. return o;
  52492. }); //console.log('resultPairs', resultPairs.slice())
  52493. console.log('resultPairs按分数高低', resultPairs.sort(function (a, b) {
  52494. return b.score - a.score;
  52495. })); //console.log('compu',compu)
  52496. var minScore = boundConfirmed ? -2000 : -800;
  52497. var noMatches = []; //和void匹配的,需要和其他pano的重新匹配
  52498. var lowScores = [];
  52499. if (resultPairs[0]) {
  52500. resultPairs[0].infos.forEach(function (info, i) {
  52501. if (!info) {
  52502. noMatches.push(resultPairs[0].pairs[i].find(function (e) {
  52503. return e.sid != 'void';
  52504. }));
  52505. return; //match with void
  52506. }
  52507. if (info.score < minScore || standards[info.boxType].bottom && info.minAng < 5) {
  52508. lowScores.push(info);
  52509. return;
  52510. }
  52511. preDealBox(info);
  52512. getBoxSize(info);
  52513. if (info.sizeAdjust && standards[info.boxType].tiny || info.sizeAdjust > 0.2) {
  52514. //或者识别下悬挂的且线的角度较小
  52515. lowScores.push(info);
  52516. return;
  52517. }
  52518. if (info.box0.category == typeNames.battery && info.size.x < 1 && info.size.z < 1) {
  52519. //宽度较小
  52520. var vec0 = new THREE.Vector3().subVectors(info.box0.pano.position, getBoxPos(info));
  52521. var vec1 = new THREE.Vector3().subVectors(info.box1.pano.position, getBoxPos(info));
  52522. /* let k0 = Math.abs(vec0.x / vec0.z), k1 = Math.abs(vec1.x / vec1.z), maxR = 6
  52523. if(info.name == '') */
  52524. if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0
  52525. /* || k0/k1 > maxR || k0/k1 < 1/maxR */
  52526. ) {
  52527. //同一个象限 或 偏向一侧
  52528. lowScores.push(info);
  52529. return;
  52530. }
  52531. }
  52532. info.fake = fake;
  52533. new Box(info);
  52534. });
  52535. }
  52536. if (noMatches.length) {
  52537. reMatchLowScores(noMatches.map(function (e) {
  52538. return {
  52539. box0: e
  52540. };
  52541. }), groups, {
  52542. fake
  52543. });
  52544. }
  52545. reMatchLowScores(lowScores, groups, {
  52546. fake
  52547. });
  52548. };
  52549. {
  52550. var disScores = []; //避免两个组之间距离太远 //KJ-iUrPonbhCQo 大的场景有很多柜子时,groups的前两个元素很可能相隔很远,导致匹配不到柜子。
  52551. for (var _i3 = 0; _i3 < groups.length - 1; _i3++) {
  52552. var disSqure = groups[_i3][0].pano.position.distanceToSquared(groups[_i3 + 1][0].pano.position);
  52553. var disScore = math$1.linearClamp(disSqure, [0, 0.4, 2, 6, 100], [-10, 0, 10, 5, -100]);
  52554. var score = disScore + (groups[_i3].length + groups[_i3 + 1].length);
  52555. disScores.push({
  52556. score,
  52557. i: _i3,
  52558. disSqure,
  52559. length1: groups[_i3].length,
  52560. length2: groups[_i3 + 1].length
  52561. });
  52562. }
  52563. disScores.sort(function (a, b) {
  52564. return b.score - a.score;
  52565. });
  52566. for (var _j2 = 0; _j2 < groups.length - 1; _j2++) {
  52567. match2Group(groups[disScores[_j2].i], groups[disScores[_j2].i + 1], {
  52568. fake: _j2 > 0
  52569. });
  52570. if (!standards[type].tinyXZ) {
  52571. // 只有tinyXZ的多match几组 (如果场景比较大,最好也多match几组?)
  52572. break;
  52573. }
  52574. }
  52575. }
  52576. finish(groups);
  52577. };
  52578. function blocked(box) {
  52579. //该box是否被实体box遮挡
  52580. //WcLVXvmV9AU:pano2-2 和 pano12-4 ; 5yhlMduTHL8:pano2-10
  52581. /* if (box.sid == 'pano6-7') {
  52582. console.log(1)
  52583. addLine(box.pano.position, box.centerBtmDir, 20)
  52584. } */
  52585. if (!standards[box.boxType].bottom) {
  52586. //当底部每个方向都有遮挡物时,其位置很可能不准。但若是部分遮住,还是有可能识别对的
  52587. if (!box.blocked) {
  52588. box.blocked = {
  52589. centerBtmDir: null,
  52590. leftBtmDir: null,
  52591. rightBtmDir: null
  52592. };
  52593. }
  52594. var _loop5 = function _loop5(dir) {
  52595. if (!box.blocked[dir]) {
  52596. var block = boxesSolid.find(function (boxSolid) {
  52597. ray.set(box.pano.position, box[dir]); //这里不用判断距离吗?已经忘了当初怎么想的了。发现大多数block的都是自身
  52598. var o = ray.ray.intersectsBox(boxSolid.bound);
  52599. if (o) {
  52600. // 遮挡
  52601. return true;
  52602. }
  52603. });
  52604. if (block) {
  52605. //若不存在,即都遮挡了,就算真的遮挡
  52606. box.blocked[dir] = block;
  52607. } else {
  52608. box.blocked[dir] = false;
  52609. return {
  52610. v: false
  52611. }; //找到一个方向无遮挡则可返回
  52612. }
  52613. }
  52614. };
  52615. for (var dir in box.blocked) {
  52616. var _ret4 = _loop5(dir);
  52617. if (typeof _ret4 === "object") return _ret4.v;
  52618. }
  52619. return true; //暂定,若某个方向已得到遮挡了,就不计算。但若没有,就再搜一遍(如果会重复搜之后再增加一个stamp啥的,比如记录下当前所有solidBoxes的name,如果改变了就重新搜下)
  52620. } else {
  52621. //若中心方向已经有同类型的box,很可能它就是自身(因为挂墙的预测位置很不准,所以需要这一步。越tiny的越能通过此来筛选)
  52622. var block = boxesSolid.find(function (boxSolid) {
  52623. if (boxSolid.boxType != box.boxType) return;
  52624. ray.set(box.pano.position, box.centerDir);
  52625. var o = ray.ray.intersectsBox(boxSolid.bound);
  52626. if (o) {
  52627. // 遮挡
  52628. return true;
  52629. }
  52630. });
  52631. if (block) {
  52632. box.blocked = block;
  52633. return true;
  52634. }
  52635. }
  52636. } //调试 O540aEVF3b7 jQUQlER160 n4z0yd5tQaF WcLVXvmV9AU 8czlwsbSe5 NlUM8yGve9
  52637. function findRest(groups
  52638. /* ,startIndex=2 */
  52639. ) {
  52640. //查找是否有遗漏。
  52641. //1 可能有距离较远的box不在头两个pano的附近导致被漏掉。(概率很小)
  52642. //2 被剩余的 (包括低分匹配中放弃的,这种需要的距离识别度高)
  52643. var tolerateWidth = {
  52644. min: 0.1,
  52645. max: 0.5
  52646. };
  52647. var boxes = [],
  52648. scores = new Map(),
  52649. bestDisSquared = 2;
  52650. groups.forEach(function (g) {
  52651. var _boxes;
  52652. (_boxes = boxes).push.apply(_boxes, _toConsumableArray(g));
  52653. });
  52654. boxes = boxes.filter(function (box) {
  52655. return !used(box);
  52656. });
  52657. boxes.forEach(function (box) {
  52658. getBoxBase(box);
  52659. var p1 = new THREE.Vector2(box.pano.position.x, box.pano.position.z);
  52660. var p2 = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
  52661. var dis = p1.distanceToSquared(p2);
  52662. var s1 = -Math.abs(dis - bestDisSquared); //将距离最佳的排前面,距离远的得到的位置不准确,也容易被遮
  52663. if (!box.pose) box.pose = getBoxPoseByPos(box, getBoxPos(box));
  52664. var s2 = getPoseScore([box.pose], box.boxType) + THREE.MathUtils.clamp(box.pose.projectWidth, box.pose.minProjectWidth, box.pose.maxProjectWidth) * 7; //projectWidth长的更安全
  52665. scores.set(box, {
  52666. s1,
  52667. s2,
  52668. sum: s1 + s2
  52669. });
  52670. }); //console.log(boxes[0].boxType,scores)
  52671. boxes = boxes.sort(function (a, b) {
  52672. return scores.get(b).sum - scores.get(a).sum;
  52673. }); //FXcq5PI9QGv
  52674. //console.log(boxes)
  52675. boxes.forEach(function (box) {
  52676. if (box.sid == 'pano0-4') {
  52677. console.log(3);
  52678. }
  52679. if (!used(box) && !blocked(box)) {
  52680. //如果和现有的box的距离都很远,很可能是漏掉的
  52681. var near = boxesSolid.find(function (solidBox) {
  52682. if (solidBox.name == 'air-pano16-7&pano14-13') {
  52683. console.log(3);
  52684. }
  52685. if (solidBox.boxType != box.boxType && (solidBox.boxType == 'air-hanging' || box.boxType == 'air-hanging')) return; //挂空调一般不会撞到地面上的
  52686. var p1 = getBoxPos(solidBox);
  52687. var p2 = getBoxPos(box);
  52688. new THREE.Vector2(p1.x, p1.z);
  52689. new THREE.Vector2(p2.x, p2.z);
  52690. var maxWidth = standards[box.boxType].widthNormal.max / 2;
  52691. maxWidth = THREE.MathUtils.clamp(maxWidth, tolerateWidth.min, tolerateWidth.max); //因为场景精度存在较大误差,所以maxWidth不能过小,否则像灭火器摄像头都容易findRest多个
  52692. var dis = solidBox.bound.distanceToPoint(p2); //let r0 = solidBox.boxType == 'air' ? 2 : solidBox.boxType == 'battery' ? 1.1 : 1 //空调最不容易扎堆放置,所以范围设置广一些
  52693. var r0 = standards[box.boxType].closeRatio;
  52694. var r1 = math$1.linearClamp(box.pano.position.distanceTo(p2), 3, 20, 1, 5); //距离远的话识别、计算都会更不准确,给一定的容错. 远的尽量不findRest,即尽量>0
  52695. var ra = (solidBox.boxType == box.boxType ? 1 : 0.5) * r0 * r1; //数字越小限制越大
  52696. /* let a = maxWidth * maxWidth * ra - p1_.distanceToSquared(p2_)
  52697. let b = -dis * dis * 0.7
  52698. let c = a + b*/
  52699. var c = maxWidth * ra - dis * 1.3;
  52700. /* if (c > 0) {
  52701. //太近 不创建
  52702. console.log(1)
  52703. } */
  52704. return c > 0;
  52705. });
  52706. if (!near) {
  52707. reMatchLowScores([{
  52708. box0: box,
  52709. log: 'findRest'
  52710. }], groups, {
  52711. startIndex: 0
  52712. });
  52713. }
  52714. }
  52715. });
  52716. }
  52717. function used(box) {
  52718. //是否已经使用过
  52719. var has = function has(e) {
  52720. return e.box0 == box || e.box1 == box;
  52721. };
  52722. var traverse = function traverse(e) {
  52723. return has(e) || e.list && e.list.some(function (a) {
  52724. return traverse(a);
  52725. }) || e.mixedFrom && e.mixedFrom.some(function (a) {
  52726. return traverse(a);
  52727. }) || e.infos && e.infos.some(function (u) {
  52728. return u.group.some(function (r) {
  52729. return r.boxes.some(function (b) {
  52730. return b == box;
  52731. });
  52732. });
  52733. }); //row
  52734. };
  52735. return boxesSolid.some(function (e) {
  52736. return traverse(e);
  52737. });
  52738. }
  52739. function reMatchLowScores(lowScores, groups) {
  52740. var _ref7 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  52741. _ref7$startIndex = _ref7.startIndex,
  52742. startIndex = _ref7$startIndex === void 0 ? 2 : _ref7$startIndex,
  52743. fake = _ref7.fake;
  52744. var tooLows = [];
  52745. var minScore = boundConfirmed ? -2000 : -800;
  52746. var isSameMatch = function isSameMatch(match0, match1) {
  52747. //是否对应同一个box实体(不一定准),通过两两box之间是否都match来判断
  52748. //如果是相同pano但不同的box肯定不是对应同一个box实体
  52749. var ifWrong = function ifWrong(box0, box1) {
  52750. if (box0 == box1) return;
  52751. if (box0.pano == box1.pano) return true;
  52752. var match2 = getMatchScore(box0, box1, {
  52753. isSingle: true,
  52754. restMatch: true
  52755. });
  52756. if (match2.score < minScore) return true;
  52757. };
  52758. if (ifWrong(match0.box0, match1.box0) || ifWrong(match0.box1, match1.box1) || ifWrong(match0.box0, match1.box1) || ifWrong(match0.box1, match1.box0)) return;
  52759. return true;
  52760. };
  52761. if (lowScores.length) {
  52762. //console.warn(lowScores[0].log || (lowScores[0].box1 ? '低分重新匹配' : '剩余匹配'), lowScores[0].box0.boxType, ...lowScores)
  52763. if (lowScores[0].box1) {
  52764. lowScores.sort(function (a, b) {
  52765. //低分优先
  52766. return a.score - b.score;
  52767. });
  52768. }
  52769. lowScores.forEach(function (info) {
  52770. //info中的box0和box1分别向后寻找其他的配对。选择分数高的配对。 但box0和box1可能是错误配对,会导致找到了替代的也可能遗漏。
  52771. /* if (info.name == 'pano0-3&pano2-3') {
  52772. console.log(1)
  52773. } */
  52774. var box01 = info.box0;
  52775. var box02 = info.box1;
  52776. var bigGroup = [];
  52777. box02 && bigGroup.push(info);
  52778. var _loop6 = function _loop6(cur) {
  52779. var thirdGroup = groups[cur];
  52780. var scores0 = [],
  52781. scores1 = [];
  52782. thirdGroup.forEach(function (box1) {
  52783. //if (matched.includes(box1.sid)) return
  52784. if (used(box1)) return; //会不会太严格?
  52785. if (box1.pano != box01.pano && box1 != box02) {
  52786. var r1 = getMatchScore(box01, box1, {
  52787. isSingle: true,
  52788. restMatch: true
  52789. });
  52790. r1.score > minScore * 1.5 && scores0.push(r1);
  52791. }
  52792. if (box02 && box1.pano != box02.pano && box1 != box01) {
  52793. var r2 = getMatchScore(box02, box1, {
  52794. isSingle: true,
  52795. restMatch: true
  52796. });
  52797. r2.score > minScore * 1.5 && scores1.push(r2);
  52798. }
  52799. });
  52800. scores0.sort(function (a, b) {
  52801. return b.score - a.score;
  52802. });
  52803. scores1.sort(function (a, b) {
  52804. return b.score - a.score;
  52805. });
  52806. scores0[0] && bigGroup.push(scores0[0]);
  52807. scores1[0] && bigGroup.push(scores1[0]);
  52808. };
  52809. for (var cur = startIndex; cur < groups.length; cur++) {
  52810. _loop6(cur);
  52811. }
  52812. bigGroup.sort(function (a, b) {
  52813. return b.score - a.score;
  52814. });
  52815. var goodList = bigGroup.slice(0, 10).map(function (e) {
  52816. if (!getBoxPos(e)) return e;
  52817. preDealBox(e);
  52818. getBoxSize(e);
  52819. return e;
  52820. });
  52821. var goodList2 = goodList.sort(function (a, b) {
  52822. return b.score - a.score;
  52823. }).slice(0, 3);
  52824. if (goodList2.length == 0) {
  52825. return fake || createSinglePano(box01, 0.6); //minScorePercent原因:剩余匹配时位置不太好的案例: AhMgXXjM15
  52826. }
  52827. if (goodList2[0].score > minScore * 0.65) {
  52828. goodList2 = goodList2.filter(function (e) {
  52829. return e.score > minScore * 0.65;
  52830. });
  52831. } else {
  52832. /* goodList2 = [goodList2[0]] // 最高分已经过小
  52833. if (goodList2[0].score < -1500) { */
  52834. if (!box02) {
  52835. if (info.log == 'findRest' || getBoxPos(box01).distanceTo(box01.pano.position) < 2.5) {
  52836. //远距离不准,留到过后findRest
  52837. fake || createSinglePano(box01);
  52838. }
  52839. return;
  52840. } //console.warn('分数过低,是否有匹配错误?', goodList2[0])
  52841. return tooLows.push(goodList2[0]); //}
  52842. }
  52843. if (goodList2.length) {
  52844. //需要确认两两之间是配对的,也就是都对应同一个box
  52845. var subGroups = [],
  52846. boxes = [];
  52847. var _loop7 = function _loop7(i, len) {
  52848. //向后选择队友
  52849. var match0 = goodList2[i];
  52850. if (subGroups.some(function (e) {
  52851. return e.includes(match0);
  52852. })) return "continue"; //被挑选了的没有选择权
  52853. var gr = [match0];
  52854. for (var j = i + 1; j < len; j++) {
  52855. var match1 = goodList2[j];
  52856. if (isSameMatch(match0, match1)) {
  52857. //可能不是同一个,所以需要检验
  52858. gr.push(match1);
  52859. }
  52860. } //if(gr.length>1){
  52861. subGroups.push(gr); //}
  52862. };
  52863. for (var i = 0, len = goodList2.length; i < len; i++) {
  52864. var _ret5 = _loop7(i, len);
  52865. if (_ret5 === "continue") continue;
  52866. } //console.log('lowScores subGroups', subGroups)
  52867. subGroups.forEach(function (pair) {
  52868. boxes.push(mixMatchBox(pair, lowScores[0].log, fake));
  52869. });
  52870. fake || combineBoxes(boxes); //很可能其实还是同一个,需要检验是否要融合
  52871. }
  52872. }); //改为之后 findRest, 因为两者都single的可能性低
  52873. /* let judge = box => {
  52874. if (!used(box)) {
  52875. matched.push(box)
  52876. createSinglePano(box)
  52877. }
  52878. }
  52879. tooLows.forEach(e => {
  52880. judge(e.box0)
  52881. judge(e.box1)
  52882. }) */
  52883. }
  52884. }
  52885. function mixMatchBox(list, log, fake) {
  52886. var center = new THREE.Vector3(),
  52887. size = new THREE.Vector3(),
  52888. bound = new THREE.Box3();
  52889. list.forEach(function (e) {
  52890. var _bound = new THREE.Box3().setFromCenterAndSize(getBoxFinalPos(e), e.size);
  52891. bound.union(_bound);
  52892. }); //bound.getCenter(center) //这两种获得center的方法哪个准?
  52893. bound.getSize(size);
  52894. list.forEach(function (e) {
  52895. return center.add(getBoxPos(e));
  52896. });
  52897. center.multiplyScalar(1 / list.length);
  52898. var _ref8 = list.find(function (e) {
  52899. return e.xProp;
  52900. }) || {},
  52901. xProp = _ref8.xProp,
  52902. yProp = _ref8.yProp;
  52903. if (xProp && list.find(function (e) {
  52904. return e.xProp && e.xProp != xProp;
  52905. })) {
  52906. //如果有不同的话
  52907. xProp = yProp = null;
  52908. }
  52909. var prefix = log == 'findRest' ? 'rest:' : 'low:';
  52910. var object = {
  52911. name: prefix + list.map(function (e) {
  52912. return e.name;
  52913. }),
  52914. boxType: list[0].boxType,
  52915. center,
  52916. size,
  52917. list,
  52918. xProp,
  52919. yProp
  52920. };
  52921. xProp || getBoxDirProp(object);
  52922. var o = restrictSize(size.x, size.y, size.z, object);
  52923. size.x = o.x;
  52924. size.y = o.y;
  52925. size.z = o.z;
  52926. object.fake = fake;
  52927. var box = new Box(object); //console.log('mixMatchBox', box)
  52928. return box;
  52929. }
  52930. function combineBoxes(boxes, typeCount) {
  52931. //调试 tY4ot33f8vT UWrshepp0G5的一高一低的电箱
  52932. //判断这些实体boxes是否需要合并 主要用于重复识别(重叠面积较大) 电池还可能是拼接
  52933. var group = [];
  52934. if (boxes.length > 1) {
  52935. var boxType = boxes[0].boxType;
  52936. var _standards$boxType$wi3 = standards[boxType].widthNormal;
  52937. _standards$boxType$wi3.min;
  52938. var max = _standards$boxType$wi3.max;
  52939. for (var i = 0, len = boxes.length; i < len - 1; i++) {
  52940. var box0 = boxes[i];
  52941. if (box0.fake) continue;
  52942. for (var j = i + 1; j < len; j++) {
  52943. var box1 = boxes[j];
  52944. if (box1.fake) continue;
  52945. var bound = box0.bound.clone().union(box1.bound);
  52946. var size = bound.getSize(new THREE.Vector3());
  52947. var intersect = box0.bound.intersectsBox(box1.bound);
  52948. if (box0.boxType == 'electric') {
  52949. console.log(1);
  52950. }
  52951. var maxX = max,
  52952. maxZ = max,
  52953. maxY = standards[boxType].height.max;
  52954. if (box0.xProp && box1.xProp && box0.xProp == box1.xProp) {
  52955. maxX = standards[boxType][box0.xProp].max;
  52956. maxZ = standards[boxType][box0.yProp].max;
  52957. /* minX = standards[boxType][box0.xProp].min
  52958. minZ = standards[boxType][box0.yProp].min */
  52959. if (box0.boxType != box1.boxType) {
  52960. //air & airSmart
  52961. maxX = Math.max(maxX, standards[box1.boxType][box1.xProp].max);
  52962. maxZ = Math.max(maxZ, standards[box1.boxType][box1.yProp].max);
  52963. /* minX = Math.min(minX, standards[box1.boxType][box1.xProp].min)
  52964. minZ = Math.min(minZ, standards[box1.boxType][box1.yProp].min) */
  52965. }
  52966. }
  52967. maxX = Math.max(maxX, box0.size.x, box1.size.x); //必须大于各自的size,否则无法去除本身就oversize的box中包含的
  52968. maxZ = Math.max(maxZ, box0.size.z, box1.size.z);
  52969. maxY = Math.max(maxY, box0.size.y, box1.size.y);
  52970. var r = intersect ? 1.5 : 1.3;
  52971. /* / standards[box1.boxType].closeRatio */
  52972. //如果是没有交集,限制更大些
  52973. //若需要更精确的结果,可以getMixBox算出重叠面积,重叠少,且各自都不太小,就不合并。但考虑到电池边界很模糊,合并了也无大碍。
  52974. if (box0.boxType == 'battery') {
  52975. r *= 1.3; //比较可能扎堆
  52976. }
  52977. var maxDiff = 0.4,
  52978. maxDiffX = maxDiff,
  52979. maxDiffZ = maxDiff,
  52980. rx = r,
  52981. rz = r;
  52982. if (standards[box0.boxType].atWall == 1) {
  52983. //在墙面上不可能叠放,所以厚度限制可放宽
  52984. var s = 4;
  52985. if (box0.yProp == 'width') {
  52986. maxDiffX *= s;
  52987. rx *= s;
  52988. } else if (box0.xProp == 'width') {
  52989. maxDiffZ *= s;
  52990. rz *= s;
  52991. }
  52992. } //如果某个点位含有类似和这俩相近的box: A9rCPzp2UD9两个fire合并了。好难写,算了
  52993. /* if(box0.boxType){
  52994. this.datasMixed
  52995. rx = rz = 1.1
  52996. } */
  52997. if (size.x - maxX < maxDiffX && size.x < maxX * rx && size.z < maxZ * rz && size.z - maxZ < maxDiffZ && size.y < maxY * r && size.y - maxY < maxDiff) {
  52998. //总size不会太大
  52999. common.pushToGroupAuto([box0, box1], group);
  53000. }
  53001. }
  53002. }
  53003. if (group.length) {
  53004. //虽然如果三个以上可能会超出maxWidth。 不过3个的概率很低,且可以限制宽度
  53005. group.forEach(function (pair) {
  53006. var boxTypes = [];
  53007. var bound = new THREE.Box3();
  53008. pair.forEach(function (e) {
  53009. bound.union(e.bound);
  53010. e.dispose();
  53011. if (typeCount > 1) {
  53012. //判断boxType: 寻找所使用的box总分最高的boxType
  53013. var a = boxTypes.find(function (a) {
  53014. return a.boxType == e.boxType;
  53015. });
  53016. var score = 0;
  53017. var add = function add(box) {
  53018. box && (score += box.score);
  53019. };
  53020. e.traversePair(function (e) {
  53021. add(e.box0);
  53022. add(e.box1);
  53023. });
  53024. if (a) {
  53025. a.score += score;
  53026. } else {
  53027. boxTypes.push({
  53028. score,
  53029. boxType: e.boxType
  53030. });
  53031. }
  53032. }
  53033. });
  53034. if (typeCount > 1) {
  53035. boxTypes.sort(function (a, b) {
  53036. return b.score - a.score;
  53037. });
  53038. boxType = boxTypes[0].boxType;
  53039. }
  53040. var size = bound.getSize(new THREE.Vector3());
  53041. var center = bound.getCenter(new THREE.Vector3());
  53042. var _ref9 = pair.find(function (e) {
  53043. return e.xProp;
  53044. }) || {},
  53045. xProp = _ref9.xProp,
  53046. yProp = _ref9.yProp;
  53047. if (xProp && pair.find(function (e) {
  53048. return e.xProp && e.xProp != xProp;
  53049. })) {
  53050. //如果有不同的话
  53051. xProp = yProp = null;
  53052. }
  53053. var info = {
  53054. name: 'mix:' + pair.map(function (e) {
  53055. return ' ' + e.name;
  53056. }),
  53057. mixedFrom: pair,
  53058. boxType,
  53059. center,
  53060. size,
  53061. xProp,
  53062. yProp
  53063. };
  53064. xProp || getBoxDirProp(info);
  53065. var o = restrictSize(size.x, size.y, size.z, info);
  53066. size.x = o.x;
  53067. size.y = o.y;
  53068. size.z = o.z;
  53069. var box = new Box(info);
  53070. console.error('混合', boxType, pair, box);
  53071. });
  53072. }
  53073. }
  53074. }
  53075. function combines(types) {
  53076. //合并boxSolids . battery经常嵌套
  53077. if (!(types instanceof Array)) types = [types];
  53078. var boxes = boxesSolid.filter(function (e) {
  53079. return types.includes(e.boxType);
  53080. });
  53081. combineBoxes(boxes, types.length);
  53082. }
  53083. var createSinglePano = function createSinglePano(box) {
  53084. var minScorePercent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  53085. //仅用一个pano中的data来创建。 悬挂于墙上的准确性依赖于墙的准确性。
  53086. if (box.score < MinBoxInitialScore) {
  53087. //如Xszq2fv03b的电池pano8-0其实是纸箱、 WZQoMbNmNTu的pano14-0分数0.649
  53088. return console.error('取消createSinglePano: 线框识别分数低,可能错误', box.sid, box);
  53089. }
  53090. getBoxBase(box);
  53091. var center = getBoxPos(box);
  53092. if (safeBound.distanceToPoint(center) > 0) {
  53093. return console.log('取消createSinglePano:超出safebound', box); //可能是错误的线框,如H7pg1tO9oeJ pano8-1
  53094. }
  53095. var info = {
  53096. name: box.sid,
  53097. box0: box,
  53098. center,
  53099. topPos: box.topPos,
  53100. btmPos: box.btmPos
  53101. };
  53102. preDealBox(info);
  53103. var minScore = -500 * minScorePercent; //调试 3MnIWabM6ne Tmo1vLp9Q13
  53104. var a = getPoseScore(info.boxposes, box.boxType
  53105. /* true */
  53106. );
  53107. if (!standards[box.boxType].bottom && box.btmPos) {
  53108. a -= (box.btmPos.y - groundY) * 3000; //底部被遮住一部分(但是像vHC1GfkdKtD在户外,容易底部变高到bound外去怎么办)
  53109. }
  53110. var failed = a < minScore;
  53111. console.log('createSinglePano', failed ? '失败' : '成功', 'pose score:', a, box.sid, box);
  53112. if (failed) return; //addLabel(center, 'center', { a: 0.3 })
  53113. //info.topPos && addLabel(info.topPos, 'topPos', { a: 0.3 })
  53114. info.score = a;
  53115. getBoxSize(info);
  53116. new Box(info);
  53117. }; //去除挨得很近的漫游点,因为两个接近的点match出的值误差很大
  53118. {
  53119. _this3.removedDatas = {};
  53120. var panoIds = Object.keys(_this3.datas).filter(function (id) {
  53121. if (!player$4.model.panos.index[id]) {
  53122. //排除数据错误
  53123. _this3.removedDatas[id] = _this3.datas[id];
  53124. delete _this3.datas[id];
  53125. console.log('???', id);
  53126. return;
  53127. }
  53128. return true;
  53129. });
  53130. var len = panoIds.length;
  53131. for (var i = 0; i < len; i++) {
  53132. var pano0 = player$4.model.panos.index[panoIds[i]];
  53133. for (var j = i + 1; j < len; j++) {
  53134. var pano1 = player$4.model.panos.index[panoIds[j]];
  53135. if (pano0.position.distanceToSquared(pano1.position) < 0.01) {
  53136. //离的很近。保留shape多的那个data
  53137. var remove = void 0;
  53138. if (_this3.datas[panoIds[i]].shapes.length > _this3.datas[panoIds[j]].shapes.length) {
  53139. remove = panoIds[j];
  53140. } else {
  53141. remove = panoIds[i];
  53142. }
  53143. console.log("\u5220\u9664pano".concat(remove, "\u7684data\uFF0C\u56E0pano").concat(panoIds[i], "\u548Cpano").concat(panoIds[j], "\u5F88\u8FD1"));
  53144. _this3.removedDatas[remove] = _this3.datas[remove];
  53145. delete _this3.datas[remove];
  53146. }
  53147. }
  53148. }
  53149. } //this.expandModelBound()
  53150. // if (version == 'vision') this.datasMixed = common.CloneObject(this.datas, null, [player.model.panos.list[0].constructor])
  53151. _this3.datasMixed = common.CloneObject(_this3.datas, null, undefined, function (data) {
  53152. return data['category'];
  53153. });
  53154. /* Search('cabinet')
  53155. Search('air')
  53156. Search('battery') */
  53157. for (var _i4 in typeNames) {
  53158. Search(_i4);
  53159. }
  53160. console.log('----FindRest----');
  53161. waitFindRest.forEach(function (e) {
  53162. findRest.apply(void 0, _toConsumableArray(e.args));
  53163. if (e.type != 'air' && e.type != 'airSmart' && e.type != 'cabinet') combines(e.type);
  53164. });
  53165. combines(['air', 'airSmart']); //这两种合在一起combine,因为太像了容易识别出多个 nZrBdvRaDuC
  53166. console.log('cost:', Date.now() - startTime, 'ms, boxSolid:', _this3.boxesSolid, '共' + _this3.boxesSolid.length + '个');
  53167. };
  53168. /* let getSid = (function(){
  53169. let sid = 0
  53170. return function(){
  53171. return sid++
  53172. }
  53173. })() */
  53174. done = function done() {
  53175. var _loop8 = function _loop8(panoId) {
  53176. if (!_this3.datas[panoId]) return "continue";
  53177. _this3.datas[panoId].shapes = _this3.datas[panoId].shapes.map(function (shape, i) {
  53178. return Object.assign({
  53179. sid: 'pano' + panoId + '-' + i,
  53180. category: shape.category,
  53181. //提前 便于调试
  53182. pano: player$4.model.panos.index[panoId],
  53183. index: i
  53184. }, shape);
  53185. });
  53186. };
  53187. for (var panoId in _this3.datas) {
  53188. var _ret6 = _loop8(panoId);
  53189. if (_ret6 === "continue") continue;
  53190. }
  53191. _this3.panoBound = new THREE.Box3();
  53192. player$4.model.chunks.forEach(function (e) {
  53193. modelBound.union(e.geometry.boundingBox); //注:不用model.boundingBox是 因为union了pano的position的
  53194. }); //针对部分模型错误,只有底面的,union一下pano.position
  53195. var minY = Infinity,
  53196. minYs = [];
  53197. var panos = player$4.model.panos.list.filter(function (e) {
  53198. return e.isAligned();
  53199. });
  53200. panos.forEach(function (e) {
  53201. var bound = new THREE.Box3().setFromCenterAndSize(e.position, new THREE.Vector3(0.1, 0.1, 0.1));
  53202. modelBound.union(bound);
  53203. _this3.panoBound.union(bound);
  53204. minY = Math.min(e.floorPosition.y, minY); //avePanoFY += e.floorPosition.y
  53205. minYs.push(e.floorPosition.y);
  53206. });
  53207. groundY = modelBound.min.y;
  53208. minYs.sort(function (a, b) {
  53209. return a - b;
  53210. }); //console.log(minYs)
  53211. var midFloorY = minYs[Math.floor(minYs.length / 2)];
  53212. console.error('minY', minY, 'midFloorY', midFloorY, '原groundY', groundY);
  53213. _this3.minY = minY; //部分模型底部高度错误
  53214. /* if (minY > groundY) {
  53215. console.error('minY > groundY', minY, groundY)
  53216. groundY = modelBound.min.y = midFloorY //案例nZrBdvRaDuC
  53217. } else {
  53218. if (groundY - minY > 0.05) console.warn('minY', minY, 'groundY', groundY)
  53219. groundY = modelBound.min.y = midFloorY , document.title += ' new' //修改以后未必更好所以暂时不修改 变更好的:eGhyf5QdVHA
  53220. } */
  53221. groundY = modelBound.min.y = midFloorY; //这个y可能不准。需要通过fire的btmPos.y来确定
  53222. safeBound = _this3.safeBound = modelBound;
  53223. groundPlane.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY, 0));
  53224. if (_this3.ifAnalyze) {
  53225. beginCompute();
  53226. }
  53227. {
  53228. _this3.load(player$4.currentPano.id);
  53229. _this3.boxesSolid.forEach(function (e) {
  53230. return e.boxMesh.updateMatrixWorld();
  53231. }); //for updateBoxVisiInPano raycaster
  53232. _this3.updateBoxVisiInPano();
  53233. }
  53234. };
  53235. if (!dataList) {
  53236. /* player.model.panos.list.forEach(e => {
  53237. if (!e.isAligned()) return
  53238. panosCount++
  53239. load.bind(this)(e.id)
  53240. }) */
  53241. loadAll.bind(this)(); //测试环境
  53242. } else {
  53243. //when version == 'output'
  53244. dataList.forEach(function (e) {
  53245. var panoId = e.imagePath.split('.jpg')[0];
  53246. _this3.datas[panoId] = e;
  53247. });
  53248. done();
  53249. }
  53250. case 13:
  53251. case "end":
  53252. return _context3.stop();
  53253. }
  53254. }
  53255. }, _callee3, this);
  53256. }));
  53257. function compute(_x) {
  53258. return _compute.apply(this, arguments);
  53259. }
  53260. return compute;
  53261. }()
  53262. }, {
  53263. key: "expandModelBound",
  53264. value: function expandModelBound() {
  53265. var _this6 = this;
  53266. //有的模型太窄,容易将一排的柜体当做墙壁。所以可以根据box位置扩展bound. (如果因为点位太少,导致内部的电池远超模型范围,就不管了。R7xZsmm9FsG)
  53267. var maxDis0 = 1,
  53268. //最终位置不会超过这个距离
  53269. maxDis1 = 3; //搜寻范围。不可扩展太宽,否则不准确的框会飘很远,甚至多画多个box,如R7xZsmm9FsG
  53270. var newBound = modelBound.clone();
  53271. var list = [];
  53272. var _loop9 = function _loop9(panoId) {
  53273. if (!_this6.datas[panoId]) return "continue";
  53274. var _this6$datas$panoId = _this6.datas[panoId],
  53275. imageWidth = _this6$datas$panoId.imageWidth,
  53276. imageHeight = _this6$datas$panoId.imageHeight;
  53277. _this6.datas[panoId].shapes.forEach(function (box) {
  53278. getBoxBase(box, imageWidth, imageHeight);
  53279. if (box.sid == 'pano2-10') {
  53280. console.log(4);
  53281. }
  53282. if (box.btmPosPredict) {
  53283. var far = box.pano.position.distanceToSquared(box.btmPosPredict);
  53284. if (far > 20) return; //太远不准
  53285. var dis = modelBound.distanceToPoint(box.btmPosPredict);
  53286. if (dis > 0 && dis < maxDis1) {
  53287. //maxDis1用来防air-hanging和一些错误的框
  53288. list.push({
  53289. box,
  53290. dis
  53291. });
  53292. }
  53293. }
  53294. });
  53295. };
  53296. for (var panoId in this.datas) {
  53297. var _ret7 = _loop9(panoId);
  53298. if (_ret7 === "continue") continue;
  53299. }
  53300. list.sort(function (a, b) {
  53301. return a.dis - b.dis;
  53302. }); //let mid = list[Math.floor(list.length/2)]
  53303. var mid = list.length; // /2
  53304. for (var i = 0; i < mid; i++) {
  53305. var box = list[i].box;
  53306. var pos = box.btmPosPredict;
  53307. if (list[i].dis > maxDis0) {
  53308. var p1 = pos.clone().clamp(modelBound.min, modelBound.max);
  53309. var vec = new THREE.Vector3().subVectors(pos, p1).normalize().multiplyScalar(maxDis0);
  53310. pos = new THREE.Vector3().addVectors(p1, vec);
  53311. }
  53312. var marginBound = new THREE.Box3().setFromCenterAndSize(pos, new THREE.Vector3(0.2, 0, 0.2));
  53313. newBound.union(marginBound);
  53314. }
  53315. skyBoxTight = new BoundingMesh(newBound, new THREE.MeshBasicMaterial({
  53316. side: THREE.DoubleSide,
  53317. wireframe: true,
  53318. transparent: true,
  53319. opacity: 0.05
  53320. }), 0); //skyBoxTight.visible = false
  53321. skyBoxTight.updateMatrixWorld(); //不update的话raycaster是错的
  53322. meshGroup.add(skyBoxTight);
  53323. this.skyBoxTight = skyBoxTight;
  53324. this.safeBound = this.safeBoundFirstVer = safeBound = newBound;
  53325. boundConfirmed = true;
  53326. console.log('bound1:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
  53327. }
  53328. }, {
  53329. key: "expandModelBound2",
  53330. value: function expandModelBound2(type) {
  53331. var _this7 = this;
  53332. var material = skyBoxTight.material;
  53333. skyBoxTight.geometry.dispose();
  53334. boxesSolid.forEach(function (e) {
  53335. if (e.boxType != type) return;
  53336. _this7.safeBound.union(e.bound);
  53337. });
  53338. skyBoxTight = new BoundingMesh(this.safeBound, material, 0); //skyBoxTight.visible = false
  53339. skyBoxTight.updateMatrixWorld(); //不update的话raycaster是错的
  53340. meshGroup.add(skyBoxTight);
  53341. this.skyBoxTight = skyBoxTight;
  53342. console.log('bound2:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
  53343. }
  53344. /* adjustModelBound(type){
  53345. if(standards[type].atWall != 1)return //必须是挂墙的
  53346. this.lastSafeBound = this.safeBound.clone()
  53347. let list = []
  53348. let add = e => {
  53349. if (e.btmPos && e.box1 && e.minAng>10 ) {
  53350. //有 box1才能确定是getIntersect得到的pos
  53351. list.includes(e) || e.push(e)
  53352. }
  53353. }
  53354. this.boxesSolid.forEach((solidBox)=>{
  53355. if(solidBox.boxType != type)return
  53356. solidBox.traversePair(add)
  53357. })
  53358. let wallSides = {'x+': 0, 'x-': 0, 'z+': 0, 'z-': 0}
  53359. let getBoxSide = (e)=>{
  53360. for(let i in e.panosDir){
  53361. if(e.panosDir[i] != 0){
  53362. wallSides[i] += 1
  53363. }
  53364. }
  53365. }
  53366. if(list.length){
  53367. this.safeBound = this.panoBound.clone()
  53368. list.forEach((e)=>{
  53369. this.safeBound.union(e.bound)//还是说使用cIntersect来expand?
  53370. getBoxSide()
  53371. })
  53372. }
  53373. skyBoxTight = new BoundingMesh(this.safeBound, material, 0)
  53374. //skyBoxTight.visible = false
  53375. skyBoxTight.updateMatrixWorld() //不update的话raycaster是错的
  53376. meshGroup.add(skyBoxTight)
  53377. this.skyBoxTight = skyBoxTight
  53378. //主要目的,针对那些模型比room大得多的情况,比如多了门外的部分,造成墙面不准。
  53379. //monitor的可以完全决定位置。其他的只能收缩(但是不能收缩超过panos和第一次expand的那些btm的bound里)
  53380. //太麻烦了,且考虑到即使墙面完全准确也可能反倒把它变的不准的风险。
  53381. } */
  53382. /* 最低点使用fire的吗
  53383. MW6MEeCOy9Y 只有最近三个点和fire接近
  53384. 3MnIWabM6ne fire combine了
  53385. ov5NTEImzhW fire多个
  53386. n4z0yd5tQaF fire多两个错位离谱的。。 位置和显示的不一样。。
  53387. 5BaiXkK6Ag1 fire算的不太准 低了0.1 样本数仅两个
  53388. */
  53389. }, {
  53390. key: "updateBoxVisiInPano",
  53391. value: function updateBoxVisiInPano() {
  53392. var _this8 = this;
  53393. //if (!isDiwei) return
  53394. if (player$4.mode != 'panorama' || !shelterFilterEnable) {
  53395. this.boxesSolid.forEach(function (e) {
  53396. return e.updateVisible(true, 'panoVisi');
  53397. });
  53398. return;
  53399. } //粗略排除遮挡
  53400. /* let data = this.datasMixed[player.currentPano.id] || this.datas[player.currentPano.id]
  53401. if (!data) return
  53402. let visiBoxes = this.visiInfos[player.currentPano.id]
  53403. if (!visiBoxes) {
  53404. visiBoxes = []
  53405. this.boxesSolid.forEach(box => {
  53406. let sizeXZ = new THREE.Vector2(box.size.x, box.size.z)
  53407. let extLen = -sizeXZ.length() / 2 - 0.5
  53408. let intersect = convertTool.ifIntersectChunks(player.position, box.position, player.model, { extLen })
  53409. if (!intersect) {
  53410. //是否和当前pano的box框位置接近
  53411. let pos2d1 = new THREE.Vector2(box.position.x, box.position.z)
  53412. //return visiBoxes.push(box)
  53413. let shape = data.shapes.find(e => {
  53414. //getBoxBtm(e)
  53415. //return true
  53416. if (isExt) {
  53417. let { imageWidth, imageHeight } = data
  53418. getBoxBase(e, imageWidth, imageHeight)
  53419. getOtherPos(e)
  53420. }
  53421. let pos = getBoxPos(e)
  53422. if (!pos) return
  53423. let pos2d2 = new THREE.Vector2(pos.x, pos.z)
  53424. if (pos2d1.distanceToSquared(pos2d2) < 3) return true //效果:有一些一排中2d框稀疏的可能会不显示
  53425. })
  53426. if (shape) {
  53427. visiBoxes.push(box)
  53428. } else {
  53429. //console.log('ohhhh')
  53430. }
  53431. }
  53432. })
  53433. this.visiInfos[player.currentPano.id] = visiBoxes
  53434. } */
  53435. var visiBoxes = this.visiInfos[player$4.currentPano.id];
  53436. if (!visiBoxes) {
  53437. visiBoxes = this.boxesSolid.filter(function (box) {
  53438. /* if(box.name == 'cabinet-row4-0'){
  53439. console.log(1)
  53440. } */
  53441. return [new THREE.Vector3(-box.size.x / 2, 0, 0), new THREE.Vector3(box.size.x / 2, 0, 0), new THREE.Vector3(0, 0, box.size.z / 2), new THREE.Vector3(0, 0, -box.size.z / 2)].some(function (dir) {
  53442. var faceCenter = new THREE.Vector3().addVectors(box.position, dir); //在box前后左右四个面上的中心点
  53443. var camDir = new THREE.Vector3().subVectors(faceCenter, player$4.position).normalize();
  53444. if (camDir.dot(dir) >= 0) return false; //在背面
  53445. ray.set(player$4.position, camDir);
  53446. var far = player$4.position.distanceTo(faceCenter);
  53447. ray.far = far;
  53448. var o = ray.intersectObjects(_this8.boxesSolid.filter(function (e) {
  53449. return e != box;
  53450. }).map(function (e) {
  53451. return e.boxMesh;
  53452. })); //加了个true遍历子集//ray.ray.intersectsBox(box2.bound)
  53453. return !(o && o.length);
  53454. /* if(this.boxesSolid.some(box2 => {//查找有无遮挡
  53455. if(box2 == box)return
  53456. let o = ray.ray.intersectsBox(box2.bound) //这个ray的far没用
  53457. return o
  53458. }))return false
  53459. return true//存在一个面没有被其他box挡住*/
  53460. });
  53461. });
  53462. this.visiInfos[player$4.currentPano.id] = visiBoxes; //此方法相比之前利用data中的数据,不同点是只要没有被其他box遮挡即可显示,所以可以穿墙显示。另外遮挡更精细
  53463. }
  53464. this.boxesSolid.forEach(function (e) {
  53465. e.updateVisible(visiBoxes.includes(e), 'panoVisi');
  53466. });
  53467. }
  53468. }, {
  53469. key: "confirmGroundY",
  53470. value: function confirmGroundY(type) {
  53471. //利用fire来确定地面高度(会稍低于地板,但box框不打滑且xz更准,估计因box框比box大)。调试:3MnIWabM6ne up9PPZkx1px 4GqaqNdyjGfs GFbQi1LiSij
  53472. if (boundConfirmed) return;
  53473. var btmYs = [],
  53474. pairs = [],
  53475. needCount = 5,
  53476. maxDis = 3,
  53477. btmY = 0;
  53478. var add = function add(e) {
  53479. if (e.btmPos && e.box1
  53480. /* && e.score >= minScore */
  53481. ) {
  53482. //有 box1才能确定是getIntersect得到的pos
  53483. pairs.push(e);
  53484. }
  53485. };
  53486. boxesSolid.forEach(function (e) {
  53487. if (e.boxType != type) return;
  53488. e.traversePair(add);
  53489. });
  53490. var usePairs = pairs;
  53491. if (pairs.length > needCount) {
  53492. //调试:Y8czF2Z3h9m
  53493. var disMap = new Map();
  53494. pairs.forEach(function (e) {
  53495. disMap.set(e, Math.max(e.box0.pano.position.distanceTo(e.box0.btmPosPredict), e.box1.pano.position.distanceTo(e.box1.btmPosPredict)));
  53496. });
  53497. pairs.sort(function (a, b) {
  53498. return disMap.get(a) - disMap.get(b);
  53499. }); //距离从近到远 . 远处的高度可能偏离严重,就不管了,而且框也不一定准
  53500. usePairs = pairs.slice(0, needCount);
  53501. for (var i = needCount; i < pairs.length; i++) {
  53502. if (disMap.get(pairs[i]) < maxDis) {
  53503. usePairs.push(pairs[i]);
  53504. }
  53505. }
  53506. }
  53507. usePairs.forEach(function (e) {
  53508. //有 box1才能确定是getIntersect得到的pos
  53509. var btmY_ = e.btmPos.y;
  53510. var width = e.size.x / 2;
  53511. var h0 = width / Math.tan(Math.acos(-e.box0.centerBtmDir.y)); //|centerBtmDir.y| 即俯视角度的cos
  53512. var h1 = width / Math.tan(Math.acos(-e.box1.centerBtmDir.y));
  53513. var h = Math.min(h0, h1); //选个小的吧,因浅的会更快接触到中心,虽然交点是两条射线最近点 不一定在fire中心
  53514. //如果毫无误差,且centerBtmDir.y相同,只要两条线centerBtmDir的xz相同,交点就是和地面的交点,而只要不同,交点就是和地面的交点,而只要不同,交点必然是在fire中心之下。随着minAng和centerBtmDir.y 交点在这中间变化
  53515. var r = math$1.linearClamp(e.minAng, 0, 90, 0, 1);
  53516. btmY_ += h * r;
  53517. btmYs.push(btmY_);
  53518. btmY += btmY_;
  53519. });
  53520. btmY /= btmYs.length;
  53521. if (btmYs.length) {
  53522. console.error('confirmGroundY', btmY,
  53523. /* '样本数', btmYs.length, */
  53524. btmYs, usePairs.map(function (e) {
  53525. return e.name;
  53526. }), pairs);
  53527. /* if(btmYs.length == 1 && pairs[0].minAngle<12 && ){
  53528. } */
  53529. groundY = this.safeBound.min.y = this.panoBound.min.y = btmY; // = -1.1
  53530. groundPlane.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY, 0));
  53531. }
  53532. var _standards$type$heigh = standards[type].height,
  53533. min = _standards$type$heigh.min,
  53534. max = _standards$type$heigh.max;
  53535. boxesSolid.slice().forEach(function (e) {
  53536. if (e.boxType != type) return;
  53537. if (e.fake) {
  53538. e.dispose();
  53539. return;
  53540. }
  53541. var topY = e.topPos ? e.topPos.y : e.list.reduce(function (w, c) {
  53542. return w + c.topPos.y;
  53543. }, 0) / e.list.length;
  53544. e.size.y = THREE.MathUtils.clamp(topY - groundY, min, max);
  53545. e.setFromInfo(e);
  53546. e.draw();
  53547. });
  53548. this.panoBound;
  53549. this.expandModelBound();
  53550. }
  53551. }, {
  53552. key: "bindEvents",
  53553. value: function bindEvents() {
  53554. var _this9 = this;
  53555. player$4.on(PlayerEvents.FlyingStarted, function (e) {
  53556. //if(e.mode == 'dollhouse')return
  53557. // 点位跳转前清除已有线框
  53558. _this9.traverse(function (obj) {
  53559. if (obj.isMesh) {
  53560. obj.geometry.dispose();
  53561. obj.material.dispose();
  53562. }
  53563. });
  53564. _this9.wireframes.clear();
  53565. _this9.currentId = null;
  53566. });
  53567. player$4.on(PlayerEvents.FlyingEnded, function () {
  53568. // 点位跳转后加载线框
  53569. _this9.updateBoxVisiInPano();
  53570. if (player$4.mode != Viewmode$1.PANORAMA) return; // 只有PANORAMA模式下需要加载
  53571. _this9.load(player$4.currentPano.id);
  53572. });
  53573. var allBoxMesh = [];
  53574. player$4.on('collectIntersectMesh', function (meshes, e) {
  53575. if (!isDiwei) return; //allBoxMesh = this.boxesSolid.filter(e => e.label.visible).map(e => e.boxMesh) //过滤掉隐藏的
  53576. allBoxMesh = _this9.boxesSolid.filter(function (e) {
  53577. return common.getObjVisiByReason(e.label, 'panoVisi');
  53578. }).map(function (e) {
  53579. return e.boxMesh;
  53580. }); //过滤掉隐藏的
  53581. //meshes.push(...allBoxMesh)
  53582. });
  53583. player$4.on('judgeIntersect', function (intersect_, e) {
  53584. if (e.getConsumed() || !isDiwei) return;
  53585. var intersect = player$4.getMouseIntersect(null, allBoxMesh, {});
  53586. var hoveredBox = intersect && allBoxMesh.includes(intersect.object) ? intersect.object.masterBox : null;
  53587. if (hoveredBox != _this9.hoveredBox) {
  53588. if (_this9.hoveredBox) ;
  53589. if (hoveredBox) {
  53590. // hoveredBox.updateVisible(true, 'unhover')
  53591. /* hoveredBox.boxMesh.visible = true
  53592. hoveredBox.boxHelper.material.opacity = 1
  53593. hoveredBox.boxHelper.material.color.copy(colors.yellow)
  53594. hoveredBox.label.setBackgroundColor(Object.assign(colors.labelYellow)) //text
  53595. */
  53596. CursorDeal.add('hoverMonitor');
  53597. } else {
  53598. CursorDeal.remove('hoverMonitor');
  53599. }
  53600. _this9.hoveredBox = hoveredBox;
  53601. }
  53602. hoveredBox && e.consume();
  53603. });
  53604. player$4.on('click', function (e) {
  53605. if (e.getConsumed() || !isDiwei) return;
  53606. if (_this9.hoveredBox) {
  53607. player$4.$app.Scene.emit('box-frame-click', _this9.hoveredBox);
  53608. e.consume();
  53609. }
  53610. });
  53611. /*let allBoxMesh = []
  53612. player.on('collectIntersectMesh', (meshes, e) => {
  53613. allBoxMesh = this.boxesSolid.filter(e => e.label.visible).map(e => e.boxMesh) //过滤掉隐藏的
  53614. meshes.push(...allBoxMesh)
  53615. })
  53616. player.on('judgeIntersect', (intersect, e) => {
  53617. if (e.getConsumed()) return
  53618. let hoveredBox = intersect && allBoxMesh.includes(intersect.object) ? intersect.object.masterBox : null
  53619. if (hoveredBox != this.hoveredBox) {
  53620. if (this.hoveredBox) {
  53621. this.hoveredBox.boxMesh.visible = false
  53622. this.hoveredBox.boxHelper.material.opacity = 0.5
  53623. this.hoveredBox.boxHelper.material.color.copy(colors.green)
  53624. this.hoveredBox.label.setBackgroundColor( Object.assign(colors.labelGreen) )//text
  53625. }
  53626. if (hoveredBox) {
  53627. hoveredBox.boxMesh.visible = true
  53628. hoveredBox.boxHelper.material.opacity = 1
  53629. hoveredBox.boxHelper.material.color.copy(colors.yellow)
  53630. hoveredBox.label.setBackgroundColor( Object.assign(colors.labelYellow ))//text
  53631. CursorDeal.add('hoverMonitor')
  53632. } else {
  53633. CursorDeal.remove('hoverMonitor')
  53634. }
  53635. this.hoveredBox = hoveredBox
  53636. }
  53637. hoveredBox && e.consume()
  53638. })
  53639. player.on('click', e => {
  53640. if (e.getConsumed()) return
  53641. if (this.hoveredBox) {
  53642. player.$app.Scene.emit('box-frame-click', this.hoveredBox)
  53643. e.consume()
  53644. }
  53645. }) */
  53646. /* let allRectMesh
  53647. player.on('collectIntersectMesh', (meshes, e) => {
  53648. if(!this.wireframes || !this.wireframes.visible)return
  53649. allRectMesh = this.wireframes.children.filter(e=>e.name == 'rectInPano').map(e => e.plane) //plane
  53650. meshes.push(...allRectMesh)
  53651. })
  53652. player.on('judgeIntersect', (intersect, e) => {
  53653. if (e.getConsumed() || !this.wireframes || !this.wireframes.visible) return
  53654. let hoveredRect = intersect && allRectMesh.includes(intersect.object) ? intersect.object.parent.parent : null
  53655. if (hoveredRect != this.hoveredRect) {
  53656. if (this.hoveredRect) {
  53657. this.hoveredRect.wireframe.material.color.copy(colors.green)//框
  53658. this.hoveredRect.label.setBackgroundColor( colors.labelGreen )//text
  53659. this.hoveredRect.plane.visible = false //plane
  53660. }
  53661. if (hoveredRect) {
  53662. hoveredRect.wireframe.material.color.copy(colors.yellow)//框
  53663. hoveredRect.label.setBackgroundColor(colors.labelYellow )//text
  53664. hoveredRect.plane.visible = true //plane
  53665. CursorDeal.add('hoverMonitor')
  53666. } else {
  53667. CursorDeal.remove('hoverMonitor')
  53668. }
  53669. this.hoveredRect = hoveredRect
  53670. }
  53671. hoveredRect && e.consume()
  53672. })
  53673. player.on('click', e => {
  53674. if (e.getConsumed() || !this.wireframes || !this.wireframes.visible) return
  53675. if (this.hoveredRect) {
  53676. console.log(this.hoveredRect.data)
  53677. e.consume()
  53678. }
  53679. }) */
  53680. if (this.ifAnalyze && !isDiwei) {
  53681. setTimeout(function () {
  53682. {
  53683. var btn = document.createElement('button');
  53684. btn.innerHTML = '点击切换box显示';
  53685. var visi;
  53686. btn.onclick = function () {
  53687. visi = !visi; //this.boxesSolid.forEach(e => ((e.boxHelper.visible = visi), (e.label.visible = visi), (e.boxMesh.visible = false)))
  53688. _this9.boxesSolid.forEach(function (e) {
  53689. return e.updateVisible(visi, 'whole');
  53690. });
  53691. _this9.showBoxes = visi;
  53692. };
  53693. document.querySelector('#app').appendChild(btn);
  53694. btn.id = 'boxWire';
  53695. btn.style.position = 'fixed';
  53696. btn.style['z-index'] = '100';
  53697. btn.style.background = '#e00472';
  53698. btn.style.padding = '10px';
  53699. btn.style.bottom = '80px';
  53700. }
  53701. {
  53702. var _btn = document.createElement('button');
  53703. _btn.innerHTML = '点击切换矩形框显示';
  53704. _btn.onclick = function () {
  53705. _this9.wireframes.visible = !_this9.wireframes.visible;
  53706. };
  53707. document.querySelector('#app').appendChild(_btn);
  53708. _btn.id = 'wireframes';
  53709. _btn.style.position = 'fixed';
  53710. _btn.style['z-index'] = '100';
  53711. _btn.style.background = '#419aff';
  53712. _btn.style.padding = '10px';
  53713. _btn.style.bottom = '130px';
  53714. }
  53715. {
  53716. var _btn2 = document.createElement('button');
  53717. _btn2.innerHTML = '点击切换遮挡状态';
  53718. _btn2.onclick = function () {
  53719. shelterFilterEnable = !shelterFilterEnable;
  53720. _this9.updateBoxVisiInPano();
  53721. };
  53722. document.querySelector('#app').appendChild(_btn2);
  53723. _btn2.id = 'shelterFilterEnable';
  53724. _btn2.style.position = 'fixed';
  53725. _btn2.style['z-index'] = '100';
  53726. _btn2.style.background = '#3e9';
  53727. _btn2.style.padding = '10px';
  53728. _btn2.style.bottom = '180px';
  53729. }
  53730. }, 1000);
  53731. }
  53732. }
  53733. /**
  53734. * 加载点位标记数据
  53735. * @param {*} panoId
  53736. */
  53737. }, {
  53738. key: "load",
  53739. value: function load(panoId) {
  53740. var _this10 = this;
  53741. var data = this.datasMixed[panoId] || this.datas[panoId];
  53742. if (!data) {
  53743. if (!(panoId in this.datas)) setTimeout(function () {
  53744. _this10.load(panoId);
  53745. }, 100); //否则无数据
  53746. return;
  53747. }
  53748. if (player$4.currentPano.id != panoId || player$4.flying || this.currentId == panoId) return; // 防止连续跳转点位时,clear后才load好上一点位的数据,导致出现之前的标记
  53749. this.currentId = panoId;
  53750. var shapes = data.shapes,
  53751. imageHeight = data.imageHeight,
  53752. imageWidth = data.imageWidth; //data.data
  53753. var allShapes = shapes.slice();
  53754. shapes.forEach(function (e) {
  53755. if (e.boxes) allShapes.push.apply(allShapes, _toConsumableArray(e.boxes));
  53756. });
  53757. allShapes.forEach(function (shape) {
  53758. // 填充色和线框色
  53759. // let { fill_color, line_color } = shape
  53760. getUVs(shape);
  53761. getCenterDir(shape, player$4.currentPano);
  53762. var fill_color = shape.fill_color,
  53763. _shape$color = shape.color,
  53764. color = _shape$color === void 0 ? [56, 56, 255] : _shape$color;
  53765. var line_color = [].concat(_toConsumableArray(color), [255]);
  53766. if (!fill_color) fill_color = [255, 255, 255, 0];
  53767. if (!line_color) line_color = [255, 0, 0, 255];
  53768. if (shape.boxes) {
  53769. line_color = [20, 205, 255, 255];
  53770. }
  53771. var pos = getBoxPos(shape);
  53772. var dis = pos ? shape.pano.position.distanceTo(getBoxPos(shape)) : 1;
  53773. var labelShift = (shape.boxType == 'fire' ? 0 : -0.2) / dis;
  53774. var name = shape.category + '-' + shape.sid; //if(shape.score < MinBoxInitialScore){
  53775. name = [name, 'sc: ' + math$1.toPrecision(shape.score, 3)]; //}
  53776. _this10.showSignalFrom2d(name, shape.bbox2, imageWidth, imageHeight, {
  53777. fill: {
  53778. color:
  53779. /* colors.yellow, // */
  53780. new THREE.Color().setRGB(fill_color[0] / 255, fill_color[1] / 255, fill_color[2] / 255),
  53781. opacity:
  53782. /* 0.2, */
  53783. fill_color[3] / 255
  53784. },
  53785. line: {
  53786. color:
  53787. /* colors.green,// */
  53788. new THREE.Color().setRGB(line_color[0] / 255, line_color[1] / 255, line_color[2] / 255),
  53789. opacity: shape.category == 'cabling_rack' ? 0.4 : line_color[3] / 255 //走线架太绕,扰乱视线
  53790. }
  53791. }, shape.centerDir, labelShift, shape.state == '被删除', shape);
  53792. }); // })
  53793. // .catch(err => console.log(`点位${panoId}无标记数据或数据出错:`, err))
  53794. }
  53795. /**
  53796. * 根据坐标标记全景图
  53797. *
  53798. * 存在的问题:如果要准确复现全景图上的线框,上下边框会变为弧形。而按顶点连直线的话,180度以上会出bug。
  53799. * 解决方式:目前150度以下只画出4个顶点然后连直线,150度以上准确画出全景图线框。
  53800. */
  53801. }, {
  53802. key: "showSignalFrom2d",
  53803. value: function showSignalFrom2d(name, rect, w, h, options, centerDir, labelShift, removed, data) {
  53804. // 目前rect给的是矩形对角的两个点坐标,将它扩展成四个顶点
  53805. var cornerArr = [new THREE.Vector2(rect[0], rect[1]), new THREE.Vector2(rect[2], rect[1]), new THREE.Vector2(rect[2], rect[3]), new THREE.Vector2(rect[0], rect[3])]; // 根据四个顶点,填充中间点
  53806. var pointArr = [];
  53807. for (var i = 0; i < cornerArr.length; i++) {
  53808. var corner1 = cornerArr[i];
  53809. pointArr.push(corner1);
  53810. /* // 横向角度超过150度时,3d中边框的弧线已经不太明显,准确画出全景图线框
  53811. if ((rect[2] - rect[0]) / w < 5 / 12 && i % 2 == 0) continue
  53812. const vec = [corner2[0] - corner1[0], corner2[1] - corner1[1]]
  53813. let length = Math.sqrt(vec[0] * vec[0] + vec[1] * vec[1])
  53814. let num = length / 150
  53815. for (let j = 1; j <= num; j++) {
  53816. pointArr.push([corner1[0] + (vec[0] / num) * j, corner1[1] + (vec[1] / num) * j])
  53817. } */
  53818. } //pointArr.push(cornerArr[0], cornerArr[2], cornerArr[1], cornerArr[3]) //对角线
  53819. var points = [];
  53820. pointArr.forEach(function (uv) {
  53821. var dir = getDirByUV(uv, player$4.currentPano); // points.push(dir.sub(centerVec)) // 计算其他点相对于中点的坐标,方便旋转平移等
  53822. points.push(dir);
  53823. }); // 线框
  53824. var lineGeometry = new THREE.BufferGeometry().setFromPoints(points);
  53825. var lineMaterial = new THREE.LineBasicMaterial({
  53826. color: options.line.color,
  53827. opacity: options.line.opacity,
  53828. transparent: true,
  53829. depthTest: false
  53830. });
  53831. var wireframe = new THREE.LineLoop(lineGeometry, lineMaterial); // wireframe.position.copy(centerVec) // 将中点作为线框坐标
  53832. wireframe.renderOrder = 100; // 填充颜色
  53833. var fillGeometry = lineGeometry.clone().setIndex(new THREE.BufferAttribute(new Uint16Array([0, 1, 3, 2, 3, 1]), 1));
  53834. var fillMaterial = new THREE.MeshBasicMaterial({
  53835. color: options.fill.color,
  53836. opacity: options.fill.opacity,
  53837. transparent: true,
  53838. side: THREE.DoubleSide,
  53839. depthTest: false
  53840. });
  53841. var plane = new THREE.Mesh(fillGeometry, fillMaterial);
  53842. plane.renderOrder = wireframe.renderOrder - 1;
  53843. wireframe.add(plane);
  53844. plane.visible = false; // 名称
  53845. var textMesh = new TextSprite({
  53846. text: name,
  53847. backgroundColor: {
  53848. r: options.line.color.r * 255,
  53849. g: options.line.color.g * 255,
  53850. b: options.line.color.b * 255,
  53851. a: options.line.opacity * 0.5
  53852. },
  53853. textColor: {
  53854. r: 255,
  53855. g: 255,
  53856. b: 255,
  53857. a: options.line.opacity * 1.1
  53858. },
  53859. borderRadius: 15,
  53860. renderOrder: wireframe.renderOrder + 1,
  53861. player: player$4
  53862. }); //const shift = new THREE.Vector3(0, labelShift , 0)
  53863. textMesh.position.copy(centerDir
  53864. /* .clone().add(shift).normalize() */
  53865. );
  53866. textMesh.lookAt(0, 0, 0); // 看向相机
  53867. textMesh.scale.set(0.12, 0.12, 0.12);
  53868. /* let line = addLine(centerDir, shift, null, options.line.color)
  53869. line.material.opacity = options.line.opacity */
  53870. var group = new THREE.Group();
  53871. group.name = 'rectInPano';
  53872. group.position.copy(player$4.currentPano.position);
  53873. group.add(wireframe);
  53874. group.add(textMesh); //group.add(line)
  53875. this.wireframes.add(group);
  53876. group.label = textMesh;
  53877. group.wireframe = wireframe;
  53878. group.plane = plane;
  53879. if (removed) {
  53880. textMesh.sprite.material.opacity = 0.4;
  53881. lineMaterial.opacity *= 0.6;
  53882. lineMaterial.color.set('#efe');
  53883. }
  53884. group.data = data;
  53885. }
  53886. }, {
  53887. key: "clear",
  53888. value: function clear() {
  53889. skyBoxTight = null, meshGroup = null, modelBound = new THREE.Box3(), groundY = null, safeBound = null, boundConfirmed = null, boxesSolid = [];
  53890. }
  53891. }]);
  53892. return PanoBoxFrame;
  53893. }(THREE.Group);
  53894. function _createSuper$w(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$w(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  53895. function _isNativeReflectConstruct$w() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  53896. var Scene = /*#__PURE__*/function (_Emiter) {
  53897. _inherits(Scene, _Emiter);
  53898. var _super = _createSuper$w(Scene);
  53899. function Scene(app) {
  53900. var _this;
  53901. _classCallCheck(this, Scene);
  53902. _this = _super.call(this);
  53903. _this.app = app;
  53904. _this.ready = false;
  53905. _this.loaded = false;
  53906. _this.locked = null;
  53907. _this.Decoration = new Decoration(_assertThisInitialized(_this));
  53908. _this.on('ready', function () {
  53909. return _this.ready = true;
  53910. });
  53911. _this.on('loaded', function () {
  53912. _this.loaded = true;
  53913. var videoRenderer = _this.app.core.get('PanoVideoRenderer');
  53914. videoRenderer.on(PanoRendererEvents.CanPlayVideo, function () {
  53915. return _this.emit(PanoRendererEvents.CanPlayVideo);
  53916. });
  53917. videoRenderer.on(PanoRendererEvents.StartPlay, function () {
  53918. return _this.emit(PanoRendererEvents.StartPlay);
  53919. });
  53920. videoRenderer.on(PanoRendererEvents.SuspendRender, function () {
  53921. return _this.emit(PanoRendererEvents.SuspendRender);
  53922. });
  53923. videoRenderer.on(PanoRendererEvents.ResumeRender, function () {
  53924. return _this.emit(PanoRendererEvents.ResumeRender);
  53925. });
  53926. if (browser$1.valueFromUrl('ai') == 'ids') {
  53927. new PanoBoxFrame(_this.app.core.get('Player'));
  53928. } else if (browser$1.valueFromUrl('ai') == 'sds') {
  53929. new PanoBoxFrame(_this.app.core.get('Player'), true);
  53930. }
  53931. });
  53932. return _this;
  53933. }
  53934. /**
  53935. * 获取所有点位信息
  53936. */
  53937. _createClass(Scene, [{
  53938. key: "panos",
  53939. get: function get() {
  53940. return this.app.core.get('Player').model.panos;
  53941. }
  53942. /**
  53943. * 获取当前点位id
  53944. */
  53945. }, {
  53946. key: "panoId",
  53947. get: function get() {
  53948. return this.app.core.get('Player').currentPano.id;
  53949. }
  53950. }, {
  53951. key: "floors",
  53952. get: function get() {
  53953. return this.app.core.get('Player').model.floors;
  53954. }
  53955. /**
  53956. * 获取当前点位楼层id
  53957. */
  53958. }, {
  53959. key: "floorId",
  53960. get: function get() {
  53961. return this.app.core.get('Player').currentPano.floorIndex;
  53962. }
  53963. /**
  53964. * 获取当前楼层id
  53965. */
  53966. }, {
  53967. key: "currentFloorId",
  53968. get: function get() {
  53969. return this.app.core.get('Player').model.currentFloor.floorIndex;
  53970. }
  53971. /**
  53972. * 获取点位数量
  53973. */
  53974. }, {
  53975. key: "panoCount",
  53976. get: function get() {
  53977. return this.app.core.get('Player').model.panos.list.length;
  53978. }
  53979. /**
  53980. * 获取球幕视频数量
  53981. */
  53982. }, {
  53983. key: "videoCount",
  53984. get: function get() {
  53985. var videos = this.app.store.getValue('metadata').videos;
  53986. if (!videos || !videos.data || !videos.data.length) {
  53987. return 0;
  53988. }
  53989. return videos.data.length;
  53990. }
  53991. /**
  53992. * 获取球幕视频列表
  53993. */
  53994. }, {
  53995. key: "videoList",
  53996. get: function get() {
  53997. var videos = this.app.store.getValue('metadata').videos;
  53998. if (!videos || !videos.data || !videos.data.length) {
  53999. return [];
  54000. }
  54001. return videos.data.map(function (item) {
  54002. return item.id;
  54003. });
  54004. }
  54005. /**
  54006. * 判断当时点位是否有球幕视频
  54007. */
  54008. }, {
  54009. key: "isCurrentPanoHasVideo",
  54010. get: function get() {
  54011. return this.app.core.get('Player').currentPano.hasVideo;
  54012. }
  54013. }, {
  54014. key: "whenReady",
  54015. value: function whenReady(callback) {
  54016. var _this2 = this;
  54017. var func = function func(resolve) {
  54018. resolve();
  54019. if (typeof callback === 'function') {
  54020. callback();
  54021. }
  54022. };
  54023. return new Promise(function (resolve) {
  54024. if (_this2.ready) {
  54025. func(resolve);
  54026. } else {
  54027. _this2.once('ready', function () {
  54028. return func(resolve);
  54029. });
  54030. }
  54031. });
  54032. }
  54033. }, {
  54034. key: "whenLoaded",
  54035. value: function whenLoaded(callback) {
  54036. var _this3 = this;
  54037. var func = function func(resolve) {
  54038. resolve();
  54039. if (typeof callback === 'function') {
  54040. callback();
  54041. }
  54042. };
  54043. return new Promise(function (resolve) {
  54044. if (_this3.loaded) {
  54045. func(resolve);
  54046. } else {
  54047. _this3.once('loaded', function () {
  54048. return func(resolve);
  54049. });
  54050. }
  54051. });
  54052. }
  54053. /**
  54054. * 显示俯视图
  54055. */
  54056. }, {
  54057. key: "showFloorCadImage",
  54058. value: function showFloorCadImage() {
  54059. this.app.core.get('Player').model.floorplanCadImg.displayCadPlane(true);
  54060. }
  54061. /**
  54062. * 隐藏俯视图
  54063. */
  54064. }, {
  54065. key: "hideFloorCadImage",
  54066. value: function hideFloorCadImage() {
  54067. var _this4 = this;
  54068. if (this.app.core.get('Player')) {
  54069. this.app.core.get('Player').model.floorplanCadImg.displayCadPlane(false);
  54070. } else {
  54071. setTimeout(function () {
  54072. _this4.hideFloorCadImage();
  54073. }, 100);
  54074. }
  54075. }
  54076. /**
  54077. * 设置地面logo大小
  54078. */
  54079. }, {
  54080. key: "setFloorLogo",
  54081. value: function setFloorLogo() {
  54082. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  54083. if (!this.ready) {
  54084. return;
  54085. }
  54086. this.app.core.get('Player').model.floorLogos.changeFloorLogo(options);
  54087. }
  54088. /**
  54089. * 跳转楼层
  54090. * @param {*} id 楼层Id
  54091. *
  54092. */
  54093. }, {
  54094. key: "gotoFloor",
  54095. value: function gotoFloor(id) {
  54096. if (id == 'all') {
  54097. this.app.core.get('Player').model.toggleAllFloors(!0);
  54098. } else {
  54099. var t = parseInt(id) - this.app.core.get('Player').model.currentFloor.floorIndex;
  54100. this.app.core.get('Player').changeFloor(t);
  54101. }
  54102. this.app.core.get('Player').model.currentFloorId = id;
  54103. }
  54104. /**
  54105. * 暂停加载资源
  54106. */
  54107. }, {
  54108. key: "lock",
  54109. value: function lock() {
  54110. this.locked = Deferred$1();
  54111. }
  54112. /**
  54113. * 恢复加载资源
  54114. */
  54115. }, {
  54116. key: "unlock",
  54117. value: function unlock() {
  54118. if (this.locked) {
  54119. this.locked.resolve();
  54120. this.locked = null;
  54121. }
  54122. }
  54123. /**
  54124. * 显示标尺
  54125. */
  54126. }, {
  54127. key: "showRule",
  54128. value: function showRule() {
  54129. this.app.core.get('Player').model.wallManager.switchDisplay(true);
  54130. }
  54131. /**
  54132. * 隐藏标尺
  54133. */
  54134. }, {
  54135. key: "hideRule",
  54136. value: function hideRule() {
  54137. this.app.core.get('Player').model.wallManager.switchDisplay(false);
  54138. }
  54139. }]);
  54140. return Scene;
  54141. }(tinyEmitter);
  54142. var MinMap = /*#__PURE__*/function () {
  54143. function MinMap(app) {
  54144. _classCallCheck(this, MinMap);
  54145. this.app = app;
  54146. this.plugin = null;
  54147. this.display = null;
  54148. this.hidden = false;
  54149. this.deferred = Deferred$1();
  54150. }
  54151. _createClass(MinMap, [{
  54152. key: "install",
  54153. value: function install(plugin) {
  54154. this.plugin = plugin;
  54155. this.deferred.resolve(this.plugin);
  54156. }
  54157. }, {
  54158. key: "use",
  54159. value: function use() {
  54160. if (this.plugin) {
  54161. return Promise.resolve(this.plugin);
  54162. } else {
  54163. return this.deferred;
  54164. }
  54165. }
  54166. }, {
  54167. key: "show",
  54168. value: function show(force) {
  54169. var _this = this;
  54170. this.display = true;
  54171. if (force) {
  54172. this.hidden = false;
  54173. }
  54174. if (this.hidden) {
  54175. return Promise.resolve();
  54176. }
  54177. return this.use().then(function () {
  54178. return _this.plugin.show();
  54179. });
  54180. }
  54181. }, {
  54182. key: "hide",
  54183. value: function hide(force) {
  54184. var _this2 = this;
  54185. this.display = false;
  54186. if (force) {
  54187. this.hidden = true;
  54188. }
  54189. return this.use().then(function () {
  54190. return _this2.plugin.hide();
  54191. });
  54192. }
  54193. }, {
  54194. key: "reload",
  54195. value: function reload() {
  54196. var _this3 = this;
  54197. return this.use().then(function () {
  54198. return _this3.plugin.data(true);
  54199. });
  54200. }
  54201. }]);
  54202. return MinMap;
  54203. }();
  54204. var DataSYNC = /*#__PURE__*/function () {
  54205. function DataSYNC(app) {
  54206. _classCallCheck(this, DataSYNC);
  54207. this.app = app;
  54208. }
  54209. _createClass(DataSYNC, [{
  54210. key: "use",
  54211. value: function () {
  54212. var _use = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(name, data) {
  54213. var cad;
  54214. return regenerator.wrap(function _callee$(_context) {
  54215. while (1) {
  54216. switch (_context.prev = _context.next) {
  54217. case 0:
  54218. _context.next = 2;
  54219. return this.app.CadManager.use();
  54220. case 2:
  54221. cad = _context.sent;
  54222. cad.sync.use(name, data);
  54223. case 4:
  54224. case "end":
  54225. return _context.stop();
  54226. }
  54227. }
  54228. }, _callee, this);
  54229. }));
  54230. function use(_x, _x2) {
  54231. return _use.apply(this, arguments);
  54232. }
  54233. return use;
  54234. }()
  54235. }]);
  54236. return DataSYNC;
  54237. }();
  54238. function _createSuper$v(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$v(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  54239. function _isNativeReflectConstruct$v() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  54240. var _render = /*#__PURE__*/_classPrivateFieldKey("render");
  54241. var ObjectManager = /*#__PURE__*/function (_Emiter) {
  54242. _inherits(ObjectManager, _Emiter);
  54243. var _super = _createSuper$v(ObjectManager);
  54244. function ObjectManager(app) {
  54245. var _this;
  54246. _classCallCheck(this, ObjectManager);
  54247. _this = _super.call(this);
  54248. Object.defineProperty(_assertThisInitialized(_this), _render, {
  54249. value: _render2
  54250. });
  54251. _this.app = app;
  54252. _this.marks = [];
  54253. _this.player = null;
  54254. _this.enable = true;
  54255. _this.app.Scene.on('ready', function () {
  54256. _this.player = _this.app.core.get('Player');
  54257. _this.player.on(PlayerEvents.ViewChanged, _classPrivateFieldBase(_assertThisInitialized(_this), _render)[_render].bind(_assertThisInitialized(_this)));
  54258. });
  54259. return _this;
  54260. }
  54261. _createClass(ObjectManager, [{
  54262. key: "add",
  54263. value: function add(mark) {
  54264. if (!mark || !mark.position) {
  54265. return;
  54266. }
  54267. mark.position = new THREE.Vector3(mark.position.x, mark.position.y, mark.position.z);
  54268. mark.position.y = -1;
  54269. this.marks.push(mark);
  54270. }
  54271. }, {
  54272. key: "filter",
  54273. value: function filter(func) {}
  54274. }]);
  54275. return ObjectManager;
  54276. }(tinyEmitter);
  54277. function _render2() {
  54278. var _this2 = this;
  54279. var marks = this.marks || [];
  54280. if (marks.length) {
  54281. var mode = this.player.mode;
  54282. var floorId = this.player.model.currentFloor.floorIndex;
  54283. marks.forEach(function (item) {
  54284. if (!item.position) {
  54285. return;
  54286. }
  54287. var result = convertTool.getPos2d(item.position, _this2.player);
  54288. if (!result.trueSide) {
  54289. item.visible = false;
  54290. return;
  54291. }
  54292. if (convertTool.ifShelter(item.position, _this2.player, {
  54293. x: result.vector.x,
  54294. y: result.vector.y
  54295. }, null, _this2.player.model.allFloorsVisible ? null : floorId)) {
  54296. item.visible = false;
  54297. return;
  54298. }
  54299. if (item.mode && item.mode != mode) {
  54300. item.visible = false;
  54301. return;
  54302. }
  54303. if (item.floorId != void 0 && item.floorId != floorId) {
  54304. item.visible = false;
  54305. return;
  54306. } // let scale = (this.player.domElement.clientWidth * (1 / 50)) / Math.abs(this.player.cameraControls.activeControl.camera.left)
  54307. // item.scale = THREE.MathUtils.clamp(scale, 0.4, 3)
  54308. item.x = result.pos.x;
  54309. item.y = result.pos.y;
  54310. item.visible = true;
  54311. });
  54312. this.emit('render', {
  54313. marks,
  54314. mode,
  54315. floorId
  54316. });
  54317. }
  54318. }
  54319. function _createSuper$u(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$u(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  54320. function _isNativeReflectConstruct$u() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  54321. var BoxVideo = /*#__PURE__*/function () {
  54322. function BoxVideo(app) {
  54323. var _this = this;
  54324. _classCallCheck(this, BoxVideo);
  54325. this.getOverlayBySid = function (sid) {
  54326. var player = _this.app.core.get('Player');
  54327. var overlay = player.OverlayManager.group.children.find(function (overlay) {
  54328. return overlay.sid == sid;
  54329. });
  54330. if (!overlay) overlay = player.OverlayManager.group.children[0], console.warn('无效sid:', sid, overlay);
  54331. return overlay;
  54332. };
  54333. this.app = app;
  54334. this.edit = {};
  54335. this.deferred = Deferred$1();
  54336. var _player = null;
  54337. this.app.Scene.on('loaded', function () {
  54338. _player = _this.app.core.get('Player');
  54339. _player.EditOverlay = new EditOverlay(_player);
  54340. _player.OverlayManager = new OverlayManager(_player); // player.model.createTranControl(player)
  54341. _this.deferred.resolve();
  54342. _this.app.Scene.emit('BoxVideo.loaded');
  54343. }); // 进入“添加视频”时执行
  54344. this.edit.enter = function () {
  54345. // 等到EditOverlay初始化才能enter
  54346. _this.waitOverlayManager(function () {
  54347. var init = function init() {
  54348. if (!_player.EditOverlay.transformControls) {
  54349. _player.EditOverlay.init();
  54350. } else {
  54351. _player.EditOverlay.enter();
  54352. }
  54353. setTimeout(function () {
  54354. // 进入添加视频后,自动跳转向boxvideo(需要setTimeout一下,否则刷新后从floorplan切换过来会卡在checkAndWaitForPanoLoad)
  54355. var overlay = _player.OverlayManager.group.children.filter(function (overlay) {
  54356. return overlay.overlayType == 'video';
  54357. })[0];
  54358. overlay && _player.OverlayManager.clickOverlay(overlay, {
  54359. dontEmit: true
  54360. });
  54361. }, 0);
  54362. };
  54363. if (_player.model.mode == 'panorama') init();else _this.app.Camera.once('mode.afterChange', init);
  54364. }, _this.edit.enter.bind(_this));
  54365. }; // 离开“添加视频”时执行
  54366. this.edit.exit = function () {
  54367. _player && _player.EditOverlay.leave();
  54368. }; // 保存数据(info:{data: VideoInfoJson, done(): 保存成功时执行,更新可撤销数据})
  54369. this.edit.save = function (type) {
  54370. var info;
  54371. try {
  54372. info = _player.EditOverlay.getOverlaySavingInfo();
  54373. } catch (error) {
  54374. console.error(error);
  54375. }
  54376. if (type === 'save') {
  54377. _player.modelSideManager.recover();
  54378. }
  54379. return info;
  54380. }; // 撤销未保存的数据
  54381. this.edit.undoEdit = function () {
  54382. _player.EditOverlay.undoEdit();
  54383. _player.modelSideManager.recover();
  54384. }; // 开始视频位置的选择
  54385. this.edit.add = function () {
  54386. _player.EditOverlay.beginToAddPlane();
  54387. _player.mode === Viewmode$1.FLOORPLAN && _player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  54388. _player.modelSideManager.tempAuto(); //#45013 #45011 产品要求编辑时恢复backside
  54389. }; // 上传视频(file:VueComponent,media:HTMLVideoElement | HTMLImageElement)
  54390. this.edit.upload = function (file, media) {
  54391. if (media.videoWidth || media.width) {
  54392. _player.EditOverlay.overlayUploaded(file, media);
  54393. } else {
  54394. media.onloadedmetadata = function () {
  54395. _player.EditOverlay.overlayUploaded(file, media);
  54396. };
  54397. }
  54398. }; // 删除视频(delFunc:删除成功时执行,从3d中删除视频)
  54399. this.edit.delete = function (sid, delFunc) {
  54400. var overlay = _this.getOverlayBySid(sid);
  54401. _player.EditOverlay.DeleteOverlay(overlay, delFunc);
  54402. }; // 看向3d视频
  54403. this.edit.lookAt = function (sid) {
  54404. var overlay = _this.getOverlayBySid(sid);
  54405. _player.OverlayManager.clickOverlay(overlay, {
  54406. dontEmit: true
  54407. });
  54408. }; // 看向并选中3d视频
  54409. this.edit.select = function (sid) {
  54410. var overlay = _this.getOverlayBySid(sid);
  54411. _player.OverlayManager.clickOverlay(overlay);
  54412. _player.mode === Viewmode$1.FLOORPLAN && _player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  54413. _player.modelSideManager.tempAuto();
  54414. }; // 取消选中(隐藏控制柄)
  54415. this.edit.unselect = function () {
  54416. var overlay = _player.EditOverlay.editPlane;
  54417. if (overlay) {
  54418. overlay.raycastToFindFloor();
  54419. overlay.updateVisibleOnFloor();
  54420. _player.EditOverlay.controlSelectOverlay(null);
  54421. _player.EditOverlay.editPlane = null;
  54422. }
  54423. _player.mode === Viewmode$1.FLOORPLAN && _player.model.floorplanCadImg.showCadPlane(); // 显示户型图
  54424. _player.emit('endEditOverlay');
  54425. }; // 设置显隐(isShow:true / false)
  54426. this.edit.setVisible = function (sid, isShow) {
  54427. var overlay = _this.getOverlayBySid(sid);
  54428. isShow ? overlay.show('forceHide') : overlay.hide('forceHide');
  54429. if (!_player.EditOverlay.editPlane) return;
  54430. _player.EditOverlay.controlSelectOverlay(overlay.visible ? overlay : null);
  54431. }; // 左右翻转
  54432. this.edit.reverse = function (isReverse) {
  54433. var overlay = _player.EditOverlay.editPlane;
  54434. overlay.scale.x = Math.abs(overlay.scale.x) * (isReverse ? -1 : 1); // 需要更新visible 虽然不知道为什么,但不更新的话可见按钮就失效
  54435. //overlay.info.reverse = !overlay.info.reverse
  54436. /* let infoCopy = JSON.parse(JSON.stringify(overlay.info))
  54437. infoCopy.sid = overlay.sid
  54438. infoCopy.hide = overlay.isHidden //!common.getObjVisiByReason(overlay, 'forceHide')
  54439. this.app.VideoManager.emit('videos/panel/display', infoCopy) */
  54440. }; // 切换控制柄的类型(index:0(平移) / 1(缩放) / 2(旋转))
  54441. this.edit.transfrom = function (index) {
  54442. if (!_player.EditOverlay.editing) return;
  54443. var transformControls = _player.EditOverlay.transformControls;
  54444. setTimeout(function () {
  54445. transformControls.mode = index == 0 ? 'translate' : index == 1 ? 'scale' : 'rotate';
  54446. var overlay = _player.EditOverlay.editPlane;
  54447. overlay.visible && overlay.frame.switchTranformControls(transformControls);
  54448. }, 0);
  54449. }; // 设置视频的宽高(type:'W' / 'H')
  54450. this.edit.setPlaneWH = function (type, newData) {
  54451. var overlay = _player.EditOverlay.editPlane;
  54452. newData.value = THREE.MathUtils.clamp(newData.value, newData.min, newData.max);
  54453. if (type == 'W') {
  54454. overlay.scale.x *= newData.value / overlay.width;
  54455. overlay.width = newData.value;
  54456. }
  54457. if (type == 'H') {
  54458. overlay.scale.y *= newData.value / overlay.height;
  54459. overlay.height = newData.value;
  54460. } // player.EditOverlay.useImgRatio() //自适应比例
  54461. overlay.frame && overlay.frame.update({
  54462. mode: 'scale'
  54463. });
  54464. return newData.value;
  54465. }; // 设置视频的厚度(data:{value, min, max})
  54466. this.edit.setThinkness = function (data) {
  54467. var overlay = _player.EditOverlay.editPlane;
  54468. data.value = THREE.MathUtils.clamp(data.value, data.min, data.max);
  54469. if (overlay.frame) {
  54470. overlay.depth = data.value / 100;
  54471. overlay.frame.setFrameThickness(overlay.depth);
  54472. } else {
  54473. if (data.value == 0) {
  54474. overlay.addBox(false);
  54475. overlay.depth = 0.001;
  54476. overlay.scale.z = 0.001;
  54477. } else {
  54478. overlay.addBox(true);
  54479. overlay.depth = data.value / 100;
  54480. overlay.scale.z = data.value / 100 / settings$3.overlay.depth;
  54481. }
  54482. return data.value;
  54483. }
  54484. }; // 仅恢复视频的原始宽高比例和厚度
  54485. this.edit.resetRatio = function () {
  54486. var overlay = _player.EditOverlay.editPlane;
  54487. if (overlay.overlayType) {
  54488. // this.edit.setThinkness({ value: overlay.info.depth, min: 0, max: overlay.info.depth })
  54489. overlay.width /= overlay.scale.x;
  54490. overlay.height /= overlay.scale.y;
  54491. overlay.scale.setX(1);
  54492. overlay.scale.setY(1);
  54493. _player.EditOverlay.updateOverlayScaleDisplay(); // player.EditOverlay.VideoManager.emit('videos/panel/changeDepth', 0)
  54494. _player.EditOverlay.useImgRatio();
  54495. overlay.frame && overlay.frame.update({
  54496. mode: 'scale'
  54497. });
  54498. }
  54499. };
  54500. this.edit.getCurentPanoVisi = function () {
  54501. return _player.OverlayManager.group.children.filter(function (overlay) {
  54502. return overlay.visiblePanos.find(function (pano) {
  54503. return pano == _player.currentPano;
  54504. });
  54505. });
  54506. }; // 设置空间视频边框
  54507. this.edit.setOverlayFrame = function (frameData) {
  54508. var overlay = _player.EditOverlay.editPlane;
  54509. overlay.addFrame(frameData.type);
  54510. if (overlay.visible) {
  54511. // 更新transformControls
  54512. var transformControls = _player.EditOverlay.transformControls;
  54513. if (overlay.frame) overlay.frame.switchTranformControls(transformControls);else transformControls.attach(overlay);
  54514. }
  54515. /* // 需要更新visible、depth、frameType
  54516. let infoCopy = JSON.parse(JSON.stringify(overlay.info))
  54517. infoCopy.sid = overlay.sid
  54518. infoCopy.hide = overlay.isHidden //!common.getObjVisiByReason(overlay, 'forceHide') //infoCopy.hide = !overlay.visible
  54519. infoCopy.depth = overlay.depth
  54520. infoCopy.frameType = overlay.frame.type
  54521. this.app.VideoManager.emit('videos/panel/display', infoCopy) */
  54522. }; // 限制仅当前pano可视
  54523. this.edit.limitToCurrentPano = function (shouldLimit) {
  54524. var overlay = _player.EditOverlay.editPlane;
  54525. /*overlay.limitToOnlyPano = !!shouldLimit // 先标识为true,等保存时确定pano */
  54526. overlay.limitToOnlyPano = shouldLimit ? _player.currentPano : false;
  54527. overlay.show('limitToOnlyPano'); //无论开关,当前点都是可见的
  54528. };
  54529. }
  54530. _createClass(BoxVideo, [{
  54531. key: "showAll",
  54532. value: function showAll() {
  54533. var _this2 = this;
  54534. this.waitOverlayManager(function () {
  54535. var player = _this2.app.core.get('Player');
  54536. player.OverlayManager.setGroupVisible(true);
  54537. }, this.showAll.bind(this));
  54538. }
  54539. }, {
  54540. key: "hideAll",
  54541. value: function hideAll() {
  54542. var _this3 = this;
  54543. this.waitOverlayManager(function () {
  54544. var player = _this3.app.core.get('Player');
  54545. player.OverlayManager.setGroupVisible(false);
  54546. }, this.hideAll.bind(this));
  54547. }
  54548. }, {
  54549. key: "waitOverlayManager",
  54550. value: function waitOverlayManager(func, waitFunc) {
  54551. var player = this.app.core.get('Player');
  54552. if (player && player.OverlayManager && player.EditOverlay) {
  54553. func && func();
  54554. } else {
  54555. this.deferred.then(function () {
  54556. return waitFunc();
  54557. });
  54558. }
  54559. }
  54560. /**
  54561. * 是否可操作
  54562. * @param {boolean} enable 标识参数
  54563. */
  54564. }, {
  54565. key: "operable",
  54566. value: function operable(enable) {
  54567. var player = this.app.core.get('Player');
  54568. if (player.OverlayManager) {
  54569. player.OverlayManager.group.children.forEach(function (overlay) {
  54570. var layer = enable ? RenderLayers.DEFAULT : RenderLayers.RETICULE;
  54571. overlay.layers.set(layer);
  54572. overlay.children.forEach(function (mesh) {
  54573. return mesh.layers.set(layer);
  54574. });
  54575. });
  54576. }
  54577. }
  54578. }]);
  54579. return BoxVideo;
  54580. }();
  54581. var VideoManager = /*#__PURE__*/function (_Emiter) {
  54582. _inherits(VideoManager, _Emiter);
  54583. var _super = _createSuper$u(VideoManager);
  54584. function VideoManager(app) {
  54585. var _this4;
  54586. _classCallCheck(this, VideoManager);
  54587. _this4 = _super.call(this);
  54588. _this4.BoxVideo = new BoxVideo(app);
  54589. return _this4;
  54590. }
  54591. return VideoManager;
  54592. }(tinyEmitter);
  54593. function _createSuper$t(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$t(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  54594. function _isNativeReflectConstruct$t() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  54595. var RepairManager = /*#__PURE__*/function (_Emiter) {
  54596. _inherits(RepairManager, _Emiter);
  54597. var _super = _createSuper$t(RepairManager);
  54598. function RepairManager(app) {
  54599. var _this;
  54600. _classCallCheck(this, RepairManager);
  54601. _this = _super.call(this);
  54602. _this.app = app;
  54603. _this.edit = {};
  54604. _this.mosaic = Deferred$1();
  54605. _this.mosaics = [];
  54606. var player;
  54607. var deferred = Deferred$1();
  54608. _this.app.Scene.on('loaded', function () {
  54609. _this.mosaics = _this.app.store.getValue('metadata').mosaicList || [];
  54610. player = _this.app.core.get('Player');
  54611. deferred.resolve();
  54612. }); // 看向球幕视频
  54613. _this.edit.focusVideo = function (panoId) {
  54614. var pano = player.model.panos.index[panoId];
  54615. if (player.flying) {
  54616. //player.waitFlytoItemFuc = () => {}
  54617. player.once('flying.ended', function () {
  54618. _this.edit.focusVideo(panoId);
  54619. });
  54620. return;
  54621. }
  54622. player.flyToPano({
  54623. pano
  54624. }, function () {});
  54625. };
  54626. /**
  54627. * 涂抹效果
  54628. */
  54629. // 开始涂抹
  54630. _this.edit.startPaint = function () {
  54631. player.flyToNewMode({
  54632. mode: 'panorama',
  54633. pano: player.currentPano,
  54634. callback: function callback() {
  54635. player.paintEditor.start();
  54636. player.OverlayManager.hide('all'); //box视频
  54637. player.viewLinkManager.hideAllViews(); //场景关联
  54638. }
  54639. });
  54640. }; // 退出涂抹
  54641. _this.edit.cancelPaint = function () {
  54642. player.paintEditor.cancel();
  54643. player.OverlayManager.show('all');
  54644. player.viewLinkManager.showAllViews();
  54645. }; // 选择笔刷 0:橡皮 1:马赛克 2:高斯模糊
  54646. _this.edit.selectBrush = function (type) {
  54647. player.paintEditor.changeBrush(type);
  54648. }; // 设置笔刷大小
  54649. _this.edit.setBrushSize = function (size) {
  54650. player.paintEditor.setBrushSize(size);
  54651. }; // 保存涂抹
  54652. _this.edit.savePaint = function () {
  54653. return player.paintEditor.save();
  54654. }; // 删除涂抹
  54655. _this.edit.deletePaint = function (panoId) {
  54656. player.paintEditor.paintData = player.paintEditor.paintData.filter(function (data) {
  54657. return data.panoId != panoId;
  54658. });
  54659. if (player.currentPano.id == panoId) {
  54660. player.paintEditor.updatePanoPaint(panoId, panoId);
  54661. }
  54662. }; // 检查是否涂抹过
  54663. _this.edit.checkPaintEdit = function () {
  54664. return player.paintEditor.hasEdit;
  54665. };
  54666. return _this;
  54667. }
  54668. _createClass(RepairManager, [{
  54669. key: "install",
  54670. value: function install(name, plugin) {
  54671. if (this[name]) {
  54672. this[name].resolve(plugin);
  54673. }
  54674. }
  54675. }]);
  54676. return RepairManager;
  54677. }(tinyEmitter);
  54678. function _createSuper$s(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$s(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  54679. function _isNativeReflectConstruct$s() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  54680. var UA = window.navigator.userAgent;
  54681. var AudioPlayer = /*#__PURE__*/function () {
  54682. function AudioPlayer(app) {
  54683. _classCallCheck(this, AudioPlayer);
  54684. this.app = app;
  54685. }
  54686. _createClass(AudioPlayer, [{
  54687. key: "add",
  54688. value: function add(part, screencap) {
  54689. if (part.audio) {
  54690. this.remove(part);
  54691. }
  54692. var url = part.music;
  54693. if (!part.music) {
  54694. if (!screencap) {
  54695. return;
  54696. } else {
  54697. //录制屏幕的时候即使没有音乐也要创建
  54698. url = '';
  54699. }
  54700. }
  54701. part.audio = new Howl({
  54702. preload: true,
  54703. src: [this.app.resource.getUserResourceURL(url, true)],
  54704. loop: false,
  54705. html5: screencap ? false : UA.indexOf('VivoBrowser') != -1 ? false : true,
  54706. //兼容vivo原生浏览器导览音乐不能播放
  54707. format: ['mp3'],
  54708. onloaderror(id, err) {
  54709. console.log(id, err);
  54710. },
  54711. onplayerror: function onplayerror(e) {
  54712. console.log(e);
  54713. },
  54714. onload() {}
  54715. });
  54716. part.audio.on('play', function () {});
  54717. part.audio.on('end', function () {
  54718. if (screencap) {
  54719. part.audio.play();
  54720. part.audio.pause();
  54721. }
  54722. });
  54723. }
  54724. }, {
  54725. key: "remove",
  54726. value: function remove(part) {
  54727. if (part.audio) {
  54728. part.audio.unload();
  54729. part.audio = null;
  54730. delete part.audio;
  54731. }
  54732. }
  54733. }, {
  54734. key: "play",
  54735. value: function play() {}
  54736. }]);
  54737. return AudioPlayer;
  54738. }();
  54739. var TourManager = /*#__PURE__*/function (_Emiter) {
  54740. _inherits(TourManager, _Emiter);
  54741. var _super = _createSuper$s(TourManager);
  54742. function TourManager(app) {
  54743. var _this;
  54744. _classCallCheck(this, TourManager);
  54745. _this = _super.call(this);
  54746. _this.app = app;
  54747. _this.partId = 0;
  54748. _this.frameId = 0;
  54749. _this.playing = false;
  54750. _this.tours = [];
  54751. _this.player = Deferred$1();
  54752. _this.recorder = Deferred$1();
  54753. _this.audioPlayer = new AudioPlayer(app);
  54754. _this.app.store.on('tours', function (tours) {
  54755. // 过滤掉无效点位对应的导览数据
  54756. tours.forEach(function (frag) {
  54757. frag.list = frag.list.filter(function (frame) {
  54758. return frame.enter.mode !== 'panorama' || _this.app.core.get('Player').model.panos.get(frame.enter.panoId);
  54759. });
  54760. });
  54761. for (var i = tours.length; i--; i >= 0) {
  54762. if (tours[i].list.length == 0) {
  54763. tours.splice(i, 1);
  54764. }
  54765. }
  54766. _this.tours = tours;
  54767. _this.load();
  54768. _this.emit('loaded', _this.tours);
  54769. });
  54770. _this.edit = {};
  54771. _this.edit.enterModule = function () {
  54772. _this.editing = true;
  54773. };
  54774. _this.edit.leaveModule = function () {
  54775. _this.editing = false;
  54776. };
  54777. return _this;
  54778. }
  54779. _createClass(TourManager, [{
  54780. key: "uuid",
  54781. value: function uuid() {
  54782. return common.getRandomSid();
  54783. }
  54784. }, {
  54785. key: "load",
  54786. value: function load(data, screencap) {
  54787. var _this2 = this;
  54788. var prev = null;
  54789. if (data) {
  54790. this.tours = data;
  54791. }
  54792. this.tours.forEach(function (item) {
  54793. _this2.audioPlayer.add(item, screencap);
  54794. item.list.forEach(function (frame) {
  54795. delete frame._trans; // if (frame.enter.cover && frame.enter.cover.indexOf('.jpg') != -1) {
  54796. // frame.enter.cover = this.app.resource.getUserResourceURL(frame.enter.cover)
  54797. // }
  54798. if (prev == null) {
  54799. prev = frame;
  54800. } else {
  54801. if (prev.enter.mode != 'panorama' || frame.enter.mode != 'panorama' || prev.enter.panoId == frame.enter.panoId) {
  54802. prev._notrans = true;
  54803. }
  54804. prev = frame;
  54805. }
  54806. });
  54807. });
  54808. }
  54809. /**
  54810. * @returns {Promise<void>}
  54811. */
  54812. }, {
  54813. key: "reload",
  54814. value: function () {
  54815. var _reload = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  54816. return regenerator.wrap(function _callee$(_context) {
  54817. while (1) {
  54818. switch (_context.prev = _context.next) {
  54819. case 0:
  54820. this.partId = 0;
  54821. this.frameId = 0;
  54822. this.playing = false;
  54823. _context.next = 5;
  54824. return this.app.store.get('tours', true);
  54825. case 5:
  54826. case "end":
  54827. return _context.stop();
  54828. }
  54829. }
  54830. }, _callee, this);
  54831. }));
  54832. function reload() {
  54833. return _reload.apply(this, arguments);
  54834. }
  54835. return reload;
  54836. }()
  54837. }, {
  54838. key: "install",
  54839. value: function install(name, plugin) {
  54840. if (this[name]) {
  54841. this[name].resolve(plugin);
  54842. }
  54843. }
  54844. }, {
  54845. key: "toJSON",
  54846. value: function toJSON() {
  54847. var files = [];
  54848. var tours = JSON.parse(JSON.stringify(this.tours, function (key, val) {
  54849. if (key === 'audio') {
  54850. return null;
  54851. } else {
  54852. return val;
  54853. }
  54854. }));
  54855. for (var i = tours.length - 1; i >= 0; i--) {
  54856. var part = tours[i];
  54857. if (!part.list || !part.list.length) {
  54858. tours.splice(i, 1);
  54859. } else {
  54860. delete part.audio;
  54861. delete part._uploaded;
  54862. if (part.music && part.music.indexOf('blob:') === 0) {
  54863. part.music = part.musicName.replace(/(.+)\.(.+)/, "tour-audio-".concat(part.sid, ".$2"));
  54864. }
  54865. part.list.forEach(function (frame, j) {
  54866. delete frame._notrans;
  54867. delete frame.enter._uploaded;
  54868. delete frame.exit._uploaded;
  54869. if (frame.enter && frame.enter.cover && frame.enter.cover.indexOf('data:image') === 0) {
  54870. frame.enter.cover = "tour-enter-".concat(frame.sid, ".jpg");
  54871. }
  54872. if (frame.exit && frame.exit.cover && frame.exit.cover.indexOf('data:image') === 0) {
  54873. frame.exit.cover = "tour-exit-".concat(frame.sid, ".jpg");
  54874. }
  54875. });
  54876. }
  54877. }
  54878. this.tours.forEach(function (part, i) {
  54879. part.list.forEach(function (frame, j) {
  54880. if (frame.enter && frame.enter.cover && frame.enter.cover.indexOf('data:image') === 0) {
  54881. files.push(convertBlob2File(base64ToBlob(frame.enter.cover), "tour-enter-".concat(frame.sid, ".jpg")));
  54882. }
  54883. if (frame.exit && frame.exit.cover && frame.exit.cover.indexOf('data:image') === 0) {
  54884. files.push(convertBlob2File(base64ToBlob(frame.enter.cover), "tour-exit-".concat(frame.sid, ".jpg")));
  54885. }
  54886. });
  54887. });
  54888. return {
  54889. tours,
  54890. files
  54891. };
  54892. }
  54893. }]);
  54894. return TourManager;
  54895. }(tinyEmitter);
  54896. function _createSuper$r(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$r(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  54897. function _isNativeReflectConstruct$r() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  54898. var player$3;
  54899. var range = {
  54900. min: 0.7,
  54901. max: 3
  54902. }; //缩放滑动条范围
  54903. var whPercent = 1.78; //固定输出的图长宽比
  54904. var Screenshot = /*#__PURE__*/function (_Emiter) {
  54905. _inherits(Screenshot, _Emiter);
  54906. var _super = _createSuper$r(Screenshot);
  54907. //场景修复中的截图功能
  54908. function Screenshot(app) {
  54909. var _this;
  54910. _classCallCheck(this, Screenshot);
  54911. _this = _super.call(this);
  54912. _this.app = app;
  54913. _this.editing = false;
  54914. _this.temp = {
  54915. onRangeChange: 0
  54916. };
  54917. return _this;
  54918. }
  54919. _createClass(Screenshot, [{
  54920. key: "enter",
  54921. value: function enter(listenZoomFun) {
  54922. var _this2 = this;
  54923. //console.log('activated')
  54924. if (this.editing) return;
  54925. this.editing = true;
  54926. player$3 = this.app.core.get('Player');
  54927. if (!player$3) {
  54928. return this.app.Scene.on('loaded', function () {
  54929. if (_this2.editing) _this2.enter(listenZoomFun);
  54930. });
  54931. }
  54932. this.setPlayerSize(true);
  54933. this.oldStates = {
  54934. zoomMax: settings$3.zoom.max,
  54935. zoomMin: settings$3.zoom.min,
  54936. zoomEnabled: settings$3.zoom.enabled,
  54937. zoomToDefaultWhenToPano: settings$3.zoom.zoomToDefaultWhenToPano
  54938. };
  54939. settings$3.zoom.max = 3;
  54940. settings$3.zoom.min = 0.7;
  54941. settings$3.zoom.enabled = true;
  54942. settings$3.zoom.zoomToDefaultWhenToPano = false; //window.addEventListener('resize', this.resizeFun, true);
  54943. this.eventList = {
  54944. zoomTo: listenZoomFun.bind(this),
  54945. setSize: this.setPlayerSize.bind(this),
  54946. update: function update() {
  54947. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  54948. _ref$hasChanged = _ref.hasChanged,
  54949. hasChanged = _ref$hasChanged === void 0 ? false : _ref$hasChanged;
  54950. var force = arguments.length > 1 ? arguments[1] : undefined;
  54951. //监听outside模式下的zoom
  54952. if (!player$3.lastFrameChanged && !force) return;
  54953. var control = player$3.cameraControls.activeControl;
  54954. if (player$3.mode == 'dollhouse') {
  54955. var dis = control.camera.position.distanceTo(control.target);
  54956. var zoomlevel = math$1.linearClamp(dis, control.minDistance, Math.max(control.maxDistance / 2, control.minDistance + 3), range.max, range.min);
  54957. listenZoomFun(zoomlevel);
  54958. } else if (player$3.mode == 'floorplan' && hasChanged.cameraProjectionChanged) {
  54959. var absoluteScale = control.getDefaultAbsoluteScale(player$3.model.size); //改
  54960. var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
  54961. var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
  54962. var _zoomlevel = math$1.linearClamp(control.absoluteScale, minS, maxS, range.max, range.min);
  54963. listenZoomFun(_zoomlevel);
  54964. }
  54965. }
  54966. };
  54967. player$3.on('zoomTo', this.eventList.zoomTo);
  54968. player$3.on('setSize', this.eventList.setSize);
  54969. player$3.on('update', this.eventList.update);
  54970. this.eventList.zoomTo(player$3.zoomLevel);
  54971. this.eventList.update(0, true); //加载最高清晰度
  54972. settings$3.highestQualityTile = true; //this.cameras = {'dollhouse':{}, 'floorplan':{}}
  54973. }
  54974. }, {
  54975. key: "leave",
  54976. value: function leave() {
  54977. //退出,恢复
  54978. this.editing = false;
  54979. console.log('退出,恢复');
  54980. if (!player$3) return;
  54981. player$3.zoomTo(1);
  54982. settings$3.zoom.enabled = this.oldStates.zoomEnabled;
  54983. settings$3.zoom.max = this.oldStates.zoomMax;
  54984. settings$3.zoom.min = this.oldStates.zoomMin;
  54985. settings$3.zoom.zoomToDefaultWhenToPano = this.oldStates.zoomToDefaultWhenToPano;
  54986. player$3.off('zoomTo', this.eventList.zoomTo);
  54987. player$3.off('setSize', this.eventList.setSize);
  54988. player$3.off('update', this.eventList.update);
  54989. settings$3.highestQualityTile = false; //canvas高度恢复
  54990. this.setPlayerSize(false);
  54991. } //canvas去掉页眉部分,为了适应框
  54992. }, {
  54993. key: "setPlayerSize",
  54994. value: function setPlayerSize(state) {
  54995. if (state) {
  54996. var offsetHeight = document.querySelector('.ui-editor-head').offsetHeight;
  54997. var winHeight = window.innerHeight - offsetHeight;
  54998. var winWidth = window.innerWidth;
  54999. if (winWidth / winHeight < whPercent) {
  55000. //为了保证图片输出的fovH和画布上的一样,只能压缩一下高度了,否则要改截图的canvas的fov
  55001. var height = winWidth / whPercent;
  55002. player$3.domElement.style.height = "".concat(height, "px");
  55003. player$3.domElement.style.top = (winHeight - height) / 2 + offsetHeight + 'px';
  55004. } else {
  55005. player$3.domElement.style.top = "".concat(offsetHeight, "px");
  55006. player$3.domElement.style.height = "calc(100% - ".concat(offsetHeight, "px)");
  55007. }
  55008. } else {
  55009. //exit
  55010. player$3.domElement.style.top = 0;
  55011. player$3.domElement.style.height = '100%';
  55012. }
  55013. }
  55014. }, {
  55015. key: "waitTexLoaded",
  55016. value: function waitTexLoaded(waitDeferred) {
  55017. var _this3 = this;
  55018. if (player$3.mode == 'panorama') {
  55019. if (!player$3.currentPano || player$3.flying) {
  55020. //刚打开时没有currentPano, 就加一个promise, 完成时记得这个promise也resolve
  55021. console.log('延迟');
  55022. if (!waitDeferred) {
  55023. waitDeferred = Deferred$1();
  55024. }
  55025. setTimeout(function () {
  55026. _this3.waitTexLoaded(waitDeferred);
  55027. }, 100);
  55028. return waitDeferred.promise();
  55029. }
  55030. var tileSize = this.getTileSize();
  55031. var vec = new THREE.Vector3(0, 0, -1).applyQuaternion(player$3.quaternion);
  55032. var camera = player$3.cameraControls.activeControl.camera;
  55033. var vFov = camera.fov;
  55034. var hFov = cameraLight.getHFOVForCamera(camera, camera.aspect, 1);
  55035. var promise = player$3.currentPano.loadTiledPano(tileSize, vec, {
  55036. hFov,
  55037. vFov
  55038. }, !1, !1, !0);
  55039. promise.done(function () {
  55040. console.log('加载完成');
  55041. waitDeferred && waitDeferred.resolve();
  55042. });
  55043. return promise;
  55044. } else {
  55045. var d = Deferred$1();
  55046. return d.resolve().promise();
  55047. }
  55048. }
  55049. }, {
  55050. key: "getMaxHeight",
  55051. value: function getMaxHeight() {
  55052. //全景图高度
  55053. return this.app.core.get('QualityManager').tileClass == '2k' ? 4096 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 * 2 : 1024;
  55054. }
  55055. }, {
  55056. key: "getTileSize",
  55057. value: function getTileSize() {
  55058. // 获取单个面的大小
  55059. return this.app.core.get('QualityManager').tileClass == '2k' ? 2048 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 : 512;
  55060. }
  55061. }, {
  55062. key: "getPicSize",
  55063. value: function getPicSize() {
  55064. if (player$3.mode != 'panorama') {
  55065. return {
  55066. width: 1780,
  55067. height: 1000
  55068. };
  55069. }
  55070. var maxHeight = this.getMaxHeight();
  55071. var height = player$3.cameraControls.activeControl.camera.fov / 180 * maxHeight;
  55072. var width = height * whPercent;
  55073. var size = {
  55074. width: Math.round(width),
  55075. height: Math.round(height)
  55076. };
  55077. return size; // matterport: 4dkk: (4k)
  55078. //0.7: 8101*4551 3.35M
  55079. //1 : 6068*3413 h 8778.29218106 不是 8192?? 5671*3186
  55080. //3: 2023*1138 1890*1062
  55081. //(2k减半) 如1890*1062 --> 945*531
  55082. } //需要渲染最高清晰度的图片
  55083. }, {
  55084. key: "listenZoomLevel",
  55085. value: function listenZoomLevel(zoomLevel) {//console.log('listenZoomLevel',zoomLevel)
  55086. //this.range.value = zoomLevel * 100;
  55087. }
  55088. }, {
  55089. key: "onResetCamera",
  55090. value: function onResetCamera() {
  55091. //console.log('使相机水平');
  55092. if (player$3.mode == 'panorama') {
  55093. player$3.cameraControls.activeControl.lat = 0;
  55094. }
  55095. }
  55096. }, {
  55097. key: "onResumeSize",
  55098. value: function onResumeSize() {
  55099. var _this4 = this;
  55100. //1:1按钮
  55101. //this.range.value = 100;
  55102. if (!player$3) return;
  55103. var control = player$3.cameraControls.activeControl;
  55104. if (player$3.mode == 'transitioning') {
  55105. return player$3.once('mode.changed', function (fromMode, toMode) {
  55106. if (!_this4.editing) return;
  55107. _this4.onResumeSize();
  55108. });
  55109. } else if (player$3.mode == 'panorama') {
  55110. player$3.zoomTo(1);
  55111. } else if (player$3.mode == 'dollhouse') {
  55112. //自己定一个target
  55113. control.target.copy(player$3.model.center);
  55114. this.onRangeChange({
  55115. value: 100
  55116. });
  55117. } else if (player$3.mode == 'floorplan') {
  55118. //自己定一个target
  55119. control.target.setX(player$3.model.center.x);
  55120. control.target.setZ(player$3.model.center.z);
  55121. control.camera.position.setX(player$3.model.center.x); //使角度归零
  55122. control.camera.position.setZ(player$3.model.center.z);
  55123. control.rotateToView(player$3.model.size, player$3.getDirection()); //再旋转
  55124. control.zoomToContain(player$3.model.size);
  55125. }
  55126. }
  55127. }, {
  55128. key: "onRangeChange",
  55129. value: function onRangeChange(res) {
  55130. var _this5 = this;
  55131. //响应滑动条
  55132. //setFovRatio
  55133. this.temp.onRangeChange = res;
  55134. var control = player$3.cameraControls.activeControl;
  55135. var zoomLevel = Math.round(res.value) / 100;
  55136. if (zoomLevel < range.min) {
  55137. zoomLevel = range.min;
  55138. this.eventList.zoomTo(zoomLevel);
  55139. } else if (zoomLevel > range.max) {
  55140. zoomLevel = range.max;
  55141. this.eventList.zoomTo(zoomLevel);
  55142. }
  55143. if (player$3.mode == 'transitioning') {
  55144. return player$3.once('mode.changed', function (fromMode, toMode) {
  55145. if (!_this5.editing) return;
  55146. _this5.onRangeChange(_this5.temp.onRangeChange);
  55147. });
  55148. } else if (player$3.mode == 'panorama') {
  55149. settings$3.zoom.enabled = true;
  55150. player$3.zoomTo(zoomLevel);
  55151. } else if (player$3.mode == 'dollhouse') {
  55152. var disWanted = math$1.linearClamp(zoomLevel, range.min, range.max, Math.max(control.maxDistance / 2, control.minDistance + 3), control.minDistance); //control.minDistance + (control.maxDistance - control.minDistance) * ratio
  55153. control.camera.position.copy(control.target).add(player$3.getDirection().multiplyScalar(-disWanted));
  55154. } else if (player$3.mode == 'floorplan') {
  55155. var absoluteScale = control.getDefaultAbsoluteScale(player$3.model.size); //改
  55156. var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
  55157. var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
  55158. control.absoluteScale = math$1.linearClamp(zoomLevel, range.min, range.max, maxS, minS); // 不按照这个,因范围太大
  55159. //zoomNearLimit: 0.1,
  55160. //zoomFarLimit: 10,
  55161. }
  55162. }
  55163. }, {
  55164. key: "imgAddLabel",
  55165. value: function imgAddLabel(imgsrc, labelImgSrc, labelInfo) {
  55166. //水印
  55167. var img = new Image();
  55168. var labelImg = new Image();
  55169. img.setAttribute('crossOrigin', 'Anonymous');
  55170. labelImg.setAttribute('crossOrigin', 'Anonymous');
  55171. img.src = imgsrc;
  55172. labelImg.src = labelImgSrc;
  55173. var loaded = 0;
  55174. var deferred = Deferred$1();
  55175. img.onload = labelImg.onload = function () {
  55176. loaded++;
  55177. if (loaded == 2) {
  55178. labelInfo.opacity /= 100;
  55179. deferred.resolve(common.imgAddLabel(img, labelImg, labelInfo));
  55180. }
  55181. };
  55182. return deferred.promise();
  55183. }
  55184. }]);
  55185. return Screenshot;
  55186. }(tinyEmitter);
  55187. var Editor = /*#__PURE__*/function () {
  55188. function Editor(app) {
  55189. _classCallCheck(this, Editor);
  55190. this.app = app;
  55191. this.num = this.app.config.num;
  55192. }
  55193. /**
  55194. * 设置当面画面为初始画面
  55195. */
  55196. _createClass(Editor, [{
  55197. key: "setEntry",
  55198. value: function () {
  55199. var _setEntry = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  55200. var payload;
  55201. return regenerator.wrap(function _callee$(_context) {
  55202. while (1) {
  55203. switch (_context.prev = _context.next) {
  55204. case 0:
  55205. payload = {}; // 初始画面截图
  55206. payload.entry = this.app.Camera.getScreenshotInfo();
  55207. _context.next = 4;
  55208. return this.app.Camera.screenshot();
  55209. case 4:
  55210. payload.thumbs = _context.sent;
  55211. // 更新初始点
  55212. this.app.core.get('Scene').firstView.updateByEntry(payload.entry, this.app.core.get('Player').model.panos);
  55213. return _context.abrupt("return", payload);
  55214. case 7:
  55215. case "end":
  55216. return _context.stop();
  55217. }
  55218. }
  55219. }, _callee, this);
  55220. }));
  55221. function setEntry() {
  55222. return _setEntry.apply(this, arguments);
  55223. }
  55224. return setEntry;
  55225. }()
  55226. /**
  55227. * 保存初始画面
  55228. */
  55229. }, {
  55230. key: "saveEntry",
  55231. value: function () {
  55232. var _saveEntry = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
  55233. var thumbFilename,
  55234. data,
  55235. thumbs,
  55236. response,
  55237. _args2 = arguments;
  55238. return regenerator.wrap(function _callee2$(_context2) {
  55239. while (1) {
  55240. switch (_context2.prev = _context2.next) {
  55241. case 0:
  55242. thumbFilename = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : 'thumb-1k.jpg';
  55243. _context2.next = 3;
  55244. return this.setEntry();
  55245. case 3:
  55246. data = _context2.sent;
  55247. thumbs = {
  55248. num: this.num,
  55249. bizType: 'settings-thumb',
  55250. files: data.thumbs.map(function (item) {
  55251. return convertBlob2File(item.data, "thumb-".concat(item.name, ".jpg"));
  55252. })
  55253. };
  55254. response = null;
  55255. _context2.prev = 6;
  55256. _context2.next = 9;
  55257. return this.app.remote_editor.upload_files(thumbs);
  55258. case 9:
  55259. response = _context2.sent;
  55260. _context2.next = 15;
  55261. break;
  55262. case 12:
  55263. _context2.prev = 12;
  55264. _context2.t0 = _context2["catch"](6);
  55265. return _context2.abrupt("return", Promise.reject(_context2.t0));
  55266. case 15:
  55267. if (response.success) {
  55268. _context2.next = 17;
  55269. break;
  55270. }
  55271. return _context2.abrupt("return", Promise.reject(response));
  55272. case 17:
  55273. _context2.prev = 17;
  55274. _context2.next = 20;
  55275. return this.app.remote_editor.saveInitialPage({
  55276. num: this.num,
  55277. fileName: thumbFilename,
  55278. data: JSON.stringify(data.entry)
  55279. });
  55280. case 20:
  55281. response = _context2.sent;
  55282. return _context2.abrupt("return", response);
  55283. case 24:
  55284. _context2.prev = 24;
  55285. _context2.t1 = _context2["catch"](17);
  55286. return _context2.abrupt("return", Promise.reject(_context2.t1));
  55287. case 27:
  55288. case "end":
  55289. return _context2.stop();
  55290. }
  55291. }
  55292. }, _callee2, this, [[6, 12], [17, 24]]);
  55293. }));
  55294. function saveEntry() {
  55295. return _saveEntry.apply(this, arguments);
  55296. }
  55297. return saveEntry;
  55298. }()
  55299. /**
  55300. * 发布
  55301. * @returns
  55302. */
  55303. }, {
  55304. key: "publish",
  55305. value: function () {
  55306. var _publish = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {
  55307. return regenerator.wrap(function _callee3$(_context3) {
  55308. while (1) {
  55309. switch (_context3.prev = _context3.next) {
  55310. case 0:
  55311. _context3.next = 2;
  55312. return this.app.remote_editor.publicScene({
  55313. num: this.num
  55314. });
  55315. case 2:
  55316. return _context3.abrupt("return", _context3.sent);
  55317. case 3:
  55318. case "end":
  55319. return _context3.stop();
  55320. }
  55321. }
  55322. }, _callee3, this);
  55323. }));
  55324. function publish() {
  55325. return _publish.apply(this, arguments);
  55326. }
  55327. return publish;
  55328. }()
  55329. }]);
  55330. return Editor;
  55331. }();
  55332. function _createSuper$q(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$q(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  55333. function _isNativeReflectConstruct$q() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  55334. var Paint = /*#__PURE__*/function (_Emiter) {
  55335. _inherits(Paint, _Emiter);
  55336. var _super = _createSuper$q(Paint);
  55337. function Paint(app) {
  55338. var _this;
  55339. _classCallCheck(this, Paint);
  55340. _this = _super.call(this);
  55341. _this.app = app;
  55342. _this.records = [];
  55343. _this.paints = [];
  55344. _this.isPaint = true;
  55345. _this.isPainting = false;
  55346. _this.isUndo = false;
  55347. _this.role = 'leader';
  55348. _this.colors = {
  55349. leader: '#00c8af',
  55350. follow: '#3A78E7'
  55351. };
  55352. return _this;
  55353. }
  55354. _createClass(Paint, [{
  55355. key: "show",
  55356. value: function show() {
  55357. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  55358. role = _ref.role,
  55359. colors = _ref.colors,
  55360. paint = _ref.paint,
  55361. ele = _ref.ele;
  55362. this.player = this.app.core.get('Player');
  55363. this.$paint = this.elem(ele);
  55364. this.$paint.style.display = '';
  55365. this.isPainting = true;
  55366. this.role = role == 'leader' ? 'leader' : 'follow';
  55367. if (colors) {
  55368. Object.assign(this.colors, colors);
  55369. }
  55370. this.isPaint = paint !== false;
  55371. this.onStart();
  55372. }
  55373. }, {
  55374. key: "hide",
  55375. value: function hide() {
  55376. this.isPainting = false;
  55377. this.isUndo = false;
  55378. this.paints = [];
  55379. this.records = [];
  55380. if (this.$paint) {
  55381. this.$paint.style.display = 'none';
  55382. this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  55383. }
  55384. var currentPano = this.app.core.get('Player').currentPano;
  55385. if (currentPano && currentPano.hasVideo) {
  55386. this.app.core.get('PanoVideoRenderer').activatePanorama(currentPano);
  55387. }
  55388. }
  55389. }, {
  55390. key: "elem",
  55391. value: function elem(ele) {
  55392. var $paint = this.app.$plugins.querySelector('[xui_sync_paint]');
  55393. if ($paint == null) {
  55394. var html = "<div xui_sync_paint style=\"display:none\">\n <canvas></canvas>\n </div>\n <style>\n [xui_sync_paint] {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1000;\n }\n [xui_sync_paint] canvas {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: all;\n }\n </style>\n ";
  55395. if (ele) {
  55396. // 存在ele,则自定义插入到该元素的第一个子节点
  55397. // console.log(document.querySelector(ele))
  55398. document.querySelector(ele).insertAdjacentHTML('afterbegin', html);
  55399. $paint = document.querySelector(ele).querySelector('[xui_sync_paint]');
  55400. } else {
  55401. this.app.$plugins.insertAdjacentHTML('beforeend', html);
  55402. $paint = this.app.$plugins.querySelector('[xui_sync_paint]');
  55403. }
  55404. this.bind($paint);
  55405. }
  55406. return $paint;
  55407. }
  55408. }, {
  55409. key: "bind",
  55410. value: function bind($paint) {
  55411. var _this2 = this;
  55412. var touch;
  55413. this.mouse = new THREE.Vector2();
  55414. this.canvas = $paint.querySelector('canvas');
  55415. this.context = this.canvas.getContext('2d');
  55416. this.canvas.onmousedown = function (e) {
  55417. if (!_this2.isPaint) {
  55418. return;
  55419. }
  55420. e.preventDefault();
  55421. _this2.beginStroke({
  55422. x: e.clientX,
  55423. y: e.clientY
  55424. });
  55425. };
  55426. this.canvas.onmouseup = function (e) {
  55427. if (!_this2.isPaint) {
  55428. return;
  55429. }
  55430. e.preventDefault();
  55431. _this2.endStroke();
  55432. };
  55433. this.canvas.onmousemove = function (e) {
  55434. if (!_this2.isPaint) {
  55435. return;
  55436. }
  55437. e.preventDefault();
  55438. if (_this2._mouseDown) {
  55439. _this2.moveStroke({
  55440. x: e.clientX,
  55441. y: e.clientY
  55442. });
  55443. }
  55444. }; // 移动端触控
  55445. this.canvas.addEventListener('touchstart', function (e) {
  55446. if (!_this2.isPaint) {
  55447. return;
  55448. }
  55449. e.preventDefault();
  55450. touch = e.touches[0];
  55451. _this2.beginStroke({
  55452. x: touch.pageX,
  55453. y: touch.pageY
  55454. });
  55455. });
  55456. this.canvas.addEventListener('touchmove', function (e) {
  55457. if (!_this2.isPaint) {
  55458. return;
  55459. }
  55460. e.preventDefault();
  55461. if (_this2._mouseDown) {
  55462. touch = e.touches[0];
  55463. _this2.moveStroke({
  55464. x: touch.pageX,
  55465. y: touch.pageY
  55466. });
  55467. }
  55468. });
  55469. this.canvas.addEventListener('touchend', function (e) {
  55470. if (!_this2.isPaint) {
  55471. return;
  55472. }
  55473. e.preventDefault();
  55474. _this2.endStroke();
  55475. });
  55476. }
  55477. }, {
  55478. key: "onStart",
  55479. value: function onStart() {
  55480. var dpr = window.devicePixelRatio || 1;
  55481. var rect = this.canvas.getBoundingClientRect();
  55482. this.ratio = 1; // window.innerWidth / 375;
  55483. this.canvas.width = rect.width * dpr;
  55484. this.canvas.height = rect.height * dpr;
  55485. this.context.scale(dpr, dpr);
  55486. this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  55487. this._endTime = 0;
  55488. this._mouseDown = false;
  55489. this._lastTimestamp = 0;
  55490. this._lastLineWidth = -1;
  55491. this._lastPosition = {
  55492. x: 0,
  55493. y: 0
  55494. };
  55495. math$1.convertScreenPositionToNDC(0, 0, this.mouse, this.app.dom); //取屏幕中点
  55496. var intersect = convertTool.getMouseIntersect(this.player.camera, [this.player.model.skybox], this.mouse);
  55497. this.placeIntersectPlane(intersect && intersect.point);
  55498. }
  55499. }, {
  55500. key: "onRecord",
  55501. value: function onRecord(data) {
  55502. this.transformTo3d(data);
  55503. this.records.push(data);
  55504. this.emit('data', {
  55505. type: 'paint',
  55506. data
  55507. });
  55508. }
  55509. }, {
  55510. key: "beginStroke",
  55511. value: function beginStroke(point) {
  55512. this._mouseDown = true;
  55513. this._lastTimestamp = Date.now();
  55514. this._lastPosition = this.windowToCanvas(point.x, point.y);
  55515. this.paints.push({
  55516. width: 0,
  55517. x: this._lastPosition.x,
  55518. y: this._lastPosition.y,
  55519. t: 5 //this._lastTimestamp - this._endTime
  55520. });
  55521. }
  55522. }, {
  55523. key: "moveStroke",
  55524. value: function moveStroke(point) {
  55525. var timestamp = Date.now();
  55526. var position = this.windowToCanvas(point.x, point.y);
  55527. var s = this.calcDistance(position, this._lastPosition);
  55528. var t = timestamp - this._lastTimestamp;
  55529. var lineWidth = this.calcLineWidth(t, s); //draw
  55530. this.context.beginPath();
  55531. this.context.moveTo(this._lastPosition.x, this._lastPosition.y);
  55532. this.context.lineTo(position.x, position.y);
  55533. this.paints.push({
  55534. color: this.colors[this.role] || '#00c8af',
  55535. width: lineWidth,
  55536. x: position.x,
  55537. y: position.y,
  55538. t: 5 //t
  55539. });
  55540. this.context.strokeStyle = this.colors[this.role] || '#00c8af';
  55541. this.context.lineWidth = lineWidth;
  55542. this.context.lineCap = 'round';
  55543. this.context.linJoin = 'round';
  55544. this.context.stroke(); //每次过程结束时,将结束值赋给初始值,一直延续
  55545. this._lastPosition = position;
  55546. this._lastTimestamp = timestamp;
  55547. this._lastLineWidth = lineWidth;
  55548. }
  55549. }, {
  55550. key: "endStroke",
  55551. value: function endStroke() {
  55552. this.paints.push({
  55553. width: 0,
  55554. x: this._lastPosition.x,
  55555. y: this._lastPosition.y,
  55556. t: 0
  55557. });
  55558. this.onRecord(this.paints);
  55559. this.paints = [];
  55560. this.isUndo = true;
  55561. this._mouseDown = false;
  55562. this._lastTimestamp = 0;
  55563. this._endTime = Date.now();
  55564. }
  55565. }, {
  55566. key: "calcDistance",
  55567. value: function calcDistance(pos1, pos2) {
  55568. return Math.sqrt((pos1.x - pos2.x) * (pos1.x - pos2.x) + (pos1.y - pos2.y) * (pos1.y - pos2.y)); //通过起始结束坐标x,y值计算路程长度
  55569. }
  55570. }, {
  55571. key: "calcLineWidth",
  55572. value: function calcLineWidth(t, s) {
  55573. var v = s / t;
  55574. var resultLineWidth;
  55575. if (v <= 0.1) {
  55576. resultLineWidth = 6;
  55577. } else if (v >= 3) {
  55578. resultLineWidth = 2;
  55579. } else {
  55580. resultLineWidth = 6 - (v - 0.1) / (3 - 0.1) * (6 - 4);
  55581. }
  55582. if (this._lastLineWidth == -1) {
  55583. return resultLineWidth;
  55584. }
  55585. return this._lastLineWidth * 2 / 3 + resultLineWidth * 1 / 3;
  55586. }
  55587. }, {
  55588. key: "windowToCanvas",
  55589. value: function windowToCanvas(x, y) {
  55590. var bbox = this.canvas.getBoundingClientRect(); //获取canvas的位置信息
  55591. return {
  55592. x: Math.round(x - bbox.left),
  55593. y: Math.round(y - bbox.top)
  55594. }; //返回当前鼠标相对于canvas的位置
  55595. }
  55596. }, {
  55597. key: "placeIntersectPlane",
  55598. value: function placeIntersectPlane(pos) {
  55599. //用于判断mesh拖拽移动距离的平面 需要和视线垂直,以保证遮住视野范围
  55600. if (!this.intersectPlane) {
  55601. var geo = new THREE.PlaneGeometry(8000, 80000, 1, 1); //var geo = new THREE.PlaneGeometry(3,3,1,1);
  55602. this.intersectPlane = new THREE.Mesh(geo, new THREE.MeshBasicMaterial({
  55603. transparent: true,
  55604. wireframe: false,
  55605. opacity: 0,
  55606. side: THREE.DoubleSide,
  55607. depthTest: false
  55608. }));
  55609. this.intersectPlane.lookAt(new THREE.Vector3(0, 1, 0));
  55610. this.intersectPlane.name = 'intersectPlane';
  55611. this.player.model.add(this.intersectPlane);
  55612. }
  55613. if (pos) {
  55614. this.intersectPlane.position.copy(pos);
  55615. var cameraDir = this.player.getDirection(null, this.player.camera); //向里
  55616. this.intersectPlane.lookAt(pos.clone().add(cameraDir)); //看向相机
  55617. }
  55618. }
  55619. /**
  55620. * 2d数据转3d数据
  55621. */
  55622. }, {
  55623. key: "transformTo3d",
  55624. value: function transformTo3d(paints) {
  55625. var _this3 = this;
  55626. if (paints.length == 0) {
  55627. return;
  55628. }
  55629. paints.forEach(function (item) {
  55630. math$1.convertScreenPositionToNDC(item.x, item.y, _this3.mouse, _this3.app.dom);
  55631. var intersect = convertTool.getMouseIntersect(_this3.player.camera, [_this3.intersectPlane], _this3.mouse);
  55632. if (!intersect) {
  55633. console.error('no intersect ??');
  55634. } else {
  55635. item.pos3d = intersect.point;
  55636. }
  55637. });
  55638. }
  55639. /**
  55640. * 3d数据转2d数据
  55641. */
  55642. }, {
  55643. key: "transformTo2d",
  55644. value: function transformTo2d(paints) {
  55645. var _this4 = this;
  55646. paints.forEach(function (item) {
  55647. var pos3d = new THREE.Vector3(item.pos3d.x, item.pos3d.y, item.pos3d.z);
  55648. var pos2d = convertTool.getPos2d(pos3d, _this4.player, _this4.player.camera);
  55649. item.x = pos2d.pos.x;
  55650. item.y = pos2d.pos.y;
  55651. });
  55652. }
  55653. }, {
  55654. key: "undo",
  55655. value: function undo() {
  55656. this.records.pop();
  55657. this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  55658. for (var i = 0; i < this.records.length; i++) {
  55659. this.paint(this.records[i], 0);
  55660. }
  55661. this.emit('data', {
  55662. type: 'undo'
  55663. });
  55664. }
  55665. }, {
  55666. key: "paint",
  55667. value: function paint(data) {
  55668. var _this5 = this;
  55669. var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;
  55670. var _loop = function _loop(i) {
  55671. if (delay) {
  55672. if (data[i].t) {
  55673. setTimeout(function () {
  55674. _this5.context.beginPath();
  55675. _this5.context.strokeStyle = data[i].color;
  55676. _this5.context.moveTo(data[i].x * _this5.ratio, data[i].y * _this5.ratio);
  55677. _this5.context.lineTo(data[i + 1].x * _this5.ratio, data[i + 1].y * _this5.ratio);
  55678. _this5.context.lineWidth = data[i].width * _this5.ratio;
  55679. _this5.context.lineCap = 'round';
  55680. _this5.context.linJoin = 'round';
  55681. _this5.context.stroke();
  55682. }, delay);
  55683. }
  55684. } else {
  55685. if (data[i].t) {
  55686. _this5.context.beginPath();
  55687. _this5.context.strokeStyle = data[i].color;
  55688. _this5.context.moveTo(data[i].x * _this5.ratio, data[i].y * _this5.ratio);
  55689. _this5.context.lineTo(data[i + 1].x * _this5.ratio, data[i + 1].y * _this5.ratio);
  55690. _this5.context.lineWidth = data[i].width * _this5.ratio;
  55691. _this5.context.lineCap = 'round';
  55692. _this5.context.linJoin = 'round';
  55693. _this5.context.stroke();
  55694. }
  55695. }
  55696. };
  55697. for (var i = 0; i < data.length - 1; i++) {
  55698. _loop(i);
  55699. }
  55700. }
  55701. }, {
  55702. key: "receive",
  55703. value: function receive(data) {
  55704. if (data.type == 'undo') {
  55705. this.records.pop();
  55706. this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  55707. for (var i = 0; i < this.records.length; i++) {
  55708. this.paint(this.records[i], 0);
  55709. }
  55710. } else {
  55711. this.transformTo2d(data.data);
  55712. this.paint(data.data);
  55713. this.records.push(data.data);
  55714. }
  55715. }
  55716. }]);
  55717. return Paint;
  55718. }(tinyEmitter);
  55719. function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
  55720. function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty$1(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
  55721. function _createSuper$p(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$p(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  55722. function _isNativeReflectConstruct$p() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  55723. var ScreenEvents = {
  55724. Move: 'move',
  55725. Rotate: 'rotate',
  55726. Zoom: 'zoom',
  55727. EndRotation: 'endRotation',
  55728. MoveModel: 'moveModel',
  55729. MoveComplete: 'move.complete',
  55730. ModeChanged: 'mode.changed',
  55731. ModeChanging: 'mode.changing',
  55732. PanoChosen: 'pano.chosen',
  55733. ClosestPanoChanging: 'closest.pano.changing',
  55734. WarpStarted: 'warp.started',
  55735. WarpInterrupted: 'warp.interrupted',
  55736. WarpEnded: 'warp.ended',
  55737. FlyinFinished: 'flyin.finished',
  55738. FlyingStarted: 'flying.started',
  55739. FlyingInterrupted: 'flying.interrupted',
  55740. FlyingEnded: 'flying.ended',
  55741. Ready: 'ready',
  55742. StartInside: 'start.inside',
  55743. StartOutside: 'start.outside',
  55744. ViewChanged: 'view.changed',
  55745. WarpInterruptedWithFlyTo: 'warp.interrupted.flyto',
  55746. InputStart: 'input.start'
  55747. };
  55748. var index = 0;
  55749. var Screen = /*#__PURE__*/function (_Emiter) {
  55750. _inherits(Screen, _Emiter);
  55751. var _super = _createSuper$p(Screen);
  55752. function Screen(app) {
  55753. var _this;
  55754. _classCallCheck(this, Screen);
  55755. _this = _super.call(this);
  55756. _this.index = index++;
  55757. _this.app = app;
  55758. _this.inited = false;
  55759. _this.started = false;
  55760. return _this;
  55761. }
  55762. /**
  55763. * 初始化,这里是否需要这么写,还是直接在业务使用Camera事件
  55764. */
  55765. _createClass(Screen, [{
  55766. key: "init",
  55767. value: function init() {
  55768. var _this2 = this;
  55769. this.inited = true;
  55770. var player = this.app.core.get('Player');
  55771. if (this.role == 'leader' || !this.role) {
  55772. this.app.Camera.on(ScreenEvents.FlyingStarted, function (params) {
  55773. return _this2.emitData(params);
  55774. });
  55775. this.app.Camera.on(ScreenEvents.Zoom, function (params) {
  55776. return _this2.emitData(params);
  55777. });
  55778. this.app.Camera.on(ScreenEvents.MoveModel, function (params) {
  55779. return _this2.emitData(params);
  55780. });
  55781. player.viewLinkManager.addEventListener('loaded', function () {
  55782. if (_this2.started) {
  55783. //this.app.core.get('Player').viewLinkManager.setViewsVisible('url', false)
  55784. player.viewLinkManager.hideAllViews();
  55785. }
  55786. });
  55787. var _interval;
  55788. this.app.Camera.on(ScreenEvents.Rotate, function (params) {
  55789. _this2.emitData(params);
  55790. clearTimeout(_interval);
  55791. _interval = null;
  55792. });
  55793. this.app.Camera.on(ScreenEvents.EndRotation, function (params) {
  55794. _this2.emitData(params);
  55795. if (_this2.role == 'leader') {
  55796. //xzw add 旋转完后,每隔一段时间发送一下当前朝向
  55797. var count = 0,
  55798. deltaTime = 20;
  55799. _interval = function interval() {
  55800. _this2.emitData({
  55801. type: 'syncRotContinue',
  55802. quaternion: player.quaternion
  55803. });
  55804. if (count++ < 10 && _interval && player.mode == 'panorama') {
  55805. setTimeout(_interval, deltaTime += 20);
  55806. }
  55807. };
  55808. setTimeout(_interval, deltaTime);
  55809. }
  55810. });
  55811. }
  55812. if (this.role == 'follow') {
  55813. //被带看
  55814. this.app.Camera.on(ScreenEvents.FlyingEnded, this.requestSync.bind(this)); //player.on('flytopano.rotateEnd', requestSync)
  55815. }
  55816. }
  55817. /**
  55818. * 开始同步
  55819. */
  55820. }, {
  55821. key: "start",
  55822. value: function start() {
  55823. this.started = true;
  55824. if (this.inited) {
  55825. return;
  55826. }
  55827. this.init();
  55828. this.app.core.get('Player').setPanoTaskEnable(false); //this.app.core.get('Player').cameraControls.controls.panorama.speed = 0.1
  55829. if (this.app.configSync) ; else {
  55830. this.app.VRScreenSYNC = true;
  55831. settings$3.zoom.enabled = false;
  55832. } // 隐藏全景关联
  55833. if (this.app.core.get('Player').viewLinkManager.loaded) {
  55834. this.app.core.get('Player').viewLinkManager.hideAllViews();
  55835. }
  55836. }
  55837. /**
  55838. * 退出
  55839. */
  55840. }, {
  55841. key: "exit",
  55842. value: function exit() {
  55843. this.started = false;
  55844. this.app.core.get('Player').setPanoTaskEnable(true);
  55845. this.app.core.get('Player').locked = false; //this.app.core.get('Player').cameraControls.controls.panorama.speed = 1
  55846. this.app.VRScreenSYNC = false;
  55847. settings$3.zoom.enabled = true; // 显示全景关联
  55848. if (this.app.core.get('Player').viewLinkManager.loaded) {
  55849. this.app.core.get('Player').viewLinkManager.showAllViews();
  55850. }
  55851. }
  55852. /**
  55853. * 同步视角
  55854. */
  55855. }, {
  55856. key: "sync",
  55857. value: function sync() {
  55858. var player = this.app.core.get('Player');
  55859. var mode = player.modeTran.split('-')[1]; //console.log('同步画面',mode)
  55860. if (mode === Viewmode$1.PANORAMA) {
  55861. var panoId = null;
  55862. if (player.mode == Viewmode$1.PANORAMA && player.nextPano != void 0) {
  55863. //正在flytoPano
  55864. panoId = player.nextPano.id;
  55865. } else if (player.currentPano) {
  55866. panoId = player.currentPano.id;
  55867. } //console.log('panoId', panoId)
  55868. this.emitData({
  55869. panoId: panoId,
  55870. //leader
  55871. quaternion: player.quaternion,
  55872. mode,
  55873. type: 'flyToPano'
  55874. });
  55875. } else {
  55876. var data = {
  55877. quaternion: player.quaternion,
  55878. position: player.position,
  55879. currentScale: player.cameraControls.controls.floorplan.currentScale,
  55880. mode,
  55881. type: 'flyToNewMode'
  55882. };
  55883. if (player.cameraControls.activeControl) {
  55884. data.target = {
  55885. x: player.cameraControls.activeControl.target.x,
  55886. y: player.cameraControls.activeControl.target.y,
  55887. z: player.cameraControls.activeControl.target.z
  55888. };
  55889. }
  55890. this.emitData(data);
  55891. }
  55892. }
  55893. }, {
  55894. key: "requestSync",
  55895. value: function requestSync(params) {
  55896. var _this3 = this;
  55897. setTimeout(function () {
  55898. //console.log('requestSync')
  55899. _this3.emitData({
  55900. //飞完后请求同步一下,因为可能在飞期间leader又改变了
  55901. type: 'requestSync'
  55902. });
  55903. }, 1); //可能panosTaskList还没清空所以延迟
  55904. }
  55905. }, {
  55906. key: "emitData",
  55907. value: function emitData(params) {
  55908. // 防止无限循环
  55909. var player = this.app.core.get('Player'); //console.warn(this.index, params, player.syncType)
  55910. if (player.syncType == 'receive') {
  55911. player.syncType = null;
  55912. return;
  55913. }
  55914. if (!this.started
  55915. /* || this.role == 'follow' */
  55916. ) {
  55917. return;
  55918. }
  55919. if (params) {
  55920. for (var key in params) {
  55921. var value = params[key];
  55922. if (value instanceof THREE.Vector2) {
  55923. params[key] = new THREE.Vector2(value.x, value.y);
  55924. } else if (value instanceof THREE.Vector3) {
  55925. params[key] = new THREE.Vector3(value.x, value.y, value.z);
  55926. }
  55927. }
  55928. }
  55929. this.emit('data', _objectSpread$2({}, params));
  55930. }
  55931. /**
  55932. * 数据转换
  55933. * @param {Object} data
  55934. */
  55935. }, {
  55936. key: "transform",
  55937. value: function transform(data) {
  55938. if (data.target && data.target instanceof THREE.Vector3 === false) {
  55939. data.target = new THREE.Vector3(data.target.x, data.target.y, data.target.z);
  55940. }
  55941. if (data.position && data.position instanceof THREE.Vector3 === false) {
  55942. data.position = new THREE.Vector3(data.position.x, data.position.y, data.position.z);
  55943. }
  55944. if (data.quaternion && data.quaternion instanceof THREE.Quaternion === false) {
  55945. if (data.quaternion.hasOwnProperty('_x')) {
  55946. data.quaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  55947. } else {
  55948. data.quaternion = new THREE.Quaternion(data.quaternion.x, data.quaternion.y, data.quaternion.z, data.quaternion.w);
  55949. }
  55950. }
  55951. if (data.rotationSpeed && data.rotationSpeed instanceof THREE.Vector2 === false) {
  55952. data.rotationSpeed = new THREE.Vector2(data.rotationSpeed.x, data.rotationSpeed.y);
  55953. }
  55954. if (data.info) {
  55955. this.transform(data.info);
  55956. }
  55957. if (data.modelInfo) {
  55958. this.transform(data.modelInfo);
  55959. }
  55960. }
  55961. }]);
  55962. return Screen;
  55963. }(tinyEmitter);
  55964. function _createSuper$o(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$o(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  55965. function _isNativeReflectConstruct$o() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  55966. /**
  55967. * 同屏带看
  55968. */
  55969. var SyncScreen = /*#__PURE__*/function (_Screen) {
  55970. _inherits(SyncScreen, _Screen);
  55971. var _super = _createSuper$o(SyncScreen);
  55972. function SyncScreen(app) {
  55973. var _this;
  55974. _classCallCheck(this, SyncScreen);
  55975. _this = _super.call(this, app);
  55976. _this.toSame = function (data, player, func) {
  55977. if (data.mode == player.mode) {
  55978. //漫游模式情况下,还需要考虑当前漫游点是否对的上
  55979. if (data.mode == Viewmode$1.PANORAMA) {
  55980. if (data.currentPanoId == player.currentPano.id) {
  55981. return true;
  55982. } else {
  55983. var targetPano = player.model.panos.index[parseInt(data.currentPanoId)];
  55984. player.flyToPano({
  55985. pano: targetPano
  55986. }, func);
  55987. return false;
  55988. }
  55989. } else {
  55990. return true;
  55991. }
  55992. } else {
  55993. // console.log('mode:' + player.mode)
  55994. if (player.mode == Viewmode$1.TRANSITIONING) {
  55995. return null;
  55996. }
  55997. if (data.mode == Viewmode$1.FLOORPLAN) {
  55998. player.flyToNewMode({
  55999. mode: Viewmode$1.FLOORPLAN,
  56000. callback: func
  56001. });
  56002. return false;
  56003. } else if (data.mode == Viewmode$1.DOLLHOUSE) {
  56004. player.flyToNewMode({
  56005. mode: Viewmode$1.DOLLHOUSE,
  56006. target: data.info.target,
  56007. position: data.info.position,
  56008. quaternion: data.info.quaternion ? new THREE.Quaternion().set(data.info.quaternion._x, data.info.quaternion._y, data.info.quaternion._z, data.info.quaternion._w) : null,
  56009. panoId: null,
  56010. callback: func
  56011. });
  56012. return false;
  56013. }
  56014. return true;
  56015. }
  56016. };
  56017. _this.syncRotate = function (data, player) {
  56018. //漫游模式下的旋转同步
  56019. //player.cameraControls.activeControl.lockedForce = true
  56020. var quaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w); //注意不能直接赋值quaternion,因为手机上fov不一样,上下角度有限制,会导致角度闪烁。
  56021. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(player.cameraControls.activeControl.camera.position);
  56022. player.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
  56023. };
  56024. _this.copyCameraProp = function (player, info) {
  56025. //复制录屏的数据给camera或control
  56026. //options = options || {}
  56027. var ctrl = player.cameraControls.activeControl;
  56028. var camera = ctrl.camera;
  56029. if (info.position) {
  56030. camera.position.copy(info.position);
  56031. } // else{
  56032. // camera.position.copy(this.currentPano.position);//fly in时需要赋值
  56033. // }
  56034. if (info.quaternion) {
  56035. /*
  56036. if(options.transitionQua){//需要渐变quaternion
  56037. var _qua = new THREE.Quaternion().set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
  56038. this.setQuaternionTransition(_qua)
  56039. }else{
  56040. camera.quaternion.set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
  56041. this.setQuaternionTransition(null)//当需要瞬间变化时终止渐变
  56042. }
  56043. //camera.quaternion.copy(item.qua);
  56044. */
  56045. camera.quaternion.set(info.quaternion._x, info.quaternion._y, info.quaternion._z, info.quaternion._w);
  56046. } //if(item.zoomLevel) this.zoomTo(item.zoomLevel)
  56047. info.target && ctrl.target.copy(info.target); //outside 其实只要最后一针较真就好(防止位移) ,但是麻烦所以。。
  56048. //俯视图情况
  56049. if (info.scale) {
  56050. ctrl.absoluteScale = info.scale;
  56051. ctrl.updateZoom();
  56052. } // if(item.zoom){//floorplan
  56053. // ctrl.currentScale = MathLight.convertWorkshopOrthoZoom(item.zoom), //根据屏幕适应性缩放
  56054. // ctrl.absoluteScale = ctrl.currentScale;
  56055. // ctrl.offset.copy(camera.position).sub(ctrl.target);//offset才是决定此时camera转向的关键
  56056. // ctrl.updateZoom()
  56057. // }
  56058. //console.log("copyCameraProp")
  56059. };
  56060. return _this;
  56061. }
  56062. /**
  56063. * 接收同步数据
  56064. * @param {*} data
  56065. */
  56066. _createClass(SyncScreen, [{
  56067. key: "receive",
  56068. value: function receive(data) {
  56069. // console.log('接受')
  56070. var player = this.app.core.get('Player');
  56071. var flag = true;
  56072. this.transform(data);
  56073. switch (data.type) {
  56074. case 'flyToPano':
  56075. // console.log('漫游')
  56076. player.syncType = 'receive';
  56077. var targetPano = player.model.panos.index[parseInt(data.panoId)];
  56078. var target = {};
  56079. target.pano = targetPano;
  56080. if (data.quaternion) {
  56081. target.quaternion = new THREE.Quaternion().set(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  56082. }
  56083. player.flyToPano(target);
  56084. break;
  56085. case 'flyToNewMode':
  56086. // console.log('飞入飞出')
  56087. player.syncType = 'receive';
  56088. if (data && data.panoId) {
  56089. data.pano = player.model.panos.index[parseInt(data.panoId)];
  56090. }
  56091. if (player.model.mode == 'panorama' && this.app.configSync) {
  56092. // 变为单屏
  56093. this.app.dom.parentElement.style.width = '100%';
  56094. this.app.configSync.dom.style.width = '0';
  56095. this.app.dom.parentElement.style.height = '100%';
  56096. this.app.configSync.dom.style.height = '0';
  56097. }
  56098. setTimeout(function () {
  56099. return player.flyToNewMode(data);
  56100. }, 50);
  56101. break;
  56102. case 'rotate':
  56103. //console.log('旋转')
  56104. if (player.model.mode == Viewmode$1.PANORAMA) {
  56105. flag = this.toSame(data, player, function () {
  56106. this.syncRotate(data, player);
  56107. }.bind(this));
  56108. if (flag) {
  56109. this.syncRotate(data, player);
  56110. }
  56111. }
  56112. break;
  56113. case 'endRotation':
  56114. //console.log('停止旋转')
  56115. if (player.cameraControls && player.cameraControls.activeControl) {
  56116. player.cameraControls.activeControl.lockedForce = false; //console.log('endRotation:' + JSON.stringify(data.rotationSpeed))
  56117. player.cameraControls.activeControl.rotationSpeed = data.rotationSpeed || new THREE.Vector2();
  56118. }
  56119. break;
  56120. case 'zoom':
  56121. // console.log('缩放')
  56122. /*player.syncType = 'receive'
  56123. flag = this.toSame(
  56124. data,
  56125. player,
  56126. function () {
  56127. player.handleControlScroll(data.zoom,true)
  56128. }.bind(this)
  56129. )
  56130. if (flag == null) {
  56131. //正在过渡
  56132. } else if (flag) {
  56133. player.handleControlScroll(data.zoom,true)
  56134. }*/
  56135. player.zoomTo(data.zoomLevel);
  56136. break;
  56137. case 'moveModel':
  56138. // console.log('移动模型')
  56139. flag = this.toSame(data, player, function () {
  56140. this.copyCameraProp(player, data.info);
  56141. }.bind(this));
  56142. if (flag == null) ; else if (flag) {
  56143. this.copyCameraProp(player, data.info);
  56144. }
  56145. break;
  56146. }
  56147. } //初始情况,可能两者状态不一致,这时候需要调整一致
  56148. //通过data里的元素与player进行比较来判断
  56149. }]);
  56150. return SyncScreen;
  56151. }(Screen);
  56152. function _createSuper$n(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$n(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  56153. function _isNativeReflectConstruct$n() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  56154. /**
  56155. * 一起逛
  56156. */
  56157. var FollowScreen = /*#__PURE__*/function (_Screen) {
  56158. _inherits(FollowScreen, _Screen);
  56159. var _super = _createSuper$n(FollowScreen);
  56160. function FollowScreen(app) {
  56161. var _this;
  56162. _classCallCheck(this, FollowScreen);
  56163. _this = _super.call(this, app);
  56164. _this.toSame = function (data, player, func) {
  56165. if (data.mode == player.mode) {
  56166. //漫游模式情况下,还需要考虑当前漫游点是否对的上
  56167. if (data.mode == Viewmode$1.PANORAMA) {
  56168. if (data.currentPanoId == player.currentPano.id) {
  56169. return true;
  56170. } else {
  56171. var targetPano = player.model.panos.index[parseInt(data.currentPanoId)];
  56172. var oldLock = player.locked;
  56173. player.locked = false;
  56174. player.flyToPano({
  56175. pano: targetPano
  56176. }, func);
  56177. player.locked = oldLock;
  56178. return false;
  56179. }
  56180. } else {
  56181. return true;
  56182. }
  56183. } else {
  56184. //console.log('mode:' + player.mode)
  56185. if (player.mode == Viewmode$1.TRANSITIONING) {
  56186. return null;
  56187. }
  56188. if (data.mode == Viewmode$1.FLOORPLAN) {
  56189. player.flyToNewMode({
  56190. mode: Viewmode$1.FLOORPLAN,
  56191. callback: func
  56192. });
  56193. return false;
  56194. } else if (data.mode == Viewmode$1.DOLLHOUSE) {
  56195. player.flyToNewMode({
  56196. mode: Viewmode$1.DOLLHOUSE,
  56197. target: data.info.target,
  56198. position: data.info.position,
  56199. quaternion: data.info.quaternion ? new THREE.Quaternion().set(data.info.quaternion._x, data.info.quaternion._y, data.info.quaternion._z, data.info.quaternion._w) : null,
  56200. panoId: null,
  56201. callback: func
  56202. });
  56203. return false;
  56204. }
  56205. return true;
  56206. }
  56207. };
  56208. _this.syncRotate = function (data, player) {
  56209. //漫游模式下的旋转同步
  56210. this.stopLerpQua(player);
  56211. this.pauseSyncRot = false;
  56212. var quaternion = player.cameraControls.activeControl.camera.quaternion.clone();
  56213. var endQuaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w); //注意不能直接赋值quaternion,因为手机上fov不一样,上下角度有限制,会导致角度闪烁。
  56214. this.endQuaternion = endQuaternion; //目标朝向
  56215. var time = Date.now();
  56216. if (time - this.lastUpdateTime > 100) {
  56217. //主控端开始拖拽,客户端和主控端位置有偏差(操作过快导致syncRotate2没有校对完),为了防止旋转突变,采用渐变。
  56218. this.lerpRatio = 0.1;
  56219. } else {
  56220. this.lerpRatio += 0.15;
  56221. this.lerpRatio = Math.min(1, this.lerpRatio);
  56222. } //console.log('this.lerpRatio',this.lerpRatio)
  56223. lerp.quaternion(quaternion, endQuaternion)(this.lerpRatio);
  56224. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(player.cameraControls.activeControl.camera.position);
  56225. player.cameraControls.activeControl.lookAt(lookAtPoint) //更新一下lat和lon
  56226. ;
  56227. player.cameraControls.activeControl.locked = false, player.cameraControls.activeControl.update(0);
  56228. player.cameraControls.activeControl.lockedForce = true; //禁止移动
  56229. this.lastUpdateTime = time;
  56230. };
  56231. _this.copyCameraProp = function (player, info) {
  56232. //复制录屏的数据给camera或control
  56233. //options = options || {}
  56234. var ctrl = player.cameraControls.activeControl;
  56235. var camera = ctrl.camera;
  56236. if (info.position) {
  56237. camera.position.copy(info.position);
  56238. } // else{
  56239. // camera.position.copy(this.currentPano.position);//fly in时需要赋值
  56240. // }
  56241. if (info.quaternion) {
  56242. /*
  56243. if(options.transitionQua){//需要渐变quaternion
  56244. var _qua = new THREE.Quaternion().set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
  56245. this.setQuaternionTransition(_qua)
  56246. }else{
  56247. camera.quaternion.set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
  56248. this.setQuaternionTransition(null)//当需要瞬间变化时终止渐变
  56249. }
  56250. //camera.quaternion.copy(item.qua);
  56251. */
  56252. camera.quaternion.set(info.quaternion._x, info.quaternion._y, info.quaternion._z, info.quaternion._w);
  56253. } //if(item.zoomLevel) this.zoomTo(item.zoomLevel)
  56254. info.target && ctrl.target.copy(info.target); //outside 其实只要最后一针较真就好(防止位移) ,但是麻烦所以。。
  56255. //console.log('同屏数据', info)
  56256. //俯视图情况
  56257. if (info.scale) {
  56258. ctrl.absoluteScale = info.scale;
  56259. ctrl.updateZoom();
  56260. } // if(item.zoom){//floorplan
  56261. // ctrl.currentScale = MathLight.convertWorkshopOrthoZoom(item.zoom), //根据屏幕适应性缩放
  56262. // ctrl.absoluteScale = ctrl.currentScale;
  56263. // ctrl.offset.copy(camera.position).sub(ctrl.target);//offset才是决定此时camera转向的关键
  56264. // ctrl.updateZoom()
  56265. // }
  56266. //console.log("copyCameraProp")
  56267. };
  56268. _this.role = 'leader';
  56269. _this.lastUpdateTime = 0;
  56270. _this.lerpRatio = 1;
  56271. return _this;
  56272. }
  56273. _createClass(FollowScreen, [{
  56274. key: "start",
  56275. value: function start() {
  56276. var _this2 = this;
  56277. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  56278. this.role = options.follow ? 'follow' : 'leader';
  56279. _get(_getPrototypeOf(FollowScreen.prototype), "start", this).call(this);
  56280. if (options.follow) {
  56281. var player = this.app.core.get('Player');
  56282. player.locked = true;
  56283. if (!this.inited) {
  56284. player.on(PlayerEvents.Rotate, function (params) {
  56285. //客户端滑动屏幕,暂停被保持同步,直到主控端又对屏幕进行操作
  56286. _this2.pauseSyncRot = true;
  56287. _this2.stopLerpQua(player);
  56288. });
  56289. this.inited = true;
  56290. }
  56291. }
  56292. }
  56293. }, {
  56294. key: "exit",
  56295. value: function exit() {
  56296. _get(_getPrototypeOf(FollowScreen.prototype), "exit", this).call(this);
  56297. this.role = 'leader';
  56298. var player = this.app.core.get('Player');
  56299. if (player.locked) {
  56300. player.locked = false;
  56301. }
  56302. }
  56303. /**
  56304. * 接收同步数据
  56305. * @param {*} data
  56306. */
  56307. }, {
  56308. key: "receive",
  56309. value: function receive(data) {
  56310. var _this3 = this;
  56311. var player = this.app.core.get('Player');
  56312. var flag = true;
  56313. this.transform(data);
  56314. if (this.role == 'leader') {
  56315. switch (data.type) {
  56316. case 'requestSync':
  56317. this.sync();
  56318. }
  56319. } else {
  56320. switch (data.type) {
  56321. case 'flyToPano':
  56322. if (player.panosTaskList.length > 0) {
  56323. //console.log('因panosTaskList延迟')
  56324. return setTimeout(function () {
  56325. //之后不一定会触发 flying.ended 故用setTimeout
  56326. _this3.requestSync(); //直接请求同步,因为可能有变动所以不能直接使用旧消息
  56327. }, 500);
  56328. } //console.log('flyToPano ', data.panoId )
  56329. var targetPano = player.model.panos.index[parseInt(data.panoId)];
  56330. player.locked = false;
  56331. var target = {
  56332. pano: targetPano
  56333. };
  56334. if (data.quaternion) {
  56335. target.quaternion = new THREE.Quaternion().set(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  56336. }
  56337. if (player.mode == 'panorama' && player.currentPano.id == data.panoId) {
  56338. //如果在当前点位,迅速转向,否则容易使panosTaskList.length非0而无法飞向下一点
  56339. target.aimDuration = 0;
  56340. }
  56341. player.flyToPano(target, function () {
  56342. player.locked = true;
  56343. });
  56344. break;
  56345. case 'flyToNewMode':
  56346. console.log('flyToNewMode', data.mode); //飞出的两种模式
  56347. if (data.mode == player.mode) {
  56348. //如果mode相同,转为moveModel使角度相同
  56349. data.type = 'moveModel';
  56350. data.info = {
  56351. scale: data.currentScale,
  56352. target: data.target,
  56353. position: data.position,
  56354. quaternion: data.quaternion
  56355. };
  56356. return this.receive(data);
  56357. } else {
  56358. if (data.panoId) {
  56359. data.pano = player.model.panos.index[parseInt(data.panoId)];
  56360. }
  56361. player.locked = false;
  56362. data.callback = function () {
  56363. player.locked = true;
  56364. };
  56365. player.flyToNewMode(data); // if (data.modelInfo) {
  56366. // if (data.modelInfo.panoId) {
  56367. // data.modelInfo.pano = player.model.panos.index[parseInt(data.modelInfo.panoId)]
  56368. // }
  56369. // player.locked = false
  56370. // data.modelInfo.callback = function () {
  56371. // player.locked = true
  56372. // }
  56373. // } else {
  56374. // if (data.panoId) {
  56375. // data.pano = player.model.panos.index[parseInt(data.panoId)]
  56376. // }
  56377. // player.locked = false
  56378. // data.callback = function () {
  56379. // player.locked = true
  56380. // }
  56381. // }
  56382. // player.flyToNewMode(data.modelInfo || data)
  56383. break;
  56384. }
  56385. case 'rotate':
  56386. // console.log('旋转', data)
  56387. if (player.model.mode == Viewmode$1.PANORAMA) {
  56388. flag = this.toSame(data, player, function () {
  56389. this.syncRotate(data, player);
  56390. }.bind(this));
  56391. if (flag) {
  56392. this.syncRotate(data, player);
  56393. }
  56394. }
  56395. break;
  56396. case 'endRotation':
  56397. if (player.cameraControls && player.cameraControls.activeControl) {
  56398. //console.log('停止旋转')
  56399. player.cameraControls.activeControl.lockedForce = false; //console.log('endRotation:' + JSON.stringify(data.rotationSpeed)) //旋转速度之后和主控端难以一致,所以不用
  56400. //player.cameraControls.activeControl.rotationSpeed = data.rotationSpeed || new THREE.Vector2()
  56401. /*
  56402. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(player.cameraControls.activeControl.camera.quaternion).add(player.cameraControls.activeControl.camera.position)
  56403. player.cameraControls.activeControl.lookAt(lookAtPoint) //更新一下lat和lon
  56404. */
  56405. }
  56406. break;
  56407. case 'syncRotContinue':
  56408. if (player.cameraControls && player.cameraControls.activeControl) {
  56409. this.syncRotate2(data, player);
  56410. }
  56411. break;
  56412. case 'zoom':
  56413. //console.log('缩放')
  56414. flag = this.toSame(data, player, function () {
  56415. player.handleControlScroll(data.zoom);
  56416. }.bind(this));
  56417. if (flag == null) ; else if (flag) {
  56418. player.handleControlScroll(data.zoom);
  56419. }
  56420. break;
  56421. case 'moveModel':
  56422. //console.log('移动模型')
  56423. flag = this.toSame(data, player, function () {
  56424. this.copyCameraProp(player, data.info);
  56425. }.bind(this));
  56426. if (flag == null) ; else if (flag) {
  56427. player.cameraControls.activeControl.lockedForce = true;
  56428. player.locked = true;
  56429. this.copyCameraProp(player, data.info);
  56430. player.cameraControls.activeControl.locked = false;
  56431. if (player.mode == Viewmode$1.PANORAMA) {
  56432. player.locked = false;
  56433. }
  56434. }
  56435. break;
  56436. }
  56437. }
  56438. } //初始情况,可能两者状态不一致,这时候需要调整一致
  56439. //通过data里的元素与player进行比较来判断
  56440. }, {
  56441. key: "syncRotate2",
  56442. value: function syncRotate2(data, player) {
  56443. var _this4 = this;
  56444. //主控端停止滑动屏幕后,进行后续的旋转校对
  56445. if (this.pauseSyncRot || player.mode != 'panorama') return; //客户端滑动了屏幕
  56446. var endQuaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  56447. var maxTime = 500;
  56448. var startTime = Date.now(); //console.error('endQuaternion', endQuaternion)
  56449. if (this.lerpQuaFun) {
  56450. this.stopLerpQua(player);
  56451. }
  56452. this.lerpQuaFun = function () {
  56453. if (!player.cameraControls.activeControl) return _this4.stopLerpQua(player);
  56454. var quaternion = player.quaternion.clone();
  56455. lerp.quaternion(quaternion, endQuaternion)(0.1); //console.log('quaternion',quaternion)
  56456. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(player.cameraControls.activeControl.camera.position);
  56457. player.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
  56458. if (Date.now() - startTime > maxTime) {
  56459. //一段时间后停止同步
  56460. _this4.stopLerpQua(player);
  56461. }
  56462. };
  56463. player.on('update', this.lerpQuaFun);
  56464. }
  56465. }, {
  56466. key: "stopLerpQua",
  56467. value: function stopLerpQua(player) {
  56468. player.off('update', this.lerpQuaFun), this.lerpQuaFun = null; //, console.log('pause syncRot2')
  56469. }
  56470. /* syncRotate = function (data, player) {
  56471. //漫游模式下的旋转同步--另一个版本,使quaternion完全一样,但拖拽完毕后手机客户端会回到限制的lat,有个画面跳跃。好处是客户端在主控端移动画面时无法改变旋转
  56472. player.cameraControls.activeControl.lockedForce = true
  56473. let quaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w) //注意不能直接赋值quaternion,因为手机上fov不一样,上下角度有限制,会导致角度闪烁。
  56474. player.cameraControls.activeControl.camera.quaternion.copy(quaternion)
  56475. } */
  56476. }]);
  56477. return FollowScreen;
  56478. }(Screen);
  56479. var Broadcast = function Broadcast(app) {
  56480. _classCallCheck(this, Broadcast);
  56481. this.sync = new SyncScreen(app);
  56482. this.follow = new FollowScreen(app);
  56483. this.paint = new Paint(app);
  56484. };
  56485. function _createSuper$m(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$m(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  56486. function _isNativeReflectConstruct$m() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  56487. var player$2, sceneRenderer;
  56488. var viewHeights = {}; //balloon统一高度
  56489. var posMaxRadius; //限制balloon到center的距离
  56490. var ViewLinkEdit = /*#__PURE__*/function (_THREE$EventDispatche) {
  56491. _inherits(ViewLinkEdit, _THREE$EventDispatche);
  56492. var _super = _createSuper$m(ViewLinkEdit);
  56493. function ViewLinkEdit(app) {
  56494. var _this;
  56495. _classCallCheck(this, ViewLinkEdit);
  56496. _this = _super.call(this);
  56497. _this.app = app; //let deferred = Deferred()
  56498. _this.app.Scene.on('loaded', function () {
  56499. player$2 = _this.app.core.get('Player');
  56500. sceneRenderer = _this.app.core.get('SceneRenderer');
  56501. _this.init();
  56502. if (_this.editing) {
  56503. _this.enter();
  56504. } //deferred.resolve()
  56505. });
  56506. window.editView = _assertThisInitialized(_this);
  56507. return _this;
  56508. }
  56509. _createClass(ViewLinkEdit, [{
  56510. key: "init",
  56511. value: function init() {
  56512. var _this2 = this;
  56513. //根据模型大小来确定balloon距心最大距离
  56514. posMaxRadius = Math.max(Math.sqrt(player$2.model.size.x * player$2.model.size.x + player$2.model.size.y * player$2.model.size.y) * 2, 30);
  56515. player$2.model.floors.list.forEach(function (floor) {
  56516. var height = 0;
  56517. floor.panos.forEach(function (pano) {
  56518. height += pano.position.y;
  56519. });
  56520. height /= floor.panos.length;
  56521. viewHeights[floor.floorIndex] = height;
  56522. }); //用来获取鼠标的三维位置的intersectPlane
  56523. this.ground = new THREE.Mesh(new THREE.PlaneGeometry(80000, 80000, 1, 1), new THREE.MeshBasicMaterial({
  56524. transparent: true,
  56525. wireframe: true,
  56526. opacity: 0,
  56527. side: THREE.DoubleSide,
  56528. depthTest: false
  56529. }));
  56530. this.ground.lookAt(new THREE.Vector3(0, 1, 0));
  56531. this.ground.name = 'editviewLink-ground'; //player.model.add(this.ground) //调试时再加
  56532. this.ground.position.setY(player$2.model.center.y); //balloon和circle之间的虚线
  56533. var points = [{
  56534. x: 0,
  56535. y: 0,
  56536. z: 0
  56537. }, {
  56538. x: 10,
  56539. y: 0,
  56540. z: 0
  56541. }]; //虚线分段似乎一开始就根据长度算好了,如果不重算则分段数不变。
  56542. this.linkLine = LineDraw.createFatLine(points, {
  56543. material: LineDraw.createFatLineMat({
  56544. lineWidth: 3,
  56545. color: '#00C8AF',
  56546. dashed: true,
  56547. gapSize: 0.2,
  56548. dashSize: 0.3
  56549. })
  56550. });
  56551. player$2.model.add(this.linkLine); //balloon或circle到pano之间的连线
  56552. this.linkLine2 = LineDraw.createFatLine(points, {
  56553. material: LineDraw.createFatLineMat({
  56554. lineWidth: 3,
  56555. opacity: 0.2,
  56556. color: '#30FFDF'
  56557. })
  56558. });
  56559. player$2.model.add(this.linkLine2);
  56560. this.linkLine.visible = this.linkLine2.visible = false;
  56561. this.events = {
  56562. changeFloor: function changeFloor(toFloor, mode) {
  56563. if (_this2.settingPos) {
  56564. //正在设置可视
  56565. _this2.fadeMarkerByFloor(true);
  56566. }
  56567. },
  56568. movePos: function movePos() {
  56569. _this2.movePos();
  56570. },
  56571. confirmPos: function confirmPos(e) {
  56572. e.consume();
  56573. _this2.confirmPos();
  56574. },
  56575. dragStart: function dragStart() {
  56576. if (_this2.markView && !player$2.enteringView) {
  56577. if (player$2.viewLinkManager.hoverBalloon && _this2.markView.balloon == player$2.viewLinkManager.hoverBalloon) _this2.dragBalloonStart();
  56578. if (player$2.viewLinkManager.hoverExit) _this2.dragExitStart();else if (player$2.viewLinkManager.hoverCircle) _this2.dragViewStart(player$2.viewLinkManager.hoverCircle.mesh);
  56579. }
  56580. },
  56581. dragEnd: function dragEnd(e) {
  56582. _this2.handelDragEnd(e);
  56583. },
  56584. lookAim: function lookAim() {
  56585. //转向circle
  56586. player$2.on('ifFocusPoint', function (askAim) {
  56587. if (_this2.editing && _this2.markView) {
  56588. var importance = 3; //设置当前的importance级别。如果askAim已高于该级别 就不操作
  56589. if (askAim.importance < importance) {
  56590. askAim.importance = importance;
  56591. askAim.aim = _this2.markView.circle.mesh.position.clone();
  56592. }
  56593. }
  56594. });
  56595. }
  56596. };
  56597. player$2.viewLinkManager.dispatchEvent({
  56598. type: 'getViewLinkEdit',
  56599. v: this
  56600. });
  56601. player$2.viewLinkManager.addEventListener('changeIntersect', function (e) {
  56602. _this2.dispatchEvent({
  56603. type: 'changeIntersect',
  56604. hovered: e.hovered
  56605. });
  56606. });
  56607. this.inited = true;
  56608. }
  56609. }, {
  56610. key: "enter",
  56611. value: function enter() {
  56612. this.editing = true;
  56613. if (!sceneRenderer) return; //sceneRenderer.addComponent(this)
  56614. player$2.model.on('floor.changed', this.events.changeFloor);
  56615. player$2.on('pointerStart', this.events.dragStart); //this.setSize(sceneRenderer.renderer.domElement.width, sceneRenderer.renderer.domElement.height)
  56616. player$2.on('pointerMove', this.events.movePos);
  56617. player$2.on('pointerUp', this.events.dragEnd);
  56618. player$2.on('ifFocusPoint', this.events.lookAim);
  56619. }
  56620. }, {
  56621. key: "leave",
  56622. value: function leave() {
  56623. this.editing = false;
  56624. if (!sceneRenderer) return;
  56625. sceneRenderer.removeComponent(this);
  56626. player$2.model.off('floor.changed', this.events.changeFloor);
  56627. player$2.off('pointerStart', this.events.dragStart);
  56628. player$2.off('pointerUp', this.events.dragEnd);
  56629. player$2.off('pointerMove', this.events.movePos);
  56630. player$2.off('ifFocusPoint', this.events.lookAim);
  56631. }
  56632. }, {
  56633. key: "setSize",
  56634. value: function setSize(x, y) {
  56635. //更新屏幕大小后
  56636. if (!this.inited) return;
  56637. /* this.linkLine.material.resolution.set(x, y)
  56638. this.linkLine2.material.resolution.set(x, y) */
  56639. }
  56640. }, {
  56641. key: "checkCanAddView",
  56642. value: function checkCanAddView() {
  56643. return this.inited && !player$2.flying && player$2.viewLinkManager.inited;
  56644. }
  56645. }, {
  56646. key: "addView",
  56647. value: function addView() {
  56648. var _this3 = this;
  56649. // zeg 如果此时正在观看监控,应该要先退出来
  56650. if (this.app.Camera.monitor.control && this.app.Camera.monitor.control.watchingCamera) {
  56651. this.app.Camera.monitor.control.stopWatch();
  56652. var control = player$2.cameraControls.controls.dollhouse;
  56653. control.target.set(0, 0, 0);
  56654. control.camera.position.setY(50);
  56655. control.resetRanges();
  56656. } //添加
  56657. if (!this.checkCanAddView()) {
  56658. //$waiting.show()
  56659. var timer = setInterval(function () {
  56660. if (_this3.checkCanAddView()) {
  56661. _this3.addView();
  56662. clearInterval(timer);
  56663. }
  56664. }, 50);
  56665. return;
  56666. } // zeg markView作为开始编辑的标识被我从begin()里提出来了
  56667. this.markView = new ViewLink({
  56668. sid: 'view360_' + common.getRandomSid()
  56669. }, this.app);
  56670. player$2.viewLinkManager.addView(this.markView);
  56671. var begin = function begin() {
  56672. _this3.markView.balloon.showOrHide(true, 0);
  56673. player$2.updateFromControls(); //刚飞到floorplan先更新下camera
  56674. _this3.beginSetPos();
  56675. _this3.setEditState(true);
  56676. CursorDeal.add('viewChoosePos');
  56677. };
  56678. if (!player$2.isOutsideMode()) {
  56679. player$2.flyToMode('floorplan', begin);
  56680. } else begin();
  56681. player$2.mode === Viewmode$1.FLOORPLAN && player$2.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  56682. player$2.modelSideManager.tempAuto();
  56683. }
  56684. }, {
  56685. key: "reEditView",
  56686. value: function reEditView(sid) {
  56687. //点击列表编辑view
  56688. this.markView = player$2.viewLinkManager.views[sid];
  56689. this.oldData = this.getData();
  56690. this.reEdit = true;
  56691. this.setEditState(true);
  56692. this.markView.circle.mesh.visible = true;
  56693. player$2.viewLinkManager.focusOn(this.markView);
  56694. if (player$2.mode == 'dollhouse' || player$2.mode == 'floorplan') {
  56695. this.markView.balloon.showOrHide(true, 0);
  56696. }
  56697. player$2.mode === Viewmode$1.FLOORPLAN && player$2.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  56698. player$2.modelSideManager.tempAuto();
  56699. }
  56700. }, {
  56701. key: "setEditState",
  56702. value: function setEditState(state) {
  56703. state = !!state;
  56704. /* this.markView.balloon.setSelect(state)
  56705. this.markView.circle.setSelect(state) */
  56706. this.markView.setSelect(state);
  56707. this.markView.balloon.setStrictScale(state);
  56708. if (!state) {
  56709. this.reEdit = false;
  56710. this.markView = null; //这个是是否在编辑的标志
  56711. }
  56712. player$2.emit('editViewStateChange', state);
  56713. } //退出某个view的编辑
  56714. }, {
  56715. key: "exit",
  56716. value: function exit() {
  56717. if (!this.markView) return;
  56718. this.stopSetPos();
  56719. this.cancelSetExit();
  56720. this.cancelSetEntry();
  56721. this.markView.circle.setSelect(false);
  56722. if (player$2.modeTran.split('-')[1] != 'panorama') this.markView.circle.mesh.visible = false;
  56723. this.markView.balloon.showOrHide(null, 50, 'auto');
  56724. this.setEditState(false);
  56725. player$2.mode === Viewmode$1.FLOORPLAN && player$2.model.floorplanCadImg.showCadPlane(); // 显示户型图
  56726. player$2.modelSideManager.recover();
  56727. }
  56728. /*
  56729. 点击退出(取消)
  56730. */
  56731. }, {
  56732. key: "cancelEdit",
  56733. value: function cancelEdit() {
  56734. if (!this.markView) return;
  56735. if (!this.reEdit) {
  56736. player$2.viewLinkManager.removeView(this.markView);
  56737. this.markView.dispose();
  56738. } else {
  56739. this.markView.titleLabel.setText(this.oldData.title);
  56740. this.markView.circle.mesh.scale.set(this.oldData.circle.scale, this.oldData.circle.scale, this.oldData.circle.scale);
  56741. this.markView.balloon.mesh.position.copy(this.oldData.balloon.pos);
  56742. this.markView.circle.updatePos('normal', {
  56743. position: this.oldData.circle.pos,
  56744. quaternion: this.oldData.circle.qua
  56745. });
  56746. this.markView.nearestPano = this.oldData.nearestPano;
  56747. this.markView.linkType = this.oldData.linkType;
  56748. this.markView.url = this.oldData.url;
  56749. this.changeType(this.markView.linkType); //全景图还原
  56750. this.markView.panoImgVersion = this.oldData.panoImgVersion;
  56751. this.markView.setPano({
  56752. thumbPanoTex: this.markView.thumbPanoTex != this.oldData.thumbPanoTex && this.oldData.thumbPanoTex
  56753. });
  56754. this.markView.circle.setMapOut(this.oldData.circle.mapOut);
  56755. this.markView.exitDoor.setMapOut(this.oldData.exit.mapOut);
  56756. if (!this.markView.enterQuaternion.equals(this.oldData.enterQuaternion)) {
  56757. this.markView.enterQuaternion = this.oldData.enterQuaternion.clone();
  56758. this.markView.linkType == 'pano' && this.markView.mapChangeRot();
  56759. }
  56760. this.markView.exitDirection = this.oldData.exitDirection.clone();
  56761. this.cancelSetExit(); //应用到mesh
  56762. }
  56763. this.exit();
  56764. }
  56765. /*
  56766. 点击保存(确定)
  56767. */
  56768. }, {
  56769. key: "confirmEdit",
  56770. value: function confirmEdit() {
  56771. console.log('confirmEdit');
  56772. if (this.markView.floor != this.markView.nearestPano.floor) {
  56773. if (this.markView.pano) {
  56774. this.markView.pano.floorIndex = this.markView.nearestPano.floorIndex;
  56775. this.markView.pano.floor.removePano(this.markView.pano);
  56776. this.markView.pano.floor = this.markView.nearestPano.floor;
  56777. this.markView.pano.floor.addPano(this.markView.pano);
  56778. }
  56779. this.markView.floor && this.markView.floor.removeView(this.markView);
  56780. this.markView.floor = this.markView.nearestPano.floor;
  56781. this.markView.floor.addView(this.markView);
  56782. }
  56783. this.exit();
  56784. }
  56785. }, {
  56786. key: "fadeMarkerByFloor",
  56787. value: function fadeMarkerByFloor(state) {
  56788. player$2.model.panos.forEach(function (pano) {
  56789. if (!pano.isAligned()) return;
  56790. var visi = state && (player$2.model.allFloorsVisible || !pano.floor.hidden);
  56791. /* if(visi){
  56792. pano.marker.updateStyle(null,'normal')//去掉videoTag
  56793. }else{
  56794. pano.updateMakerStyle() //恢复
  56795. } */
  56796. pano.marker.material.opacity = visi ? 1 : 0;
  56797. });
  56798. }
  56799. }, {
  56800. key: "beginSetPos",
  56801. value: function beginSetPos(type) {
  56802. this.settingPos = true;
  56803. this.markView.circle.state = 'sprite';
  56804. this.fadeMarkerByFloor(true); //this.markView.circle.mesh.material.depthTest = false
  56805. this.markView.circle.mesh.visible = true;
  56806. this.markView.update(player$2.camera, true);
  56807. this.markView.circle.mesh.visible = false; //因为位置还没计算好
  56808. this.placeGround();
  56809. if (type != 'reset') {
  56810. this.movePos('init'); //为了防止 直接confirmPos导致缺少数据 nearestPano
  56811. }
  56812. player$2.on('click', this.events.confirmPos);
  56813. }
  56814. }, {
  56815. key: "stopSetPos",
  56816. value: function stopSetPos() {
  56817. if (this.settingPos) {
  56818. this.settingPos = false;
  56819. this.linkLine.visible = false;
  56820. this.linkLine2.visible = false; //this.markView.circle.mesh.visible = false;
  56821. this.markView.circle.state = '3D';
  56822. this.markView.circle.quaternion && this.markView.circle.mesh.quaternion.copy(this.markView.circle.quaternion); //this.markView.circle.mesh.material.depthTest = true
  56823. this.fadeMarkerByFloor(false);
  56824. player$2.off('click', this.events.confirmPos);
  56825. CursorDeal.remove('viewChoosePos');
  56826. }
  56827. }
  56828. }, {
  56829. key: "confirmPos",
  56830. value: function confirmPos() {
  56831. this.stopSetPos();
  56832. this.dispatchEvent({
  56833. type: 'confirm',
  56834. info: {
  56835. sid: this.markView.sid,
  56836. balloon: {
  56837. pos: this.markView.balloon.mesh.position.toArray()
  56838. },
  56839. circle: {
  56840. pos: this.markView.circle.position.toArray(),
  56841. qua: this.markView.circle.quaternion.toArray(),
  56842. scale: Math.round(this.markView.circle.mesh.scale.x * 100)
  56843. },
  56844. nearestPano: this.markView.nearestPano.id,
  56845. enterQuaternion: this.markView.enterQuaternion.toArray(),
  56846. exitDirection: this.markView.exitDirection.toArray()
  56847. }
  56848. });
  56849. }
  56850. }, {
  56851. key: "cancelPos",
  56852. value: function cancelPos() {
  56853. this.dispatchEvent({
  56854. type: 'cancelPos'
  56855. });
  56856. }
  56857. }, {
  56858. key: "reSetPos",
  56859. value: function reSetPos() {
  56860. //修改关联点位置
  56861. this.markView.balloon.setSelect(true);
  56862. player$2.viewLinkManager.focusOn(this.markView);
  56863. }
  56864. }, {
  56865. key: "focusView",
  56866. value: function focusView(sid) {
  56867. var view = player$2.viewLinkManager.views[sid];
  56868. player$2.viewLinkManager.focusOn(view);
  56869. }
  56870. }, {
  56871. key: "changeScale",
  56872. value: function changeScale(s) {
  56873. //大小
  56874. console.log('changeScale', s);
  56875. this.markView.circle.mesh.scale.set(s, s, s);
  56876. this.markView.titleLabel.updatePos(); //this.confirmPos()
  56877. }
  56878. /*
  56879. 设置位置时计算位置
  56880. 设置balloon位置:
  56881. 类同编辑户型时的拖拽点的方法,找到balloon在地面上的位置。 但是如果鼠标朝上,只能在天空找到交点,(在编辑页面是不做处理不会响应,在此希望能随着鼠标方向改变balloon,所以)将天空上的balloon投射到地面即可。
  56882. circle的位置确定方法: 先找到和balloon最近的漫游点pano,然后过pano向balloon作一条射线, 结果有两种情况:1是和模型有交点,则位置就是交点位置(贴墙); 2是无交点,则位置定为线上到pano一定距离的一点(面朝pano)。
  56883. 其中1也分为两种情况:circle在pano和balloon之间、以及balloon在circle和交点之间。这影响到linkLine的表现。
  56884. */
  56885. }, {
  56886. key: "movePos",
  56887. value: function movePos(type) {
  56888. if (this.settingPos) {
  56889. var center = player$2.model.center.clone();
  56890. var intersect = player$2.getMouseIntersect(null, [this.ground]);
  56891. if (!intersect) {
  56892. console.error('no intersect'); //console.log(player.mode)
  56893. return;
  56894. }
  56895. if (player$2.model.allFloorsVisible) {
  56896. if (type != 'init') center.setY(this.markView.balloon.mesh.position.y); //不改变原先的高度
  56897. } else {
  56898. if (player$2.model.currentFloor.panos.length == 0) {
  56899. console.warn('该层无漫游点!');
  56900. this.stopSetPos();
  56901. return;
  56902. }
  56903. center.setY(viewHeights[player$2.model.currentFloor.floorIndex]);
  56904. }
  56905. var pos = convertTool.getPosAtPlane(intersect.point, player$2, {
  56906. y: center.y
  56907. });
  56908. if (!pos) {
  56909. //交点在center所在高度的地平线以上,向上再求一次交点,然后把y值改为相机无法达到的高度100,然后再降下来
  56910. pos = convertTool.getPosAtPlane(intersect.point, player$2, {
  56911. y: 100
  56912. });
  56913. pos.y = center.y;
  56914. }
  56915. if (pos && pos.distanceTo(center) > posMaxRadius) {
  56916. //限制到center的距离
  56917. pos = center.clone().add(pos.clone().sub(center).normalize().multiplyScalar(posMaxRadius));
  56918. } //-------circle pos-------------------
  56919. var pos2;
  56920. var _qua = this.markView.circle.mesh.quaternion.clone();
  56921. var nearestPanos = common.sortByScore(player$2.model.panos.list, [Panorama.filters.isPanoAligned(), function (pano) {
  56922. return player$2.model.allFloorsVisible || pano.floor == player$2.model.currentFloor;
  56923. }], [function (pano) {
  56924. return -pos.distanceTo(pano.position);
  56925. }]).map(function (e) {
  56926. return e.item;
  56927. }); //不要在视频区域的
  56928. var nearestPano = nearestPanos.find(function (pano) {
  56929. var panoVideoFilter = pano.getVideoFilter();
  56930. var pos_ = new THREE.Vector3().copy(pos).setY(pano.position.y);
  56931. return !panoVideoFilter || !panoVideoFilter(pos_);
  56932. });
  56933. if (!nearestPano) nearestPano = nearestPanos[0];
  56934. var panoPos = nearestPano.position.clone(); //.setY(pos.y);
  56935. this.markView.nearestPano = nearestPano;
  56936. pos.setY(panoPos.y);
  56937. this.markView.balloon.mesh.position.copy(pos);
  56938. this.markView.balloon.update();
  56939. var intersect = convertTool.ifIntersectChunks(panoPos, pos, player$2.model, {
  56940. InfinityLen: true
  56941. });
  56942. if (!intersect) {
  56943. //没有可以贴边的mesh就限制到pano的距离
  56944. var dir = pos.clone().sub(nearestPano.position).setY(0).normalize().multiplyScalar(settings$3.boundExpandLength); //不能超出boundExpandLength,否则可能在skybox外
  56945. pos2 = panoPos.clone().add(dir);
  56946. this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().sub(dir));
  56947. } else {
  56948. var normal = intersect[0].face.normal.applyQuaternion(intersect[0].object.quaternion);
  56949. /* var point = this.position.clone().sub(object3d.point);
  56950. if (point.dot(object3d.normal) < 0) {
  56951. //x,y,z全部反向
  56952. object3d.normal.negate();
  56953. } */
  56954. pos2 = intersect[0].point.add(normal.multiplyScalar(0.01 * (1 + Math.random()))); //Math.random()是为了防止互相重叠造成闪烁,但是透明仍旧有问题,很多角度无法完全透明。用renderOrder虽能都透明但是也有层叠顺序
  56955. this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().add(normal));
  56956. }
  56957. this.markView.circle.mesh.visible = true;
  56958. this.markView.circle.updatePos('normal', {
  56959. position: pos2,
  56960. quaternion: this.markView.circle.mesh.quaternion.clone()
  56961. });
  56962. this.markView.circle.mesh.quaternion.copy(_qua); //-------link line ------------
  56963. //为了让线不穿过balloon显示在白色圈内
  56964. var vec = pos.clone().sub(pos2);
  56965. var len = vec.length();
  56966. var pos3 = pos2.clone().add(vec.multiplyScalar(Math.max(0, (len - 0.4) / len))); //multiplyScalar是为了线不遮挡到balloon中心区域
  56967. pos3.y -= 0.01; //for floorplan
  56968. var points = [pos3, pos2];
  56969. LineDraw.moveFatLine(this.linkLine, points); //lineGeometry.computeLineDistances()
  56970. if (panoPos.distanceTo(pos2) < panoPos.distanceTo(pos3)) {
  56971. var points = [panoPos, pos2];
  56972. } else {
  56973. var points = [panoPos, pos3];
  56974. }
  56975. LineDraw.moveFatLine(this.linkLine2, points);
  56976. this.linkLine.visible = true;
  56977. this.linkLine2.visible = true;
  56978. } else if (this.draggingExit) {
  56979. var intersect = player$2.getMouseIntersect(null, [player$2.model.skybox]);
  56980. this.markView.exitDoor.mesh.position.copy(intersect.point.clone().normalize().multiplyScalar(settings$3.view360.circleDisToCenter));
  56981. } else if (this.draggingCircleAtView) {
  56982. if (this.settingVisibles) {
  56983. var intersect = player$2.getMouseIntersect(null, [player$2.model.skybox]);
  56984. this.draggingMesh.position.copy(intersect.point.clone().normalize().multiplyScalar(settings$3.view360.circleDisToCenter));
  56985. this.saveVisibleViews();
  56986. } else {
  56987. //拖拽circle修改位置
  56988. var pos2;
  56989. var panoPos = player$2.position.clone();
  56990. var intersect = convertTool.getMouseIntersect(player$2.camera, player$2.model.colliders.concat(player$2.model.skybox), player$2.mouse);
  56991. if (intersect.object == player$2.model.skybox) {
  56992. //没有可以贴边的mesh就限制到pano的距离
  56993. var dir = intersect.point.clone().sub(panoPos).normalize().multiplyScalar(settings$3.boundExpandLength); //不能超出boundExpandLength,否则可能在skybox外
  56994. pos2 = panoPos.clone().add(dir);
  56995. this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().sub(dir));
  56996. } else {
  56997. var normal = intersect.face.normal.applyQuaternion(intersect.object.quaternion);
  56998. if (player$2.getMouseDirection().angleTo(intersect.face.normal) < Math.PI / 2) {
  56999. normal = normal.negate();
  57000. }
  57001. pos2 = intersect.point.add(normal.multiplyScalar(0.01 * (1 + Math.random()))); //Math.random()是为了防止互相重叠造成闪烁,但是透明仍旧有问题,很多角度无法完全透明。用renderOrder虽能都透明但是也有层叠顺序
  57002. this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().add(normal));
  57003. } //this.markView.circle.mesh.visible = true
  57004. this.markView.circle.updatePos('normal', {
  57005. position: pos2,
  57006. quaternion: this.markView.circle.mesh.quaternion.clone()
  57007. });
  57008. this.markView.nearestPano = player$2.currentPano;
  57009. }
  57010. }
  57011. } //同编辑户型中的placeIntersectPlane
  57012. }, {
  57013. key: "placeGround",
  57014. value: function placeGround() {
  57015. this.ground.position.copy(this.markView.balloon.mesh.position);
  57016. this.ground.lookAt(this.ground.position.clone().add(player$2.getDirection(null, player$2.camera)));
  57017. }
  57018. }, {
  57019. key: "changeType",
  57020. value: function changeType(type) {
  57021. //切换类型 'url' || 'pano'
  57022. console.log('changeType', type);
  57023. this.markView.linkType = type;
  57024. this.markView.setPano();
  57025. }
  57026. }, {
  57027. key: "changeTitle",
  57028. value: function changeTitle(text) {
  57029. this.markView.titleLabel.setText(text);
  57030. }
  57031. }, {
  57032. key: "uploadedPanoMap",
  57033. value: function uploadedPanoMap(data) {
  57034. //添加全景图片后
  57035. console.log('uploadedPanoMap ', data);
  57036. this.changeType('pano');
  57037. this.markView.pano;
  57038. this.markView.setPano({
  57039. reloadTex: true,
  57040. mapSrc: data.mapSrc,
  57041. thumb: data.thumb
  57042. /* version: Date.now() */
  57043. }); //mapSrc临时的全景blob src , thumb:小张的封面src
  57044. }
  57045. /* deletePanoMap(){
  57046. } */
  57047. }, {
  57048. key: "setLinkUrl",
  57049. value: function setLinkUrl(url) {
  57050. //修改跳转链接
  57051. this.markView.url = url;
  57052. }
  57053. }, {
  57054. key: "setCircleMap",
  57055. value: function setCircleMap(sid, src) {
  57056. //设置关联点样式(circle的map)
  57057. console.log('setCircleMap', sid, src);
  57058. if (typeof src == 'object') {
  57059. src = {
  57060. style: {
  57061. enter: src
  57062. }
  57063. };
  57064. }
  57065. player$2.viewLinkManager.views[sid].circle.setMapOut(src);
  57066. }
  57067. }, {
  57068. key: "setExitMap",
  57069. value: function setExitMap(sid, src) {
  57070. //设置跳出点样式
  57071. console.log('setExitMap', sid, src);
  57072. if (typeof src == 'object') {
  57073. src = {
  57074. style: {
  57075. exit: src
  57076. }
  57077. };
  57078. }
  57079. player$2.viewLinkManager.views[sid].exitDoor.setMapOut(src);
  57080. }
  57081. }, {
  57082. key: "deleteView",
  57083. value: function deleteView(sid) {
  57084. //点击删除
  57085. try {
  57086. player$2.viewLinkManager.views[sid].dispose();
  57087. player$2.viewLinkManager.removeView(player$2.viewLinkManager.views[sid]);
  57088. } catch (e) {
  57089. console.log(e);
  57090. }
  57091. }
  57092. }, {
  57093. key: "enterView",
  57094. value: function enterView(fun) {
  57095. var _this4 = this;
  57096. var done = function done() {
  57097. //$waiting.hide()
  57098. fun && fun();
  57099. }; //$waiting.show()
  57100. if (player$2.flying) {
  57101. //player.waitFlytoItemFuc = enterView.bind(this, fun);
  57102. player$2.once('flying.ended', function () {
  57103. _this4.enterView(fun);
  57104. });
  57105. return;
  57106. }
  57107. if (player$2.currentPano == this.markView.pano && player$2.mode == 'panorama') {
  57108. done();
  57109. } else {
  57110. this.markView.enter360Pano(done);
  57111. }
  57112. }
  57113. }, {
  57114. key: "exitView",
  57115. value: function exitView() {
  57116. return new Promise(function (resolve, reject) {
  57117. player$2.viewLinkManager.exitView().then(function () {
  57118. resolve('success');
  57119. });
  57120. });
  57121. } //-----------------------
  57122. }, {
  57123. key: "beginSetEntry",
  57124. value: function beginSetEntry() {
  57125. var _this5 = this;
  57126. //开始设置进入画面(进入的朝向)
  57127. var deferred = new Deferred$1();
  57128. console.log('beginSetEntry');
  57129. this.settingEntry = true;
  57130. this.enterView(function () {
  57131. /* var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(this.markView.enterQuaternion).add(player.cameraControls.activeControl.camera.position)
  57132. player.flyToPano({pano:player.currentPano, lookAtPoint, rotSpeed:2 }) */
  57133. deferred.resolve();
  57134. player$2.flyToPano({
  57135. pano: player$2.currentPano,
  57136. quaternion: _this5.markView.enterQuaternion,
  57137. rotSpeed: 2
  57138. });
  57139. });
  57140. return deferred.promise();
  57141. }
  57142. }, {
  57143. key: "confirmEntry",
  57144. value: function confirmEntry() {
  57145. //确定进入画面
  57146. if (player$2.currentPano != this.markView.pano) return;
  57147. this.markView.pano.quaternion.copy(player$2.quaternion);
  57148. this.markView.enterQuaternion.copy(player$2.quaternion);
  57149. this.markView.mapChangeRot();
  57150. this.dispatchEvent({
  57151. type: 'confirmEntry',
  57152. sid: this.markView.sid,
  57153. enterQuaternion: player$2.quaternion.toArray()
  57154. });
  57155. this.cancelSetEntry();
  57156. }
  57157. }, {
  57158. key: "cancelSetEntry",
  57159. value: function cancelSetEntry() {
  57160. //取消进入画面
  57161. if (!this.settingEntry) return;
  57162. this.settingEntry = false;
  57163. this.markView.backToPanorama();
  57164. } //-----------------------
  57165. }, {
  57166. key: "beginSetExit",
  57167. value: function beginSetExit() {
  57168. var _this6 = this;
  57169. //开始设置跳出点位置
  57170. console.log('beginSetExit');
  57171. var deferred = new Deferred$1();
  57172. this.settingExit = true;
  57173. this.enterView(function () {
  57174. deferred.resolve();
  57175. player$2.flyToPano({
  57176. pano: player$2.currentPano,
  57177. lookAtPoint: _this6.markView.exitDoor.mesh.position,
  57178. rotSpeed: 2
  57179. });
  57180. }); //this.tempExitPos = this.markView.exitDirection.clone();
  57181. return deferred.promise();
  57182. }
  57183. }, {
  57184. key: "confirmExit",
  57185. value: function confirmExit() {
  57186. //确定跳出点位置
  57187. this.markView.exitDirection = this.markView.exitDoor.mesh.position.clone();
  57188. this.dispatchEvent({
  57189. type: 'confirmExit',
  57190. sid: this.markView.sid,
  57191. exitDirection: this.markView.exitDirection.toArray()
  57192. });
  57193. if (this.markView.linkType != 'pano') {
  57194. //清空
  57195. this.markView.thumbPanoTex && this.markView.thumbPanoTex.dispose();
  57196. this.markView.thumbPanoTex = null;
  57197. }
  57198. this.cancelSetExit(true);
  57199. }
  57200. }, {
  57201. key: "cancelSetExit",
  57202. value: function cancelSetExit(makeit) {
  57203. //取消跳出点位置
  57204. if (!this.settingExit) return;
  57205. this.settingExit = false;
  57206. makeit || this.markView.exitDoor.mesh.position.copy(this.markView.exitDirection);
  57207. this.markView.backToPanorama();
  57208. } //-----------------------
  57209. }, {
  57210. key: "beginSetVisibleViews",
  57211. value: function beginSetVisibleViews(sid) {
  57212. //开始设置可见的view
  57213. this.markView = player$2.viewLinkManager.views[sid];
  57214. enterView(function () {});
  57215. this.settingVisibles = true;
  57216. this.oldVisibleData = JSON.parse(JSON.stringify(this.markView.visibleViews));
  57217. }
  57218. }, {
  57219. key: "addVisibleView",
  57220. value: function addVisibleView(sid, event) {
  57221. console.log('addVisibleView ' + sid);
  57222. var view = player$2.viewLinkManager.views[sid]; //this.markView.visibleViews[sid] = {}
  57223. view.circle.mesh.visible = true;
  57224. player$2.handleInputStart(event.offsetX, event.offsetY, true, true); //更新mouse
  57225. var intersect = player$2.getMouseIntersect(null, [player$2.model.skybox]);
  57226. view.circle.updatePos('at360View', {
  57227. viewDir: intersect.point.clone()
  57228. }); // sub(center)
  57229. view.circle.update(player$2.camera); //player.mouseDown = false; //移动端这个不会归零 所以手动
  57230. //view.circle.updatePos("at360View",{viewDir: view.circle.position.clone().sub(this.markView.circle.position)})
  57231. //player.lookAtPos(view.circle.mesh.position, null, {speed:0.2})
  57232. this.saveVisibleViews();
  57233. }
  57234. }, {
  57235. key: "delVisibleView",
  57236. value: function delVisibleView(sid) {
  57237. delete this.markView.visibleViews[sid];
  57238. var view = player$2.viewLinkManager.views[sid];
  57239. view.circle.mesh.visible = false;
  57240. this.saveVisibleViews();
  57241. }
  57242. }, {
  57243. key: "saveVisibleViews",
  57244. value: function saveVisibleViews() {
  57245. var data = {};
  57246. for (var i in player$2.viewLinkManager.views) {
  57247. if (player$2.viewLinkManager.views[i].circle.mesh.visible) {
  57248. data[i] = player$2.viewLinkManager.views[i].circle.mesh.position.toArray();
  57249. }
  57250. }
  57251. this.markView.visibleViews = data; //this.finishVisibleViews()//???
  57252. }
  57253. }, {
  57254. key: "cancelVisibleViews",
  57255. value: function cancelVisibleViews(sid) {
  57256. //取消
  57257. this.markView.visibleViews = this.oldVisibleData;
  57258. this.markView.backToPanorama(); //直接退出全景
  57259. bus.emit('link/tag/links', {
  57260. sid: this.markView.sid,
  57261. visibleViews: this.markView.visibleViews
  57262. });
  57263. this.finishVisibleViews();
  57264. }
  57265. }, {
  57266. key: "finishVisibleViews",
  57267. value: function finishVisibleViews() {
  57268. this.settingVisibles = false;
  57269. this.markView = null;
  57270. } //----------事件--------
  57271. }, {
  57272. key: "handelClickView",
  57273. value: function handelClickView() {
  57274. if (this.settingPos) {
  57275. this.confirmPos();
  57276. return true;
  57277. }
  57278. }
  57279. }, {
  57280. key: "dragBalloonStart",
  57281. value: function dragBalloonStart() {
  57282. if (this.settingPos) return;
  57283. this.beginSetPos('reset'); //console.log("draggingBall")
  57284. this.draggingBall = true;
  57285. player$2.cameraControls.activeControl.enabled = false;
  57286. }
  57287. }, {
  57288. key: "dragExitStart",
  57289. value: function dragExitStart() {
  57290. //拖动Exit
  57291. if (!this.settingExit) return;
  57292. this.draggingExit = true;
  57293. player$2.cameraControls.activeControl.enabled = false;
  57294. }
  57295. }, {
  57296. key: "dragViewStart",
  57297. value: function dragViewStart(mesh) {
  57298. //拖动
  57299. //if(!this.settingVisibles)return;
  57300. if (this.settingVisibles || this.markView && mesh == this.markView.circle.mesh) {
  57301. this.draggingCircleAtView = true;
  57302. this.draggingMesh = mesh;
  57303. player$2.cameraControls.activeControl.enabled = false;
  57304. }
  57305. }
  57306. }, {
  57307. key: "handelDragEnd",
  57308. value: function handelDragEnd() {
  57309. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  57310. if (player$2.flying) return;
  57311. if (!this.draggingBall && !this.draggingExit && !this.draggingCircleAtView) return; // zeg 做个限制,防止设置activeControl影响到其它模块
  57312. if (this.draggingBall) {
  57313. this.draggingBall = false; //handelClickView()
  57314. if (this.settingPos) {
  57315. e.cancel || this.confirmPos();
  57316. }
  57317. e.consume && e.consume();
  57318. } else if (this.draggingExit) {
  57319. this.draggingExit = false;
  57320. player$2.cameraControls.activeControl.pointerDragOn = false;
  57321. e.consume && e.consume();
  57322. } else if (this.draggingCircleAtView) {
  57323. this.draggingCircleAtView = false;
  57324. player$2.cameraControls.activeControl.pointerDragOn = false;
  57325. e.cancel || this.confirmPos();
  57326. e.consume && e.consume();
  57327. }
  57328. this.draggingMesh = null; //console.log("handelDragEnd")
  57329. player$2.cameraControls.activeControl.enabled = true;
  57330. }
  57331. }, {
  57332. key: "getData",
  57333. value: function getData(type) {
  57334. return {
  57335. sid: this.markView.sid,
  57336. title: this.markView.titleLabel.text,
  57337. balloon: {
  57338. pos: this.markView.balloon.mesh.position.clone()
  57339. },
  57340. circle: {
  57341. pos: this.markView.circle.position.clone(),
  57342. qua: this.markView.circle.quaternion.clone(),
  57343. mapOut: this.markView.circle.mesh.material.uniforms.mapOut.value,
  57344. scale: this.markView.circle.mesh.scale.x
  57345. },
  57346. exit: {
  57347. mapOut: this.markView.exitDoor.mesh.material.uniforms.mapOut.value
  57348. },
  57349. exitDirection: this.markView.exitDirection.clone(),
  57350. enterQuaternion: this.markView.enterQuaternion.clone(),
  57351. //quaternion : this.markView.quaternion,
  57352. panoImgVersion: this.markView.panoImgVersion,
  57353. url: this.markView.url,
  57354. thumbPanoTex: this.markView.thumbPanoTex,
  57355. linkType: this.markView.linkType,
  57356. nearestPano: this.markView.nearestPano
  57357. };
  57358. }
  57359. }, {
  57360. key: "showAll",
  57361. value: function showAll() {
  57362. var _this7 = this;
  57363. if (!this.inited) {
  57364. setTimeout(function () {
  57365. _this7.showAll();
  57366. }, 200);
  57367. return;
  57368. }
  57369. player$2.viewLinkManager.showAllViews();
  57370. }
  57371. }, {
  57372. key: "hideAll",
  57373. value: function hideAll() {
  57374. var _this8 = this;
  57375. if (!this.inited) {
  57376. setTimeout(function () {
  57377. _this8.hideAll();
  57378. }, 200);
  57379. return;
  57380. }
  57381. player$2.viewLinkManager.hideAllViews();
  57382. }
  57383. }, {
  57384. key: "highlight",
  57385. value: function highlight(sid) {
  57386. var views = player$2.viewLinkManager.views;
  57387. var view = views[sid];
  57388. if (this.markView && !view) return; //持续高亮,不允许修改
  57389. if (view) view.setSelect(true);else {
  57390. for (var i in views) {
  57391. views[i].setSelect(false);
  57392. }
  57393. }
  57394. }
  57395. }]);
  57396. return ViewLinkEdit;
  57397. }(THREE.EventDispatcher);
  57398. function _createSuper$l(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$l(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  57399. function _isNativeReflectConstruct$l() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  57400. var FilterManager = /*#__PURE__*/function (_Emiter) {
  57401. _inherits(FilterManager, _Emiter);
  57402. var _super = _createSuper$l(FilterManager);
  57403. function FilterManager(app) {
  57404. var _this;
  57405. _classCallCheck(this, FilterManager);
  57406. _this = _super.call(this);
  57407. _this.app = app;
  57408. _this.edit = {};
  57409. var player;
  57410. var deferred = Deferred$1();
  57411. _this.filterTemp = {}; // 用于暂存多个点位的调节数据
  57412. _this.app.Scene.on('loaded', function () {
  57413. player = _this.app.core.get('Player');
  57414. player.on(PlayerEvents.PanoChosen, function (pano0, pano1) {
  57415. // 点位跳转时,传给UI调节数据
  57416. _this.emit('FilterManager.updateCurrentFilter', JSON.parse(JSON.stringify(_this.filterTemp[pano1.id] || pano1.filterEffect)));
  57417. });
  57418. deferred.resolve();
  57419. });
  57420. _this.edit.enter = function () {
  57421. if (player) {
  57422. // 初始化时,传给UI调节数据
  57423. _this.emit('FilterManager.updateCurrentFilter', JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  57424. } else {
  57425. deferred.then(function () {
  57426. return _this.edit.enter();
  57427. });
  57428. }
  57429. }; // 开始设置调节
  57430. _this.edit.startFilter = function () {
  57431. // 调节仅限于panorama模式下修改
  57432. player.flyToNewMode({
  57433. mode: 'panorama',
  57434. pano: player.currentPano
  57435. });
  57436. }; // 亮度 [-1 ~ 1]
  57437. _this.edit.brightness = function (num) {
  57438. _this.getPanoMaterials().forEach(function (material) {
  57439. material.uniforms['filterBase0'].value.setX(num);
  57440. material.uniforms['filterBase1'].value.setX(num);
  57441. material.defines['hasFilter'] = true; // 必须设置hasFilter,否则调节相关shader将失效
  57442. material.needsUpdate = true;
  57443. });
  57444. _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  57445. _this.filterTemp[player.currentPano.id].brightness = num;
  57446. }; // 对比度 [-1 ~ 1]
  57447. _this.edit.contrast = function (num) {
  57448. _this.getPanoMaterials().forEach(function (material) {
  57449. material.uniforms['filterBase0'].value.setY(num);
  57450. material.uniforms['filterBase1'].value.setY(num);
  57451. material.defines['hasFilter'] = true;
  57452. material.needsUpdate = true;
  57453. });
  57454. _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  57455. _this.filterTemp[player.currentPano.id].contrast = num;
  57456. }; // 饱和度 [-1 ~ 1]
  57457. _this.edit.saturation = function (num) {
  57458. _this.getPanoMaterials().forEach(function (material) {
  57459. material.uniforms['filterBase0'].value.setZ(num);
  57460. material.uniforms['filterBase1'].value.setZ(num);
  57461. material.defines['hasFilter'] = true;
  57462. material.needsUpdate = true;
  57463. });
  57464. _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  57465. _this.filterTemp[player.currentPano.id].saturation = num;
  57466. }; // 色温 [-1 ~ 1]
  57467. _this.edit.temperature = function (num) {
  57468. _this.getPanoMaterials().forEach(function (material) {
  57469. material.uniforms['filterTemperature0'].value = num;
  57470. material.uniforms['filterTemperature1'].value = num;
  57471. material.defines['hasFilter'] = true;
  57472. material.needsUpdate = true;
  57473. });
  57474. _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  57475. _this.filterTemp[player.currentPano.id].temperature = num;
  57476. }; // 清除当前调节效果
  57477. _this.edit.clearCurrent = function () {
  57478. _this.edit.brightness(0);
  57479. _this.edit.contrast(0);
  57480. _this.edit.saturation(0);
  57481. _this.edit.temperature(0);
  57482. }; // 应用当前调节效果至所有点位
  57483. _this.edit.applyCurrent2All = function () {
  57484. var currentFilterEffect = _this.filterTemp[player.currentPano.id] || player.currentPano.filterEffect;
  57485. player.model.panos.list.forEach(function (pano) {
  57486. if (pano.panoType) return;
  57487. _this.filterTemp[pano.id] = JSON.parse(JSON.stringify(currentFilterEffect));
  57488. });
  57489. }; // 保存调解数据
  57490. _this.edit.save = function () {
  57491. var saveInfo = [];
  57492. player.model.panos.list.forEach(function (pano) {
  57493. // 当temp有数据的话,保存temp里的数据
  57494. if (_this.filterTemp[pano.id]) {
  57495. saveInfo.push(Object.assign({
  57496. id: pano.id
  57497. }, _this.filterTemp[pano.id]));
  57498. } // 当temp没有数据的话,保存原有的值
  57499. else if (pano.filterEffect.brightness != 0 || pano.filterEffect.contrast != 0 || pano.filterEffect.saturation != 0 || pano.filterEffect.temperature != 0) {
  57500. saveInfo.push(Object.assign({
  57501. id: pano.id
  57502. }, pano.filterEffect));
  57503. }
  57504. });
  57505. var self = _assertThisInitialized(_this);
  57506. return {
  57507. data: saveInfo,
  57508. successCallBack: function successCallBack() {
  57509. Object.keys(self.filterTemp).forEach(function (panoId) {
  57510. // 将temp里的数据保存在pano.filterEffect里面
  57511. player.model.panos.index[panoId].filterEffect = self.filterTemp[panoId];
  57512. });
  57513. _this.getPanoMaterials().forEach(function (material) {
  57514. // 更新hasFilter
  57515. player.currentPano.hasFilter ? material.defines['hasFilter'] = true : delete material.defines['hasFilter'];
  57516. material.needsUpdate = true;
  57517. });
  57518. self.filterTemp = {};
  57519. }
  57520. };
  57521. }; // 撤销已有修改
  57522. _this.edit.undoEdit = function () {
  57523. _this.filterTemp = {};
  57524. var filterEffect = player.currentPano.filterEffect;
  57525. _this.getPanoMaterials().forEach(function (material) {
  57526. material.uniforms['filterBase0'].value.set(filterEffect.brightness, filterEffect.contrast, filterEffect.saturation);
  57527. material.uniforms['filterBase1'].value.set(filterEffect.brightness, filterEffect.contrast, filterEffect.saturation);
  57528. material.uniforms['filterTemperature0'].value = filterEffect.temperature;
  57529. material.uniforms['filterTemperature1'].value = filterEffect.temperature; // 更新hasFilter
  57530. player.currentPano.hasFilter ? material.defines['hasFilter'] = true : delete material.defines['hasFilter'];
  57531. material.needsUpdate = true;
  57532. }); // 撤销时,传给UI调节数据
  57533. _this.emit('FilterManager.updateCurrentFilter', JSON.parse(JSON.stringify(filterEffect)));
  57534. };
  57535. return _this;
  57536. }
  57537. _createClass(FilterManager, [{
  57538. key: "initFilters",
  57539. value: function initFilters() {
  57540. var _this2 = this;
  57541. // 初始数据
  57542. var initData = function initData(filterList) {
  57543. filterList.forEach(function (data) {
  57544. var panoId = data.id;
  57545. var pano = _this2.app.core.get('Player').model.panos.index[panoId];
  57546. if (pano) {
  57547. // 判断一下pano是否仍然存在
  57548. delete data.id;
  57549. pano.filterEffect = data;
  57550. }
  57551. });
  57552. };
  57553. var filterList = this.app.store.getValue('filters');
  57554. if (filterList) initData(filterList);else this.app.store.on('filters', function (data) {
  57555. initData(data);
  57556. var player = _this2.app.core.get('Player');
  57557. _this2.updatePanoFilters(player.currentPano, player.currentPano);
  57558. });
  57559. } // 根据pano更新调节效果
  57560. }, {
  57561. key: "updatePanoFilters",
  57562. value: function updatePanoFilters(pano0, pano1) {
  57563. var filterEffect0 = this.filterTemp[pano0.id] || pano0.filterEffect;
  57564. var filterEffect1 = this.filterTemp[pano1.id] || pano1.filterEffect;
  57565. this.getPanoMaterials().forEach(function (material) {
  57566. material.uniforms['filterBase0'].value.set(filterEffect0.brightness, filterEffect0.contrast, filterEffect0.saturation);
  57567. material.uniforms['filterTemperature0'].value = filterEffect0.temperature;
  57568. material.uniforms['filterBase1'].value.set(filterEffect1.brightness, filterEffect1.contrast, filterEffect1.saturation);
  57569. material.uniforms['filterTemperature1'].value = filterEffect1.temperature; // 更新hasFilter 考虑到过渡效果,pano1和pano0都要判断
  57570. pano0.hasFilter || pano1.hasFilter ? material.defines['hasFilter'] = true : delete material.defines['hasFilter'];
  57571. material.needsUpdate = true;
  57572. });
  57573. } // 获得与全景贴图有关的所有material
  57574. }, {
  57575. key: "getPanoMaterials",
  57576. value: function getPanoMaterials() {
  57577. var player = this.app.core.get('Player');
  57578. var mats = [this.app.core.get('QuickstartManager').skybox.material].concat(_toConsumableArray(player.model.chunks.map(function (chunk) {
  57579. return chunk.materialInside;
  57580. })));
  57581. player.model.skybox && mats.push(player.model.skybox.material);
  57582. player.model.highMapCube && mats.push.apply(mats, _toConsumableArray(player.model.highMapCube.tiles.map(function (e) {
  57583. return e.material;
  57584. })));
  57585. return mats;
  57586. }
  57587. }]);
  57588. return FilterManager;
  57589. }(tinyEmitter);
  57590. function _createSuper$k(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$k(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  57591. function _isNativeReflectConstruct$k() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  57592. var ConvertViews = /*#__PURE__*/function (_Emiter) {
  57593. _inherits(ConvertViews, _Emiter);
  57594. var _super = _createSuper$k(ConvertViews);
  57595. function ConvertViews() {
  57596. var _this;
  57597. _classCallCheck(this, ConvertViews);
  57598. _this = _super.call(this);
  57599. _this.sourceApp = null;
  57600. _this.targetApp = null;
  57601. _this.player1 = null;
  57602. _this.player2 = null;
  57603. return _this;
  57604. }
  57605. _createClass(ConvertViews, [{
  57606. key: "bind",
  57607. value: function bind() {
  57608. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
  57609. sourceApp: null,
  57610. targetApp: null
  57611. };
  57612. if (options.sourceApp) {
  57613. this.sourceApp = options.sourceApp;
  57614. this.player1 = this.sourceApp.core.get('Player'); //this.player1.model.addEventListener('gotPanos', this.init.bind(this))
  57615. } else if (options.targetApp) {
  57616. this.targetApp = options.targetApp;
  57617. this.player2 = this.targetApp.core.get('Player'); //this.player2.model.addEventListener('gotPanos', this.init.bind(this))
  57618. }
  57619. if (this.sourceApp && this.targetApp) {
  57620. // 两个实例都加载完了,可以进行特性处理
  57621. this.init();
  57622. }
  57623. }
  57624. }, {
  57625. key: "init",
  57626. value: function init() {
  57627. if (!this.player1.model.panos.list.length || !this.player2.model.panos.list.length) return;
  57628. this.diffLon = this.computeAveDiffLon();
  57629. this.diffQuaternion = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), this.diffLon);
  57630. this.diffQuaternionInvert = this.diffQuaternion.clone().invert();
  57631. }
  57632. }, {
  57633. key: "computeAveDiffLon",
  57634. value: function computeAveDiffLon() {
  57635. var _this2 = this;
  57636. //获取两个场景的lon偏差值
  57637. //需要点的个数>1, 且两个场景点一一对应,位置接近且顺序一致
  57638. var diffLonAve = 0,
  57639. diffLons = [];
  57640. /* let panoPos1 = this.player1.model.panos.list.map(e => e.position)
  57641. let panoPos2 = this.player2.model.panos.list.map(e => e.position)
  57642. let length = panoPos1.length */
  57643. var keys = Object.keys(this.panoMapping.mapping);
  57644. var panoPos1 = keys.map(function (id) {
  57645. var pano = _this2.player1.model.panos.index[id];
  57646. return pano.position;
  57647. });
  57648. var panoPos2 = keys.map(function (id) {
  57649. var matchId = _this2.panoMapping.mapping[id];
  57650. var pano = _this2.player2.model.panos.index[matchId];
  57651. return pano.position;
  57652. });
  57653. var length = keys.length; //挑选连续的两个点为向量来计算,如有123个漫游点,则选取12 23 31作为向量
  57654. var index = 0;
  57655. while (index < length) {
  57656. var pos11 = new THREE.Vector3().copy([index]);
  57657. var pos12 = new THREE.Vector3().copy(panoPos1[(index + 1) % length]);
  57658. var pos21 = new THREE.Vector3().copy(panoPos2[index]);
  57659. var pos22 = new THREE.Vector3().copy(panoPos2[(index + 1) % length]);
  57660. var vec1 = new THREE.Vector3().subVectors(pos11, pos12).setY(0);
  57661. var vec2 = new THREE.Vector3().subVectors(pos21, pos22).setY(0);
  57662. var diffLon = math$1.getAngle(vec1, vec2, 'z');
  57663. diffLons.push(diffLon);
  57664. diffLonAve += diffLon;
  57665. index++;
  57666. }
  57667. console.log('diffLons', diffLons);
  57668. diffLonAve /= length;
  57669. console.log('diffLonAve', diffLonAve);
  57670. return (
  57671. /* THREE.MathUtils.radToDeg( */
  57672. diffLonAve
  57673. );
  57674. /* ) */
  57675. }
  57676. }, {
  57677. key: "applyDiff",
  57678. value: function applyDiff(app) {
  57679. //sourcePlayer -> targetPlayer
  57680. if (!this.player1 || !this.player2 || this.targetApp.config.num == this.sourceApp.config.num) return; //场景码相同的话返回
  57681. if (this.player1.mode != this.player2.mode) return;
  57682. var player1, player2, quaternion; //player1为要改变的, player2是参照
  57683. if (app == this.sourceApp) {
  57684. player1 = this.player1;
  57685. player2 = this.player2;
  57686. quaternion = this.diffQuaternion;
  57687. } else {
  57688. player1 = this.player2;
  57689. player2 = this.player1;
  57690. quaternion = this.diffQuaternionInvert;
  57691. }
  57692. var control1 = player1.cameraControls.activeControl;
  57693. var control2 = player2.cameraControls.activeControl; //if(!control1 || !control2)return
  57694. player1.quaternion.copy(player2.quaternion).premultiply(quaternion);
  57695. if (player1.mode == 'panorama') {
  57696. //平移
  57697. var dir = new THREE.Vector3().subVectors(control2.target, player2.position);
  57698. dir.applyQuaternion(quaternion);
  57699. var target1 = new THREE.Vector3().addVectors(player1.position, dir);
  57700. control1.lookAt(target1);
  57701. control1.target.copy(target1);
  57702. } else if (control2) {
  57703. //修改target,保证target在panos之间的相对位置一样
  57704. //console.log('target', control2.target.clone())
  57705. //console.log('position', control2.target.clone())
  57706. var vec = new THREE.Vector3().subVectors(control2.target,
  57707. /* this.getPanoPos(2, 0) */
  57708. player2.model.panos.list[0].position);
  57709. vec.applyQuaternion(quaternion);
  57710. control1.target.addVectors(
  57711. /* this.getPanoPos(1, 0) */
  57712. player1.model.panos.list[0].position, vec);
  57713. player1.target.copy(control1.target); //修改position,保证方向一样
  57714. var _dir = new THREE.Vector3().subVectors(control2.camera.position, control2.target);
  57715. _dir.applyQuaternion(quaternion);
  57716. player1.position = new THREE.Vector3().addVectors(control1.target, _dir);
  57717. control1.camera.position.copy(player1.position);
  57718. }
  57719. control1.camera.quaternion.copy(player1.quaternion);
  57720. }
  57721. /* applyDiff(app) {
  57722. //sourcePlayer -> targetPlayer
  57723. let player1, player2, quaternion
  57724. if (app == this.targetApp) {
  57725. player1 = this.player1
  57726. player2 = this.player2
  57727. quaternion = this.diffQuaternion
  57728. } else {
  57729. player1 = this.player2
  57730. player2 = this.player1
  57731. quaternion = this.diffQuaternionInvert
  57732. }
  57733. this.player1.quaternion.premultiply(quaternion)
  57734. let control = player1.cameraControls.activeControl
  57735. if (player1.mode == 'panorama') {
  57736. //平移
  57737. let dir = new THREE.Vector3().subVectors(control.target, player1.position)
  57738. dir.applyQuaternion(quaternion)
  57739. let target = new THREE.Vector3().addVectors(player1.position, dir)
  57740. control.lookAt(target)
  57741. } else if (control) {
  57742. let dir = new THREE.Vector3().subVectors(player1.position, control.target)
  57743. dir.applyQuaternion(quaternion)
  57744. player1.position = new THREE.Vector3().addVectors(control.target, dir)
  57745. }
  57746. //先不管飞出后的位置平移
  57747. //位置参照第一个漫游点。保持相机相对第一个漫游点的位移和
  57748. } */
  57749. }]);
  57750. return ConvertViews;
  57751. }(tinyEmitter);
  57752. function _createSuper$j(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$j(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  57753. function _isNativeReflectConstruct$j() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  57754. var player$1;
  57755. var lastIntersect;
  57756. var BillboardManager = /*#__PURE__*/function (_EventEmitter) {
  57757. _inherits(BillboardManager, _EventEmitter);
  57758. var _super = _createSuper$j(BillboardManager);
  57759. function BillboardManager(ctx) {
  57760. var _this;
  57761. _classCallCheck(this, BillboardManager);
  57762. _this = _super.call(this);
  57763. _this.ctx = ctx;
  57764. _this.app = ctx.app;
  57765. _this.player = null;
  57766. _this.events = {
  57767. movePos: function movePos(_ref) {
  57768. var reCompute = _ref.reCompute;
  57769. if (reCompute) {
  57770. //重新再算一遍,为了获取当前朝向的镜头
  57771. var intersect = lastIntersect;
  57772. } else {
  57773. if (!_this.dragging) return;
  57774. var intersect = player$1.getMouseIntersect(null, player$1.getColliders());
  57775. if (!intersect) {
  57776. return;
  57777. }
  57778. }
  57779. var _this$getPoseByInters = _this.getPoseByIntersect(intersect),
  57780. position = _this$getPoseByInters.position,
  57781. quaternion = _this$getPoseByInters.quaternion,
  57782. faceAngle2 = _this$getPoseByInters.faceAngle2;
  57783. _this.editPlane.position.copy(position);
  57784. _this.editPlane.quaternion.copy(quaternion);
  57785. _this.editPlane.faceAngle2 = faceAngle2; //this.editPlane.setRotation(/* quaternion, */this.editPlane.rotAngle)
  57786. _this.editPlane.getIsLieDown() && _this.editPlane.updateLabelPose(); //console.log('movePos', position, quaternion )
  57787. _this.editPlane.homePanoId = player$1.currentPano.id;
  57788. /* reCompute || */
  57789. _this.emit('dragPos', {
  57790. panoId: player$1.currentPano.id
  57791. });
  57792. },
  57793. confirmPos: function confirmPos(e) {
  57794. e.consume();
  57795. _this.confirmPos();
  57796. },
  57797. dragStart: function dragStart(e) {
  57798. if (_this.editPlane && player$1.OverlayManager.hoveringPlane == _this.editPlane) {
  57799. player$1.cameraControls.activeControl.enabled = false;
  57800. player$1.cameraControls.activeControl.pointerDragOn = false;
  57801. _this.dragging = true;
  57802. e.consume(); //console.log('dragStart')
  57803. }
  57804. },
  57805. dragEnd: function dragEnd(e) {
  57806. if (!_this.dragging) return;
  57807. _this.dragging = false;
  57808. e.consume();
  57809. player$1.cameraControls.activeControl.enabled = true; //console.log('dragEnd')
  57810. }
  57811. };
  57812. return _this;
  57813. }
  57814. _createClass(BillboardManager, [{
  57815. key: "waitReady",
  57816. value: function waitReady(fuc) {
  57817. if (player$1) {
  57818. fuc();
  57819. } else {
  57820. this.once('ready', fuc);
  57821. }
  57822. }
  57823. }, {
  57824. key: "enter",
  57825. value: function enter(fun) {
  57826. var _this2 = this;
  57827. if (this.entered) return;
  57828. this.entered = true;
  57829. this.waitReady(function () {
  57830. fun && fun();
  57831. if (!_this2.entered) return;
  57832. player$1.on('pointerStart', _this2.events.dragStart);
  57833. player$1.on('pointerMove', _this2.events.movePos);
  57834. player$1.on('pointerUp', _this2.events.dragEnd);
  57835. });
  57836. }
  57837. }, {
  57838. key: "leave",
  57839. value: function leave() {
  57840. //console.log('leave')
  57841. this.endAddPlane();
  57842. this.undoEdit();
  57843. this.editPlane && (this.editPlane.isEditing = false, player$1.OverlayManager.highlight(null));
  57844. this.editPlane = null;
  57845. this.entered = false;
  57846. player$1.off('pointerStart', this.events.dragStart);
  57847. player$1.off('pointerUp', this.events.dragEnd);
  57848. player$1.off('pointerMove', this.events.movePos);
  57849. }
  57850. }, {
  57851. key: "reEdit",
  57852. value: function reEdit(sid) {
  57853. var _this3 = this;
  57854. this.enter(function () {
  57855. var bill = _this3.ctx.get(sid);
  57856. _this3.updateEditPlane(bill);
  57857. player$1.OverlayManager.clickOverlay(bill, {
  57858. dontEmit: true,
  57859. forceFlyToPlane: true
  57860. }); //自动点击
  57861. player$1.modelSideManager.tempAuto();
  57862. });
  57863. }
  57864. }, {
  57865. key: "undoEdit",
  57866. value: function undoEdit() {
  57867. // 恢复
  57868. if (!this.editPlane) return;
  57869. var bill = this.editPlane;
  57870. if (bill.info.modified == 'new') {
  57871. // 未保存过的video直接删除
  57872. this.dispose(bill.sid);
  57873. } else {
  57874. bill.setFromInfo(bill.info);
  57875. }
  57876. player$1.modelSideManager.recover();
  57877. }
  57878. }, {
  57879. key: "save",
  57880. value: function save() {
  57881. var _this4 = this;
  57882. console.log('save');
  57883. var bill = this.editPlane;
  57884. return {
  57885. done: function done() {
  57886. bill.info.modified = 'old';
  57887. bill.info.width = bill.width;
  57888. bill.info.height = bill.height;
  57889. bill.info.pos = bill.position.clone();
  57890. bill.info.qua = bill.quaternion.clone(); //baseQuaternion.clone()
  57891. bill.info.faceAngle = bill.faceAngle;
  57892. bill.info.scaleRatio = bill.scaleRatio;
  57893. bill.info.title = bill.titleLabel.text;
  57894. bill.info.media = bill.plane.material.map.image;
  57895. bill.info.targetPano = bill.targetPano;
  57896. bill.info.icon = bill.getMapName();
  57897. bill.info.panoId = bill.homePanoId; //--暂时同overlay一样 在hidden的楼层要隐藏----
  57898. bill.raycastToFindFloor();
  57899. bill.updateVisibleOnFloor(); //------------------------------ ---- ----
  57900. _this4.leave();
  57901. },
  57902. info: {
  57903. width: math$1.toPrecision(bill.width, 4),
  57904. height: math$1.toPrecision(bill.height, 4),
  57905. pos: math$1.toPrecision(bill.position.toArray(), 4),
  57906. qua: math$1.toPrecision(bill.quaternion.toArray()
  57907. /* bill.baseQuaternion.toArray() */
  57908. , 4)
  57909. }
  57910. };
  57911. }
  57912. /**
  57913. * 添加指示牌
  57914. * @param {*} billboardItem
  57915. * @returns
  57916. */
  57917. }, {
  57918. key: "add",
  57919. value: function add(billboardItem) {
  57920. if (!billboardItem || !billboardItem.sid) {
  57921. return;
  57922. }
  57923. this.ctx.list.push(billboardItem);
  57924. common.updateVisible(billboardItem.titleLabel, 'onShow', !!this.showTitles);
  57925. }
  57926. /**
  57927. * 清除所有
  57928. */
  57929. }, {
  57930. key: "clear",
  57931. value: function clear() {
  57932. this.ctx.list = [];
  57933. }
  57934. /**
  57935. * 删除
  57936. * @param {*} sid
  57937. */
  57938. }, {
  57939. key: "dispose",
  57940. value: function dispose(sid) {
  57941. var plane = this.ctx.get(sid);
  57942. if (plane) {
  57943. plane.titleLabel.dispose();
  57944. plane.dispose();
  57945. var index = this.ctx.list.indexOf(plane);
  57946. this.ctx.list.splice(index, 1);
  57947. }
  57948. }
  57949. /**
  57950. * ui控制整体titles是否显示
  57951. * @param {*} state
  57952. */
  57953. }, {
  57954. key: "changeTitlesShow",
  57955. value: function changeTitlesShow(state) {
  57956. this.showTitles = !!state;
  57957. this.ctx.list.forEach(function (e) {
  57958. common.updateVisible(e.titleLabel, 'onShow', state);
  57959. });
  57960. }
  57961. }, {
  57962. key: "highlight",
  57963. value: function highlight(sid) {
  57964. var bill = this.ctx.get(sid);
  57965. player$1.OverlayManager.highlight(bill);
  57966. }
  57967. }, {
  57968. key: "beginToAddPlane",
  57969. value: function beginToAddPlane() {
  57970. var _this5 = this;
  57971. //开始添加
  57972. this.enter(function () {
  57973. player$1.viewLinkManager.exitView();
  57974. player$1.reticule.visible = false;
  57975. _this5.isAdding = true;
  57976. player$1.modelSideManager.tempAuto();
  57977. CursorDeal.add('addOverlay');
  57978. });
  57979. }
  57980. }, {
  57981. key: "endAddPlane",
  57982. value: function endAddPlane() {
  57983. //结束添加状态
  57984. this.isAdding = false; //this.player.domElement.style.cursor = ''
  57985. CursorDeal.remove('addOverlay');
  57986. player$1.reticule.visible = true;
  57987. }
  57988. }, {
  57989. key: "updateEditPlane",
  57990. value: function updateEditPlane(editPlane) {
  57991. this.editPlane = editPlane;
  57992. editPlane.isEditing = true;
  57993. player$1.OverlayManager.highlight(editPlane);
  57994. }
  57995. }, {
  57996. key: "getPoseByIntersect",
  57997. value: function getPoseByIntersect(intersect) {
  57998. var normal = intersect.face.normal.clone();
  57999. if (player$1.getMouseDirection().angleTo(intersect.face.normal) < Math.PI / 2) {
  58000. normal.negate();
  58001. } //console.log('normal',normal)
  58002. var quaternion = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().lookAt(normal, Vectors$1.ZERO, Vectors$1.UP));
  58003. var position = intersect.point.clone().add(normal.multiplyScalar(0.02)); //在墙上刚好是上下方向,但在地面却会各种朝向
  58004. var faceAngle2;
  58005. if (isLieDown(quaternion)) {
  58006. //在地面上时调整方向,使固定朝向镜头前方或某个方向。否则会因为法线不规则而朝向不固定
  58007. var normalDir = intersect.face.normal.clone().setY(0);
  58008. var camDir = new THREE.Vector3().subVectors(position, player$1.position).setY(0).normalize(); //箭头对准相机 //player.getDirection().setY(0)
  58009. if (normalDir.x == 0 && normalDir.z == 0) {
  58010. //若为0,0,0,改为默认的方向
  58011. normalDir.z = 1;
  58012. }
  58013. faceAngle2 = math$1.getAngle(normalDir, camDir, 'y') - Math.PI / 2;
  58014. var faceRot = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), faceAngle2); //console.log('faceAngle2', faceAngle2, normal, faceRot /* , camDir */)
  58015. quaternion.multiply(faceRot); //右乘子级,子级是自身,绕着面片的中心轴z轴转
  58016. }
  58017. return {
  58018. position,
  58019. quaternion,
  58020. faceAngle2
  58021. };
  58022. }
  58023. }, {
  58024. key: "startInsertion",
  58025. value: function startInsertion(_ref2) {
  58026. var _this6 = this;
  58027. var intersect = _ref2.intersect;
  58028. //调整旋转值,使贴合墙壁,且不重叠。
  58029. var _this$getPoseByInters2 = this.getPoseByIntersect(intersect),
  58030. position = _this$getPoseByInters2.position,
  58031. quaternion = _this$getPoseByInters2.quaternion,
  58032. faceAngle2 = _this$getPoseByInters2.faceAngle2; //添加
  58033. var bill = new BillboardItem(player$1, {
  58034. sid: common.getRandomSid(),
  58035. pos: position,
  58036. qua: quaternion,
  58037. modified: 'new'
  58038. }); //bill.info.baseQuaternion = bill.quaternion.clone()
  58039. //bill.baseQuaternion = bill.quaternion.clone()
  58040. bill.faceAngle = 0;
  58041. bill.faceAngle2 = faceAngle2;
  58042. bill.updateMatrixWorld();
  58043. this.emit('createBill', {
  58044. sid: bill.sid,
  58045. panoId: player$1.currentPano.id
  58046. });
  58047. player$1.OverlayManager.clickOverlay(bill, {
  58048. dontEmit: true,
  58049. forceFlyToPlane: true,
  58050. afterFly: function afterFly(makeit) {
  58051. //重新调整下箭头角度 且保存pano
  58052. setTimeout(function () {
  58053. _this6.events.movePos({
  58054. reCompute: true
  58055. });
  58056. }, 1); //延迟是为了防止 afterFly立即执行
  58057. }
  58058. }); //bill.focus() //自动点击
  58059. lastIntersect = intersect;
  58060. this.updateEditPlane(bill);
  58061. this.add(bill);
  58062. this.endAddPlane(); //自动结束添加
  58063. } //假设默认大小为图片像素 / 100 ?
  58064. }, {
  58065. key: "setScale",
  58066. value: function setScale(s) {
  58067. //大小
  58068. //console.log('setScale', s)
  58069. this.editPlane.setScale(s);
  58070. }
  58071. }, {
  58072. key: "setRotation",
  58073. value: function setRotation(r) {
  58074. //console.log('setRotation', r)
  58075. this.editPlane.setRotation(
  58076. /* this.editPlane.baseQuaternion, */
  58077. r);
  58078. }
  58079. }, {
  58080. key: "setJumpPano",
  58081. value: function setJumpPano(id) {
  58082. console.log('setJumpPano', id);
  58083. this.editPlane.targetPano = id;
  58084. }
  58085. }, {
  58086. key: "setMap",
  58087. value: function setMap(src, sid) {
  58088. //console.log('setMap', src, sid)
  58089. var bill = sid ? this.ctx.get(sid) : this.editPlane;
  58090. bill.setMap(src);
  58091. if (!this.editPlane || this.editPlane != bill) {
  58092. //非编辑状态的话,直接保存到info里
  58093. bill.info.icon = bill.getMapName();
  58094. }
  58095. }
  58096. }, {
  58097. key: "setTitle",
  58098. value: function setTitle(title) {
  58099. this.editPlane.setTitle(title);
  58100. }
  58101. }, {
  58102. key: "cancel",
  58103. value: function cancel() {
  58104. //console.log('cancel')
  58105. this.leave();
  58106. }
  58107. }, {
  58108. key: "flyToBillBoard",
  58109. value: function flyToBillBoard(sid) {
  58110. var bill = sid ? this.ctx.get(sid) : this.editPlane;
  58111. player$1.OverlayManager.clickOverlay(bill, {
  58112. dontEmit: true,
  58113. forceFlyToPlane: true
  58114. });
  58115. }
  58116. }]);
  58117. return BillboardManager;
  58118. }(EventEmitter);
  58119. var mapNames = ['style-1', 'style-2', 'style-3']; //贴图默认名称
  58120. var BillboardItem = /*#__PURE__*/function (_Overlay) {
  58121. _inherits(BillboardItem, _Overlay);
  58122. var _super2 = _createSuper$j(BillboardItem);
  58123. function BillboardItem(player) {
  58124. var _this7;
  58125. var info = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  58126. _classCallCheck(this, BillboardItem);
  58127. //转化一下属性
  58128. info.media = ['photo']; //info.poster: "tCledf2544111.png"
  58129. info.isBillboard = true;
  58130. info.faceAngle = info.faceAngle || 0; //表面旋转度数 (0-360)。所以info.qua不是最终旋转值
  58131. info.scaleRatio = info.scaleRatio || 100;
  58132. _this7 = _super2.call(this, player, info);
  58133. _this7.plane.material.side = THREE.DoubleSide;
  58134. _this7.titleLabel = new TextSprite({
  58135. text: info.title,
  58136. backgroundColor: {
  58137. r: 255,
  58138. g: 255,
  58139. b: 255,
  58140. a: 0
  58141. },
  58142. textColor: {
  58143. r: 255,
  58144. g: 255,
  58145. b: 255,
  58146. a: 1
  58147. },
  58148. /* textBorderColor: { r: 150, g: 150, b: 150, a: 0.5 },
  58149. textBorderThick: 1, */
  58150. textshadowColor: '#888',
  58151. borderRadius: 2,
  58152. fontsize: 34,
  58153. renderOrder: RenderOrder.overlay - 1,
  58154. //为了不被别的billboard的透明区域覆盖
  58155. margin: {
  58156. x: 12,
  58157. y: 10
  58158. },
  58159. player,
  58160. fixOrient: true
  58161. });
  58162. _this7.titleLabel.sprite.material.depthTest = true; //需要和plane一起被遮挡
  58163. var s = 0.3;
  58164. _this7.titleLabel.scale.set(s, s, s);
  58165. _this7.add(_this7.titleLabel);
  58166. common.updateVisible(_assertThisInitialized(_this7), 'waitMapForResize', false);
  58167. _this7.addEventListener('mapLoaded', function () {
  58168. //console.log('img.onloaded')
  58169. var map = _this7.plane.material.map;
  58170. map.needsUpdate = true;
  58171. _this7.setScale();
  58172. common.updateVisible(_assertThisInitialized(_this7), 'waitMapForResize', true);
  58173. /* player.$app.core.get('SceneRenderer').once(SceneRendererEvents.AfterRender, () => {
  58174. this.plane.material.map.anisotropy = 4 //等下一次渲染后才能变回anisotropy
  58175. this.plane.material.map.needsUpdate = true
  58176. console.log('anisotropy 4', this.plane.material.map.uuid, this.sid)
  58177. }) */
  58178. map.dispose();
  58179. var recover = function recover() {
  58180. if (map._listeners && map._listeners.dispose && map._listeners.dispose.length) {
  58181. //已经渲染了。(必须出现在视野中才会渲染)
  58182. map.anisotropy = 4; //等下一次渲染后才能变回anisotropy
  58183. map.needsUpdate = true;
  58184. player.$app.core.get('SceneRenderer').off(SceneRendererEvents.AfterRender, recover);
  58185. }
  58186. };
  58187. player.$app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, recover);
  58188. });
  58189. _this7.addEventListener('lieDownChanged', function () {
  58190. _this7.updateLabelPose();
  58191. });
  58192. return _this7;
  58193. }
  58194. _createClass(BillboardItem, [{
  58195. key: "setFromInfo",
  58196. value: function setFromInfo(info) {
  58197. _get(_getPrototypeOf(BillboardItem.prototype), "setFromInfo", this).call(this, info);
  58198. this.plane.scale.copy(this.scale);
  58199. this.scale.set(1, 1, 1); //把加载整体的scale换成加载plane上
  58200. this.setTitle(info.title);
  58201. this.targetPano = info.targetPano; //跳转到的点
  58202. this.homePanoId = info.panoId; //回到指示牌的点位,为设置指示牌的位置时所在点位。
  58203. this.scaleRatio = info.scaleRatio;
  58204. this.setRotation(
  58205. /* this.quaternion, */
  58206. info.faceAngle);
  58207. this.setMap(info.icon);
  58208. }
  58209. }, {
  58210. key: "setRotation",
  58211. value: function setRotation() {
  58212. var faceAngle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  58213. //this.baseQuaternion = quaternion.clone()
  58214. this.faceAngle = faceAngle;
  58215. /* let faceRot = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(faceAngle))
  58216. this.quaternion.copy(faceRot) //子级是自身,绕着面片的中心轴z轴转
  58217. this.quaternion.premultiply(this.baseQuaternion) //左乘父级 */
  58218. this.plane.quaternion.setFromAxisAngle(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(-faceAngle));
  58219. this.updateLabelPose();
  58220. }
  58221. }, {
  58222. key: "setScale",
  58223. value: function setScale(s) {
  58224. if (s == void 0) s = this.scaleRatio;
  58225. this.scaleRatio = s;
  58226. if (this.plane.material.map.image.width) {
  58227. var _this$plane$material$ = this.plane.material.map.image,
  58228. width = _this$plane$material$.width,
  58229. height = _this$plane$material$.height; //图尺寸越大,对应在三维中的尺寸也越大
  58230. this.width = width / 512 * s / 100;
  58231. this.height = height / 512 * s / 100;
  58232. this.plane.scale.set(this.width / settings$3.overlay.width, this.height / settings$3.overlay.height);
  58233. this.updateLabelPose();
  58234. }
  58235. }
  58236. }, {
  58237. key: "getFaceAngle2",
  58238. value: function getFaceAngle2(normal) {
  58239. if (this.faceAngle2 != void 0) return this.faceAngle2;
  58240. if (!normal) normal = new THREE.Vector3(0, 0, 1).applyQuaternion(this.quaternion); //还原出normal
  58241. var quaternionOri = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().lookAt(normal, Vectors$1.ZERO, Vectors$1.UP)); //最初根据normal获得的quaterinion
  58242. var faceRotQua = this.quaternion.clone().premultiply(quaternionOri.invert()); //反向求出 当初为了使朝向相机方向时先旋转的角度
  58243. //let dir2 = new THREE.Vector3(0, 0, 1).applyQuaternion(faceRotQua) //为什么这样得到的都是0?
  58244. //this.faceAngle2 = Math.atan2(dir2.x, dir2.z)
  58245. this.faceAngle2 = new THREE.Euler().setFromQuaternion(faceRotQua).z; //只好用rotation了 希望不会有x y不为0的时候出现
  58246. }
  58247. }, {
  58248. key: "updateLabelPose",
  58249. value: function updateLabelPose() {
  58250. if (!this.titleLabel) return;
  58251. var marginTop = 0.1; //label到图顶部的空隙
  58252. this.titleLabel.rotation.z = 0; // 恢复
  58253. if (this.getIsLieDown()) {
  58254. //当牌子在地板时需要根据视线转动,保持文字在bill的下方正中。
  58255. var angle = THREE.MathUtils.degToRad(-this.faceAngle); //this.plane的旋转角度
  58256. var eyeDir = player$1.getDirection().negate(); // new THREE.Vector3().subVectors(player.position, this.position)
  58257. var eyeAngle = Math.atan2(eyeDir.x, eyeDir.z); //视线夹角
  58258. //视线夹角还要扣除最外层的this.quaternion造成的旋转(因为是整体的所以扣在整体世界的视线夹角里)
  58259. var planeDir = new THREE.Vector3(0, 0, 1).applyQuaternion(this.quaternion); //normal
  58260. var faceAngle2 = this.getFaceAngle2(planeDir); //创建时为了转向镜头方向而自身先转动的角度
  58261. var planeAngle = Math.atan2(planeDir.x, planeDir.z) + faceAngle2; //console.log('planeAngle',planeAngle, planeDir, 'faceAngle2', faceAngle2)
  58262. eyeAngle -= planeAngle;
  58263. angle -= eyeAngle; //把视线的角度叠加到bill上。可以假设将画布旋转到视线方向
  58264. var height = (this.height * Math.abs(Math.cos(angle)) + this.width * Math.abs(Math.sin(angle))) / 2 + marginTop; //计算bill中心到文字底部的距离(类同当视线角度为0时,仅转动bill时,也就是把视线的角度叠加到bill上)
  58265. //转回正常画布方向后求xy
  58266. var x = -height * Math.sin(-eyeAngle);
  58267. var y = -height * Math.cos(-eyeAngle);
  58268. this.titleLabel.position.set(x, y, 0);
  58269. this.titleLabel.rotation.z = eyeAngle; //计算见笔记
  58270. //console.log('updatePose', x, y, angle)
  58271. } else {
  58272. var _angle = THREE.MathUtils.degToRad(-this.faceAngle);
  58273. var _height = (this.height * Math.abs(Math.cos(_angle)) + this.width * Math.abs(Math.sin(_angle))) / 2 + marginTop; //整个bill在垂直方向的高度的一半加上marginTop就是label的高度
  58274. this.titleLabel.position.set(0, -_height, 0);
  58275. }
  58276. }
  58277. }, {
  58278. key: "setTitle",
  58279. value: function setTitle(title) {
  58280. this.titleLabel && this.titleLabel.setText(title);
  58281. }
  58282. }, {
  58283. key: "setMap",
  58284. value: function setMap(src) {
  58285. //this.plane.material.map.image = new Image
  58286. this.plane.material.map.image.src = this.getMapSrc(src); //为什么有时候会警告Parameter outside of bounds.
  58287. this.plane.material.map.anisotropy = 0; //需要先设置为0,否则新的小图会叠加在原先的大图上,很奇怪。即使是new一个image也是。
  58288. //console.log('anisotropy 0', this.plane.material.map.uuid, this.sid)
  58289. }
  58290. }, {
  58291. key: "getMapSrc",
  58292. value: function getMapSrc(icon) {
  58293. if (icon && icon.slice(0, 5) == 'blob:') {
  58294. return icon;
  58295. }
  58296. var name = icon || this.info.icon || mapNames[0]; //this.player.$app.resource.getUserResourceURL(info.poster)
  58297. if (mapNames.includes(name)) {
  58298. return player$1.$app.resource.getAppURL("images/billboard/".concat(name, ".png"));
  58299. } else {
  58300. if (name.split('.').length == 1) name += '.png';
  58301. return player$1.$app.resource.getUserResourceURL(name);
  58302. }
  58303. }
  58304. }, {
  58305. key: "getMapName",
  58306. value: function getMapName() {
  58307. var src = this.plane.material.map.image.src;
  58308. if (src.slice(0, 5) == 'blob:') {
  58309. return src;
  58310. }
  58311. var a = src.split('/').pop();
  58312. return a.split('.')[0];
  58313. }
  58314. }, {
  58315. key: "getIsLieDown",
  58316. value: function getIsLieDown() {
  58317. var isLie = this.lieDown;
  58318. this.lieDown = isLieDown(this.quaternion);
  58319. if (this.lieDown != isLie) {
  58320. this.dispatchEvent({
  58321. type: 'lieDownChanged'
  58322. });
  58323. }
  58324. return this.lieDown;
  58325. }
  58326. /* get info(){
  58327. return this._info
  58328. }
  58329. set info(i){
  58330. this._info = i
  58331. } */
  58332. }]);
  58333. return BillboardItem;
  58334. }(Overlay);
  58335. var _list = /*#__PURE__*/_classPrivateFieldKey("list");
  58336. var Billboard = /*#__PURE__*/function () {
  58337. function Billboard(app) {
  58338. var _this8 = this;
  58339. _classCallCheck(this, Billboard);
  58340. Object.defineProperty(this, _list, {
  58341. writable: true,
  58342. value: []
  58343. });
  58344. this.app = app;
  58345. this.app.store.on('billboards', function (data) {
  58346. (data.tags || data).forEach(function (info) {
  58347. if (!(info.panoId in player$1.model.panos.index)) {
  58348. return; //点被删除,失效
  58349. }
  58350. info = common.CloneJson(info);
  58351. _this8.manager.add(new BillboardItem(player$1, info));
  58352. });
  58353. });
  58354. this.manager = new BillboardManager(this);
  58355. this.app.Scene.on('loaded', function () {
  58356. player$1 = _this8.app.core.get('Player');
  58357. player$1.billboardManager = _this8.manager;
  58358. _this8.manager.emit('ready');
  58359. if (_this8.app.store.getValue('metadata').controls.showBillboardTitle) {
  58360. _this8.manager.changeTitlesShow(true);
  58361. }
  58362. player$1.on('view.changed', function (e) {
  58363. if ((player$1.mode == 'panorama' || player$1.mode == 'floorplan') &&
  58364. /* e.moved */
  58365. e.cameraWorldMatrixChanged) {
  58366. _this8.list.forEach(function (e) {
  58367. e.lieDown && e.updateLabelPose();
  58368. });
  58369. }
  58370. });
  58371. });
  58372. }
  58373. /**
  58374. * 指示牌数据列表
  58375. * @returns
  58376. */
  58377. _createClass(Billboard, [{
  58378. key: "list",
  58379. get: function get() {
  58380. return _classPrivateFieldBase(this, _list)[_list];
  58381. }
  58382. /**
  58383. * 获取指定指示牌数据
  58384. * @param {*} sid
  58385. * @returns
  58386. */
  58387. }, {
  58388. key: "get",
  58389. value: function get(sid) {
  58390. return _classPrivateFieldBase(this, _list)[_list].find(function (c) {
  58391. return c.sid == sid;
  58392. });
  58393. }
  58394. }]);
  58395. return Billboard;
  58396. }();
  58397. function isLieDown(quaternion) {
  58398. var direction = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion);
  58399. return Math.abs(direction.y) > 0.9;
  58400. }
  58401. function _createSuper$i(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$i(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  58402. function _isNativeReflectConstruct$i() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  58403. var ClipBox = /*#__PURE__*/function (_THREE$Mesh) {
  58404. _inherits(ClipBox, _THREE$Mesh);
  58405. var _super = _createSuper$i(ClipBox);
  58406. function ClipBox(type, boxSize) {
  58407. var _this;
  58408. _classCallCheck(this, ClipBox);
  58409. var geometry = new THREE.BoxGeometry(boxSize, boxSize, boxSize); // geometry.translate(boxSize/2, boxSize/2, boxSize/2)// 将geometry中心点移动至(0,0,0)
  58410. var material0 = new THREE.MeshBasicMaterial({
  58411. color: 0xb47e2c,
  58412. transparent: true,
  58413. opacity: 0.1,
  58414. side: THREE.DoubleSide
  58415. });
  58416. var material1 = new THREE.MeshBasicMaterial({
  58417. color: 0x2ee4ce,
  58418. transparent: true,
  58419. opacity: 0.1,
  58420. side: THREE.DoubleSide
  58421. });
  58422. var lineMat0 = new THREE.LineBasicMaterial({
  58423. color: 0xffc23b
  58424. });
  58425. var lineMat1 = new THREE.LineBasicMaterial({
  58426. color: 0x2ee4ce
  58427. });
  58428. if (type) {
  58429. _this = _super.call(this, geometry, material1);
  58430. _this.lowLight = function () {
  58431. if (_this.status === 1) return;
  58432. _this.outLines.visible = false;
  58433. _this.line.visible = true;
  58434. _this.material.opacity = 0;
  58435. };
  58436. _this.midLight = function () {
  58437. if (_this.status === 1) return;
  58438. _this.outLines.visible = false;
  58439. _this.line.visible = true;
  58440. _this.material.opacity = 0.1;
  58441. };
  58442. _this.highLight = function () {
  58443. if (_this.status === 1) return;
  58444. _this.outLines.visible = true;
  58445. _this.line.visible = true;
  58446. _this.material.opacity = 0.3;
  58447. _this.status = 1;
  58448. };
  58449. _this.switchBoxType = function () {
  58450. _this.clipType = Number(!_this.clipType);
  58451. console.log(!_this.clipType);
  58452. var templeMat = _this.clipType === 0 ? _this.material0 : _this.material1;
  58453. var templeLineMat = _this.clipType === 0 ? _this.lineMat0 : _this.lineMat1;
  58454. _this.material = templeMat;
  58455. _this.line.material = templeLineMat;
  58456. _this.outLines.traverse(function (child) {
  58457. child.material = templeLineMat;
  58458. });
  58459. console.log(_this.clipType);
  58460. };
  58461. } else {
  58462. _this = _super.call(this, geometry, material0);
  58463. _this.lowLight = function () {
  58464. if (_this.status === 1) return;
  58465. _this.outLines.visible = false;
  58466. _this.line.visible = true;
  58467. _this.material.opacity = 0;
  58468. };
  58469. _this.midLight = function () {
  58470. if (_this.status === 1) return;
  58471. _this.outLines.visible = false;
  58472. _this.line.visible = true;
  58473. _this.material.opacity = 0.1;
  58474. };
  58475. _this.highLight = function () {
  58476. if (_this.status === 1) return;
  58477. _this.outLines.visible = true;
  58478. _this.line.visible = true;
  58479. _this.material.opacity = 0.3;
  58480. _this.status = 1;
  58481. };
  58482. _this.switchBoxType = function () {
  58483. _this.clipType = Number(!_this.clipType);
  58484. console.log(!_this.clipType);
  58485. var templeMat = _this.clipType === 0 ? _this.material0 : _this.material1;
  58486. var templeLineMat = _this.clipType === 0 ? _this.lineMat0 : _this.lineMat1;
  58487. _this.material = templeMat;
  58488. _this.line.material = templeLineMat;
  58489. _this.outLines.traverse(function (child) {
  58490. child.material = templeLineMat;
  58491. });
  58492. console.log(_this.clipType);
  58493. };
  58494. }
  58495. var edges = new THREE.EdgesGeometry(geometry);
  58496. var _templeLineMat = type === 0 ? lineMat0 : lineMat1;
  58497. var line = new THREE.LineSegments(edges, _templeLineMat);
  58498. var outLines = new THREE.Group();
  58499. for (var i = 0; i < 10; i++) {
  58500. var l = line.clone();
  58501. var scale = 1 - 0.001 * i;
  58502. l.scale.set(scale, scale, scale);
  58503. outLines.add(l);
  58504. }
  58505. outLines.visible = false;
  58506. _this.add(line);
  58507. _this.add(outLines);
  58508. _this.material0 = material0;
  58509. _this.material1 = material1;
  58510. _this.lineMat0 = lineMat0;
  58511. _this.lineMat1 = lineMat1;
  58512. _this.line = line;
  58513. _this.outLines = outLines;
  58514. _this.name = 'clipBox';
  58515. _this.status = 0;
  58516. _this.clipType = type;
  58517. _this.isClipBox = true;
  58518. _this.renderOrder = RenderOrder.entryArrow;
  58519. return _possibleConstructorReturn(_this);
  58520. }
  58521. return ClipBox;
  58522. }(THREE.Mesh);
  58523. function _createSuper$h(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$h(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  58524. function _isNativeReflectConstruct$h() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  58525. // 求vPosition是否在裁剪盒子内
  58526. //
  58527. // G
  58528. // |
  58529. // O —— C
  58530. // /
  58531. // A
  58532. //
  58533. // 需要clipBox的CGOA点和vPosition用于求点是否在clipBox内,决定是否discard
  58534. // 裁剪盒子限制为10个, 10个以上GLSL会报错
  58535. var ClipBoxManager = /*#__PURE__*/function (_Emiter) {
  58536. _inherits(ClipBoxManager, _Emiter);
  58537. var _super = _createSuper$h(ClipBoxManager);
  58538. function ClipBoxManager(app) {
  58539. var _this;
  58540. _classCallCheck(this, ClipBoxManager);
  58541. _this = _super.call(this);
  58542. _this.updateMaterials = function () {
  58543. console.log('tileLoading');
  58544. _this.materials.length = 0;
  58545. _this.player.model.chunks.forEach(function (chunk) {
  58546. return _this.materials.push(chunk.materialOutside);
  58547. }); //更新材质数组
  58548. _this.player.model.chunks.forEach(function (chunk) {
  58549. return _this.materials.push(chunk.materialInside);
  58550. });
  58551. _this.materials.forEach(function (mat) {
  58552. return mat.uniforms.clipBoxType.value = _this.clipBoxType, mat.needsUpdate = true;
  58553. }); //更新材质uniforms
  58554. _this.materials.forEach(function (mat) {
  58555. return mat.uniforms.clipBoxPoints.value = _this.clipBoxPoints, mat.needsUpdate = true;
  58556. });
  58557. _this.materials.forEach(function (mat) {
  58558. return mat.defines['HasClip'] = true, mat.needsUpdate = true;
  58559. });
  58560. };
  58561. _this.bindEvents = function () {
  58562. _this.player.on('pointerStart', _this.onMouseDown);
  58563. _this.player.on('pointerMove', _this.onMouseMove);
  58564. _this.player.on('pointerUp', _this.onMouseUp);
  58565. _this.player.on('moveModel', _this.onZoom);
  58566. _this.player.model.transformControls.addEventListener('mousing', _this.updateClipBox);
  58567. _this.player.model.transformControls.addEventListener('mouseUp', _this.finishUpdateClipBox);
  58568. _this.player.model.transformControls.switchEditState('clipbox');
  58569. };
  58570. _this.unBindEvents = function () {
  58571. _this.player.off('pointerStart', _this.onMouseDown);
  58572. _this.player.off('pointerMove', _this.onMouseMove);
  58573. _this.player.off('pointerUp', _this.onMouseUp);
  58574. _this.player.off('moveModel', _this.onZoom);
  58575. _this.player.model.transformControls.removeEventListener('mousing', _this.updateClipBox);
  58576. _this.player.model.transformControls.removeEventListener('mouseUp', _this.finishUpdateClipBox); // if (this.player.model._3dTilesRuntime) {
  58577. // this.player.model._3dTilesRuntime.getTileset().off('endTileLoading', this.updateMaterials)
  58578. // }
  58579. };
  58580. _this.onMouseDown = function () {
  58581. _this.mousedown.copy(_this.player.mouse);
  58582. };
  58583. _this.onMouseUp = function () {
  58584. _this.mouseup.copy(_this.player.mouse);
  58585. if (Math.abs(_this.mousedown.x - _this.mouseup.x > 0) || Math.abs(_this.mousedown.y - _this.mouseup.y > 0)) return;
  58586. if (_this.adding) {
  58587. // 确认摆放位置
  58588. _this.adding = false;
  58589. if (_this.activeBox) {
  58590. _this.activeBox.status = 0;
  58591. _this.activeBox.lowLight();
  58592. }
  58593. _this.activeBoxIndex = _this.clipBoxs.length - 1;
  58594. _this.activeBox = _this.clipBoxs[_this.activeBoxIndex];
  58595. _this.activeBox.highLight();
  58596. console.log(_this.activeBoxIndex);
  58597. _this.player.model.transformControls.attach(_this.activeBox);
  58598. _this.player.model.transformControls.visible = true;
  58599. _this.emit('clipBoxManager.active', {
  58600. status: true,
  58601. list: _this.clipBoxs
  58602. });
  58603. _this.emit('clipBoxManager.update', {
  58604. list: _this.clipBoxs
  58605. });
  58606. _this.clipBoxType[_this.clipBoxs.length - 1] = _this.activeBox.clipType; //记录裁剪盒子类型
  58607. _this.updateClipBox(); // this.defineHasClip(true)
  58608. if (_this.clipBoxs.length === 1) {
  58609. _this.clipInit();
  58610. }
  58611. } else {
  58612. // 选中box (直接点击)
  58613. if (_this.activeBox) {
  58614. _this.activeBox.status = 0;
  58615. _this.activeBox.lowLight();
  58616. }
  58617. var intersect = _this.player.getMouseIntersect(null, _this.clipBoxs);
  58618. if (intersect) {
  58619. _this.player.model.transformControls.attach(intersect.object);
  58620. _this.emit('clipBoxManager.active', {
  58621. status: true,
  58622. list: _this.clipBoxs
  58623. }); //激活删除按钮
  58624. _this.activeBox = intersect.object;
  58625. for (var i = 0; i < _this.clipBoxs.length; i++) {
  58626. if (_this.activeBox === _this.clipBoxs[i]) {
  58627. _this.activeBoxIndex = i;
  58628. break;
  58629. }
  58630. }
  58631. _this.activeBox.highLight();
  58632. } else {
  58633. //点击空白取消选择
  58634. _this.cancelActive();
  58635. }
  58636. }
  58637. };
  58638. _this.onMouseMove = function () {
  58639. if (_this.adding) {
  58640. //box随鼠标移动
  58641. _this.clipBoxs[_this.clipBoxs.length - 1].position.copy(_this.player.reticule.position);
  58642. } else {
  58643. //触碰到的box高亮
  58644. var intersect = _this.player.getMouseIntersect(null, _this.clipBoxs);
  58645. if (intersect) {
  58646. if (_this.touchBox === null) {
  58647. //首次touch
  58648. _this.touchBox = intersect.object;
  58649. _this.touchBox.midLight();
  58650. } else if (intersect.object !== _this.touchBox) {
  58651. //touch到新box
  58652. _this.touchBox.lowLight();
  58653. _this.touchBox = intersect.object;
  58654. _this.touchBox.midLight();
  58655. }
  58656. } else {
  58657. if (_this.touchBox) {
  58658. //去除高亮
  58659. _this.touchBox.lowLight();
  58660. _this.touchBox = null;
  58661. }
  58662. }
  58663. }
  58664. };
  58665. _this.onZoom = function () {
  58666. if (_this.adding) {
  58667. //根据相机距离原点的距离缩放box
  58668. var scale = _this.player.camera.position.distanceTo(new THREE.Vector3(0, 0, 0)) / (_this.boxSize * 2.5);
  58669. _this.clipBoxs[_this.clipBoxs.length - 1].scale.set(scale, scale, scale);
  58670. }
  58671. };
  58672. _this.app = app;
  58673. _this.player = null;
  58674. _this.boxSize = 1;
  58675. _this.deferred = Deferred$1();
  58676. _this.clipBoxs = []; //裁剪盒子数组用于raycaster
  58677. _this.clipBoxGroup = new THREE.Group(); //裁剪盒子组
  58678. _this.clipBoxType = new Array(10).fill(-1); //裁剪盒子类型 0=内切/1=外切/-1=空
  58679. _this.clipBoxPoints = []; //记录每个裁剪盒子数据(用于shader)
  58680. _this.oriObj = {
  58681. clipBoxType: [],
  58682. clipMatrixs: []
  58683. }; //用于不保存退出的数据恢复
  58684. _this.activeBoxIndex = null;
  58685. _this.activeBox = null;
  58686. _this.touchBox = null;
  58687. _this.adding = false; //true=未放置
  58688. _this.materials = []; //裁剪材质数组
  58689. _this.mousedown = new THREE.Vector3();
  58690. _this.mouseup = new THREE.Vector3();
  58691. _this.isBind3dTile = false;
  58692. _this.initFinish = false;
  58693. _this.init = function (metadata) {
  58694. var reload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  58695. //根据场景大小初始化boxSize
  58696. var SceneSize = new THREE.Vector3();
  58697. _this.boxSize = _this.player.model.boundingBox.getSize(SceneSize).distanceTo(new THREE.Vector3(0, 0, 0)) / 10; //数据初始化
  58698. for (var i = 0; i < 10; i++) {
  58699. //按CGOA的顺序初始化数据
  58700. _this.clipBoxPoints.push(new THREE.Vector3(_this.boxSize / 2, -_this.boxSize / 2, -_this.boxSize / 2));
  58701. _this.clipBoxPoints.push(new THREE.Vector3(-_this.boxSize / 2, _this.boxSize / 2, -_this.boxSize / 2));
  58702. _this.clipBoxPoints.push(new THREE.Vector3(-_this.boxSize / 2, -_this.boxSize / 2, -_this.boxSize / 2));
  58703. _this.clipBoxPoints.push(new THREE.Vector3(-_this.boxSize / 2, -_this.boxSize / 2, _this.boxSize / 2));
  58704. }
  58705. if (metadata) {
  58706. metadata[0] && (metadata = metadata[0].modelData);
  58707. console.log('has metadata');
  58708. _this.clipBoxType = metadata.clipBoxType;
  58709. var clipMatrixs = metadata.clipMatrixs;
  58710. console.log(_this.clipBoxType, clipMatrixs);
  58711. for (var _i = 0; _i < clipMatrixs.length; _i++) {
  58712. var clipBox = new ClipBox(_this.clipBoxType[_i], _this.boxSize);
  58713. var mat4 = new THREE.Matrix4();
  58714. mat4.fromArray(clipMatrixs[_i]);
  58715. clipBox.applyMatrix4(mat4);
  58716. _this.clipBoxPoints[_i * 4] = new THREE.Vector3(_this.boxSize / 2, -_this.boxSize / 2, -_this.boxSize / 2).applyMatrix4(mat4);
  58717. _this.clipBoxPoints[_i * 4 + 1] = new THREE.Vector3(-_this.boxSize / 2, _this.boxSize / 2, -_this.boxSize / 2).applyMatrix4(mat4);
  58718. _this.clipBoxPoints[_i * 4 + 2] = new THREE.Vector3(-_this.boxSize / 2, -_this.boxSize / 2, -_this.boxSize / 2).applyMatrix4(mat4);
  58719. _this.clipBoxPoints[_i * 4 + 3] = new THREE.Vector3(-_this.boxSize / 2, -_this.boxSize / 2, _this.boxSize / 2).applyMatrix4(mat4);
  58720. _this.clipBoxs.push(clipBox);
  58721. _this.clipBoxGroup.add(clipBox);
  58722. }
  58723. _this.oriObj = {
  58724. clipBoxType: JSON.parse(JSON.stringify(_this.clipBoxType)),
  58725. clipMatrixs
  58726. };
  58727. }
  58728. if (!reload) {
  58729. //初次加载
  58730. _this.setAllClipBoxVisible(false); //隐藏所有裁剪盒子
  58731. _this.player.model.add(_this.clipBoxGroup); // this.clipInit()
  58732. }
  58733. _this.clipInit();
  58734. if (_this.clipBoxs.length === 0) {
  58735. _this.defineHasClip(false);
  58736. }
  58737. _this.deferred.resolve();
  58738. };
  58739. _this.app.Scene.on('loaded', function () {
  58740. setTimeout(function () {
  58741. _this.player = _this.app.core.get('Player'); //获取metadata
  58742. var metadata = _this.app.store.getValue('cutModel'); // console.log(metadata)
  58743. // if (metadata) this.init(metadata)
  58744. // else this.app.store.on('metadata', this.init)
  58745. _this.init(metadata);
  58746. }, 50); //setTimeout为了在transformControls初始化完成后再初始化ClipBoxManager
  58747. }); // 进入裁剪模块
  58748. _this.enterModule = function () {
  58749. _this.waitInit(function () {
  58750. if (_this.app.Camera.monitor.control.watchingCamera) {
  58751. _this.app.Camera.monitor.control.stopWatch();
  58752. _this.player.dollhouseMode();
  58753. }
  58754. if (_this.player.mode !== Viewmode$1.DOLLHOUSE) {
  58755. //进入迷你模式
  58756. _this.player.flyToNewMode({
  58757. mode: Viewmode$1.DOLLHOUSE
  58758. }); //隐藏
  58759. _this.player.once('flying.ended', function () {
  58760. _this.player.model.panos.forEach(function (pano) {
  58761. return pano.hasVideo && common.updateVisible(pano.marker, 'clipBox', false, 10);
  58762. });
  58763. _this.player.OverlayManager.group.children.forEach(function (child) {
  58764. return child.hide('clipBox');
  58765. });
  58766. _this.app.Camera.monitor.control.hideAll(undefined, 'clipBox', 10, undefined);
  58767. _this.app.Scene.Decoration.hideAll();
  58768. _this.player.labelManager.hide();
  58769. _this.player.linkEditor.hideFootIcons();
  58770. _this.player.linkEditor.delVisibleLines();
  58771. _this.emit('clipBoxManager.enter');
  58772. _this.player.model.floors.show();
  58773. });
  58774. } else {
  58775. _this.player.model.panos.forEach(function (pano) {
  58776. return pano.hasVideo && common.updateVisible(pano.marker, 'clipBox', false, 10);
  58777. });
  58778. _this.player.OverlayManager.group.children.forEach(function (child) {
  58779. return child.hide('clipBox');
  58780. });
  58781. _this.app.Camera.monitor.control.hideAll(undefined, 'clipBox', 10, undefined);
  58782. _this.app.Scene.Decoration.hideAll();
  58783. _this.player.labelManager.hide();
  58784. _this.player.linkEditor.hideFootIcons();
  58785. _this.player.linkEditor.delVisibleLines();
  58786. _this.emit('clipBoxManager.enter');
  58787. _this.player.model.floors.show();
  58788. }
  58789. _this.setAllClipBoxVisible(true); //显示所有裁剪盒子
  58790. //绑定事件
  58791. _this.bindEvents();
  58792. _this.player.locked = true;
  58793. }, _this.enterModule.bind(_assertThisInitialized(_this)));
  58794. }; //离开裁剪模块
  58795. _this.leaveModule = function () {
  58796. _this.setAllClipBoxVisible(false); //隐藏所有裁剪盒子
  58797. _this.player.model.transformControls.detach();
  58798. _this.emit('clipBoxManager.active', {
  58799. status: false,
  58800. list: _this.clipBoxs
  58801. });
  58802. if (_this.adding) _this.cancelAddClipBox(); //解绑事件
  58803. _this.unBindEvents();
  58804. _this.player.locked = false; //恢复显示
  58805. _this.player.model.panos.forEach(function (pano) {
  58806. return pano.hasVideo && common.updateVisible(pano.marker, 'clipBox', true, 10);
  58807. });
  58808. _this.player.OverlayManager.group.children.forEach(function (child) {
  58809. return child.show('clipBox');
  58810. });
  58811. _this.app.Camera.monitor.control.showAll(undefined, 'clipBox', 10, undefined);
  58812. _this.app.Scene.Decoration.showAll();
  58813. _this.player.labelManager.show();
  58814. _this.player.model.transformControls.visible = false;
  58815. }; //添加裁剪盒子
  58816. _this.addClipBox = function (type) {
  58817. _this.waitInit(function () {
  58818. console.log('add');
  58819. if (_this.adding && type === _this.clipBoxs[_this.clipBoxs.length - 1].clipType) {
  58820. //连点
  58821. return;
  58822. } else if (_this.adding && type !== _this.clipBoxs[_this.clipBoxs.length - 1].clipType) {
  58823. //切换新增类型
  58824. _this.changeClipBoxType();
  58825. return;
  58826. }
  58827. if (_this.clipBoxs.length < 10) {
  58828. //数量到达10 禁止新建
  58829. var clipBox = new ClipBox(type, _this.boxSize);
  58830. _this.clipBoxs.push(clipBox);
  58831. _this.clipBoxGroup.add(clipBox);
  58832. _this.adding = true;
  58833. _this.onZoom();
  58834. _this.player.model.transformControls.visible = false;
  58835. }
  58836. }, _this.addClipBox.bind(_assertThisInitialized(_this), type));
  58837. }; //取消添加裁剪盒子
  58838. _this.cancelAddClipBox = function () {
  58839. if (_this.adding) {
  58840. console.log(_this.clipBoxs[_this.clipBoxs.length - 1]);
  58841. _this.clipBoxGroup.remove(_this.clipBoxs[_this.clipBoxs.length - 1]);
  58842. _this.clipBoxs.pop();
  58843. _this.adding = false;
  58844. _this.player.model.transformControls.visible = true;
  58845. if (_this.activeBoxIndex !== null) {
  58846. _this.emit('clipBoxManager.active', {
  58847. status: false,
  58848. list: _this.clipBoxs
  58849. }); //发送选中事件
  58850. }
  58851. }
  58852. }; //删除裁剪盒子
  58853. _this.deleteClipBox = function (index) {
  58854. if (index === undefined && _this.activeBoxIndex === null) {
  58855. return;
  58856. } else if (index === undefined) {
  58857. index = _this.activeBoxIndex;
  58858. }
  58859. if (index === _this.activeBoxIndex) {
  58860. _this.activeBox = null;
  58861. _this.activeBoxIndex = null;
  58862. }
  58863. _this.player.model.transformControls.detach();
  58864. _this.emit('clipBoxManager.active', {
  58865. status: false,
  58866. list: _this.clipBoxs
  58867. }); //发送选中事件
  58868. _this.emit('clipBoxManager.update', {
  58869. list: _this.clipBoxs
  58870. }); //发送选中事件
  58871. _this.clipBoxGroup.remove(_this.clipBoxGroup.children[index]);
  58872. _this.clipBoxs.splice(index, 1);
  58873. _this.clipBoxType.splice(index, 1);
  58874. _this.clipBoxType.push(-1);
  58875. _this.clipBoxPoints.splice(index * 4, 4);
  58876. _this.clipBoxPoints.push(new THREE.Vector3(_this.boxSize / 2, -_this.boxSize / 2, -_this.boxSize / 2));
  58877. _this.clipBoxPoints.push(new THREE.Vector3(-_this.boxSize / 2, _this.boxSize / 2, -_this.boxSize / 2));
  58878. _this.clipBoxPoints.push(new THREE.Vector3(-_this.boxSize / 2, -_this.boxSize / 2, -_this.boxSize / 2));
  58879. _this.clipBoxPoints.push(new THREE.Vector3(-_this.boxSize / 2, -_this.boxSize / 2, _this.boxSize / 2));
  58880. if (_this.clipBoxs.length === 0) {
  58881. _this.defineHasClip(false);
  58882. }
  58883. }; //清空裁剪盒子
  58884. _this.clearClipBoxs = function () {
  58885. var length = _this.clipBoxs.length;
  58886. for (var i = 0; i < length; i++) {
  58887. _this.deleteClipBox(0);
  58888. }
  58889. _this.clipBoxGroup.children = [];
  58890. _this.emit('clipBoxManager.active', {
  58891. status: false,
  58892. list: _this.clipBoxs
  58893. }); //发送选中事件
  58894. _this.emit('clipBoxManager.update', {
  58895. list: _this.clipBoxs
  58896. }); //发送选中事件
  58897. _this.defineHasClip(false);
  58898. _this.cancelAddClipBox();
  58899. _this.player.model.transformControls.visible = false;
  58900. }; //修改盒子类型
  58901. _this.changeClipBoxType = function (index) {
  58902. index === void 0 && (index = _this.clipBoxs.length - 1);
  58903. if (_this.adding) {
  58904. _this.clipBoxs[index].switchBoxType();
  58905. } else {
  58906. _this.clipBoxs[index].switchBoxType();
  58907. _this.clipBoxType[index] = _this.clipBoxs[index].clipType;
  58908. }
  58909. }; //选中裁剪盒子 (列表选择)
  58910. _this.focusClipBox = function (index) {
  58911. _this.activeBoxIndex = index;
  58912. _this.activeBox = _this.clipBoxs[index];
  58913. _this.player.model.transformControls.attach(_this.activeBox);
  58914. _this.emit('clipBoxManager.active', {
  58915. status: true,
  58916. list: _this.clipBoxs
  58917. }); //发送选中事件
  58918. }; //取消选中
  58919. _this.cancelActive = function () {
  58920. _this.player.model.transformControls.detach();
  58921. _this.emit('clipBoxManager.active', {
  58922. status: false,
  58923. list: _this.clipBoxs
  58924. }); //发送选中事件
  58925. if (_this.activeBox) {
  58926. _this.activeBox.status = 0;
  58927. _this.activeBox.lowLight();
  58928. }
  58929. _this.activeBox = null;
  58930. _this.activeBoxIndex = null;
  58931. };
  58932. _this.finishUpdateClipBox = function () {
  58933. //mouseup时调用,确保裁剪准确
  58934. _this.updateClipBox();
  58935. _this.emit('clipBoxManager.update', {
  58936. list: _this.clipBoxs
  58937. }); //发送选中事件
  58938. }; //更新裁剪盒子变化
  58939. _this.updateClipBox = function () {
  58940. if (_this.activeBox) {
  58941. var mat4 = _this.clipBoxs[_this.activeBoxIndex].matrix; //获取所选box的四维矩阵
  58942. _this.clipBoxPoints[_this.activeBoxIndex * 4] = new THREE.Vector3(_this.boxSize / 2, -_this.boxSize / 2, -_this.boxSize / 2).applyMatrix4(mat4);
  58943. _this.clipBoxPoints[_this.activeBoxIndex * 4 + 1] = new THREE.Vector3(-_this.boxSize / 2, _this.boxSize / 2, -_this.boxSize / 2).applyMatrix4(mat4);
  58944. _this.clipBoxPoints[_this.activeBoxIndex * 4 + 2] = new THREE.Vector3(-_this.boxSize / 2, -_this.boxSize / 2, -_this.boxSize / 2).applyMatrix4(mat4);
  58945. _this.clipBoxPoints[_this.activeBoxIndex * 4 + 3] = new THREE.Vector3(-_this.boxSize / 2, -_this.boxSize / 2, _this.boxSize / 2).applyMatrix4(mat4);
  58946. }
  58947. }; //保存编辑
  58948. _this.saveEdit = function () {
  58949. //保存clipBoxType 和 clipBoxs内每个box的matrix到服务器
  58950. var clipMatrixs = [];
  58951. for (var i = 0; i < _this.clipBoxs.length; i++) {
  58952. clipMatrixs.push(_this.clipBoxs[i].matrix.toArray());
  58953. }
  58954. var obj = {
  58955. clipBoxType: JSON.parse(JSON.stringify(_this.clipBoxType)),
  58956. clipMatrixs
  58957. };
  58958. _this.oriObj = obj;
  58959. console.log('save', obj);
  58960. _this.cancelActive();
  58961. return obj;
  58962. }; //退出编辑
  58963. _this.cancelEdit = function () {
  58964. if (_this.adding) _this.cancelAddClipBox();
  58965. _this.clipBoxs = [];
  58966. _this.clipBoxGroup.children = [];
  58967. _this.clipBoxPoints = [];
  58968. _this.clipBoxType = new Array(10).fill(-1);
  58969. _this.player.model.transformControls.detach();
  58970. _this.emit('clipBoxManager.active', {
  58971. status: false,
  58972. list: _this.clipBoxs
  58973. });
  58974. _this.init(_this.oriObj, true); //重新加载数据
  58975. }; //设置所有裁剪盒子显隐
  58976. _this.setAllClipBoxVisible = function (visi) {
  58977. _this.clipBoxGroup.visible = visi;
  58978. }; // 变换TransformControls(0 移动、1 旋转、2 缩放)
  58979. _this.switchTransformControlsMode = function (mode) {
  58980. if (parseInt(mode) == 0) mode = 'translate';
  58981. if (parseInt(mode) == 1) mode = 'rotate';
  58982. if (parseInt(mode) == 2) mode = 'scale';
  58983. _this.player.model.transformControls.mode = mode;
  58984. };
  58985. return _this;
  58986. }
  58987. _createClass(ClipBoxManager, [{
  58988. key: "clipInit",
  58989. value: //开关裁剪
  58990. function clipInit() {
  58991. var _this2 = this;
  58992. if (this.player.model._3dTilesRuntime && !this.isBind3dTile && this.clipBoxs.length !== 0) {
  58993. this.player.model._3dTilesRuntime.getTileset().on('endTileLoading', this.updateMaterials); //监测3dtiles更新
  58994. this.isBind3dTile = true;
  58995. }
  58996. if (this.clipBoxs.length !== 0) {
  58997. if (this.player.model._3dTilesRuntime || this.materials.length === 0) {
  58998. this.materials.length = 0;
  58999. this.player.model.chunks.forEach(function (chunk) {
  59000. return _this2.materials.push(chunk.materialOutside);
  59001. });
  59002. this.player.model.chunks.forEach(function (chunk) {
  59003. return _this2.materials.push(chunk.materialInside);
  59004. });
  59005. }
  59006. this.materials.forEach(function (mat) {
  59007. return mat.uniforms.clipBoxType.value = _this2.clipBoxType, mat.needsUpdate = true;
  59008. });
  59009. this.materials.forEach(function (mat) {
  59010. return mat.uniforms.clipBoxPoints.value = _this2.clipBoxPoints, mat.needsUpdate = true;
  59011. });
  59012. this.defineHasClip(true);
  59013. }
  59014. this.initFinish = true;
  59015. console.log('clipBox init finish');
  59016. }
  59017. }, {
  59018. key: "defineHasClip",
  59019. value: function defineHasClip(isDefine) {
  59020. var _this3 = this;
  59021. this.waitInit(function () {
  59022. if (isDefine) {
  59023. _this3.materials.forEach(function (mat) {
  59024. return mat.defines['HasClip'] = true, mat.needsUpdate = true;
  59025. });
  59026. } else {
  59027. _this3.materials.forEach(function (mat) {
  59028. return delete mat.defines['HasClip'], mat.needsUpdate = true;
  59029. });
  59030. }
  59031. }, this.defineHasClip.bind(this, isDefine));
  59032. }
  59033. }, {
  59034. key: "waitInit",
  59035. value: function waitInit(func, waitFunc) {
  59036. if (this.initFinish) {
  59037. func && func();
  59038. } else {
  59039. this.deferred.then(function () {
  59040. return waitFunc();
  59041. });
  59042. }
  59043. }
  59044. }]);
  59045. return ClipBoxManager;
  59046. }(tinyEmitter);
  59047. function _createSuper$g(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$g(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  59048. function _isNativeReflectConstruct$g() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  59049. /**
  59050. * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs
  59051. */
  59052. var _position = new THREE$1.Vector3();
  59053. var _quaternion = new THREE$1.Quaternion();
  59054. var _scale = new THREE$1.Vector3();
  59055. var CSS3DObject = /*#__PURE__*/function (_Object3D) {
  59056. _inherits(CSS3DObject, _Object3D);
  59057. var _super = _createSuper$g(CSS3DObject);
  59058. function CSS3DObject() {
  59059. var _this2;
  59060. var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.createElement('div');
  59061. _classCallCheck(this, CSS3DObject);
  59062. _this2 = _super.call(this);
  59063. _this2.isCSS3DObject = true;
  59064. _this2.element = element;
  59065. _this2.element.style.position = 'absolute';
  59066. _this2.element.style.pointerEvents = 'auto';
  59067. _this2.element.style.userSelect = 'none';
  59068. _this2.element.setAttribute('draggable', false);
  59069. _this2.addEventListener('removed', function () {
  59070. this.traverse(function (object) {
  59071. if (object.element instanceof Element && object.element.parentNode !== null) {
  59072. object.element.parentNode.removeChild(object.element);
  59073. }
  59074. });
  59075. });
  59076. return _this2;
  59077. }
  59078. _createClass(CSS3DObject, [{
  59079. key: "copy",
  59080. value: function copy(source, recursive) {
  59081. _get(_getPrototypeOf(CSS3DObject.prototype), "copy", this).call(this, source, recursive);
  59082. this.element = source.element.cloneNode(true);
  59083. return this;
  59084. }
  59085. }]);
  59086. return CSS3DObject;
  59087. }(THREE$1.Object3D);
  59088. var _matrix = new THREE$1.Matrix4();
  59089. var _matrix2 = new THREE$1.Matrix4();
  59090. var CSS3DRenderer = function CSS3DRenderer() {
  59091. var parameters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  59092. _classCallCheck(this, CSS3DRenderer);
  59093. var _this = this;
  59094. var _width, _height;
  59095. var _widthHalf, _heightHalf;
  59096. var cache = {
  59097. camera: {
  59098. style: ''
  59099. },
  59100. objects: new WeakMap()
  59101. };
  59102. var domElement = parameters.element !== undefined ? parameters.element : document.createElement('div');
  59103. domElement.style.overflow = 'hidden';
  59104. this.domElement = domElement;
  59105. var viewElement = document.createElement('div');
  59106. viewElement.style.transformOrigin = '0 0';
  59107. viewElement.style.pointerEvents = 'none';
  59108. domElement.appendChild(viewElement);
  59109. var cameraElement = document.createElement('div');
  59110. cameraElement.style.transformStyle = 'preserve-3d';
  59111. viewElement.appendChild(cameraElement);
  59112. this.getSize = function () {
  59113. return {
  59114. width: _width,
  59115. height: _height
  59116. };
  59117. };
  59118. this.render = function (scene, camera) {
  59119. var fov = camera.projectionMatrix.elements[5] * _heightHalf;
  59120. if (camera.view && camera.view.enabled) {
  59121. // view offset
  59122. viewElement.style.transform = "translate( ".concat(-camera.view.offsetX * (_width / camera.view.width), "px, ").concat(-camera.view.offsetY * (_height / camera.view.height), "px )"); // view fullWidth and fullHeight, view width and height
  59123. viewElement.style.transform += "scale( ".concat(camera.view.fullWidth / camera.view.width, ", ").concat(camera.view.fullHeight / camera.view.height, " )");
  59124. } else {
  59125. viewElement.style.transform = '';
  59126. }
  59127. if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld();
  59128. if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld();
  59129. var tx, ty;
  59130. if (camera.isOrthographicCamera) {
  59131. tx = -(camera.right + camera.left) / 2;
  59132. ty = (camera.top + camera.bottom) / 2;
  59133. }
  59134. var scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1;
  59135. var cameraCSSMatrix = camera.isOrthographicCamera ? "scale( ".concat(scaleByViewOffset, " )") + 'scale(' + fov + ')' + 'translate(' + epsilon(tx) + 'px,' + epsilon(ty) + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse) : "scale( ".concat(scaleByViewOffset, " )") + 'translateZ(' + fov + 'px)' + getCameraCSSMatrix(camera.matrixWorldInverse);
  59136. var perspective = camera.isPerspectiveCamera ? 'perspective(' + fov + 'px) ' : '';
  59137. var style = perspective + cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)';
  59138. if (cache.camera.style !== style) {
  59139. cameraElement.style.transform = style;
  59140. cache.camera.style = style;
  59141. }
  59142. renderObject(scene, scene, camera);
  59143. };
  59144. this.setSize = function (width, height) {
  59145. _width = width;
  59146. _height = height;
  59147. _widthHalf = _width / 2;
  59148. _heightHalf = _height / 2;
  59149. domElement.style.width = width + 'px';
  59150. domElement.style.height = height + 'px';
  59151. viewElement.style.width = width + 'px';
  59152. viewElement.style.height = height + 'px';
  59153. cameraElement.style.width = width + 'px';
  59154. cameraElement.style.height = height + 'px';
  59155. };
  59156. function epsilon(value) {
  59157. return Math.abs(value) < 1e-10 ? 0 : value;
  59158. }
  59159. function getCameraCSSMatrix(matrix) {
  59160. var elements = matrix.elements;
  59161. return 'matrix3d(' + epsilon(elements[0]) + ',' + epsilon(-elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(elements[6]) + ',' + epsilon(elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(-elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(-elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')';
  59162. }
  59163. function getObjectCSSMatrix(matrix) {
  59164. var elements = matrix.elements;
  59165. var matrix3d = 'matrix3d(' + epsilon(elements[0]) + ',' + epsilon(elements[1]) + ',' + epsilon(elements[2]) + ',' + epsilon(elements[3]) + ',' + epsilon(-elements[4]) + ',' + epsilon(-elements[5]) + ',' + epsilon(-elements[6]) + ',' + epsilon(-elements[7]) + ',' + epsilon(elements[8]) + ',' + epsilon(elements[9]) + ',' + epsilon(elements[10]) + ',' + epsilon(elements[11]) + ',' + epsilon(elements[12]) + ',' + epsilon(elements[13]) + ',' + epsilon(elements[14]) + ',' + epsilon(elements[15]) + ')';
  59166. return 'translate(-50%,-50%)' + matrix3d;
  59167. }
  59168. function renderObject(object, scene, camera, cameraCSSMatrix) {
  59169. if (object.isCSS3DObject) {
  59170. var visible = object.visible === true && object.layers.test(camera.layers) === true;
  59171. object.element.style.display = visible === true ? '' : 'none';
  59172. if (visible === true) {
  59173. object.onBeforeRender(_this, scene, camera);
  59174. var style;
  59175. if (object.isCSS3DSprite) {
  59176. // http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/
  59177. _matrix.copy(camera.matrixWorldInverse);
  59178. _matrix.transpose();
  59179. if (object.rotation2D !== 0) _matrix.multiply(_matrix2.makeRotationZ(object.rotation2D));
  59180. object.matrixWorld.decompose(_position, _quaternion, _scale);
  59181. _matrix.setPosition(_position);
  59182. _matrix.scale(_scale);
  59183. _matrix.elements[3] = 0;
  59184. _matrix.elements[7] = 0;
  59185. _matrix.elements[11] = 0;
  59186. _matrix.elements[15] = 1;
  59187. style = getObjectCSSMatrix(_matrix);
  59188. } else {
  59189. style = getObjectCSSMatrix(object.matrixWorld);
  59190. }
  59191. var element = object.element;
  59192. var cachedObject = cache.objects.get(object);
  59193. if (cachedObject === undefined || cachedObject.style !== style) {
  59194. element.style.transform = style;
  59195. var objectData = {
  59196. style: style
  59197. };
  59198. cache.objects.set(object, objectData);
  59199. }
  59200. if (element.parentNode !== cameraElement) {
  59201. cameraElement.appendChild(element);
  59202. }
  59203. object.onAfterRender(_this, scene, camera);
  59204. }
  59205. }
  59206. for (var i = 0, l = object.children.length; i < l; i++) {
  59207. renderObject(object.children[i], scene, camera);
  59208. }
  59209. }
  59210. };
  59211. function _createSuper$f(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$f(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  59212. function _isNativeReflectConstruct$f() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  59213. var CSS3DEleObj = /*#__PURE__*/function (_CSS3DObject) {
  59214. _inherits(CSS3DEleObj, _CSS3DObject);
  59215. var _super = _createSuper$f(CSS3DEleObj);
  59216. function CSS3DEleObj(elem, option) {
  59217. var _this;
  59218. _classCallCheck(this, CSS3DEleObj);
  59219. _this = _super.call(this, elem);
  59220. _this.player = option.player;
  59221. _this.manager = option.manager; // this.sid = option.sid !== undefined ? option.sid : common.getRandomSid()
  59222. // this.sid = option.sid !== undefined ? option.sid : '123123123'
  59223. _this.sid = option.sid;
  59224. _this.text = option.text !== undefined ? option.text : '';
  59225. _this.widthHeight = option.widthHeight;
  59226. _this.renderRes = option.renderRes !== undefined ? option.renderRes : 1;
  59227. _this.panoId = option.panoId;
  59228. elem.children[0].style.zoom = _this.renderRes;
  59229. _this.scaleRes = option.scaleRes !== undefined ? option.scaleRes / _this.renderRes : 1 / _this.renderRes;
  59230. _this.scale.set(_this.scaleRes, _this.scaleRes, _this.scaleRes);
  59231. _this.enabled = option.visible !== undefined ? option.visible : true;
  59232. _this.visible = option.visible !== undefined ? option.visible : true;
  59233. _this.plane = new THREE.Mesh(new THREE.PlaneGeometry(0.25, 0.25), new THREE.MeshBasicMaterial({
  59234. wireframe: true,
  59235. side: 2
  59236. })); // console.log()
  59237. if (_this.widthHeight) _this.plane.scale.set(_this.widthHeight.x / 100, _this.widthHeight.y / 100, 1);
  59238. option.position !== undefined && _this.plane.position.copy(option.position);
  59239. option.rotation !== undefined && _this.plane.rotation.copy(option.rotation);
  59240. _this.plane.css3dObj = _assertThisInitialized(_this); // this.player.domElement.addEventListener('pointerdown', e => {
  59241. // console.log('player down')
  59242. // })
  59243. elem.addEventListener('pointerdown', function (e) {
  59244. e.stopPropagation();
  59245. });
  59246. elem.addEventListener('pointermove', function (e) {
  59247. e.stopPropagation();
  59248. });
  59249. elem.addEventListener('pointerup', function (e) {
  59250. e.stopPropagation();
  59251. _this.manager.flyAndLookAt(_assertThisInitialized(_this));
  59252. });
  59253. elem.addEventListener('mousewheel', function (e) {
  59254. e.stopPropagation();
  59255. });
  59256. elem.addEventListener('mousedown', function (e) {
  59257. e.stopPropagation();
  59258. });
  59259. elem.addEventListener('mousemove', function (e) {
  59260. e.stopPropagation();
  59261. });
  59262. elem.addEventListener('mouseup', function (e) {
  59263. e.stopPropagation();
  59264. });
  59265. _this.visible = false;
  59266. _this.tempHide = false;
  59267. _this.plane.visible = false;
  59268. return _this;
  59269. }
  59270. _createClass(CSS3DEleObj, [{
  59271. key: "update",
  59272. value: function update() {
  59273. this.position.copy(this.plane.position);
  59274. this.rotation.copy(this.plane.rotation);
  59275. if (!this.widthHeight || this.widthHeight.x === 0 || this.widthHeight.y === 0) {
  59276. this.widthHeight = {
  59277. x: 0,
  59278. y: 0
  59279. };
  59280. this.widthHeight.x = this.element.firstChild.offsetWidth;
  59281. this.widthHeight.y = this.element.firstChild.offsetHeight;
  59282. this.plane.scale.set(this.widthHeight.x / 100, this.widthHeight.y / 100, 1);
  59283. } else {
  59284. var w = Math.floor(this.plane.scale.x * 100);
  59285. var h = Math.floor(this.plane.scale.y * 100);
  59286. this.element.firstChild.style.width = w + 'px';
  59287. this.element.firstChild.style.height = h + 'px';
  59288. this.widthHeight.x = w;
  59289. this.widthHeight.y = h;
  59290. } // if (this.manager.isEdit) {
  59291. // } else if (!this.enabled || (this.player.mode === 'panorama' && this.player.currentPano.id !== this.panoId)) {
  59292. // this.visible = false
  59293. // return
  59294. // }
  59295. //三维模式不显示
  59296. if (this.manager.isEdit) ; else if (!this.enabled || this.player.mode !== 'panorama' || this.player.currentPano.id !== this.panoId) {
  59297. this.visible = false;
  59298. return;
  59299. } // 墙体遮挡
  59300. // var p = convertTool.getPos2d(this.position, this.player)
  59301. // if (convertTool.ifShelter(this.position, this.player, { x: p.vector.x, y: p.vector.y }, null, null)) {
  59302. // console.log('hide')
  59303. // this.visible = false
  59304. // return
  59305. // } else if (this.enabled && !this.tempHide) {
  59306. // this.visible = true
  59307. // }
  59308. if (this.enabled && !this.tempHide) {
  59309. this.visible = true;
  59310. }
  59311. }
  59312. }, {
  59313. key: "updatePlane",
  59314. value: function updatePlane() {
  59315. this.plane.position.copy(this.position);
  59316. this.plane.rotation.copy(this.rotation);
  59317. var w = this.widthHeight.x / 100;
  59318. var h = this.widthHeight.y / 100;
  59319. this.plane.scale.set(w, h, 1);
  59320. }
  59321. }]);
  59322. return CSS3DEleObj;
  59323. }(CSS3DObject);
  59324. var css$1 = ".domBox {\n max-width: 500px;\n max-height: 500px;\n background-color: #292929;\n border-radius: 5px;\n padding: 20px;\n font-size: 30px;\n overflow: auto;\n /* overflow-x: hidden; */\n /* overflow-y: auto; */\n\n font-family: Microsoft YaHei;\n font-weight: 400;\n font-size: 14px;\n color: #FFFFFF;\n line-height: 22px;\n text-align: left;\n font-style: normal;\n text-transform: none;\n word-wrap:break-word;\n\n pointer-events: auto;\n cursor: pointer;\n}\n\n/* .domBox :first-child{ */\n /* width: 400px; */\n /* height: 418px; */\n/* } */";
  59325. n$4(css$1,{});
  59326. function _createSuper$e(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$e(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  59327. function _isNativeReflectConstruct$e() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  59328. var settings = {
  59329. maxWidth: 500,
  59330. maxHeight: 500,
  59331. scale: 0.0025,
  59332. renderRes: 2
  59333. };
  59334. function degToRad(degrees) {
  59335. return degrees * (Math.PI / 180);
  59336. }
  59337. function RadTodeg(radians) {
  59338. return Math.floor(radians * (180 / Math.PI));
  59339. }
  59340. function roundToDecimalPlace(number, decimalPlaces) {
  59341. var factor = Math.pow(10, decimalPlaces);
  59342. return Math.round(number * factor) / factor;
  59343. }
  59344. var CSS3DManager = /*#__PURE__*/function (_Emiter) {
  59345. _inherits(CSS3DManager, _Emiter);
  59346. var _super = _createSuper$e(CSS3DManager);
  59347. function CSS3DManager(app) {
  59348. var _this;
  59349. _classCallCheck(this, CSS3DManager);
  59350. _this = _super.call(this);
  59351. _this.bindEvents = function () {
  59352. // this.player.on('pointerStart', this.onMouseDown)
  59353. // this.player.on('pointerMove', this.onMouseMove)
  59354. // this.player.on('pointerUp', this.onMouseUp)
  59355. if (_this.isBind) return;
  59356. _this.player.on(PlayerEvents.ViewChanged, _this.update);
  59357. _this.player.on('flying.start', _this.onFlyStart.bind(_assertThisInitialized(_this)));
  59358. _this.player.on('flying.ended', _this.onFlyEnd.bind(_assertThisInitialized(_this))); // this.player.model.transformControls.addEventListener('mouseUp', this.finishUpdateClipBox)
  59359. _this.isBind = true;
  59360. };
  59361. _this.unBindEvents = function () {
  59362. // this.player.off('pointerStart', this.onMouseDown)
  59363. // this.player.off('pointerMove', this.onMouseMove)
  59364. // this.player.off('pointerUp', this.onMouseUp)
  59365. if (!_this.isBind) return;
  59366. _this.player.off(PlayerEvents.ViewChanged, _this.update);
  59367. _this.isBind = false;
  59368. };
  59369. _this.onFlyStart = function () {
  59370. _this.update();
  59371. };
  59372. _this.onFlyEnd = function () {
  59373. if (_this.isEdit) {
  59374. if (_this.player.mode === Viewmode$1.PANORAMA) {
  59375. _this.player.locked = true;
  59376. } else {
  59377. _this.player.locked = false;
  59378. }
  59379. }
  59380. _this.update();
  59381. };
  59382. _this.switchTransformControlsMode = function (mode) {
  59383. if (parseInt(mode) == 0) mode = 'translate';
  59384. if (parseInt(mode) == 1) mode = 'rotate';
  59385. if (parseInt(mode) == 2) mode = 'scale';
  59386. _this.player.model.transformControls.mode = mode;
  59387. };
  59388. _this.update = function () {
  59389. // console.log('update')
  59390. _this.list.forEach(function (i) {
  59391. i.update();
  59392. });
  59393. };
  59394. _this.show = function (sid) {
  59395. _this.waitInit(function () {
  59396. var obj = _this.getObjBySid(sid);
  59397. if (!obj) {
  59398. console.error('cssObject no found sid=' + sid);
  59399. return;
  59400. }
  59401. obj.enabled = true;
  59402. obj.visible = true;
  59403. if (_this.isEdit) {
  59404. _this.player.model.transformControls.visible = true;
  59405. }
  59406. }, _this.show.bind(_assertThisInitialized(_this), sid));
  59407. };
  59408. _this.hide = function (sid) {
  59409. _this.waitInit(function () {
  59410. var obj = _this.getObjBySid(sid);
  59411. if (!obj) {
  59412. console.error('cssObject no found sid=' + sid);
  59413. return;
  59414. }
  59415. obj.enabled = false;
  59416. obj.visible = false;
  59417. if (_this.isEdit) {
  59418. // this.player.model.transformControls.enabled = false
  59419. _this.player.model.transformControls.visible = false;
  59420. }
  59421. }, _this.hide.bind(_assertThisInitialized(_this), sid));
  59422. };
  59423. _this.showAll = function (current) {
  59424. var currentPano;
  59425. if (current) currentPano = _this.player.currentPano;
  59426. _this.list.forEach(function (i) {
  59427. if (current && currentPano) {
  59428. i.panoId === currentPano.id && (i.visible = true);
  59429. } else {
  59430. i.tempHide = false;
  59431. i.visible = true;
  59432. }
  59433. });
  59434. _this.update();
  59435. };
  59436. _this.hideAll = function () {
  59437. // this.group.visible = false //无效
  59438. _this.list.forEach(function (i) {
  59439. i.tempHide = true;
  59440. i.visible = false;
  59441. });
  59442. console.log('hideAll');
  59443. _this.update();
  59444. };
  59445. _this.sendData = function () {
  59446. if (!_this.isEdit) return;
  59447. var plane = _this.player.model.transformControls.object;
  59448. var obj = plane.css3dObj;
  59449. plane.scale.x = Math.min(settings.maxWidth / 100, plane.scale.x);
  59450. plane.scale.y = Math.min(settings.maxHeight / 100, plane.scale.y);
  59451. plane.scale.x = Math.max(40 / 100, plane.scale.x);
  59452. plane.scale.y = Math.max(40 / 100, plane.scale.y);
  59453. var data = {
  59454. sid: obj.sid,
  59455. position: {
  59456. x: roundToDecimalPlace(obj.position.x, 2),
  59457. y: roundToDecimalPlace(obj.position.y, 2),
  59458. z: roundToDecimalPlace(obj.position.z, 2)
  59459. },
  59460. scale: {
  59461. x: obj.widthHeight.x,
  59462. y: obj.widthHeight.y
  59463. },
  59464. rotation: {
  59465. x: RadTodeg(obj.rotation.x),
  59466. y: RadTodeg(obj.rotation.y),
  59467. z: RadTodeg(obj.rotation.z)
  59468. },
  59469. panoId: obj.panoId,
  59470. visible: obj.enabled,
  59471. text: obj.text
  59472. };
  59473. _this.emit('css3dmanager_sendData', data);
  59474. };
  59475. _this.setEditStyle = function (obj, isEnter) {
  59476. if (isEnter) {
  59477. _this.player.model.transformControls.attach(obj.plane);
  59478. if (!obj.enabled) {
  59479. _this.player.model.transformControls.visible = false;
  59480. }
  59481. obj.element.style.opacity = 0.5;
  59482. obj.element.style.pointerEvents = 'none';
  59483. obj.element.firstChild.style.pointerEvents = 'none';
  59484. } else {
  59485. _this.player.model.transformControls.detach();
  59486. obj.element.style.opacity = 1;
  59487. obj.element.style.pointerEvents = 'auto';
  59488. obj.element.firstChild.style.pointerEvents = 'auto';
  59489. }
  59490. };
  59491. _this.app = app;
  59492. _this.player = null;
  59493. _this.deferred = Deferred$1();
  59494. _this.renderer = new CSS3DRenderer();
  59495. _this.group = new THREE.Group();
  59496. _this.group.name = 'css3D_Object_Group';
  59497. _this.list = [];
  59498. _this.intrArr = [];
  59499. _this.mouse = new THREE.Vector3();
  59500. _this.mousedown = new THREE.Vector3();
  59501. _this.mouseup = new THREE.Vector3();
  59502. _this.inited = false;
  59503. _this.isBind = false;
  59504. _this.isEdit = false;
  59505. _this.renderInited = false;
  59506. _this.recoverStack = null; // 初始化
  59507. _this.init = function (metadata) {
  59508. if (metadata) {
  59509. metadata.forEach(function (i) {
  59510. _this.build(i);
  59511. });
  59512. }
  59513. _this.inited = true;
  59514. _this.deferred.resolve(); // this.enterModule()
  59515. };
  59516. _this.addRenderer = function () {
  59517. _this.player.model.add(_this.group);
  59518. var sceneRenderer = _this.app.core.get('SceneRenderer');
  59519. sceneRenderer.css3dRenderer = _this.renderer;
  59520. _this.renderer.domElement.style.position = 'absolute';
  59521. _this.renderer.domElement.style.top = 0;
  59522. _this.renderer.domElement.style.zIndex = 10000;
  59523. _this.renderer.domElement.style.pointerEvents = 'none';
  59524. _this.renderer.setSize(sceneRenderer.renderWidth, sceneRenderer.renderHeight);
  59525. var domElement = _this.app.dom.querySelector('.player'); // let domElement = this.app.dom
  59526. domElement.appendChild(_this.renderer.domElement); // console.log(this.renderer.domElement)
  59527. _this.bindEvents();
  59528. _this.renderInited = true;
  59529. };
  59530. _this.app.Scene.on('loaded', function () {
  59531. setTimeout(function () {
  59532. _this.player = _this.app.core.get('Player'); //获取metadata
  59533. var metadata = null; // let metadata = [
  59534. // {
  59535. // sid: '123123123',
  59536. // position: { x: -16, y: 0, z: 5 },
  59537. // rotation: { x: 0, y: -90, z: 0 },
  59538. // scale: { x: 233, y: 233 },
  59539. // text: '你好',
  59540. // },
  59541. // ]
  59542. _this.init(metadata);
  59543. console.log('css3dManager init finish');
  59544. }, 50);
  59545. }); // 进入编辑
  59546. _this.enterEdit = function (sid) {
  59547. var isNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  59548. _this.waitInit(function () {
  59549. var obj = _this.getObjBySid(sid);
  59550. if (!obj) {
  59551. console.error('cssObject no found sid=' + sid);
  59552. return;
  59553. }
  59554. _this.setEditStyle(obj, true); //transformControls
  59555. _this.player.model.transformControls.switchEditState('css3dpanel');
  59556. _this.player.model.transformControls.addEventListener('mousing', _this.sendData);
  59557. _this.isEdit = true;
  59558. _this.flyAndLookAt(obj, true);
  59559. if (sid.isCSS3DObject) sid = sid.sid;
  59560. var data = {
  59561. sid,
  59562. position: {
  59563. x: obj.position.x,
  59564. y: obj.position.y,
  59565. z: obj.position.z
  59566. },
  59567. scale: {
  59568. x: obj.widthHeight.x,
  59569. y: obj.widthHeight.y
  59570. },
  59571. rotation: {
  59572. x: RadTodeg(obj.rotation.x),
  59573. y: RadTodeg(obj.rotation.y),
  59574. z: RadTodeg(obj.rotation.z)
  59575. },
  59576. visible: obj.enabled,
  59577. text: obj.text,
  59578. panoId: obj.panoId
  59579. };
  59580. _this.emit('css3dmanager_sendData', data);
  59581. _this.recoverStack = {
  59582. obj,
  59583. isNew,
  59584. position: {
  59585. x: obj.position.x,
  59586. y: obj.position.y,
  59587. z: obj.position.z
  59588. },
  59589. scale: {
  59590. x: obj.widthHeight.x,
  59591. y: obj.widthHeight.y
  59592. },
  59593. rotation: {
  59594. x: RadTodeg(obj.rotation.x),
  59595. y: RadTodeg(obj.rotation.y),
  59596. z: RadTodeg(obj.rotation.z)
  59597. },
  59598. enabled: obj.enabled,
  59599. panoId: obj.panoId
  59600. };
  59601. console.log('recoverStack =>', _this.recoverStack);
  59602. }, _this.enterEdit.bind(_assertThisInitialized(_this), sid));
  59603. }; // //离开模块
  59604. _this.leaveEdit = function (obj) {
  59605. _this.setEditStyle(obj, false);
  59606. _this.player.model.transformControls.removeEventListener('mousing', _this.sendData);
  59607. };
  59608. _this.build = function (data, isNew) {
  59609. if (data.panoId === undefined || data.panoId === null) return;
  59610. _this.waitInit(function () {
  59611. console.log('--------------build----------------');
  59612. console.log(data);
  59613. if (!_this.renderInited) _this.addRenderer();
  59614. var position = data.position.isVector3 ? data.position : new THREE.Vector3(data.position.x, data.position.y, data.position.z);
  59615. var scale = data.scale;
  59616. var rotation = data.position.isEuler ? data.rotation : new THREE.Euler(degToRad(data.rotation.x), degToRad(data.rotation.y), degToRad(data.rotation.z));
  59617. var text = data.text;
  59618. var domEle = document.createElement('div');
  59619. var domBox = document.createElement('div');
  59620. domBox.classList.add('domBox');
  59621. domBox.innerText = text;
  59622. domEle.append(domBox);
  59623. var domEleObj = new CSS3DEleObj(domEle, {
  59624. player: _this.player,
  59625. manager: _assertThisInitialized(_this),
  59626. sid: data.sid,
  59627. text: text,
  59628. position: position,
  59629. rotation: rotation,
  59630. renderRes: settings.renderRes,
  59631. scaleRes: settings.scale,
  59632. widthHeight: scale,
  59633. visible: data.visible,
  59634. panoId: data.panoId
  59635. });
  59636. _this.group.add(domEleObj);
  59637. _this.group.add(domEleObj.plane);
  59638. _this.list.push(domEleObj);
  59639. _this.intrArr.push(domEleObj.plane);
  59640. if (data.cameraPos) {
  59641. domEleObj.plane.lookAt(data.cameraPos);
  59642. }
  59643. domEleObj.update();
  59644. if (isNew) {
  59645. _this.waitCSS3DObjInit(domEleObj);
  59646. } // setTimeout(() => {
  59647. // if (scale) {
  59648. // domBox.style.width = scale.x + 'px'
  59649. // domBox.style.height = scale.y + 'px'
  59650. // } else {
  59651. // let x = domBox.offsetWidth
  59652. // let y = domBox.offsetHeight
  59653. // x = x === settings.maxWidth ? x : x - 40
  59654. // y = y === settings.maxHeight ? y : y - 40
  59655. // scale = { x, y }
  59656. // }
  59657. // domEleObj.widthHeight = scale
  59658. // }, 100)
  59659. }, _this.build.bind(_assertThisInitialized(_this), data));
  59660. };
  59661. _this.add = function (data) {
  59662. var camera = _this.player.cameraControls.cameras['panorama'];
  59663. var cameraPos = camera.position;
  59664. var lookAt = new THREE.Vector3();
  59665. camera.getWorldDirection(lookAt);
  59666. var position = cameraPos.clone().add(lookAt);
  59667. position.x = roundToDecimalPlace(position.x, 2);
  59668. position.y = roundToDecimalPlace(position.y, 2);
  59669. position.z = roundToDecimalPlace(position.z, 2);
  59670. var rotation = new THREE.Euler(0, -Math.PI / 2, 0);
  59671. _this.build({
  59672. sid: data.sid,
  59673. position,
  59674. rotation,
  59675. text: data.text,
  59676. visible: true,
  59677. cameraPos,
  59678. panoId: _this.player.currentPano.id
  59679. }, true);
  59680. };
  59681. _this.resetOption = function (sid) {
  59682. _this.waitInit(function () {
  59683. var func = function func() {
  59684. var obj = _this.getObjBySid(sid);
  59685. if (!obj) {
  59686. console.error('cssObject no found sid=' + sid);
  59687. return;
  59688. }
  59689. _this.recoverStack = {
  59690. obj,
  59691. isNew: false,
  59692. position: {
  59693. x: obj.position.x,
  59694. y: obj.position.y,
  59695. z: obj.position.z
  59696. },
  59697. scale: {
  59698. x: obj.widthHeight.x,
  59699. y: obj.widthHeight.y
  59700. },
  59701. rotation: {
  59702. x: RadTodeg(obj.rotation.x),
  59703. y: RadTodeg(obj.rotation.y),
  59704. z: RadTodeg(obj.rotation.z)
  59705. },
  59706. panoId: obj.panoId,
  59707. enabled: obj.enabled
  59708. };
  59709. _this.isEdit = true;
  59710. _this.setEditStyle(obj, true);
  59711. _this.player.model.transformControls.switchEditState('css3dpanel');
  59712. _this.player.model.transformControls.addEventListener('mousing', _this.sendData);
  59713. _this.player.locked = true;
  59714. var camera = _this.player.cameraControls.cameras['panorama'];
  59715. var cameraPos = camera.position;
  59716. var lookAt = new THREE.Vector3();
  59717. camera.getWorldDirection(lookAt);
  59718. var position = cameraPos.clone().add(lookAt);
  59719. position.x = roundToDecimalPlace(position.x, 2);
  59720. position.y = roundToDecimalPlace(position.y, 2);
  59721. position.z = roundToDecimalPlace(position.z, 2);
  59722. var panoId = _this.player.currentPano.id;
  59723. obj.position.copy(position);
  59724. obj.panoId = panoId;
  59725. obj.lookAt(camera.position);
  59726. obj.updatePlane();
  59727. obj.update();
  59728. var data = {
  59729. sid,
  59730. position: {
  59731. x: obj.position.x,
  59732. y: obj.position.y,
  59733. z: obj.position.z
  59734. },
  59735. scale: {
  59736. x: obj.widthHeight.x,
  59737. y: obj.widthHeight.y
  59738. },
  59739. rotation: {
  59740. x: RadTodeg(obj.rotation.x),
  59741. y: RadTodeg(obj.rotation.y),
  59742. z: RadTodeg(obj.rotation.z)
  59743. },
  59744. panoId: obj.panoId,
  59745. visible: obj.enabled,
  59746. text: obj.text
  59747. };
  59748. _this.emit('css3dmanager_sendData', data);
  59749. };
  59750. if (_this.player.mode !== Viewmode$1.PANORAMA) {
  59751. _this.player.insideMode();
  59752. _this.player.once('flying.ended', func.bind(_assertThisInitialized(_this)));
  59753. } else {
  59754. func();
  59755. }
  59756. }, _this.resetOption.bind(_assertThisInitialized(_this), sid));
  59757. };
  59758. _this.updateList = function (list) {
  59759. _this.waitInit(function () {
  59760. if (_this.isEdit) return;
  59761. if (!list || list.length <= 0) return;
  59762. list.forEach(function (data) {
  59763. var obj = _this.getObjBySid(data.sid);
  59764. if (!obj) {
  59765. _this.build(data);
  59766. } else {
  59767. if (obj.text !== data.text) {
  59768. console.log(obj.sid + '=> text udpate');
  59769. _this.setText(obj, data.text);
  59770. }
  59771. if (obj.position.x !== data.position.x || obj.position.y !== data.position.y || obj.position.z !== data.position.z) {
  59772. console.log(obj.sid + '=> position udpate');
  59773. _this.setPosition(obj, data.position);
  59774. }
  59775. if (Math.abs(RadTodeg(obj.rotation.x) - data.rotation.x) >= 1 || Math.abs(RadTodeg(obj.rotation.y) - data.rotation.y) >= 1 || Math.abs(RadTodeg(obj.rotation.z) - data.rotation.z) >= 1) {
  59776. console.log(obj.sid + '=> rotation udpate');
  59777. _this.setRotation(obj, data.rotation);
  59778. }
  59779. if (obj.widthHeight.x !== data.scale.x || obj.widthHeight.y !== data.scale.y) {
  59780. console.log(obj.sid + '=> scale udpate');
  59781. _this.setScale(obj, data.scale);
  59782. }
  59783. if (obj.enabled !== data.visible) {
  59784. console.log(obj, obj.enabled, data.visible);
  59785. console.log(obj.sid + '=> visible udpate');
  59786. obj.enabled = data.visible; // obj.visible = data.visible
  59787. }
  59788. }
  59789. });
  59790. }, _this.updateList.bind(_assertThisInitialized(_this), list));
  59791. };
  59792. _this.setText = function (sid, text) {
  59793. var obj = _this.getObjBySid(sid);
  59794. if (!obj) {
  59795. console.error('cssObject no found sid=' + sid);
  59796. return;
  59797. }
  59798. obj.element.children[0].innerText = text;
  59799. obj.text = text;
  59800. };
  59801. _this.setPosition = function (sid, position) {
  59802. var obj = _this.getObjBySid(sid);
  59803. if (!obj) {
  59804. console.error('cssObject no found sid=' + sid);
  59805. return;
  59806. }
  59807. var p = new THREE.Vector3(position.x, position.y, position.z);
  59808. obj.position.copy(p);
  59809. obj.updatePlane();
  59810. };
  59811. _this.setRotation = function (sid, rotation) {
  59812. var obj = _this.getObjBySid(sid);
  59813. if (!obj) {
  59814. console.error('cssObject no found sid=' + sid);
  59815. return;
  59816. }
  59817. var r = new THREE.Euler(degToRad(rotation.x), degToRad(rotation.y), degToRad(rotation.z));
  59818. obj.rotation.copy(r);
  59819. obj.updatePlane();
  59820. };
  59821. _this.setScale = function (sid, scale) {
  59822. var obj = _this.getObjBySid(sid);
  59823. if (!obj) {
  59824. console.error('cssObject no found sid=' + sid);
  59825. return;
  59826. }
  59827. var elem = obj.element.children[0];
  59828. elem.style.width = scale.x + 'px';
  59829. elem.style.height = scale.y + 'px';
  59830. obj.widthHeight = {
  59831. x: scale.x,
  59832. y: scale.y
  59833. };
  59834. if (scale.x > settings.maxWidth) {
  59835. elem.style.maxWidth = 'none';
  59836. } else {
  59837. elem.style.maxWidth = settings.maxWidth + 'px';
  59838. }
  59839. if (scale.y > settings.maxHeight) {
  59840. elem.style.maxHeight = 'none';
  59841. } else {
  59842. elem.style.maxHeight = settings.maxHeight + 'px';
  59843. }
  59844. obj.updatePlane();
  59845. };
  59846. _this.getObjBySid = function (sid) {
  59847. var obj = null;
  59848. if (sid.isCSS3DObject) {
  59849. obj = sid;
  59850. } else {
  59851. for (var i = 0; i < _this.list.length; i++) {
  59852. if (_this.list[i].sid === sid) {
  59853. obj = _this.list[i];
  59854. break;
  59855. }
  59856. }
  59857. }
  59858. return obj;
  59859. };
  59860. _this.flyAndLookAt = function (sid, enterEdit) {
  59861. var obj = _this.getObjBySid(sid);
  59862. if (!obj) {
  59863. console.error('cssObject no found sid=' + sid);
  59864. return;
  59865. }
  59866. if (obj.panoId === undefined) {
  59867. console.error('cssObject.panoId no found sid=' + sid);
  59868. return;
  59869. }
  59870. var currentPanoId = _this.player.currentPano.id;
  59871. _this.player.flyToPano({
  59872. pano: _this.app.Scene.panos.index[obj.panoId],
  59873. lookAtPoint: obj.position,
  59874. checkAlone: true
  59875. });
  59876. if (enterEdit && currentPanoId === obj.panoId) {
  59877. _this.player.locked = true;
  59878. }
  59879. }; // //删除
  59880. // this.delete = () => {}
  59881. // //清空
  59882. // this.clear = () => {}
  59883. //保存编辑
  59884. _this.saveEdit = function () {
  59885. if (!_this.isEdit) return;
  59886. _this.leaveEdit(_this.recoverStack.obj);
  59887. _this.recoverStack = null;
  59888. _this.isEdit = false;
  59889. _this.player.locked = false;
  59890. _this.update();
  59891. }; //退出编辑
  59892. _this.cancelEdit = function () {
  59893. if (!_this.isEdit) return;
  59894. console.log(_this.recoverStack);
  59895. _this.leaveEdit(_this.recoverStack.obj);
  59896. if (_this.recoverStack.isNew) {
  59897. _this.recoverStack.obj.removeFromParent();
  59898. return;
  59899. }
  59900. _this.setPosition(_this.recoverStack.obj, _this.recoverStack.position);
  59901. _this.setRotation(_this.recoverStack.obj, _this.recoverStack.rotation);
  59902. _this.setScale(_this.recoverStack.obj, _this.recoverStack.scale);
  59903. _this.recoverStack.obj.enabled = _this.recoverStack.enabled;
  59904. _this.recoverStack.obj.panoId = _this.recoverStack.panoId; // this.recoverStack.obj.visible = this.recoverStack.visible
  59905. _this.recoverStack = null;
  59906. _this.isEdit = false;
  59907. _this.player.locked = false;
  59908. _this.update();
  59909. };
  59910. return _this;
  59911. } //事件绑定
  59912. _createClass(CSS3DManager, [{
  59913. key: "waitInit",
  59914. value: //等待初始化
  59915. function waitInit(func, waitFunc) {
  59916. if (this.inited) {
  59917. func && func();
  59918. } else {
  59919. this.deferred.then(function () {
  59920. return waitFunc();
  59921. });
  59922. }
  59923. }
  59924. }, {
  59925. key: "waitCSS3DObjInit",
  59926. value: function waitCSS3DObjInit(obj) {
  59927. var _this2 = this;
  59928. if (obj.widthHeight.x !== 0 && obj.widthHeight.y !== 0) {
  59929. this.enterEdit(obj, true);
  59930. } else {
  59931. setTimeout(function () {
  59932. obj.update();
  59933. _this2.waitCSS3DObjInit(obj);
  59934. }, 50);
  59935. }
  59936. }
  59937. }]);
  59938. return CSS3DManager;
  59939. }(tinyEmitter);
  59940. function _createSuper$d(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$d(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  59941. function _isNativeReflectConstruct$d() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  59942. var ScaleZoom$1 = 1;
  59943. var size$1 = 0.012;
  59944. var Point = /*#__PURE__*/function (_THREE$Sprite) {
  59945. _inherits(Point, _THREE$Sprite);
  59946. var _super = _createSuper$d(Point);
  59947. function Point(color) {
  59948. var _this;
  59949. _classCallCheck(this, Point);
  59950. var data = new Uint8Array([255, 255, 255, 255]);
  59951. var map = new THREE.DataTexture(data, 1, 1);
  59952. map.needsUpdate = true;
  59953. var material = new THREE.SpriteMaterial({
  59954. transparent: true,
  59955. sizeAttenuation: false,
  59956. color: color,
  59957. map: map
  59958. });
  59959. var customUniforms = {
  59960. uactive: {
  59961. value: false
  59962. }
  59963. };
  59964. material.onBeforeCompile = function (shader) {
  59965. shader.uniforms.uactive = customUniforms.uactive;
  59966. shader.fragmentShader = shader.fragmentShader.replace('#include <uv_pars_fragment>', "\n #include <uv_pars_fragment>\n \n uniform bool uactive;\n ");
  59967. shader.fragmentShader = shader.fragmentShader.replace('#include <output_fragment>', "\n #ifdef OPAQUE\n diffuseColor.a = 1.0;\n #endif\n #ifdef USE_TRANSMISSION\n strength *= transmissionAlpha + 0.1;\n #endif\n float strength = 1.0 - smoothstep(0.3, 0.55, distance(vUv, vec2(0.5)));\n // if(strength == 0.0) discard;\n diffuseColor.a = strength; \n vec3 col = diffuse;\n if (uactive) {\n float outline = 1.0 - smoothstep(0.15, 0.3, distance(vUv, vec2(0.5)));\n // col = outline == 0.0 ? vec3(0.0, 0.7843, 0.6863) : vec3(1.0, 1.0, 1.0);\n col = mix(vec3(0.0, 0.7843, 0.6863), vec3(1.0, 1.0, 1.0), outline);\n }\n gl_FragColor = vec4(col, diffuseColor.a);\n ");
  59968. };
  59969. material.depthFunc = THREE.AlwaysDepth;
  59970. _this = _super.call(this, material);
  59971. _this.uniforms = customUniforms;
  59972. _this.color = color;
  59973. _this.scale.set(size$1, size$1, 1);
  59974. _this.renderOrder = RenderOrder.monitorPlane;
  59975. _this.setScale(null, false);
  59976. _this.isPolygonMarkElement = true;
  59977. _this.isPolygonMarkPoint = true;
  59978. return _this;
  59979. }
  59980. _createClass(Point, [{
  59981. key: "setPosition",
  59982. value: function setPosition(pos) {
  59983. this.position.copy(pos);
  59984. }
  59985. }, {
  59986. key: "setScale",
  59987. value: function setScale(zoom) {
  59988. var fromZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  59989. var t;
  59990. if (zoom) {
  59991. t = 0.012 * (1 / zoom);
  59992. if (fromZoom) ScaleZoom$1 = zoom;
  59993. } else {
  59994. t = 0.012 * (1 / ScaleZoom$1);
  59995. }
  59996. this.scale.set(t, t, t);
  59997. }
  59998. }, {
  59999. key: "setColor",
  60000. value: function setColor(color) {
  60001. var cover = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  60002. this.material.color.set(color);
  60003. cover && (this.color = color);
  60004. }
  60005. }, {
  60006. key: "highLight",
  60007. value: function highLight() {
  60008. this.uniforms.uactive.value = true;
  60009. this.visible = true;
  60010. }
  60011. }, {
  60012. key: "midLight",
  60013. value: function midLight() {
  60014. this.uniforms.uactive.value = false;
  60015. this.visible = true;
  60016. }
  60017. }, {
  60018. key: "lowLight",
  60019. value: function lowLight() {
  60020. this.uniforms.uactive.value = false;
  60021. this.visible = false;
  60022. }
  60023. }]);
  60024. return Point;
  60025. }(THREE.Sprite);
  60026. function _createSuper$c(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$c(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  60027. function _isNativeReflectConstruct$c() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  60028. var activeColor$2 = 0x00c8af;
  60029. var dashedMat = LineDraw.createFatLineMat({
  60030. lineWidth: 2,
  60031. color: activeColor$2,
  60032. dashSize: 0.03,
  60033. gapSize: 0.03,
  60034. dashed: true
  60035. /*, alwaysShow: true*/
  60036. });
  60037. var activeMat$1 = LineDraw.createFatLineMat({
  60038. lineWidth: 2,
  60039. color: activeColor$2
  60040. /*, alwaysShow: true*/
  60041. });
  60042. var Line = /*#__PURE__*/function (_THREE$Group) {
  60043. _inherits(Line, _THREE$Group);
  60044. var _super = _createSuper$c(Line);
  60045. function Line(points, lineMat) {
  60046. var _this;
  60047. _classCallCheck(this, Line);
  60048. // let normalMaterial = new THREE.LineBasicMaterial({ //默认 normal
  60049. // color: color,
  60050. // depthFunc: THREE.AlwaysDepth
  60051. // })
  60052. // let activeMaterial = new THREE.LineBasicMaterial({ //激活 active
  60053. // color: 0x00C8AF,
  60054. // depthFunc: THREE.AlwaysDepth
  60055. // })
  60056. // let dashedMaterial = new THREE.LineDashedMaterial({ //虚线 dashed
  60057. // color: 0x00C8AF,
  60058. // dashSize: 0.01,
  60059. // gapSize: 0.01,
  60060. // scale: 1,
  60061. // depthFunc: THREE.AlwaysDepth
  60062. // })
  60063. // const geometry = new THREE.BufferGeometry().setFromPoints(points)
  60064. // super(geometry, dashedMaterial)
  60065. // this.normalMaterial = normalMaterial
  60066. // this.activeMaterial = activeMaterial
  60067. // this.dashedMaterial = dashedMaterial
  60068. // this.frustumCulled = false
  60069. // this.renderOrder = RenderOrder.entryArrow
  60070. // this.isPolygonMarkElement = true
  60071. // this.startPoint = points[0]
  60072. // this.line = LineDraw.createFatLine(points, { material: lineMat })
  60073. // this.line.renderOrder = RenderOrder.entryArrow
  60074. // console.log(this.line)
  60075. // this.add(this.line)
  60076. _this = _super.call(this);
  60077. _this.line = LineDraw.createFatLine(points, {
  60078. material: lineMat
  60079. });
  60080. _this.line.renderOrder = RenderOrder.entryArrow;
  60081. _this.normalMaterial = lineMat;
  60082. _this.startPoint = points[0];
  60083. _this.add(_this.line);
  60084. return _this;
  60085. }
  60086. _createClass(Line, [{
  60087. key: "setMaterial",
  60088. value: function setMaterial(type) {
  60089. switch (type) {
  60090. case 'normal':
  60091. this.line.material = this.normalMaterial;
  60092. break;
  60093. case 'active':
  60094. this.line.material = activeMat$1;
  60095. break;
  60096. case 'dashed':
  60097. this.line.material = dashedMat;
  60098. break;
  60099. }
  60100. }
  60101. }, {
  60102. key: "update",
  60103. value: function update(pos) {
  60104. LineDraw.moveFatLine(this.line, [this.startPoint, pos]);
  60105. }
  60106. }]);
  60107. return Line;
  60108. }(THREE.Group);
  60109. function _createSuper$b(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$b(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  60110. function _isNativeReflectConstruct$b() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  60111. var activeColor$1 = 0x00c8af;
  60112. var activeMat = LineDraw.createFatLineMat({
  60113. lineWidth: 2,
  60114. color: activeColor$1
  60115. /*, alwaysShow: true*/
  60116. });
  60117. var LineLoop = /*#__PURE__*/function (_THREE$Group) {
  60118. _inherits(LineLoop, _THREE$Group);
  60119. var _super = _createSuper$b(LineLoop);
  60120. function LineLoop(points, lineMat) {
  60121. var _this;
  60122. _classCallCheck(this, LineLoop);
  60123. _this = _super.call(this);
  60124. var p = points[0].clone();
  60125. p = points.concat([p]);
  60126. var material = new THREE.LineBasicMaterial({
  60127. color: 0xffffff // opacity: 0,
  60128. // transparent: true
  60129. });
  60130. for (var i = 0; i < p.length - 1; i++) {
  60131. var temp = [p[i], p[i + 1]];
  60132. var geometry = new THREE.BufferGeometry().setFromPoints(temp);
  60133. var line = new THREE.Line(geometry, material);
  60134. line.isPolygonMarkElement = true;
  60135. line.isPolygonMarkLine = true;
  60136. line.startPoint = i; // line.endPoint = i+1
  60137. _this.add(line);
  60138. }
  60139. _this.fatLine = LineDraw.createFatLine(p, {
  60140. material: lineMat
  60141. });
  60142. _this.fatLine.renderOrder = RenderOrder.entryArrow;
  60143. _this.normalMaterial = lineMat;
  60144. _this.isPolygonMarkElement = true;
  60145. _this.isPolygonMarkLineLoop = true;
  60146. _this.add(_this.fatLine);
  60147. return _this;
  60148. }
  60149. _createClass(LineLoop, [{
  60150. key: "setColor",
  60151. value: function setColor(color) {
  60152. this.normalMaterial.color.set(color);
  60153. }
  60154. }, {
  60155. key: "highLight",
  60156. value: function highLight() {
  60157. this.fatLine.material = activeMat;
  60158. }
  60159. }, {
  60160. key: "midLight",
  60161. value: function midLight() {
  60162. this.fatLine.material = this.normalMaterial;
  60163. }
  60164. }, {
  60165. key: "lowLight",
  60166. value: function lowLight() {
  60167. this.fatLine.material = this.normalMaterial;
  60168. }
  60169. }]);
  60170. return LineLoop;
  60171. }(THREE.Group);
  60172. function _createSuper$a(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$a(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  60173. function _isNativeReflectConstruct$a() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  60174. var Shape = /*#__PURE__*/function (_THREE$Mesh) {
  60175. _inherits(Shape, _THREE$Mesh);
  60176. var _super = _createSuper$a(Shape);
  60177. function Shape(v) {
  60178. var _this;
  60179. var i = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 1, 2];
  60180. var color = arguments.length > 2 ? arguments[2] : undefined;
  60181. _classCallCheck(this, Shape);
  60182. var material = new THREE.MeshBasicMaterial({
  60183. color: color,
  60184. transparent: true,
  60185. // wireframe: true,
  60186. opacity: 0.3,
  60187. side: THREE.DoubleSide
  60188. });
  60189. material.depthFunc = THREE.AlwaysDepth;
  60190. var geometry = new THREE.BufferGeometry();
  60191. var vertices = new Float32Array(v);
  60192. var indexes = i;
  60193. geometry.setIndex(indexes);
  60194. geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
  60195. _this = _super.call(this, geometry, material);
  60196. _this.frustumCulled = false;
  60197. _this.renderOrder = RenderOrder.entryArrow;
  60198. _this.visible = false;
  60199. _this.isPolygonMarkElement = true;
  60200. _this.active = 0;
  60201. return _this;
  60202. }
  60203. _createClass(Shape, [{
  60204. key: "highLight",
  60205. value: function highLight() {
  60206. this.visible = true;
  60207. }
  60208. }, {
  60209. key: "midLight",
  60210. value: function midLight() {
  60211. this.visible = false;
  60212. }
  60213. }, {
  60214. key: "lowLight",
  60215. value: function lowLight() {
  60216. this.visible = false;
  60217. }
  60218. }]);
  60219. return Shape;
  60220. }(THREE.Mesh);
  60221. /**
  60222. * Port from https://github.com/mapbox/earcut (v2.2.4)
  60223. */
  60224. var Earcut = {
  60225. triangulate: function triangulate(data, holeIndices) {
  60226. var dim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
  60227. var hasHoles = holeIndices && holeIndices.length;
  60228. var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
  60229. var outerNode = linkedList(data, 0, outerLen, dim, true);
  60230. var triangles = [];
  60231. if (!outerNode || outerNode.next === outerNode.prev) return triangles;
  60232. var minX, minY, maxX, maxY, x, y, invSize;
  60233. if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
  60234. if (data.length > 80 * dim) {
  60235. minX = maxX = data[0];
  60236. minY = maxY = data[1];
  60237. for (var i = dim; i < outerLen; i += dim) {
  60238. x = data[i];
  60239. y = data[i + 1];
  60240. if (x < minX) minX = x;
  60241. if (y < minY) minY = y;
  60242. if (x > maxX) maxX = x;
  60243. if (y > maxY) maxY = y;
  60244. } // minX, minY and invSize are later used to transform coords into integers for z-order calculation
  60245. invSize = Math.max(maxX - minX, maxY - minY);
  60246. invSize = invSize !== 0 ? 32767 / invSize : 0;
  60247. }
  60248. earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);
  60249. return triangles;
  60250. }
  60251. }; // create a circular doubly linked list from polygon points in the specified winding order
  60252. function linkedList(data, start, end, dim, clockwise) {
  60253. var i, last;
  60254. if (clockwise === signedArea(data, start, end, dim) > 0) {
  60255. for (i = start; i < end; i += dim) {
  60256. last = insertNode(i, data[i], data[i + 1], last);
  60257. }
  60258. } else {
  60259. for (i = end - dim; i >= start; i -= dim) {
  60260. last = insertNode(i, data[i], data[i + 1], last);
  60261. }
  60262. }
  60263. if (last && equals(last, last.next)) {
  60264. removeNode(last);
  60265. last = last.next;
  60266. }
  60267. return last;
  60268. } // eliminate colinear or duplicate points
  60269. function filterPoints(start, end) {
  60270. if (!start) return start;
  60271. if (!end) end = start;
  60272. var p = start,
  60273. again;
  60274. do {
  60275. again = false;
  60276. if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
  60277. removeNode(p);
  60278. p = end = p.prev;
  60279. if (p === p.next) break;
  60280. again = true;
  60281. } else {
  60282. p = p.next;
  60283. }
  60284. } while (again || p !== end);
  60285. return end;
  60286. } // main ear slicing loop which triangulates a polygon (given as a linked list)
  60287. function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
  60288. if (!ear) return; // interlink polygon nodes in z-order
  60289. if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
  60290. var stop = ear,
  60291. prev,
  60292. next; // iterate through ears, slicing them one by one
  60293. while (ear.prev !== ear.next) {
  60294. prev = ear.prev;
  60295. next = ear.next;
  60296. if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
  60297. // cut off the triangle
  60298. triangles.push(prev.i / dim | 0);
  60299. triangles.push(ear.i / dim | 0);
  60300. triangles.push(next.i / dim | 0);
  60301. removeNode(ear); // skipping the next vertex leads to less sliver triangles
  60302. ear = next.next;
  60303. stop = next.next;
  60304. continue;
  60305. }
  60306. ear = next; // if we looped through the whole remaining polygon and can't find any more ears
  60307. if (ear === stop) {
  60308. // try filtering points and slicing again
  60309. if (!pass) {
  60310. earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); // if this didn't work, try curing all small self-intersections locally
  60311. } else if (pass === 1) {
  60312. ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
  60313. earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); // as a last resort, try splitting the remaining polygon into two
  60314. } else if (pass === 2) {
  60315. splitEarcut(ear, triangles, dim, minX, minY, invSize);
  60316. }
  60317. break;
  60318. }
  60319. }
  60320. } // check whether a polygon node forms a valid ear with adjacent nodes
  60321. function isEar(ear) {
  60322. var a = ear.prev,
  60323. b = ear,
  60324. c = ear.next;
  60325. if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
  60326. // now make sure we don't have other points inside the potential ear
  60327. var ax = a.x,
  60328. bx = b.x,
  60329. cx = c.x,
  60330. ay = a.y,
  60331. by = b.y,
  60332. cy = c.y; // triangle bbox; min & max are calculated like this for speed
  60333. var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx,
  60334. y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy,
  60335. x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx,
  60336. y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy;
  60337. var p = c.next;
  60338. while (p !== a) {
  60339. if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;
  60340. p = p.next;
  60341. }
  60342. return true;
  60343. }
  60344. function isEarHashed(ear, minX, minY, invSize) {
  60345. var a = ear.prev,
  60346. b = ear,
  60347. c = ear.next;
  60348. if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
  60349. var ax = a.x,
  60350. bx = b.x,
  60351. cx = c.x,
  60352. ay = a.y,
  60353. by = b.y,
  60354. cy = c.y; // triangle bbox; min & max are calculated like this for speed
  60355. var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx,
  60356. y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy,
  60357. x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx,
  60358. y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy; // z-order range for the current triangle bbox;
  60359. var minZ = zOrder(x0, y0, minX, minY, invSize),
  60360. maxZ = zOrder(x1, y1, minX, minY, invSize);
  60361. var p = ear.prevZ,
  60362. n = ear.nextZ; // look for points inside the triangle in both directions
  60363. while (p && p.z >= minZ && n && n.z <= maxZ) {
  60364. if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;
  60365. p = p.prevZ;
  60366. if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;
  60367. n = n.nextZ;
  60368. } // look for remaining points in decreasing z-order
  60369. while (p && p.z >= minZ) {
  60370. if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;
  60371. p = p.prevZ;
  60372. } // look for remaining points in increasing z-order
  60373. while (n && n.z <= maxZ) {
  60374. if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;
  60375. n = n.nextZ;
  60376. }
  60377. return true;
  60378. } // go through all polygon nodes and cure small local self-intersections
  60379. function cureLocalIntersections(start, triangles, dim) {
  60380. var p = start;
  60381. do {
  60382. var a = p.prev,
  60383. b = p.next.next;
  60384. if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
  60385. triangles.push(a.i / dim | 0);
  60386. triangles.push(p.i / dim | 0);
  60387. triangles.push(b.i / dim | 0); // remove two nodes involved
  60388. removeNode(p);
  60389. removeNode(p.next);
  60390. p = start = b;
  60391. }
  60392. p = p.next;
  60393. } while (p !== start);
  60394. return filterPoints(p);
  60395. } // try splitting polygon into two and triangulate them independently
  60396. function splitEarcut(start, triangles, dim, minX, minY, invSize) {
  60397. // look for a valid diagonal that divides the polygon into two
  60398. var a = start;
  60399. do {
  60400. var b = a.next.next;
  60401. while (b !== a.prev) {
  60402. if (a.i !== b.i && isValidDiagonal(a, b)) {
  60403. // split the polygon in two by the diagonal
  60404. var c = splitPolygon(a, b); // filter colinear points around the cuts
  60405. a = filterPoints(a, a.next);
  60406. c = filterPoints(c, c.next); // run earcut on each half
  60407. earcutLinked(a, triangles, dim, minX, minY, invSize, 0);
  60408. earcutLinked(c, triangles, dim, minX, minY, invSize, 0);
  60409. return;
  60410. }
  60411. b = b.next;
  60412. }
  60413. a = a.next;
  60414. } while (a !== start);
  60415. } // link every hole into the outer loop, producing a single-ring polygon without holes
  60416. function eliminateHoles(data, holeIndices, outerNode, dim) {
  60417. var queue = [];
  60418. var i, len, start, end, list;
  60419. for (i = 0, len = holeIndices.length; i < len; i++) {
  60420. start = holeIndices[i] * dim;
  60421. end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
  60422. list = linkedList(data, start, end, dim, false);
  60423. if (list === list.next) list.steiner = true;
  60424. queue.push(getLeftmost(list));
  60425. }
  60426. queue.sort(compareX); // process holes from left to right
  60427. for (i = 0; i < queue.length; i++) {
  60428. outerNode = eliminateHole(queue[i], outerNode);
  60429. }
  60430. return outerNode;
  60431. }
  60432. function compareX(a, b) {
  60433. return a.x - b.x;
  60434. } // find a bridge between vertices that connects hole with an outer ring and link it
  60435. function eliminateHole(hole, outerNode) {
  60436. var bridge = findHoleBridge(hole, outerNode);
  60437. if (!bridge) {
  60438. return outerNode;
  60439. }
  60440. var bridgeReverse = splitPolygon(bridge, hole); // filter collinear points around the cuts
  60441. filterPoints(bridgeReverse, bridgeReverse.next);
  60442. return filterPoints(bridge, bridge.next);
  60443. } // David Eberly's algorithm for finding a bridge between hole and outer polygon
  60444. function findHoleBridge(hole, outerNode) {
  60445. var p = outerNode,
  60446. qx = -Infinity,
  60447. m;
  60448. var hx = hole.x,
  60449. hy = hole.y; // find a segment intersected by a ray from the hole's leftmost point to the left;
  60450. // segment's endpoint with lesser x will be potential connection point
  60451. do {
  60452. if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
  60453. var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
  60454. if (x <= hx && x > qx) {
  60455. qx = x;
  60456. m = p.x < p.next.x ? p : p.next;
  60457. if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint
  60458. }
  60459. }
  60460. p = p.next;
  60461. } while (p !== outerNode);
  60462. if (!m) return null; // look for points inside the triangle of hole point, segment intersection and endpoint;
  60463. // if there are no points found, we have a valid connection;
  60464. // otherwise choose the point of the minimum angle with the ray as connection point
  60465. var stop = m,
  60466. mx = m.x,
  60467. my = m.y;
  60468. var tanMin = Infinity,
  60469. tan;
  60470. p = m;
  60471. do {
  60472. if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
  60473. tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
  60474. if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {
  60475. m = p;
  60476. tanMin = tan;
  60477. }
  60478. }
  60479. p = p.next;
  60480. } while (p !== stop);
  60481. return m;
  60482. } // whether sector in vertex m contains sector in vertex p in the same coordinates
  60483. function sectorContainsSector(m, p) {
  60484. return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
  60485. } // interlink polygon nodes in z-order
  60486. function indexCurve(start, minX, minY, invSize) {
  60487. var p = start;
  60488. do {
  60489. if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);
  60490. p.prevZ = p.prev;
  60491. p.nextZ = p.next;
  60492. p = p.next;
  60493. } while (p !== start);
  60494. p.prevZ.nextZ = null;
  60495. p.prevZ = null;
  60496. sortLinked(p);
  60497. } // Simon Tatham's linked list merge sort algorithm
  60498. // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
  60499. function sortLinked(list) {
  60500. var i,
  60501. p,
  60502. q,
  60503. e,
  60504. tail,
  60505. numMerges,
  60506. pSize,
  60507. qSize,
  60508. inSize = 1;
  60509. do {
  60510. p = list;
  60511. list = null;
  60512. tail = null;
  60513. numMerges = 0;
  60514. while (p) {
  60515. numMerges++;
  60516. q = p;
  60517. pSize = 0;
  60518. for (i = 0; i < inSize; i++) {
  60519. pSize++;
  60520. q = q.nextZ;
  60521. if (!q) break;
  60522. }
  60523. qSize = inSize;
  60524. while (pSize > 0 || qSize > 0 && q) {
  60525. if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
  60526. e = p;
  60527. p = p.nextZ;
  60528. pSize--;
  60529. } else {
  60530. e = q;
  60531. q = q.nextZ;
  60532. qSize--;
  60533. }
  60534. if (tail) tail.nextZ = e;else list = e;
  60535. e.prevZ = tail;
  60536. tail = e;
  60537. }
  60538. p = q;
  60539. }
  60540. tail.nextZ = null;
  60541. inSize *= 2;
  60542. } while (numMerges > 1);
  60543. return list;
  60544. } // z-order of a point given coords and inverse of the longer side of data bbox
  60545. function zOrder(x, y, minX, minY, invSize) {
  60546. // coords are transformed into non-negative 15-bit integer range
  60547. x = (x - minX) * invSize | 0;
  60548. y = (y - minY) * invSize | 0;
  60549. x = (x | x << 8) & 0x00ff00ff;
  60550. x = (x | x << 4) & 0x0f0f0f0f;
  60551. x = (x | x << 2) & 0x33333333;
  60552. x = (x | x << 1) & 0x55555555;
  60553. y = (y | y << 8) & 0x00ff00ff;
  60554. y = (y | y << 4) & 0x0f0f0f0f;
  60555. y = (y | y << 2) & 0x33333333;
  60556. y = (y | y << 1) & 0x55555555;
  60557. return x | y << 1;
  60558. } // find the leftmost node of a polygon ring
  60559. function getLeftmost(start) {
  60560. var p = start,
  60561. leftmost = start;
  60562. do {
  60563. if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p;
  60564. p = p.next;
  60565. } while (p !== start);
  60566. return leftmost;
  60567. } // check if a point lies within a convex triangle
  60568. function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
  60569. return (cx - px) * (ay - py) >= (ax - px) * (cy - py) && (ax - px) * (by - py) >= (bx - px) * (ay - py) && (bx - px) * (cy - py) >= (cx - px) * (by - py);
  60570. } // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
  60571. function isValidDiagonal(a, b) {
  60572. return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && (area(a.prev, a, b.prev) || area(a, b.prev, b)) || equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
  60573. } // signed area of a triangle
  60574. function area(p, q, r) {
  60575. return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
  60576. } // check if two points are equal
  60577. function equals(p1, p2) {
  60578. return p1.x === p2.x && p1.y === p2.y;
  60579. } // check if two segments intersect
  60580. function intersects(p1, q1, p2, q2) {
  60581. var o1 = sign(area(p1, q1, p2));
  60582. var o2 = sign(area(p1, q1, q2));
  60583. var o3 = sign(area(p2, q2, p1));
  60584. var o4 = sign(area(p2, q2, q1));
  60585. if (o1 !== o2 && o3 !== o4) return true; // general case
  60586. if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
  60587. if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
  60588. if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
  60589. if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
  60590. return false;
  60591. } // for collinear points p, q, r, check if point q lies on segment pr
  60592. function onSegment(p, q, r) {
  60593. return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
  60594. }
  60595. function sign(num) {
  60596. return num > 0 ? 1 : num < 0 ? -1 : 0;
  60597. } // check if a polygon diagonal intersects any polygon segments
  60598. function intersectsPolygon(a, b) {
  60599. var p = a;
  60600. do {
  60601. if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true;
  60602. p = p.next;
  60603. } while (p !== a);
  60604. return false;
  60605. } // check if a polygon diagonal is locally inside the polygon
  60606. function locallyInside(a, b) {
  60607. return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
  60608. } // check if the middle point of a polygon diagonal is inside the polygon
  60609. function middleInside(a, b) {
  60610. var p = a,
  60611. inside = false;
  60612. var px = (a.x + b.x) / 2,
  60613. py = (a.y + b.y) / 2;
  60614. do {
  60615. if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) inside = !inside;
  60616. p = p.next;
  60617. } while (p !== a);
  60618. return inside;
  60619. } // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
  60620. // if one belongs to the outer ring and another to a hole, it merges it into a single ring
  60621. function splitPolygon(a, b) {
  60622. var a2 = new Node(a.i, a.x, a.y),
  60623. b2 = new Node(b.i, b.x, b.y),
  60624. an = a.next,
  60625. bp = b.prev;
  60626. a.next = b;
  60627. b.prev = a;
  60628. a2.next = an;
  60629. an.prev = a2;
  60630. b2.next = a2;
  60631. a2.prev = b2;
  60632. bp.next = b2;
  60633. b2.prev = bp;
  60634. return b2;
  60635. } // create a node and optionally link it with previous one (in a circular doubly linked list)
  60636. function insertNode(i, x, y, last) {
  60637. var p = new Node(i, x, y);
  60638. if (!last) {
  60639. p.prev = p;
  60640. p.next = p;
  60641. } else {
  60642. p.next = last.next;
  60643. p.prev = last;
  60644. last.next.prev = p;
  60645. last.next = p;
  60646. }
  60647. return p;
  60648. }
  60649. function removeNode(p) {
  60650. p.next.prev = p.prev;
  60651. p.prev.next = p.next;
  60652. if (p.prevZ) p.prevZ.nextZ = p.nextZ;
  60653. if (p.nextZ) p.nextZ.prevZ = p.prevZ;
  60654. }
  60655. function Node(i, x, y) {
  60656. // vertex index in coordinates array
  60657. this.i = i; // vertex coordinates
  60658. this.x = x;
  60659. this.y = y; // previous and next vertex nodes in a polygon ring
  60660. this.prev = null;
  60661. this.next = null; // z-order curve value
  60662. this.z = 0; // previous and next nodes in z-order
  60663. this.prevZ = null;
  60664. this.nextZ = null; // indicates whether this is a steiner point
  60665. this.steiner = false;
  60666. }
  60667. function signedArea(data, start, end, dim) {
  60668. var sum = 0;
  60669. for (var i = start, j = end - dim; i < end; i += dim) {
  60670. sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
  60671. j = i;
  60672. }
  60673. return sum;
  60674. }
  60675. var PolyGonMark = /*#__PURE__*/function () {
  60676. function PolyGonMark(manager, parent, option) {
  60677. var _this = this;
  60678. _classCallCheck(this, PolyGonMark);
  60679. this.manager = manager;
  60680. this.parent = parent; // this.sid = common.getRandomSid()
  60681. // this.name = 'Mark_' + this.sid
  60682. this.group = new THREE.Group();
  60683. this.group.parentObj = this;
  60684. this.pointGroup = new THREE.Group();
  60685. this.lineGroup = new THREE.Group();
  60686. this.shapeGroup = new THREE.Group();
  60687. this.group.add(this.pointGroup);
  60688. this.group.add(this.lineGroup);
  60689. this.group.add(this.shapeGroup);
  60690. this.points = [];
  60691. this.lines = [];
  60692. this.shape = null;
  60693. this.shapeIndexes = [];
  60694. this.color = option.color;
  60695. this.activeColor = 0x00c8af;
  60696. this.lineMat = option.lineMat;
  60697. this.tempPoint;
  60698. this.tempLine;
  60699. this.active = false;
  60700. this.draw = {};
  60701. this.edit = {};
  60702. this.draw.add = function (pos) {
  60703. //绘制中加点
  60704. if (_this.points.length > 3 && _this.tempPoint && _this.tempPoint.position.distanceTo(_this.points[0].position) < 0.025) {
  60705. //触发闭合事件
  60706. _this.draw.finish();
  60707. return;
  60708. } //add
  60709. var p = new Point(_this.color);
  60710. _this.tempPoint = p;
  60711. p.setPosition(pos);
  60712. p.highLight();
  60713. _this.pointGroup.add(p);
  60714. _this.points.push(p); //第一个点
  60715. // if(this.points.length === 4) {
  60716. // this.manager.showFinishManager(this.points[0].position)
  60717. // }
  60718. if (_this.points.length === 1) {
  60719. _this.draw.add(pos);
  60720. } else {
  60721. var p1 = _this.points[_this.points.length - 2].position.clone();
  60722. var p2 = _this.points[_this.points.length - 1].position.clone();
  60723. var pArr = [p1, p2];
  60724. var l = new Line(pArr, _this.lineMat);
  60725. _this.tempLine && _this.tempLine.setMaterial('active');
  60726. _this.tempLine = l;
  60727. _this.tempLine.setMaterial('dashed');
  60728. _this.lineGroup.add(l);
  60729. _this.lines.push(l);
  60730. }
  60731. };
  60732. this.draw.delete = function () {
  60733. if (_this.tempPoint) {
  60734. var pos = _this.tempPoint.position.clone();
  60735. _this.points.pop();
  60736. _this.lines.pop();
  60737. _this.pointGroup.remove(_this.tempPoint);
  60738. _this.lineGroup.remove(_this.tempLine);
  60739. var p = _this.points[_this.points.length - 1].position.clone();
  60740. if (_this.points.length > 1) {
  60741. _this.tempPoint = _this.points[_this.points.length - 1];
  60742. _this.tempLine = _this.lines[_this.lines.length - 1];
  60743. _this.tempLine.setMaterial('dashed');
  60744. _this.draw.update(pos);
  60745. } else {
  60746. _this.deleteAll();
  60747. }
  60748. return p;
  60749. }
  60750. };
  60751. this.draw.recover = function (pos) {
  60752. var p = new Point(_this.color);
  60753. p.setPosition(pos);
  60754. p.highLight();
  60755. _this.pointGroup.add(p);
  60756. _this.points.splice(_this.points.length - 1, 0, p);
  60757. _this.lines.pop();
  60758. _this.lineGroup.remove(_this.tempLine);
  60759. var p1 = _this.points[_this.points.length - 3].position.clone();
  60760. var p2 = _this.points[_this.points.length - 2].position.clone();
  60761. var pArr = [p1, p2];
  60762. var l = new Line(pArr, _this.lineMat);
  60763. l.setMaterial('active');
  60764. _this.lineGroup.add(l);
  60765. _this.lines.push(l);
  60766. var p3 = _this.points[_this.points.length - 2].position.clone();
  60767. var p4 = _this.points[_this.points.length - 1].position.clone();
  60768. var pArr2 = [p3, p4];
  60769. var l2 = new Line(pArr2, _this.lineMat);
  60770. _this.tempLine = l2;
  60771. _this.tempLine.setMaterial('dashed');
  60772. _this.lineGroup.add(l2);
  60773. _this.lines.push(l2);
  60774. _this.draw.update(_this.tempPoint.position);
  60775. };
  60776. this.draw.finish = function (immediate) {
  60777. // if (immediate) {
  60778. // if (this.points.length >= 4) {
  60779. // this.draw.delete()
  60780. // this.draw.finish()
  60781. // console.log('immediate finish')
  60782. // }
  60783. // return
  60784. // }
  60785. if (_this.points.length < 4) return;
  60786. console.log('finish');
  60787. var index = _this.points.indexOf(_this.tempPoint);
  60788. index !== -1 && _this.points.splice(index, 1);
  60789. _this.pointGroup.remove(_this.tempPoint);
  60790. _this.createLoopLine();
  60791. _this.createShape();
  60792. _this.midLight(); //emit
  60793. _this.manager.emit('polygonmarkManager.finish');
  60794. _this.manager.emit('polygonmarkManager.update');
  60795. if (!_this.parent.label) {
  60796. _this.parent.createLabel(_this.computePointsCenter());
  60797. } else {
  60798. _this.parent.updateIntersectArr();
  60799. }
  60800. };
  60801. this.draw.update = function (pos) {
  60802. _this.tempPoint && _this.tempPoint.setPosition(pos);
  60803. _this.tempLine && _this.tempLine.update(pos);
  60804. };
  60805. this.draw.increase = function (pos, pointIndex) {
  60806. var p = new Point(_this.color);
  60807. p.midLight();
  60808. p.setPosition(pos);
  60809. _this.points.splice(pointIndex + 1, 0, p);
  60810. _this.pointGroup.add(p);
  60811. _this.createLoopLine();
  60812. _this.createShape();
  60813. _this.parent.updateIntersectArr();
  60814. _this.manager.emit('polygonmarkManager.update');
  60815. setTimeout(function () {
  60816. _this.manager.onMouseMove();
  60817. }, 100);
  60818. };
  60819. this.draw.subtract = function (elem) {
  60820. var index = _this.points.indexOf(elem); // console.log(index)
  60821. index > -1 && _this.points.splice(index, 1);
  60822. _this.pointGroup.remove(elem);
  60823. _this.createLoopLine();
  60824. _this.createShape();
  60825. _this.parent.updateIntersectArr();
  60826. if (_this.points.length <= 2) _this.deleteAll();
  60827. _this.manager.emit('polygonmarkManager.update');
  60828. };
  60829. this.edit.update = function (elem, pos) {
  60830. elem.setPosition(pos);
  60831. _this.createLoopLine();
  60832. _this.createShape();
  60833. _this.parent.updateIntersectArr();
  60834. if (_this.active) _this.highLight();
  60835. };
  60836. }
  60837. _createClass(PolyGonMark, [{
  60838. key: "build",
  60839. value: function build(points, shapeIndexes) {
  60840. var _this2 = this;
  60841. points.forEach(function (i) {
  60842. var p = new Point(_this2.color);
  60843. p.setPosition(i);
  60844. _this2.points.push(p);
  60845. _this2.pointGroup.add(p);
  60846. });
  60847. this.createLoopLine();
  60848. this.createShape(shapeIndexes);
  60849. this.lowLight();
  60850. }
  60851. }, {
  60852. key: "createShape",
  60853. value: function createShape(shapeIndexes) {
  60854. if (shapeIndexes) {
  60855. var vertices_xyz = [];
  60856. this.points.forEach(function (p) {
  60857. vertices_xyz.push(p.position.x);
  60858. vertices_xyz.push(p.position.y);
  60859. vertices_xyz.push(p.position.z);
  60860. });
  60861. this.shapeIndexes = shapeIndexes; //完成记录indexes
  60862. var shape = new Shape(vertices_xyz, shapeIndexes, this.activeColor);
  60863. this.shapeGroup.clear();
  60864. this.shapeGroup.add(shape);
  60865. this.shape = shape;
  60866. return;
  60867. }
  60868. var vertices = [];
  60869. if (this.points.length < 3) {
  60870. return;
  60871. } else if (this.points.length === 3) {
  60872. this.points.forEach(function (p) {
  60873. vertices.push(p.position.x);
  60874. vertices.push(p.position.y);
  60875. vertices.push(p.position.z);
  60876. });
  60877. this.shapeIndexes = [0, 1, 2]; //完成记录indexes
  60878. var _shape = new Shape(vertices, null, this.activeColor);
  60879. this.shapeGroup.clear();
  60880. this.shapeGroup.add(_shape);
  60881. this.shape = _shape;
  60882. } else {
  60883. var dir = new THREE.Vector3();
  60884. var camera = this.manager.player.cameraControls.cameras['panorama'];
  60885. camera.getWorldDirection(dir); // console.log(dir)
  60886. var plane = new THREE.Plane(dir, 0);
  60887. var targets = [];
  60888. this.points.forEach(function (p) {
  60889. var target = new THREE.Vector3();
  60890. plane.projectPoint(p.position, target);
  60891. target.applyMatrix4(camera.matrixWorldInverse);
  60892. targets.push(target.x);
  60893. targets.push(target.y);
  60894. vertices.push(p.position.x);
  60895. vertices.push(p.position.y);
  60896. vertices.push(p.position.z);
  60897. });
  60898. var res = Earcut.triangulate(targets);
  60899. this.shapeIndexes = res; //完成记录indexes
  60900. var _shape2 = new Shape(vertices, res, this.activeColor);
  60901. this.shapeGroup.clear();
  60902. this.shapeGroup.add(_shape2);
  60903. this.shape = _shape2;
  60904. }
  60905. }
  60906. }, {
  60907. key: "createLoopLine",
  60908. value: function createLoopLine() {
  60909. var p = [];
  60910. this.points.forEach(function (i) {
  60911. p.push(i.position);
  60912. });
  60913. var lineloop = new LineLoop(p, this.lineMat);
  60914. this.lines.length = [];
  60915. this.lines.push(lineloop); //!!! 结构不能变
  60916. this.group.remove(this.lineGroup);
  60917. this.lineGroup.clear();
  60918. this.lineGroup = lineloop;
  60919. this.group.add(this.lineGroup);
  60920. } //隐藏
  60921. }, {
  60922. key: "hide",
  60923. value: function hide() {
  60924. this.group.visible = false;
  60925. } //显示
  60926. }, {
  60927. key: "show",
  60928. value: function show() {
  60929. this.group.visible = true;
  60930. } //删除全部
  60931. }, {
  60932. key: "deleteAll",
  60933. value: function deleteAll() {
  60934. // this.dispose()
  60935. this.parent.deleteMark(this);
  60936. this.manager.updateActivePoint(null, null, false);
  60937. this.manager.emit('polygonmarkManager.finish');
  60938. this.parent.updateIntersectArr();
  60939. }
  60940. }, {
  60941. key: "setColor",
  60942. value: function setColor(color) {
  60943. // this.lines[0].setColor(color)
  60944. this.points.forEach(function (i) {
  60945. i.setColor(color);
  60946. });
  60947. this.color = color;
  60948. }
  60949. }, {
  60950. key: "setLight",
  60951. value: function setLight(bool) {
  60952. var line = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  60953. var shape = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  60954. if (bool) {
  60955. line && this.lines[0].highLight();
  60956. shape && this.shape.highLight();
  60957. } else {
  60958. line && this.lines[0].lowLight();
  60959. shape && this.shape.lowLight();
  60960. }
  60961. }
  60962. }, {
  60963. key: "highLight",
  60964. value: function highLight() {
  60965. this.points.forEach(function (i) {
  60966. i.highLight && i.highLight();
  60967. });
  60968. this.lines.forEach(function (i) {
  60969. i.highLight && i.highLight();
  60970. });
  60971. this.shape && this.shape.highLight && this.shape.highLight();
  60972. }
  60973. }, {
  60974. key: "midLight",
  60975. value: function midLight() {
  60976. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  60977. if (this.active && !force) return;
  60978. this.points.forEach(function (i) {
  60979. i.midLight && i.midLight();
  60980. });
  60981. this.lines.forEach(function (i) {
  60982. i.midLight && i.midLight();
  60983. });
  60984. this.shape && this.shape.midLight && this.shape.midLight();
  60985. }
  60986. }, {
  60987. key: "lowLight",
  60988. value: function lowLight() {
  60989. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  60990. if (this.active && !force) return;
  60991. this.points.forEach(function (i) {
  60992. i.lowLight && i.lowLight();
  60993. });
  60994. this.lines.forEach(function (i) {
  60995. i.lowLight && i.lowLight();
  60996. });
  60997. this.shape && this.shape.lowLight && this.shape.lowLight();
  60998. }
  60999. }, {
  61000. key: "computePointsCenter",
  61001. value: function computePointsCenter() {
  61002. var _x = 0,
  61003. _y = 0,
  61004. _z = 0,
  61005. n = this.points.length;
  61006. this.points.forEach(function (p) {
  61007. _x += p.position.x;
  61008. _y += p.position.y;
  61009. _z += p.position.z;
  61010. });
  61011. _x /= n;
  61012. _y /= n;
  61013. _z /= n;
  61014. return new THREE.Vector3(_x, _y, _z);
  61015. }
  61016. }, {
  61017. key: "dispose",
  61018. value: function dispose() {
  61019. this.group.clear();
  61020. this.pointGroup.clear();
  61021. this.lineGroup.clear();
  61022. this.shapeGroup.clear();
  61023. this.points.length = 0;
  61024. this.lines.length = 0;
  61025. this.shape = null;
  61026. this.shapeIndexes.length = 0;
  61027. this.tempPoint = null;
  61028. this.tempLine = null;
  61029. }
  61030. }, {
  61031. key: "toJSON",
  61032. value: function toJSON() {
  61033. var points = [];
  61034. this.points.forEach(function (i) {
  61035. var p = {
  61036. x: i.position.x,
  61037. y: i.position.y,
  61038. z: i.position.z
  61039. };
  61040. points.push(p);
  61041. });
  61042. return {
  61043. points: points,
  61044. shapeIndexes: this.shapeIndexes
  61045. };
  61046. }
  61047. }]);
  61048. return PolyGonMark;
  61049. }();
  61050. function _createSuper$9(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$9(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  61051. function _isNativeReflectConstruct$9() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  61052. var activeColor = '#00c8af';
  61053. new THREE.Vector2();
  61054. var PolygonMarkLabel = /*#__PURE__*/function (_THREE$EventDispatche) {
  61055. _inherits(PolygonMarkLabel, _THREE$EventDispatche);
  61056. var _super = _createSuper$9(PolygonMarkLabel);
  61057. function PolygonMarkLabel(player, manager, parentObj, o) {
  61058. var _this;
  61059. _classCallCheck(this, PolygonMarkLabel);
  61060. _this = _super.call(this);
  61061. _this.player = player;
  61062. _this.manager = manager;
  61063. _this.parentObj = parentObj; // this.position = o.pos
  61064. _this.sid = o.sid;
  61065. _this.name = o.name || '';
  61066. _this.type = o.type || '';
  61067. _this.panoId = o.panoId;
  61068. _this.color = o.color;
  61069. _this.labelPoint = o.labelPoint; // this.toPano = o.toPano
  61070. _this.clickFun = o.clickFun; // this.noLine = o.noLine
  61071. // this.driftDir = o.driftDir
  61072. // this.floorIndex = o.floorIndex
  61073. //create--------------------------------------
  61074. _this.elem = document.createElement('div');
  61075. _this.elem.className = 'polygonMark-label';
  61076. _this.elem.style.display = 'block';
  61077. _this.elem.innerHTML = "<p class=\"name\">".concat(_this.name, "</p><div class=\"line\"><div class=\"point\"></div></div><p class=\"type\">").concat(_this.type, "</p>");
  61078. _this.labelPointDomElement = _this.elem.querySelector('.point');
  61079. _this.setColor(_this.color);
  61080. _this.elem.style.width = 'auto';
  61081. _this.elem.style.height = 'auto';
  61082. setTimeout(function () {
  61083. var w = _this.elem.offsetWidth;
  61084. var h = _this.elem.offsetHeight;
  61085. _this.elem.style.width = w + 5 + 'px';
  61086. _this.elem.style.height = h + 'px';
  61087. }, 0);
  61088. _this.elem.addEventListener('pointerdown', _this.onPointerDown.bind(_assertThisInitialized(_this)));
  61089. _this.player.domElement.addEventListener('pointermove', _this.onPointerMove.bind(_assertThisInitialized(_this)));
  61090. _this.elem.addEventListener('pointerup', _this.onPointerUp.bind(_assertThisInitialized(_this)));
  61091. _this.elem.addEventListener('mouseenter', _this.onMouseEnter.bind(_assertThisInitialized(_this)));
  61092. _this.elem.addEventListener('mouseleave', _this.onMouseLeave.bind(_assertThisInitialized(_this)));
  61093. _this.elem.addEventListener('mousedown', _this.onMouseDown.bind(_assertThisInitialized(_this)));
  61094. _this.elem.addEventListener('mouseup', _this.onMouseUp.bind(_assertThisInitialized(_this))); // o.container ? o.container.append(this.elem) : document.querySelector('.widgets-doll-labels').append(this.elem)
  61095. _this.player.domElement.querySelector('.polygonmark-labels').append(_this.elem);
  61096. _this.player.polygonmarkLabels.push(_assertThisInitialized(_this)); //create--------------------------------------
  61097. _this.enable = true;
  61098. _this.pos2d = new THREE.Vector2();
  61099. _this.pointer = new THREE.Vector4();
  61100. _this.dragging = false;
  61101. _this.visible = true; //2023.6新增 用于控制多原因隐藏
  61102. _this.isPolygonMarkLabel = true;
  61103. return _this;
  61104. }
  61105. _createClass(PolygonMarkLabel, [{
  61106. key: "setElementWidthAndHeight",
  61107. value: function setElementWidthAndHeight() {
  61108. var _this2 = this;
  61109. this.elem.style.width = 'auto';
  61110. this.elem.style.height = 'auto';
  61111. setTimeout(function () {
  61112. var w = _this2.elem.offsetWidth;
  61113. var h = _this2.elem.offsetHeight;
  61114. _this2.elem.style.width = w + 5 + 'px';
  61115. _this2.elem.style.height = h + 'px';
  61116. }, 0);
  61117. }
  61118. }, {
  61119. key: "setNameType",
  61120. value: function setNameType(name, type) {
  61121. this.elem.getElementsByClassName('name')[0].innerHTML = this.name = name;
  61122. this.elem.getElementsByClassName('type')[0].innerHTML = this.type = type;
  61123. this.setElementWidthAndHeight();
  61124. this.update();
  61125. }
  61126. }, {
  61127. key: "setColor",
  61128. value: function setColor(color) {
  61129. var cover = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  61130. this.labelPointDomElement.style.backgroundColor = color;
  61131. cover && (this.color = color);
  61132. }
  61133. }, {
  61134. key: "highLight",
  61135. value: function highLight() {
  61136. this.setColor(activeColor, false);
  61137. }
  61138. }, {
  61139. key: "midLight",
  61140. value: function midLight() {
  61141. this.setColor(this.color, false);
  61142. }
  61143. }, {
  61144. key: "update",
  61145. value: function update() {
  61146. //enable只和是否有cad图相关
  61147. if (this.player.mode !== 'panorama' || !this.manager.labelVisible || !this.manager.labelEnabled || !this.enable || !this.visible || !this.name // ||
  61148. // (this.player.model.currentFloor.floorIndex != this.floorIndex && !this.player.model.allFloorsVisible) ||
  61149. // (config.isEdit && (
  61150. // (objects.mainDesign && objects.mainDesign.editing) ||
  61151. // (this.player.EditOverlay && this.player.EditOverlay.editing) ||
  61152. // (this.player.linkEditor && (this.player.linkEditor.setPanoVisible || this.player.linkEditor.setTagVisible))
  61153. // ))
  61154. ) {
  61155. this.elem.style.display = 'none';
  61156. return;
  61157. }
  61158. var p = convertTool.getPos2d(this.labelPoint, this.player);
  61159. if (!p.trueSide) {
  61160. // this.elem.style.display = 'none'
  61161. return;
  61162. } //判断label是否被模型遮挡,遮挡则消失
  61163. // if (convertTool.ifShelter(this.position, this.player, { x: p.vector.x, y: p.vector.y }, null, this.player.model.allFloorsVisible ? null : this.floorIndex)) {
  61164. // this.elem.style.display = 'none'
  61165. // return
  61166. // }
  61167. this.elem.style.display = ''; //先显示,driftDir才能计算位置
  61168. var w = this.elem.offsetWidth;
  61169. var h = this.elem.offsetHeight;
  61170. var h1 = this.elem.querySelector('.name').offsetHeight;
  61171. var h2 = this.elem.querySelector('.type').offsetHeight;
  61172. if (h1 > 30 && w < 340 || h2 > 30 && w < 340 || w === 0 || h === 0) {
  61173. this.setElementWidthAndHeight();
  61174. }
  61175. if (!this.dragging) {
  61176. var height = this.elem.children[0].offsetHeight + 0.5;
  61177. this.pos2d.x = p.pos.x + 2.5;
  61178. this.pos2d.y = p.pos.y - height;
  61179. this.elem.style.left = this.pos2d.x + 'px';
  61180. this.elem.style.top = this.pos2d.y + 'px';
  61181. }
  61182. if (this.manager.isEdit) {
  61183. this.elem.style.cursor = 'move';
  61184. } else {
  61185. this.elem.style.cursor = 'pointer';
  61186. } // }
  61187. }
  61188. }, {
  61189. key: "remove",
  61190. value: function remove() {
  61191. var parentElem = this.elem.parentElement; // document.querySelector('.widgets-doll-labels')
  61192. parentElem && parentElem.removeChild(this.elem);
  61193. var a = this.player.polygonmarkLabels.indexOf(this);
  61194. if (a > -1) this.player.polygonmarkLabels.splice(a, 1);
  61195. this.labelPoint = null;
  61196. this.parentObj = null;
  61197. }
  61198. }, {
  61199. key: "show",
  61200. value: function show() {
  61201. this.elem.style.display = 'block';
  61202. this.visible = true;
  61203. }
  61204. }, {
  61205. key: "hide",
  61206. value: function hide() {
  61207. this.elem.style.display = 'none';
  61208. this.visible = false;
  61209. }
  61210. }, {
  61211. key: "onPointerDown",
  61212. value: function onPointerDown(e) {
  61213. e.stopPropagation(); // console.log('pointerDown')
  61214. if (this.manager.isEdit) {
  61215. this.dragging = true;
  61216. this.pointer.x = e.clientX;
  61217. this.pointer.y = e.clientY;
  61218. this.pointer.z = this.pos2d.x;
  61219. this.pointer.w = this.pos2d.y;
  61220. }
  61221. }
  61222. }, {
  61223. key: "onPointerMove",
  61224. value: function onPointerMove(e) {
  61225. if (this.manager.isEdit && this.dragging) {
  61226. var offsetX = e.clientX - this.pointer.x;
  61227. var offsetY = e.clientY - this.pointer.y;
  61228. this.pos2d.x = this.pointer.z + offsetX;
  61229. this.pos2d.y = this.pointer.w + offsetY;
  61230. this.elem.style.left = this.pos2d.x + 'px';
  61231. this.elem.style.top = this.pos2d.y + 'px';
  61232. }
  61233. }
  61234. }, {
  61235. key: "onPointerUp",
  61236. value: function onPointerUp(e) {
  61237. e.stopPropagation(); // console.log('pointerUp')
  61238. if (this.manager.isEdit) {
  61239. var labelPos2d = new THREE.Vector2();
  61240. var height = this.elem.children[0].offsetHeight + 0.5;
  61241. labelPos2d.x = this.pos2d.x - 2.5;
  61242. labelPos2d.y = this.pos2d.y + height;
  61243. labelPos2d.x = labelPos2d.x / this.player.domElement.clientWidth * 2 - 1;
  61244. labelPos2d.y = -(labelPos2d.y / this.player.domElement.clientHeight) * 2 + 1;
  61245. var intersect = this.player.getMouseIntersect(labelPos2d, [this.manager.intersectBox], {
  61246. recursive: false
  61247. });
  61248. intersect && this.labelPoint.copy(intersect.point);
  61249. this.dragging = false;
  61250. } else {
  61251. this.manager.setFocusGroup(this.sid);
  61252. this.manager.emit('polygonmarkManager.clickLabel', this.sid);
  61253. }
  61254. }
  61255. }, {
  61256. key: "onMouseDown",
  61257. value: function onMouseDown(e) {
  61258. e.stopPropagation();
  61259. }
  61260. }, {
  61261. key: "onMouseUp",
  61262. value: function onMouseUp(e) {
  61263. e.stopPropagation();
  61264. }
  61265. }, {
  61266. key: "onMouseEnter",
  61267. value: function onMouseEnter(e) {
  61268. if (this.manager.isEdit) return;
  61269. if (!this.parentObj.focus) this.parentObj.midLight();
  61270. if (this.manager.focusGroup) return;
  61271. this.manager.emit('polygonmarkManager.enterLabel', this.sid);
  61272. }
  61273. }, {
  61274. key: "onMouseLeave",
  61275. value: function onMouseLeave(e) {
  61276. if (this.manager.isEdit) {
  61277. return;
  61278. }
  61279. if (!this.parentObj.focus) this.parentObj.lowLight();
  61280. if (this.manager.focusGroup) return;
  61281. this.manager.emit('polygonmarkManager.leaveLabel', this.sid);
  61282. }
  61283. }]);
  61284. return PolygonMarkLabel;
  61285. }(THREE.EventDispatcher);
  61286. var PolygonMarkGroup = /*#__PURE__*/function () {
  61287. // option = {name, type, color}
  61288. function PolygonMarkGroup(player, manager, option) {
  61289. _classCallCheck(this, PolygonMarkGroup);
  61290. this.player = player;
  61291. this.manager = manager;
  61292. this.sid = option.sid !== undefined ? option.sid : common.getRandomSid();
  61293. this.name = option.name !== undefined ? option.name : '标题';
  61294. this.type = option.type !== undefined ? option.type : '类型';
  61295. this.color = option.color !== undefined ? option.color : 0xffffff;
  61296. this.panoId = option.panoId;
  61297. this.list = [];
  61298. this.label = null;
  61299. this.labelPoint = null;
  61300. this.group = new THREE.Group();
  61301. this.intersectArr = [];
  61302. this.active = false;
  61303. this.focus = false;
  61304. this.lineMat = LineDraw.createFatLineMat({
  61305. lineWidth: 2,
  61306. color: this.color
  61307. /*, alwaysShow: true*/
  61308. });
  61309. this.lineMat.resolution = new THREE.Vector2(this.manager.app.core.get('SceneRenderer').renderWidth, this.manager.app.core.get('SceneRenderer').renderHeight); // #00C8AF
  61310. this.activeMark = null;
  61311. }
  61312. _createClass(PolygonMarkGroup, [{
  61313. key: "build",
  61314. value: function build(data, labelPos) {
  61315. var _this = this;
  61316. var reload = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  61317. if (reload) {
  61318. this.list.length = [];
  61319. this.group.clear();
  61320. this.removeLabel();
  61321. }
  61322. data.forEach(function (i) {
  61323. var pm = new PolyGonMark(_this.manager, _this, {
  61324. color: _this.color,
  61325. lineMat: _this.lineMat
  61326. });
  61327. var p = [];
  61328. i.points.forEach(function (j) {
  61329. var pos = new THREE.Vector3(j.x, j.y, j.z);
  61330. p.push(pos);
  61331. });
  61332. pm.build(p, i.shapeIndexes);
  61333. _this.list.push(pm);
  61334. _this.group.add(pm.group);
  61335. });
  61336. labelPos && this.createLabel(new THREE.Vector3(labelPos.x, labelPos.y, labelPos.z));
  61337. this.updateIntersectArr();
  61338. }
  61339. }, {
  61340. key: "addChild",
  61341. value: function addChild() {
  61342. var pm = new PolyGonMark(this.manager, this, {
  61343. color: this.color,
  61344. lineMat: this.lineMat
  61345. });
  61346. this.list.push(pm);
  61347. this.group.add(pm.group);
  61348. this.activeMark = pm;
  61349. }
  61350. }, {
  61351. key: "updateIntersectArr",
  61352. value: function updateIntersectArr() {
  61353. var _this2 = this;
  61354. this.intersectArr.length = 0;
  61355. this.list.forEach(function (mark) {
  61356. var markIntersectArr = mark.points.concat(mark.lines);
  61357. _this2.intersectArr = _this2.intersectArr.concat(markIntersectArr);
  61358. });
  61359. }
  61360. }, {
  61361. key: "createLabel",
  61362. value: function createLabel(pos) {
  61363. if (!pos) return;
  61364. this.labelPoint = new THREE.Vector3();
  61365. this.labelPoint.copy(pos);
  61366. this.label = new PolygonMarkLabel(this.player, this.manager, this, {
  61367. sid: this.sid,
  61368. // pos: pos,
  61369. labelPoint: this.labelPoint,
  61370. name: this.name,
  61371. type: this.type,
  61372. panoId: this.panoId,
  61373. color: this.color,
  61374. floorIndex: 0
  61375. });
  61376. this.label.update();
  61377. this.updateIntersectArr();
  61378. }
  61379. }, {
  61380. key: "removeLabel",
  61381. value: function removeLabel() {
  61382. if (this.label) {
  61383. this.label.remove();
  61384. this.label = null;
  61385. }
  61386. if (this.labelPoint) {
  61387. this.labelPoint = null;
  61388. }
  61389. }
  61390. }, {
  61391. key: "setColor",
  61392. value: function setColor(color) {
  61393. this.color = color;
  61394. this.lineMat.color.set(color);
  61395. this.label && this.label.setColor(color);
  61396. this.list.forEach(function (i) {
  61397. i.setColor(color);
  61398. });
  61399. }
  61400. }, {
  61401. key: "setNameType",
  61402. value: function setNameType(name, type) {
  61403. this.name = name;
  61404. this.type = type;
  61405. this.label && this.label.setNameType(name, type);
  61406. }
  61407. }, {
  61408. key: "hide",
  61409. value: function hide() {
  61410. this.group.visible = false;
  61411. if (this.label) {
  61412. this.label.visible = false;
  61413. this.label.update();
  61414. }
  61415. }
  61416. }, {
  61417. key: "show",
  61418. value: function show() {
  61419. this.group.visible = true;
  61420. if (this.label) {
  61421. this.label.visible = true;
  61422. this.label.update();
  61423. }
  61424. }
  61425. }, {
  61426. key: "deleteMark",
  61427. value: function deleteMark(mark) {
  61428. if (!mark) {
  61429. mark = this.activeMark;
  61430. }
  61431. if (!mark) return;
  61432. var index = this.list.indexOf(mark);
  61433. index > -1 && this.list.splice(index, 1);
  61434. this.group.remove(mark.group);
  61435. mark.active = false;
  61436. this.activeMark = null;
  61437. mark.dispose();
  61438. if (this.list.length <= 0) this.removeLabel();
  61439. }
  61440. }, {
  61441. key: "setActive",
  61442. value: function setActive(bool) {
  61443. if (bool) {
  61444. this.list.forEach(function (i) {
  61445. i.setLight(bool);
  61446. });
  61447. this.label && this.label.highLight();
  61448. } else {
  61449. this.list.forEach(function (i) {
  61450. i.setLight(bool);
  61451. });
  61452. this.label && this.label.midLight();
  61453. }
  61454. this.focus = bool;
  61455. }
  61456. }, {
  61457. key: "highLight",
  61458. value: function highLight() {
  61459. this.list.forEach(function (i) {
  61460. i.setLight(true);
  61461. });
  61462. this.label && this.label.highLight();
  61463. }
  61464. }, {
  61465. key: "midLight",
  61466. value: function midLight() {
  61467. this.list.forEach(function (i) {
  61468. i.setLight(true, true, false);
  61469. });
  61470. this.label && this.label.highLight();
  61471. }
  61472. }, {
  61473. key: "lowLight",
  61474. value: function lowLight() {
  61475. this.list.forEach(function (i) {
  61476. i.lowLight(true);
  61477. });
  61478. this.label && this.label.midLight();
  61479. }
  61480. }, {
  61481. key: "reload",
  61482. value: function reload(data) {
  61483. if (!data) {
  61484. this.manager.deleteMarkGroup(this.sid);
  61485. return;
  61486. }
  61487. this.build(data.list, data.labelPoint, true);
  61488. this.setNameType(data.name, data.type);
  61489. this.setColor(data.color);
  61490. }
  61491. }, {
  61492. key: "dispose",
  61493. value: function dispose() {
  61494. this.list.forEach(function (i) {
  61495. i.dispose();
  61496. });
  61497. this.sid = null;
  61498. this.panoId = null;
  61499. this.list.length = 0;
  61500. this.removeLabel();
  61501. this.group.clear();
  61502. this.intersectArr.length = 0;
  61503. this.lineMat.dispose();
  61504. this.activeMark = null;
  61505. }
  61506. }, {
  61507. key: "toJSON",
  61508. value: function toJSON() {
  61509. var list = [];
  61510. this.list.forEach(function (i) {
  61511. list.push(i.toJSON());
  61512. });
  61513. var labelPos = null;
  61514. if (this.labelPoint) {
  61515. labelPos = {
  61516. x: this.labelPoint.x,
  61517. y: this.labelPoint.y,
  61518. z: this.labelPoint.z
  61519. };
  61520. }
  61521. return {
  61522. sid: this.sid,
  61523. name: this.name,
  61524. type: this.type,
  61525. labelPoint: labelPos,
  61526. color: this.color,
  61527. panoId: this.panoId,
  61528. list: list
  61529. };
  61530. }
  61531. }]);
  61532. return PolygonMarkGroup;
  61533. }();
  61534. function _createSuper$8(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$8(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  61535. function _isNativeReflectConstruct$8() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  61536. var ScaleZoom = 1;
  61537. var size = 4;
  61538. var defaultColor = 0x00c8af;
  61539. var FinishReticule = /*#__PURE__*/function (_THREE$Sprite) {
  61540. _inherits(FinishReticule, _THREE$Sprite);
  61541. var _super = _createSuper$8(FinishReticule);
  61542. function FinishReticule() {
  61543. var _this;
  61544. _classCallCheck(this, FinishReticule);
  61545. // const data = new Uint8Array([255, 255, 255, 255])
  61546. // const map = new THREE.DataTexture(data, 1, 1)
  61547. // map.needsUpdate = true
  61548. var map = new THREE.Texture();
  61549. var material = new THREE.SpriteMaterial({
  61550. sizeAttenuation: false,
  61551. color: defaultColor,
  61552. map: map
  61553. });
  61554. material.onBeforeCompile = function (shader) {
  61555. shader.fragmentShader = shader.fragmentShader.replace('#include <output_fragment>', "\n #ifdef OPAQUE\n diffuseColor.a = 1.0;\n #endif\n #ifdef USE_TRANSMISSION\n diffuseColor.a *= transmissionAlpha + 0.1;\n #endif\n float strength = -step(0.5, distance(vUv, vec2(0.5))) + step(0.4, distance(vUv, vec2(0.5)));\n // float strength = 1.0 - step(0.5, distance(vUv, vec2(0.5)));\n if(strength == 0.0) discard;\n gl_FragColor = vec4(diffuse, 1.0);\n ");
  61556. };
  61557. material.depthFunc = THREE.AlwaysDepth;
  61558. _this = _super.call(this, material);
  61559. _this.renderOrder = RenderOrder.monitorPlane;
  61560. _this.setScale(null, false);
  61561. return _this;
  61562. }
  61563. _createClass(FinishReticule, [{
  61564. key: "setPosition",
  61565. value: function setPosition(pos) {
  61566. this.position.copy(pos);
  61567. }
  61568. }, {
  61569. key: "setScale",
  61570. value: function setScale(zoom) {
  61571. var fromZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  61572. var t;
  61573. if (zoom) {
  61574. t = 0.012 * (1 / zoom);
  61575. if (fromZoom) ScaleZoom = zoom;
  61576. } else {
  61577. t = 0.012 * (1 / ScaleZoom);
  61578. }
  61579. this.scale.set(t * size, t * size, t);
  61580. }
  61581. }]);
  61582. return FinishReticule;
  61583. }(THREE.Sprite);
  61584. function _createSuper$7(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$7(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  61585. function _isNativeReflectConstruct$7() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  61586. /*
  61587. 默认状态 钢笔未选中状态(state => 0)
  61588. 鼠标悬浮多边形 => 中亮 √
  61589. 鼠标点击多边形 => 高亮 √
  61590. 可删除选中多边形 √
  61591. 可拖拽label √
  61592. 可拖拽锚点 √
  61593. 绘制状态 钢笔选中状态(state => 1)
  61594. 点击空白处:
  61595. 新建多边形 √
  61596. 单击左键画点 √
  61597. 点击右键减点 √
  61598. 双击左键闭合 √
  61599. 点击边加点 √
  61600. 点击点减点 √
  61601. */
  61602. var PolygonMarkManager = /*#__PURE__*/function (_Emiter) {
  61603. _inherits(PolygonMarkManager, _Emiter);
  61604. var _super = _createSuper$7(PolygonMarkManager);
  61605. function PolygonMarkManager(app) {
  61606. var _this;
  61607. _classCallCheck(this, PolygonMarkManager);
  61608. _this = _super.call(this);
  61609. _this.saveEdit = function () {
  61610. var g = _this.activeGroup;
  61611. var data = g.toJSON();
  61612. if (!data.name) {
  61613. return {
  61614. code: 401
  61615. };
  61616. } else if (data.list.length <= 0) {
  61617. return {
  61618. code: 402
  61619. };
  61620. } else if (data.list[data.list.length - 1].shapeIndexes.length <= 0) {
  61621. return {
  61622. code: 403
  61623. };
  61624. } //succeed
  61625. g.lowLight();
  61626. _this.activeGroup = null;
  61627. _this.leaveEdit();
  61628. _this.setState(0);
  61629. return {
  61630. code: 400,
  61631. data
  61632. };
  61633. };
  61634. _this.cancelEdit = function () {
  61635. _this.leaveEdit();
  61636. _this.setState(0);
  61637. _this.activeGroup.reload(_this.activeGroupHistoryData);
  61638. };
  61639. _this.funcs = {
  61640. onKeydownFun: _this.onKeydown.bind(_assertThisInitialized(_this)),
  61641. cancelEdit: _this.cancelEdit.bind(_assertThisInitialized(_this))
  61642. };
  61643. _this.bindEvents = function () {
  61644. var domElement = _this.app.dom.querySelector('.player');
  61645. domElement.addEventListener('pointerdown', _this.onMouseDown);
  61646. domElement.addEventListener('pointerup', _this.onMouseUp);
  61647. domElement.addEventListener('keydown', _this.funcs.onKeydownFun);
  61648. window.addEventListener('hashchange', _this.funcs.cancelEdit);
  61649. _this.on('polygonmarkManager.finish', _this.onFinishDraw.bind(_assertThisInitialized(_this)));
  61650. _this.player.on('pointerMove', _this.onMouseMove);
  61651. };
  61652. _this.unBindEvents = function () {
  61653. var domElement = _this.app.dom.querySelector('.player');
  61654. domElement.removeEventListener('pointerdown', _this.onMouseDown);
  61655. domElement.removeEventListener('pointerup', _this.onMouseUp);
  61656. domElement.removeEventListener('keydown', _this.funcs.onKeydownFun);
  61657. window.removeEventListener('hashchange', _this.funcs.cancelEdit);
  61658. _this.player.off('pointerMove', _this.onMouseMove);
  61659. };
  61660. _this.updateTouchElement = function () {
  61661. var touch = _this.player.getMouseIntersect(null, _this.activeGroup.intersectArr, {
  61662. recursive: true,
  61663. type: 'getAll'
  61664. });
  61665. if (touch) {
  61666. touch = touch.filter(function (i) {
  61667. return i.object.visible && (i.object.isPolygonMarkElement || i.object.isPolygonLabelElement) && i.object.parent;
  61668. });
  61669. if (touch.length <= 0) touch = null;
  61670. }
  61671. if (touch) {
  61672. //get到
  61673. var temp = touch.filter(function (i) {
  61674. return i.object.isSprite === true;
  61675. });
  61676. touch = temp.length >= 1 ? temp[0] : touch[0];
  61677. if (_this.touchElement && _this.touchElement.isPolygonMarkElement && _this.touchElement.parent) {
  61678. var touchMark = _this.touchElement.parent.parent.parentObj;
  61679. touchMark.lowLight();
  61680. _this.updateActivePoint(null, null, false);
  61681. }
  61682. _this.touchElement = touch.object;
  61683. _this.touchElement.isPolygonMarkElement && _this.touchElement.parent.parent.parentObj.midLight();
  61684. } else {
  61685. if (_this.touchElement && _this.touchElement.isPolygonMarkElement && _this.touchElement.parent) {
  61686. var _touchMark = _this.touchElement.parent.parent.parentObj;
  61687. _touchMark.lowLight();
  61688. _this.updateActivePoint(null, null, false);
  61689. }
  61690. _this.touchElement = null;
  61691. }
  61692. return touch;
  61693. };
  61694. _this.setGroupLight = function (sid) {
  61695. if (!sid) {
  61696. _this.touchGroup && _this.touchGroup.label && _this.touchGroup.label.onMouseLeave();
  61697. _this.touchGroup = null;
  61698. } else {
  61699. for (var i = 0; i < _this.list.length; i++) {
  61700. if (sid === _this.list[i].sid) {
  61701. _this.touchGroup = _this.list[i];
  61702. _this.touchGroup.label.onMouseEnter();
  61703. break;
  61704. }
  61705. }
  61706. }
  61707. };
  61708. _this.onMouseDown = function () {
  61709. _this.mousedown.copy(_this.player.mouse);
  61710. switch (_this.state) {
  61711. case 0:
  61712. //默认
  61713. if (_this.touchElement && _this.touchElement.isSprite) {
  61714. _this.onDragStart(_this.touchElement);
  61715. }
  61716. break;
  61717. }
  61718. };
  61719. _this.onMouseMove = function () {
  61720. //hover操作---------------------------------------------------------------------
  61721. var intersect = _this.player.getMouseIntersect(null, [_this.intersectBox], {
  61722. recursive: false
  61723. });
  61724. intersect && _this.mouse.copy(intersect.point);
  61725. if (_this.dragging) {
  61726. //拖拽label中
  61727. _this.onDragging(_this.mouse);
  61728. return;
  61729. }
  61730. var touch = null;
  61731. if (_this.activeGroup) {
  61732. touch = _this.updateTouchElement();
  61733. } // this.touchElement && console.log(this.touchElement)
  61734. // handle----------------------------------------------------------------------
  61735. switch (_this.state) {
  61736. //默认---------------------------------------------------------------------
  61737. case 0:
  61738. if (_this.touchElement) {
  61739. if (_this.touchElement.isSprite) {
  61740. CursorDeal.add('polygonMark_move');
  61741. } else if (_this.touchElement.isPolygonMarkLine) {
  61742. CursorDeal.remove('polygonMark_move');
  61743. CursorDeal.add('polygonMark_hover');
  61744. }
  61745. } else {
  61746. CursorDeal.remove('polygonMark_move');
  61747. CursorDeal.remove('polygonMark_hover');
  61748. }
  61749. break;
  61750. //绘制---------------------------------------------------------------------
  61751. case 1:
  61752. if (_this.drawing) {
  61753. _this.activeGroup.activeMark.draw.update(_this.mouse);
  61754. } else {
  61755. if (_this.touchElement) {
  61756. var touchMark = _this.touchElement.parent.parent.parentObj;
  61757. if (_this.touchElement.isPolygonMarkPoint) {
  61758. //光标切换为减点
  61759. CursorDeal.remove('polygonMark_addPen');
  61760. CursorDeal.add('polygonMark_subPen');
  61761. _this.updateActivePoint(_this.touchElement.position, touchMark, true);
  61762. } else if (_this.touchElement.isPolygonMarkLine) {
  61763. //光标切换为加点
  61764. CursorDeal.remove('polygonMark_subPen');
  61765. CursorDeal.add('polygonMark_addPen');
  61766. _this.updateActivePoint(touch.point, touchMark, true);
  61767. }
  61768. } else {
  61769. CursorDeal.remove('polygonMark_addPen');
  61770. CursorDeal.remove('polygonMark_subPen');
  61771. }
  61772. }
  61773. break;
  61774. }
  61775. };
  61776. _this.onMouseUp = function (event) {
  61777. _this.mouseup.copy(_this.player.mouse);
  61778. switch (_this.state) {
  61779. case 0:
  61780. //默认
  61781. if (_this.dragging) {
  61782. _this.onDragEnd();
  61783. } else {
  61784. if (Math.abs(_this.mousedown.x - _this.mouseup.x) > 0 || Math.abs(_this.mousedown.y - _this.mouseup.y) > 0) return;
  61785. if (_this.touchElement && _this.touchElement.isPolygonMarkLine) {
  61786. //选中多边形
  61787. if (_this.activeGroup.activeMark !== null) {
  61788. _this.activeGroup.activeMark.active = false;
  61789. _this.activeGroup.activeMark.lowLight(true);
  61790. }
  61791. _this.activeGroup.activeMark = _this.touchElement.parent.parent.parentObj;
  61792. _this.activeGroup.activeMark.active = true;
  61793. _this.activeGroup.activeMark.highLight(); //emit 选中
  61794. _this.emit('polygonmarkManager.activeMark');
  61795. } else if (!_this.touchElement) {
  61796. if (_this.activeGroup.activeMark !== null) {
  61797. _this.activeGroup.activeMark.active = false;
  61798. _this.activeGroup.activeMark.lowLight(true);
  61799. }
  61800. _this.activeGroup.activeMark = null;
  61801. _this.emit('polygonmarkManager.unactiveMark');
  61802. }
  61803. }
  61804. break;
  61805. case 1:
  61806. //绘制
  61807. if (_this.drawing) {
  61808. if (event.button === 2) {
  61809. // 右键
  61810. // console.log('右键')
  61811. _this.activeGroup.activeMark.draw.add(_this.mouse);
  61812. _this.activeGroup.activeMark.draw.finish(true);
  61813. } else {
  61814. //add 加点
  61815. if (Math.abs(_this.mousedown.x - _this.mouseup.x) > 0 || Math.abs(_this.mousedown.y - _this.mouseup.y) > 0) return;
  61816. _this.activeGroup.activeMark.draw.add(_this.mouse);
  61817. _this.recoverStack.length = 0;
  61818. }
  61819. } else {
  61820. if (event.button === 2) return;
  61821. if (!_this.touchElement) {
  61822. if (Math.abs(_this.mousedown.x - _this.mouseup.x) > 0 || Math.abs(_this.mousedown.y - _this.mouseup.y) > 0) return;
  61823. _this.activeGroup.addChild();
  61824. _this.activeGroup.activeMark.draw.add(_this.mouse);
  61825. _this.drawing = true;
  61826. } else if (_this.touchElement.isPolygonMarkPoint) {
  61827. //减点
  61828. // console.log('减点')
  61829. var touchMark = _this.touchElement.parent.parent.parentObj;
  61830. touchMark.draw.subtract(_this.touchElement);
  61831. _this.updateActivePoint(null, null, false);
  61832. touchMark && touchMark.lowLight();
  61833. } else if (_this.touchElement.isPolygonMarkLine) {
  61834. //加点
  61835. // console.log('加点')
  61836. var _touchMark2 = _this.touchElement.parent.parent.parentObj;
  61837. _touchMark2.draw.increase(_this.activePoint.position, _this.touchElement.startPoint);
  61838. }
  61839. }
  61840. break;
  61841. }
  61842. _this.onMouseMove();
  61843. };
  61844. _this.onDblClick = function () {
  61845. if (_this.drawing) {
  61846. console.log('onDblClick');
  61847. _this.activeGroup.activeMark.draw.finish(true);
  61848. }
  61849. };
  61850. _this.onDragStart = function (elem) {
  61851. // console.log('dragstart')
  61852. _this.player.cameraControls.activeControl.enabled = false;
  61853. _this.dragging = true;
  61854. _this.dragElement = elem;
  61855. _this.emit('polygonmarkManager.update');
  61856. };
  61857. _this.onDragging = function (pos) {
  61858. if (_this.dragging && _this.dragElement) {
  61859. var touchMark = _this.dragElement.parent.parent.parentObj;
  61860. touchMark.edit.update(_this.dragElement, pos);
  61861. }
  61862. };
  61863. _this.onDragEnd = function () {
  61864. // console.log('ondragend')
  61865. _this.player.cameraControls.activeControl.pointerDragOn = false;
  61866. _this.player.cameraControls.activeControl.enabled = true;
  61867. _this.dragging = false;
  61868. _this.dragElement = null;
  61869. };
  61870. _this.onZoom = function (e, fromZoom) {
  61871. if (!_this.isEdit) return;
  61872. _this.mainGroup.traverse(function (j) {
  61873. j.isSprite && j.setScale(e.zoomLevel, fromZoom);
  61874. });
  61875. };
  61876. _this.setActiveGroupNameType = function (name, type) {
  61877. if (!_this.activeGroup) return;
  61878. _this.activeGroup.setNameType(name, type);
  61879. };
  61880. _this.setActiveGroupColor = function (color) {
  61881. if (!_this.activeGroup) return;
  61882. _this.activeGroup.setColor(color);
  61883. };
  61884. _this.setLabelVisible = function (bool) {
  61885. _this.labelVisible = bool;
  61886. };
  61887. _this.setLabelEnabled = function (bool) {
  61888. _this.labelEnabled = bool;
  61889. _this.list.forEach(function (i) {
  61890. i.label && i.label.update();
  61891. });
  61892. };
  61893. _this.app = app;
  61894. _this.player = null;
  61895. _this.deferred = Deferred$1();
  61896. _this.list = [];
  61897. _this.mainGroup = new THREE.Group();
  61898. _this.reloadData = null;
  61899. _this.labelVisible = true; //标签显隐
  61900. _this.labelEnabled = true; //标签可视
  61901. _this.intersectBox = null;
  61902. _this.mouse = new THREE.Vector3();
  61903. _this.mousedown = new THREE.Vector3();
  61904. _this.mouseup = new THREE.Vector3();
  61905. _this.state = 0; //0 => 默认 1 => 绘制
  61906. _this.drawing = false; //是否绘制中
  61907. _this.dragging = false; //点是否拖拽中
  61908. _this.inited = false;
  61909. _this.isEdit = false;
  61910. _this.readyToEdit = false; //进入编辑前跳转点位中
  61911. _this.touchElement = null;
  61912. _this.dragElement = null;
  61913. _this.activeGroup = null;
  61914. _this.touchGroup = null;
  61915. _this.activeGroupHistoryData = null;
  61916. _this.focusGroup = null;
  61917. _this.activePoint = new Point(0xffffff);
  61918. _this.activePoint.midLight();
  61919. _this.activePoint.visible = false;
  61920. _this.mainGroup.add(_this.activePoint);
  61921. _this.finishReticule = new FinishReticule();
  61922. _this.finishReticule.visible = false;
  61923. _this.mainGroup.add(_this.finishReticule);
  61924. _this.activeMarkStartPoint = new THREE.Vector3();
  61925. _this.recoverStack = []; // 初始化
  61926. _this.init = function (metadata) {
  61927. // const geometry = new THREE.CapsuleGeometry( 10, 10, 3, 20 );
  61928. // const geometry = new THREE.SphereGeometry(5, 32, 16)
  61929. var geometry = new THREE.CylinderGeometry(5, 5, 25, 3, 1); // const geometry = new THREE.BoxGeometry(10,10,10)
  61930. var material = new THREE.MeshBasicMaterial({
  61931. side: 1,
  61932. wireframe: true
  61933. });
  61934. material.depthFunc = THREE.AlwaysDepth;
  61935. _this.intersectBox = new THREE.Mesh(geometry, material);
  61936. _this.intersectBox.renderOrder = 20;
  61937. _this.intersectBox.name = 'polygonmark_intersect';
  61938. _this.intersectBox.visible = false;
  61939. _this.mainGroup.add(_this.intersectBox);
  61940. _this.mainGroup.layers.set(17);
  61941. var currentPano = _this.player.currentPano;
  61942. _this.intersectBox.position.copy(currentPano.position);
  61943. var LabelElem = document.createElement('div');
  61944. LabelElem.className = 'polygonmark-labels';
  61945. _this.player.domElement.append(LabelElem);
  61946. if (metadata) {
  61947. // this.reloadData = JSON.parse(JSON.stringify(metadata))
  61948. metadata.data.forEach(function (i) {
  61949. if (_this.player.model.panos.index[i.panoId]) {
  61950. var polygonMarkGroup = new PolygonMarkGroup(_this.player, _assertThisInitialized(_this), {
  61951. sid: i.sid,
  61952. name: i.name,
  61953. type: i.type,
  61954. color: i.color,
  61955. panoId: i.panoId
  61956. });
  61957. polygonMarkGroup.build(i.list, i.labelPoint);
  61958. _this.list.push(polygonMarkGroup);
  61959. _this.mainGroup.add(polygonMarkGroup.group);
  61960. if (i.panoId !== currentPano.id) polygonMarkGroup.hide();
  61961. }
  61962. });
  61963. _this.setLabelEnabled(metadata.labelEnabled);
  61964. }
  61965. _this.player.model.add(_this.mainGroup);
  61966. _this.player.on('flying.ended', _this.onFlyEnd.bind(_assertThisInitialized(_this)));
  61967. _this.player.on('flying.started', _this.onFlyStart.bind(_assertThisInitialized(_this)));
  61968. _this.player.on('zoom', _this.onZoom.bind(_assertThisInitialized(_this)));
  61969. _this.inited = true;
  61970. if (_this.player.mode !== Viewmode$1.PANORAMA) {
  61971. _this.hideAll();
  61972. }
  61973. _this.deferred.resolve();
  61974. };
  61975. _this.app.Scene.on('loadeddata', function () {
  61976. setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  61977. var metadata, data;
  61978. return regenerator.wrap(function _callee$(_context) {
  61979. while (1) {
  61980. switch (_context.prev = _context.next) {
  61981. case 0:
  61982. _this.player = _this.app.core.get('Player'); //获取metadata
  61983. // let metadata = this.app.store.getValue('metadata').sceneDraw
  61984. metadata = null;
  61985. data = _this.app.store.getValue('sceneDraw');
  61986. if (data) {
  61987. metadata = {
  61988. data,
  61989. labelEnabled: _this.app.store.getValue('metadata').controls.showDrawTitle
  61990. };
  61991. } // console.log(metadata)
  61992. _this.init(metadata);
  61993. console.log('polygonmanager init finish');
  61994. case 6:
  61995. case "end":
  61996. return _context.stop();
  61997. }
  61998. }
  61999. }, _callee);
  62000. })), 50);
  62001. }); // 进入模块
  62002. _this.enterEdit = function () {
  62003. _this.waitInit(function () {
  62004. if (_this.isEdit) return; //进入全景模式
  62005. if (_this.player.mode !== Viewmode$1.PANORAMA) _this.player.insideMode(); //绑定事件
  62006. _this.bindEvents();
  62007. _this.player.locked = true;
  62008. _this.isEdit = true;
  62009. }, _this.enterEdit.bind(_assertThisInitialized(_this)));
  62010. }; //离开模块
  62011. _this.leaveEdit = function () {
  62012. //解绑事件
  62013. if (!_this.isEdit) return;
  62014. _this.unBindEvents();
  62015. _this.player.locked = false;
  62016. _this.emit('polygonmarkManager.unactiveMark'); //恢复显示
  62017. _this.showAll(true, true);
  62018. _this.isEdit = false;
  62019. };
  62020. _this.setState = function (state) {
  62021. _this.state = state;
  62022. switch (_this.state) {
  62023. case 0:
  62024. _this.drawing && _this.activeGroup.activeMark.deleteAll();
  62025. CursorDeal.remove('polygonMark_pen');
  62026. break;
  62027. case 1:
  62028. CursorDeal.add('polygonMark_pen');
  62029. break;
  62030. }
  62031. }; //添加一个新的多边形组
  62032. _this.addMarkGroup = function (name, type, color) {
  62033. _this.waitInit(function () {
  62034. var polygonMarkGroup = new PolygonMarkGroup(_this.player, _assertThisInitialized(_this), {
  62035. name,
  62036. type,
  62037. color,
  62038. panoId: _this.player.currentPano.id
  62039. });
  62040. _this.list.push(polygonMarkGroup);
  62041. _this.mainGroup.add(polygonMarkGroup.group);
  62042. _this.setActiveGroup(polygonMarkGroup.sid, true);
  62043. _this.setState(1);
  62044. }, _this.addMarkGroup.bind(_assertThisInitialized(_this), name, type, color));
  62045. }; //删除多边形组
  62046. _this.deleteMarkGroup = function (sid) {
  62047. for (var i = 0; i < _this.list.length; i++) {
  62048. if (_this.list[i].sid === sid) {
  62049. var g = _this.list.splice(i, 1)[0];
  62050. g.dispose();
  62051. _this.mainGroup.remove(g);
  62052. break;
  62053. }
  62054. }
  62055. };
  62056. _this.deleteMark = function () {
  62057. _this.activeGroup && _this.activeGroup.deleteMark();
  62058. _this.emit('polygonmarkManager.unactiveMark');
  62059. };
  62060. _this.setFocusGroup = function (sid) {
  62061. var g;
  62062. for (var i = 0; i < _this.list.length; i++) {
  62063. if (_this.list[i].sid === sid) {
  62064. g = _this.list[i];
  62065. if (_this.focusGroup && _this.focusGroup === g) {
  62066. _this.focusGroup.setActive(false);
  62067. _this.emit('polygonmarkManager.leaveLabel', g.sid);
  62068. _this.focusGroup = null;
  62069. return;
  62070. }
  62071. g.setActive(true);
  62072. _this.focusGroup = g;
  62073. _this.emit('polygonmarkManager.clickLabel', g.sid);
  62074. } else {
  62075. _this.list[i].setActive(false);
  62076. }
  62077. }
  62078. if (g) {
  62079. g.labelPoint && _this.flyAndLookAt(g.panoId, g.labelPoint, true);
  62080. } else {
  62081. console.error('group not found, sid = ' + sid);
  62082. }
  62083. };
  62084. _this.flyAndLookAt = function (panoId, pos, checkAlone) {
  62085. _this.player.flyToPano({
  62086. pano: _this.app.Scene.panos.index[panoId],
  62087. lookAtPoint: pos,
  62088. checkAlone: checkAlone,
  62089. zoomLevel: _this.player.zoomLevel
  62090. });
  62091. };
  62092. _this.setActiveGroup = function (sid) {
  62093. var isNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  62094. _this.list.forEach(function (i) {
  62095. if (i.sid === sid) {
  62096. _this.activeGroup = i;
  62097. console.log('getActiveGroup', sid);
  62098. i.setActive(false);
  62099. if (isNew) {
  62100. _this.activeGroupHistoryData = null; //不保存退出时直接删除该组
  62101. _this.enterEdit();
  62102. } else {
  62103. _this.activeGroupHistoryData = i.toJSON(); //用于不保存退出时数据恢复
  62104. var currentPanoId = _this.player.currentPano.id;
  62105. _this.flyAndLookAt(i.panoId, i.labelPoint, true);
  62106. if (currentPanoId !== i.panoId) {
  62107. _this.readyToEdit = true;
  62108. _this.player.once('flying.ended', function () {
  62109. i.show();
  62110. _this.enterEdit();
  62111. _this.readyToEdit = false;
  62112. });
  62113. } else {
  62114. i.show();
  62115. _this.enterEdit();
  62116. }
  62117. }
  62118. } else {
  62119. i.hide();
  62120. }
  62121. });
  62122. }; //清空
  62123. _this.clear = function () {
  62124. _this.list.forEach(function (i) {
  62125. i.dispose();
  62126. });
  62127. _this.list.length = 0;
  62128. _this.activeGroup = null;
  62129. _this.mainGroup.clear();
  62130. }; //隐藏
  62131. _this.hideAll = function (recursive) {
  62132. _this.mainGroup.visible = false;
  62133. _this.setLabelVisible(false);
  62134. if (recursive) {
  62135. _this.list.forEach(function (i) {
  62136. i.hide();
  62137. });
  62138. }
  62139. _this.updateLabels();
  62140. }; //显示
  62141. _this.showAll = function (recursive, onlyCurrent) {
  62142. if (_this.player && _this.player.mode !== Viewmode$1.PANORAMA) return; //目前除全景模式外均不显示
  62143. _this.mainGroup.visible = true;
  62144. _this.setLabelVisible(true);
  62145. if (recursive) {
  62146. _this.list.forEach(function (i) {
  62147. if (onlyCurrent) {
  62148. var currentPanoId = _this.player.currentPano.id;
  62149. if (i.panoId === currentPanoId) {
  62150. i.show();
  62151. } else {
  62152. i.hide();
  62153. }
  62154. } else {
  62155. i.show();
  62156. }
  62157. });
  62158. }
  62159. _this.updateLabels();
  62160. };
  62161. return _this;
  62162. } //保存编辑
  62163. _createClass(PolygonMarkManager, [{
  62164. key: "onFlyStart",
  62165. value: function onFlyStart() {
  62166. this.hideAll();
  62167. }
  62168. }, {
  62169. key: "onFlyEnd",
  62170. value: function onFlyEnd() {
  62171. if (this.player.mode !== Viewmode$1.PANORAMA) {
  62172. this.onZoom({
  62173. zoomLevel: 1
  62174. }, false);
  62175. } else {
  62176. var currentPano = this.player.currentPano;
  62177. this.intersectBox.position.copy(currentPano.position);
  62178. this.onZoom({
  62179. zoomLevel: null
  62180. }, false);
  62181. if (this.isEdit || this.readyToEdit) {
  62182. this.showAll();
  62183. } else {
  62184. this.showAll(true, true);
  62185. }
  62186. }
  62187. }
  62188. }, {
  62189. key: "onExit",
  62190. value: function onExit() {
  62191. this.cancelEdit();
  62192. }
  62193. }, {
  62194. key: "onKeydown",
  62195. value: function onKeydown(e) {
  62196. if (!this.drawing) return;
  62197. if (e.ctrlKey && e.code == 'KeyZ') {
  62198. // console.log('ctrl+z')
  62199. // this.activeGroup.activeMark.draw.delete()
  62200. var p = this.activeGroup.activeMark.draw.delete();
  62201. this.drawing && this.recoverStack.push(p); // console.log(this.recoverStack)
  62202. } else if (e.ctrlKey && e.code == 'KeyY') {
  62203. // console.log('ctrl+y')
  62204. if (this.recoverStack.length <= 0) return;
  62205. var pos = this.recoverStack.pop();
  62206. this.activeGroup.activeMark.draw.recover(pos);
  62207. } else if (e.code == 'Escape') {
  62208. // console.log('Esc')
  62209. this.activeGroup.activeMark.deleteAll();
  62210. this.setState(0);
  62211. this.emit('polygonmarkManager.setState', 0);
  62212. }
  62213. }
  62214. }, {
  62215. key: "updateActivePoint",
  62216. value: function updateActivePoint(pos, mark, isVisible) {
  62217. pos && this.activePoint.setPosition(pos);
  62218. mark && this.activePoint.setColor(mark.color);
  62219. this.activePoint.visible = isVisible;
  62220. }
  62221. }, {
  62222. key: "updateLabels",
  62223. value: function updateLabels() {
  62224. if (this.player && this.player.polygonmarkLabels) {
  62225. this.player.polygonmarkLabels.forEach(function (i) {
  62226. i.update();
  62227. });
  62228. }
  62229. }
  62230. }, {
  62231. key: "showFinishManager",
  62232. value: function showFinishManager(pos) {
  62233. this.activeMarkStartPoint.copy(pos);
  62234. this.finishReticule.setPosition(pos);
  62235. this.finishReticule.visible = true;
  62236. }
  62237. }, {
  62238. key: "onFinishDraw",
  62239. value: function onFinishDraw() {
  62240. this.drawing = false;
  62241. this.recoverStack.length = 0;
  62242. }
  62243. }, {
  62244. key: "toJSON",
  62245. value: function toJSON() {
  62246. return this.activeGroup.toJSON();
  62247. } //等待初始化
  62248. }, {
  62249. key: "waitInit",
  62250. value: function waitInit(func, waitFunc) {
  62251. if (this.inited) {
  62252. func && func();
  62253. } else {
  62254. this.deferred.then(function () {
  62255. return waitFunc();
  62256. });
  62257. }
  62258. }
  62259. }]);
  62260. return PolygonMarkManager;
  62261. }(tinyEmitter);
  62262. function _createSuper$6(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$6(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  62263. function _isNativeReflectConstruct$6() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  62264. var PanoVideoSkySphere = /*#__PURE__*/function (_THREE$Mesh) {
  62265. _inherits(PanoVideoSkySphere, _THREE$Mesh);
  62266. var _super = _createSuper$6(PanoVideoSkySphere);
  62267. function PanoVideoSkySphere(url) {
  62268. var _this;
  62269. _classCallCheck(this, PanoVideoSkySphere);
  62270. var geometry = new THREE.SphereGeometry(5, 60, 40);
  62271. geometry.scale(-1, 1, 1);
  62272. _this = _super.call(this, geometry);
  62273. _this.videoElement = _this.creatVides(url);
  62274. var material = _this.getMaterial(_this.videoElement);
  62275. _this.material = material;
  62276. _this.renderOrder = RenderOrder.entryArrow;
  62277. return _this;
  62278. }
  62279. _createClass(PanoVideoSkySphere, [{
  62280. key: "getMaterial",
  62281. value: function getMaterial(video) {
  62282. var texture = new THREE.VideoTexture(video);
  62283. texture.minFilter = THREE.LinearFilter; // texture.uploaded = false
  62284. var material = new THREE.MeshBasicMaterial({
  62285. map: texture,
  62286. // depthWrite: false
  62287. opacity: 0,
  62288. transparent: true
  62289. });
  62290. material.depthFunc = THREE.AlwaysDepth;
  62291. return material;
  62292. }
  62293. }, {
  62294. key: "creatVides",
  62295. value: function creatVides(url) {
  62296. var _VersionControl$getEn = VersionControl.getEnvironment(),
  62297. os = _VersionControl$getEn.os,
  62298. environment = _VersionControl$getEn.environment;
  62299. var videoPlayer = null;
  62300. var video = null;
  62301. if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  62302. // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
  62303. videoPlayer = new FlvVideoPlayer$2();
  62304. video = videoPlayer._createVideo(url).videoElement; //console.log('use FlvVideoPlayer')
  62305. } else {
  62306. //console.log('use H5VideoPlayer')
  62307. videoPlayer = new H5VideoPlayer$2();
  62308. video = videoPlayer._createVideoElement(url);
  62309. } // console.log(videoPlayer)
  62310. // video.play()
  62311. return video;
  62312. }
  62313. }]);
  62314. return PanoVideoSkySphere;
  62315. }(THREE.Mesh);
  62316. function _createSuper$5(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$5(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  62317. function _isNativeReflectConstruct$5() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  62318. var PanoVideoManager = /*#__PURE__*/function (_Emiter) {
  62319. _inherits(PanoVideoManager, _Emiter);
  62320. var _super = _createSuper$5(PanoVideoManager);
  62321. function PanoVideoManager(app) {
  62322. var _this;
  62323. _classCallCheck(this, PanoVideoManager);
  62324. _this = _super.call(this);
  62325. _this.bindEvents = function () {
  62326. // this.player.on('pointerStart', this.onMouseDown)
  62327. // this.player.on('pointerMove', this.onMouseMove)
  62328. // this.player.on('pointerUp', this.onMouseUp)
  62329. _this.player.on(PlayerEvents.PanoChosen, _this.getPano);
  62330. _this.player.on('updataProgress', _this.updateOpacity);
  62331. _this.player.on(PlayerEvents.ModeChanging, _this.switchMode);
  62332. if (_this.player.model._3dTilesRuntime) ;
  62333. };
  62334. _this.getPano = function (currentPano, nextPano) {
  62335. // console.log('PlayerEvents.PanoChosen --------------------------------') //点位跳转
  62336. _this.currentPano = currentPano;
  62337. _this.nextPano = nextPano; // console.log(this.currentPano, this.nextPano)
  62338. };
  62339. _this.updateOpacity = function (val) {
  62340. // console.log(val)
  62341. if (_this.currentPano && _this.currentPano._360videos) {
  62342. _this.currentPano._360videos.material.opacity = 1.0 - val;
  62343. }
  62344. if (_this.nextPano && _this.nextPano._360videos) {
  62345. _this.nextPano._360videos.material.opacity = val;
  62346. }
  62347. if (val === 1) {
  62348. //into next done
  62349. if (_this.nextPano && _this.nextPano._360videos) {
  62350. _this.videoReInit(_this.nextPano._360videos.videoElement, true);
  62351. }
  62352. if (_this.currentPano && _this.currentPano._360videos) {
  62353. _this.videoReInit(_this.currentPano._360videos.videoElement, false);
  62354. }
  62355. }
  62356. if (val === 0) {
  62357. //into next begin
  62358. if (_this.nextPano && _this.nextPano._360videos) {
  62359. _this.videoReInit(_this.nextPano._360videos.videoElement, false);
  62360. }
  62361. if (_this.currentPano && _this.currentPano._360videos) {
  62362. _this.videoReInit(_this.currentPano._360videos.videoElement, true);
  62363. }
  62364. }
  62365. };
  62366. _this.switchMode = function (currentMode, mode, pano, transitionTime) {
  62367. // console.log('PlayerEvents.ModeChanging --------------------------------')
  62368. // console.log(currentMode, mode, pano, transitionTime)
  62369. if (mode === Viewmode$1.PANORAMA) {
  62370. _this.panoVideoGroup.visible = true;
  62371. _this.player.once('flying.ended', function () {
  62372. if (pano && pano._360videos) {
  62373. pano._360videos.material.opacity = 1;
  62374. _this.videoReInit(pano._360videos.videoElement, true);
  62375. }
  62376. });
  62377. } else {
  62378. _this.panoVideoGroup.visible = false;
  62379. _this.panoVideoGroup.children.forEach(function (child) {
  62380. child.material.opacity = 0;
  62381. _this.videoReInit(child.videoElement, false);
  62382. });
  62383. }
  62384. };
  62385. _this.videoReInit = function (videoElement, isplay) {
  62386. //videoElement.currentTime = 0
  62387. videoElement.muted = false;
  62388. if (isplay) {
  62389. // videoElement.muted = false
  62390. // console.log(videoElement.muted)
  62391. videoElement.play();
  62392. } else {
  62393. // videoElement.muted = true
  62394. // console.log(videoElement.muted)
  62395. videoElement.pause();
  62396. }
  62397. };
  62398. _this.app = app;
  62399. _this.player = null;
  62400. _this.deferred = Deferred$1();
  62401. _this.panoVideoGroup = new THREE.Group();
  62402. _this.panoVideos = [];
  62403. _this.opacity = 0;
  62404. _this.currentPano = null;
  62405. _this.nextPano = null;
  62406. _this.mouse = new THREE.Vector3();
  62407. _this.mousedown = new THREE.Vector3();
  62408. _this.mouseup = new THREE.Vector3(); // 初始化
  62409. _this.init = function (metadata) {
  62410. var reload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  62411. if (metadata) {
  62412. console.log('PanoVideoManager init');
  62413. console.log(_this.app.Scene.panos);
  62414. _this.bindEvents();
  62415. _this.currentPano = _this.player.currentPano;
  62416. metadata.forEach(function (i) {
  62417. var pano = _this.app.Scene.panos.index[i.id];
  62418. if (!pano) {
  62419. console.error('pano360VideoManager: pano' + i.id + ' not find');
  62420. return;
  62421. }
  62422. var panoSphere = new PanoVideoSkySphere(i.url);
  62423. panoSphere.position.copy(pano.position); // panoSphere.position.y += 1
  62424. _this.panoVideoGroup.add(panoSphere);
  62425. pano._360videos = panoSphere; // console.log(pano)
  62426. });
  62427. _this.player.model.add(_this.panoVideoGroup);
  62428. _this.updateOpacity(0);
  62429. }
  62430. if (!reload) {
  62431. _this.deferred.resolve();
  62432. }
  62433. };
  62434. _this.load = function (metadata, baseURL) {
  62435. _this.app.Scene.whenLoaded(function () {
  62436. var _VersionControl$getEn = VersionControl.getEnvironment(),
  62437. os = _VersionControl$getEn.os,
  62438. environment = _VersionControl$getEn.environment;
  62439. var str = null;
  62440. _this.player = _this.app.core.get('Player');
  62441. if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  62442. // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
  62443. str = '.flv'; //console.log('use FlvVideoPlayer')
  62444. } else {
  62445. //console.log('use H5VideoPlayer')
  62446. str = '.mp4';
  62447. } // let path = window.__sdk_video || 'https://4dkk.4dage.com/v4/example/360'
  62448. // let url = texture.getImageURL(path + str)
  62449. // let metadata = [
  62450. // // { id: 0, url: url },
  62451. // { id: 4, url: url },
  62452. // ]
  62453. if (metadata) {
  62454. metadata.forEach(function (item) {
  62455. item.url = baseURL + item.file + str;
  62456. delete item.file;
  62457. });
  62458. _this.init(metadata, true);
  62459. console.log('init finish');
  62460. }
  62461. });
  62462. }; //// 进入模块
  62463. // this.enterModule = () => {
  62464. // this.waitInit(() => {
  62465. // if (this.player.mode !== Viewmode.DOLLHOUSE) {
  62466. // //进入迷你模式
  62467. // this.player.flyToNewMode({ mode: Viewmode.DOLLHOUSE })
  62468. // //隐藏
  62469. // this.player.model.panos.forEach(pano => pano.hasVideo && common.updateVisible(pano.marker, 'force', false, 10))
  62470. // this.player.once('flying.ended', () => {
  62471. // this.player.OverlayManager.hide('all')
  62472. // this.app.Scene.Decoration.hideAll()
  62473. // this.app.Camera.monitor.control.hideAll(undefined, 'force', 10, undefined)
  62474. // this.player.labelManager.hide()
  62475. // this.player.linkEditor.hideFootIcons()
  62476. // this.player.linkEditor.delVisibleLines()
  62477. // // this.player.model.floors.show()
  62478. // })
  62479. // } else {
  62480. // this.player.model.panos.forEach(pano => pano.hasVideo && common.updateVisible(pano.marker, 'force', false, 10))
  62481. // this.player.OverlayManager.hide('all')
  62482. // this.app.Scene.Decoration.hideAll()
  62483. // this.app.Camera.monitor.control.hideAll()
  62484. // this.player.labelManager.hide()
  62485. // this.player.linkEditor.hideFootIcons()
  62486. // this.player.linkEditor.delVisibleLines()
  62487. // // this.player.model.floors.show()
  62488. // }
  62489. // //绑定事件
  62490. // this.bindEvents()
  62491. // this.player.locked = true
  62492. // }, this.enterModule.bind(this))
  62493. // }
  62494. // //离开模块
  62495. // this.leaveModule = () => {
  62496. // //解绑事件
  62497. // this.unBindEvents()
  62498. // this.player.locked = false
  62499. // //恢复显示
  62500. // this.player.model.panos.forEach(pano => pano.hasVideo && common.updateVisible(pano.marker, 'clipBox', true, 10))
  62501. // this.player.OverlayManager.show('all')
  62502. // this.app.Scene.Decoration.showAll()
  62503. // this.app.Camera.monitor.control.showAll(undefined, 'clipBox', 10, undefined)
  62504. // this.player.labelManager.show()
  62505. // }
  62506. // //添加
  62507. // this.add = () => {
  62508. // this.waitInit(() => {
  62509. // console.log('add')
  62510. // }, this.add.bind(this))
  62511. // }
  62512. // //删除
  62513. // this.delete = () => {
  62514. // }
  62515. // //清空
  62516. // this.clear = () => {
  62517. // }
  62518. // //保存编辑
  62519. // this.saveEdit = () => {
  62520. // }
  62521. // //退出编辑
  62522. // this.cancelEdit = () => {
  62523. // }
  62524. return _this;
  62525. } //事件绑定
  62526. _createClass(PanoVideoManager, [{
  62527. key: "waitInit",
  62528. value: //等待初始化
  62529. function waitInit(func, waitFunc) {
  62530. if (this.player) {
  62531. func && func();
  62532. } else {
  62533. this.deferred.then(function () {
  62534. return waitFunc();
  62535. });
  62536. }
  62537. }
  62538. }]);
  62539. return PanoVideoManager;
  62540. }(tinyEmitter);
  62541. /**
  62542. * 上传人体抠图
  62543. * @param {object} data 传入的对象参数
  62544. * @param {file} data.file 原始图片
  62545. * @returns {Promise}
  62546. **/
  62547. var uploadBodySegment = function uploadBodySegment(data) {
  62548. return http.postFile('/service/scene/uploadBodySegment', data);
  62549. };
  62550. /**
  62551. * 动态面板/查询是否有动态面板数据
  62552. * @param {object} data 传入的对象参数
  62553. * @returns {Promise}
  62554. **/
  62555. var checkDynamicPanel = function checkDynamicPanel(data) {
  62556. return http.get('/service/scene/checkDynamicPanel', data);
  62557. };
  62558. /**
  62559. * 场景同步数据包下载
  62560. * @param {object} data 传入的对象参数
  62561. * @param {text} data.num 场景码
  62562. * @returns {Promise}
  62563. **/
  62564. var downLoadZSData = function downLoadZSData(data) {
  62565. return http.postFile('/service/scene/downLoadZSData', data);
  62566. };
  62567. /**
  62568. * 查询人体抠图结果
  62569. * @param {object} data 传入的对象参数
  62570. * @param {text} data.serialNum 操作序列号
  62571. * @returns {Promise}
  62572. **/
  62573. var getBodySegmentStatus = function getBodySegmentStatus(data) {
  62574. return http.postFile('/service/scene/getBodySegmentStatus', data);
  62575. };
  62576. /**
  62577. * 校验场景密码
  62578. * @param {object} data 传入的对象参数
  62579. * @param {string} data.num 场景码
  62580. * @param {string} data.password 场景密码
  62581. * @returns {Promise}
  62582. **/
  62583. var check_key = function check_key(data) {
  62584. return http.post('/service/scene/check/key', data);
  62585. };
  62586. /**
  62587. * 获取场景详情-查看页面
  62588. * @param {object} data 传入的对象参数
  62589. * @param {string} data.num 场景码
  62590. * @param {number} data.reqType 请求来源(1-编辑页面 2-查看页面)
  62591. * @returns {Promise}
  62592. **/
  62593. var getInfo$1 = function getInfo(data) {
  62594. return http.get('/service/scene/getInfo', data);
  62595. };
  62596. var viewApis = /*#__PURE__*/Object.freeze({
  62597. __proto__: null,
  62598. uploadBodySegment: uploadBodySegment,
  62599. checkDynamicPanel: checkDynamicPanel,
  62600. downLoadZSData: downLoadZSData,
  62601. getBodySegmentStatus: getBodySegmentStatus,
  62602. check_key: check_key,
  62603. getInfo: getInfo$1
  62604. });
  62605. /**
  62606. * TOUR/上传导览视频
  62607. * @param {object} data 传入的对象参数
  62608. * @param {text} data.num 场景码
  62609. * @param {file} data.file 导览视频MP4
  62610. * @returns {Promise}
  62611. **/
  62612. var tour_video_upload = function tour_video_upload(data) {
  62613. return http.postFile('/service/scene/edit/tour/video/upload', data);
  62614. };
  62615. /**
  62616. * TOUR/下载导览视频
  62617. * @param {object} data 传入的对象参数
  62618. * @param {text} data.num 场景码
  62619. * @returns {Promise}
  62620. **/
  62621. var tour_video_download = function tour_video_download(data) {
  62622. return http.postFile('/service/scene/edit/tour/video/download', data);
  62623. };
  62624. /**
  62625. * TOUR/保存导览
  62626. * @param {object} data 传入的对象参数
  62627. * @param {string} data.num 场景码
  62628. * @param {string} data.data 导览数据
  62629. * @returns {Promise}
  62630. **/
  62631. var tour_save = function tour_save(data) {
  62632. return http.post('/service/scene/edit/tour/save', data);
  62633. };
  62634. /**
  62635. * TOUR/删除导览
  62636. * @param {object} data 传入的对象参数
  62637. * @param {string} data.num 场景码
  62638. * @returns {Promise}
  62639. **/
  62640. var tour_delete = function tour_delete(data) {
  62641. return http.post('/service/scene/edit/tour/delete', data);
  62642. };
  62643. /**
  62644. * 公共/上传国际化文件
  62645. * @param {object} data 传入的对象参数
  62646. * @param {string} data.file 文件名称
  62647. * @param {object} data.data json格式对象
  62648. * @returns {Promise}
  62649. **/
  62650. var locales = function locales(data) {
  62651. return http.post('/service/scene/edit/locales', data);
  62652. };
  62653. /**
  62654. * 公共/自定义文件上传
  62655. * @param {object} data 传入的对象参数
  62656. * @param {string} data.content 文件内容
  62657. * @param {string} data.ossPath oss文件地址
  62658. * @returns {Promise}
  62659. **/
  62660. var upload_content = function upload_content(data) {
  62661. return http.post('/service/scene/edit/upload/content', data);
  62662. };
  62663. /**
  62664. * 公共/获取场景编辑权限
  62665. * @param {object} data 传入的对象参数
  62666. * @param {text} data.num 场景码
  62667. * @returns {Promise}
  62668. **/
  62669. var getAuth = function getAuth(data) {
  62670. return http.postFile('/service/scene/edit/getAuth', data);
  62671. };
  62672. /**
  62673. * 公共/获取异步操作记录
  62674. * @param {object} data 传入的对象参数
  62675. * @param {string} data.num 场景码
  62676. * @param {string} data.operType 操作(upload-上传,download-下载)
  62677. * @param {string} data.module 模块(upload_download-上传下载)
  62678. * @param {string} data.function 功能(panorama-全景图,model-模型)
  62679. * @returns {Promise}
  62680. **/
  62681. var getAsynOperLog = function getAsynOperLog(data) {
  62682. return http.post('/service/scene/edit/getAsynOperLog', data);
  62683. };
  62684. /**
  62685. * 公共/获取编辑器版本信息
  62686. * @param {object} data 传入的对象参数
  62687. * @returns {Promise}
  62688. **/
  62689. var getServiceUpTip = function getServiceUpTip(data) {
  62690. return http.get('/service/scene/edit/getServiceUpTip', data);
  62691. };
  62692. /**
  62693. * 初始画面/保存初始画面
  62694. * @param {object} data 传入的对象参数
  62695. * @param {string} data.num 场景码
  62696. * @param {string} data.fileName 文件名
  62697. * @param {string} data.data 初始点信息
  62698. * @returns {Promise}
  62699. **/
  62700. var saveInitialPage = function saveInitialPage(data) {
  62701. return http.post('/service/scene/edit/saveInitialPage', data);
  62702. };
  62703. /**
  62704. * 动态面板/修改
  62705. * @param {object} data 传入的对象参数
  62706. * @param {string} data.num
  62707. * @param {object} data.data
  62708. * @param {string} data.data.text undefined
  62709. * @param {string} data.data.sid undefined
  62710. * @returns {Promise}
  62711. **/
  62712. var dynamicPanel_update = function dynamicPanel_update(data) {
  62713. return http.post('/service/scene/edit/dynamicPanel/update', data);
  62714. };
  62715. /**
  62716. * 动态面板/列表
  62717. * @param {object} data 传入的对象参数
  62718. * @returns {Promise}
  62719. **/
  62720. var dynamicPanel_list = function dynamicPanel_list(data) {
  62721. return http.get('/service/scene/edit/dynamicPanel/list', data);
  62722. };
  62723. /**
  62724. * 场景信息/上传logo
  62725. * @param {object} data 传入的对象参数
  62726. * @param {string} data.num 场景码
  62727. * @param {string} data.floorLogo 地面logo名称
  62728. * @param {number} data.floorLogoSize 地面logo大小
  62729. * @param {string} data.music 背景音乐名称
  62730. * @param {string} data.scenePassword 加密浏览密码
  62731. * @param {string} data.title 场景标题
  62732. * @param {string} data.description 场景描述
  62733. * @param {number} data.floorPlanUpload 用户是否上传自定义平面图(0-否,1-是)
  62734. * @param {object} data.controls
  62735. * @param {number} data.controls.showMap 是否展示小地图(0-否,1-是)
  62736. * @param {number} data.controls.showLock 是否需要密码访问(0-否,1-是)
  62737. * @param {number} data.controls.showTitle 是否展示标题(0-否,1-是)
  62738. * @param {number} data.controls.showPanorama 是否展示漫游按钮(0-否,1-是)
  62739. * @param {number} data.controls.showDollhouse 是否展示3D按钮(0-否,1-是)
  62740. * @param {number} data.controls.showFloorplan 是否展示2D按钮(0-否,1-是)
  62741. * @returns {Promise}
  62742. **/
  62743. var uploadShareLogo = function uploadShareLogo(data) {
  62744. return http.postFile('/service/scene/edit/uploadShareLogo', data);
  62745. };
  62746. /**
  62747. * 场景修复/保存水印
  62748. * @param {object} data 传入的对象参数
  62749. * @param {string} data.num 场景码
  62750. * @param {string} data.fileName 文件名
  62751. * @returns {Promise}
  62752. **/
  62753. var waterMark_add = function waterMark_add(data) {
  62754. return http.post('/service/scene/edit/waterMark/add', data);
  62755. };
  62756. /**
  62757. * 场景修复/删除水印
  62758. * @param {object} data 传入的对象参数
  62759. * @param {string} data.num 场景码
  62760. * @param {string} data.fileName 文件名
  62761. * @returns {Promise}
  62762. **/
  62763. var waterMark_delete = function waterMark_delete(data) {
  62764. return http.post('/service/scene/edit/waterMark/delete', data);
  62765. };
  62766. /**
  62767. * 场景关联/上传场景关联全景图
  62768. * @param {object} data 传入的对象参数
  62769. * @param {string} data.num 场景码
  62770. * @param {array} data.styles 图标json数组
  62771. * @param {array} data.linkPans 场景关联json数组
  62772. * @returns {Promise}
  62773. **/
  62774. var linkPan_upload = function linkPan_upload(data) {
  62775. return http.postFile('/service/scene/edit/linkPan/upload', data);
  62776. };
  62777. /**
  62778. * 场景关联/保存场景关联
  62779. * @param {object} data 传入的对象参数
  62780. * @param {string} data.num 场景码
  62781. * @param {array} data.styles 图标json数组
  62782. * @param {array} data.linkPans 场景关联json数组
  62783. * @returns {Promise}
  62784. **/
  62785. var linkPan_save = function linkPan_save(data) {
  62786. return http.post('/service/scene/edit/linkPan/save', data);
  62787. };
  62788. /**
  62789. * 场景关联/删除关联场景
  62790. * @param {object} data 传入的对象参数
  62791. * @param {string} data.num 场景码
  62792. * @param {array} data.sidList sid数组
  62793. * @returns {Promise}
  62794. **/
  62795. var linkPan_delete = function linkPan_delete(data) {
  62796. return http.post('/service/scene/edit/linkPan/delete', data);
  62797. };
  62798. /**
  62799. * 场景关联/删除场景关联图标
  62800. * @param {object} data 传入的对象参数
  62801. * @param {string} data.num 场景码
  62802. * @param {array} data.sidList id数组
  62803. * @returns {Promise}
  62804. **/
  62805. var styles_delete = function styles_delete(data) {
  62806. return http.post('/service/scene/edit/styles/delete', data);
  62807. };
  62808. /**
  62809. * 场景关联/获取场景关联列表
  62810. * @param {object} data 传入的对象参数
  62811. * @param {string} data.num 场景码
  62812. * @param {array} data.styles 图标json数组
  62813. * @param {array} data.linkPans 场景关联json数组
  62814. * @returns {Promise}
  62815. **/
  62816. var linkPan_list = function linkPan_list(data) {
  62817. return http.postFile('/service/scene/edit/linkPan/list', data);
  62818. };
  62819. /**
  62820. * 基础设置/保存场景信息
  62821. * @param {object} data 传入的对象参数
  62822. * @param {string} data.num 场景码
  62823. * @param {string} data.floorLogo 地面logo名称
  62824. * @param {number} data.floorLogoSize 地面logo大小
  62825. * @param {string} data.music 背景音乐名称
  62826. * @param {string} data.scenePassword 加密浏览密码
  62827. * @param {string} data.title 场景标题
  62828. * @param {string} data.description 场景描述
  62829. * @param {number} data.floorPlanUpload 用户是否上传自定义平面图(0-否,1-是)
  62830. * @param {object} data.controls
  62831. * @param {number} data.controls.showMap 是否展示小地图(0-否,1-是)
  62832. * @param {number} data.controls.showLock 是否需要密码访问(0-否,1-是)
  62833. * @param {number} data.controls.showTitle 是否展示标题(0-否,1-是)
  62834. * @param {number} data.controls.showPanorama 是否展示漫游按钮(0-否,1-是)
  62835. * @param {number} data.controls.showDollhouse 是否展示3D按钮(0-否,1-是)
  62836. * @param {number} data.controls.showFloorplan 是否展示2D按钮(0-否,1-是)
  62837. * @param {object} data.sns 分享配置信息(json格式)
  62838. * @returns {Promise}
  62839. **/
  62840. var base_save = function base_save(data) {
  62841. return http.post('/service/scene/edit/base/save', data);
  62842. };
  62843. /**
  62844. * 平面图/户型图重命名
  62845. * @param {object} data 传入的对象参数
  62846. * @param {string} data.num 场景码
  62847. * @param {array} data.floors 楼层数组
  62848. * @returns {Promise}
  62849. **/
  62850. var cad_rename = function cad_rename(data) {
  62851. return http.post('/service/scene/edit/cad/rename', data);
  62852. };
  62853. /**
  62854. * 模型裁剪/保存
  62855. * @param {object} data 传入的对象参数
  62856. * @param {string} data.num 场景码
  62857. * @param {array} data.data 指示牌数据
  62858. * @returns {Promise}
  62859. **/
  62860. var cutModel_save = function cutModel_save(data) {
  62861. return http.post('/service/scene/edit/cutModel/save', data);
  62862. };
  62863. /**
  62864. * 模型裁剪/列表
  62865. * @param {object} data 传入的对象参数
  62866. * @param {string} data.num 场景码
  62867. * @returns {Promise}
  62868. **/
  62869. var cutModel_list = function cutModel_list(data) {
  62870. return http.post('/service/scene/edit/cutModel/list', data);
  62871. };
  62872. /**
  62873. * 模型裁剪/删除
  62874. * @param {object} data 传入的对象参数
  62875. * @param {string} data.num 场景码
  62876. * @param {array} data.sidList sid集合
  62877. * @returns {Promise}
  62878. **/
  62879. var cutModel_delete = function cutModel_delete(data) {
  62880. return http.post('/service/scene/edit/cutModel/delete', data);
  62881. };
  62882. /**
  62883. * 添加热点/删除icons
  62884. * @param {object} data 传入的对象参数
  62885. * @param {string} data.num 场景码
  62886. * @param {array} data.fileNameList 文件名集合
  62887. * @returns {Promise}
  62888. **/
  62889. var icons_delete = function icons_delete(data) {
  62890. return http.post('/service/scene/edit/icons/delete', data);
  62891. };
  62892. /**
  62893. * 滤镜/保存滤镜
  62894. * @param {object} data 传入的对象参数
  62895. * @param {string} data.num 场景码
  62896. * @param {string} data.data 滤镜数据
  62897. * @param {number} data.reset 是否恢复默认(0-否,1-是,null-否)
  62898. * @returns {Promise}
  62899. **/
  62900. var filter_save = function filter_save(data) {
  62901. return http.post('/service/scene/edit/filter/save', data);
  62902. };
  62903. /**
  62904. * 滤镜/保存风格滤镜
  62905. * @param {object} data 传入的对象参数
  62906. * @param {string} data.num
  62907. * @param {string} data.data
  62908. * @returns {Promise}
  62909. **/
  62910. var uploadROIFilter = function uploadROIFilter(data) {
  62911. return http.post('/service/scene/edit/uploadROIFilter', data);
  62912. };
  62913. /**
  62914. * 滤镜/滤镜列表
  62915. * @param {object} data 传入的对象参数
  62916. * @param {string} data.num 场景码
  62917. * @returns {Promise}
  62918. **/
  62919. var filter_list = function filter_list(data) {
  62920. return http.post('/service/scene/edit/filter/list', data);
  62921. };
  62922. /**
  62923. * 热点/指示牌/保存
  62924. * @param {object} data 传入的对象参数
  62925. * @param {string} data.num 场景码
  62926. * @param {array} data.data 指示牌数据
  62927. * @param {array} data.styles 自定义图标数据
  62928. * @returns {Promise}
  62929. **/
  62930. var billboards_save = function billboards_save(data) {
  62931. return http.post('/service/scene/edit/billboards/save', data);
  62932. };
  62933. /**
  62934. * 热点/指示牌/列表
  62935. * @param {object} data 传入的对象参数
  62936. * @param {string} data.num 场景码
  62937. * @returns {Promise}
  62938. **/
  62939. var billboards_list = function billboards_list(data) {
  62940. return http.post('/service/scene/edit/billboards/list', data);
  62941. };
  62942. /**
  62943. * 热点/指示牌/删除
  62944. * @param {object} data 传入的对象参数
  62945. * @param {string} data.num 场景码
  62946. * @param {array} data.sidList sid集合
  62947. * @returns {Promise}
  62948. **/
  62949. var billboards_delete = function billboards_delete(data) {
  62950. return http.post('/service/scene/edit/billboards/delete', data);
  62951. };
  62952. /**
  62953. * 热点/指示牌/删除自定义图标
  62954. * @param {object} data 传入的对象参数
  62955. * @param {string} data.num 场景码
  62956. * @param {array} data.sidList sid集合
  62957. * @returns {Promise}
  62958. **/
  62959. var billboards_styles_delete = function billboards_styles_delete(data) {
  62960. return http.post('/service/scene/edit/billboards/styles/delete', data);
  62961. };
  62962. /**
  62963. * 监控/保存监控
  62964. * @param {object} data 传入的对象参数
  62965. * @param {string} data.num 场景码
  62966. * @param {object} data.data 监控设置,json对象
  62967. * @param {string} data.name 监控名称
  62968. * @param {string} data.playUrl 监控地址
  62969. * @param {string} data.sid 监控sid
  62970. * @param {string} data.panoId panoId
  62971. * @returns {Promise}
  62972. **/
  62973. var surveillance_save = function surveillance_save(data) {
  62974. return http.post('/service/scene/edit/surveillance/save', data);
  62975. };
  62976. /**
  62977. * 监控/删除监控
  62978. * @param {object} data 传入的对象参数
  62979. * @param {number} data.sid 监控sid
  62980. * @param {string} data.num 场景码
  62981. * @returns {Promise}
  62982. **/
  62983. var surveillance_delete = function surveillance_delete(data) {
  62984. return http.post('/service/scene/edit/surveillance/delete', data);
  62985. };
  62986. /**
  62987. * 监控/监控列表
  62988. * @param {object} data 传入的对象参数
  62989. * @param {string} data.num 场景码
  62990. * @returns {Promise}
  62991. **/
  62992. var surveillance_list = function surveillance_list(data) {
  62993. return http.post('/service/scene/edit/surveillance/list', data);
  62994. };
  62995. /**
  62996. * 空间绘制/保存
  62997. * @param {object} data 传入的对象参数
  62998. * @param {string} data.num
  62999. * @param {array} data.data
  63000. * @returns {Promise}
  63001. **/
  63002. var sceneDraw_save = function sceneDraw_save(data) {
  63003. return http.post('/service/scene/edit/sceneDraw/save', data);
  63004. };
  63005. /**
  63006. * 空间绘制/删除
  63007. * @param {object} data 传入的对象参数
  63008. * @param {string} data.num
  63009. * @param {array} data.sidList
  63010. * @returns {Promise}
  63011. **/
  63012. var sceneDraw_delete = function sceneDraw_delete(data) {
  63013. return http.post('/service/scene/edit/sceneDraw/delete', data);
  63014. };
  63015. /**
  63016. * 空间绘制/查询空间绘制列表
  63017. * @param {object} data 传入的对象参数
  63018. * @returns {Promise}
  63019. **/
  63020. var sceneDraw_list = function sceneDraw_list(data) {
  63021. return http.get('/service/scene/edit/sceneDraw/list', data);
  63022. };
  63023. /**
  63024. * 空间装饰/上传空间模型
  63025. * @param {object} data 传入的对象参数
  63026. * @param {text} data.num 场景码
  63027. * @param {text} data.sid sid
  63028. * @param {file} data.file 模型压缩包,仅支持zip
  63029. * @returns {Promise}
  63030. **/
  63031. var model_box_upload = function model_box_upload(data) {
  63032. return http.postFile('/service/scene/edit/model/box/upload', data);
  63033. };
  63034. /**
  63035. * 空间装饰/保存空间模型
  63036. * @param {object} data 传入的对象参数
  63037. * @param {string} data.num 场景码
  63038. * @param {object} data.data json数据
  63039. * @param {string} data.data.sid undefined
  63040. * @returns {Promise}
  63041. **/
  63042. var model_box_save = function model_box_save(data) {
  63043. return http.post('/service/scene/edit/model/box/save', data);
  63044. };
  63045. /**
  63046. * 空间装饰/保存空间贴图
  63047. * @param {object} data 传入的对象参数
  63048. * @param {string} data.num 场景码
  63049. * @param {string} data.data 空间贴图数据
  63050. * @returns {Promise}
  63051. **/
  63052. var photo_box_save = function photo_box_save(data) {
  63053. return http.post('/service/scene/edit/photo/box/save', data);
  63054. };
  63055. /**
  63056. * 空间装饰/删除空间模型
  63057. * @param {object} data 传入的对象参数
  63058. * @param {string} data.num 场景码
  63059. * @param {string} data.sid sid
  63060. * @returns {Promise}
  63061. **/
  63062. var model_box_delete = function model_box_delete(data) {
  63063. return http.post('/service/scene/edit/model/box/delete', data);
  63064. };
  63065. /**
  63066. * 空间装饰/删除空间贴图
  63067. * @param {object} data 传入的对象参数
  63068. * @param {string} data.num 场景码
  63069. * @param {string} data.sid sid
  63070. * @returns {Promise}
  63071. **/
  63072. var photo_box_delete = function photo_box_delete(data) {
  63073. return http.post('/service/scene/edit/photo/box/delete', data);
  63074. };
  63075. /**
  63076. * 马赛克/删除马赛克
  63077. * @param {object} data 传入的对象参数
  63078. * @param {string} data.num 场景码
  63079. * @param {array} data.panoIdList 集合
  63080. * @returns {Promise}
  63081. **/
  63082. var mosaics_delete = function mosaics_delete(data) {
  63083. return http.post('/service/scene/edit/mosaics/delete', data);
  63084. };
  63085. /**
  63086. * 马赛克/添加马赛克
  63087. * @param {object} data 传入的对象参数
  63088. * @param {string} data.num 场景码
  63089. * @param {string} data.data 马赛克数据
  63090. * @returns {Promise}
  63091. **/
  63092. var mosaics_add = function mosaics_add(data) {
  63093. return http.post('/service/scene/edit/mosaics/add', data);
  63094. };
  63095. /**
  63096. * 马赛克/马赛克列表
  63097. * @param {object} data 传入的对象参数
  63098. * @param {string} data.num 场景码
  63099. * @returns {Promise}
  63100. **/
  63101. var mosaics_list = function mosaics_list(data) {
  63102. return http.post('/service/scene/edit/mosaics/list', data);
  63103. };
  63104. /**
  63105. * 公共/场景发布
  63106. * @param {object} data 传入的对象参数
  63107. * @param {string} data.num 场景码
  63108. * @returns {Promise}
  63109. **/
  63110. var publicScene = function publicScene(data) {
  63111. return http.post('/service/scene/edit/publicScene', data);
  63112. };
  63113. /**
  63114. * 公共/文件上传
  63115. * @param {object} data 传入的对象参数
  63116. * @param {text} data.base64 图片base64
  63117. * @param {text} data.num 场景码
  63118. * @param {text} data.type 0添加,1替换,默认为1
  63119. * @param {file} data.files 文件数组
  63120. * @param {text} data.fileName 文件名称
  63121. * @param {text} data.bizType 业务类型
  63122. * @param {text} data.uploadPath 上传oss路径
  63123. * @returns {Promise}
  63124. **/
  63125. var upload_files = function upload_files(data) {
  63126. return http.postFile('/service/scene/edit/upload/files', data);
  63127. };
  63128. /**
  63129. * 公共/删除文件
  63130. * @param {object} data 传入的对象参数
  63131. * @param {string} data.num
  63132. * @param {string} data.bizType 业务类型
  63133. * @param {array} data.fileNames 文件名称集合
  63134. * @returns {Promise}
  63135. **/
  63136. var delete_file = function delete_file(data) {
  63137. return http.post('/service/scene/edit/delete/file', data);
  63138. };
  63139. /**
  63140. * 公共/文件上传后保存
  63141. * @param {object} data 传入的对象参数
  63142. * @param {string} data.num 场景码
  63143. * @param {string} data.bizType 文件业务类型
  63144. * @param {string} data.fileInfo 文件信息,json格式字符串
  63145. * @returns {Promise}
  63146. **/
  63147. var saveUpload = function saveUpload(data) {
  63148. return http.post('/service/scene/edit/saveUpload', data);
  63149. };
  63150. /**
  63151. * 公共/获取场景详情-编辑页面
  63152. * @param {object} data 传入的对象参数
  63153. * @param {string} data.num 场景码
  63154. * @param {number} data.reqType 请求来源(1-编辑页面 2-查看页面)
  63155. * @returns {Promise}
  63156. **/
  63157. var getInfo = function getInfo(data) {
  63158. return http.get('/service/scene/edit/getInfo', data);
  63159. };
  63160. /**
  63161. * 漫游可行/保存漫游可行
  63162. * @param {object} data 传入的对象参数
  63163. * @param {string} data.num 场景码
  63164. * @param {string} data.data 漫游详情数据
  63165. * @returns {Promise}
  63166. **/
  63167. var saveRoam = function saveRoam(data) {
  63168. return http.post('/service/scene/edit/saveRoam', data);
  63169. };
  63170. /**
  63171. * 添加热点/保存热点可视
  63172. * @param {object} data 传入的对象参数
  63173. * @param {string} data.num 场景码
  63174. * @param {string} data.data 热点可视详情
  63175. * @returns {Promise}
  63176. **/
  63177. var saveTagsVisible = function saveTagsVisible(data) {
  63178. return http.post('/service/scene/edit/saveTagsVisible', data);
  63179. };
  63180. /**
  63181. * 平面图/保存户型图
  63182. * @param {object} data 传入的对象参数
  63183. * @returns {Promise}
  63184. **/
  63185. var cad_save = function cad_save(data) {
  63186. return http.post('/service/scene/edit/cad/save', data);
  63187. };
  63188. /**
  63189. * 添加热点/添加或修改热点
  63190. * @param {object} data 传入的对象参数
  63191. * @param {string} data.num 场景码
  63192. * @param {array} data.hotDataList 热点数据集合
  63193. * @param {array} data.icons icons集合
  63194. * @returns {Promise}
  63195. **/
  63196. var tag_save = function tag_save(data) {
  63197. return http.post('/service/scene/edit/tag/save', data);
  63198. };
  63199. /**
  63200. * 添加热点/删除热点
  63201. * @param {object} data 传入的对象参数
  63202. * @param {string} data.num
  63203. * @param {array} data.sidList 删除热点sid集合
  63204. * @returns {Promise}
  63205. **/
  63206. var tag_delete = function tag_delete(data) {
  63207. return http.post('/service/scene/edit/tag/delete', data);
  63208. };
  63209. /**
  63210. * 场景修复/全景照片上传
  63211. * @param {object} data 传入的对象参数
  63212. * @param {string} data.num
  63213. * @param {array} data.sidList 删除热点sid集合
  63214. * @returns {Promise}
  63215. **/
  63216. var uploadPanorama = function uploadPanorama(data) {
  63217. return http.postFile('/service/scene/edit/uploadPanorama', data);
  63218. };
  63219. /**
  63220. * 场景修复/模型上传
  63221. * @param {object} data 传入的对象参数
  63222. * @param {text} data.num 场景码
  63223. * @param {file} data.file 模型压缩包
  63224. * @returns {Promise}
  63225. **/
  63226. var uploadModel = function uploadModel(data) {
  63227. return http.postFile('/service/scene/edit/uploadModel', data);
  63228. };
  63229. /**
  63230. * 场景修复/模型下载
  63231. * @param {object} data 传入的对象参数
  63232. * @param {text} data.num 场景码
  63233. * @returns {Promise}
  63234. **/
  63235. var downloadModel = function downloadModel(data) {
  63236. return http.postFile('/service/scene/edit/downloadModel', data);
  63237. };
  63238. /**
  63239. * 添加热点/获取热点详情
  63240. * @param {object} data 传入的对象参数
  63241. * @param {string} data.num
  63242. * @param {array} data.sidList 删除热点sid集合
  63243. * @returns {Promise}
  63244. **/
  63245. var tag_list = function tag_list(data) {
  63246. return http.postFile('/service/scene/edit/tag/list', data);
  63247. };
  63248. /**
  63249. * 平面图/户型图重置
  63250. * @param {object} data 传入的对象参数
  63251. * @param {string} data.num
  63252. * @param {array} data.sidList 删除热点sid集合
  63253. * @returns {Promise}
  63254. **/
  63255. var cad_reset = function cad_reset(data) {
  63256. return http.postFile('/service/scene/edit/cad/reset', data);
  63257. };
  63258. /**
  63259. * 场景修复/全景照片下载
  63260. * @param {object} data 传入的对象参数
  63261. * @param {string} data.num 场景码
  63262. * @param {string} data.fileName 文件名,不为空时,单个文件下载
  63263. * @returns {Promise}
  63264. **/
  63265. var downloadPanorama = function downloadPanorama(data) {
  63266. return http.post('/service/scene/edit/downloadPanorama', data);
  63267. };
  63268. /**
  63269. * 空间装饰/保存空间视频
  63270. * @param {object} data 传入的对象参数
  63271. * @param {string} data.num 场景码
  63272. * @param {string} data.fileName 文件名
  63273. * @param {string} data.data 数据
  63274. * @returns {Promise}
  63275. **/
  63276. var video_box_save = function video_box_save(data) {
  63277. return http.post('/service/scene/edit/video/box/save', data);
  63278. };
  63279. /**
  63280. * 空间装饰/删除空间视频
  63281. * @param {object} data 传入的对象参数
  63282. * @param {string} data.num 场景码
  63283. * @param {string} data.sid sid
  63284. * @returns {Promise}
  63285. **/
  63286. var video_box_delete = function video_box_delete(data) {
  63287. return http.post('/service/scene/edit/video/box/delete', data);
  63288. };
  63289. /**
  63290. * 场景修复/上传球幕视频
  63291. * @param {object} data 传入的对象参数
  63292. * @param {text} data.num 场景码
  63293. * @param {text} data.fileName 文件名称
  63294. * @param {file} data.file 文件
  63295. * @returns {Promise}
  63296. **/
  63297. var uploadBallScreenVideo = function uploadBallScreenVideo(data) {
  63298. return http.postFile('/service/scene/edit/uploadBallScreenVideo', data);
  63299. };
  63300. /**
  63301. * 场景修复/下载球幕视频
  63302. * @param {object} data 传入的对象参数
  63303. * @param {string} data.num 场景码
  63304. * @param {string} data.fileName 文件名
  63305. * @returns {Promise}
  63306. **/
  63307. var downloadBallScreenVideo = function downloadBallScreenVideo(data) {
  63308. return http.post('/service/scene/edit/downloadBallScreenVideo', data);
  63309. };
  63310. /**
  63311. * 数据对接/场景同步
  63312. * @param {object} data 传入的对象参数
  63313. * @param {text} data.num 场景码
  63314. * @param {text} data.type 同步目标类型,默认安居客(ajk)
  63315. * @param {text} data.floorPlanJson
  63316. * @param {text} data.ajkJson
  63317. * @param {text} data.cameraJson
  63318. * @param {file} data.files 文件
  63319. * @returns {Promise}
  63320. **/
  63321. var sceneSync = function sceneSync(data) {
  63322. return http.postFile('/service/scene/edit/sceneSync', data);
  63323. };
  63324. var editApis = /*#__PURE__*/Object.freeze({
  63325. __proto__: null,
  63326. tour_video_upload: tour_video_upload,
  63327. tour_video_download: tour_video_download,
  63328. tour_save: tour_save,
  63329. tour_delete: tour_delete,
  63330. locales: locales,
  63331. upload_content: upload_content,
  63332. getAuth: getAuth,
  63333. getAsynOperLog: getAsynOperLog,
  63334. getServiceUpTip: getServiceUpTip,
  63335. saveInitialPage: saveInitialPage,
  63336. dynamicPanel_update: dynamicPanel_update,
  63337. dynamicPanel_list: dynamicPanel_list,
  63338. uploadShareLogo: uploadShareLogo,
  63339. waterMark_add: waterMark_add,
  63340. waterMark_delete: waterMark_delete,
  63341. linkPan_upload: linkPan_upload,
  63342. linkPan_save: linkPan_save,
  63343. linkPan_delete: linkPan_delete,
  63344. styles_delete: styles_delete,
  63345. linkPan_list: linkPan_list,
  63346. base_save: base_save,
  63347. cad_rename: cad_rename,
  63348. cutModel_save: cutModel_save,
  63349. cutModel_list: cutModel_list,
  63350. cutModel_delete: cutModel_delete,
  63351. icons_delete: icons_delete,
  63352. filter_save: filter_save,
  63353. uploadROIFilter: uploadROIFilter,
  63354. filter_list: filter_list,
  63355. billboards_save: billboards_save,
  63356. billboards_list: billboards_list,
  63357. billboards_delete: billboards_delete,
  63358. billboards_styles_delete: billboards_styles_delete,
  63359. surveillance_save: surveillance_save,
  63360. surveillance_delete: surveillance_delete,
  63361. surveillance_list: surveillance_list,
  63362. sceneDraw_save: sceneDraw_save,
  63363. sceneDraw_delete: sceneDraw_delete,
  63364. sceneDraw_list: sceneDraw_list,
  63365. model_box_upload: model_box_upload,
  63366. model_box_save: model_box_save,
  63367. photo_box_save: photo_box_save,
  63368. model_box_delete: model_box_delete,
  63369. photo_box_delete: photo_box_delete,
  63370. mosaics_delete: mosaics_delete,
  63371. mosaics_add: mosaics_add,
  63372. mosaics_list: mosaics_list,
  63373. publicScene: publicScene,
  63374. upload_files: upload_files,
  63375. delete_file: delete_file,
  63376. saveUpload: saveUpload,
  63377. getInfo: getInfo,
  63378. saveRoam: saveRoam,
  63379. saveTagsVisible: saveTagsVisible,
  63380. cad_save: cad_save,
  63381. tag_save: tag_save,
  63382. tag_delete: tag_delete,
  63383. uploadPanorama: uploadPanorama,
  63384. uploadModel: uploadModel,
  63385. downloadModel: downloadModel,
  63386. tag_list: tag_list,
  63387. cad_reset: cad_reset,
  63388. downloadPanorama: downloadPanorama,
  63389. video_box_save: video_box_save,
  63390. video_box_delete: video_box_delete,
  63391. uploadBallScreenVideo: uploadBallScreenVideo,
  63392. downloadBallScreenVideo: downloadBallScreenVideo,
  63393. sceneSync: sceneSync
  63394. });
  63395. function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
  63396. function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty$1(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
  63397. var viewer = function viewer(data) {
  63398. return {
  63399. info: function info() {
  63400. return getInfo$1(data);
  63401. }
  63402. };
  63403. };
  63404. var editor = function editor(data) {
  63405. return {
  63406. uploads: function uploads(params) {
  63407. return upload_files(_objectSpread$1(_objectSpread$1({}, data), params));
  63408. },
  63409. publish: function publish() {
  63410. return publicScene(data);
  63411. },
  63412. info: function info() {
  63413. return getInfo(data);
  63414. },
  63415. save: function save() {
  63416. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  63417. return base_save(_objectSpread$1(_objectSpread$1({}, data), params));
  63418. },
  63419. get_pano_video: function get_pano_video() {
  63420. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  63421. return downloadBallScreenVideo(_objectSpread$1(_objectSpread$1({}, data), params));
  63422. },
  63423. upload_pano_video: function upload_pano_video() {
  63424. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  63425. return uploadBallScreenVideo(_objectSpread$1(_objectSpread$1({}, data), params));
  63426. },
  63427. cad_save: function cad_save$1() {
  63428. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  63429. return cad_save(_objectSpread$1(_objectSpread$1({}, data), params));
  63430. },
  63431. cad_reset: function cad_reset$1() {
  63432. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  63433. return cad_reset(_objectSpread$1(_objectSpread$1({}, data), params));
  63434. },
  63435. cad_rename: function cad_rename$1() {
  63436. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  63437. return cad_rename(_objectSpread$1(_objectSpread$1({}, data), params));
  63438. },
  63439. walk_save: function walk_save() {
  63440. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  63441. return saveRoam(_objectSpread$1(_objectSpread$1({}, data), params));
  63442. },
  63443. /**
  63444. * 保存初始画面
  63445. * @param {object} params 参数对象
  63446. * @param {Array<File>} params.files 初始画面图片文件数组
  63447. * @param {object} params.entry 初始画面三维数据
  63448. */
  63449. setting_save_initial: function () {
  63450. var _setting_save_initial = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  63451. var params,
  63452. response,
  63453. _args = arguments;
  63454. return regenerator.wrap(function _callee$(_context) {
  63455. while (1) {
  63456. switch (_context.prev = _context.next) {
  63457. case 0:
  63458. params = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
  63459. response = null;
  63460. if (!(!params.files || !params.files.length || !params.entry)) {
  63461. _context.next = 4;
  63462. break;
  63463. }
  63464. return _context.abrupt("return", Promise.resolve({
  63465. code: 0,
  63466. success: true
  63467. }));
  63468. case 4:
  63469. if (!(params.files && params.files.length)) {
  63470. _context.next = 10;
  63471. break;
  63472. }
  63473. _context.next = 7;
  63474. return this.uploads({
  63475. bizType: 'settings-thumb',
  63476. files: params.files
  63477. });
  63478. case 7:
  63479. response = _context.sent;
  63480. if (response.success) {
  63481. _context.next = 10;
  63482. break;
  63483. }
  63484. return _context.abrupt("return", Promise.reject(response));
  63485. case 10:
  63486. _context.next = 12;
  63487. return saveInitialPage(_objectSpread$1(_objectSpread$1({}, data), {}, {
  63488. data: JSON.stringify(params.entry),
  63489. fileName: 'thumb-1k.jpg'
  63490. }));
  63491. case 12:
  63492. response = _context.sent;
  63493. if (response.success) {
  63494. _context.next = 15;
  63495. break;
  63496. }
  63497. return _context.abrupt("return", Promise.reject(response));
  63498. case 15:
  63499. return _context.abrupt("return", Promise.resolve(response));
  63500. case 16:
  63501. case "end":
  63502. return _context.stop();
  63503. }
  63504. }
  63505. }, _callee, this);
  63506. }));
  63507. function setting_save_initial() {
  63508. return _setting_save_initial.apply(this, arguments);
  63509. }
  63510. return setting_save_initial;
  63511. }()
  63512. };
  63513. };
  63514. var APIs = (function (app) {
  63515. var data = {
  63516. num: app.config.num,
  63517. get rnd() {
  63518. return Date.now();
  63519. }
  63520. };
  63521. return {
  63522. viewer: viewer(data),
  63523. editor: editor(data)
  63524. };
  63525. });
  63526. var css = "@-webkit-keyframes ruler-point {\n 0% {\n height: 0\n }\n\n to {\n height: 11.375px\n }\n}\n\n@keyframes ruler-point {\n 0% {\n height: 0\n }\n\n to {\n height: 11.375px\n }\n}\n\n@-webkit-keyframes ruler-label {\n 0% {\n max-width: 0\n }\n\n to {\n max-width: 131.25px\n }\n}\n\n@keyframes ruler-label {\n 0% {\n max-width: 0\n }\n\n to {\n max-width: 131.25px\n }\n}\n\n@-webkit-keyframes door-label {\n 0% {\n opacity: 0;\n margin-top: 8.75px\n }\n\n to {\n opacity: 1;\n margin-top: 0\n }\n}\n\n@keyframes door-label {\n 0% {\n opacity: 0;\n margin-top: 8.75px\n }\n\n to {\n opacity: 1;\n margin-top: 0\n }\n}\n\n@-webkit-keyframes room-label {\n 0% {\n opacity: 0;\n margin-top: 8.75px\n }\n\n to {\n opacity: 1;\n margin-top: 0\n }\n}\n\n@keyframes room-label {\n 0% {\n opacity: 0;\n margin-top: 8.75px\n }\n\n to {\n opacity: 1;\n margin-top: 0\n }\n}\n\n@-webkit-keyframes ruler-line {\n 0% {\n width: 0\n }\n\n to {\n width: 100%\n }\n}\n\n@keyframes ruler-line {\n 0% {\n width: 0\n }\n\n to {\n width: 100%\n }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.widgets-design-option {\n width: 100%;\n height: 100%;\n z-index: 4;\n position: absolute;\n user-select: none;\n overflow: hidden;\n pointer-events: none;\n left: 0;\n top: 0;\n }\n .widgets-design-option i {\n margin: 0 5px;\n }\n .widgets-design-option i:before {\n font-family: \"iconfont\" !important;\n font-size: 32px;\n line-height: 36px;\n font-style: normal;\n }\n .widgets-design-option li {\n cursor: pointer;\n }\n .widgets-design-option > div {\n height: 36px;\n background: #262729;\n position: absolute;\n transform: translate(-100%, -50%) translateX(-15px);\n border-top-left-radius: 18px;\n border-bottom-left-radius: 18px;\n padding-left: 10px;\n pointer-events: auto;\n box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.4);\n }\n .widgets-design-option > div:after {\n position: absolute;\n right: -15px;\n top: 0;\n content: \"\";\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 18px 0 18px 15px;\n border-color: transparent transparent transparent #262729;\n }\n .widgets-design-option.right > div {\n transform: translate(15px, -50%);\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n border-top-right-radius: 18px;\n border-bottom-right-radius: 18px;\n padding: 0 10px 0 0;\n }\n .widgets-design-option.right > div:after {\n right: auto;\n left: -15px;\n border-width: 18px 15px 18px 0;\n border-color: transparent #262729 transparent transparent;\n }\n .widgets-design-option .delete-ruler li {\n line-height: 36px;\n padding: 0 10px;\n word-break: keep-all;\n list-style: none;\n }\n \n .widgets-rulers {\n position: absolute;\n pointer-events: none;\n top: 0;\n left: 0;\n bottom: 0;\n right: 0;\n}\n\n.widgets-rulers .ruler-line {\n position: absolute;\n -webkit-transform-origin: left 0.875px;\n transform-origin: left 0.875px;\n width: 0;\n height: 1.75px;\n}\n\n.widgets-rulers .ruler-line em {\n background: linear-gradient(90deg, hsla(0, 0%, 100%, 0.5), hsla(0, 0%, 100%, 0.3));\n display: block;\n height: 100%;\n -webkit-animation: ruler-line 0.5s ease 1s;\n animation: ruler-line 0.5s ease 1s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n -webkit-box-shadow: 0 0 3.5px rgba(0, 0, 0, 0.6);\n box-shadow: 0 0 3.5px rgba(0, 0, 0, 0.6);\n}\n\n.widgets-rulers .ruler-label {\n position: absolute;\n /* width: 0; */\n height: 0;\n top: 0.875px;\n left: 38%;\n color: #fff;\n}\n\n.widgets-rulers .ruler-label .ruler-label-point {\n position: absolute;\n width: 28px;\n height: 11.375px;\n right: 0;\n bottom: 0;\n background-position: bottom;\n background-repeat: no-repeat;\n background-image: url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMzRweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMzQgMTUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDQ4LjIgKDQ3MzI3KSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KICAgIDx0aXRsZT5Hcm91cCA3PC90aXRsZT4KICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogICAgPGRlZnM+CiAgICAgICAgPGNpcmNsZSBpZD0icGF0aC0xIiBjeD0iMS41IiBjeT0iMS41IiByPSIxLjUiPjwvY2lyY2xlPgogICAgICAgIDxmaWx0ZXIgeD0iLTEwMC4wJSIgeT0iLTEwMC4wJSIgd2lkdGg9IjMwMC4wJSIgaGVpZ2h0PSIzMDAuMCUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgaWQ9ImZpbHRlci0yIj4KICAgICAgICAgICAgPGZlT2Zmc2V0IGR4PSIwIiBkeT0iMCIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd09mZnNldE91dGVyMSI+PC9mZU9mZnNldD4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMSIgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIj48L2ZlR2F1c3NpYW5CbHVyPgogICAgICAgICAgICA8ZmVDb2xvck1hdHJpeCB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4yOTkzNjU5NDIgMCIgdHlwZT0ibWF0cml4IiBpbj0ic2hhZG93Qmx1ck91dGVyMSI+PC9mZUNvbG9yTWF0cml4PgogICAgICAgIDwvZmlsdGVyPgogICAgPC9kZWZzPgogICAgPGcgaWQ9IuWbuuWumueKtuaAgS3liqDovb0iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00MjcuMDAwMDAwLCAtMjY3LjAwMDAwMCkiPgogICAgICAgIDxnIGlkPSJHcm91cC03IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MjkuMDAwMDAwLCAyNjkuMDAwMDAwKSI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0zMS41LDEyLjUgTDIxLjUsMS41IiBpZD0iTGluZS1Db3B5LTExIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMC41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZD0iTTIxLjUsMS41IEwyLjUsMS41IiBpZD0iTGluZS1Db3B5LTEyIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iMC41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD4KICAgICAgICAgICAgPGcgaWQ9Ik92YWwtNi1Db3B5LTYiPgogICAgICAgICAgICAgICAgPHVzZSBmaWxsPSJibGFjayIgZmlsbC1vcGFjaXR5PSIxIiBmaWx0ZXI9InVybCgjZmlsdGVyLTIpIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgICAgIDx1c2UgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJldmVub2RkIiB4bGluazpocmVmPSIjcGF0aC0xIj48L3VzZT4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+\");\n background-size: 28px 11.375px;\n -webkit-transform: translateZ(0);\n transform: translateZ(0);\n transform-origin: right center;\n -webkit-animation: ruler-point 0.3s ease 1.3s;\n animation: ruler-point 0.3s ease 1.3s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n}\n\n.widgets-rulers .ruler-label .ruler-label-name {\n position: absolute;\n height: 15.75px;\n font-size: 12px;\n line-height: 15.75px;\n right: 28px;\n bottom: 0.875px;\n white-space: nowrap;\n /* max-width: 0; */\n overflow: hidden;\n -webkit-animation: ruler-label 1s ease 1.6s;\n animation: ruler-label 1s ease 1.6s;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n text-shadow: 0 0 3.5px rgba(0, 0, 0, 0.6);\n}\n\n.widgets-rulers .ruler-label.reverse .ruler-label-point {\n -webkit-transform: rotateY(180deg);\n transform: rotateY(180deg);\n}\n\n.widgets-rulers .ruler-label.reverse .ruler-label-name {\n /* -webkit-transform: rotateY(-180deg); */\n /* transform: rotateY(-180deg); */\n right: auto;\n left: 28px;\n}\n\n.widgets-rulers .measure .ruler-label .ruler-label-name {\n color: #f0ff00;\n}\n\n.widgets-rulers .ruler-intersection {\n position: absolute;\n width: 0;\n height: 0;\n}\n\n.widgets-rulers .ruler-intersection .ruler-intersection-point {\n position: absolute;\n left: 0;\n bottom: 0;\n width: 18.375px;\n height: 7px;\n background-repeat: no-repeat;\n background-size: 18.375px 7px;\n background-position: 50%;\n}\n\n.widgets-rulers .ruler-intersection .ruler-intersection-text {\n position: absolute;\n left: 18.375px;\n bottom: 0;\n font-size: 12px;\n line-height: 12px;\n white-space: nowrap;\n color: #12fffb;\n text-shadow: 0 0 3.5px rgba(0, 0, 0, 0.3);\n -webkit-transform-origin: left center;\n transform-origin: left center;\n -webkit-transform: scale(0.85);\n transform: scale(0.85);\n}\n\n.measure .ruler-label .ruler-label-name {\n font-size: 14px;\n line-height: 14px;\n}\n\n.measure .ruler-label {\n position: absolute;\n}\n\n.measure .ruler-label .ruler-label-point {\n background-image: url(\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IuWbvuWxgl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgMzQgMTUiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDM0IDE1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6bm9uZTtzdHJva2U6I0YwRkYwMDtzdHJva2Utd2lkdGg6MC41O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDt9Cgkuc3Qxe2ZpbHRlcjp1cmwoI2ZpbHRlci0yKTt9Cgkuc3Qye2ZpbGw6I0YwRkYwMDt9Cjwvc3R5bGU+CjxmaWx0ZXIgIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgaGVpZ2h0PSIzMDAuMCUiIGlkPSJmaWx0ZXItMiIgd2lkdGg9IjMwMC4wJSIgeD0iLTEwMC4wJSIgeT0iLTEwMC4wJSI+Cgk8ZmVPZmZzZXQgIGR4PSIwIiBkeT0iMCIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd09mZnNldE91dGVyMSI+PC9mZU9mZnNldD4KCTxmZUdhdXNzaWFuQmx1ciAgaW49InNoYWRvd09mZnNldE91dGVyMSIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIxIiBzdGREZXZpYXRpb249IjEiPjwvZmVHYXVzc2lhbkJsdXI+Cgk8ZmVDb2xvck1hdHJpeCAgaW49InNoYWRvd0JsdXJPdXRlcjEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAgICAwIDAgMCAwIDAgIDAgMCAwIDAuMjk5MzY1OTQyIDAiPgoJCTwvZmVDb2xvck1hdHJpeD4KPC9maWx0ZXI+Cjx0aXRsZT5Hcm91cCA3PC90aXRsZT4KPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CjxwYXRoIGlkPSJMaW5lLUNvcHktMTEiIGNsYXNzPSJzdDAiIGQ9Ik0zMy41LDE0LjVsLTEwLTExIi8+CjxwYXRoIGlkPSJMaW5lLUNvcHktMTIiIGNsYXNzPSJzdDAiIGQ9Ik0yMy41LDMuNWgtMTkiLz4KPGcgaWQ9Ik92YWwtNi1Db3B5LTYiPgoJPGcgY2xhc3M9InN0MSI+CgkJPGNpcmNsZSBpZD0icGF0aC0xXzJfIiBjbGFzcz0ic3QyIiBjeD0iMy41IiBjeT0iMy41IiByPSIxLjUiLz4KCTwvZz4KCTxnPgoJCTxjaXJjbGUgaWQ9InBhdGgtMV8xXyIgY2xhc3M9InN0MiIgY3g9IjMuNSIgY3k9IjMuNSIgcj0iMS41Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==\");\n animation-delay: 0.3s;\n}\n\n.measure .ruler-label .ruler-label-name {\n animation-delay: 0.6s;\n}\n";
  63527. n$4(css,{});
  63528. /*
  63529. 测量线。
  63530. 线段是三维的、但长度文字是二维的。由于文字label显示在线段可见部分的中心,所以仍需要找到线段的二维端点。
  63531. */
  63532. var _color = '#f0ff00'; //"#fcf400"
  63533. var ball = new THREE.Mesh(new THREE.SphereBufferGeometry(0.01, 10, 10), new THREE.MeshBasicMaterial({
  63534. color: _color,
  63535. depthTest: false,
  63536. transparent: true
  63537. }));
  63538. var lineMat = LineDraw.createFatLineMat({
  63539. linewidth: 3,
  63540. color: _color
  63541. /*, alwaysShow: true*/
  63542. });
  63543. function MeasureRuler(o, player) {
  63544. var _this = this;
  63545. this.player = player; //this.sid = o.sid;
  63546. this.setPoints(o.points);
  63547. this.state = o.state || 'active';
  63548. this.visiblePanos = o.visiblePanos;
  63549. this.initVisiblePanos();
  63550. this.elem = document.createElement('div');
  63551. this.elem.className = 'ruler measure';
  63552. this.elem.setAttribute('data-name', '');
  63553. this.elem.style.display = 'none'; // $('<div class="ruler measure" style="display:none" data-name=""><div class="ruler-label"><div class="ruler-label-point"></div><span class="ruler-label-name">约0.5米</span></div></div>')
  63554. document.querySelector('.widgets-rulers').append(this.elem);
  63555. this.text = o.text || '';
  63556. this.length = Math.round(this.points[0].distanceTo(this.points[1]) * 100) / 100;
  63557. this.text = config$4.i18n('common.about') + this.length + config$4.i18n('common.meter');
  63558. this.elem.innerHTML = "\n\t\t<div class=\"ruler-label\">\n\t\t\t<div class=\"ruler-label-point\"></div>\n\t\t\t<span class=\"ruler-label-name\">".concat(this.text, "</span>\n\t\t</div>\n\t"); //this.build();
  63559. this.player.measureRulers.push(this);
  63560. var group = new THREE.Object3D();
  63561. group.name = 'measure';
  63562. this.balls = [ball.clone(), ball.clone()];
  63563. this.balls[0].position.copy(this.points[0]);
  63564. this.balls[1].position.copy(this.points[1]);
  63565. this.balls[0].renderOrder = this.balls[1].renderOrder = RenderOrder.measure; //在videoSkybox、videoOverlay之上
  63566. group.add(this.balls[0]);
  63567. group.add(this.balls[1]);
  63568. this.line = LineDraw.createFatLine([this.points[0], this.points[1]], {
  63569. material: lineMat
  63570. });
  63571. this.line.renderOrder = RenderOrder.measure;
  63572. group.add(this.line);
  63573. this.boldLine = LineDraw.createBoldLine(this.points, {
  63574. mat: new THREE.MeshBasicMaterial({
  63575. wireframe: true,
  63576. opacity: 0,
  63577. transparent: true,
  63578. depthTest: false,
  63579. color: '#991111'
  63580. }),
  63581. type: 'init'
  63582. }, this.player);
  63583. this.boldLine.parentRuler = this;
  63584. group.add(this.boldLine);
  63585. this.player.model.add(group);
  63586. this.group = group;
  63587. this.player.$app.config.vrFishTemp && (this.getPosAtSphere(this.player.currentPano.position), this.updateBoldLine());
  63588. {
  63589. var vrSplitScreen;
  63590. this.events = {
  63591. updatePano: function updatePano() {
  63592. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  63593. _this.updateVisible(e.targetPano);
  63594. if (_this.state == 'active') {
  63595. _this.updateBoldLine();
  63596. }
  63597. },
  63598. updateVR: function updateVR(e) {
  63599. var vrSplitScreen0 = settings$3.vrEnabled && settings$3.vrSplitScreen;
  63600. if (vrSplitScreen0 != vrSplitScreen) {
  63601. //vr 横屏要隐藏
  63602. if (vrSplitScreen0) {
  63603. _this.state = 'vrSplitScreen'; //console.log('横屏要隐藏')
  63604. _this.update();
  63605. } else {
  63606. //console.log('恢复')
  63607. _this.events.updatePano();
  63608. }
  63609. vrSplitScreen = vrSplitScreen0;
  63610. }
  63611. }
  63612. };
  63613. this.player.on('flying.ended', this.events.updatePano);
  63614. this.player.on('vrStateChanged', this.events.updateVR);
  63615. }
  63616. }
  63617. MeasureRuler.prototype.setPoints = function (p) {
  63618. this.points = p;
  63619. };
  63620. MeasureRuler.prototype.initVisiblePanos = function () {
  63621. var _this2 = this;
  63622. //设置一下可见的panos。 规则:1线所穿越的所有房间都可见。2如果可以的话,其他能透过门看到线的地方最好也可见。
  63623. var roomInfo = this.player.model.wallManager.roomInfo;
  63624. if (!roomInfo) return;
  63625. if (this.player.model.wallManager.version == 2) {
  63626. var A = this.points[0].clone().setY(0),
  63627. B = this.points[1].clone().setY(0); //为了防止点在地板以下或者屋顶以上,所以高度置0
  63628. var ray = new THREE.Raycaster(A.clone(), B.clone().sub(A).normalize(), 0, A.distanceTo(B));
  63629. var o = ray.intersectObjects(this.player.model.chunks); //因为新版没有房间(虽然有新的hole或柱子,但是太复杂了。所以就直接求这条线和模型的交点,所有看得到交点的位置都可见。
  63630. for (var i = 0; i < o.length; i++) {
  63631. var pos = o[i].point.clone();
  63632. var panos = convertTool.getVisiblePano(pos, this.player.model);
  63633. this.visiblePanos = this.visiblePanos.concat(panos.filter(function (pano) {
  63634. return _this2.visiblePanos.indexOf(pano) == -1;
  63635. }));
  63636. }
  63637. } else {
  63638. var p1 = new THREE.Vector2(this.points[0].x, this.points[0].z);
  63639. var p2 = new THREE.Vector2(this.points[1].x, this.points[1].z);
  63640. var p1p2 = [p1, p2];
  63641. /* for(let i=0;i<roomInfo.length;i++){
  63642. if(!point1Room && math.isPointInArea(roomInfo[i].points, p1)){
  63643. point1Room = i; console.log("端点房间 "+i)
  63644. }
  63645. if(!point2Room && math.isPointInArea(roomInfo[i].points, p2)){
  63646. point2Room = i; console.log("端点房间 "+i)
  63647. }
  63648. } */
  63649. for (var _i = 0; _i < roomInfo.length; _i++) {
  63650. //if(i == point1Room || i == point2Room)continue; //由于两个端点的可见panos是通过tag有无遮挡mesh求出来的, 所以会少一些该房间的点,但同时也会多一些其他房间透过门看到的点。所以需要tag求出的也需要将其所在房间点加入。
  63651. for (var j = 0, len = roomInfo[_i].points.length; j < len; j++) {
  63652. var p3p4 = [{
  63653. x: roomInfo[_i].points[j].x,
  63654. y: roomInfo[_i].points[j].y
  63655. }, {
  63656. x: roomInfo[_i].points[(j + 1) % len].x,
  63657. y: roomInfo[_i].points[(j + 1) % len].y
  63658. }];
  63659. if (math$1.isLineIntersect(p1p2, p3p4)) {
  63660. roomInfo[_i].panos.forEach(function (p) {
  63661. if (_this2.visiblePanos.indexOf(p) == -1) _this2.visiblePanos.push(p);
  63662. });
  63663. console.log('加入房间 ' + _i);
  63664. break;
  63665. }
  63666. }
  63667. }
  63668. }
  63669. };
  63670. MeasureRuler.prototype.remove = function () {
  63671. var index = this.player.measureRulers.indexOf(this);
  63672. this.player.measureRulers.splice(index, 1);
  63673. this.group.parent.remove(this.group);
  63674. this.elem.remove();
  63675. this.player.off('flying.ended', this.events.updatePano);
  63676. this.player.off('vrStateChanged', this.events.updateVR);
  63677. };
  63678. MeasureRuler.prototype.updateBoldLine = function () {
  63679. if (this.player.$app.config.vrFishTemp) {
  63680. LineDraw.updateBoldLine(this.boldLine, this.fishPoints, 'moveAndRotate');
  63681. } else {
  63682. LineDraw.updateBoldLine(this.boldLine, this.points, 'update');
  63683. }
  63684. };
  63685. MeasureRuler.prototype.showOptionLabel = function (show, pos) {
  63686. if (show) {
  63687. this.player.chosenMeasureRuler = this;
  63688. var pos = math$1.getFootPoint(pos, this.points[0], this.points[1]); //将点做垂线映射到线
  63689. this.optionLabelPos = pos; //三维位置
  63690. document.querySelector('.widgets-design-option').style.display = '';
  63691. this.updateOptionPos();
  63692. } else {
  63693. this.player.chosenMeasureRuler = null;
  63694. document.querySelector('.widgets-design-option').style.display = 'none';
  63695. this.optionLabelPos = null;
  63696. }
  63697. };
  63698. MeasureRuler.prototype.updateOptionPos = function () {
  63699. //更新optionLabel的位置
  63700. if (!this.optionLabelPos) return;
  63701. var pos2d = convertTool.getPos2d(this.optionLabelPos, this.player, this.player.camera);
  63702. var widgetsDesignOption = document.querySelector('.widgets-design-option');
  63703. var deleteRuler = document.querySelector('.widgets-design-option div');
  63704. if (pos2d.trueSide) {
  63705. deleteRuler.className.replace('hide', '');
  63706. deleteRuler.style.left = pos2d.pos.x + 'px';
  63707. deleteRuler.style.top = pos2d.pos.y + 'px';
  63708. if (pos2d.vector.x > 0) {
  63709. widgetsDesignOption.className.replace('right', '');
  63710. } else {
  63711. widgetsDesignOption.className.indexOf('right') < 0 && (widgetsDesignOption.className += ' right');
  63712. }
  63713. } else {
  63714. deleteRuler.className.indexOf('hide') < 0 && (deleteRuler.className += ' hide');
  63715. }
  63716. };
  63717. MeasureRuler.prototype.getCrossPoint = function (posIn, posOut) {
  63718. //求posOut在屏幕的可见端点,也就是从posOut到posIn的射线和屏幕边界的交点。 其中posIn只是另一个端点,并不是一定在屏幕内;而posOut是一定要在屏幕外,否则..没试过。
  63719. var W = this.player.domElement.clientWidth;
  63720. var H = this.player.domElement.clientHeight;
  63721. var x, y, border;
  63722. var r = (posOut.x - posIn.x) / (posOut.y - posIn.y); //根据相似三角形原理先求出这个比值
  63723. var getX = function getX(y) {
  63724. return r * (y - posIn.y) + posIn.x;
  63725. };
  63726. var getY = function getY(x) {
  63727. return 1 / r * (x - posIn.x) + posIn.y;
  63728. };
  63729. if (posOut.x > W || posOut.x < 0) {
  63730. //x超出的情况
  63731. if (posOut.x > W) border = W;else border = 0;
  63732. if (posOut.y < 0 || posOut.y > H) {
  63733. //y也超出
  63734. if (posOut.y < 0) y = 0;else y = H;
  63735. x = getX(y);
  63736. if (x > W || x < 0) {
  63737. x = border;
  63738. y = getY(x);
  63739. }
  63740. } else {
  63741. x = border;
  63742. y = getY(x);
  63743. }
  63744. } else {
  63745. //只有y超出,x没有超出
  63746. if (posOut.y < 0) y = 0;else y = H;
  63747. x = getX(y);
  63748. }
  63749. return new THREE.Vector2(x, y);
  63750. };
  63751. MeasureRuler.prototype.getPosInCrossPoint = function (p1, aim) {
  63752. //求aim在边界上的交点,其中aim在屏幕范围内,p1则不一定
  63753. var W = this.player.domElement.clientWidth;
  63754. var H = this.player.domElement.clientHeight;
  63755. return math$1.getCrossPointAtRect(p1, aim, W, H, 0, 0);
  63756. };
  63757. MeasureRuler.prototype.getPosAtSphere = function (toPos, useDistance) {
  63758. //fish
  63759. this.fishPoints = [];
  63760. var points = [];
  63761. this.points.forEach(function (p, index) {
  63762. var pos = convertTool.getPosAtSphere(p.clone(), toPos);
  63763. this.fishPoints.push(pos);
  63764. points.push(pos.x, pos.y, pos.z);
  63765. this.balls[index].position.copy(pos);
  63766. var s = Constants.skyRadius / toPos.distanceTo(p);
  63767. this.balls[index].scale.set(s, s, s);
  63768. }.bind(this));
  63769. LineDraw.moveFatLine(this.line, points);
  63770. };
  63771. var reTryCount = 1;
  63772. MeasureRuler.prototype.getPosInScreen = function (p1, p2, count) {
  63773. // p1 p2中一个是trueSide一个不是, 目的是得到两个trueSide
  63774. var center = p1.point.clone().add(p2.point).multiplyScalar(0.5); //二分法
  63775. var pos2d = convertTool.getPos2d(center, this.player);
  63776. if (pos2d.trueSide) {
  63777. var visi = p1.pos2d.trueSide ? p1.pos2d : p2.pos2d;
  63778. if (pos2d.inSight) {
  63779. pos2d.pos = this.getPosInCrossPoint(visi.pos, pos2d.pos);
  63780. pos2d.vector = null;
  63781. /* console.log("pos2d.inSight") */
  63782. } //要求它在边界上的点才行,否则范围被缩小
  63783. return {
  63784. result: 'p1p2',
  63785. p1: visi,
  63786. p2: pos2d
  63787. };
  63788. } else {
  63789. if (count + 1 > reTryCount) return; //最多重复次数
  63790. var trueSide = p1.pos2d.trueSide ? p1 : p2;
  63791. return this.getPosInScreen(trueSide, {
  63792. point: center,
  63793. pos2d: pos2d
  63794. }, ++count);
  63795. }
  63796. };
  63797. MeasureRuler.prototype.updateVisible = function (currentPano) {
  63798. if (this.visiblePanos.indexOf(currentPano || this.player.currentPano) > -1) {
  63799. this.state = 'active';
  63800. } else {
  63801. this.state = 'unable';
  63802. }
  63803. };
  63804. MeasureRuler.prototype.update = function () {
  63805. if (this.player.mode != 'panorama' || this.state != 'active') {
  63806. this.elem.style.display = 'none';
  63807. this.group.visible = false;
  63808. return;
  63809. } //似乎不能根据遮挡来取消显示,因为家具就是会遮住靠墙的尺子。所以只能根据编辑的可视点?
  63810. var p1 = convertTool.getPos2d(this.points[0], this.player);
  63811. var p2 = convertTool.getPos2d(this.points[1], this.player);
  63812. var centerX, centerY;
  63813. var W = this.player.domElement.clientWidth,
  63814. H = this.player.domElement.clientHeight;
  63815. if (!p1.trueSide || !p2.trueSide) {
  63816. //只要有一个是背面点,就不让线段可见。
  63817. if (!p1.trueSide && !p2.trueSide) {
  63818. //这种情况一般都是线段背离相机了,基本不用考虑
  63819. this.elem.style.display = 'none';
  63820. return;
  63821. }
  63822. var retry = this.getPosInScreen( //如果线太长了,在很多倾斜点的角度只有一个端点trueSide,那么去到线段中点找trueSide的点,化作新的端点。
  63823. {
  63824. point: this.points[0],
  63825. pos2d: p1
  63826. }, {
  63827. point: this.points[1],
  63828. pos2d: p2
  63829. }, 0);
  63830. if (!retry) {
  63831. this.elem.style.display = 'none';
  63832. return;
  63833. }
  63834. p1 = retry.p1;
  63835. p2 = retry.p2;
  63836. }
  63837. var pos1 = p1.pos,
  63838. pos2 = p2.pos;
  63839. var len = pos1.distanceTo(pos2);
  63840. if (len == 0) {
  63841. console.warn('ruler间距为0!');
  63842. return;
  63843. } //更新label箭头的中心位置
  63844. if (!p1.inSight || !p2.inSight) {
  63845. var pos1inSight, pos2inSight; //屏幕可见线段端点。
  63846. if (!p1.inSight) {
  63847. //在屏幕外的端点要求出在和屏幕边界的交点作为可见线段端点
  63848. pos1inSight = this.getCrossPoint(pos2, pos1);
  63849. } else {
  63850. pos1inSight = pos1.clone();
  63851. }
  63852. if (!p2.inSight) {
  63853. pos2inSight = this.getCrossPoint(pos1, pos2);
  63854. } else {
  63855. pos2inSight = pos2.clone();
  63856. }
  63857. var center = pos1inSight.clone().add(pos2inSight).multiplyScalar(0.5); //在屏幕上的可见中心点
  63858. centerX = center.x;
  63859. centerY = center.y;
  63860. if (center.x > W || center.x < 0 || center.y > H || center.y < 0) {
  63861. //可见中心不在屏幕范围内,那么这条线也一定不在范围内。(似乎是,想象的..因为是可见中心)
  63862. this.elem.style.display = 'none';
  63863. this.group.visible = false;
  63864. return;
  63865. } //ratio是center到div旋转中心(原始B点)的距离 和 线段长度 的比例
  63866. var ratio;
  63867. if (pos2.x == pos1.x) {
  63868. if (pos2.y == pos1.y) {
  63869. console.warn('pos1和2一样???');
  63870. return;
  63871. } else {
  63872. if (pos2.y < pos1.y) ratio = (centerY - pos2.y) / (pos1.y - pos2.y);else ratio = (pos2.y - centerY) / (pos2.y - pos1.y);
  63873. }
  63874. } else {
  63875. if (pos2.x < pos1.x) ratio = (centerX - pos2.x) / (pos1.x - pos2.x); //if B在右
  63876. else ratio = (pos2.x - centerX) / (pos2.x - pos1.x); //if B在左
  63877. }
  63878. if (ratio < 0 || ratio > 1) {
  63879. this.elem.style.display = 'none';
  63880. return;
  63881. } //如果ratio超出范围,说明可见中心脱离线段
  63882. } else {
  63883. centerX = (pos1.x + pos2.x) / 2;
  63884. centerY = (pos1.y + pos2.y) / 2;
  63885. } //更新label的方向是左侧还是右侧
  63886. this.elem.style.display = '';
  63887. this.group.visible = true;
  63888. var ruler = this.elem.querySelector('.ruler-label');
  63889. if (this.dir != 'left' && centerX < W / 2 || this.dir == 'right') {
  63890. if (ruler.className.indexOf('reverse') < 0) ruler.className += ' reverse';
  63891. } else {
  63892. if (ruler.className.indexOf('reverse') >= 0) ruler.className = ruler.className.replace('reverse', '');
  63893. }
  63894. ruler.style.left = centerX + 'px';
  63895. ruler.style.top = centerY + 'px';
  63896. };
  63897. function _createSuper$4(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$4(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  63898. function _isNativeReflectConstruct$4() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  63899. var getStyle = function getStyle(e, styleName) {
  63900. if (!e) {
  63901. return 0;
  63902. }
  63903. var styleValue = '';
  63904. if (document.defaultView && document.defaultView.getComputedStyle) {
  63905. styleValue = document.defaultView.getComputedStyle(e, '').getPropertyValue(styleName);
  63906. } else if (e.currentStyle) {
  63907. styleName = styleName.replace(/\-(\w)/g, function (strMatch, p1) {
  63908. return p1.toUpperCase();
  63909. });
  63910. styleValue = e.currentStyle[styleName];
  63911. }
  63912. return styleValue || 0;
  63913. };
  63914. var TagManager$1 = /*#__PURE__*/function (_Emiter) {
  63915. _inherits(TagManager, _Emiter);
  63916. var _super = _createSuper$4(TagManager);
  63917. function TagManager(app) {
  63918. var _this;
  63919. _classCallCheck(this, TagManager);
  63920. _this = _super.call(this);
  63921. _this.focusBeforeModify = function (sid) {
  63922. var player = _this.app.core.get('Player');
  63923. _this.editTag = _this.tags.find(function (t) {
  63924. return t.sid == sid;
  63925. });
  63926. var pano = _this.findBestPanoForWatching(_this.editTag);
  63927. player.flyToPano({
  63928. pano: pano,
  63929. lookAtPoint: _this.editTag.position,
  63930. aimDuration: 0,
  63931. duration: 1,
  63932. checkAlone: true
  63933. }, function () {
  63934. _this.edit.enter(_this.editTag, function () {
  63935. _this.editHandle.markTagPos = _this.editTag.position;
  63936. _this.editHandle.markSpotA.elem.style.display = 'block';
  63937. _this.editHandle.markSpotB.elem.style.display = 'block';
  63938. });
  63939. }); // this.app.Camera.flyToPoint(pano.position, {
  63940. // aimDur: 0, // 同点位镜头旋转时间
  63941. // dur: 1, // 点位跳转时间(不能为0)
  63942. // done: () => {
  63943. // this.edit.enter(() => {
  63944. // this.editHandle.markTagPos = this.editTag.position
  63945. // this.editHandle.markSpotA.elem.style.display = 'block'
  63946. // this.editHandle.markSpotB.elem.style.display = 'block'
  63947. // })
  63948. // },
  63949. // })
  63950. };
  63951. _this.focus = function (data, target, boardDirc) {
  63952. var player = _this.app.core.get('Player');
  63953. var center = new THREE.Vector3();
  63954. var tag = _this.tags.find(function (t) {
  63955. return t.sid == data.sid;
  63956. }) || data.tag;
  63957. var pano = _this.findBestPanoForWatching(tag);
  63958. var moveEvent = function moveEvent() {
  63959. if (player.mode === Viewmode$1.PANORAMA) {
  63960. _this.app.Camera.emit(PlayerEvents.Rotate, {
  63961. panoId: player.currentPano ? player.currentPano.id : null,
  63962. quaternion: player.cameraControls.activeControl.camera.quaternion,
  63963. mode: Viewmode$1.PANORAMA,
  63964. type: 'flyToPano'
  63965. });
  63966. }
  63967. };
  63968. var unprojectCenter = function unprojectCenter() {
  63969. // 因为tag里的xy在相机飞出飞入后数值会有问题,所以这边再计算一次
  63970. tag.x = _this.convertPositionTo2D(tag.position).pos.x;
  63971. tag.y = _this.convertPositionTo2D(tag.position).pos.y;
  63972. center.set(0, 0, 0); // 根据boardDirc向左或向上偏移
  63973. var centerX = tag.x - (boardDirc == 'left' ? data.arrowBox.width + data.tagBox.width / 2 : 0);
  63974. var centerY = tag.y - (boardDirc == 'top' ? data.arrowBox.height + data.tagBox.height / 2 : 0); // 2d坐标映射到3d
  63975. math$1.convertScreenPositionToNDC(centerX, centerY, center, _this.app.dom);
  63976. center.unproject(player.camera);
  63977. };
  63978. if (target == 'board') {
  63979. if (!_this.app.config.mobile) {
  63980. var $tag = document.querySelector("[tag-sid=\"".concat(tag.sid, "\"]"));
  63981. if ($tag) {
  63982. var $layer = $tag.querySelector('.move-layer');
  63983. if ($layer) {
  63984. $layer.style.transform = "translateY(0)";
  63985. setTimeout(function () {
  63986. var rect = $layer.getBoundingClientRect();
  63987. var calc = rect.top + rect.height;
  63988. if (calc > window.innerHeight) {
  63989. $layer.style.transform = "translateY(".concat(window.innerHeight - calc, "px)");
  63990. } else if (rect.height / 2 > tag.y) {
  63991. $layer.style.transform = "translateY(175px)";
  63992. }
  63993. }, 1500);
  63994. }
  63995. }
  63996. } // 面板中心
  63997. if (pano.id == player.currentPano.id && player.mode == 'panorama') {
  63998. unprojectCenter();
  63999. var cameraDirec = new THREE.Vector3(0, 0, 1).applyQuaternion(player.camera.quaternion).normalize();
  64000. var targetDirec = player.camera.position.clone().sub(tag.position).normalize();
  64001. var reverse = cameraDirec.dot(targetDirec);
  64002. if (reverse < 0) {
  64003. var distanceVec = player.camera.position.clone().sub(center).multiplyScalar(-1);
  64004. center = player.camera.position.clone().sub(distanceVec);
  64005. }
  64006. var tagX = tag.x; // this.app.Camera.flyToPoint(center, {
  64007. // done: () => {
  64008. // if (tagX > window.innerWidth / 4 && tagX < (window.innerWidth / 4) * 3) return
  64009. // unprojectCenter()
  64010. // this.app.Camera.flyToPoint(center, {
  64011. // aimDur: 400,
  64012. // })
  64013. // },
  64014. // })
  64015. player.flyToPano({
  64016. pano: pano,
  64017. lookAtPoint: center,
  64018. checkAlone: true,
  64019. isTagFlying: true
  64020. }, function () {
  64021. if (tagX > window.innerWidth / 4 && tagX < window.innerWidth / 4 * 3) {
  64022. moveEvent();
  64023. } else {
  64024. unprojectCenter();
  64025. player.flyToPano({
  64026. pano: pano,
  64027. aimDuration: 600,
  64028. lookAtPoint: center
  64029. }, function () {
  64030. moveEvent();
  64031. });
  64032. }
  64033. });
  64034. } else {
  64035. // this.app.Camera.flyToPoint(tag.position, {
  64036. // done: () =>
  64037. // setTimeout(() => {
  64038. // unprojectCenter()
  64039. // this.app.Camera.flyToPoint(center)
  64040. // }, 10),
  64041. // })
  64042. player.flyToPano({
  64043. pano: pano,
  64044. lookAtPoint: tag.position,
  64045. duration: 1000,
  64046. checkAlone: true,
  64047. isTagFlying: true
  64048. }, function () {
  64049. return setTimeout(function () {
  64050. unprojectCenter();
  64051. player.flyToPano({
  64052. pano: pano,
  64053. aimDuration: 600,
  64054. lookAtPoint: center
  64055. });
  64056. }, 10);
  64057. });
  64058. }
  64059. } else {
  64060. // 热点
  64061. player.flyToPano({
  64062. pano: pano,
  64063. lookAtPoint: tag.position,
  64064. // duration: 700,
  64065. checkAlone: true,
  64066. isTagFlying: true
  64067. });
  64068. }
  64069. };
  64070. _this.startMeasure = function () {
  64071. var player = _this.app.core.get('Player');
  64072. if (player.mode != 'panorama') {
  64073. _this.app.Camera.panorama().then(function () {
  64074. return _this.startMeasure();
  64075. });
  64076. return;
  64077. }
  64078. document.querySelector('.widgets-design-option').style.display = 'none';
  64079. _this.edit.enter();
  64080. player.measureRulers.forEach(function (r) {
  64081. r.state = 'unable';
  64082. });
  64083. player.chosenMeasureRuler && player.chosenMeasureRuler.showOptionLabel(false);
  64084. };
  64085. _this.confirmMeasure = function (step) {
  64086. var player = _this.app.core.get('Player');
  64087. var pano1;
  64088. if (step == 1) {
  64089. var position;
  64090. if (_this.isSingleView) {
  64091. position = _this.spot3d.position.clone();
  64092. _this.updateTagPos = true;
  64093. _this.spot3d.visible = false; // 移动端 没有mousemove的话就隐藏spot3d
  64094. } else {
  64095. position = _this.editHandle.confirmPos().position;
  64096. _this.editHandle.enter(); //清除点击状态,取消看向第一个tag
  64097. player.locked = false; //可以移动
  64098. // this.editHandle.splitView.enter()
  64099. }
  64100. _this.lastPosition = position;
  64101. _this.measureStep = 1;
  64102. var groundPoint = position.clone().setY(player.model.currentFloor.boundingBox.min.y); //垂线和地面交点
  64103. /* let intersect = convertTool.ifIntersectChunks(position, groundPoint, player.model, {InfinityLen:true})
  64104. if(intersect){//修正
  64105. groundPoint.copy(intersect[0].point)//不一定在地面上
  64106. } */
  64107. //修正
  64108. var sorts = common.sortByScore(player.model.panos.list, [Panorama.filters.isPanoAligned()], [Panorama.scoreFunctions.distanceSquared(_this.currentPano, -0.6)]);
  64109. if (sorts[0]) {
  64110. groundPoint.setY(sorts[0].item.floorPosition.y);
  64111. }
  64112. var stemLine = LineDraw.createLine([position, groundPoint], {
  64113. width: 2,
  64114. color: '#09e1c0'
  64115. });
  64116. player.model.add(stemLine);
  64117. var shadow = new THREE.Mesh(new THREE.CircleGeometry(0.08, 32), new THREE.MeshBasicMaterial({
  64118. color: 0xffffff,
  64119. transparent: true,
  64120. opacity: 0.6,
  64121. depthTest: false
  64122. }));
  64123. shadow.position.copy(groundPoint);
  64124. shadow.position.y += 0.002; // 防止和地面重叠
  64125. shadow.lookAt(groundPoint.clone().add(new THREE.Vector3(0, 1, 0)));
  64126. player.model.add(shadow);
  64127. pano1 = player.currentPano;
  64128. var measureTag = document.createElement('div');
  64129. measureTag.className = 'visible';
  64130. measureTag.id = 'measureTag';
  64131. measureTag.innerHTML = "<span class=\"point zoom\" style=\"background-image: url(".concat(texture.getImageURL('images/tag_icon_default.svg'), ");\"></span>");
  64132. var pos2d = _this.convertPositionTo2D(position).pos;
  64133. measureTag.style.left = pos2d.x + 'px';
  64134. measureTag.style.top = pos2d.y + 'px';
  64135. measureTag.style.setProperty('display', 'block', 'important');
  64136. document.querySelector('div[xui_tags]').appendChild(measureTag);
  64137. _this.measurePointTemp = {
  64138. measureTag,
  64139. stemLine,
  64140. shadow
  64141. };
  64142. } else if (step == 2) {
  64143. //完成测距 得到尺子 退出编辑
  64144. var _position;
  64145. if (_this.isSingleView) {
  64146. _position = _this.spot3d.position.clone();
  64147. } else {
  64148. _position = _this.editHandle.confirmPos().position;
  64149. } //visiblePanos为两个端点的visiblePanos的并集
  64150. var length = _position.distanceTo(_this.lastPosition);
  64151. var maxDis = Math.max(5, length * 6); //可见距离
  64152. var tolerance = 0.3;
  64153. var visiblePanos1 = _this.getVisiblePano(_this.lastPosition, maxDis, tolerance);
  64154. var visiblePanos2 = _this.getVisiblePano(_position, maxDis, tolerance);
  64155. var visiblePanos = common.getUnionSet(visiblePanos1, visiblePanos2);
  64156. if (visiblePanos.length == 0) {
  64157. //add on 2023.11.7
  64158. tolerance = 1;
  64159. visiblePanos1 = _this.getVisiblePano(_this.lastPosition, maxDis, tolerance);
  64160. visiblePanos2 = _this.getVisiblePano(_position, maxDis, tolerance);
  64161. visiblePanos = common.getUnionSet(visiblePanos1, visiblePanos2);
  64162. }
  64163. var ruler = new MeasureRuler({
  64164. points: [_this.lastPosition, _position],
  64165. visiblePanos,
  64166. state: 'active'
  64167. }, player);
  64168. player.chosenMeasureRuler = ruler; //将当前点加入visiblePanos
  64169. if (!ruler.visiblePanos.includes(player.currentPano)) {
  64170. ruler.visiblePanos.push(player.currentPano);
  64171. }
  64172. if (!ruler.visiblePanos.includes(pano1)) {
  64173. ruler.visiblePanos.push(pano1);
  64174. }
  64175. player.measureRulers.forEach(function (r) {
  64176. r.updateVisible();
  64177. if (r.state == 'active') {
  64178. r.updateBoldLine();
  64179. }
  64180. r.update();
  64181. });
  64182. }
  64183. };
  64184. _this.cancelMeasure = function () {
  64185. var player = _this.app.core.get('Player');
  64186. if (_this.measurePointTemp) {
  64187. var _this$measurePointTem = _this.measurePointTemp,
  64188. measureTag = _this$measurePointTem.measureTag,
  64189. stemLine = _this$measurePointTem.stemLine,
  64190. shadow = _this$measurePointTem.shadow;
  64191. document.querySelector('div[xui_tags]').removeChild(measureTag);
  64192. stemLine.geometry.dispose();
  64193. stemLine.material.dispose();
  64194. player.model.remove(stemLine);
  64195. shadow.geometry.dispose();
  64196. shadow.material.dispose();
  64197. player.model.remove(shadow);
  64198. _this.measurePointTemp = null;
  64199. }
  64200. player.measureRulers.forEach(function (r) {
  64201. r.updateVisible();
  64202. if (r.state == 'active') {
  64203. r.updateBoldLine();
  64204. }
  64205. });
  64206. _this.edit.exit();
  64207. };
  64208. _this.app = app;
  64209. _this.root = '[xui_tags_view]';
  64210. _this.view = Deferred$1();
  64211. _this.editor = Deferred$1();
  64212. _this.plugin = Deferred$1();
  64213. _this.loaded = false;
  64214. _this.editTag = null;
  64215. _this.tags = [];
  64216. _this.labels = [];
  64217. _this.showTags = true;
  64218. _this.showTagsVisible = false;
  64219. _this.app.store.on('tags', function (tags) {
  64220. _this.tags = tags.tags || []; // 由于热点新增了floorIndex属性,需要兼容旧数据
  64221. var player = app.core.get('Player');
  64222. var rayDir = new THREE.Vector3(0, -1, 0);
  64223. var ray = new THREE.Raycaster(new THREE.Vector3(0, 0, 0), rayDir, 0.001, 9999);
  64224. _this.tags.forEach(function (tag) {
  64225. if (tag.floorIndex == void 0) {
  64226. // 旧数据没有floorIndex
  64227. // 从热点位置向下投一条射线,检测到的第一个模型即为所在楼层
  64228. ray.set(tag.position, rayDir);
  64229. var rayInfo = ray.intersectObjects(player.model.chunks);
  64230. if (!rayInfo.length) {
  64231. // 如果射线检测不到模型,则根据floor的boundingBox判断
  64232. var tagFloor = player.model.floors.list.find(function (floor) {
  64233. return tag.position.y >= floor.boundingBox.min.y && tag.position.y <= floor.boundingBox.max.y;
  64234. });
  64235. tag.floorIndex = tagFloor && tagFloor.floorIndex;
  64236. } else {
  64237. tag.floorIndex = rayInfo[0].object.parent.floorIndex;
  64238. }
  64239. }
  64240. });
  64241. _this.view.then(function (view) {
  64242. return view.render();
  64243. });
  64244. _this.loaded = true;
  64245. _this.emit('loaded', _this.tags);
  64246. });
  64247. _this.edit = {};
  64248. _this.edit.enter = function (editTag, callback) {
  64249. _this.tagPosChosing = true;
  64250. if (_this.isSingleView) {
  64251. _this.hideAll();
  64252. var player = app.core.get('Player');
  64253. player.locked = true;
  64254. player.reticule.visible = false;
  64255. _this.spot3d.visible = true;
  64256. if (editTag) {
  64257. // 修改
  64258. _this.updateTagPos = false;
  64259. _this.spot3d.position.set(editTag.position.x, editTag.position.y, editTag.position.z);
  64260. setTimeout(function () {
  64261. var tagScreenPos = new THREE.Vector3(0, 0, 0);
  64262. var tagNDCPos = new THREE.Vector3(0, 0, 0.5);
  64263. math$1.projectPositionToCanvas(editTag.position, player.camera, tagScreenPos, player.domElement);
  64264. math$1.convertScreenPositionToNDC(tagScreenPos.x, tagScreenPos.y, tagNDCPos, player.domElement);
  64265. var intersect = player.getMouseIntersect(tagNDCPos, player.OverlayManager.group.children.concat(player.model.colliders));
  64266. intersect && (_this.spot3d.lookAt(intersect.normal.add(_this.spot3d.position)), _this.spot3d.topMesh.lookAt(player.camera.position));
  64267. }, 10);
  64268. } else {
  64269. // 新增
  64270. _this.updateTagPos = true;
  64271. _this.spot3d.position.set(0, 1000, 0);
  64272. }
  64273. } else {
  64274. app.core.get('Scene').getSplit('TAG').then(function (view) {
  64275. if (_this.editHandle == void 0) {
  64276. _this.editHandle = app.withNewComponent('TagEditManager', view, {
  64277. spotA: app.dom.querySelector('.player[name="main"] .player-mark'),
  64278. spotB: app.dom.querySelector('.player[name="copy"] .player-mark')
  64279. });
  64280. }
  64281. if (editTag) {
  64282. // 修改
  64283. _this.editHandle.reSetPos(editTag.position);
  64284. } else {
  64285. // 新增
  64286. _this.editHandle.enter();
  64287. }
  64288. callback && callback();
  64289. });
  64290. }
  64291. };
  64292. _this.edit.exit = function () {
  64293. var player = _this.app.core.get('Player');
  64294. player.cameraControls.activeControl.enabled = true; //在没有触发mousedown方法时触发了exit方法可能会导致视角锁死,所以在这里补上
  64295. if (_this.isSingleView) {
  64296. player.domElement.style.cursor = 'default';
  64297. player.locked = false;
  64298. player.reticule.visible = true;
  64299. _this.spot3d.visible = false;
  64300. _this.updateTagPos = false;
  64301. } else {
  64302. if (!_this.editHandle) {
  64303. return;
  64304. }
  64305. app.core.get('Scene').restore('TAG');
  64306. _this.editHandle.exit({
  64307. cancel: true
  64308. });
  64309. }
  64310. _this.editTag = null;
  64311. _this.tagPosChosing = false;
  64312. setTimeout(function () {
  64313. player.cameraControls.activeControl.camera.fov = 70;
  64314. player.camera.fov = player.baseFov * (1 / player.zoomLevel);
  64315. }, 50);
  64316. };
  64317. var findTagFloorRay = new THREE.Raycaster(new THREE.Vector3(), new THREE.Vector3(), 0.001, 9999);
  64318. _this.edit.confirm = function (onlyExitWithPosition) {
  64319. var player = _this.app.core.get('Player');
  64320. var tag = _this.editTag;
  64321. if (_this.isSingleView) {
  64322. if (!tag) return;
  64323. _this.showAll(); // if (!this.spot3d.visible) {
  64324. // this.edit.exit()
  64325. // return null
  64326. // }
  64327. _this.spot3d.visible = true; //当鼠标将spot3d移动到不可见位置时触发confirm方法将spot3d恢复可见(position貌似是最后的有效position所以暂时不做修改)
  64328. tag.position = _this.spot3d.topMesh.getWorldPosition(new THREE.Vector3()); // this.spot3d.position.clone()
  64329. if (!tag.visiblePanos) {
  64330. tag.visiblePanos = _this.getVisiblePano(tag.position);
  64331. if (tag.visiblePanos.length == 0) {
  64332. var panoId = player.currentPano.id;
  64333. tag.visiblePanos.push(player.model.panos.index[panoId]);
  64334. }
  64335. }
  64336. } else {
  64337. if (!_this.editHandle) {
  64338. return;
  64339. }
  64340. var _this$editHandle$conf = _this.editHandle.confirmPos(),
  64341. position = _this$editHandle$conf.position,
  64342. sid = _this$editHandle$conf.sid,
  64343. _panoId = _this$editHandle$conf.panoId;
  64344. if (!position) {
  64345. onlyExitWithPosition || _this.edit.exit(); // 未选定位置时不用退出
  64346. return null;
  64347. }
  64348. var visiblePanos = _this.getVisiblePano(position);
  64349. if (visiblePanos.length == 0) {
  64350. visiblePanos.push(player.model.panos.index[_panoId]);
  64351. } // let flag = false
  64352. // for (let i = 0; i < visiblePanos.length; ++i) {
  64353. // if (visiblePanos[i].id == panoId) {
  64354. // flag = true
  64355. // break
  64356. // }
  64357. // }
  64358. // if (!flag) {
  64359. // const player = this.app.core.get('Player')
  64360. // visiblePanos.push(player.model.panos.index[panoId])
  64361. // }
  64362. if (tag == null) {
  64363. tag = {
  64364. position,
  64365. visiblePanos,
  64366. sid,
  64367. panoId: _panoId,
  64368. icon: app.resource.base('images/tag_icon_default.svg')
  64369. };
  64370. } else {
  64371. tag.position = position;
  64372. tag.visiblePanos = visiblePanos;
  64373. }
  64374. } // 在确认坐标后,计算热点所在楼层
  64375. var camera = player.cameraControls.activeControl.camera; // 从相机向热点发出一条射线
  64376. var rayDirec = new THREE.Vector3().subVectors(tag.position, camera.position).normalize();
  64377. findTagFloorRay.set(camera.position, rayDirec);
  64378. var rayInfo = findTagFloorRay.intersectObjects(player.model.chunks);
  64379. if (rayInfo.length) {
  64380. tag.floorIndex = rayInfo[0].object.parent.floorIndex;
  64381. } else {
  64382. // 如果没有检测到chunk,大概率是在skybox上,这时直接取currentPano所在楼层就行
  64383. tag.floorIndex = player.currentPano.floorIndex;
  64384. }
  64385. _this.edit.exit();
  64386. return tag;
  64387. };
  64388. _this.edit.editTag = function () {
  64389. _this.tagInfoEditing = true;
  64390. };
  64391. _this.edit.cancelTagEdit = function () {
  64392. _this.tagInfoEditing = false;
  64393. }; // -------------------------------------------------
  64394. // 设置热点可视相关方法
  64395. // -------------------------------------------------
  64396. _this.edit.beginTagVisiSetting = function () {
  64397. _this.showTagsVisible = true;
  64398. var player = _this.app.core.get('Player');
  64399. if (player && player.linkEditor) {
  64400. player.linkEditor.enterSet('tagVisible');
  64401. player.linkEditor.beginSetTagVisible();
  64402. }
  64403. player.model.floorplanCadImg.hideCadPlane();
  64404. player.emit('beginTagVisiSetting');
  64405. };
  64406. _this.edit.setTagVisi = function (sid) {
  64407. var tag = _this.tags.find(function (t) {
  64408. return t.sid == sid;
  64409. });
  64410. _this.app.core.get('Player').linkEditor.SetOneTagVisible(tag);
  64411. };
  64412. _this.edit.resetTagVisi = function () {
  64413. var linkEditor = _this.app.core.get('Player').linkEditor;
  64414. var tag = linkEditor.tagVsetting;
  64415. linkEditor.tagVsetting = null;
  64416. linkEditor.SetOneTagVisible(tag);
  64417. };
  64418. _this.edit.checkNeedSaveTagVisi = function () {
  64419. var linkEditor = _this.app.core.get('Player').linkEditor;
  64420. return linkEditor.checkTagVisiChange();
  64421. };
  64422. _this.edit.saveTagVisi = function () {
  64423. var player = _this.app.core.get('Player');
  64424. var data = player.linkEditor.saveTagVisibles();
  64425. var storeTags = _this.app.store.getValue('tags');
  64426. data.forEach(function (tagData) {
  64427. var tag = _this.tags.find(function (tag) {
  64428. return tag.sid == tagData.sid;
  64429. });
  64430. tag.visiblePanos = tagData.value.map(function (id) {
  64431. return player.model.panos.index[id];
  64432. });
  64433. });
  64434. storeTags.tags = _this.tags;
  64435. _this.app.store.set('tags', storeTags);
  64436. return {
  64437. data,
  64438. func: player.linkEditor.afterSaveTagVisibles.bind(player.linkEditor)
  64439. };
  64440. };
  64441. _this.edit.cancelTagVisiSetting = function () {
  64442. var player = _this.app.core.get('Player');
  64443. _this.showTagsVisible = false;
  64444. _this.app.core.get('Player').linkEditor.finishSetTagVisible();
  64445. _this.app.core.get('Player').model.floorplanCadImg.showCadPlane();
  64446. player.emit('exitTagVisiSetting');
  64447. };
  64448. _this.edit.hideAllTagVisi = function () {
  64449. var linkEditor = _this.app.core.get('Player').linkEditor;
  64450. var currentTag = linkEditor.tagVsetting;
  64451. linkEditor.setTagHideAll(currentTag);
  64452. };
  64453. _this.edit.showAllTagVisi = function () {
  64454. var linkEditor = _this.app.core.get('Player').linkEditor;
  64455. var currentTag = linkEditor.tagVsetting;
  64456. linkEditor.setTagShowAll(currentTag);
  64457. }; // -------------------------------------------------
  64458. _this.app.Scene.on('loaded', function () {
  64459. var player = app.core.get('Player');
  64460. var rulersDiv = document.createElement('div');
  64461. rulersDiv.className = 'widgets-rulers';
  64462. player.domElement.append(rulersDiv); // 用于测量
  64463. var deleteRuler = document.querySelector('.widgets-design-option div');
  64464. deleteRuler && deleteRuler.addEventListener('pointerup', function (e) {
  64465. //删除测量线
  64466. e.stopPropagation();
  64467. player.chosenMeasureRuler.remove();
  64468. player.chosenMeasureRuler.showOptionLabel(false);
  64469. }); // 判断,激光场景在单屏内添加热点
  64470. var metadata = _this.app.store.getValue('metadata');
  64471. if (metadata) _this.isSingleView = metadata.sceneFrom == 'laser';else _this.app.store.on('metadata', function (data) {
  64472. return _this.isSingleView = data.sceneFrom == 'laser';
  64473. });
  64474. if (_this.isSingleView) {
  64475. // spot3d,用于单屏
  64476. _this.spot3d = new TagSpot(player);
  64477. } // 热点在哪些模式下显示
  64478. var showIn = _this.app.config.tag.showIn;
  64479. var e = {};
  64480. app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function () {
  64481. // if (!this.tags || !this.tags.length || !e.hasChanged.cameraChanged2) return
  64482. // 更新测量tag
  64483. if (_this.measurePointTemp) {
  64484. var pos = _this.convertPositionTo2D(_this.lastPosition);
  64485. var measureTag = _this.measurePointTemp.measureTag;
  64486. measureTag.style.left = pos.pos.x + 'px';
  64487. measureTag.style.top = pos.pos.y + 'px';
  64488. measureTag.className = !pos.trueSide || !pos.inSight ? '' : 'visible';
  64489. }
  64490. if (_this.labels.length) {
  64491. // 显示标签
  64492. _this.labels.forEach(function (item) {
  64493. if (player.mode != Viewmode$1.PANORAMA || item.visiblePanos && !item.visiblePanos.includes(player.currentPano)) {
  64494. return item.visible = false;
  64495. } // 只所在楼层可视热点
  64496. if (item.floorIndex != player.model.currentFloor.floorIndex) {
  64497. return item.visible = false;
  64498. }
  64499. var pos = app.TagManager.convertPositionTo2D(item.position);
  64500. if (!pos.trueSide || !pos.inSight) {
  64501. //trueSide是否在背面
  64502. //inSight是否在当前屏幕可视区域
  64503. return item.visible = false;
  64504. }
  64505. item.x = pos.pos.x;
  64506. item.y = pos.pos.y;
  64507. item.visible = true;
  64508. });
  64509. }
  64510. if (!_this.tags || !_this.tags.length) return;
  64511. var setVisi = function setVisi(item, v) {
  64512. if (item.visible == v) return;
  64513. item.visible = v; //console.log(item.sid, v)
  64514. };
  64515. _this.tags.forEach(function (item) {
  64516. //isLose表示失效,重算的时候需要
  64517. //showTags表示是否全部可见
  64518. if (item.isLose || _this.showTags === false) {
  64519. return setVisi(item, false);
  64520. } //没有进入热点可视设置(大部分情况)
  64521. if (_this.showTagsVisible == false) {
  64522. if (showIn) {
  64523. if (showIn === 'all') {
  64524. if (_this.editTag || player.paintEditor && player.paintEditor.painting || player.mode == Viewmode$1.PANORAMA && !item.visiblePanos.includes(player.currentPano)) {
  64525. return setVisi(item, false);
  64526. }
  64527. } else if (showIn.indexOf(player.mode) == -1) {
  64528. return setVisi(item, false);
  64529. }
  64530. }
  64531. if (settings$3.vrEnabled && settings$3.vrSplitScreen) {
  64532. return setVisi(item, false);
  64533. } // 默认情况
  64534. if (!showIn || showIn != 'all' && showIn.indexOf(Viewmode$1.PANORAMA) != -1 && player.mode == Viewmode$1.PANORAMA) {
  64535. if (_this.editTag || player.mode != Viewmode$1.PANORAMA || item.visiblePanos && !item.visiblePanos.includes(player.currentPano) || player.paintEditor && player.paintEditor.painting) {
  64536. return setVisi(item, false);
  64537. }
  64538. }
  64539. } //热点可视设置
  64540. if (player.linkEditor.setTagVisible) {
  64541. // 只所在楼层可视热点
  64542. if (item.floorIndex != player.model.currentFloor.floorIndex) {
  64543. if (player.linkEditor.tagVsetting != item) {
  64544. //tagVsetting的要一直显示
  64545. return setVisi(item, false);
  64546. }
  64547. }
  64548. /* if (!item.visiblePanos.some(p => p.floorIndex == player.model.currentFloor.floorIndex)) {
  64549. return (item.visible = false)
  64550. } */
  64551. }
  64552. var pos = app.TagManager.convertPositionTo2D(item.position);
  64553. if (!pos.trueSide || !pos.inSight) {
  64554. //trueSide是否在背面
  64555. //inSight是否在当前屏幕可视区域
  64556. //console.log(item.sid, false)
  64557. return setVisi(item, false);
  64558. }
  64559. /* if (item.visible && this.app.config.mobile) {
  64560. //若原本是非visible,必须重算一下位置,即使lastFrameChanged为false,所以直接更新
  64561. item.__x = pos.pos.x
  64562. item.__y = pos.pos.y
  64563. waitForUpdate2d.push(item)
  64564. } else { */
  64565. item.x = pos.pos.x;
  64566. item.y = pos.pos.y;
  64567. setVisi(item, true); //}
  64568. }); //控制在画面中的热点,每帧更新的个数
  64569. /* if (this.app.config.mobile) {
  64570. //手机端分批update。因手机端本身热点容易闪烁,可以这么做,但电脑几乎不闪烁,分批就闪烁太明显了
  64571. if (window.pauseTag) return
  64572. let list,
  64573. tagsWaitUpdate = [],
  64574. standardUpdate = player.lastFrameChanged || !lastUpdateTags
  64575. if (standardUpdate) {
  64576. list = waitForUpdate2d
  64577. unUpdate = null
  64578. } else {
  64579. if (!unUpdate) {
  64580. unUpdate = common.getDifferenceSet(waitForUpdate2d, lastUpdateTags)
  64581. unUpdate = unUpdate.filter(e => e.visible) //如飞出后最后一次更新之后,都隐藏了,隐藏的就不用更新了
  64582. }
  64583. list = unUpdate
  64584. }
  64585. if (list.length) {
  64586. let tagsWaitUpdate = [],
  64587. stopWhenAllUsed = !player.lastFrameChanged
  64588. let min = 3,
  64589. max = Math.max(20, Math.round(waitForUpdate2d.length / 2))
  64590. let result = common.batchHandling.getSlice('tagsGetPos2d', list, { stopWhenAllUsed, min, max, durBound1: 3, durBound2: 16 }) //iphonex稳定后大概在7-10。
  64591. tagsWaitUpdate = result.list
  64592. //console.log(tagsWaitUpdate.map(e=>e.sid))
  64593. tagsWaitUpdate.forEach(item => {
  64594. item.x = item.__x
  64595. item.y = item.__y
  64596. item.visible = true
  64597. })
  64598. if (!standardUpdate) {
  64599. //相机停止变化后只更新还未更新的
  64600. unUpdate = common.getDifferenceSet(unUpdate, tagsWaitUpdate)
  64601. }
  64602. lastUpdateTags = tagsWaitUpdate
  64603. }
  64604. }*/
  64605. e.lastFrameChanged = player.lastFrameChanged;
  64606. _this.emit('update', e);
  64607. });
  64608. if (_this.isSingleView) {
  64609. /**
  64610. * 单屏下spot3d的一些事件
  64611. */
  64612. var intersectSpot3d;
  64613. var lookAt = new THREE.Vector3();
  64614. player.on('pointerStart', function (e) {
  64615. if (!_this.editTag) return; // 移动端 pointerStart时先计算一次intersectSpot3d
  64616. intersectSpot3d = player.getMouseIntersect(null, [_this.spot3d.topMesh, _this.spot3d.bottomMesh]);
  64617. if (intersectSpot3d) {
  64618. _this.updateTagPos = true;
  64619. player.cameraControls.activeControl.enabled = false;
  64620. }
  64621. });
  64622. player.on('pointerMove', function (e) {
  64623. if (!_this.editTag && !_this.updateTagPos) return; // 检测鼠标是否在spot3d上
  64624. intersectSpot3d = player.getMouseIntersect(null, [_this.spot3d.topMesh, _this.spot3d.bottomMesh]);
  64625. if (intersectSpot3d) {
  64626. player.domElement.style.cursor = 'move';
  64627. } else if (_this.editTag && !_this.updateTagPos) {
  64628. player.domElement.style.cursor = 'default';
  64629. }
  64630. if (_this.updateTagPos) {
  64631. // 拖动spot3d
  64632. var intersect = player.getMouseIntersect(null, player.OverlayManager.group.children.concat(player.model.colliders));
  64633. if (intersect) {
  64634. _this.spot3d.visible = true;
  64635. _this.spot3d.position.copy(intersect.point);
  64636. _this.spot3d.lookAt(lookAt.addVectors(intersect.point, intersect.normal));
  64637. _this.spot3d.topMesh.lookAt(player.camera.position);
  64638. var s = math$1.getScaleForConstantSize({
  64639. width2d: 500,
  64640. position: _this.spot3d.position,
  64641. camera: player.camera,
  64642. dom: player.$app.dom
  64643. });
  64644. _this.spot3d.topMesh.scale.set(s, s, s);
  64645. } else {
  64646. _this.spot3d.visible = false;
  64647. }
  64648. }
  64649. });
  64650. player.on('pointerUp', function (e) {
  64651. if (_this.spot3d && _this.updateTagPos) {
  64652. // 移动端 pointerUp时最后再计算一次spot3d坐标
  64653. var intersect = player.getMouseIntersect(null, player.OverlayManager.group.children.concat(player.model.colliders));
  64654. if (intersect) {
  64655. _this.spot3d.visible = true;
  64656. _this.spot3d.position.copy(intersect.point);
  64657. _this.spot3d.lookAt(lookAt.addVectors(intersect.point, intersect.normal));
  64658. _this.spot3d.topMesh.lookAt(player.camera.position);
  64659. var s = math$1.getScaleForConstantSize({
  64660. width2d: 500,
  64661. position: _this.spot3d.position,
  64662. camera: player.camera,
  64663. dom: player.$app.dom
  64664. });
  64665. _this.spot3d.topMesh.scale.set(s, s, s);
  64666. } else {
  64667. return;
  64668. }
  64669. player.cameraControls.activeControl.enabled = true;
  64670. player.cameraControls.activeControl.pointerDragOn = false;
  64671. _this.updateTagPos = false;
  64672. if (_this.editTag) {
  64673. // 修改位置
  64674. _this.editTag.position = _this.spot3d.position;
  64675. } else {
  64676. // 新增
  64677. _this.editTag = {
  64678. position: _this.spot3d.position,
  64679. sid: common.getRandomSid(),
  64680. icon: _this.app.resource.base('images/tag_icon_default.svg')
  64681. };
  64682. }
  64683. _this.emit('tagManager.markTagPos');
  64684. }
  64685. });
  64686. }
  64687. });
  64688. return _this;
  64689. }
  64690. _createClass(TagManager, [{
  64691. key: "tag",
  64692. value: function tag() {
  64693. if (this.ready) {
  64694. return Promise.resolve(this);
  64695. }
  64696. return this.plugin.promise();
  64697. }
  64698. }, {
  64699. key: "load",
  64700. value: function load(tags) {
  64701. var _this2 = this;
  64702. if (!this.app.Scene.loaded) {
  64703. return setTimeout(function () {
  64704. _this2.load(tags);
  64705. }, 100);
  64706. }
  64707. if (!tags) {
  64708. return;
  64709. }
  64710. tags.forEach(function (tag) {
  64711. if (tag.position && tag.position instanceof THREE.Vector3 == false) {
  64712. tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z);
  64713. if (tag.visiblePanos && tag.visiblePanos.length) {
  64714. tag.visiblePanos = tag.visiblePanos.map(function (id) {
  64715. return _this2.app.core.get('Player').model.panos.index[id];
  64716. });
  64717. } else {
  64718. tag.visiblePanos = _this2.getVisiblePano(tag.position);
  64719. }
  64720. }
  64721. });
  64722. this.tags = tags;
  64723. }
  64724. }, {
  64725. key: "install",
  64726. value: function install(name, plugin) {
  64727. this.ready = true;
  64728. this.plugin.resolve(this);
  64729. if (this[name]) {
  64730. this[name].resolve(plugin);
  64731. if (this.loaded && typeof plugin.render === 'function') {
  64732. plugin.render();
  64733. }
  64734. }
  64735. }
  64736. /**
  64737. * 3d坐标转2d屏幕坐标
  64738. * @param {Object} position3d {x,y,z}
  64739. * @returns {Object} {x,y}
  64740. */
  64741. }, {
  64742. key: "convertPositionTo2D",
  64743. value: function convertPositionTo2D(position3d) {
  64744. return convertTool.getPos2d(position3d, this.app.core.get('Player'));
  64745. }
  64746. }, {
  64747. key: "ifShelter",
  64748. value: function ifShelter(position3d, pos2d) {
  64749. var player = this.app.core.get('Player');
  64750. var floorIndex = player.model.allFloorsVisible ? null : player.model.currentFloor.floorIndex;
  64751. return convertTool.ifShelter(position3d, player, pos2d, null, floorIndex);
  64752. }
  64753. }, {
  64754. key: "getVisiblePano",
  64755. value: function getVisiblePano(position) {
  64756. var maxDis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;
  64757. var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15;
  64758. var visiblePanos = convertTool.getVisiblePano(position, this.app.core.get('Player').model, {
  64759. maxDis,
  64760. tolerance
  64761. }); //maxDis如果能自适应场景更好,有的大马路pano间距较远
  64762. return visiblePanos;
  64763. }
  64764. }, {
  64765. key: "add",
  64766. value: function add(tags) {
  64767. var _this3 = this;
  64768. if (!tags || !tags.length) {
  64769. return Promise.resolve();
  64770. }
  64771. tags.forEach(function (tag) {
  64772. if (tag.position && tag.position instanceof THREE.Vector3 == false) {
  64773. tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z);
  64774. if (tag.visiblePanos && tag.visiblePanos.length) {
  64775. tag.visiblePanos = tag.visiblePanos.map(function (id) {
  64776. return _this3.app.core.get('Player').model.panos.index[id];
  64777. });
  64778. } else {
  64779. tag.visiblePanos = _this3.getVisiblePano(tag.position);
  64780. } //tag.visiblePanos ? (tag.visiblePanos = tag.visiblePanos.map(id => this.app.core.get('Player').model.panos.index[id])) : (tag.visiblePanos = this.getVisiblePano(tag.position))
  64781. }
  64782. _this3.tags.push(tag);
  64783. }); //this.tags = [].concat(this.tags, tags)
  64784. return this.view.then(function (view) {
  64785. return view.refresh();
  64786. });
  64787. }
  64788. }, {
  64789. key: "remove",
  64790. value: function remove(sid) {
  64791. var index = this.tags.findIndex(function (t) {
  64792. return t.sid == sid;
  64793. });
  64794. if (index != -1) {
  64795. this.tags.splice(index, 1);
  64796. return this.view.then(function (view) {
  64797. return view.remove(sid);
  64798. });
  64799. }
  64800. return Promise.resolve();
  64801. }
  64802. }, {
  64803. key: "removeAll",
  64804. value: function removeAll() {
  64805. this.tags = [];
  64806. return this.view.then(function (view) {
  64807. return view.removeAll();
  64808. });
  64809. }
  64810. }, {
  64811. key: "update",
  64812. value: function update(tags) {
  64813. if (!tags || !tags.length) {
  64814. return;
  64815. }
  64816. this.tags = tags;
  64817. } // 准备废弃
  64818. }, {
  64819. key: "updatePosition",
  64820. value: function updatePosition(tags) {
  64821. this.tags = tags;
  64822. }
  64823. /**
  64824. * 点击修改后瞬间跳到最佳点位
  64825. * @param {*} sid
  64826. */
  64827. }, {
  64828. key: "focusTag",
  64829. value: function focusTag(sid) {
  64830. var _this4 = this;
  64831. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
  64832. direction: '',
  64833. checkSameTag: false,
  64834. attrs: null
  64835. };
  64836. return new Promise(function (resolve) {
  64837. if (typeof options !== 'object') {
  64838. options = {};
  64839. }
  64840. var tag = _this4.tags.find(function (t) {
  64841. return t.sid == sid;
  64842. });
  64843. if (!tag) {
  64844. return resolve();
  64845. } // let $tag = document.querySelector(this.root).querySelector(`[data-tag-id="${sid}"]`)
  64846. // if (!$tag) {
  64847. // return resolve()
  64848. // }
  64849. _this4.emit('focus', sid, _this4.focusId);
  64850. if (sid == _this4.focusId && options.checkSameTag) {
  64851. _this4.focusId = '';
  64852. return resolve();
  64853. }
  64854. _this4.focusId = sid;
  64855. var player = _this4.player || _this4.app.core.get('Player'); // 根据热点可视和距离限制查询最近pano
  64856. var minDistance = 1.5;
  64857. var visiPanos = player.model.panos.closestPanoTowardPoint({
  64858. point: tag.position,
  64859. getAll: true
  64860. }).map(function (p) {
  64861. return p.item;
  64862. }).filter(function (p) {
  64863. return tag.visiblePanos.indexOf(p) > -1 && p.position.clone().setY(tag.position.y).sub(tag.position).length() > minDistance;
  64864. });
  64865. var pano = visiPanos[0]; // 优先查找当前floor
  64866. var currentFloorVisiPanos = visiPanos.filter(function (p) {
  64867. return p.floorIndex == player.model.currentFloor.floorIndex;
  64868. });
  64869. if (currentFloorVisiPanos.length > 0) {
  64870. pano = currentFloorVisiPanos[0];
  64871. }
  64872. if (!pano) {
  64873. console.warn('该热点无可视点位');
  64874. pano = player.currentPano;
  64875. } // 标识开始对准
  64876. _this4.__is_aimat = true;
  64877. if (options.direction) {
  64878. var attrs;
  64879. if (options.attrs) {
  64880. attrs = options.attrs;
  64881. } else {
  64882. var $tag = document.querySelector(_this4.root).querySelector("[data-tag-id=\"".concat(sid, "\"]"));
  64883. var $body = $tag.querySelector('.tag-body');
  64884. if (!$body) {
  64885. return resolve();
  64886. }
  64887. attrs = {
  64888. width: ($body.clientWidth || 0) + parseInt(getStyle($body, 'margin-left')) + parseInt(getStyle($body, 'margin-right')),
  64889. height: ($body.clientHeight || 0) + parseInt(getStyle($body, 'margin-top')) + parseInt(getStyle($body, 'margin-bottom'))
  64890. };
  64891. }
  64892. var center = new THREE.Vector3();
  64893. var unprojectCenter = function unprojectCenter() {
  64894. // 因为tag里的xy在相机飞出飞入后数值会有问题,所以这边再计算一次
  64895. tag.x = _this4.app.TagManager.convertPositionTo2D(tag.position).pos.x;
  64896. tag.y = _this4.app.TagManager.convertPositionTo2D(tag.position).pos.y;
  64897. center.set(0, 0, 0); // 根据boardDirc向左或向上偏移
  64898. var centerX = tag.x - (options.direction == 'left' ? attrs.width / 2 : 0);
  64899. var centerY = tag.y - (options.direction == 'top' ? attrs.height / 2 : 0); // 2d坐标映射到3d
  64900. _this4.app.TagManager.convertScreenPositionToNDC(centerX, centerY, center, _this4.app.dom);
  64901. center.unproject(player.camera);
  64902. }; // 面板中心
  64903. if (pano.id == player.currentPano.id && player.mode == 'panorama') {
  64904. unprojectCenter();
  64905. var cameraDirec = new THREE.Vector3(0, 0, 1).applyQuaternion(player.camera.quaternion).normalize();
  64906. var targetDirec = player.camera.position.clone().sub(tag.position).normalize();
  64907. var reverse = cameraDirec.dot(targetDirec);
  64908. if (reverse < 0) {
  64909. var distanceVec = player.camera.position.clone().sub(center).multiplyScalar(-1);
  64910. center = player.camera.position.clone().sub(distanceVec);
  64911. }
  64912. tag.x;
  64913. player.flyToPano({
  64914. pano: pano,
  64915. lookAtPoint: center,
  64916. duration: 1000,
  64917. isTagFlying: true
  64918. }, function () {
  64919. // if (tagX > window.innerWidth / 4 && tagX < (window.innerWidth / 4) * 3) {
  64920. // resolve()
  64921. // this.__is_aimat = false
  64922. // } else {
  64923. // unprojectCenter()
  64924. // this.app.Camera.flyToPoint(center, {
  64925. // aimDur: 400,
  64926. // })
  64927. // resolve()
  64928. // this.__is_aimat = false
  64929. // }
  64930. setTimeout(function () {
  64931. unprojectCenter();
  64932. player.flyToPano({
  64933. pano: pano,
  64934. aimDuration: 500,
  64935. lookAtPoint: center
  64936. });
  64937. resolve();
  64938. _this4.__is_aimat = false;
  64939. }, 10);
  64940. });
  64941. } else {
  64942. player.flyToPano({
  64943. pano: pano,
  64944. lookAtPoint: tag.position,
  64945. duration: 1000,
  64946. isTagFlying: true
  64947. }, function () {
  64948. return setTimeout(function () {
  64949. unprojectCenter();
  64950. player.flyToPano({
  64951. pano: pano,
  64952. aimDuration: 400,
  64953. lookAtPoint: center
  64954. });
  64955. resolve();
  64956. _this4.__is_aimat = false;
  64957. }, 10);
  64958. });
  64959. }
  64960. } else {
  64961. player.flyToPano({
  64962. pano: pano,
  64963. lookAtPoint: tag.position,
  64964. isTagFlying: true // duration: 700,
  64965. }, function () {
  64966. resolve();
  64967. _this4.__is_aimat = false;
  64968. });
  64969. }
  64970. });
  64971. }
  64972. }, {
  64973. key: "unfocusTag",
  64974. value: function unfocusTag() {
  64975. this.focusId = '';
  64976. }
  64977. }, {
  64978. key: "closeTag",
  64979. value: function closeTag(sid) {
  64980. this.unfocusTag();
  64981. this.emit('close');
  64982. }
  64983. }, {
  64984. key: "openTag",
  64985. value: function openTag(sid) {
  64986. this.emit('open', sid);
  64987. }
  64988. /**
  64989. * 使相机转至热点或面板中心
  64990. * @param {*} data 包含有tag或sid,以及board相关数据
  64991. * @param {"board" | "tag"} target 聚焦于热点还是面板中心
  64992. * @param {"top" | "left"} boardDirc 面板位于热点上面还是左面
  64993. */
  64994. }, {
  64995. key: "open",
  64996. value: function open(sid, retry) {
  64997. var _this5 = this;
  64998. var tag = this.tags.find(function (t) {
  64999. return t.sid == sid;
  65000. });
  65001. if (!tag.visible) {
  65002. if (retry) {
  65003. return;
  65004. }
  65005. return setTimeout(function () {
  65006. _this5.open(sid, true);
  65007. }, 500);
  65008. }
  65009. var $tag = document.querySelector("[tag-sid=\"".concat(sid, "\"]"));
  65010. if ($tag) {
  65011. var $point = $tag.querySelector(".point");
  65012. var evt = document.createEvent('HTMLEvents');
  65013. if (this.app.config.mobile) {
  65014. evt.initEvent('click', true, true);
  65015. } else {
  65016. evt.initEvent('mouseenter', true, true);
  65017. }
  65018. evt.fixed = true;
  65019. $point.dispatchEvent(evt);
  65020. } // this.emit('openTag', sid)
  65021. }
  65022. }, {
  65023. key: "close",
  65024. value: function close(sid) {
  65025. var tag = this.tags.find(function (t) {
  65026. return t.sid == sid;
  65027. });
  65028. if (!tag.visible) {
  65029. return;
  65030. }
  65031. var $tag = document.querySelector("[tag-sid=\"".concat(sid, "\"]"));
  65032. if ($tag) {
  65033. var evt = document.createEvent('HTMLEvents');
  65034. if (this.app.config.mobile) {
  65035. $tag = $tag.querySelector('.arrow i');
  65036. evt.initEvent('click', true, true);
  65037. } else {
  65038. evt.initEvent('mouseleave', true, true);
  65039. }
  65040. evt.relatedTarget = true;
  65041. evt.unfixed = true;
  65042. if ($tag) {
  65043. $tag.dispatchEvent(evt);
  65044. }
  65045. }
  65046. }
  65047. /**
  65048. * 查看热点的最佳点位
  65049. * @param {*} tag
  65050. * @returns
  65051. */
  65052. }, {
  65053. key: "findBestPanoForWatching",
  65054. value: function findBestPanoForWatching(tag) {
  65055. var player = this.app.core.get('Player'); // 根据热点可视查询最近pano
  65056. var visiPanos = player.model.panos.closestPanoTowardPoint({
  65057. point: tag.position,
  65058. getAll: true,
  65059. require: [function (p) {
  65060. return tag.visiblePanos.indexOf(p) > -1;
  65061. }]
  65062. }).map(function (p) {
  65063. return p.item;
  65064. }); // 查找非孤立点位
  65065. var notAloneVisiPanos = visiPanos.filter(function (p) {
  65066. return p.neighbourUUIDs.filter(function (id) {
  65067. return id != p.id;
  65068. }).length > 0;
  65069. });
  65070. if (notAloneVisiPanos.length > 0) {
  65071. visiPanos = notAloneVisiPanos;
  65072. } // // 查找符合距离限制的(要能完全展示UI)
  65073. // let minDistance = 1.5
  65074. // let minDistanceVisiPanos = visiPanos.filter(p => p.position.clone().setY(tag.position.y).sub(tag.position).length() > minDistance)
  65075. // if (minDistanceVisiPanos.length > 0) {
  65076. // visiPanos = minDistanceVisiPanos
  65077. // }
  65078. // 查找当前floor
  65079. var currentFloorVisiPanos = visiPanos.filter(function (p) {
  65080. return p.floorIndex == player.model.currentFloor.floorIndex;
  65081. });
  65082. if (currentFloorVisiPanos.length > 0) {
  65083. visiPanos = currentFloorVisiPanos;
  65084. }
  65085. var pano = visiPanos[0];
  65086. if (player.mode === Viewmode$1.PANORAMA) {
  65087. visiPanos = visiPanos.filter(function (pano) {
  65088. var p1 = new THREE.Vector3(tag.position.x - pano.position.x, tag.position.y - pano.position.y, tag.position.z - pano.position.z);
  65089. var p2 = new THREE.Vector3(tag.position.x - player.currentPano.position.x, tag.position.y - player.currentPano.position.y, tag.position.z - player.currentPano.position.z);
  65090. var angle = p1.angleTo(p2);
  65091. return angle < Math.PI / 4;
  65092. });
  65093. }
  65094. if (visiPanos.length > 0) {
  65095. pano = visiPanos[0];
  65096. }
  65097. if (!pano) {
  65098. console.warn('该热点无可视点位');
  65099. pano = player.currentPano;
  65100. }
  65101. return pano;
  65102. }
  65103. /**
  65104. * 显示所有热点
  65105. * @param {boolean} force 是否强制显示(包括在平面图、三维模型)
  65106. */
  65107. }, {
  65108. key: "showAll",
  65109. value: function showAll() {
  65110. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  65111. this.showTags = true;
  65112. if (force) {
  65113. this.showTagsVisible = true;
  65114. }
  65115. }
  65116. /**'
  65117. * 隐藏所有热点
  65118. * @param {boolean} force 是否强制隐藏(包括在平面图、三维模型)
  65119. */
  65120. }, {
  65121. key: "hideAll",
  65122. value: function hideAll() {
  65123. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  65124. this.showTags = false;
  65125. if (force) {
  65126. this.showTagsVisible = false;
  65127. }
  65128. }
  65129. }, {
  65130. key: "convertScreenPositionToNDC",
  65131. value: function convertScreenPositionToNDC(centerX, centerY, center) {
  65132. return math$1.convertScreenPositionToNDC(centerX, centerY, center, this.app.dom);
  65133. }
  65134. }, {
  65135. key: "toJSON",
  65136. value: function toJSON(tags) {
  65137. var data = JSON.stringify(tags || this.tags, function (key, value) {
  65138. if (key === 'visiblePanos' && value) {
  65139. return value.map(function (v) {
  65140. return v.id;
  65141. });
  65142. }
  65143. return value;
  65144. });
  65145. return JSON.parse(data);
  65146. }
  65147. }]);
  65148. return TagManager;
  65149. }(tinyEmitter);
  65150. function _createSuper$3(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$3(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  65151. function _isNativeReflectConstruct$3() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  65152. var _visibleEnter = /*#__PURE__*/_classPrivateFieldKey("visibleEnter");
  65153. var _visibleLeave = /*#__PURE__*/_classPrivateFieldKey("visibleLeave");
  65154. var Manager = /*#__PURE__*/function () {
  65155. function Manager(app) {
  65156. _classCallCheck(this, Manager);
  65157. Object.defineProperty(this, _visibleLeave, {
  65158. value: _visibleLeave2
  65159. });
  65160. Object.defineProperty(this, _visibleEnter, {
  65161. value: _visibleEnter2
  65162. });
  65163. this.app = app;
  65164. this.player = null;
  65165. this.symbol = null;
  65166. this.visible = false;
  65167. }
  65168. _createClass(Manager, [{
  65169. key: "enter",
  65170. value: function enter(symbol) {
  65171. var _this = this;
  65172. if (this.symbol) {
  65173. return;
  65174. }
  65175. this.player = this.app.core.get('Player');
  65176. if (this.player == void 0) {
  65177. setTimeout(function () {
  65178. return _this.enter(symbol);
  65179. }, 500);
  65180. return;
  65181. }
  65182. this.symbol = symbol;
  65183. if (symbol == 'visible') {
  65184. _classPrivateFieldBase(this, _visibleEnter)[_visibleEnter]();
  65185. }
  65186. }
  65187. }, {
  65188. key: "leave",
  65189. value: function leave() {
  65190. if (this.symbol == 'visible') {
  65191. _classPrivateFieldBase(this, _visibleLeave)[_visibleLeave]();
  65192. }
  65193. this.symbol = null;
  65194. }
  65195. }, {
  65196. key: "setVisibleState",
  65197. value: function setVisibleState(sid) {
  65198. var tag = this.app.TagManager.tags.find(function (t) {
  65199. return t.sid == sid;
  65200. });
  65201. if (tag) {
  65202. this.player.linkEditor.SetOneTagVisible(tag);
  65203. }
  65204. }
  65205. }]);
  65206. return Manager;
  65207. }();
  65208. function _visibleEnter2() {
  65209. this.visible = true;
  65210. if (this.player.linkEditor) {
  65211. this.player.linkEditor.enterSet('tagVisible');
  65212. this.player.linkEditor.beginSetTagVisible();
  65213. }
  65214. this.player.model.floorplanCadImg.hideCadPlane();
  65215. }
  65216. function _visibleLeave2() {
  65217. this.visible = false;
  65218. this.player.linkEditor.finishSetTagVisible();
  65219. this.player.model.floorplanCadImg.showCadPlane();
  65220. }
  65221. var TagManager = /*#__PURE__*/function (_Emiter) {
  65222. _inherits(TagManager, _Emiter);
  65223. var _super = _createSuper$3(TagManager);
  65224. function TagManager(app) {
  65225. var _this2;
  65226. _classCallCheck(this, TagManager);
  65227. _this2 = _super.call(this);
  65228. _this2.focusBeforeModify = function (sid) {
  65229. var player = _this2.app.core.get('Player');
  65230. _this2.editTag = _this2.tags.find(function (t) {
  65231. return t.sid == sid;
  65232. });
  65233. var pano = _this2.findBestPanoForWatching(_this2.editTag);
  65234. player.flyToPano({
  65235. pano: pano,
  65236. lookAtPoint: _this2.editTag.position,
  65237. aimDuration: 0,
  65238. duration: 1,
  65239. checkAlone: true
  65240. }, function () {
  65241. _this2.edit.enter(_this2.editTag, function () {
  65242. _this2.editHandle.markTagPos = _this2.editTag.position;
  65243. _this2.editHandle.markSpotA.elem.style.display = 'block';
  65244. _this2.editHandle.markSpotB.elem.style.display = 'block';
  65245. });
  65246. }); // this.app.Camera.flyToPoint(pano.position, {
  65247. // aimDur: 0, // 同点位镜头旋转时间
  65248. // dur: 1, // 点位跳转时间(不能为0)
  65249. // done: () => {
  65250. // this.edit.enter(() => {
  65251. // this.editHandle.markTagPos = this.editTag.position
  65252. // this.editHandle.markSpotA.elem.style.display = 'block'
  65253. // this.editHandle.markSpotB.elem.style.display = 'block'
  65254. // })
  65255. // },
  65256. // })
  65257. };
  65258. _this2.focusing = function (data) {
  65259. var player = _this2.app.core.get('Player');
  65260. var center = new THREE.Vector3();
  65261. var tag = _this2.tags.find(function (t) {
  65262. return t.sid == data.sid;
  65263. }) || data.tag;
  65264. var pano = _this2.findBestPanoForWatching(tag);
  65265. /**
  65266. * 同步带看热点方向
  65267. */
  65268. var syncTagRotate = function syncTagRotate() {
  65269. if (player.mode === Viewmode$1.PANORAMA) {
  65270. _this2.app.Camera.emit(PlayerEvents.Rotate, {
  65271. panoId: player.currentPano ? player.currentPano.id : null,
  65272. quaternion: player.cameraControls.activeControl.camera.quaternion,
  65273. mode: Viewmode$1.PANORAMA,
  65274. type: 'flyToPano'
  65275. });
  65276. }
  65277. };
  65278. var unprojectCenter = function unprojectCenter() {
  65279. // 因为tag里的xy在相机飞出飞入后数值会有问题,所以这边再计算一次
  65280. tag.x = _this2.convertPositionTo2D(tag.position).pos.x;
  65281. tag.y = _this2.convertPositionTo2D(tag.position).pos.y;
  65282. center.set(0, 0, 0);
  65283. var centerX = tag.x;
  65284. var centerY = tag.y; // 根据boardDirc向左或向上偏移
  65285. if (data.board) {
  65286. if (data.board.width) {
  65287. centerX = tag.x - data.board.width / 2;
  65288. }
  65289. if (data.board.height) {
  65290. centerY = tag.y - data.board.height / 2;
  65291. }
  65292. } else {
  65293. centerX = tag.x;
  65294. centerY = tag.y;
  65295. } // 2d坐标映射到3d
  65296. math$1.convertScreenPositionToNDC(centerX, centerY, center, _this2.app.dom);
  65297. center.unproject(player.camera);
  65298. }; // 默认中心点目标
  65299. data.target = data.target || 'board';
  65300. if (data.target == 'board') {
  65301. // 面板中心
  65302. if (pano.id == player.currentPano.id && player.mode == 'panorama') {
  65303. _this2.emit('focus.rotating');
  65304. unprojectCenter();
  65305. var cameraDirec = new THREE.Vector3(0, 0, 1).applyQuaternion(player.camera.quaternion).normalize();
  65306. var targetDirec = player.camera.position.clone().sub(tag.position).normalize();
  65307. var reverse = cameraDirec.dot(targetDirec);
  65308. if (reverse < 0) {
  65309. var distanceVec = player.camera.position.clone().sub(center).multiplyScalar(-1);
  65310. center = player.camera.position.clone().sub(distanceVec);
  65311. }
  65312. player.flyToPano({
  65313. pano: pano,
  65314. lookAtPoint: center,
  65315. checkAlone: true,
  65316. isTagFlying: true
  65317. }, function () {
  65318. if (tag.x > window.innerWidth / 4 && tag.x < window.innerWidth / 4 * 3) {
  65319. syncTagRotate();
  65320. _this2.emit('focus.rotated', tag);
  65321. } else {
  65322. unprojectCenter();
  65323. player.flyToPano({
  65324. pano: pano,
  65325. aimDuration: 600,
  65326. lookAtPoint: center
  65327. }, function () {
  65328. syncTagRotate();
  65329. _this2.emit('focus.rotated', tag);
  65330. });
  65331. }
  65332. });
  65333. } else {
  65334. player.flyToPano({
  65335. pano: pano,
  65336. lookAtPoint: tag.position,
  65337. duration: 1000,
  65338. checkAlone: true,
  65339. isTagFlying: true
  65340. }, function () {
  65341. return setTimeout(function () {
  65342. unprojectCenter();
  65343. player.flyToPano({
  65344. pano: pano,
  65345. aimDuration: 600,
  65346. lookAtPoint: center
  65347. }, function () {
  65348. _this2.emit('focus.rotated', tag);
  65349. });
  65350. }, 10);
  65351. });
  65352. }
  65353. } else if (data.target == 'tag') {
  65354. // 热点
  65355. player.flyToPano({
  65356. pano: pano,
  65357. lookAtPoint: tag.position,
  65358. // duration: 700,
  65359. checkAlone: true,
  65360. isTagFlying: true
  65361. }, function () {
  65362. _this2.emit('focus.rotated', tag);
  65363. });
  65364. }
  65365. };
  65366. console.info('TagManagerV2');
  65367. _this2.app = app;
  65368. _this2.tags = [];
  65369. _this2.icons = [];
  65370. _this2.manager = new Manager(_this2.app);
  65371. _this2.app.store.on('tags', function (data) {
  65372. if (data.icons) {
  65373. _this2.icons = data.icons;
  65374. }
  65375. if (data.tags) {
  65376. data.tags.forEach(function (tag) {
  65377. _this2.tags.push(tag);
  65378. });
  65379. } // 由于热点新增了floorIndex属性,需要兼容旧数据
  65380. var player = app.core.get('Player');
  65381. var dir = new THREE.Vector3(0, -1, 0);
  65382. var ray = new THREE.Raycaster(new THREE.Vector3(0, 0, 0), dir, 0.001, 9999);
  65383. _this2.tags.forEach(function (tag) {
  65384. if (tag.floorIndex == void 0) {
  65385. // 旧数据没有floorIndex
  65386. // 从热点位置向下投一条射线,检测到的第一个模型即为所在楼层
  65387. ray.set(tag.position, dir);
  65388. var intersection = ray.intersectObjects(player.model.chunks);
  65389. if (!intersection.length) {
  65390. // 如果射线检测不到模型,则根据floor的boundingBox判断
  65391. var tagFloor = player.model.floors.list.find(function (floor) {
  65392. return tag.position.y >= floor.boundingBox.min.y && tag.position.y <= floor.boundingBox.max.y;
  65393. });
  65394. tag.floorIndex = tagFloor && tagFloor.floorIndex;
  65395. } else {
  65396. tag.floorIndex = intersection[0].object.parent.floorIndex;
  65397. }
  65398. }
  65399. });
  65400. _this2.loaded = true;
  65401. _this2.emit('loaded', _this2.tags);
  65402. });
  65403. _this2.app.Camera.on('flying.started', function (pano) {
  65404. if (!pano.isTagFlying) {
  65405. _this2.emit('close');
  65406. }
  65407. });
  65408. _this2.app.Scene.on('loaded', function () {
  65409. var player = app.core.get('Player'); // 热点在哪些模式下显示
  65410. var showIn = _this2.app.config.tag.showIn;
  65411. var event = {
  65412. tags: _this2.tags
  65413. };
  65414. app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function () {
  65415. if (!_this2.tags || !_this2.tags.length) return;
  65416. var setTagVisible = function setTagVisible(tag, visible) {
  65417. if (tag.visible == visible) {
  65418. return;
  65419. }
  65420. tag.visible = visible;
  65421. };
  65422. _this2.tags.forEach(function (item) {
  65423. // isLose表示失效,重算的时候需要
  65424. //s howTags表示是否全部可见
  65425. if (item.isLose || _this2.showTags === false) {
  65426. return setTagVisible(item, false);
  65427. }
  65428. if (_this2.manager.visible) {
  65429. // 热点可视
  65430. if (player.linkEditor.setTagVisible) {
  65431. // 只所在楼层可视热点
  65432. if (item.floorIndex != player.model.currentFloor.floorIndex) {
  65433. if (player.linkEditor.tagVsetting != item) {
  65434. //tagVsetting的要一直显示
  65435. return setTagVisible(item, false);
  65436. }
  65437. }
  65438. }
  65439. } else {
  65440. if (showIn) {
  65441. if (showIn === 'all') {
  65442. if (player.mode == Viewmode$1.PANORAMA && !item.visiblePanos.includes(player.currentPano)) {
  65443. return setTagVisible(item, false);
  65444. }
  65445. } else if (showIn.indexOf(player.mode) == -1) {
  65446. return setTagVisible(item, false);
  65447. }
  65448. }
  65449. if (settings$3.vrEnabled && settings$3.vrSplitScreen) {
  65450. return setTagVisible(item, false);
  65451. } // 默认情况
  65452. if (!showIn || showIn != 'all' && showIn == Viewmode$1.PANORAMA) {
  65453. if (player.mode != Viewmode$1.PANORAMA || item.visiblePanos && !item.visiblePanos.includes(player.currentPano)) {
  65454. return setTagVisible(item, false);
  65455. }
  65456. }
  65457. }
  65458. var pos = _this2.convertPositionTo2D(item.position);
  65459. if (!pos.trueSide || !pos.inSight) {
  65460. //trueSide是否在背面
  65461. //inSight是否在当前屏幕可视区域
  65462. //console.log(item.sid, false)
  65463. return setTagVisible(item, false);
  65464. }
  65465. item.x = pos.pos.x;
  65466. item.y = pos.pos.y;
  65467. setTagVisible(item, true);
  65468. });
  65469. event.lastFrameChanged = player.lastFrameChanged;
  65470. _this2.emit('update', event);
  65471. });
  65472. });
  65473. return _this2;
  65474. }
  65475. _createClass(TagManager, [{
  65476. key: "load",
  65477. value: function load(tags) {
  65478. var _this3 = this;
  65479. if (!tags || !tags instanceof Array) {
  65480. return;
  65481. }
  65482. var player = this.app.core.get('Player');
  65483. tags.forEach(function (tag) {
  65484. if (tag.position && tag.position instanceof THREE.Vector3 == false) {
  65485. tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z);
  65486. if (tag.visiblePanos && tag.visiblePanos.length) {
  65487. tag.visiblePanos = tag.visiblePanos.map(function (id) {
  65488. return player.model.panos.index[id];
  65489. });
  65490. } else {
  65491. tag.visiblePanos = _this3.getVisiblePano(tag.position);
  65492. }
  65493. }
  65494. });
  65495. this.tags = tags;
  65496. }
  65497. /**
  65498. * 3d坐标转2d屏幕坐标
  65499. * @param {Object} position3d {x,y,z}
  65500. * @returns {Object} {x,y}
  65501. */
  65502. }, {
  65503. key: "convertPositionTo2D",
  65504. value: function convertPositionTo2D(position3d) {
  65505. return convertTool.getPos2d(position3d, this.app.core.get('Player'));
  65506. }
  65507. }, {
  65508. key: "ifShelter",
  65509. value: function ifShelter(position3d, pos2d) {
  65510. var player = this.app.core.get('Player');
  65511. var floorIndex = player.model.allFloorsVisible ? null : player.model.currentFloor.floorIndex;
  65512. return convertTool.ifShelter(position3d, player, pos2d, null, floorIndex);
  65513. }
  65514. }, {
  65515. key: "getVisiblePano",
  65516. value: function getVisiblePano(position) {
  65517. var maxDis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;
  65518. var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15;
  65519. var visiblePanos = convertTool.getVisiblePano(position, this.app.core.get('Player').model, {
  65520. maxDis,
  65521. tolerance
  65522. }); //maxDis如果能自适应场景更好,有的大马路pano间距较远
  65523. return visiblePanos;
  65524. }
  65525. /**
  65526. * 点击修改后瞬间跳到最佳点位
  65527. * @param {*} sid
  65528. */
  65529. }, {
  65530. key: "open",
  65531. value: function open(sid) {
  65532. var _this4 = this;
  65533. var retry = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  65534. var tag = this.tags.find(function (t) {
  65535. return t.sid == sid;
  65536. });
  65537. if (tag) {
  65538. if (!tag.visible) {
  65539. console.log(retry);
  65540. if (retry > 5) {
  65541. return;
  65542. }
  65543. return setTimeout(function () {
  65544. return _this4.open(sid, ++retry);
  65545. }, 300);
  65546. }
  65547. this.emit('open', tag);
  65548. }
  65549. }
  65550. }, {
  65551. key: "focus",
  65552. value: function focus(sid) {
  65553. var tag = this.tags.find(function (t) {
  65554. return t.sid == sid;
  65555. });
  65556. if (tag) {
  65557. this.emit('focus', tag);
  65558. }
  65559. }
  65560. }, {
  65561. key: "close",
  65562. value: function close() {
  65563. this.emit('close');
  65564. }
  65565. /**
  65566. * 查看热点的最佳点位
  65567. * @param {*} tag
  65568. * @returns
  65569. */
  65570. }, {
  65571. key: "findBestPanoForWatching",
  65572. value: function findBestPanoForWatching(tag) {
  65573. var player = this.app.core.get('Player'); // 根据热点可视查询最近pano
  65574. var visiPanos = player.model.panos.closestPanoTowardPoint({
  65575. point: tag.position,
  65576. getAll: true,
  65577. require: [function (p) {
  65578. return tag.visiblePanos.indexOf(p) > -1;
  65579. }]
  65580. }).map(function (p) {
  65581. return p.item;
  65582. }); // 查找非孤立点位
  65583. var notAloneVisiPanos = visiPanos.filter(function (p) {
  65584. return p.neighbourUUIDs.filter(function (id) {
  65585. return id != p.id;
  65586. }).length > 0;
  65587. });
  65588. if (notAloneVisiPanos.length > 0) {
  65589. visiPanos = notAloneVisiPanos;
  65590. } // // 查找符合距离限制的(要能完全展示UI)
  65591. // let minDistance = 1.5
  65592. // let minDistanceVisiPanos = visiPanos.filter(p => p.position.clone().setY(tag.position.y).sub(tag.position).length() > minDistance)
  65593. // if (minDistanceVisiPanos.length > 0) {
  65594. // visiPanos = minDistanceVisiPanos
  65595. // }
  65596. // 查找当前floor
  65597. var currentFloorVisiPanos = visiPanos.filter(function (p) {
  65598. return p.floorIndex == player.model.currentFloor.floorIndex;
  65599. });
  65600. if (currentFloorVisiPanos.length > 0) {
  65601. visiPanos = currentFloorVisiPanos;
  65602. }
  65603. var pano = visiPanos[0];
  65604. if (player.mode === Viewmode$1.PANORAMA) {
  65605. visiPanos = visiPanos.filter(function (pano) {
  65606. var p1 = new THREE.Vector3(tag.position.x - pano.position.x, tag.position.y - pano.position.y, tag.position.z - pano.position.z);
  65607. var p2 = new THREE.Vector3(tag.position.x - player.currentPano.position.x, tag.position.y - player.currentPano.position.y, tag.position.z - player.currentPano.position.z);
  65608. var angle = p1.angleTo(p2);
  65609. return angle < Math.PI / 4;
  65610. });
  65611. }
  65612. if (visiPanos.length > 0) {
  65613. pano = visiPanos[0];
  65614. }
  65615. if (!pano) {
  65616. console.warn('该热点无可视点位');
  65617. pano = player.currentPano;
  65618. }
  65619. return pano;
  65620. }
  65621. /**
  65622. * 显示所有热点
  65623. * @param {boolean} force 是否强制显示(包括在平面图、三维模型)
  65624. */
  65625. }, {
  65626. key: "showAll",
  65627. value: function showAll() {
  65628. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  65629. this.showTags = true;
  65630. if (force) {
  65631. this.showTagsVisible = true;
  65632. }
  65633. }
  65634. /**'
  65635. * 隐藏所有热点
  65636. * @param {boolean} force 是否强制隐藏(包括在平面图、三维模型)
  65637. */
  65638. }, {
  65639. key: "hideAll",
  65640. value: function hideAll() {
  65641. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  65642. this.showTags = false;
  65643. if (force) {
  65644. this.showTagsVisible = false;
  65645. }
  65646. }
  65647. }, {
  65648. key: "convertScreenPositionToNDC",
  65649. value: function convertScreenPositionToNDC(centerX, centerY, center) {
  65650. return math$1.convertScreenPositionToNDC(centerX, centerY, center, this.app.dom);
  65651. }
  65652. }, {
  65653. key: "toJSON",
  65654. value: function toJSON(tags) {
  65655. var data = JSON.stringify(tags || this.tags, function (key, value) {
  65656. if (key === 'visiblePanos' && value) {
  65657. return value.map(function (v) {
  65658. return v.id;
  65659. });
  65660. }
  65661. return value;
  65662. });
  65663. return JSON.parse(data);
  65664. }
  65665. }]);
  65666. return TagManager;
  65667. }(tinyEmitter);
  65668. function _createSuper$2(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$2(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  65669. function _isNativeReflectConstruct$2() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  65670. var WalkManager$1 = /*#__PURE__*/function (_Emiter) {
  65671. _inherits(WalkManager, _Emiter);
  65672. var _super = _createSuper$2(WalkManager);
  65673. function WalkManager(app) {
  65674. var _this;
  65675. _classCallCheck(this, WalkManager);
  65676. _this = _super.call(this);
  65677. _this.app = app;
  65678. _this.edit = {};
  65679. var player;
  65680. var deferred = Deferred$1();
  65681. _this.app.Scene.on('loaded', function () {
  65682. player = _this.app.core.get('Player');
  65683. player.linkEditor = new Link(player);
  65684. deferred.resolve();
  65685. });
  65686. _this.edit.enter = function () {
  65687. // 等到linkEditor初始化才能enter
  65688. if (player && player.linkEditor) {
  65689. setTimeout(function () {
  65690. player.linkEditor.enterSet('panoVisible');
  65691. player.labelManager.updateEntryVisi(false);
  65692. }, 0);
  65693. } else {
  65694. deferred.then(function () {
  65695. return _this.edit.enter();
  65696. });
  65697. }
  65698. };
  65699. _this.edit.exit = function () {
  65700. player && player.linkEditor.finishSetPanoVisible();
  65701. };
  65702. _this.edit.undoEdit = function () {
  65703. var pano = player.linkEditor.startEditPano;
  65704. player.linkEditor.pauseSetPanoVisible(false, player.model.currentFloor);
  65705. if (pano && pano.floorIndex == player.model.currentFloor.floorIndex) {
  65706. player.linkEditor.SetOnePanoVisible(pano);
  65707. _this.emit('walkManager.active', player.linkEditor.checkLinkStatus());
  65708. }
  65709. };
  65710. _this.edit.checkNeedSave = function () {
  65711. return player.linkEditor.checkPanoVisiChange();
  65712. };
  65713. _this.edit.save = function (promise) {
  65714. promise(player.linkEditor.savePanoVisibles(), player.linkEditor.afterSavePanoVisibles.bind(player.linkEditor));
  65715. };
  65716. _this.edit.toggle = function (show) {
  65717. // isSuccess 处理初始点位无法隐藏的交互
  65718. var isSuccess = player.linkEditor.toggle(show);
  65719. return isSuccess;
  65720. };
  65721. /**
  65722. * 多楼层连接 相关函数
  65723. */
  65724. _this.edit.linkToUpperFloor = function () {
  65725. var linkEditor = player.linkEditor;
  65726. if (!linkEditor.startEditPano) linkEditor.startEditPano = linkEditor.activePano; // 用于撤销时激活修改之前的pano
  65727. // let upperFloorIndex = linkEditor.activePano.floorIndex + 1
  65728. var upperFloorIndex = linkEditor.getFloor(linkEditor.activePano.floorIndex, 'upper');
  65729. if (window.jumpFloor != void 0) lowerFloorIndex = jumpFloor;
  65730. player.model.once('floor.changed', function (toFloor, mode) {
  65731. setTimeout(function () {
  65732. linkEditor.actionIcons.forEach(function (icon) {
  65733. return icon.visible = false;
  65734. });
  65735. var activePano = linkEditor.lastFloorActivePano;
  65736. activePano.footIcon.visible = true;
  65737. linkEditor.changeIconLinkState(activePano.footIcon, 'floorLinked');
  65738. }, 10);
  65739. });
  65740. _this.edit.unlinkToOtherFloor(null, {
  65741. checkMainFirstView: false
  65742. });
  65743. _this.app.Scene.gotoFloor(upperFloorIndex);
  65744. linkEditor.setMultiFloorPanoVisible = 'upper';
  65745. };
  65746. _this.edit.linkToLowerFloor = function () {
  65747. var linkEditor = player.linkEditor;
  65748. if (!linkEditor.startEditPano) linkEditor.startEditPano = linkEditor.activePano; // 用于撤销时激活修改之前的pano
  65749. // 楼层跳转,多楼层模式
  65750. // let lowerFloorIndex = linkEditor.activePano.floorIndex - 1
  65751. var lowerFloorIndex = linkEditor.getFloor(linkEditor.activePano.floorIndex, 'lower');
  65752. if (window.jumpFloor != void 0) lowerFloorIndex = jumpFloor;
  65753. player.model.once('floor.changed', function (toFloor, mode) {
  65754. setTimeout(function () {
  65755. linkEditor.actionIcons.forEach(function (icon) {
  65756. return icon.visible = false;
  65757. });
  65758. var activePano = linkEditor.lastFloorActivePano;
  65759. activePano.footIcon.visible = true;
  65760. linkEditor.changeIconLinkState(activePano.footIcon, 'floorLinked');
  65761. }, 10);
  65762. });
  65763. _this.edit.unlinkToOtherFloor(null, {
  65764. checkMainFirstView: false
  65765. }); //先取消旧连接
  65766. _this.app.Scene.gotoFloor(lowerFloorIndex);
  65767. linkEditor.setMultiFloorPanoVisible = 'lower';
  65768. };
  65769. _this.edit.floorLinkConfirm = function () {
  65770. //确定楼层连接点
  65771. var linkEditor = player.linkEditor;
  65772. var activePano = linkEditor.lastFloorActivePano; // let upperFloorPano = linkEditor.getClosestOtherFloorPano(activePano, 'up')
  65773. var linkToFloorPano = linkEditor.linkToFloorPano;
  65774. if (!linkToFloorPano) return console.log('没有选择漫游点');
  65775. _this.edit.unlinkToOtherFloor(linkToFloorPano); // 暂时单对单. 取消要连接的点的旧的楼连接
  65776. if (linkToFloorPano) {
  65777. linkEditor.savePanoVisiChange(activePano.id, [{
  65778. type: 'add',
  65779. id: linkToFloorPano.id
  65780. }]);
  65781. linkEditor.changeIconVisiState(activePano.footIcon, linkEditor.checkHasNeighbor(activePano));
  65782. }
  65783. };
  65784. _this.edit.unlinkToOtherFloor = function (pano) {
  65785. var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  65786. _ref$checkMainFirstVi = _ref.checkMainFirstView,
  65787. checkMainFirstView = _ref$checkMainFirstVi === void 0 ? true : _ref$checkMainFirstVi;
  65788. //先取消和别的楼层的所有连接 / 点击‘不设置’
  65789. var linkEditor = player.linkEditor;
  65790. var firstViewPano = player.$app.core.get('Scene').firstView.pano;
  65791. var shouldWarn;
  65792. if (!linkEditor.startEditPano) linkEditor.startEditPano = linkEditor.activePano; // 用于撤销时激活修改之前的pano
  65793. var activePano = pano || linkEditor.activePano;
  65794. linkEditor.saveLastPanoVi(); //清除线前先保存设置
  65795. var neighbours = linkEditor.panoVTemp[activePano.id] && linkEditor.panoVTemp[activePano.id].neighbourPanos || player.model.panos.index[activePano.id].neighbourPanos;
  65796. var neighbourPanos = Object.keys(neighbours).map(function (pId) {
  65797. return player.model.panos.index[pId];
  65798. });
  65799. var change = [];
  65800. neighbourPanos.forEach(function (pano) {
  65801. if (pano.floorIndex != activePano.floorIndex) {
  65802. /* if (this.edit.checkFirstView(pano, activePano)) { //-----被驳回,所以先注释
  65803. //被连接的是初始点且断开后会变孤立点
  65804. return (shouldWarn = true)
  65805. } */
  65806. change.push({
  65807. type: 'sub',
  65808. id: pano.id
  65809. });
  65810. }
  65811. });
  65812. if (change.length) {
  65813. linkEditor.savePanoVisiChange(activePano.id, change); //check activePano if it is firstViewPano . 如果不用检查代表过后还要连接别的
  65814. if (checkMainFirstView && activePano == firstViewPano && !linkEditor.checkHasNeighbor(firstViewPano)) {
  65815. shouldWarn = true; //恢复一个,使之不是孤立点
  65816. change = [{
  65817. type: 'add',
  65818. id: change[0].id
  65819. }];
  65820. linkEditor.savePanoVisiChange(activePano.id, change);
  65821. }
  65822. linkEditor.changeIconVisiState(activePano.footIcon, linkEditor.checkHasNeighbor(activePano)); // 更新连接状态
  65823. linkEditor.delVisibleLines(); //删除线
  65824. linkEditor.showFootIcons(activePano, true);
  65825. linkEditor.createPanoVisiLines(activePano); //创线
  65826. }
  65827. if (shouldWarn) {
  65828. player.$app.gui.toast({
  65829. event: 'DialogList3D.WalkManger.firstPointLimit',
  65830. content: DialogList3D.WalkManger.firstPointLimit
  65831. });
  65832. setTimeout(function () {
  65833. linkEditor.checkFloorLinkStatus(); //上下楼选项恢复
  65834. }, 1);
  65835. }
  65836. };
  65837. _this.edit.cancelFloorLink = function () {
  65838. //取消设置楼层连接
  65839. var linkEditor = player.linkEditor;
  65840. _this.app.Scene.gotoFloor(linkEditor.lastFloorActivePano.floorIndex);
  65841. linkEditor.actionIcons.forEach(function (icon) {
  65842. return icon.visible = true;
  65843. });
  65844. linkEditor.linkToFloorPano = null;
  65845. linkEditor.setMultiFloorPanoVisible = false;
  65846. player.$app.WalkManager.emit('walkManager.multiFloorLinking', false); //置灰确定按钮
  65847. }; //主点是初始点的话,主点可能连接多个其他点。
  65848. _this.edit.checkFirstView = function (panoA, panoB) {
  65849. var firstViewPano = player.$app.core.get('Scene').firstView.pano;
  65850. var another;
  65851. if (firstViewPano == panoA) {
  65852. another = panoB;
  65853. } else if (firstViewPano == panoB) {
  65854. another = panoA;
  65855. } else return false;
  65856. var neighbours = player.linkEditor.getCurNeighbors(firstViewPano);
  65857. var firstViewWillHide = neighbours.length == 1 && neighbours.includes(another.id);
  65858. return firstViewWillHide;
  65859. };
  65860. return _this;
  65861. }
  65862. return WalkManager;
  65863. }(tinyEmitter);
  65864. function _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  65865. function _isNativeReflectConstruct$1() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  65866. var WalkManager = /*#__PURE__*/function (_Emiter) {
  65867. _inherits(WalkManager, _Emiter);
  65868. var _super = _createSuper$1(WalkManager);
  65869. function WalkManager(app) {
  65870. var _this;
  65871. _classCallCheck(this, WalkManager);
  65872. _this = _super.call(this);
  65873. _this.app = app;
  65874. _this.player = null; // 所选点位的连接状态
  65875. _this.on('walkManager.active', function (state) {
  65876. var status = null;
  65877. switch (state) {
  65878. case 'walkManager.linkAll':
  65879. status = 'all'; // 全部连接
  65880. break;
  65881. case 'walkManager.linkSome':
  65882. status = 'some'; // 部分连接
  65883. break;
  65884. case 'walkManager.linkNone':
  65885. status = 'none'; // 没有连接
  65886. break;
  65887. }
  65888. _this.emit('pano.status', status);
  65889. }); // 所选点位取消选择
  65890. _this.on('walkManager.deactive', function () {
  65891. _this.emit('pano.status');
  65892. });
  65893. return _this;
  65894. }
  65895. _createClass(WalkManager, [{
  65896. key: "save",
  65897. value: function save() {
  65898. var data = this.toJSON();
  65899. if (data.length == 0) {
  65900. return Promise.resolve();
  65901. }
  65902. return this.app.APIs.editor.walk_save({
  65903. data
  65904. });
  65905. }
  65906. /**
  65907. * 进入编辑状态
  65908. * @returns
  65909. */
  65910. }, {
  65911. key: "enter",
  65912. value: function enter() {
  65913. var _this2 = this;
  65914. if (this.player === null) {
  65915. this.app.Scene.whenLoaded(function () {
  65916. _this2.player = _this2.app.core.get('Player');
  65917. _this2.player.linkEditor = new Link(_this2.player);
  65918. setTimeout(function () {
  65919. return _this2.enter();
  65920. }, 200);
  65921. });
  65922. return;
  65923. }
  65924. this.app.Scene.hideFloorCadImage();
  65925. this.player.linkEditor.enterSet('panoVisible');
  65926. this.player.labelManager.updateEntryVisi(false);
  65927. }
  65928. /**
  65929. * 退出编辑状态
  65930. */
  65931. }, {
  65932. key: "leave",
  65933. value: function leave() {
  65934. if (this.player) {
  65935. this.app.Scene.showFloorCadImage();
  65936. this.player.linkEditor.finishSetPanoVisible();
  65937. }
  65938. }
  65939. /**
  65940. * 处理初始点位无法隐藏的交互
  65941. * @param {*} type
  65942. * @returns
  65943. */
  65944. }, {
  65945. key: "toggle",
  65946. value: function toggle(type) {
  65947. if (this.player) {
  65948. return this.player.linkEditor.toggle(type);
  65949. }
  65950. }
  65951. /**
  65952. * 取消操作
  65953. */
  65954. }, {
  65955. key: "cancel",
  65956. value: function cancel() {
  65957. if (this.player === null) {
  65958. return;
  65959. }
  65960. var pano = this.player.linkEditor.startEditPano;
  65961. this.player.linkEditor.pauseSetPanoVisible(false, this.player.model.currentFloor);
  65962. if (pano && pano.floorIndex == this.player.model.currentFloor.floorIndex) {
  65963. this.player.linkEditor.SetOnePanoVisible(pano);
  65964. this.emit('walkManager.active', this.player.linkEditor.checkLinkStatus());
  65965. }
  65966. }
  65967. /**
  65968. * 确认操作
  65969. */
  65970. }, {
  65971. key: "confirm",
  65972. value: function confirm() {}
  65973. /**
  65974. * 获取编辑数据
  65975. * @returns {Array<Object>}
  65976. */
  65977. }, {
  65978. key: "toJSON",
  65979. value: function toJSON() {
  65980. if (this.player === null) {
  65981. return [];
  65982. }
  65983. return this.player.linkEditor.savePanoVisibles() || [];
  65984. }
  65985. }]);
  65986. return WalkManager;
  65987. }(tinyEmitter);
  65988. var CadManager$1 = /*#__PURE__*/function () {
  65989. function CadManager(app) {
  65990. var _this = this;
  65991. _classCallCheck(this, CadManager);
  65992. this.app = app;
  65993. this.edit = {};
  65994. this.labels = [{
  65995. key: 'porch',
  65996. text: '玄关',
  65997. type: 'hall'
  65998. }, {
  65999. key: 'masterGuard',
  66000. text: '主卫',
  66001. type: 'hall'
  66002. }, {
  66003. key: 'aisle',
  66004. text: '过道',
  66005. type: 'hall'
  66006. }, {
  66007. key: 'guestGuard',
  66008. text: '客卫',
  66009. type: 'hall'
  66010. }, {
  66011. key: 'kitchen',
  66012. text: '厨房',
  66013. type: 'hall'
  66014. }, {
  66015. key: 'garage',
  66016. text: '车库',
  66017. type: 'hall'
  66018. }, {
  66019. key: 'garden',
  66020. text: '花园',
  66021. type: 'hall'
  66022. }, {
  66023. key: 'balcony',
  66024. text: '阳台',
  66025. type: 'hall'
  66026. }, {
  66027. key: 'masterBedroom',
  66028. text: '主卧',
  66029. type: 'room'
  66030. }, {
  66031. key: 'guestBedroom',
  66032. text: '次卧',
  66033. type: 'room'
  66034. }, {
  66035. key: 'study',
  66036. text: '书房',
  66037. type: 'room'
  66038. }, {
  66039. key: 'lockerRoom',
  66040. text: '储物间',
  66041. type: 'room'
  66042. }, {
  66043. key: 'cloakroom',
  66044. text: '衣帽间',
  66045. type: 'room'
  66046. }, {
  66047. key: 'elderlyRoom',
  66048. text: '老人房',
  66049. type: 'room'
  66050. }, {
  66051. key: 'childrenRoom',
  66052. text: '儿童房',
  66053. type: 'room'
  66054. }, {
  66055. key: 'petRoom',
  66056. text: '宠物房',
  66057. type: 'room'
  66058. }, {
  66059. key: 'livingRoom',
  66060. text: '客厅',
  66061. type: 'other'
  66062. }, {
  66063. key: 'restaurant',
  66064. text: '餐厅',
  66065. type: 'other'
  66066. }];
  66067. this.plugin = Deferred$1();
  66068. this.deferred = Deferred$1();
  66069. this.app.Scene.on('loaded', function () {
  66070. _this.deferred.resolve();
  66071. });
  66072. this.edit.enter = function () {
  66073. _this.app.VideoManager.BoxVideo.hideAll();
  66074. _this.app.Scene.Decoration.hideAll();
  66075. _this.waitLoaded(function () {
  66076. _this.app.core.get('Player').model.floorplanCadImg.isEdit = true;
  66077. });
  66078. };
  66079. this.edit.exit = function () {
  66080. _this.app.VideoManager.BoxVideo.showAll();
  66081. _this.app.Scene.Decoration.showAll();
  66082. var player = _this.app.core.get('Player');
  66083. player && (player.model.floorplanCadImg.isEdit = false);
  66084. };
  66085. }
  66086. _createClass(CadManager, [{
  66087. key: "install",
  66088. value: function install(target) {
  66089. this.target = target;
  66090. this.plugin.resolve(target);
  66091. }
  66092. }, {
  66093. key: "use",
  66094. value: function use() {
  66095. if (this.target) {
  66096. return Promise.resolve(this.target);
  66097. }
  66098. return this.plugin.promise();
  66099. }
  66100. }, {
  66101. key: "cad",
  66102. value: function cad() {
  66103. return this.target;
  66104. }
  66105. }, {
  66106. key: "waitLoaded",
  66107. value: function waitLoaded(func) {
  66108. if (!func) return;
  66109. if (this.app.core.get('Player')) {
  66110. func();
  66111. } else {
  66112. this.deferred.then(func);
  66113. }
  66114. }
  66115. }]);
  66116. return CadManager;
  66117. }();
  66118. var CadManager = /*#__PURE__*/function () {
  66119. function CadManager(app) {
  66120. _classCallCheck(this, CadManager);
  66121. this.app = app;
  66122. this.ready = Deferred$1();
  66123. this.option = {};
  66124. this.player = null;
  66125. this.instance = null;
  66126. }
  66127. _createClass(CadManager, [{
  66128. key: "install",
  66129. value: function install(instance) {
  66130. for (var key in instance) {
  66131. this[key] = instance[key];
  66132. }
  66133. this.instance = instance;
  66134. this.ready.resolve();
  66135. }
  66136. }, {
  66137. key: "config",
  66138. value: function config(option) {
  66139. var _this = this;
  66140. Object.assign(this.option, option || {});
  66141. this.ready.then(function () {
  66142. if (_this.option.padding) {
  66143. _this.instance.padding(_this.option.padding);
  66144. }
  66145. });
  66146. }
  66147. }, {
  66148. key: "enter",
  66149. value: function enter() {
  66150. var _this2 = this;
  66151. return this.app.Scene.whenLoaded(function () {
  66152. _this2.app.VideoManager.BoxVideo.hideAll();
  66153. _this2.app.Scene.Decoration.hideAll();
  66154. _this2.player = _this2.app.core.get('Player');
  66155. _this2.player.model.floorplanCadImg.isEdit = true;
  66156. _this2.ready.then(function () {
  66157. if (_this2.instance.$xui == void 0) {
  66158. _this2.instance.$xui = _this2.$xui;
  66159. }
  66160. _this2.show();
  66161. });
  66162. });
  66163. }
  66164. }, {
  66165. key: "leave",
  66166. value: function leave() {
  66167. var _this3 = this;
  66168. return this.app.Scene.whenLoaded(function () {
  66169. _this3.app.Scene.Decoration.showAll();
  66170. _this3.player.model.floorplanCadImg.isEdit = false;
  66171. _this3.ready.then(function () {
  66172. return _this3.hide();
  66173. });
  66174. });
  66175. }
  66176. }]);
  66177. return CadManager;
  66178. }();
  66179. function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
  66180. function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty$1(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
  66181. var ModelManager = /*#__PURE__*/function () {
  66182. function ModelManager(app) {
  66183. _classCallCheck(this, ModelManager);
  66184. this.app = app;
  66185. this.player = null;
  66186. }
  66187. _createClass(ModelManager, [{
  66188. key: "length",
  66189. get: function get() {
  66190. return this.player.GLTFEditor.group.children.length;
  66191. }
  66192. /**
  66193. *
  66194. * @param {string} url
  66195. * @param {Object} options
  66196. * @param {string} options.panoId 0
  66197. * @param {Object} options.scale {x:0,y:0,z:0}
  66198. * @param {Object} options.position {x:0,y:0,z:0}
  66199. * @param {Object} options.quaternion {x:0,y:0,z:0,w:1}
  66200. * @returns
  66201. */
  66202. }, {
  66203. key: "add",
  66204. value: function add(url, options) {
  66205. var _this = this;
  66206. if (!url) {
  66207. return;
  66208. }
  66209. if (url.indexOf('?') === -1) {
  66210. url += '?';
  66211. }
  66212. if (options == void 0) {
  66213. options = {
  66214. scale: {
  66215. x: 0.1,
  66216. y: 0.1,
  66217. z: 0.1
  66218. },
  66219. position: {
  66220. x: 0,
  66221. y: 0,
  66222. z: 0
  66223. },
  66224. quaternion: {
  66225. x: 0,
  66226. y: 0,
  66227. z: 0,
  66228. w: 1
  66229. }
  66230. };
  66231. } else if (options.scale == void 0) {
  66232. options.scale = {
  66233. x: 0.1,
  66234. y: 0.1,
  66235. z: 0.1
  66236. };
  66237. } else if (options.position == void 0) {
  66238. options.position = {
  66239. x: 0,
  66240. y: 0,
  66241. z: 0
  66242. };
  66243. } else if (options.quaternion == void 0) {
  66244. options.quaternion = {
  66245. x: 0,
  66246. y: 0,
  66247. z: 0,
  66248. w: 1
  66249. };
  66250. }
  66251. this.app.Scene.whenLoaded(function () {
  66252. if (_this.player == null) {
  66253. _this.player = _this.app.core.get('Player');
  66254. }
  66255. if (_this.player.GLTFEditor == void 0) {
  66256. _this.player.GLTFEditor = new GLTFAddManager(_this.player);
  66257. }
  66258. _this.player.GLTFEditor.add(_objectSpread({
  66259. url,
  66260. sid: options.sid || String(_this.player.GLTFEditor.group.children.length),
  66261. panoId: options.panoId || _this.app.Scene.panos.list[0].id,
  66262. visible: true
  66263. }, options));
  66264. });
  66265. }
  66266. }, {
  66267. key: "load",
  66268. value: function load(data) {
  66269. var _this2 = this;
  66270. if (Array.isArray(data)) {
  66271. data.forEach(function (item) {
  66272. return _this2.add(item.url, item.options);
  66273. });
  66274. }
  66275. }
  66276. }, {
  66277. key: "enter",
  66278. value: function enter() {
  66279. var _this3 = this;
  66280. this.app.Scene.whenLoaded(function () {
  66281. if (_this3.player == null) {
  66282. _this3.player = _this3.app.core.get('Player');
  66283. }
  66284. if (_this3.player.GLTFEditor == void 0) {
  66285. _this3.player.GLTFEditor = new GLTFAddManager(_this3.player);
  66286. }
  66287. _this3.player.GLTFEditor.editing = true;
  66288. });
  66289. }
  66290. }, {
  66291. key: "leave",
  66292. value: function leave() {
  66293. if (this.player) {
  66294. this.player.GLTFEditor.editing = false;
  66295. }
  66296. }
  66297. }, {
  66298. key: "select",
  66299. value: function select(sid) {
  66300. if (this.player === null) {
  66301. return;
  66302. }
  66303. sid = String(sid);
  66304. var gltf = this.player.GLTFEditor.group.children.find(function (gltf) {
  66305. return gltf.sid === sid;
  66306. });
  66307. if (gltf) {
  66308. this.player.GLTFEditor.select(gltf);
  66309. this.player.flyToPano({
  66310. pano: this.player.model.panos.get(gltf.panoId),
  66311. lookAtPoint: gltf.position,
  66312. checkAlone: true
  66313. });
  66314. }
  66315. }
  66316. }, {
  66317. key: "unselect",
  66318. value: function unselect() {
  66319. this.player.GLTFEditor.unselect();
  66320. }
  66321. }, {
  66322. key: "remove",
  66323. value: function remove(sid) {
  66324. var _this4 = this;
  66325. if (!this.player || !this.player.GLTFEditor) {
  66326. return;
  66327. }
  66328. if (sid == void 0) {
  66329. this.player.GLTFEditor.group.children.forEach(function (gltf) {
  66330. _this4.player.GLTFEditor.delete(gltf);
  66331. });
  66332. } else {
  66333. sid = String(sid);
  66334. var gltf = this.player.GLTFEditor.group.children.find(function (gltf) {
  66335. return gltf.sid === sid;
  66336. });
  66337. if (gltf) {
  66338. this.player.GLTFEditor.delete(gltf);
  66339. }
  66340. }
  66341. }
  66342. }, {
  66343. key: "transformMode",
  66344. value: function transformMode(mode) {
  66345. if (this.player === null) {
  66346. return;
  66347. }
  66348. if ('translate,rotate,scale'.indexOf(mode) === -1) {
  66349. return;
  66350. }
  66351. this.player.model.transformControls.mode = mode;
  66352. }
  66353. }, {
  66354. key: "toJSON",
  66355. value: function toJSON() {
  66356. if (!this.player || !this.player.GLTFEditor) {
  66357. return null;
  66358. }
  66359. if (this.player.GLTFEditor.selecting) {
  66360. var model = this.player.GLTFEditor.selecting;
  66361. var info = {
  66362. url: model.url,
  66363. options: {
  66364. sid: model.sid,
  66365. panoId: model.panoId,
  66366. position: {
  66367. x: parseFloat(model.position.x.toFixed(2)),
  66368. y: parseFloat(model.position.y.toFixed(2)),
  66369. z: parseFloat(model.position.z.toFixed(2))
  66370. },
  66371. scale: {
  66372. x: parseFloat(model.scale.x.toFixed(1)),
  66373. y: parseFloat(model.scale.y.toFixed(1)),
  66374. z: parseFloat(model.scale.z.toFixed(1))
  66375. },
  66376. quaternion: {
  66377. x: parseFloat(model.quaternion.x.toFixed(3)),
  66378. y: parseFloat(model.quaternion.y.toFixed(3)),
  66379. z: parseFloat(model.quaternion.z.toFixed(3)),
  66380. w: parseFloat(model.quaternion.w.toFixed(3))
  66381. },
  66382. visible: model.visible
  66383. }
  66384. };
  66385. return info;
  66386. } else {
  66387. return this.player.GLTFEditor.group.children.map(function (model) {
  66388. return {
  66389. url: model.url,
  66390. options: {
  66391. sid: model.sid,
  66392. panoId: model.panoId,
  66393. position: {
  66394. x: parseFloat(model.position.x.toFixed(2)),
  66395. y: parseFloat(model.position.y.toFixed(2)),
  66396. z: parseFloat(model.position.z.toFixed(2))
  66397. },
  66398. scale: {
  66399. x: parseFloat(model.scale.x.toFixed(1)),
  66400. y: parseFloat(model.scale.y.toFixed(1)),
  66401. z: parseFloat(model.scale.z.toFixed(1))
  66402. },
  66403. quaternion: {
  66404. x: parseFloat(model.quaternion.x.toFixed(3)),
  66405. y: parseFloat(model.quaternion.y.toFixed(3)),
  66406. z: parseFloat(model.quaternion.z.toFixed(3)),
  66407. w: parseFloat(model.quaternion.w.toFixed(3))
  66408. },
  66409. visible: model.visible
  66410. }
  66411. };
  66412. });
  66413. }
  66414. }
  66415. }]);
  66416. return ModelManager;
  66417. }();
  66418. function setup(app) {
  66419. app.APIs = APIs(app);
  66420. app.Scene = new Scene(app);
  66421. app.Camera = new Camera(app);
  66422. app.MinMap = new MinMap(app);
  66423. app.DataSYNC = new DataSYNC(app);
  66424. app.MarkManager = new ObjectManager(app);
  66425. app.VideoManager = new VideoManager(app);
  66426. app.RepairManager = new RepairManager(app);
  66427. app.ClipBoxManager = new ClipBoxManager(app);
  66428. app.CSS3DManager = new CSS3DManager(app);
  66429. app.PolygonMarkManager = new PolygonMarkManager(app);
  66430. app.PanoVideoManager = new PanoVideoManager(app);
  66431. app.TourManager = new TourManager(app);
  66432. app.Editor = new Editor(app);
  66433. app.Connect = new Broadcast(app);
  66434. app.Billboard = new Billboard(app);
  66435. app.Screenshot = new Screenshot(app);
  66436. app.ViewLinkEdit = new ViewLinkEdit(app);
  66437. app.FilterManager = new FilterManager(app);
  66438. app.ConvertViews = new ConvertViews();
  66439. if (app.config.edition) {
  66440. app.TagManager = new TagManager(app);
  66441. app.CadManager = new CadManager(app);
  66442. app.WalkManager = new WalkManager(app);
  66443. } else {
  66444. app.TagManager = new TagManager$1(app);
  66445. app.CadManager = new CadManager$1(app);
  66446. app.WalkManager = new WalkManager$1(app);
  66447. }
  66448. app.ModelManager = new ModelManager(app);
  66449. }
  66450. var convert = {
  66451. /**
  66452. * 2d转3d1
  66453. * @param {*} x
  66454. * @param {*} y
  66455. * @param {*} player
  66456. * @returns
  66457. */
  66458. pointFrom2DTo3D(_ref, player, camera, element) {
  66459. var x = _ref.x,
  66460. y = _ref.y;
  66461. if (!camera) {
  66462. camera = player.camera;
  66463. }
  66464. if (!element) {
  66465. element = player.domElement;
  66466. }
  66467. var position = new THREE.Vector3(0, 0, 0);
  66468. math$1.convertScreenPositionToNDC(x, y, position, element);
  66469. position.unproject(camera);
  66470. position.y = 0;
  66471. return position;
  66472. },
  66473. /**
  66474. * 3d转2d
  66475. * @param {*} position
  66476. * @returns
  66477. */
  66478. pointFrom3DTo2D(position, player, camera, element) {
  66479. var vector = position;
  66480. if (!camera) {
  66481. camera = player.camera;
  66482. }
  66483. if (!element) {
  66484. element = player.domElement;
  66485. }
  66486. if (position instanceof THREE.Vector3 === false) {
  66487. vector = new THREE.Vector3(vector.x || 0, vector.y || 0, vector.z || 0);
  66488. }
  66489. return convertTool.getPos2d(vector, player, camera, element).pos;
  66490. }
  66491. };
  66492. function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
  66493. function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
  66494. function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  66495. function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
  66496. function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
  66497. var _default = /*#__PURE__*/function (_KanKan) {
  66498. _inherits(_default, _KanKan);
  66499. var _super = _createSuper(_default);
  66500. function _default(options) {
  66501. var _this;
  66502. _classCallCheck(this, _default);
  66503. _this = _super.call(this, options);
  66504. _this.withComponent('store');
  66505. _this.withComponent('resource');
  66506. _this.withComponent('Scene');
  66507. if (_this.config.dom) {
  66508. _this.withDom();
  66509. }
  66510. _this.remote_editor = editApis;
  66511. _this.remote_viewer = viewApis;
  66512. setup(_assertThisInitialized(_this));
  66513. setup$1(_assertThisInitialized(_this));
  66514. if (_this.config.useStatistics) {
  66515. window._hmt = window._hmt || [];
  66516. (function () {
  66517. var hm = document.createElement('script');
  66518. hm.src = 'https://hm.baidu.com/hm.js?aa59943d9a481ab824cf054f2d463ca2';
  66519. var s = document.getElementsByTagName('script')[0];
  66520. s.parentNode.insertBefore(hm, s);
  66521. })();
  66522. }
  66523. var plugins = browser$1.valueFromUrl('app_plugins');
  66524. if (plugins) {
  66525. plugins.split(',').forEach(function (plugin) {
  66526. if (plugin) {
  66527. _this.use(plugin);
  66528. }
  66529. });
  66530. } // const medici = Medici.init({
  66531. // platform: 'web',
  66532. // appId: '7b5958d5-1ae6-4ad5-8a87-5fc8a4b92999',
  66533. // // endPoint: 'https://v4-test.4dkankan.com', //服务器
  66534. // endPoint: '/track_api', //服务器
  66535. // config: {
  66536. // version: '1', //配置要track当前版本
  66537. // },
  66538. // })
  66539. // KanKan.medici = medici
  66540. return _this;
  66541. }
  66542. _createClass(_default, [{
  66543. key: "use",
  66544. value: function use(plugin, config) {
  66545. var _this2 = this;
  66546. if (typeof plugin === 'string') {
  66547. if (this.Plugins[plugin]) {
  66548. return Promise.resolve(this.Plugins[plugin]);
  66549. }
  66550. return usePlugin(plugin, this.config.version + '-' + Date.now()).then(function (name) {
  66551. return _this2.Plugins.add(window[name], config);
  66552. });
  66553. } else if (typeof plugin === 'function') {
  66554. return this.Plugins.add(plugin, config);
  66555. }
  66556. }
  66557. }, {
  66558. key: "mount",
  66559. value: function mount(el) {
  66560. if (!el) {
  66561. throw new Error('el must be require');
  66562. }
  66563. this.config.dom = el;
  66564. this.withDom();
  66565. return this;
  66566. }
  66567. }, {
  66568. key: "render",
  66569. value: function render() {
  66570. this.core.get('Scene').start();
  66571. return this;
  66572. }
  66573. }, {
  66574. key: "metadata",
  66575. value: function metadata(data) {
  66576. if (data === void 0) {
  66577. this.store.set('metadata');
  66578. return this;
  66579. }
  66580. return this.store.get('metadata');
  66581. }
  66582. }, {
  66583. key: "destroy",
  66584. value: function destroy() {
  66585. console.log('dispose renderer!');
  66586. var scene = this.core.get('SceneRenderer').scene;
  66587. this.core.get('SceneRenderer').renderer.dispose();
  66588. this.core.get('SceneRenderer').started = false;
  66589. var cleanMaterial = function cleanMaterial(material) {
  66590. console.log('dispose material!');
  66591. material.dispose(); // dispose textures
  66592. for (var _i = 0, _Object$keys = Object.keys(material); _i < _Object$keys.length; _i++) {
  66593. var key = _Object$keys[_i];
  66594. var value = material[key];
  66595. if (value && typeof value === 'object' && 'minFilter' in value) {
  66596. console.log('dispose texture!');
  66597. value.dispose();
  66598. }
  66599. }
  66600. };
  66601. scene.traverse(function (object) {
  66602. if (!object.isMesh) return;
  66603. console.log('dispose geometry!');
  66604. object.geometry.dispose();
  66605. if (object.material.isMaterial) {
  66606. cleanMaterial(object.material);
  66607. } else {
  66608. // an array of materials
  66609. var _iterator = _createForOfIteratorHelper(object.material),
  66610. _step;
  66611. try {
  66612. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  66613. var material = _step.value;
  66614. cleanMaterial(material);
  66615. }
  66616. } catch (err) {
  66617. _iterator.e(err);
  66618. } finally {
  66619. _iterator.f();
  66620. }
  66621. }
  66622. });
  66623. }
  66624. }]);
  66625. return _default;
  66626. }(KanKan);
  66627. _default.MITT = {
  66628. Emiter: tinyEmitter
  66629. };
  66630. _default.Utils = {
  66631. http,
  66632. file,
  66633. math: math$1,
  66634. convert,
  66635. MathLight
  66636. };
  66637. _default.Animate = {
  66638. transitions: transitions$1,
  66639. easing,
  66640. lerp
  66641. };
  66642. _default.Viewmode = Viewmode$1;
  66643. _default.THREE = THREE;
  66644. _default.Deferred = Deferred$1;
  66645. window.PetiteVue = PetiteVue;
  66646. return _default;
  66647. })));
  66648. //# sourceMappingURL=kankan-sdk.js.map