kankan-sdk.js 4.2 MB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841238422384323844238452384623847238482384923850238512385223853238542385523856238572385823859238602386123862238632386423865238662386723868238692387023871238722387323874238752387623877238782387923880238812388223883238842388523886238872388823889238902389123892238932389423895238962389723898238992390023901239022390323904239052390623907239082390923910239112391223913239142391523916239172391823919239202392123922239232392423925239262392723928239292393023931239322393323934239352393623937239382393923940239412394223943239442394523946239472394823949239502395123952239532395423955239562395723958239592396023961239622396323964239652396623967239682396923970239712397223973239742397523976239772397823979239802398123982239832398423985239862398723988239892399023991239922399323994239952399623997239982399924000240012400224003240042400524006240072400824009240102401124012240132401424015240162401724018240192402024021240222402324024240252402624027240282402924030240312403224033240342403524036240372403824039240402404124042240432404424045240462404724048240492405024051240522405324054240552405624057240582405924060240612406224063240642406524066240672406824069240702407124072240732407424075240762407724078240792408024081240822408324084240852408624087240882408924090240912409224093240942409524096240972409824099241002410124102241032410424105241062410724108241092411024111241122411324114241152411624117241182411924120241212412224123241242412524126241272412824129241302413124132241332413424135241362413724138241392414024141241422414324144241452414624147241482414924150241512415224153241542415524156241572415824159241602416124162241632416424165241662416724168241692417024171241722417324174241752417624177241782417924180241812418224183241842418524186241872418824189241902419124192241932419424195241962419724198241992420024201242022420324204242052420624207242082420924210242112421224213242142421524216242172421824219242202422124222242232422424225242262422724228242292423024231242322423324234242352423624237242382423924240242412424224243242442424524246242472424824249242502425124252242532425424255242562425724258242592426024261242622426324264242652426624267242682426924270242712427224273242742427524276242772427824279242802428124282242832428424285242862428724288242892429024291242922429324294242952429624297242982429924300243012430224303243042430524306243072430824309243102431124312243132431424315243162431724318243192432024321243222432324324243252432624327243282432924330243312433224333243342433524336243372433824339243402434124342243432434424345243462434724348243492435024351243522435324354243552435624357243582435924360243612436224363243642436524366243672436824369243702437124372243732437424375243762437724378243792438024381243822438324384243852438624387243882438924390243912439224393243942439524396243972439824399244002440124402244032440424405244062440724408244092441024411244122441324414244152441624417244182441924420244212442224423244242442524426244272442824429244302443124432244332443424435244362443724438244392444024441244422444324444244452444624447244482444924450244512445224453244542445524456244572445824459244602446124462244632446424465244662446724468244692447024471244722447324474244752447624477244782447924480244812448224483244842448524486244872448824489244902449124492244932449424495244962449724498244992450024501245022450324504245052450624507245082450924510245112451224513245142451524516245172451824519245202452124522245232452424525245262452724528245292453024531245322453324534245352453624537245382453924540245412454224543245442454524546245472454824549245502455124552245532455424555245562455724558245592456024561245622456324564245652456624567245682456924570245712457224573245742457524576245772457824579245802458124582245832458424585245862458724588245892459024591245922459324594245952459624597245982459924600246012460224603246042460524606246072460824609246102461124612246132461424615246162461724618246192462024621246222462324624246252462624627246282462924630246312463224633246342463524636246372463824639246402464124642246432464424645246462464724648246492465024651246522465324654246552465624657246582465924660246612466224663246642466524666246672466824669246702467124672246732467424675246762467724678246792468024681246822468324684246852468624687246882468924690246912469224693246942469524696246972469824699247002470124702247032470424705247062470724708247092471024711247122471324714247152471624717247182471924720247212472224723247242472524726247272472824729247302473124732247332473424735247362473724738247392474024741247422474324744247452474624747247482474924750247512475224753247542475524756247572475824759247602476124762247632476424765247662476724768247692477024771247722477324774247752477624777247782477924780247812478224783247842478524786247872478824789247902479124792247932479424795247962479724798247992480024801248022480324804248052480624807248082480924810248112481224813248142481524816248172481824819248202482124822248232482424825248262482724828248292483024831248322483324834248352483624837248382483924840248412484224843248442484524846248472484824849248502485124852248532485424855248562485724858248592486024861248622486324864248652486624867248682486924870248712487224873248742487524876248772487824879248802488124882248832488424885248862488724888248892489024891248922489324894248952489624897248982489924900249012490224903249042490524906249072490824909249102491124912249132491424915249162491724918249192492024921249222492324924249252492624927249282492924930249312493224933249342493524936249372493824939249402494124942249432494424945249462494724948249492495024951249522495324954249552495624957249582495924960249612496224963249642496524966249672496824969249702497124972249732497424975249762497724978249792498024981249822498324984249852498624987249882498924990249912499224993249942499524996249972499824999250002500125002250032500425005250062500725008250092501025011250122501325014250152501625017250182501925020250212502225023250242502525026250272502825029250302503125032250332503425035250362503725038250392504025041250422504325044250452504625047250482504925050250512505225053250542505525056250572505825059250602506125062250632506425065250662506725068250692507025071250722507325074250752507625077250782507925080250812508225083250842508525086250872508825089250902509125092250932509425095250962509725098250992510025101251022510325104251052510625107251082510925110251112511225113251142511525116251172511825119251202512125122251232512425125251262512725128251292513025131251322513325134251352513625137251382513925140251412514225143251442514525146251472514825149251502515125152251532515425155251562515725158251592516025161251622516325164251652516625167251682516925170251712517225173251742517525176251772517825179251802518125182251832518425185251862518725188251892519025191251922519325194251952519625197251982519925200252012520225203252042520525206252072520825209252102521125212252132521425215252162521725218252192522025221252222522325224252252522625227252282522925230252312523225233252342523525236252372523825239252402524125242252432524425245252462524725248252492525025251252522525325254252552525625257252582525925260252612526225263252642526525266252672526825269252702527125272252732527425275252762527725278252792528025281252822528325284252852528625287252882528925290252912529225293252942529525296252972529825299253002530125302253032530425305253062530725308253092531025311253122531325314253152531625317253182531925320253212532225323253242532525326253272532825329253302533125332253332533425335253362533725338253392534025341253422534325344253452534625347253482534925350253512535225353253542535525356253572535825359253602536125362253632536425365253662536725368253692537025371253722537325374253752537625377253782537925380253812538225383253842538525386253872538825389253902539125392253932539425395253962539725398253992540025401254022540325404254052540625407254082540925410254112541225413254142541525416254172541825419254202542125422254232542425425254262542725428254292543025431254322543325434254352543625437254382543925440254412544225443254442544525446254472544825449254502545125452254532545425455254562545725458254592546025461254622546325464254652546625467254682546925470254712547225473254742547525476254772547825479254802548125482254832548425485254862548725488254892549025491254922549325494254952549625497254982549925500255012550225503255042550525506255072550825509255102551125512255132551425515255162551725518255192552025521255222552325524255252552625527255282552925530255312553225533255342553525536255372553825539255402554125542255432554425545255462554725548255492555025551255522555325554255552555625557255582555925560255612556225563255642556525566255672556825569255702557125572255732557425575255762557725578255792558025581255822558325584255852558625587255882558925590255912559225593255942559525596255972559825599256002560125602256032560425605256062560725608256092561025611256122561325614256152561625617256182561925620256212562225623256242562525626256272562825629256302563125632256332563425635256362563725638256392564025641256422564325644256452564625647256482564925650256512565225653256542565525656256572565825659256602566125662256632566425665256662566725668256692567025671256722567325674256752567625677256782567925680256812568225683256842568525686256872568825689256902569125692256932569425695256962569725698256992570025701257022570325704257052570625707257082570925710257112571225713257142571525716257172571825719257202572125722257232572425725257262572725728257292573025731257322573325734257352573625737257382573925740257412574225743257442574525746257472574825749257502575125752257532575425755257562575725758257592576025761257622576325764257652576625767257682576925770257712577225773257742577525776257772577825779257802578125782257832578425785257862578725788257892579025791257922579325794257952579625797257982579925800258012580225803258042580525806258072580825809258102581125812258132581425815258162581725818258192582025821258222582325824258252582625827258282582925830258312583225833258342583525836258372583825839258402584125842258432584425845258462584725848258492585025851258522585325854258552585625857258582585925860258612586225863258642586525866258672586825869258702587125872258732587425875258762587725878258792588025881258822588325884258852588625887258882588925890258912589225893258942589525896258972589825899259002590125902259032590425905259062590725908259092591025911259122591325914259152591625917259182591925920259212592225923259242592525926259272592825929259302593125932259332593425935259362593725938259392594025941259422594325944259452594625947259482594925950259512595225953259542595525956259572595825959259602596125962259632596425965259662596725968259692597025971259722597325974259752597625977259782597925980259812598225983259842598525986259872598825989259902599125992259932599425995259962599725998259992600026001260022600326004260052600626007260082600926010260112601226013260142601526016260172601826019260202602126022260232602426025260262602726028260292603026031260322603326034260352603626037260382603926040260412604226043260442604526046260472604826049260502605126052260532605426055260562605726058260592606026061260622606326064260652606626067260682606926070260712607226073260742607526076260772607826079260802608126082260832608426085260862608726088260892609026091260922609326094260952609626097260982609926100261012610226103261042610526106261072610826109261102611126112261132611426115261162611726118261192612026121261222612326124261252612626127261282612926130261312613226133261342613526136261372613826139261402614126142261432614426145261462614726148261492615026151261522615326154261552615626157261582615926160261612616226163261642616526166261672616826169261702617126172261732617426175261762617726178261792618026181261822618326184261852618626187261882618926190261912619226193261942619526196261972619826199262002620126202262032620426205262062620726208262092621026211262122621326214262152621626217262182621926220262212622226223262242622526226262272622826229262302623126232262332623426235262362623726238262392624026241262422624326244262452624626247262482624926250262512625226253262542625526256262572625826259262602626126262262632626426265262662626726268262692627026271262722627326274262752627626277262782627926280262812628226283262842628526286262872628826289262902629126292262932629426295262962629726298262992630026301263022630326304263052630626307263082630926310263112631226313263142631526316263172631826319263202632126322263232632426325263262632726328263292633026331263322633326334263352633626337263382633926340263412634226343263442634526346263472634826349263502635126352263532635426355263562635726358263592636026361263622636326364263652636626367263682636926370263712637226373263742637526376263772637826379263802638126382263832638426385263862638726388263892639026391263922639326394263952639626397263982639926400264012640226403264042640526406264072640826409264102641126412264132641426415264162641726418264192642026421264222642326424264252642626427264282642926430264312643226433264342643526436264372643826439264402644126442264432644426445264462644726448264492645026451264522645326454264552645626457264582645926460264612646226463264642646526466264672646826469264702647126472264732647426475264762647726478264792648026481264822648326484264852648626487264882648926490264912649226493264942649526496264972649826499265002650126502265032650426505265062650726508265092651026511265122651326514265152651626517265182651926520265212652226523265242652526526265272652826529265302653126532265332653426535265362653726538265392654026541265422654326544265452654626547265482654926550265512655226553265542655526556265572655826559265602656126562265632656426565265662656726568265692657026571265722657326574265752657626577265782657926580265812658226583265842658526586265872658826589265902659126592265932659426595265962659726598265992660026601266022660326604266052660626607266082660926610266112661226613266142661526616266172661826619266202662126622266232662426625266262662726628266292663026631266322663326634266352663626637266382663926640266412664226643266442664526646266472664826649266502665126652266532665426655266562665726658266592666026661266622666326664266652666626667266682666926670266712667226673266742667526676266772667826679266802668126682266832668426685266862668726688266892669026691266922669326694266952669626697266982669926700267012670226703267042670526706267072670826709267102671126712267132671426715267162671726718267192672026721267222672326724267252672626727267282672926730267312673226733267342673526736267372673826739267402674126742267432674426745267462674726748267492675026751267522675326754267552675626757267582675926760267612676226763267642676526766267672676826769267702677126772267732677426775267762677726778267792678026781267822678326784267852678626787267882678926790267912679226793267942679526796267972679826799268002680126802268032680426805268062680726808268092681026811268122681326814268152681626817268182681926820268212682226823268242682526826268272682826829268302683126832268332683426835268362683726838268392684026841268422684326844268452684626847268482684926850268512685226853268542685526856268572685826859268602686126862268632686426865268662686726868268692687026871268722687326874268752687626877268782687926880268812688226883268842688526886268872688826889268902689126892268932689426895268962689726898268992690026901269022690326904269052690626907269082690926910269112691226913269142691526916269172691826919269202692126922269232692426925269262692726928269292693026931269322693326934269352693626937269382693926940269412694226943269442694526946269472694826949269502695126952269532695426955269562695726958269592696026961269622696326964269652696626967269682696926970269712697226973269742697526976269772697826979269802698126982269832698426985269862698726988269892699026991269922699326994269952699626997269982699927000270012700227003270042700527006270072700827009270102701127012270132701427015270162701727018270192702027021270222702327024270252702627027270282702927030270312703227033270342703527036270372703827039270402704127042270432704427045270462704727048270492705027051270522705327054270552705627057270582705927060270612706227063270642706527066270672706827069270702707127072270732707427075270762707727078270792708027081270822708327084270852708627087270882708927090270912709227093270942709527096270972709827099271002710127102271032710427105271062710727108271092711027111271122711327114271152711627117271182711927120271212712227123271242712527126271272712827129271302713127132271332713427135271362713727138271392714027141271422714327144271452714627147271482714927150271512715227153271542715527156271572715827159271602716127162271632716427165271662716727168271692717027171271722717327174271752717627177271782717927180271812718227183271842718527186271872718827189271902719127192271932719427195271962719727198271992720027201272022720327204272052720627207272082720927210272112721227213272142721527216272172721827219272202722127222272232722427225272262722727228272292723027231272322723327234272352723627237272382723927240272412724227243272442724527246272472724827249272502725127252272532725427255272562725727258272592726027261272622726327264272652726627267272682726927270272712727227273272742727527276272772727827279272802728127282272832728427285272862728727288272892729027291272922729327294272952729627297272982729927300273012730227303273042730527306273072730827309273102731127312273132731427315273162731727318273192732027321273222732327324273252732627327273282732927330273312733227333273342733527336273372733827339273402734127342273432734427345273462734727348273492735027351273522735327354273552735627357273582735927360273612736227363273642736527366273672736827369273702737127372273732737427375273762737727378273792738027381273822738327384273852738627387273882738927390273912739227393273942739527396273972739827399274002740127402274032740427405274062740727408274092741027411274122741327414274152741627417274182741927420274212742227423274242742527426274272742827429274302743127432274332743427435274362743727438274392744027441274422744327444274452744627447274482744927450274512745227453274542745527456274572745827459274602746127462274632746427465274662746727468274692747027471274722747327474274752747627477274782747927480274812748227483274842748527486274872748827489274902749127492274932749427495274962749727498274992750027501275022750327504275052750627507275082750927510275112751227513275142751527516275172751827519275202752127522275232752427525275262752727528275292753027531275322753327534275352753627537275382753927540275412754227543275442754527546275472754827549275502755127552275532755427555275562755727558275592756027561275622756327564275652756627567275682756927570275712757227573275742757527576275772757827579275802758127582275832758427585275862758727588275892759027591275922759327594275952759627597275982759927600276012760227603276042760527606276072760827609276102761127612276132761427615276162761727618276192762027621276222762327624276252762627627276282762927630276312763227633276342763527636276372763827639276402764127642276432764427645276462764727648276492765027651276522765327654276552765627657276582765927660276612766227663276642766527666276672766827669276702767127672276732767427675276762767727678276792768027681276822768327684276852768627687276882768927690276912769227693276942769527696276972769827699277002770127702277032770427705277062770727708277092771027711277122771327714277152771627717277182771927720277212772227723277242772527726277272772827729277302773127732277332773427735277362773727738277392774027741277422774327744277452774627747277482774927750277512775227753277542775527756277572775827759277602776127762277632776427765277662776727768277692777027771277722777327774277752777627777277782777927780277812778227783277842778527786277872778827789277902779127792277932779427795277962779727798277992780027801278022780327804278052780627807278082780927810278112781227813278142781527816278172781827819278202782127822278232782427825278262782727828278292783027831278322783327834278352783627837278382783927840278412784227843278442784527846278472784827849278502785127852278532785427855278562785727858278592786027861278622786327864278652786627867278682786927870278712787227873278742787527876278772787827879278802788127882278832788427885278862788727888278892789027891278922789327894278952789627897278982789927900279012790227903279042790527906279072790827909279102791127912279132791427915279162791727918279192792027921279222792327924279252792627927279282792927930279312793227933279342793527936279372793827939279402794127942279432794427945279462794727948279492795027951279522795327954279552795627957279582795927960279612796227963279642796527966279672796827969279702797127972279732797427975279762797727978279792798027981279822798327984279852798627987279882798927990279912799227993279942799527996279972799827999280002800128002280032800428005280062800728008280092801028011280122801328014280152801628017280182801928020280212802228023280242802528026280272802828029280302803128032280332803428035280362803728038280392804028041280422804328044280452804628047280482804928050280512805228053280542805528056280572805828059280602806128062280632806428065280662806728068280692807028071280722807328074280752807628077280782807928080280812808228083280842808528086280872808828089280902809128092280932809428095280962809728098280992810028101281022810328104281052810628107281082810928110281112811228113281142811528116281172811828119281202812128122281232812428125281262812728128281292813028131281322813328134281352813628137281382813928140281412814228143281442814528146281472814828149281502815128152281532815428155281562815728158281592816028161281622816328164281652816628167281682816928170281712817228173281742817528176281772817828179281802818128182281832818428185281862818728188281892819028191281922819328194281952819628197281982819928200282012820228203282042820528206282072820828209282102821128212282132821428215282162821728218282192822028221282222822328224282252822628227282282822928230282312823228233282342823528236282372823828239282402824128242282432824428245282462824728248282492825028251282522825328254282552825628257282582825928260282612826228263282642826528266282672826828269282702827128272282732827428275282762827728278282792828028281282822828328284282852828628287282882828928290282912829228293282942829528296282972829828299283002830128302283032830428305283062830728308283092831028311283122831328314283152831628317283182831928320283212832228323283242832528326283272832828329283302833128332283332833428335283362833728338283392834028341283422834328344283452834628347283482834928350283512835228353283542835528356283572835828359283602836128362283632836428365283662836728368283692837028371283722837328374283752837628377283782837928380283812838228383283842838528386283872838828389283902839128392283932839428395283962839728398283992840028401284022840328404284052840628407284082840928410284112841228413284142841528416284172841828419284202842128422284232842428425284262842728428284292843028431284322843328434284352843628437284382843928440284412844228443284442844528446284472844828449284502845128452284532845428455284562845728458284592846028461284622846328464284652846628467284682846928470284712847228473284742847528476284772847828479284802848128482284832848428485284862848728488284892849028491284922849328494284952849628497284982849928500285012850228503285042850528506285072850828509285102851128512285132851428515285162851728518285192852028521285222852328524285252852628527285282852928530285312853228533285342853528536285372853828539285402854128542285432854428545285462854728548285492855028551285522855328554285552855628557285582855928560285612856228563285642856528566285672856828569285702857128572285732857428575285762857728578285792858028581285822858328584285852858628587285882858928590285912859228593285942859528596285972859828599286002860128602286032860428605286062860728608286092861028611286122861328614286152861628617286182861928620286212862228623286242862528626286272862828629286302863128632286332863428635286362863728638286392864028641286422864328644286452864628647286482864928650286512865228653286542865528656286572865828659286602866128662286632866428665286662866728668286692867028671286722867328674286752867628677286782867928680286812868228683286842868528686286872868828689286902869128692286932869428695286962869728698286992870028701287022870328704287052870628707287082870928710287112871228713287142871528716287172871828719287202872128722287232872428725287262872728728287292873028731287322873328734287352873628737287382873928740287412874228743287442874528746287472874828749287502875128752287532875428755287562875728758287592876028761287622876328764287652876628767287682876928770287712877228773287742877528776287772877828779287802878128782287832878428785287862878728788287892879028791287922879328794287952879628797287982879928800288012880228803288042880528806288072880828809288102881128812288132881428815288162881728818288192882028821288222882328824288252882628827288282882928830288312883228833288342883528836288372883828839288402884128842288432884428845288462884728848288492885028851288522885328854288552885628857288582885928860288612886228863288642886528866288672886828869288702887128872288732887428875288762887728878288792888028881288822888328884288852888628887288882888928890288912889228893288942889528896288972889828899289002890128902289032890428905289062890728908289092891028911289122891328914289152891628917289182891928920289212892228923289242892528926289272892828929289302893128932289332893428935289362893728938289392894028941289422894328944289452894628947289482894928950289512895228953289542895528956289572895828959289602896128962289632896428965289662896728968289692897028971289722897328974289752897628977289782897928980289812898228983289842898528986289872898828989289902899128992289932899428995289962899728998289992900029001290022900329004290052900629007290082900929010290112901229013290142901529016290172901829019290202902129022290232902429025290262902729028290292903029031290322903329034290352903629037290382903929040290412904229043290442904529046290472904829049290502905129052290532905429055290562905729058290592906029061290622906329064290652906629067290682906929070290712907229073290742907529076290772907829079290802908129082290832908429085290862908729088290892909029091290922909329094290952909629097290982909929100291012910229103291042910529106291072910829109291102911129112291132911429115291162911729118291192912029121291222912329124291252912629127291282912929130291312913229133291342913529136291372913829139291402914129142291432914429145291462914729148291492915029151291522915329154291552915629157291582915929160291612916229163291642916529166291672916829169291702917129172291732917429175291762917729178291792918029181291822918329184291852918629187291882918929190291912919229193291942919529196291972919829199292002920129202292032920429205292062920729208292092921029211292122921329214292152921629217292182921929220292212922229223292242922529226292272922829229292302923129232292332923429235292362923729238292392924029241292422924329244292452924629247292482924929250292512925229253292542925529256292572925829259292602926129262292632926429265292662926729268292692927029271292722927329274292752927629277292782927929280292812928229283292842928529286292872928829289292902929129292292932929429295292962929729298292992930029301293022930329304293052930629307293082930929310293112931229313293142931529316293172931829319293202932129322293232932429325293262932729328293292933029331293322933329334293352933629337293382933929340293412934229343293442934529346293472934829349293502935129352293532935429355293562935729358293592936029361293622936329364293652936629367293682936929370293712937229373293742937529376293772937829379293802938129382293832938429385293862938729388293892939029391293922939329394293952939629397293982939929400294012940229403294042940529406294072940829409294102941129412294132941429415294162941729418294192942029421294222942329424294252942629427294282942929430294312943229433294342943529436294372943829439294402944129442294432944429445294462944729448294492945029451294522945329454294552945629457294582945929460294612946229463294642946529466294672946829469294702947129472294732947429475294762947729478294792948029481294822948329484294852948629487294882948929490294912949229493294942949529496294972949829499295002950129502295032950429505295062950729508295092951029511295122951329514295152951629517295182951929520295212952229523295242952529526295272952829529295302953129532295332953429535295362953729538295392954029541295422954329544295452954629547295482954929550295512955229553295542955529556295572955829559295602956129562295632956429565295662956729568295692957029571295722957329574295752957629577295782957929580295812958229583295842958529586295872958829589295902959129592295932959429595295962959729598295992960029601296022960329604296052960629607296082960929610296112961229613296142961529616296172961829619296202962129622296232962429625296262962729628296292963029631296322963329634296352963629637296382963929640296412964229643296442964529646296472964829649296502965129652296532965429655296562965729658296592966029661296622966329664296652966629667296682966929670296712967229673296742967529676296772967829679296802968129682296832968429685296862968729688296892969029691296922969329694296952969629697296982969929700297012970229703297042970529706297072970829709297102971129712297132971429715297162971729718297192972029721297222972329724297252972629727297282972929730297312973229733297342973529736297372973829739297402974129742297432974429745297462974729748297492975029751297522975329754297552975629757297582975929760297612976229763297642976529766297672976829769297702977129772297732977429775297762977729778297792978029781297822978329784297852978629787297882978929790297912979229793297942979529796297972979829799298002980129802298032980429805298062980729808298092981029811298122981329814298152981629817298182981929820298212982229823298242982529826298272982829829298302983129832298332983429835298362983729838298392984029841298422984329844298452984629847298482984929850298512985229853298542985529856298572985829859298602986129862298632986429865298662986729868298692987029871298722987329874298752987629877298782987929880298812988229883298842988529886298872988829889298902989129892298932989429895298962989729898298992990029901299022990329904299052990629907299082990929910299112991229913299142991529916299172991829919299202992129922299232992429925299262992729928299292993029931299322993329934299352993629937299382993929940299412994229943299442994529946299472994829949299502995129952299532995429955299562995729958299592996029961299622996329964299652996629967299682996929970299712997229973299742997529976299772997829979299802998129982299832998429985299862998729988299892999029991299922999329994299952999629997299982999930000300013000230003300043000530006300073000830009300103001130012300133001430015300163001730018300193002030021300223002330024300253002630027300283002930030300313003230033300343003530036300373003830039300403004130042300433004430045300463004730048300493005030051300523005330054300553005630057300583005930060300613006230063300643006530066300673006830069300703007130072300733007430075300763007730078300793008030081300823008330084300853008630087300883008930090300913009230093300943009530096300973009830099301003010130102301033010430105301063010730108301093011030111301123011330114301153011630117301183011930120301213012230123301243012530126301273012830129301303013130132301333013430135301363013730138301393014030141301423014330144301453014630147301483014930150301513015230153301543015530156301573015830159301603016130162301633016430165301663016730168301693017030171301723017330174301753017630177301783017930180301813018230183301843018530186301873018830189301903019130192301933019430195301963019730198301993020030201302023020330204302053020630207302083020930210302113021230213302143021530216302173021830219302203022130222302233022430225302263022730228302293023030231302323023330234302353023630237302383023930240302413024230243302443024530246302473024830249302503025130252302533025430255302563025730258302593026030261302623026330264302653026630267302683026930270302713027230273302743027530276302773027830279302803028130282302833028430285302863028730288302893029030291302923029330294302953029630297302983029930300303013030230303303043030530306303073030830309303103031130312303133031430315303163031730318303193032030321303223032330324303253032630327303283032930330303313033230333303343033530336303373033830339303403034130342303433034430345303463034730348303493035030351303523035330354303553035630357303583035930360303613036230363303643036530366303673036830369303703037130372303733037430375303763037730378303793038030381303823038330384303853038630387303883038930390303913039230393303943039530396303973039830399304003040130402304033040430405304063040730408304093041030411304123041330414304153041630417304183041930420304213042230423304243042530426304273042830429304303043130432304333043430435304363043730438304393044030441304423044330444304453044630447304483044930450304513045230453304543045530456304573045830459304603046130462304633046430465304663046730468304693047030471304723047330474304753047630477304783047930480304813048230483304843048530486304873048830489304903049130492304933049430495304963049730498304993050030501305023050330504305053050630507305083050930510305113051230513305143051530516305173051830519305203052130522305233052430525305263052730528305293053030531305323053330534305353053630537305383053930540305413054230543305443054530546305473054830549305503055130552305533055430555305563055730558305593056030561305623056330564305653056630567305683056930570305713057230573305743057530576305773057830579305803058130582305833058430585305863058730588305893059030591305923059330594305953059630597305983059930600306013060230603306043060530606306073060830609306103061130612306133061430615306163061730618306193062030621306223062330624306253062630627306283062930630306313063230633306343063530636306373063830639306403064130642306433064430645306463064730648306493065030651306523065330654306553065630657306583065930660306613066230663306643066530666306673066830669306703067130672306733067430675306763067730678306793068030681306823068330684306853068630687306883068930690306913069230693306943069530696306973069830699307003070130702307033070430705307063070730708307093071030711307123071330714307153071630717307183071930720307213072230723307243072530726307273072830729307303073130732307333073430735307363073730738307393074030741307423074330744307453074630747307483074930750307513075230753307543075530756307573075830759307603076130762307633076430765307663076730768307693077030771307723077330774307753077630777307783077930780307813078230783307843078530786307873078830789307903079130792307933079430795307963079730798307993080030801308023080330804308053080630807308083080930810308113081230813308143081530816308173081830819308203082130822308233082430825308263082730828308293083030831308323083330834308353083630837308383083930840308413084230843308443084530846308473084830849308503085130852308533085430855308563085730858308593086030861308623086330864308653086630867308683086930870308713087230873308743087530876308773087830879308803088130882308833088430885308863088730888308893089030891308923089330894308953089630897308983089930900309013090230903309043090530906309073090830909309103091130912309133091430915309163091730918309193092030921309223092330924309253092630927309283092930930309313093230933309343093530936309373093830939309403094130942309433094430945309463094730948309493095030951309523095330954309553095630957309583095930960309613096230963309643096530966309673096830969309703097130972309733097430975309763097730978309793098030981309823098330984309853098630987309883098930990309913099230993309943099530996309973099830999310003100131002310033100431005310063100731008310093101031011310123101331014310153101631017310183101931020310213102231023310243102531026310273102831029310303103131032310333103431035310363103731038310393104031041310423104331044310453104631047310483104931050310513105231053310543105531056310573105831059310603106131062310633106431065310663106731068310693107031071310723107331074310753107631077310783107931080310813108231083310843108531086310873108831089310903109131092310933109431095310963109731098310993110031101311023110331104311053110631107311083110931110311113111231113311143111531116311173111831119311203112131122311233112431125311263112731128311293113031131311323113331134311353113631137311383113931140311413114231143311443114531146311473114831149311503115131152311533115431155311563115731158311593116031161311623116331164311653116631167311683116931170311713117231173311743117531176311773117831179311803118131182311833118431185311863118731188311893119031191311923119331194311953119631197311983119931200312013120231203312043120531206312073120831209312103121131212312133121431215312163121731218312193122031221312223122331224312253122631227312283122931230312313123231233312343123531236312373123831239312403124131242312433124431245312463124731248312493125031251312523125331254312553125631257312583125931260312613126231263312643126531266312673126831269312703127131272312733127431275312763127731278312793128031281312823128331284312853128631287312883128931290312913129231293312943129531296312973129831299313003130131302313033130431305313063130731308313093131031311313123131331314313153131631317313183131931320313213132231323313243132531326313273132831329313303133131332313333133431335313363133731338313393134031341313423134331344313453134631347313483134931350313513135231353313543135531356313573135831359313603136131362313633136431365313663136731368313693137031371313723137331374313753137631377313783137931380313813138231383313843138531386313873138831389313903139131392313933139431395313963139731398313993140031401314023140331404314053140631407314083140931410314113141231413314143141531416314173141831419314203142131422314233142431425314263142731428314293143031431314323143331434314353143631437314383143931440314413144231443314443144531446314473144831449314503145131452314533145431455314563145731458314593146031461314623146331464314653146631467314683146931470314713147231473314743147531476314773147831479314803148131482314833148431485314863148731488314893149031491314923149331494314953149631497314983149931500315013150231503315043150531506315073150831509315103151131512315133151431515315163151731518315193152031521315223152331524315253152631527315283152931530315313153231533315343153531536315373153831539315403154131542315433154431545315463154731548315493155031551315523155331554315553155631557315583155931560315613156231563315643156531566315673156831569315703157131572315733157431575315763157731578315793158031581315823158331584315853158631587315883158931590315913159231593315943159531596315973159831599316003160131602316033160431605316063160731608316093161031611316123161331614316153161631617316183161931620316213162231623316243162531626316273162831629316303163131632316333163431635316363163731638316393164031641316423164331644316453164631647316483164931650316513165231653316543165531656316573165831659316603166131662316633166431665316663166731668316693167031671316723167331674316753167631677316783167931680316813168231683316843168531686316873168831689316903169131692316933169431695316963169731698316993170031701317023170331704317053170631707317083170931710317113171231713317143171531716317173171831719317203172131722317233172431725317263172731728317293173031731317323173331734317353173631737317383173931740317413174231743317443174531746317473174831749317503175131752317533175431755317563175731758317593176031761317623176331764317653176631767317683176931770317713177231773317743177531776317773177831779317803178131782317833178431785317863178731788317893179031791317923179331794317953179631797317983179931800318013180231803318043180531806318073180831809318103181131812318133181431815318163181731818318193182031821318223182331824318253182631827318283182931830318313183231833318343183531836318373183831839318403184131842318433184431845318463184731848318493185031851318523185331854318553185631857318583185931860318613186231863318643186531866318673186831869318703187131872318733187431875318763187731878318793188031881318823188331884318853188631887318883188931890318913189231893318943189531896318973189831899319003190131902319033190431905319063190731908319093191031911319123191331914319153191631917319183191931920319213192231923319243192531926319273192831929319303193131932319333193431935319363193731938319393194031941319423194331944319453194631947319483194931950319513195231953319543195531956319573195831959319603196131962319633196431965319663196731968319693197031971319723197331974319753197631977319783197931980319813198231983319843198531986319873198831989319903199131992319933199431995319963199731998319993200032001320023200332004320053200632007320083200932010320113201232013320143201532016320173201832019320203202132022320233202432025320263202732028320293203032031320323203332034320353203632037320383203932040320413204232043320443204532046320473204832049320503205132052320533205432055320563205732058320593206032061320623206332064320653206632067320683206932070320713207232073320743207532076320773207832079320803208132082320833208432085320863208732088320893209032091320923209332094320953209632097320983209932100321013210232103321043210532106321073210832109321103211132112321133211432115321163211732118321193212032121321223212332124321253212632127321283212932130321313213232133321343213532136321373213832139321403214132142321433214432145321463214732148321493215032151321523215332154321553215632157321583215932160321613216232163321643216532166321673216832169321703217132172321733217432175321763217732178321793218032181321823218332184321853218632187321883218932190321913219232193321943219532196321973219832199322003220132202322033220432205322063220732208322093221032211322123221332214322153221632217322183221932220322213222232223322243222532226322273222832229322303223132232322333223432235322363223732238322393224032241322423224332244322453224632247322483224932250322513225232253322543225532256322573225832259322603226132262322633226432265322663226732268322693227032271322723227332274322753227632277322783227932280322813228232283322843228532286322873228832289322903229132292322933229432295322963229732298322993230032301323023230332304323053230632307323083230932310323113231232313323143231532316323173231832319323203232132322323233232432325323263232732328323293233032331323323233332334323353233632337323383233932340323413234232343323443234532346323473234832349323503235132352323533235432355323563235732358323593236032361323623236332364323653236632367323683236932370323713237232373323743237532376323773237832379323803238132382323833238432385323863238732388323893239032391323923239332394323953239632397323983239932400324013240232403324043240532406324073240832409324103241132412324133241432415324163241732418324193242032421324223242332424324253242632427324283242932430324313243232433324343243532436324373243832439324403244132442324433244432445324463244732448324493245032451324523245332454324553245632457324583245932460324613246232463324643246532466324673246832469324703247132472324733247432475324763247732478324793248032481324823248332484324853248632487324883248932490324913249232493324943249532496324973249832499325003250132502325033250432505325063250732508325093251032511325123251332514325153251632517325183251932520325213252232523325243252532526325273252832529325303253132532325333253432535325363253732538325393254032541325423254332544325453254632547325483254932550325513255232553325543255532556325573255832559325603256132562325633256432565325663256732568325693257032571325723257332574325753257632577325783257932580325813258232583325843258532586325873258832589325903259132592325933259432595325963259732598325993260032601326023260332604326053260632607326083260932610326113261232613326143261532616326173261832619326203262132622326233262432625326263262732628326293263032631326323263332634326353263632637326383263932640326413264232643326443264532646326473264832649326503265132652326533265432655326563265732658326593266032661326623266332664326653266632667326683266932670326713267232673326743267532676326773267832679326803268132682326833268432685326863268732688326893269032691326923269332694326953269632697326983269932700327013270232703327043270532706327073270832709327103271132712327133271432715327163271732718327193272032721327223272332724327253272632727327283272932730327313273232733327343273532736327373273832739327403274132742327433274432745327463274732748327493275032751327523275332754327553275632757327583275932760327613276232763327643276532766327673276832769327703277132772327733277432775327763277732778327793278032781327823278332784327853278632787327883278932790327913279232793327943279532796327973279832799328003280132802328033280432805328063280732808328093281032811328123281332814328153281632817328183281932820328213282232823328243282532826328273282832829328303283132832328333283432835328363283732838328393284032841328423284332844328453284632847328483284932850328513285232853328543285532856328573285832859328603286132862328633286432865328663286732868328693287032871328723287332874328753287632877328783287932880328813288232883328843288532886328873288832889328903289132892328933289432895328963289732898328993290032901329023290332904329053290632907329083290932910329113291232913329143291532916329173291832919329203292132922329233292432925329263292732928329293293032931329323293332934329353293632937329383293932940329413294232943329443294532946329473294832949329503295132952329533295432955329563295732958329593296032961329623296332964329653296632967329683296932970329713297232973329743297532976329773297832979329803298132982329833298432985329863298732988329893299032991329923299332994329953299632997329983299933000330013300233003330043300533006330073300833009330103301133012330133301433015330163301733018330193302033021330223302333024330253302633027330283302933030330313303233033330343303533036330373303833039330403304133042330433304433045330463304733048330493305033051330523305333054330553305633057330583305933060330613306233063330643306533066330673306833069330703307133072330733307433075330763307733078330793308033081330823308333084330853308633087330883308933090330913309233093330943309533096330973309833099331003310133102331033310433105331063310733108331093311033111331123311333114331153311633117331183311933120331213312233123331243312533126331273312833129331303313133132331333313433135331363313733138331393314033141331423314333144331453314633147331483314933150331513315233153331543315533156331573315833159331603316133162331633316433165331663316733168331693317033171331723317333174331753317633177331783317933180331813318233183331843318533186331873318833189331903319133192331933319433195331963319733198331993320033201332023320333204332053320633207332083320933210332113321233213332143321533216332173321833219332203322133222332233322433225332263322733228332293323033231332323323333234332353323633237332383323933240332413324233243332443324533246332473324833249332503325133252332533325433255332563325733258332593326033261332623326333264332653326633267332683326933270332713327233273332743327533276332773327833279332803328133282332833328433285332863328733288332893329033291332923329333294332953329633297332983329933300333013330233303333043330533306333073330833309333103331133312333133331433315333163331733318333193332033321333223332333324333253332633327333283332933330333313333233333333343333533336333373333833339333403334133342333433334433345333463334733348333493335033351333523335333354333553335633357333583335933360333613336233363333643336533366333673336833369333703337133372333733337433375333763337733378333793338033381333823338333384333853338633387333883338933390333913339233393333943339533396333973339833399334003340133402334033340433405334063340733408334093341033411334123341333414334153341633417334183341933420334213342233423334243342533426334273342833429334303343133432334333343433435334363343733438334393344033441334423344333444334453344633447334483344933450334513345233453334543345533456334573345833459334603346133462334633346433465334663346733468334693347033471334723347333474334753347633477334783347933480334813348233483334843348533486334873348833489334903349133492334933349433495334963349733498334993350033501335023350333504335053350633507335083350933510335113351233513335143351533516335173351833519335203352133522335233352433525335263352733528335293353033531335323353333534335353353633537335383353933540335413354233543335443354533546335473354833549335503355133552335533355433555335563355733558335593356033561335623356333564335653356633567335683356933570335713357233573335743357533576335773357833579335803358133582335833358433585335863358733588335893359033591335923359333594335953359633597335983359933600336013360233603336043360533606336073360833609336103361133612336133361433615336163361733618336193362033621336223362333624336253362633627336283362933630336313363233633336343363533636336373363833639336403364133642336433364433645336463364733648336493365033651336523365333654336553365633657336583365933660336613366233663336643366533666336673366833669336703367133672336733367433675336763367733678336793368033681336823368333684336853368633687336883368933690336913369233693336943369533696336973369833699337003370133702337033370433705337063370733708337093371033711337123371333714337153371633717337183371933720337213372233723337243372533726337273372833729337303373133732337333373433735337363373733738337393374033741337423374333744337453374633747337483374933750337513375233753337543375533756337573375833759337603376133762337633376433765337663376733768337693377033771337723377333774337753377633777337783377933780337813378233783337843378533786337873378833789337903379133792337933379433795337963379733798337993380033801338023380333804338053380633807338083380933810338113381233813338143381533816338173381833819338203382133822338233382433825338263382733828338293383033831338323383333834338353383633837338383383933840338413384233843338443384533846338473384833849338503385133852338533385433855338563385733858338593386033861338623386333864338653386633867338683386933870338713387233873338743387533876338773387833879338803388133882338833388433885338863388733888338893389033891338923389333894338953389633897338983389933900339013390233903339043390533906339073390833909339103391133912339133391433915339163391733918339193392033921339223392333924339253392633927339283392933930339313393233933339343393533936339373393833939339403394133942339433394433945339463394733948339493395033951339523395333954339553395633957339583395933960339613396233963339643396533966339673396833969339703397133972339733397433975339763397733978339793398033981339823398333984339853398633987339883398933990339913399233993339943399533996339973399833999340003400134002340033400434005340063400734008340093401034011340123401334014340153401634017340183401934020340213402234023340243402534026340273402834029340303403134032340333403434035340363403734038340393404034041340423404334044340453404634047340483404934050340513405234053340543405534056340573405834059340603406134062340633406434065340663406734068340693407034071340723407334074340753407634077340783407934080340813408234083340843408534086340873408834089340903409134092340933409434095340963409734098340993410034101341023410334104341053410634107341083410934110341113411234113341143411534116341173411834119341203412134122341233412434125341263412734128341293413034131341323413334134341353413634137341383413934140341413414234143341443414534146341473414834149341503415134152341533415434155341563415734158341593416034161341623416334164341653416634167341683416934170341713417234173341743417534176341773417834179341803418134182341833418434185341863418734188341893419034191341923419334194341953419634197341983419934200342013420234203342043420534206342073420834209342103421134212342133421434215342163421734218342193422034221342223422334224342253422634227342283422934230342313423234233342343423534236342373423834239342403424134242342433424434245342463424734248342493425034251342523425334254342553425634257342583425934260342613426234263342643426534266342673426834269342703427134272342733427434275342763427734278342793428034281342823428334284342853428634287342883428934290342913429234293342943429534296342973429834299343003430134302343033430434305343063430734308343093431034311343123431334314343153431634317343183431934320343213432234323343243432534326343273432834329343303433134332343333433434335343363433734338343393434034341343423434334344343453434634347343483434934350343513435234353343543435534356343573435834359343603436134362343633436434365343663436734368343693437034371343723437334374343753437634377343783437934380343813438234383343843438534386343873438834389343903439134392343933439434395343963439734398343993440034401344023440334404344053440634407344083440934410344113441234413344143441534416344173441834419344203442134422344233442434425344263442734428344293443034431344323443334434344353443634437344383443934440344413444234443344443444534446344473444834449344503445134452344533445434455344563445734458344593446034461344623446334464344653446634467344683446934470344713447234473344743447534476344773447834479344803448134482344833448434485344863448734488344893449034491344923449334494344953449634497344983449934500345013450234503345043450534506345073450834509345103451134512345133451434515345163451734518345193452034521345223452334524345253452634527345283452934530345313453234533345343453534536345373453834539345403454134542345433454434545345463454734548345493455034551345523455334554345553455634557345583455934560345613456234563345643456534566345673456834569345703457134572345733457434575345763457734578345793458034581345823458334584345853458634587345883458934590345913459234593345943459534596345973459834599346003460134602346033460434605346063460734608346093461034611346123461334614346153461634617346183461934620346213462234623346243462534626346273462834629346303463134632346333463434635346363463734638346393464034641346423464334644346453464634647346483464934650346513465234653346543465534656346573465834659346603466134662346633466434665346663466734668346693467034671346723467334674346753467634677346783467934680346813468234683346843468534686346873468834689346903469134692346933469434695346963469734698346993470034701347023470334704347053470634707347083470934710347113471234713347143471534716347173471834719347203472134722347233472434725347263472734728347293473034731347323473334734347353473634737347383473934740347413474234743347443474534746347473474834749347503475134752347533475434755347563475734758347593476034761347623476334764347653476634767347683476934770347713477234773347743477534776347773477834779347803478134782347833478434785347863478734788347893479034791347923479334794347953479634797347983479934800348013480234803348043480534806348073480834809348103481134812348133481434815348163481734818348193482034821348223482334824348253482634827348283482934830348313483234833348343483534836348373483834839348403484134842348433484434845348463484734848348493485034851348523485334854348553485634857348583485934860348613486234863348643486534866348673486834869348703487134872348733487434875348763487734878348793488034881348823488334884348853488634887348883488934890348913489234893348943489534896348973489834899349003490134902349033490434905349063490734908349093491034911349123491334914349153491634917349183491934920349213492234923349243492534926349273492834929349303493134932349333493434935349363493734938349393494034941349423494334944349453494634947349483494934950349513495234953349543495534956349573495834959349603496134962349633496434965349663496734968349693497034971349723497334974349753497634977349783497934980349813498234983349843498534986349873498834989349903499134992349933499434995349963499734998349993500035001350023500335004350053500635007350083500935010350113501235013350143501535016350173501835019350203502135022350233502435025350263502735028350293503035031350323503335034350353503635037350383503935040350413504235043350443504535046350473504835049350503505135052350533505435055350563505735058350593506035061350623506335064350653506635067350683506935070350713507235073350743507535076350773507835079350803508135082350833508435085350863508735088350893509035091350923509335094350953509635097350983509935100351013510235103351043510535106351073510835109351103511135112351133511435115351163511735118351193512035121351223512335124351253512635127351283512935130351313513235133351343513535136351373513835139351403514135142351433514435145351463514735148351493515035151351523515335154351553515635157351583515935160351613516235163351643516535166351673516835169351703517135172351733517435175351763517735178351793518035181351823518335184351853518635187351883518935190351913519235193351943519535196351973519835199352003520135202352033520435205352063520735208352093521035211352123521335214352153521635217352183521935220352213522235223352243522535226352273522835229352303523135232352333523435235352363523735238352393524035241352423524335244352453524635247352483524935250352513525235253352543525535256352573525835259352603526135262352633526435265352663526735268352693527035271352723527335274352753527635277352783527935280352813528235283352843528535286352873528835289352903529135292352933529435295352963529735298352993530035301353023530335304353053530635307353083530935310353113531235313353143531535316353173531835319353203532135322353233532435325353263532735328353293533035331353323533335334353353533635337353383533935340353413534235343353443534535346353473534835349353503535135352353533535435355353563535735358353593536035361353623536335364353653536635367353683536935370353713537235373353743537535376353773537835379353803538135382353833538435385353863538735388353893539035391353923539335394353953539635397353983539935400354013540235403354043540535406354073540835409354103541135412354133541435415354163541735418354193542035421354223542335424354253542635427354283542935430354313543235433354343543535436354373543835439354403544135442354433544435445354463544735448354493545035451354523545335454354553545635457354583545935460354613546235463354643546535466354673546835469354703547135472354733547435475354763547735478354793548035481354823548335484354853548635487354883548935490354913549235493354943549535496354973549835499355003550135502355033550435505355063550735508355093551035511355123551335514355153551635517355183551935520355213552235523355243552535526355273552835529355303553135532355333553435535355363553735538355393554035541355423554335544355453554635547355483554935550355513555235553355543555535556355573555835559355603556135562355633556435565355663556735568355693557035571355723557335574355753557635577355783557935580355813558235583355843558535586355873558835589355903559135592355933559435595355963559735598355993560035601356023560335604356053560635607356083560935610356113561235613356143561535616356173561835619356203562135622356233562435625356263562735628356293563035631356323563335634356353563635637356383563935640356413564235643356443564535646356473564835649356503565135652356533565435655356563565735658356593566035661356623566335664356653566635667356683566935670356713567235673356743567535676356773567835679356803568135682356833568435685356863568735688356893569035691356923569335694356953569635697356983569935700357013570235703357043570535706357073570835709357103571135712357133571435715357163571735718357193572035721357223572335724357253572635727357283572935730357313573235733357343573535736357373573835739357403574135742357433574435745357463574735748357493575035751357523575335754357553575635757357583575935760357613576235763357643576535766357673576835769357703577135772357733577435775357763577735778357793578035781357823578335784357853578635787357883578935790357913579235793357943579535796357973579835799358003580135802358033580435805358063580735808358093581035811358123581335814358153581635817358183581935820358213582235823358243582535826358273582835829358303583135832358333583435835358363583735838358393584035841358423584335844358453584635847358483584935850358513585235853358543585535856358573585835859358603586135862358633586435865358663586735868358693587035871358723587335874358753587635877358783587935880358813588235883358843588535886358873588835889358903589135892358933589435895358963589735898358993590035901359023590335904359053590635907359083590935910359113591235913359143591535916359173591835919359203592135922359233592435925359263592735928359293593035931359323593335934359353593635937359383593935940359413594235943359443594535946359473594835949359503595135952359533595435955359563595735958359593596035961359623596335964359653596635967359683596935970359713597235973359743597535976359773597835979359803598135982359833598435985359863598735988359893599035991359923599335994359953599635997359983599936000360013600236003360043600536006360073600836009360103601136012360133601436015360163601736018360193602036021360223602336024360253602636027360283602936030360313603236033360343603536036360373603836039360403604136042360433604436045360463604736048360493605036051360523605336054360553605636057360583605936060360613606236063360643606536066360673606836069360703607136072360733607436075360763607736078360793608036081360823608336084360853608636087360883608936090360913609236093360943609536096360973609836099361003610136102361033610436105361063610736108361093611036111361123611336114361153611636117361183611936120361213612236123361243612536126361273612836129361303613136132361333613436135361363613736138361393614036141361423614336144361453614636147361483614936150361513615236153361543615536156361573615836159361603616136162361633616436165361663616736168361693617036171361723617336174361753617636177361783617936180361813618236183361843618536186361873618836189361903619136192361933619436195361963619736198361993620036201362023620336204362053620636207362083620936210362113621236213362143621536216362173621836219362203622136222362233622436225362263622736228362293623036231362323623336234362353623636237362383623936240362413624236243362443624536246362473624836249362503625136252362533625436255362563625736258362593626036261362623626336264362653626636267362683626936270362713627236273362743627536276362773627836279362803628136282362833628436285362863628736288362893629036291362923629336294362953629636297362983629936300363013630236303363043630536306363073630836309363103631136312363133631436315363163631736318363193632036321363223632336324363253632636327363283632936330363313633236333363343633536336363373633836339363403634136342363433634436345363463634736348363493635036351363523635336354363553635636357363583635936360363613636236363363643636536366363673636836369363703637136372363733637436375363763637736378363793638036381363823638336384363853638636387363883638936390363913639236393363943639536396363973639836399364003640136402364033640436405364063640736408364093641036411364123641336414364153641636417364183641936420364213642236423364243642536426364273642836429364303643136432364333643436435364363643736438364393644036441364423644336444364453644636447364483644936450364513645236453364543645536456364573645836459364603646136462364633646436465364663646736468364693647036471364723647336474364753647636477364783647936480364813648236483364843648536486364873648836489364903649136492364933649436495364963649736498364993650036501365023650336504365053650636507365083650936510365113651236513365143651536516365173651836519365203652136522365233652436525365263652736528365293653036531365323653336534365353653636537365383653936540365413654236543365443654536546365473654836549365503655136552365533655436555365563655736558365593656036561365623656336564365653656636567365683656936570365713657236573365743657536576365773657836579365803658136582365833658436585365863658736588365893659036591365923659336594365953659636597365983659936600366013660236603366043660536606366073660836609366103661136612366133661436615366163661736618366193662036621366223662336624366253662636627366283662936630366313663236633366343663536636366373663836639366403664136642366433664436645366463664736648366493665036651366523665336654366553665636657366583665936660366613666236663366643666536666366673666836669366703667136672366733667436675366763667736678366793668036681366823668336684366853668636687366883668936690366913669236693366943669536696366973669836699367003670136702367033670436705367063670736708367093671036711367123671336714367153671636717367183671936720367213672236723367243672536726367273672836729367303673136732367333673436735367363673736738367393674036741367423674336744367453674636747367483674936750367513675236753367543675536756367573675836759367603676136762367633676436765367663676736768367693677036771367723677336774367753677636777367783677936780367813678236783367843678536786367873678836789367903679136792367933679436795367963679736798367993680036801368023680336804368053680636807368083680936810368113681236813368143681536816368173681836819368203682136822368233682436825368263682736828368293683036831368323683336834368353683636837368383683936840368413684236843368443684536846368473684836849368503685136852368533685436855368563685736858368593686036861368623686336864368653686636867368683686936870368713687236873368743687536876368773687836879368803688136882368833688436885368863688736888368893689036891368923689336894368953689636897368983689936900369013690236903369043690536906369073690836909369103691136912369133691436915369163691736918369193692036921369223692336924369253692636927369283692936930369313693236933369343693536936369373693836939369403694136942369433694436945369463694736948369493695036951369523695336954369553695636957369583695936960369613696236963369643696536966369673696836969369703697136972369733697436975369763697736978369793698036981369823698336984369853698636987369883698936990369913699236993369943699536996369973699836999370003700137002370033700437005370063700737008370093701037011370123701337014370153701637017370183701937020370213702237023370243702537026370273702837029370303703137032370333703437035370363703737038370393704037041370423704337044370453704637047370483704937050370513705237053370543705537056370573705837059370603706137062370633706437065370663706737068370693707037071370723707337074370753707637077370783707937080370813708237083370843708537086370873708837089370903709137092370933709437095370963709737098370993710037101371023710337104371053710637107371083710937110371113711237113371143711537116371173711837119371203712137122371233712437125371263712737128371293713037131371323713337134371353713637137371383713937140371413714237143371443714537146371473714837149371503715137152371533715437155371563715737158371593716037161371623716337164371653716637167371683716937170371713717237173371743717537176371773717837179371803718137182371833718437185371863718737188371893719037191371923719337194371953719637197371983719937200372013720237203372043720537206372073720837209372103721137212372133721437215372163721737218372193722037221372223722337224372253722637227372283722937230372313723237233372343723537236372373723837239372403724137242372433724437245372463724737248372493725037251372523725337254372553725637257372583725937260372613726237263372643726537266372673726837269372703727137272372733727437275372763727737278372793728037281372823728337284372853728637287372883728937290372913729237293372943729537296372973729837299373003730137302373033730437305373063730737308373093731037311373123731337314373153731637317373183731937320373213732237323373243732537326373273732837329373303733137332373333733437335373363733737338373393734037341373423734337344373453734637347373483734937350373513735237353373543735537356373573735837359373603736137362373633736437365373663736737368373693737037371373723737337374373753737637377373783737937380373813738237383373843738537386373873738837389373903739137392373933739437395373963739737398373993740037401374023740337404374053740637407374083740937410374113741237413374143741537416374173741837419374203742137422374233742437425374263742737428374293743037431374323743337434374353743637437374383743937440374413744237443374443744537446374473744837449374503745137452374533745437455374563745737458374593746037461374623746337464374653746637467374683746937470374713747237473374743747537476374773747837479374803748137482374833748437485374863748737488374893749037491374923749337494374953749637497374983749937500375013750237503375043750537506375073750837509375103751137512375133751437515375163751737518375193752037521375223752337524375253752637527375283752937530375313753237533375343753537536375373753837539375403754137542375433754437545375463754737548375493755037551375523755337554375553755637557375583755937560375613756237563375643756537566375673756837569375703757137572375733757437575375763757737578375793758037581375823758337584375853758637587375883758937590375913759237593375943759537596375973759837599376003760137602376033760437605376063760737608376093761037611376123761337614376153761637617376183761937620376213762237623376243762537626376273762837629376303763137632376333763437635376363763737638376393764037641376423764337644376453764637647376483764937650376513765237653376543765537656376573765837659376603766137662376633766437665376663766737668376693767037671376723767337674376753767637677376783767937680376813768237683376843768537686376873768837689376903769137692376933769437695376963769737698376993770037701377023770337704377053770637707377083770937710377113771237713377143771537716377173771837719377203772137722377233772437725377263772737728377293773037731377323773337734377353773637737377383773937740377413774237743377443774537746377473774837749377503775137752377533775437755377563775737758377593776037761377623776337764377653776637767377683776937770377713777237773377743777537776377773777837779377803778137782377833778437785377863778737788377893779037791377923779337794377953779637797377983779937800378013780237803378043780537806378073780837809378103781137812378133781437815378163781737818378193782037821378223782337824378253782637827378283782937830378313783237833378343783537836378373783837839378403784137842378433784437845378463784737848378493785037851378523785337854378553785637857378583785937860378613786237863378643786537866378673786837869378703787137872378733787437875378763787737878378793788037881378823788337884378853788637887378883788937890378913789237893378943789537896378973789837899379003790137902379033790437905379063790737908379093791037911379123791337914379153791637917379183791937920379213792237923379243792537926379273792837929379303793137932379333793437935379363793737938379393794037941379423794337944379453794637947379483794937950379513795237953379543795537956379573795837959379603796137962379633796437965379663796737968379693797037971379723797337974379753797637977379783797937980379813798237983379843798537986379873798837989379903799137992379933799437995379963799737998379993800038001380023800338004380053800638007380083800938010380113801238013380143801538016380173801838019380203802138022380233802438025380263802738028380293803038031380323803338034380353803638037380383803938040380413804238043380443804538046380473804838049380503805138052380533805438055380563805738058380593806038061380623806338064380653806638067380683806938070380713807238073380743807538076380773807838079380803808138082380833808438085380863808738088380893809038091380923809338094380953809638097380983809938100381013810238103381043810538106381073810838109381103811138112381133811438115381163811738118381193812038121381223812338124381253812638127381283812938130381313813238133381343813538136381373813838139381403814138142381433814438145381463814738148381493815038151381523815338154381553815638157381583815938160381613816238163381643816538166381673816838169381703817138172381733817438175381763817738178381793818038181381823818338184381853818638187381883818938190381913819238193381943819538196381973819838199382003820138202382033820438205382063820738208382093821038211382123821338214382153821638217382183821938220382213822238223382243822538226382273822838229382303823138232382333823438235382363823738238382393824038241382423824338244382453824638247382483824938250382513825238253382543825538256382573825838259382603826138262382633826438265382663826738268382693827038271382723827338274382753827638277382783827938280382813828238283382843828538286382873828838289382903829138292382933829438295382963829738298382993830038301383023830338304383053830638307383083830938310383113831238313383143831538316383173831838319383203832138322383233832438325383263832738328383293833038331383323833338334383353833638337383383833938340383413834238343383443834538346383473834838349383503835138352383533835438355383563835738358383593836038361383623836338364383653836638367383683836938370383713837238373383743837538376383773837838379383803838138382383833838438385383863838738388383893839038391383923839338394383953839638397383983839938400384013840238403384043840538406384073840838409384103841138412384133841438415384163841738418384193842038421384223842338424384253842638427384283842938430384313843238433384343843538436384373843838439384403844138442384433844438445384463844738448384493845038451384523845338454384553845638457384583845938460384613846238463384643846538466384673846838469384703847138472384733847438475384763847738478384793848038481384823848338484384853848638487384883848938490384913849238493384943849538496384973849838499385003850138502385033850438505385063850738508385093851038511385123851338514385153851638517385183851938520385213852238523385243852538526385273852838529385303853138532385333853438535385363853738538385393854038541385423854338544385453854638547385483854938550385513855238553385543855538556385573855838559385603856138562385633856438565385663856738568385693857038571385723857338574385753857638577385783857938580385813858238583385843858538586385873858838589385903859138592385933859438595385963859738598385993860038601386023860338604386053860638607386083860938610386113861238613386143861538616386173861838619386203862138622386233862438625386263862738628386293863038631386323863338634386353863638637386383863938640386413864238643386443864538646386473864838649386503865138652386533865438655386563865738658386593866038661386623866338664386653866638667386683866938670386713867238673386743867538676386773867838679386803868138682386833868438685386863868738688386893869038691386923869338694386953869638697386983869938700387013870238703387043870538706387073870838709387103871138712387133871438715387163871738718387193872038721387223872338724387253872638727387283872938730387313873238733387343873538736387373873838739387403874138742387433874438745387463874738748387493875038751387523875338754387553875638757387583875938760387613876238763387643876538766387673876838769387703877138772387733877438775387763877738778387793878038781387823878338784387853878638787387883878938790387913879238793387943879538796387973879838799388003880138802388033880438805388063880738808388093881038811388123881338814388153881638817388183881938820388213882238823388243882538826388273882838829388303883138832388333883438835388363883738838388393884038841388423884338844388453884638847388483884938850388513885238853388543885538856388573885838859388603886138862388633886438865388663886738868388693887038871388723887338874388753887638877388783887938880388813888238883388843888538886388873888838889388903889138892388933889438895388963889738898388993890038901389023890338904389053890638907389083890938910389113891238913389143891538916389173891838919389203892138922389233892438925389263892738928389293893038931389323893338934389353893638937389383893938940389413894238943389443894538946389473894838949389503895138952389533895438955389563895738958389593896038961389623896338964389653896638967389683896938970389713897238973389743897538976389773897838979389803898138982389833898438985389863898738988389893899038991389923899338994389953899638997389983899939000390013900239003390043900539006390073900839009390103901139012390133901439015390163901739018390193902039021390223902339024390253902639027390283902939030390313903239033390343903539036390373903839039390403904139042390433904439045390463904739048390493905039051390523905339054390553905639057390583905939060390613906239063390643906539066390673906839069390703907139072390733907439075390763907739078390793908039081390823908339084390853908639087390883908939090390913909239093390943909539096390973909839099391003910139102391033910439105391063910739108391093911039111391123911339114391153911639117391183911939120391213912239123391243912539126391273912839129391303913139132391333913439135391363913739138391393914039141391423914339144391453914639147391483914939150391513915239153391543915539156391573915839159391603916139162391633916439165391663916739168391693917039171391723917339174391753917639177391783917939180391813918239183391843918539186391873918839189391903919139192391933919439195391963919739198391993920039201392023920339204392053920639207392083920939210392113921239213392143921539216392173921839219392203922139222392233922439225392263922739228392293923039231392323923339234392353923639237392383923939240392413924239243392443924539246392473924839249392503925139252392533925439255392563925739258392593926039261392623926339264392653926639267392683926939270392713927239273392743927539276392773927839279392803928139282392833928439285392863928739288392893929039291392923929339294392953929639297392983929939300393013930239303393043930539306393073930839309393103931139312393133931439315393163931739318393193932039321393223932339324393253932639327393283932939330393313933239333393343933539336393373933839339393403934139342393433934439345393463934739348393493935039351393523935339354393553935639357393583935939360393613936239363393643936539366393673936839369393703937139372393733937439375393763937739378393793938039381393823938339384393853938639387393883938939390393913939239393393943939539396393973939839399394003940139402394033940439405394063940739408394093941039411394123941339414394153941639417394183941939420394213942239423394243942539426394273942839429394303943139432394333943439435394363943739438394393944039441394423944339444394453944639447394483944939450394513945239453394543945539456394573945839459394603946139462394633946439465394663946739468394693947039471394723947339474394753947639477394783947939480394813948239483394843948539486394873948839489394903949139492394933949439495394963949739498394993950039501395023950339504395053950639507395083950939510395113951239513395143951539516395173951839519395203952139522395233952439525395263952739528395293953039531395323953339534395353953639537395383953939540395413954239543395443954539546395473954839549395503955139552395533955439555395563955739558395593956039561395623956339564395653956639567395683956939570395713957239573395743957539576395773957839579395803958139582395833958439585395863958739588395893959039591395923959339594395953959639597395983959939600396013960239603396043960539606396073960839609396103961139612396133961439615396163961739618396193962039621396223962339624396253962639627396283962939630396313963239633396343963539636396373963839639396403964139642396433964439645396463964739648396493965039651396523965339654396553965639657396583965939660396613966239663396643966539666396673966839669396703967139672396733967439675396763967739678396793968039681396823968339684396853968639687396883968939690396913969239693396943969539696396973969839699397003970139702397033970439705397063970739708397093971039711397123971339714397153971639717397183971939720397213972239723397243972539726397273972839729397303973139732397333973439735397363973739738397393974039741397423974339744397453974639747397483974939750397513975239753397543975539756397573975839759397603976139762397633976439765397663976739768397693977039771397723977339774397753977639777397783977939780397813978239783397843978539786397873978839789397903979139792397933979439795397963979739798397993980039801398023980339804398053980639807398083980939810398113981239813398143981539816398173981839819398203982139822398233982439825398263982739828398293983039831398323983339834398353983639837398383983939840398413984239843398443984539846398473984839849398503985139852398533985439855398563985739858398593986039861398623986339864398653986639867398683986939870398713987239873398743987539876398773987839879398803988139882398833988439885398863988739888398893989039891398923989339894398953989639897398983989939900399013990239903399043990539906399073990839909399103991139912399133991439915399163991739918399193992039921399223992339924399253992639927399283992939930399313993239933399343993539936399373993839939399403994139942399433994439945399463994739948399493995039951399523995339954399553995639957399583995939960399613996239963399643996539966399673996839969399703997139972399733997439975399763997739978399793998039981399823998339984399853998639987399883998939990399913999239993399943999539996399973999839999400004000140002400034000440005400064000740008400094001040011400124001340014400154001640017400184001940020400214002240023400244002540026400274002840029400304003140032400334003440035400364003740038400394004040041400424004340044400454004640047400484004940050400514005240053400544005540056400574005840059400604006140062400634006440065400664006740068400694007040071400724007340074400754007640077400784007940080400814008240083400844008540086400874008840089400904009140092400934009440095400964009740098400994010040101401024010340104401054010640107401084010940110401114011240113401144011540116401174011840119401204012140122401234012440125401264012740128401294013040131401324013340134401354013640137401384013940140401414014240143401444014540146401474014840149401504015140152401534015440155401564015740158401594016040161401624016340164401654016640167401684016940170401714017240173401744017540176401774017840179401804018140182401834018440185401864018740188401894019040191401924019340194401954019640197401984019940200402014020240203402044020540206402074020840209402104021140212402134021440215402164021740218402194022040221402224022340224402254022640227402284022940230402314023240233402344023540236402374023840239402404024140242402434024440245402464024740248402494025040251402524025340254402554025640257402584025940260402614026240263402644026540266402674026840269402704027140272402734027440275402764027740278402794028040281402824028340284402854028640287402884028940290402914029240293402944029540296402974029840299403004030140302403034030440305403064030740308403094031040311403124031340314403154031640317403184031940320403214032240323403244032540326403274032840329403304033140332403334033440335403364033740338403394034040341403424034340344403454034640347403484034940350403514035240353403544035540356403574035840359403604036140362403634036440365403664036740368403694037040371403724037340374403754037640377403784037940380403814038240383403844038540386403874038840389403904039140392403934039440395403964039740398403994040040401404024040340404404054040640407404084040940410404114041240413404144041540416404174041840419404204042140422404234042440425404264042740428404294043040431404324043340434404354043640437404384043940440404414044240443404444044540446404474044840449404504045140452404534045440455404564045740458404594046040461404624046340464404654046640467404684046940470404714047240473404744047540476404774047840479404804048140482404834048440485404864048740488404894049040491404924049340494404954049640497404984049940500405014050240503405044050540506405074050840509405104051140512405134051440515405164051740518405194052040521405224052340524405254052640527405284052940530405314053240533405344053540536405374053840539405404054140542405434054440545405464054740548405494055040551405524055340554405554055640557405584055940560405614056240563405644056540566405674056840569405704057140572405734057440575405764057740578405794058040581405824058340584405854058640587405884058940590405914059240593405944059540596405974059840599406004060140602406034060440605406064060740608406094061040611406124061340614406154061640617406184061940620406214062240623406244062540626406274062840629406304063140632406334063440635406364063740638406394064040641406424064340644406454064640647406484064940650406514065240653406544065540656406574065840659406604066140662406634066440665406664066740668406694067040671406724067340674406754067640677406784067940680406814068240683406844068540686406874068840689406904069140692406934069440695406964069740698406994070040701407024070340704407054070640707407084070940710407114071240713407144071540716407174071840719407204072140722407234072440725407264072740728407294073040731407324073340734407354073640737407384073940740407414074240743407444074540746407474074840749407504075140752407534075440755407564075740758407594076040761407624076340764407654076640767407684076940770407714077240773407744077540776407774077840779407804078140782407834078440785407864078740788407894079040791407924079340794407954079640797407984079940800408014080240803408044080540806408074080840809408104081140812408134081440815408164081740818408194082040821408224082340824408254082640827408284082940830408314083240833408344083540836408374083840839408404084140842408434084440845408464084740848408494085040851408524085340854408554085640857408584085940860408614086240863408644086540866408674086840869408704087140872408734087440875408764087740878408794088040881408824088340884408854088640887408884088940890408914089240893408944089540896408974089840899409004090140902409034090440905409064090740908409094091040911409124091340914409154091640917409184091940920409214092240923409244092540926409274092840929409304093140932409334093440935409364093740938409394094040941409424094340944409454094640947409484094940950409514095240953409544095540956409574095840959409604096140962409634096440965409664096740968409694097040971409724097340974409754097640977409784097940980409814098240983409844098540986409874098840989409904099140992409934099440995409964099740998409994100041001410024100341004410054100641007410084100941010410114101241013410144101541016410174101841019410204102141022410234102441025410264102741028410294103041031410324103341034410354103641037410384103941040410414104241043410444104541046410474104841049410504105141052410534105441055410564105741058410594106041061410624106341064410654106641067410684106941070410714107241073410744107541076410774107841079410804108141082410834108441085410864108741088410894109041091410924109341094410954109641097410984109941100411014110241103411044110541106411074110841109411104111141112411134111441115411164111741118411194112041121411224112341124411254112641127411284112941130411314113241133411344113541136411374113841139411404114141142411434114441145411464114741148411494115041151411524115341154411554115641157411584115941160411614116241163411644116541166411674116841169411704117141172411734117441175411764117741178411794118041181411824118341184411854118641187411884118941190411914119241193411944119541196411974119841199412004120141202412034120441205412064120741208412094121041211412124121341214412154121641217412184121941220412214122241223412244122541226412274122841229412304123141232412334123441235412364123741238412394124041241412424124341244412454124641247412484124941250412514125241253412544125541256412574125841259412604126141262412634126441265412664126741268412694127041271412724127341274412754127641277412784127941280412814128241283412844128541286412874128841289412904129141292412934129441295412964129741298412994130041301413024130341304413054130641307413084130941310413114131241313413144131541316413174131841319413204132141322413234132441325413264132741328413294133041331413324133341334413354133641337413384133941340413414134241343413444134541346413474134841349413504135141352413534135441355413564135741358413594136041361413624136341364413654136641367413684136941370413714137241373413744137541376413774137841379413804138141382413834138441385413864138741388413894139041391413924139341394413954139641397413984139941400414014140241403414044140541406414074140841409414104141141412414134141441415414164141741418414194142041421414224142341424414254142641427414284142941430414314143241433414344143541436414374143841439414404144141442414434144441445414464144741448414494145041451414524145341454414554145641457414584145941460414614146241463414644146541466414674146841469414704147141472414734147441475414764147741478414794148041481414824148341484414854148641487414884148941490414914149241493414944149541496414974149841499415004150141502415034150441505415064150741508415094151041511415124151341514415154151641517415184151941520415214152241523415244152541526415274152841529415304153141532415334153441535415364153741538415394154041541415424154341544415454154641547415484154941550415514155241553415544155541556415574155841559415604156141562415634156441565415664156741568415694157041571415724157341574415754157641577415784157941580415814158241583415844158541586415874158841589415904159141592415934159441595415964159741598415994160041601416024160341604416054160641607416084160941610416114161241613416144161541616416174161841619416204162141622416234162441625416264162741628416294163041631416324163341634416354163641637416384163941640416414164241643416444164541646416474164841649416504165141652416534165441655416564165741658416594166041661416624166341664416654166641667416684166941670416714167241673416744167541676416774167841679416804168141682416834168441685416864168741688416894169041691416924169341694416954169641697416984169941700417014170241703417044170541706417074170841709417104171141712417134171441715417164171741718417194172041721417224172341724417254172641727417284172941730417314173241733417344173541736417374173841739417404174141742417434174441745417464174741748417494175041751417524175341754417554175641757417584175941760417614176241763417644176541766417674176841769417704177141772417734177441775417764177741778417794178041781417824178341784417854178641787417884178941790417914179241793417944179541796417974179841799418004180141802418034180441805418064180741808418094181041811418124181341814418154181641817418184181941820418214182241823418244182541826418274182841829418304183141832418334183441835418364183741838418394184041841418424184341844418454184641847418484184941850418514185241853418544185541856418574185841859418604186141862418634186441865418664186741868418694187041871418724187341874418754187641877418784187941880418814188241883418844188541886418874188841889418904189141892418934189441895418964189741898418994190041901419024190341904419054190641907419084190941910419114191241913419144191541916419174191841919419204192141922419234192441925419264192741928419294193041931419324193341934419354193641937419384193941940419414194241943419444194541946419474194841949419504195141952419534195441955419564195741958419594196041961419624196341964419654196641967419684196941970419714197241973419744197541976419774197841979419804198141982419834198441985419864198741988419894199041991419924199341994419954199641997419984199942000420014200242003420044200542006420074200842009420104201142012420134201442015420164201742018420194202042021420224202342024420254202642027420284202942030420314203242033420344203542036420374203842039420404204142042420434204442045420464204742048420494205042051420524205342054420554205642057420584205942060420614206242063420644206542066420674206842069420704207142072420734207442075420764207742078420794208042081420824208342084420854208642087420884208942090420914209242093420944209542096420974209842099421004210142102421034210442105421064210742108421094211042111421124211342114421154211642117421184211942120421214212242123421244212542126421274212842129421304213142132421334213442135421364213742138421394214042141421424214342144421454214642147421484214942150421514215242153421544215542156421574215842159421604216142162421634216442165421664216742168421694217042171421724217342174421754217642177421784217942180421814218242183421844218542186421874218842189421904219142192421934219442195421964219742198421994220042201422024220342204422054220642207422084220942210422114221242213422144221542216422174221842219422204222142222422234222442225422264222742228422294223042231422324223342234422354223642237422384223942240422414224242243422444224542246422474224842249422504225142252422534225442255422564225742258422594226042261422624226342264422654226642267422684226942270422714227242273422744227542276422774227842279422804228142282422834228442285422864228742288422894229042291422924229342294422954229642297422984229942300423014230242303423044230542306423074230842309423104231142312423134231442315423164231742318423194232042321423224232342324423254232642327423284232942330423314233242333423344233542336423374233842339423404234142342423434234442345423464234742348423494235042351423524235342354423554235642357423584235942360423614236242363423644236542366423674236842369423704237142372423734237442375423764237742378423794238042381423824238342384423854238642387423884238942390423914239242393423944239542396423974239842399424004240142402424034240442405424064240742408424094241042411424124241342414424154241642417424184241942420424214242242423424244242542426424274242842429424304243142432424334243442435424364243742438424394244042441424424244342444424454244642447424484244942450424514245242453424544245542456424574245842459424604246142462424634246442465424664246742468424694247042471424724247342474424754247642477424784247942480424814248242483424844248542486424874248842489424904249142492424934249442495424964249742498424994250042501425024250342504425054250642507425084250942510425114251242513425144251542516425174251842519425204252142522425234252442525425264252742528425294253042531425324253342534425354253642537425384253942540425414254242543425444254542546425474254842549425504255142552425534255442555425564255742558425594256042561425624256342564425654256642567425684256942570425714257242573425744257542576425774257842579425804258142582425834258442585425864258742588425894259042591425924259342594425954259642597425984259942600426014260242603426044260542606426074260842609426104261142612426134261442615426164261742618426194262042621426224262342624426254262642627426284262942630426314263242633426344263542636426374263842639426404264142642426434264442645426464264742648426494265042651426524265342654426554265642657426584265942660426614266242663426644266542666426674266842669426704267142672426734267442675426764267742678426794268042681426824268342684426854268642687426884268942690426914269242693426944269542696426974269842699427004270142702427034270442705427064270742708427094271042711427124271342714427154271642717427184271942720427214272242723427244272542726427274272842729427304273142732427334273442735427364273742738427394274042741427424274342744427454274642747427484274942750427514275242753427544275542756427574275842759427604276142762427634276442765427664276742768427694277042771427724277342774427754277642777427784277942780427814278242783427844278542786427874278842789427904279142792427934279442795427964279742798427994280042801428024280342804428054280642807428084280942810428114281242813428144281542816428174281842819428204282142822428234282442825428264282742828428294283042831428324283342834428354283642837428384283942840428414284242843428444284542846428474284842849428504285142852428534285442855428564285742858428594286042861428624286342864428654286642867428684286942870428714287242873428744287542876428774287842879428804288142882428834288442885428864288742888428894289042891428924289342894428954289642897428984289942900429014290242903429044290542906429074290842909429104291142912429134291442915429164291742918429194292042921429224292342924429254292642927429284292942930429314293242933429344293542936429374293842939429404294142942429434294442945429464294742948429494295042951429524295342954429554295642957429584295942960429614296242963429644296542966429674296842969429704297142972429734297442975429764297742978429794298042981429824298342984429854298642987429884298942990429914299242993429944299542996429974299842999430004300143002430034300443005430064300743008430094301043011430124301343014430154301643017430184301943020430214302243023430244302543026430274302843029430304303143032430334303443035430364303743038430394304043041430424304343044430454304643047430484304943050430514305243053430544305543056430574305843059430604306143062430634306443065430664306743068430694307043071430724307343074430754307643077430784307943080430814308243083430844308543086430874308843089430904309143092430934309443095430964309743098430994310043101431024310343104431054310643107431084310943110431114311243113431144311543116431174311843119431204312143122431234312443125431264312743128431294313043131431324313343134431354313643137431384313943140431414314243143431444314543146431474314843149431504315143152431534315443155431564315743158431594316043161431624316343164431654316643167431684316943170431714317243173431744317543176431774317843179431804318143182431834318443185431864318743188431894319043191431924319343194431954319643197431984319943200432014320243203432044320543206432074320843209432104321143212432134321443215432164321743218432194322043221432224322343224432254322643227432284322943230432314323243233432344323543236432374323843239432404324143242432434324443245432464324743248432494325043251432524325343254432554325643257432584325943260432614326243263432644326543266432674326843269432704327143272432734327443275432764327743278432794328043281432824328343284432854328643287432884328943290432914329243293432944329543296432974329843299433004330143302433034330443305433064330743308433094331043311433124331343314433154331643317433184331943320433214332243323433244332543326433274332843329433304333143332433334333443335433364333743338433394334043341433424334343344433454334643347433484334943350433514335243353433544335543356433574335843359433604336143362433634336443365433664336743368433694337043371433724337343374433754337643377433784337943380433814338243383433844338543386433874338843389433904339143392433934339443395433964339743398433994340043401434024340343404434054340643407434084340943410434114341243413434144341543416434174341843419434204342143422434234342443425434264342743428434294343043431434324343343434434354343643437434384343943440434414344243443434444344543446434474344843449434504345143452434534345443455434564345743458434594346043461434624346343464434654346643467434684346943470434714347243473434744347543476434774347843479434804348143482434834348443485434864348743488434894349043491434924349343494434954349643497434984349943500435014350243503435044350543506435074350843509435104351143512435134351443515435164351743518435194352043521435224352343524435254352643527435284352943530435314353243533435344353543536435374353843539435404354143542435434354443545435464354743548435494355043551435524355343554435554355643557435584355943560435614356243563435644356543566435674356843569435704357143572435734357443575435764357743578435794358043581435824358343584435854358643587435884358943590435914359243593435944359543596435974359843599436004360143602436034360443605436064360743608436094361043611436124361343614436154361643617436184361943620436214362243623436244362543626436274362843629436304363143632436334363443635436364363743638436394364043641436424364343644436454364643647436484364943650436514365243653436544365543656436574365843659436604366143662436634366443665436664366743668436694367043671436724367343674436754367643677436784367943680436814368243683436844368543686436874368843689436904369143692436934369443695436964369743698436994370043701437024370343704437054370643707437084370943710437114371243713437144371543716437174371843719437204372143722437234372443725437264372743728437294373043731437324373343734437354373643737437384373943740437414374243743437444374543746437474374843749437504375143752437534375443755437564375743758437594376043761437624376343764437654376643767437684376943770437714377243773437744377543776437774377843779437804378143782437834378443785437864378743788437894379043791437924379343794437954379643797437984379943800438014380243803438044380543806438074380843809438104381143812438134381443815438164381743818438194382043821438224382343824438254382643827438284382943830438314383243833438344383543836438374383843839438404384143842438434384443845438464384743848438494385043851438524385343854438554385643857438584385943860438614386243863438644386543866438674386843869438704387143872438734387443875438764387743878438794388043881438824388343884438854388643887438884388943890438914389243893438944389543896438974389843899439004390143902439034390443905439064390743908439094391043911439124391343914439154391643917439184391943920439214392243923439244392543926439274392843929439304393143932439334393443935439364393743938439394394043941439424394343944439454394643947439484394943950439514395243953439544395543956439574395843959439604396143962439634396443965439664396743968439694397043971439724397343974439754397643977439784397943980439814398243983439844398543986439874398843989439904399143992439934399443995439964399743998439994400044001440024400344004440054400644007440084400944010440114401244013440144401544016440174401844019440204402144022440234402444025440264402744028440294403044031440324403344034440354403644037440384403944040440414404244043440444404544046440474404844049440504405144052440534405444055440564405744058440594406044061440624406344064440654406644067440684406944070440714407244073440744407544076440774407844079440804408144082440834408444085440864408744088440894409044091440924409344094440954409644097440984409944100441014410244103441044410544106441074410844109441104411144112441134411444115441164411744118441194412044121441224412344124441254412644127441284412944130441314413244133441344413544136441374413844139441404414144142441434414444145441464414744148441494415044151441524415344154441554415644157441584415944160441614416244163441644416544166441674416844169441704417144172441734417444175441764417744178441794418044181441824418344184441854418644187441884418944190441914419244193441944419544196441974419844199442004420144202442034420444205442064420744208442094421044211442124421344214442154421644217442184421944220442214422244223442244422544226442274422844229442304423144232442334423444235442364423744238442394424044241442424424344244442454424644247442484424944250442514425244253442544425544256442574425844259442604426144262442634426444265442664426744268442694427044271442724427344274442754427644277442784427944280442814428244283442844428544286442874428844289442904429144292442934429444295442964429744298442994430044301443024430344304443054430644307443084430944310443114431244313443144431544316443174431844319443204432144322443234432444325443264432744328443294433044331443324433344334443354433644337443384433944340443414434244343443444434544346443474434844349443504435144352443534435444355443564435744358443594436044361443624436344364443654436644367443684436944370443714437244373443744437544376443774437844379443804438144382443834438444385443864438744388443894439044391443924439344394443954439644397443984439944400444014440244403444044440544406444074440844409444104441144412444134441444415444164441744418444194442044421444224442344424444254442644427444284442944430444314443244433444344443544436444374443844439444404444144442444434444444445444464444744448444494445044451444524445344454444554445644457444584445944460444614446244463444644446544466444674446844469444704447144472444734447444475444764447744478444794448044481444824448344484444854448644487444884448944490444914449244493444944449544496444974449844499445004450144502445034450444505445064450744508445094451044511445124451344514445154451644517445184451944520445214452244523445244452544526445274452844529445304453144532445334453444535445364453744538445394454044541445424454344544445454454644547445484454944550445514455244553445544455544556445574455844559445604456144562445634456444565445664456744568445694457044571445724457344574445754457644577445784457944580445814458244583445844458544586445874458844589445904459144592445934459444595445964459744598445994460044601446024460344604446054460644607446084460944610446114461244613446144461544616446174461844619446204462144622446234462444625446264462744628446294463044631446324463344634446354463644637446384463944640446414464244643446444464544646446474464844649446504465144652446534465444655446564465744658446594466044661446624466344664446654466644667446684466944670446714467244673446744467544676446774467844679446804468144682446834468444685446864468744688446894469044691446924469344694446954469644697446984469944700447014470244703447044470544706447074470844709447104471144712447134471444715447164471744718447194472044721447224472344724447254472644727447284472944730447314473244733447344473544736447374473844739447404474144742447434474444745447464474744748447494475044751447524475344754447554475644757447584475944760447614476244763447644476544766447674476844769447704477144772447734477444775447764477744778447794478044781447824478344784447854478644787447884478944790447914479244793447944479544796447974479844799448004480144802448034480444805448064480744808448094481044811448124481344814448154481644817448184481944820448214482244823448244482544826448274482844829448304483144832448334483444835448364483744838448394484044841448424484344844448454484644847448484484944850448514485244853448544485544856448574485844859448604486144862448634486444865448664486744868448694487044871448724487344874448754487644877448784487944880448814488244883448844488544886448874488844889448904489144892448934489444895448964489744898448994490044901449024490344904449054490644907449084490944910449114491244913449144491544916449174491844919449204492144922449234492444925449264492744928449294493044931449324493344934449354493644937449384493944940449414494244943449444494544946449474494844949449504495144952449534495444955449564495744958449594496044961449624496344964449654496644967449684496944970449714497244973449744497544976449774497844979449804498144982449834498444985449864498744988449894499044991449924499344994449954499644997449984499945000450014500245003450044500545006450074500845009450104501145012450134501445015450164501745018450194502045021450224502345024450254502645027450284502945030450314503245033450344503545036450374503845039450404504145042450434504445045450464504745048450494505045051450524505345054450554505645057450584505945060450614506245063450644506545066450674506845069450704507145072450734507445075450764507745078450794508045081450824508345084450854508645087450884508945090450914509245093450944509545096450974509845099451004510145102451034510445105451064510745108451094511045111451124511345114451154511645117451184511945120451214512245123451244512545126451274512845129451304513145132451334513445135451364513745138451394514045141451424514345144451454514645147451484514945150451514515245153451544515545156451574515845159451604516145162451634516445165451664516745168451694517045171451724517345174451754517645177451784517945180451814518245183451844518545186451874518845189451904519145192451934519445195451964519745198451994520045201452024520345204452054520645207452084520945210452114521245213452144521545216452174521845219452204522145222452234522445225452264522745228452294523045231452324523345234452354523645237452384523945240452414524245243452444524545246452474524845249452504525145252452534525445255452564525745258452594526045261452624526345264452654526645267452684526945270452714527245273452744527545276452774527845279452804528145282452834528445285452864528745288452894529045291452924529345294452954529645297452984529945300453014530245303453044530545306453074530845309453104531145312453134531445315453164531745318453194532045321453224532345324453254532645327453284532945330453314533245333453344533545336453374533845339453404534145342453434534445345453464534745348453494535045351453524535345354453554535645357453584535945360453614536245363453644536545366453674536845369453704537145372453734537445375453764537745378453794538045381453824538345384453854538645387453884538945390453914539245393453944539545396453974539845399454004540145402454034540445405454064540745408454094541045411454124541345414454154541645417454184541945420454214542245423454244542545426454274542845429454304543145432454334543445435454364543745438454394544045441454424544345444454454544645447454484544945450454514545245453454544545545456454574545845459454604546145462454634546445465454664546745468454694547045471454724547345474454754547645477454784547945480454814548245483454844548545486454874548845489454904549145492454934549445495454964549745498454994550045501455024550345504455054550645507455084550945510455114551245513455144551545516455174551845519455204552145522455234552445525455264552745528455294553045531455324553345534455354553645537455384553945540455414554245543455444554545546455474554845549455504555145552455534555445555455564555745558455594556045561455624556345564455654556645567455684556945570455714557245573455744557545576455774557845579455804558145582455834558445585455864558745588455894559045591455924559345594455954559645597455984559945600456014560245603456044560545606456074560845609456104561145612456134561445615456164561745618456194562045621456224562345624456254562645627456284562945630456314563245633456344563545636456374563845639456404564145642456434564445645456464564745648456494565045651456524565345654456554565645657456584565945660456614566245663456644566545666456674566845669456704567145672456734567445675456764567745678456794568045681456824568345684456854568645687456884568945690456914569245693456944569545696456974569845699457004570145702457034570445705457064570745708457094571045711457124571345714457154571645717457184571945720457214572245723457244572545726457274572845729457304573145732457334573445735457364573745738457394574045741457424574345744457454574645747457484574945750457514575245753457544575545756457574575845759457604576145762457634576445765457664576745768457694577045771457724577345774457754577645777457784577945780457814578245783457844578545786457874578845789457904579145792457934579445795457964579745798457994580045801458024580345804458054580645807458084580945810458114581245813458144581545816458174581845819458204582145822458234582445825458264582745828458294583045831458324583345834458354583645837458384583945840458414584245843458444584545846458474584845849458504585145852458534585445855458564585745858458594586045861458624586345864458654586645867458684586945870458714587245873458744587545876458774587845879458804588145882458834588445885458864588745888458894589045891458924589345894458954589645897458984589945900459014590245903459044590545906459074590845909459104591145912459134591445915459164591745918459194592045921459224592345924459254592645927459284592945930459314593245933459344593545936459374593845939459404594145942459434594445945459464594745948459494595045951459524595345954459554595645957459584595945960459614596245963459644596545966459674596845969459704597145972459734597445975459764597745978459794598045981459824598345984459854598645987459884598945990459914599245993459944599545996459974599845999460004600146002460034600446005460064600746008460094601046011460124601346014460154601646017460184601946020460214602246023460244602546026460274602846029460304603146032460334603446035460364603746038460394604046041460424604346044460454604646047460484604946050460514605246053460544605546056460574605846059460604606146062460634606446065460664606746068460694607046071460724607346074460754607646077460784607946080460814608246083460844608546086460874608846089460904609146092460934609446095460964609746098460994610046101461024610346104461054610646107461084610946110461114611246113461144611546116461174611846119461204612146122461234612446125461264612746128461294613046131461324613346134461354613646137461384613946140461414614246143461444614546146461474614846149461504615146152461534615446155461564615746158461594616046161461624616346164461654616646167461684616946170461714617246173461744617546176461774617846179461804618146182461834618446185461864618746188461894619046191461924619346194461954619646197461984619946200462014620246203462044620546206462074620846209462104621146212462134621446215462164621746218462194622046221462224622346224462254622646227462284622946230462314623246233462344623546236462374623846239462404624146242462434624446245462464624746248462494625046251462524625346254462554625646257462584625946260462614626246263462644626546266462674626846269462704627146272462734627446275462764627746278462794628046281462824628346284462854628646287462884628946290462914629246293462944629546296462974629846299463004630146302463034630446305463064630746308463094631046311463124631346314463154631646317463184631946320463214632246323463244632546326463274632846329463304633146332463334633446335463364633746338463394634046341463424634346344463454634646347463484634946350463514635246353463544635546356463574635846359463604636146362463634636446365463664636746368463694637046371463724637346374463754637646377463784637946380463814638246383463844638546386463874638846389463904639146392463934639446395463964639746398463994640046401464024640346404464054640646407464084640946410464114641246413464144641546416464174641846419464204642146422464234642446425464264642746428464294643046431464324643346434464354643646437464384643946440464414644246443464444644546446464474644846449464504645146452464534645446455464564645746458464594646046461464624646346464464654646646467464684646946470464714647246473464744647546476464774647846479464804648146482464834648446485464864648746488464894649046491464924649346494464954649646497464984649946500465014650246503465044650546506465074650846509465104651146512465134651446515465164651746518465194652046521465224652346524465254652646527465284652946530465314653246533465344653546536465374653846539465404654146542465434654446545465464654746548465494655046551465524655346554465554655646557465584655946560465614656246563465644656546566465674656846569465704657146572465734657446575465764657746578465794658046581465824658346584465854658646587465884658946590465914659246593465944659546596465974659846599466004660146602466034660446605466064660746608466094661046611466124661346614466154661646617466184661946620466214662246623466244662546626466274662846629466304663146632466334663446635466364663746638466394664046641466424664346644466454664646647466484664946650466514665246653466544665546656466574665846659466604666146662466634666446665466664666746668466694667046671466724667346674466754667646677466784667946680466814668246683466844668546686466874668846689466904669146692466934669446695466964669746698466994670046701467024670346704467054670646707467084670946710467114671246713467144671546716467174671846719467204672146722467234672446725467264672746728467294673046731467324673346734467354673646737467384673946740467414674246743467444674546746467474674846749467504675146752467534675446755467564675746758467594676046761467624676346764467654676646767467684676946770467714677246773467744677546776467774677846779467804678146782467834678446785467864678746788467894679046791467924679346794467954679646797467984679946800468014680246803468044680546806468074680846809468104681146812468134681446815468164681746818468194682046821468224682346824468254682646827468284682946830468314683246833468344683546836468374683846839468404684146842468434684446845468464684746848468494685046851468524685346854468554685646857468584685946860468614686246863468644686546866468674686846869468704687146872468734687446875468764687746878468794688046881468824688346884468854688646887468884688946890468914689246893468944689546896468974689846899469004690146902469034690446905469064690746908469094691046911469124691346914469154691646917469184691946920469214692246923469244692546926469274692846929469304693146932469334693446935469364693746938469394694046941469424694346944469454694646947469484694946950469514695246953469544695546956469574695846959469604696146962469634696446965469664696746968469694697046971469724697346974469754697646977469784697946980469814698246983469844698546986469874698846989469904699146992469934699446995469964699746998469994700047001470024700347004470054700647007470084700947010470114701247013470144701547016470174701847019470204702147022470234702447025470264702747028470294703047031470324703347034470354703647037470384703947040470414704247043470444704547046470474704847049470504705147052470534705447055470564705747058470594706047061470624706347064470654706647067470684706947070470714707247073470744707547076470774707847079470804708147082470834708447085470864708747088470894709047091470924709347094470954709647097470984709947100471014710247103471044710547106471074710847109471104711147112471134711447115471164711747118471194712047121471224712347124471254712647127471284712947130471314713247133471344713547136471374713847139471404714147142471434714447145471464714747148471494715047151471524715347154471554715647157471584715947160471614716247163471644716547166471674716847169471704717147172471734717447175471764717747178471794718047181471824718347184471854718647187471884718947190471914719247193471944719547196471974719847199472004720147202472034720447205472064720747208472094721047211472124721347214472154721647217472184721947220472214722247223472244722547226472274722847229472304723147232472334723447235472364723747238472394724047241472424724347244472454724647247472484724947250472514725247253472544725547256472574725847259472604726147262472634726447265472664726747268472694727047271472724727347274472754727647277472784727947280472814728247283472844728547286472874728847289472904729147292472934729447295472964729747298472994730047301473024730347304473054730647307473084730947310473114731247313473144731547316473174731847319473204732147322473234732447325473264732747328473294733047331473324733347334473354733647337473384733947340473414734247343473444734547346473474734847349473504735147352473534735447355473564735747358473594736047361473624736347364473654736647367473684736947370473714737247373473744737547376473774737847379473804738147382473834738447385473864738747388473894739047391473924739347394473954739647397473984739947400474014740247403474044740547406474074740847409474104741147412474134741447415474164741747418474194742047421474224742347424474254742647427474284742947430474314743247433474344743547436474374743847439474404744147442474434744447445474464744747448474494745047451474524745347454474554745647457474584745947460474614746247463474644746547466474674746847469474704747147472474734747447475474764747747478474794748047481474824748347484474854748647487474884748947490474914749247493474944749547496474974749847499475004750147502475034750447505475064750747508475094751047511475124751347514475154751647517475184751947520475214752247523475244752547526475274752847529475304753147532475334753447535475364753747538475394754047541475424754347544475454754647547475484754947550475514755247553475544755547556475574755847559475604756147562475634756447565475664756747568475694757047571475724757347574475754757647577475784757947580475814758247583475844758547586475874758847589475904759147592475934759447595475964759747598475994760047601476024760347604476054760647607476084760947610476114761247613476144761547616476174761847619476204762147622476234762447625476264762747628476294763047631476324763347634476354763647637476384763947640476414764247643476444764547646476474764847649476504765147652476534765447655476564765747658476594766047661476624766347664476654766647667476684766947670476714767247673476744767547676476774767847679476804768147682476834768447685476864768747688476894769047691476924769347694476954769647697476984769947700477014770247703477044770547706477074770847709477104771147712477134771447715477164771747718477194772047721477224772347724477254772647727477284772947730477314773247733477344773547736477374773847739477404774147742477434774447745477464774747748477494775047751477524775347754477554775647757477584775947760477614776247763477644776547766477674776847769477704777147772477734777447775477764777747778477794778047781477824778347784477854778647787477884778947790477914779247793477944779547796477974779847799478004780147802478034780447805478064780747808478094781047811478124781347814478154781647817478184781947820478214782247823478244782547826478274782847829478304783147832478334783447835478364783747838478394784047841478424784347844478454784647847478484784947850478514785247853478544785547856478574785847859478604786147862478634786447865478664786747868478694787047871478724787347874478754787647877478784787947880478814788247883478844788547886478874788847889478904789147892478934789447895478964789747898478994790047901479024790347904479054790647907479084790947910479114791247913479144791547916479174791847919479204792147922479234792447925479264792747928479294793047931479324793347934479354793647937479384793947940479414794247943479444794547946479474794847949479504795147952479534795447955479564795747958479594796047961479624796347964479654796647967479684796947970479714797247973479744797547976479774797847979479804798147982479834798447985479864798747988479894799047991479924799347994479954799647997479984799948000480014800248003480044800548006480074800848009480104801148012480134801448015480164801748018480194802048021480224802348024480254802648027480284802948030480314803248033480344803548036480374803848039480404804148042480434804448045480464804748048480494805048051480524805348054480554805648057480584805948060480614806248063480644806548066480674806848069480704807148072480734807448075480764807748078480794808048081480824808348084480854808648087480884808948090480914809248093480944809548096480974809848099481004810148102481034810448105481064810748108481094811048111481124811348114481154811648117481184811948120481214812248123481244812548126481274812848129481304813148132481334813448135481364813748138481394814048141481424814348144481454814648147481484814948150481514815248153481544815548156481574815848159481604816148162481634816448165481664816748168481694817048171481724817348174481754817648177481784817948180481814818248183481844818548186481874818848189481904819148192481934819448195481964819748198481994820048201482024820348204482054820648207482084820948210482114821248213482144821548216482174821848219482204822148222482234822448225482264822748228482294823048231482324823348234482354823648237482384823948240482414824248243482444824548246482474824848249482504825148252482534825448255482564825748258482594826048261482624826348264482654826648267482684826948270482714827248273482744827548276482774827848279482804828148282482834828448285482864828748288482894829048291482924829348294482954829648297482984829948300483014830248303483044830548306483074830848309483104831148312483134831448315483164831748318483194832048321483224832348324483254832648327483284832948330483314833248333483344833548336483374833848339483404834148342483434834448345483464834748348483494835048351483524835348354483554835648357483584835948360483614836248363483644836548366483674836848369483704837148372483734837448375483764837748378483794838048381483824838348384483854838648387483884838948390483914839248393483944839548396483974839848399484004840148402484034840448405484064840748408484094841048411484124841348414484154841648417484184841948420484214842248423484244842548426484274842848429484304843148432484334843448435484364843748438484394844048441484424844348444484454844648447484484844948450484514845248453484544845548456484574845848459484604846148462484634846448465484664846748468484694847048471484724847348474484754847648477484784847948480484814848248483484844848548486484874848848489484904849148492484934849448495484964849748498484994850048501485024850348504485054850648507485084850948510485114851248513485144851548516485174851848519485204852148522485234852448525485264852748528485294853048531485324853348534485354853648537485384853948540485414854248543485444854548546485474854848549485504855148552485534855448555485564855748558485594856048561485624856348564485654856648567485684856948570485714857248573485744857548576485774857848579485804858148582485834858448585485864858748588485894859048591485924859348594485954859648597485984859948600486014860248603486044860548606486074860848609486104861148612486134861448615486164861748618486194862048621486224862348624486254862648627486284862948630486314863248633486344863548636486374863848639486404864148642486434864448645486464864748648486494865048651486524865348654486554865648657486584865948660486614866248663486644866548666486674866848669486704867148672486734867448675486764867748678486794868048681486824868348684486854868648687486884868948690486914869248693486944869548696486974869848699487004870148702487034870448705487064870748708487094871048711487124871348714487154871648717487184871948720487214872248723487244872548726487274872848729487304873148732487334873448735487364873748738487394874048741487424874348744487454874648747487484874948750487514875248753487544875548756487574875848759487604876148762487634876448765487664876748768487694877048771487724877348774487754877648777487784877948780487814878248783487844878548786487874878848789487904879148792487934879448795487964879748798487994880048801488024880348804488054880648807488084880948810488114881248813488144881548816488174881848819488204882148822488234882448825488264882748828488294883048831488324883348834488354883648837488384883948840488414884248843488444884548846488474884848849488504885148852488534885448855488564885748858488594886048861488624886348864488654886648867488684886948870488714887248873488744887548876488774887848879488804888148882488834888448885488864888748888488894889048891488924889348894488954889648897488984889948900489014890248903489044890548906489074890848909489104891148912489134891448915489164891748918489194892048921489224892348924489254892648927489284892948930489314893248933489344893548936489374893848939489404894148942489434894448945489464894748948489494895048951489524895348954489554895648957489584895948960489614896248963489644896548966489674896848969489704897148972489734897448975489764897748978489794898048981489824898348984489854898648987489884898948990489914899248993489944899548996489974899848999490004900149002490034900449005490064900749008490094901049011490124901349014490154901649017490184901949020490214902249023490244902549026490274902849029490304903149032490334903449035490364903749038490394904049041490424904349044490454904649047490484904949050490514905249053490544905549056490574905849059490604906149062490634906449065490664906749068490694907049071490724907349074490754907649077490784907949080490814908249083490844908549086490874908849089490904909149092490934909449095490964909749098490994910049101491024910349104491054910649107491084910949110491114911249113491144911549116491174911849119491204912149122491234912449125491264912749128491294913049131491324913349134491354913649137491384913949140491414914249143491444914549146491474914849149491504915149152491534915449155491564915749158491594916049161491624916349164491654916649167491684916949170491714917249173491744917549176491774917849179491804918149182491834918449185491864918749188491894919049191491924919349194491954919649197491984919949200492014920249203492044920549206492074920849209492104921149212492134921449215492164921749218492194922049221492224922349224492254922649227492284922949230492314923249233492344923549236492374923849239492404924149242492434924449245492464924749248492494925049251492524925349254492554925649257492584925949260492614926249263492644926549266492674926849269492704927149272492734927449275492764927749278492794928049281492824928349284492854928649287492884928949290492914929249293492944929549296492974929849299493004930149302493034930449305493064930749308493094931049311493124931349314493154931649317493184931949320493214932249323493244932549326493274932849329493304933149332493334933449335493364933749338493394934049341493424934349344493454934649347493484934949350493514935249353493544935549356493574935849359493604936149362493634936449365493664936749368493694937049371493724937349374493754937649377493784937949380493814938249383493844938549386493874938849389493904939149392493934939449395493964939749398493994940049401494024940349404494054940649407494084940949410494114941249413494144941549416494174941849419494204942149422494234942449425494264942749428494294943049431494324943349434494354943649437494384943949440494414944249443494444944549446494474944849449494504945149452494534945449455494564945749458494594946049461494624946349464494654946649467494684946949470494714947249473494744947549476494774947849479494804948149482494834948449485494864948749488494894949049491494924949349494494954949649497494984949949500495014950249503495044950549506495074950849509495104951149512495134951449515495164951749518495194952049521495224952349524495254952649527495284952949530495314953249533495344953549536495374953849539495404954149542495434954449545495464954749548495494955049551495524955349554495554955649557495584955949560495614956249563495644956549566495674956849569495704957149572495734957449575495764957749578495794958049581495824958349584495854958649587495884958949590495914959249593495944959549596495974959849599496004960149602496034960449605496064960749608496094961049611496124961349614496154961649617496184961949620496214962249623496244962549626496274962849629496304963149632496334963449635496364963749638496394964049641496424964349644496454964649647496484964949650496514965249653496544965549656496574965849659496604966149662496634966449665496664966749668496694967049671496724967349674496754967649677496784967949680496814968249683496844968549686496874968849689496904969149692496934969449695496964969749698496994970049701497024970349704497054970649707497084970949710497114971249713497144971549716497174971849719497204972149722497234972449725497264972749728497294973049731497324973349734497354973649737497384973949740497414974249743497444974549746497474974849749497504975149752497534975449755497564975749758497594976049761497624976349764497654976649767497684976949770497714977249773497744977549776497774977849779497804978149782497834978449785497864978749788497894979049791497924979349794497954979649797497984979949800498014980249803498044980549806498074980849809498104981149812498134981449815498164981749818498194982049821498224982349824498254982649827498284982949830498314983249833498344983549836498374983849839498404984149842498434984449845498464984749848498494985049851498524985349854498554985649857498584985949860498614986249863498644986549866498674986849869498704987149872498734987449875498764987749878498794988049881498824988349884498854988649887498884988949890498914989249893498944989549896498974989849899499004990149902499034990449905499064990749908499094991049911499124991349914499154991649917499184991949920499214992249923499244992549926499274992849929499304993149932499334993449935499364993749938499394994049941499424994349944499454994649947499484994949950499514995249953499544995549956499574995849959499604996149962499634996449965499664996749968499694997049971499724997349974499754997649977499784997949980499814998249983499844998549986499874998849989499904999149992499934999449995499964999749998499995000050001500025000350004500055000650007500085000950010500115001250013500145001550016500175001850019500205002150022500235002450025500265002750028500295003050031500325003350034500355003650037500385003950040500415004250043500445004550046500475004850049500505005150052500535005450055500565005750058500595006050061500625006350064500655006650067500685006950070500715007250073500745007550076500775007850079500805008150082500835008450085500865008750088500895009050091500925009350094500955009650097500985009950100501015010250103501045010550106501075010850109501105011150112501135011450115501165011750118501195012050121501225012350124501255012650127501285012950130501315013250133501345013550136501375013850139501405014150142501435014450145501465014750148501495015050151501525015350154501555015650157501585015950160501615016250163501645016550166501675016850169501705017150172501735017450175501765017750178501795018050181501825018350184501855018650187501885018950190501915019250193501945019550196501975019850199502005020150202502035020450205502065020750208502095021050211502125021350214502155021650217502185021950220502215022250223502245022550226502275022850229502305023150232502335023450235502365023750238502395024050241502425024350244502455024650247502485024950250502515025250253502545025550256502575025850259502605026150262502635026450265502665026750268502695027050271502725027350274502755027650277502785027950280502815028250283502845028550286502875028850289502905029150292502935029450295502965029750298502995030050301503025030350304503055030650307503085030950310503115031250313503145031550316503175031850319503205032150322503235032450325503265032750328503295033050331503325033350334503355033650337503385033950340503415034250343503445034550346503475034850349503505035150352503535035450355503565035750358503595036050361503625036350364503655036650367503685036950370503715037250373503745037550376503775037850379503805038150382503835038450385503865038750388503895039050391503925039350394503955039650397503985039950400504015040250403504045040550406504075040850409504105041150412504135041450415504165041750418504195042050421504225042350424504255042650427504285042950430504315043250433504345043550436504375043850439504405044150442504435044450445504465044750448504495045050451504525045350454504555045650457504585045950460504615046250463504645046550466504675046850469504705047150472504735047450475504765047750478504795048050481504825048350484504855048650487504885048950490504915049250493504945049550496504975049850499505005050150502505035050450505505065050750508505095051050511505125051350514505155051650517505185051950520505215052250523505245052550526505275052850529505305053150532505335053450535505365053750538505395054050541505425054350544505455054650547505485054950550505515055250553505545055550556505575055850559505605056150562505635056450565505665056750568505695057050571505725057350574505755057650577505785057950580505815058250583505845058550586505875058850589505905059150592505935059450595505965059750598505995060050601506025060350604506055060650607506085060950610506115061250613506145061550616506175061850619506205062150622506235062450625506265062750628506295063050631506325063350634506355063650637506385063950640506415064250643506445064550646506475064850649506505065150652506535065450655506565065750658506595066050661506625066350664506655066650667506685066950670506715067250673506745067550676506775067850679506805068150682506835068450685506865068750688506895069050691506925069350694506955069650697506985069950700507015070250703507045070550706507075070850709507105071150712507135071450715507165071750718507195072050721507225072350724507255072650727507285072950730507315073250733507345073550736507375073850739507405074150742507435074450745507465074750748507495075050751507525075350754507555075650757507585075950760507615076250763507645076550766507675076850769507705077150772507735077450775507765077750778507795078050781507825078350784507855078650787507885078950790507915079250793507945079550796507975079850799508005080150802508035080450805508065080750808508095081050811508125081350814508155081650817508185081950820508215082250823508245082550826508275082850829508305083150832508335083450835508365083750838508395084050841508425084350844508455084650847508485084950850508515085250853508545085550856508575085850859508605086150862508635086450865508665086750868508695087050871508725087350874508755087650877508785087950880508815088250883508845088550886508875088850889508905089150892508935089450895508965089750898508995090050901509025090350904509055090650907509085090950910509115091250913509145091550916509175091850919509205092150922509235092450925509265092750928509295093050931509325093350934509355093650937509385093950940509415094250943509445094550946509475094850949509505095150952509535095450955509565095750958509595096050961509625096350964509655096650967509685096950970509715097250973509745097550976509775097850979509805098150982509835098450985509865098750988509895099050991509925099350994509955099650997509985099951000510015100251003510045100551006510075100851009510105101151012510135101451015510165101751018510195102051021510225102351024510255102651027510285102951030510315103251033510345103551036510375103851039510405104151042510435104451045510465104751048510495105051051510525105351054510555105651057510585105951060510615106251063510645106551066510675106851069510705107151072510735107451075510765107751078510795108051081510825108351084510855108651087510885108951090510915109251093510945109551096510975109851099511005110151102511035110451105511065110751108511095111051111511125111351114511155111651117511185111951120511215112251123511245112551126511275112851129511305113151132511335113451135511365113751138511395114051141511425114351144511455114651147511485114951150511515115251153511545115551156511575115851159511605116151162511635116451165511665116751168511695117051171511725117351174511755117651177511785117951180511815118251183511845118551186511875118851189511905119151192511935119451195511965119751198511995120051201512025120351204512055120651207512085120951210512115121251213512145121551216512175121851219512205122151222512235122451225512265122751228512295123051231512325123351234512355123651237512385123951240512415124251243512445124551246512475124851249512505125151252512535125451255512565125751258512595126051261512625126351264512655126651267512685126951270512715127251273512745127551276512775127851279512805128151282512835128451285512865128751288512895129051291512925129351294512955129651297512985129951300513015130251303513045130551306513075130851309513105131151312513135131451315513165131751318513195132051321513225132351324513255132651327513285132951330513315133251333513345133551336513375133851339513405134151342513435134451345513465134751348513495135051351513525135351354513555135651357513585135951360513615136251363513645136551366513675136851369513705137151372513735137451375513765137751378513795138051381513825138351384513855138651387513885138951390513915139251393513945139551396513975139851399514005140151402514035140451405514065140751408514095141051411514125141351414514155141651417514185141951420514215142251423514245142551426514275142851429514305143151432514335143451435514365143751438514395144051441514425144351444514455144651447514485144951450514515145251453514545145551456514575145851459514605146151462514635146451465514665146751468514695147051471514725147351474514755147651477514785147951480514815148251483514845148551486514875148851489514905149151492514935149451495514965149751498514995150051501515025150351504515055150651507515085150951510515115151251513515145151551516515175151851519515205152151522515235152451525515265152751528515295153051531515325153351534515355153651537515385153951540515415154251543515445154551546515475154851549515505155151552515535155451555515565155751558515595156051561515625156351564515655156651567515685156951570515715157251573515745157551576515775157851579515805158151582515835158451585515865158751588515895159051591515925159351594515955159651597515985159951600516015160251603516045160551606516075160851609516105161151612516135161451615516165161751618516195162051621516225162351624516255162651627516285162951630516315163251633516345163551636516375163851639516405164151642516435164451645516465164751648516495165051651516525165351654516555165651657516585165951660516615166251663516645166551666516675166851669516705167151672516735167451675516765167751678516795168051681516825168351684516855168651687516885168951690516915169251693516945169551696516975169851699517005170151702517035170451705517065170751708517095171051711517125171351714517155171651717517185171951720517215172251723517245172551726517275172851729517305173151732517335173451735517365173751738517395174051741517425174351744517455174651747517485174951750517515175251753517545175551756517575175851759517605176151762517635176451765517665176751768517695177051771517725177351774517755177651777517785177951780517815178251783517845178551786517875178851789517905179151792517935179451795517965179751798517995180051801518025180351804518055180651807518085180951810518115181251813518145181551816518175181851819518205182151822518235182451825518265182751828518295183051831518325183351834518355183651837518385183951840518415184251843518445184551846518475184851849518505185151852518535185451855518565185751858518595186051861518625186351864518655186651867518685186951870518715187251873518745187551876518775187851879518805188151882518835188451885518865188751888518895189051891518925189351894518955189651897518985189951900519015190251903519045190551906519075190851909519105191151912519135191451915519165191751918519195192051921519225192351924519255192651927519285192951930519315193251933519345193551936519375193851939519405194151942519435194451945519465194751948519495195051951519525195351954519555195651957519585195951960519615196251963519645196551966519675196851969519705197151972519735197451975519765197751978519795198051981519825198351984519855198651987519885198951990519915199251993519945199551996519975199851999520005200152002520035200452005520065200752008520095201052011520125201352014520155201652017520185201952020520215202252023520245202552026520275202852029520305203152032520335203452035520365203752038520395204052041520425204352044520455204652047520485204952050520515205252053520545205552056520575205852059520605206152062520635206452065520665206752068520695207052071520725207352074520755207652077520785207952080520815208252083520845208552086520875208852089520905209152092520935209452095520965209752098520995210052101521025210352104521055210652107521085210952110521115211252113521145211552116521175211852119521205212152122521235212452125521265212752128521295213052131521325213352134521355213652137521385213952140521415214252143521445214552146521475214852149521505215152152521535215452155521565215752158521595216052161521625216352164521655216652167521685216952170521715217252173521745217552176521775217852179521805218152182521835218452185521865218752188521895219052191521925219352194521955219652197521985219952200522015220252203522045220552206522075220852209522105221152212522135221452215522165221752218522195222052221522225222352224522255222652227522285222952230522315223252233522345223552236522375223852239522405224152242522435224452245522465224752248522495225052251522525225352254522555225652257522585225952260522615226252263522645226552266522675226852269522705227152272522735227452275522765227752278522795228052281522825228352284522855228652287522885228952290522915229252293522945229552296522975229852299523005230152302523035230452305523065230752308523095231052311523125231352314523155231652317523185231952320523215232252323523245232552326523275232852329523305233152332523335233452335523365233752338523395234052341523425234352344523455234652347523485234952350523515235252353523545235552356523575235852359523605236152362523635236452365523665236752368523695237052371523725237352374523755237652377523785237952380523815238252383523845238552386523875238852389523905239152392523935239452395523965239752398523995240052401524025240352404524055240652407524085240952410524115241252413524145241552416524175241852419524205242152422524235242452425524265242752428524295243052431524325243352434524355243652437524385243952440524415244252443524445244552446524475244852449524505245152452524535245452455524565245752458524595246052461524625246352464524655246652467524685246952470524715247252473524745247552476524775247852479524805248152482524835248452485524865248752488524895249052491524925249352494524955249652497524985249952500525015250252503525045250552506525075250852509525105251152512525135251452515525165251752518525195252052521525225252352524525255252652527525285252952530525315253252533525345253552536525375253852539525405254152542525435254452545525465254752548525495255052551525525255352554525555255652557525585255952560525615256252563525645256552566525675256852569525705257152572525735257452575525765257752578525795258052581525825258352584525855258652587525885258952590525915259252593525945259552596525975259852599526005260152602526035260452605526065260752608526095261052611526125261352614526155261652617526185261952620526215262252623526245262552626526275262852629526305263152632526335263452635526365263752638526395264052641526425264352644526455264652647526485264952650526515265252653526545265552656526575265852659526605266152662526635266452665526665266752668526695267052671526725267352674526755267652677526785267952680526815268252683526845268552686526875268852689526905269152692526935269452695526965269752698526995270052701527025270352704527055270652707527085270952710527115271252713527145271552716527175271852719527205272152722527235272452725527265272752728527295273052731527325273352734527355273652737527385273952740527415274252743527445274552746527475274852749527505275152752527535275452755527565275752758527595276052761527625276352764527655276652767527685276952770527715277252773527745277552776527775277852779527805278152782527835278452785527865278752788527895279052791527925279352794527955279652797527985279952800528015280252803528045280552806528075280852809528105281152812528135281452815528165281752818528195282052821528225282352824528255282652827528285282952830528315283252833528345283552836528375283852839528405284152842528435284452845528465284752848528495285052851528525285352854528555285652857528585285952860528615286252863528645286552866528675286852869528705287152872528735287452875528765287752878528795288052881528825288352884528855288652887528885288952890528915289252893528945289552896528975289852899529005290152902529035290452905529065290752908529095291052911529125291352914529155291652917529185291952920529215292252923529245292552926529275292852929529305293152932529335293452935529365293752938529395294052941529425294352944529455294652947529485294952950529515295252953529545295552956529575295852959529605296152962529635296452965529665296752968529695297052971529725297352974529755297652977529785297952980529815298252983529845298552986529875298852989529905299152992529935299452995529965299752998529995300053001530025300353004530055300653007530085300953010530115301253013530145301553016530175301853019530205302153022530235302453025530265302753028530295303053031530325303353034530355303653037530385303953040530415304253043530445304553046530475304853049530505305153052530535305453055530565305753058530595306053061530625306353064530655306653067530685306953070530715307253073530745307553076530775307853079530805308153082530835308453085530865308753088530895309053091530925309353094530955309653097530985309953100531015310253103531045310553106531075310853109531105311153112531135311453115531165311753118531195312053121531225312353124531255312653127531285312953130531315313253133531345313553136531375313853139531405314153142531435314453145531465314753148531495315053151531525315353154531555315653157531585315953160531615316253163531645316553166531675316853169531705317153172531735317453175531765317753178531795318053181531825318353184531855318653187531885318953190531915319253193531945319553196531975319853199532005320153202532035320453205532065320753208532095321053211532125321353214532155321653217532185321953220532215322253223532245322553226532275322853229532305323153232532335323453235532365323753238532395324053241532425324353244532455324653247532485324953250532515325253253532545325553256532575325853259532605326153262532635326453265532665326753268532695327053271532725327353274532755327653277532785327953280532815328253283532845328553286532875328853289532905329153292532935329453295532965329753298532995330053301533025330353304533055330653307533085330953310533115331253313533145331553316533175331853319533205332153322533235332453325533265332753328533295333053331533325333353334533355333653337533385333953340533415334253343533445334553346533475334853349533505335153352533535335453355533565335753358533595336053361533625336353364533655336653367533685336953370533715337253373533745337553376533775337853379533805338153382533835338453385533865338753388533895339053391533925339353394533955339653397533985339953400534015340253403534045340553406534075340853409534105341153412534135341453415534165341753418534195342053421534225342353424534255342653427534285342953430534315343253433534345343553436534375343853439534405344153442534435344453445534465344753448534495345053451534525345353454534555345653457534585345953460534615346253463534645346553466534675346853469534705347153472534735347453475534765347753478534795348053481534825348353484534855348653487534885348953490534915349253493534945349553496534975349853499535005350153502535035350453505535065350753508535095351053511535125351353514535155351653517535185351953520535215352253523535245352553526535275352853529535305353153532535335353453535535365353753538535395354053541535425354353544535455354653547535485354953550535515355253553535545355553556535575355853559535605356153562535635356453565535665356753568535695357053571535725357353574535755357653577535785357953580535815358253583535845358553586535875358853589535905359153592535935359453595535965359753598535995360053601536025360353604536055360653607536085360953610536115361253613536145361553616536175361853619536205362153622536235362453625536265362753628536295363053631536325363353634536355363653637536385363953640536415364253643536445364553646536475364853649536505365153652536535365453655536565365753658536595366053661536625366353664536655366653667536685366953670536715367253673536745367553676536775367853679536805368153682536835368453685536865368753688536895369053691536925369353694536955369653697536985369953700537015370253703537045370553706537075370853709537105371153712537135371453715537165371753718537195372053721537225372353724537255372653727537285372953730537315373253733537345373553736537375373853739537405374153742537435374453745537465374753748537495375053751537525375353754537555375653757537585375953760537615376253763537645376553766537675376853769537705377153772537735377453775537765377753778537795378053781537825378353784537855378653787537885378953790537915379253793537945379553796537975379853799538005380153802538035380453805538065380753808538095381053811538125381353814538155381653817538185381953820538215382253823538245382553826538275382853829538305383153832538335383453835538365383753838538395384053841538425384353844538455384653847538485384953850538515385253853538545385553856538575385853859538605386153862538635386453865538665386753868538695387053871538725387353874538755387653877538785387953880538815388253883538845388553886538875388853889538905389153892538935389453895538965389753898538995390053901539025390353904539055390653907539085390953910539115391253913539145391553916539175391853919539205392153922539235392453925539265392753928539295393053931539325393353934539355393653937539385393953940539415394253943539445394553946539475394853949539505395153952539535395453955539565395753958539595396053961539625396353964539655396653967539685396953970539715397253973539745397553976539775397853979539805398153982539835398453985539865398753988539895399053991539925399353994539955399653997539985399954000540015400254003540045400554006540075400854009540105401154012540135401454015540165401754018540195402054021540225402354024540255402654027540285402954030540315403254033540345403554036540375403854039540405404154042540435404454045540465404754048540495405054051540525405354054540555405654057540585405954060540615406254063540645406554066540675406854069540705407154072540735407454075540765407754078540795408054081540825408354084540855408654087540885408954090540915409254093540945409554096540975409854099541005410154102541035410454105541065410754108541095411054111541125411354114541155411654117541185411954120541215412254123541245412554126541275412854129541305413154132541335413454135541365413754138541395414054141541425414354144541455414654147541485414954150541515415254153541545415554156541575415854159541605416154162541635416454165541665416754168541695417054171541725417354174541755417654177541785417954180541815418254183541845418554186541875418854189541905419154192541935419454195541965419754198541995420054201542025420354204542055420654207542085420954210542115421254213542145421554216542175421854219542205422154222542235422454225542265422754228542295423054231542325423354234542355423654237542385423954240542415424254243542445424554246542475424854249542505425154252542535425454255542565425754258542595426054261542625426354264542655426654267542685426954270542715427254273542745427554276542775427854279542805428154282542835428454285542865428754288542895429054291542925429354294542955429654297542985429954300543015430254303543045430554306543075430854309543105431154312543135431454315543165431754318543195432054321543225432354324543255432654327543285432954330543315433254333543345433554336543375433854339543405434154342543435434454345543465434754348543495435054351543525435354354543555435654357543585435954360543615436254363543645436554366543675436854369543705437154372543735437454375543765437754378543795438054381543825438354384543855438654387543885438954390543915439254393543945439554396543975439854399544005440154402544035440454405544065440754408544095441054411544125441354414544155441654417544185441954420544215442254423544245442554426544275442854429544305443154432544335443454435544365443754438544395444054441544425444354444544455444654447544485444954450544515445254453544545445554456544575445854459544605446154462544635446454465544665446754468544695447054471544725447354474544755447654477544785447954480544815448254483544845448554486544875448854489544905449154492544935449454495544965449754498544995450054501545025450354504545055450654507545085450954510545115451254513545145451554516545175451854519545205452154522545235452454525545265452754528545295453054531545325453354534545355453654537545385453954540545415454254543545445454554546545475454854549545505455154552545535455454555545565455754558545595456054561545625456354564545655456654567545685456954570545715457254573545745457554576545775457854579545805458154582545835458454585545865458754588545895459054591545925459354594545955459654597545985459954600546015460254603546045460554606546075460854609546105461154612546135461454615546165461754618546195462054621546225462354624546255462654627546285462954630546315463254633546345463554636546375463854639546405464154642546435464454645546465464754648546495465054651546525465354654546555465654657546585465954660546615466254663546645466554666546675466854669546705467154672546735467454675546765467754678546795468054681546825468354684546855468654687546885468954690546915469254693546945469554696546975469854699547005470154702547035470454705547065470754708547095471054711547125471354714547155471654717547185471954720547215472254723547245472554726547275472854729547305473154732547335473454735547365473754738547395474054741547425474354744547455474654747547485474954750547515475254753547545475554756547575475854759547605476154762547635476454765547665476754768547695477054771547725477354774547755477654777547785477954780547815478254783547845478554786547875478854789547905479154792547935479454795547965479754798547995480054801548025480354804548055480654807548085480954810548115481254813548145481554816548175481854819548205482154822548235482454825548265482754828548295483054831548325483354834548355483654837548385483954840548415484254843548445484554846548475484854849548505485154852548535485454855548565485754858548595486054861548625486354864548655486654867548685486954870548715487254873548745487554876548775487854879548805488154882548835488454885548865488754888548895489054891548925489354894548955489654897548985489954900549015490254903549045490554906549075490854909549105491154912549135491454915549165491754918549195492054921549225492354924549255492654927549285492954930549315493254933549345493554936549375493854939549405494154942549435494454945549465494754948549495495054951549525495354954549555495654957549585495954960549615496254963549645496554966549675496854969549705497154972549735497454975549765497754978549795498054981549825498354984549855498654987549885498954990549915499254993549945499554996549975499854999550005500155002550035500455005550065500755008550095501055011550125501355014550155501655017550185501955020550215502255023550245502555026550275502855029550305503155032550335503455035550365503755038550395504055041550425504355044550455504655047550485504955050550515505255053550545505555056550575505855059550605506155062550635506455065550665506755068550695507055071550725507355074550755507655077550785507955080550815508255083550845508555086550875508855089550905509155092550935509455095550965509755098550995510055101551025510355104551055510655107551085510955110551115511255113551145511555116551175511855119551205512155122551235512455125551265512755128551295513055131551325513355134551355513655137551385513955140551415514255143551445514555146551475514855149551505515155152551535515455155551565515755158551595516055161551625516355164551655516655167551685516955170551715517255173551745517555176551775517855179551805518155182551835518455185551865518755188551895519055191551925519355194551955519655197551985519955200552015520255203552045520555206552075520855209552105521155212552135521455215552165521755218552195522055221552225522355224552255522655227552285522955230552315523255233552345523555236552375523855239552405524155242552435524455245552465524755248552495525055251552525525355254552555525655257552585525955260552615526255263552645526555266552675526855269552705527155272552735527455275552765527755278552795528055281552825528355284552855528655287552885528955290552915529255293552945529555296552975529855299553005530155302553035530455305553065530755308553095531055311553125531355314553155531655317553185531955320553215532255323553245532555326553275532855329553305533155332553335533455335553365533755338553395534055341553425534355344553455534655347553485534955350553515535255353553545535555356553575535855359553605536155362553635536455365553665536755368553695537055371553725537355374553755537655377553785537955380553815538255383553845538555386553875538855389553905539155392553935539455395553965539755398553995540055401554025540355404554055540655407554085540955410554115541255413554145541555416554175541855419554205542155422554235542455425554265542755428554295543055431554325543355434554355543655437554385543955440554415544255443554445544555446554475544855449554505545155452554535545455455554565545755458554595546055461554625546355464554655546655467554685546955470554715547255473554745547555476554775547855479554805548155482554835548455485554865548755488554895549055491554925549355494554955549655497554985549955500555015550255503555045550555506555075550855509555105551155512555135551455515555165551755518555195552055521555225552355524555255552655527555285552955530555315553255533555345553555536555375553855539555405554155542555435554455545555465554755548555495555055551555525555355554555555555655557555585555955560555615556255563555645556555566555675556855569555705557155572555735557455575555765557755578555795558055581555825558355584555855558655587555885558955590555915559255593555945559555596555975559855599556005560155602556035560455605556065560755608556095561055611556125561355614556155561655617556185561955620556215562255623556245562555626556275562855629556305563155632556335563455635556365563755638556395564055641556425564355644556455564655647556485564955650556515565255653556545565555656556575565855659556605566155662556635566455665556665566755668556695567055671556725567355674556755567655677556785567955680556815568255683556845568555686556875568855689556905569155692556935569455695556965569755698556995570055701557025570355704557055570655707557085570955710557115571255713557145571555716557175571855719557205572155722557235572455725557265572755728557295573055731557325573355734557355573655737557385573955740557415574255743557445574555746557475574855749557505575155752557535575455755557565575755758557595576055761557625576355764557655576655767557685576955770557715577255773557745577555776557775577855779557805578155782557835578455785557865578755788557895579055791557925579355794557955579655797557985579955800558015580255803558045580555806558075580855809558105581155812558135581455815558165581755818558195582055821558225582355824558255582655827558285582955830558315583255833558345583555836558375583855839558405584155842558435584455845558465584755848558495585055851558525585355854558555585655857558585585955860558615586255863558645586555866558675586855869558705587155872558735587455875558765587755878558795588055881558825588355884558855588655887558885588955890558915589255893558945589555896558975589855899559005590155902559035590455905559065590755908559095591055911559125591355914559155591655917559185591955920559215592255923559245592555926559275592855929559305593155932559335593455935559365593755938559395594055941559425594355944559455594655947559485594955950559515595255953559545595555956559575595855959559605596155962559635596455965559665596755968559695597055971559725597355974559755597655977559785597955980559815598255983559845598555986559875598855989559905599155992559935599455995559965599755998559995600056001560025600356004560055600656007560085600956010560115601256013560145601556016560175601856019560205602156022560235602456025560265602756028560295603056031560325603356034560355603656037560385603956040560415604256043560445604556046560475604856049560505605156052560535605456055560565605756058560595606056061560625606356064560655606656067560685606956070560715607256073560745607556076560775607856079560805608156082560835608456085560865608756088560895609056091560925609356094560955609656097560985609956100561015610256103561045610556106561075610856109561105611156112561135611456115561165611756118561195612056121561225612356124561255612656127561285612956130561315613256133561345613556136561375613856139561405614156142561435614456145561465614756148561495615056151561525615356154561555615656157561585615956160561615616256163561645616556166561675616856169561705617156172561735617456175561765617756178561795618056181561825618356184561855618656187561885618956190561915619256193561945619556196561975619856199562005620156202562035620456205562065620756208562095621056211562125621356214562155621656217562185621956220562215622256223562245622556226562275622856229562305623156232562335623456235562365623756238562395624056241562425624356244562455624656247562485624956250562515625256253562545625556256562575625856259562605626156262562635626456265562665626756268562695627056271562725627356274562755627656277562785627956280562815628256283562845628556286562875628856289562905629156292562935629456295562965629756298562995630056301563025630356304563055630656307563085630956310563115631256313563145631556316563175631856319563205632156322563235632456325563265632756328563295633056331563325633356334563355633656337563385633956340563415634256343563445634556346563475634856349563505635156352563535635456355563565635756358563595636056361563625636356364563655636656367563685636956370563715637256373563745637556376563775637856379563805638156382563835638456385563865638756388563895639056391563925639356394563955639656397563985639956400564015640256403564045640556406564075640856409564105641156412564135641456415564165641756418564195642056421564225642356424564255642656427564285642956430564315643256433564345643556436564375643856439564405644156442564435644456445564465644756448564495645056451564525645356454564555645656457564585645956460564615646256463564645646556466564675646856469564705647156472564735647456475564765647756478564795648056481564825648356484564855648656487564885648956490564915649256493564945649556496564975649856499565005650156502565035650456505565065650756508565095651056511565125651356514565155651656517565185651956520565215652256523565245652556526565275652856529565305653156532565335653456535565365653756538565395654056541565425654356544565455654656547565485654956550565515655256553565545655556556565575655856559565605656156562565635656456565565665656756568565695657056571565725657356574565755657656577565785657956580565815658256583565845658556586565875658856589565905659156592565935659456595565965659756598565995660056601566025660356604566055660656607566085660956610566115661256613566145661556616566175661856619566205662156622566235662456625566265662756628566295663056631566325663356634566355663656637566385663956640566415664256643566445664556646566475664856649566505665156652566535665456655566565665756658566595666056661566625666356664566655666656667566685666956670566715667256673566745667556676566775667856679566805668156682566835668456685566865668756688566895669056691566925669356694566955669656697566985669956700567015670256703567045670556706567075670856709567105671156712567135671456715567165671756718567195672056721567225672356724567255672656727567285672956730567315673256733567345673556736567375673856739567405674156742567435674456745567465674756748567495675056751567525675356754567555675656757567585675956760567615676256763567645676556766567675676856769567705677156772567735677456775567765677756778567795678056781567825678356784567855678656787567885678956790567915679256793567945679556796567975679856799568005680156802568035680456805568065680756808568095681056811568125681356814568155681656817568185681956820568215682256823568245682556826568275682856829568305683156832568335683456835568365683756838568395684056841568425684356844568455684656847568485684956850568515685256853568545685556856568575685856859568605686156862568635686456865568665686756868568695687056871568725687356874568755687656877568785687956880568815688256883568845688556886568875688856889568905689156892568935689456895568965689756898568995690056901569025690356904569055690656907569085690956910569115691256913569145691556916569175691856919569205692156922569235692456925569265692756928569295693056931569325693356934569355693656937569385693956940569415694256943569445694556946569475694856949569505695156952569535695456955569565695756958569595696056961569625696356964569655696656967569685696956970569715697256973569745697556976569775697856979569805698156982569835698456985569865698756988569895699056991569925699356994569955699656997569985699957000570015700257003570045700557006570075700857009570105701157012570135701457015570165701757018570195702057021570225702357024570255702657027570285702957030570315703257033570345703557036570375703857039570405704157042570435704457045570465704757048570495705057051570525705357054570555705657057570585705957060570615706257063570645706557066570675706857069570705707157072570735707457075570765707757078570795708057081570825708357084570855708657087570885708957090570915709257093570945709557096570975709857099571005710157102571035710457105571065710757108571095711057111571125711357114571155711657117571185711957120571215712257123571245712557126571275712857129571305713157132571335713457135571365713757138571395714057141571425714357144571455714657147571485714957150571515715257153571545715557156571575715857159571605716157162571635716457165571665716757168571695717057171571725717357174571755717657177571785717957180571815718257183571845718557186571875718857189571905719157192571935719457195571965719757198571995720057201572025720357204572055720657207572085720957210572115721257213572145721557216572175721857219572205722157222572235722457225572265722757228572295723057231572325723357234572355723657237572385723957240572415724257243572445724557246572475724857249572505725157252572535725457255572565725757258572595726057261572625726357264572655726657267572685726957270572715727257273572745727557276572775727857279572805728157282572835728457285572865728757288572895729057291572925729357294572955729657297572985729957300573015730257303573045730557306573075730857309573105731157312573135731457315573165731757318573195732057321573225732357324573255732657327573285732957330573315733257333573345733557336573375733857339573405734157342573435734457345573465734757348573495735057351573525735357354573555735657357573585735957360573615736257363573645736557366573675736857369573705737157372573735737457375573765737757378573795738057381573825738357384573855738657387573885738957390573915739257393573945739557396573975739857399574005740157402574035740457405574065740757408574095741057411574125741357414574155741657417574185741957420574215742257423574245742557426574275742857429574305743157432574335743457435574365743757438574395744057441574425744357444574455744657447574485744957450574515745257453574545745557456574575745857459574605746157462574635746457465574665746757468574695747057471574725747357474574755747657477574785747957480574815748257483574845748557486574875748857489574905749157492574935749457495574965749757498574995750057501575025750357504575055750657507575085750957510575115751257513575145751557516575175751857519575205752157522575235752457525575265752757528575295753057531575325753357534575355753657537575385753957540575415754257543575445754557546575475754857549575505755157552575535755457555575565755757558575595756057561575625756357564575655756657567575685756957570575715757257573575745757557576575775757857579575805758157582575835758457585575865758757588575895759057591575925759357594575955759657597575985759957600576015760257603576045760557606576075760857609576105761157612576135761457615576165761757618576195762057621576225762357624576255762657627576285762957630576315763257633576345763557636576375763857639576405764157642576435764457645576465764757648576495765057651576525765357654576555765657657576585765957660576615766257663576645766557666576675766857669576705767157672576735767457675576765767757678576795768057681576825768357684576855768657687576885768957690576915769257693576945769557696576975769857699577005770157702577035770457705577065770757708577095771057711577125771357714577155771657717577185771957720577215772257723577245772557726577275772857729577305773157732577335773457735577365773757738577395774057741577425774357744577455774657747577485774957750577515775257753577545775557756577575775857759577605776157762577635776457765577665776757768577695777057771577725777357774577755777657777577785777957780577815778257783577845778557786577875778857789577905779157792577935779457795577965779757798577995780057801578025780357804578055780657807578085780957810578115781257813578145781557816578175781857819578205782157822578235782457825578265782757828578295783057831578325783357834578355783657837578385783957840578415784257843578445784557846578475784857849578505785157852578535785457855578565785757858578595786057861578625786357864578655786657867578685786957870578715787257873578745787557876578775787857879578805788157882578835788457885578865788757888578895789057891578925789357894578955789657897578985789957900579015790257903579045790557906579075790857909579105791157912579135791457915579165791757918579195792057921579225792357924579255792657927579285792957930579315793257933579345793557936579375793857939579405794157942579435794457945579465794757948579495795057951579525795357954579555795657957579585795957960579615796257963579645796557966579675796857969579705797157972579735797457975579765797757978579795798057981579825798357984579855798657987579885798957990579915799257993579945799557996579975799857999580005800158002580035800458005580065800758008580095801058011580125801358014580155801658017580185801958020580215802258023580245802558026580275802858029580305803158032580335803458035580365803758038580395804058041580425804358044580455804658047580485804958050580515805258053580545805558056580575805858059580605806158062580635806458065580665806758068580695807058071580725807358074580755807658077580785807958080580815808258083580845808558086580875808858089580905809158092580935809458095580965809758098580995810058101581025810358104581055810658107581085810958110581115811258113581145811558116581175811858119581205812158122581235812458125581265812758128581295813058131581325813358134581355813658137581385813958140581415814258143581445814558146581475814858149581505815158152581535815458155581565815758158581595816058161581625816358164581655816658167581685816958170581715817258173581745817558176581775817858179581805818158182581835818458185581865818758188581895819058191581925819358194581955819658197581985819958200582015820258203582045820558206582075820858209582105821158212582135821458215582165821758218582195822058221582225822358224582255822658227582285822958230582315823258233582345823558236582375823858239582405824158242582435824458245582465824758248582495825058251582525825358254582555825658257582585825958260582615826258263582645826558266582675826858269582705827158272582735827458275582765827758278582795828058281582825828358284582855828658287582885828958290582915829258293582945829558296582975829858299583005830158302583035830458305583065830758308583095831058311583125831358314583155831658317583185831958320583215832258323583245832558326583275832858329583305833158332583335833458335583365833758338583395834058341583425834358344583455834658347583485834958350583515835258353583545835558356583575835858359583605836158362583635836458365583665836758368583695837058371583725837358374583755837658377583785837958380583815838258383583845838558386583875838858389583905839158392583935839458395583965839758398583995840058401584025840358404584055840658407584085840958410584115841258413584145841558416584175841858419584205842158422584235842458425584265842758428584295843058431584325843358434584355843658437584385843958440584415844258443584445844558446584475844858449584505845158452584535845458455584565845758458584595846058461584625846358464584655846658467584685846958470584715847258473584745847558476584775847858479584805848158482584835848458485584865848758488584895849058491584925849358494584955849658497584985849958500585015850258503585045850558506585075850858509585105851158512585135851458515585165851758518585195852058521585225852358524585255852658527585285852958530585315853258533585345853558536585375853858539585405854158542585435854458545585465854758548585495855058551585525855358554585555855658557585585855958560585615856258563585645856558566585675856858569585705857158572585735857458575585765857758578585795858058581585825858358584585855858658587585885858958590585915859258593585945859558596585975859858599586005860158602586035860458605586065860758608586095861058611586125861358614586155861658617586185861958620586215862258623586245862558626586275862858629586305863158632586335863458635586365863758638586395864058641586425864358644586455864658647586485864958650586515865258653586545865558656586575865858659586605866158662586635866458665586665866758668586695867058671586725867358674586755867658677586785867958680586815868258683586845868558686586875868858689586905869158692586935869458695586965869758698586995870058701587025870358704587055870658707587085870958710587115871258713587145871558716587175871858719587205872158722587235872458725587265872758728587295873058731587325873358734587355873658737587385873958740587415874258743587445874558746587475874858749587505875158752587535875458755587565875758758587595876058761587625876358764587655876658767587685876958770587715877258773587745877558776587775877858779587805878158782587835878458785587865878758788587895879058791587925879358794587955879658797587985879958800588015880258803588045880558806588075880858809588105881158812588135881458815588165881758818588195882058821588225882358824588255882658827588285882958830588315883258833588345883558836588375883858839588405884158842588435884458845588465884758848588495885058851588525885358854588555885658857588585885958860588615886258863588645886558866588675886858869588705887158872588735887458875588765887758878588795888058881588825888358884588855888658887588885888958890588915889258893588945889558896588975889858899589005890158902589035890458905589065890758908589095891058911589125891358914589155891658917589185891958920589215892258923589245892558926589275892858929589305893158932589335893458935589365893758938589395894058941589425894358944589455894658947589485894958950589515895258953589545895558956589575895858959589605896158962589635896458965589665896758968589695897058971589725897358974589755897658977589785897958980589815898258983589845898558986589875898858989589905899158992589935899458995589965899758998589995900059001590025900359004590055900659007590085900959010590115901259013590145901559016590175901859019590205902159022590235902459025590265902759028590295903059031590325903359034590355903659037590385903959040590415904259043590445904559046590475904859049590505905159052590535905459055590565905759058590595906059061590625906359064590655906659067590685906959070590715907259073590745907559076590775907859079590805908159082590835908459085590865908759088590895909059091590925909359094590955909659097590985909959100591015910259103591045910559106591075910859109591105911159112591135911459115591165911759118591195912059121591225912359124591255912659127591285912959130591315913259133591345913559136591375913859139591405914159142591435914459145591465914759148591495915059151591525915359154591555915659157591585915959160591615916259163591645916559166591675916859169591705917159172591735917459175591765917759178591795918059181591825918359184591855918659187591885918959190591915919259193591945919559196591975919859199592005920159202592035920459205592065920759208592095921059211592125921359214592155921659217592185921959220592215922259223592245922559226592275922859229592305923159232592335923459235592365923759238592395924059241592425924359244592455924659247592485924959250592515925259253592545925559256592575925859259592605926159262592635926459265592665926759268592695927059271592725927359274592755927659277592785927959280592815928259283592845928559286592875928859289592905929159292592935929459295592965929759298592995930059301593025930359304593055930659307593085930959310593115931259313593145931559316593175931859319593205932159322593235932459325593265932759328593295933059331593325933359334593355933659337593385933959340593415934259343593445934559346593475934859349593505935159352593535935459355593565935759358593595936059361593625936359364593655936659367593685936959370593715937259373593745937559376593775937859379593805938159382593835938459385593865938759388593895939059391593925939359394593955939659397593985939959400594015940259403594045940559406594075940859409594105941159412594135941459415594165941759418594195942059421594225942359424594255942659427594285942959430594315943259433594345943559436594375943859439594405944159442594435944459445594465944759448594495945059451594525945359454594555945659457594585945959460594615946259463594645946559466594675946859469594705947159472594735947459475594765947759478594795948059481594825948359484594855948659487594885948959490594915949259493594945949559496594975949859499595005950159502595035950459505595065950759508595095951059511595125951359514595155951659517595185951959520595215952259523595245952559526595275952859529595305953159532595335953459535595365953759538595395954059541595425954359544595455954659547595485954959550595515955259553595545955559556595575955859559595605956159562595635956459565595665956759568595695957059571595725957359574595755957659577595785957959580595815958259583595845958559586595875958859589595905959159592595935959459595595965959759598595995960059601596025960359604596055960659607596085960959610596115961259613596145961559616596175961859619596205962159622596235962459625596265962759628596295963059631596325963359634596355963659637596385963959640596415964259643596445964559646596475964859649596505965159652596535965459655596565965759658596595966059661596625966359664596655966659667596685966959670596715967259673596745967559676596775967859679596805968159682596835968459685596865968759688596895969059691596925969359694596955969659697596985969959700597015970259703597045970559706597075970859709597105971159712597135971459715597165971759718597195972059721597225972359724597255972659727597285972959730597315973259733597345973559736597375973859739597405974159742597435974459745597465974759748597495975059751597525975359754597555975659757597585975959760597615976259763597645976559766597675976859769597705977159772597735977459775597765977759778597795978059781597825978359784597855978659787597885978959790597915979259793597945979559796597975979859799598005980159802598035980459805598065980759808598095981059811598125981359814598155981659817598185981959820598215982259823598245982559826598275982859829598305983159832598335983459835598365983759838598395984059841598425984359844598455984659847598485984959850598515985259853598545985559856598575985859859598605986159862598635986459865598665986759868598695987059871598725987359874598755987659877598785987959880598815988259883598845988559886598875988859889598905989159892598935989459895598965989759898598995990059901599025990359904599055990659907599085990959910599115991259913599145991559916599175991859919599205992159922599235992459925599265992759928599295993059931599325993359934599355993659937599385993959940599415994259943599445994559946599475994859949599505995159952599535995459955599565995759958599595996059961599625996359964599655996659967599685996959970599715997259973599745997559976599775997859979599805998159982599835998459985599865998759988599895999059991599925999359994599955999659997599985999960000600016000260003600046000560006600076000860009600106001160012600136001460015600166001760018600196002060021600226002360024600256002660027600286002960030600316003260033600346003560036600376003860039600406004160042600436004460045600466004760048600496005060051600526005360054600556005660057600586005960060600616006260063600646006560066600676006860069600706007160072600736007460075600766007760078600796008060081600826008360084600856008660087600886008960090600916009260093600946009560096600976009860099601006010160102601036010460105601066010760108601096011060111601126011360114601156011660117601186011960120601216012260123601246012560126601276012860129601306013160132601336013460135601366013760138601396014060141601426014360144601456014660147601486014960150601516015260153601546015560156601576015860159601606016160162601636016460165601666016760168601696017060171601726017360174601756017660177601786017960180601816018260183601846018560186601876018860189601906019160192601936019460195601966019760198601996020060201602026020360204602056020660207602086020960210602116021260213602146021560216602176021860219602206022160222602236022460225602266022760228602296023060231602326023360234602356023660237602386023960240602416024260243602446024560246602476024860249602506025160252602536025460255602566025760258602596026060261602626026360264602656026660267602686026960270602716027260273602746027560276602776027860279602806028160282602836028460285602866028760288602896029060291602926029360294602956029660297602986029960300603016030260303603046030560306603076030860309603106031160312603136031460315603166031760318603196032060321603226032360324603256032660327603286032960330603316033260333603346033560336603376033860339603406034160342603436034460345603466034760348603496035060351603526035360354603556035660357603586035960360603616036260363603646036560366603676036860369603706037160372603736037460375603766037760378603796038060381603826038360384603856038660387603886038960390603916039260393603946039560396603976039860399604006040160402604036040460405604066040760408604096041060411604126041360414604156041660417604186041960420604216042260423604246042560426604276042860429604306043160432604336043460435604366043760438604396044060441604426044360444604456044660447604486044960450604516045260453604546045560456604576045860459604606046160462604636046460465604666046760468604696047060471604726047360474604756047660477604786047960480604816048260483604846048560486604876048860489604906049160492604936049460495604966049760498604996050060501605026050360504605056050660507605086050960510605116051260513605146051560516605176051860519605206052160522605236052460525605266052760528605296053060531605326053360534605356053660537605386053960540605416054260543605446054560546605476054860549605506055160552605536055460555605566055760558605596056060561605626056360564605656056660567605686056960570605716057260573605746057560576605776057860579605806058160582605836058460585605866058760588605896059060591605926059360594605956059660597605986059960600606016060260603606046060560606606076060860609606106061160612606136061460615606166061760618606196062060621606226062360624606256062660627606286062960630606316063260633606346063560636606376063860639606406064160642606436064460645606466064760648606496065060651606526065360654606556065660657606586065960660606616066260663606646066560666606676066860669606706067160672606736067460675606766067760678606796068060681606826068360684606856068660687606886068960690606916069260693606946069560696606976069860699607006070160702607036070460705607066070760708607096071060711607126071360714607156071660717607186071960720607216072260723607246072560726607276072860729607306073160732607336073460735607366073760738607396074060741607426074360744607456074660747607486074960750607516075260753607546075560756607576075860759607606076160762607636076460765607666076760768607696077060771607726077360774607756077660777607786077960780607816078260783607846078560786607876078860789607906079160792607936079460795607966079760798607996080060801608026080360804608056080660807608086080960810608116081260813608146081560816608176081860819608206082160822608236082460825608266082760828608296083060831608326083360834608356083660837608386083960840608416084260843608446084560846608476084860849608506085160852608536085460855608566085760858608596086060861608626086360864608656086660867608686086960870608716087260873608746087560876608776087860879608806088160882608836088460885608866088760888608896089060891608926089360894608956089660897608986089960900609016090260903609046090560906609076090860909609106091160912609136091460915609166091760918609196092060921609226092360924609256092660927609286092960930609316093260933609346093560936609376093860939609406094160942609436094460945609466094760948609496095060951609526095360954609556095660957609586095960960609616096260963609646096560966609676096860969609706097160972609736097460975609766097760978609796098060981609826098360984609856098660987609886098960990609916099260993609946099560996609976099860999610006100161002610036100461005610066100761008610096101061011610126101361014610156101661017610186101961020610216102261023610246102561026610276102861029610306103161032610336103461035610366103761038610396104061041610426104361044610456104661047610486104961050610516105261053610546105561056610576105861059610606106161062610636106461065610666106761068610696107061071610726107361074610756107661077610786107961080610816108261083610846108561086610876108861089610906109161092610936109461095610966109761098610996110061101611026110361104611056110661107611086110961110611116111261113611146111561116611176111861119611206112161122611236112461125611266112761128611296113061131611326113361134611356113661137611386113961140611416114261143611446114561146611476114861149611506115161152611536115461155611566115761158611596116061161611626116361164611656116661167611686116961170611716117261173611746117561176611776117861179611806118161182611836118461185611866118761188611896119061191611926119361194611956119661197611986119961200612016120261203612046120561206612076120861209612106121161212612136121461215612166121761218612196122061221612226122361224612256122661227612286122961230612316123261233612346123561236612376123861239612406124161242612436124461245612466124761248612496125061251612526125361254612556125661257612586125961260612616126261263612646126561266612676126861269612706127161272612736127461275612766127761278612796128061281612826128361284612856128661287612886128961290612916129261293612946129561296612976129861299613006130161302613036130461305613066130761308613096131061311613126131361314613156131661317613186131961320613216132261323613246132561326613276132861329613306133161332613336133461335613366133761338613396134061341613426134361344613456134661347613486134961350613516135261353613546135561356613576135861359613606136161362613636136461365613666136761368613696137061371613726137361374613756137661377613786137961380613816138261383613846138561386613876138861389613906139161392613936139461395613966139761398613996140061401614026140361404614056140661407614086140961410614116141261413614146141561416614176141861419614206142161422614236142461425614266142761428614296143061431614326143361434614356143661437614386143961440614416144261443614446144561446614476144861449614506145161452614536145461455614566145761458614596146061461614626146361464614656146661467614686146961470614716147261473614746147561476614776147861479614806148161482614836148461485614866148761488614896149061491614926149361494614956149661497614986149961500615016150261503615046150561506615076150861509615106151161512615136151461515615166151761518615196152061521615226152361524615256152661527615286152961530615316153261533615346153561536615376153861539615406154161542615436154461545615466154761548615496155061551615526155361554615556155661557615586155961560615616156261563615646156561566615676156861569615706157161572615736157461575615766157761578615796158061581615826158361584615856158661587615886158961590615916159261593615946159561596615976159861599616006160161602616036160461605616066160761608616096161061611616126161361614616156161661617616186161961620616216162261623616246162561626616276162861629616306163161632616336163461635616366163761638616396164061641616426164361644616456164661647616486164961650616516165261653616546165561656616576165861659616606166161662616636166461665616666166761668616696167061671616726167361674616756167661677616786167961680616816168261683616846168561686616876168861689616906169161692616936169461695616966169761698616996170061701617026170361704617056170661707617086170961710617116171261713617146171561716617176171861719617206172161722617236172461725617266172761728617296173061731617326173361734617356173661737617386173961740617416174261743617446174561746617476174861749617506175161752617536175461755617566175761758617596176061761617626176361764617656176661767617686176961770617716177261773617746177561776617776177861779617806178161782617836178461785617866178761788617896179061791617926179361794617956179661797617986179961800618016180261803618046180561806618076180861809618106181161812618136181461815618166181761818618196182061821618226182361824618256182661827618286182961830618316183261833618346183561836618376183861839618406184161842618436184461845618466184761848618496185061851618526185361854618556185661857618586185961860618616186261863618646186561866618676186861869618706187161872618736187461875618766187761878618796188061881618826188361884618856188661887618886188961890618916189261893618946189561896618976189861899619006190161902619036190461905619066190761908619096191061911619126191361914619156191661917619186191961920619216192261923619246192561926619276192861929619306193161932619336193461935619366193761938619396194061941619426194361944619456194661947619486194961950619516195261953619546195561956619576195861959619606196161962619636196461965619666196761968619696197061971619726197361974619756197661977619786197961980619816198261983619846198561986619876198861989619906199161992619936199461995619966199761998619996200062001620026200362004620056200662007620086200962010620116201262013620146201562016620176201862019620206202162022620236202462025620266202762028620296203062031620326203362034620356203662037620386203962040620416204262043620446204562046620476204862049620506205162052620536205462055620566205762058620596206062061620626206362064620656206662067620686206962070620716207262073620746207562076620776207862079620806208162082620836208462085620866208762088620896209062091620926209362094620956209662097620986209962100621016210262103621046210562106621076210862109621106211162112621136211462115621166211762118621196212062121621226212362124621256212662127621286212962130621316213262133621346213562136621376213862139621406214162142621436214462145621466214762148621496215062151621526215362154621556215662157621586215962160621616216262163621646216562166621676216862169621706217162172621736217462175621766217762178621796218062181621826218362184621856218662187621886218962190621916219262193621946219562196621976219862199622006220162202622036220462205622066220762208622096221062211622126221362214622156221662217622186221962220622216222262223622246222562226622276222862229622306223162232622336223462235622366223762238622396224062241622426224362244622456224662247622486224962250622516225262253622546225562256622576225862259622606226162262622636226462265622666226762268622696227062271622726227362274622756227662277622786227962280622816228262283622846228562286622876228862289622906229162292622936229462295622966229762298622996230062301623026230362304623056230662307623086230962310623116231262313623146231562316623176231862319623206232162322623236232462325623266232762328623296233062331623326233362334623356233662337623386233962340623416234262343623446234562346623476234862349623506235162352623536235462355623566235762358623596236062361623626236362364623656236662367623686236962370623716237262373623746237562376623776237862379623806238162382623836238462385623866238762388623896239062391623926239362394623956239662397623986239962400624016240262403624046240562406624076240862409624106241162412624136241462415624166241762418624196242062421624226242362424624256242662427624286242962430624316243262433624346243562436624376243862439624406244162442624436244462445624466244762448624496245062451624526245362454624556245662457624586245962460624616246262463624646246562466624676246862469624706247162472624736247462475624766247762478624796248062481624826248362484624856248662487624886248962490624916249262493624946249562496624976249862499625006250162502625036250462505625066250762508625096251062511625126251362514625156251662517625186251962520625216252262523625246252562526625276252862529625306253162532625336253462535625366253762538625396254062541625426254362544625456254662547625486254962550625516255262553625546255562556625576255862559625606256162562625636256462565625666256762568625696257062571625726257362574625756257662577625786257962580625816258262583625846258562586625876258862589625906259162592625936259462595625966259762598625996260062601626026260362604626056260662607626086260962610626116261262613626146261562616626176261862619626206262162622626236262462625626266262762628626296263062631626326263362634626356263662637626386263962640626416264262643626446264562646626476264862649626506265162652626536265462655626566265762658626596266062661626626266362664626656266662667626686266962670626716267262673626746267562676626776267862679626806268162682626836268462685626866268762688626896269062691626926269362694626956269662697626986269962700627016270262703627046270562706627076270862709627106271162712627136271462715627166271762718627196272062721627226272362724627256272662727627286272962730627316273262733627346273562736627376273862739627406274162742627436274462745627466274762748627496275062751627526275362754627556275662757627586275962760627616276262763627646276562766627676276862769627706277162772627736277462775627766277762778627796278062781627826278362784627856278662787627886278962790627916279262793627946279562796627976279862799628006280162802628036280462805628066280762808628096281062811628126281362814628156281662817628186281962820628216282262823628246282562826628276282862829628306283162832628336283462835628366283762838628396284062841628426284362844628456284662847628486284962850628516285262853628546285562856628576285862859628606286162862628636286462865628666286762868628696287062871628726287362874628756287662877628786287962880628816288262883628846288562886628876288862889628906289162892628936289462895628966289762898628996290062901629026290362904629056290662907629086290962910629116291262913629146291562916629176291862919629206292162922629236292462925629266292762928629296293062931629326293362934629356293662937629386293962940629416294262943629446294562946629476294862949629506295162952629536295462955629566295762958629596296062961629626296362964629656296662967629686296962970629716297262973629746297562976629776297862979629806298162982629836298462985629866298762988629896299062991629926299362994629956299662997629986299963000630016300263003630046300563006630076300863009630106301163012630136301463015630166301763018630196302063021630226302363024630256302663027630286302963030630316303263033630346303563036630376303863039630406304163042630436304463045630466304763048630496305063051630526305363054630556305663057630586305963060630616306263063630646306563066630676306863069630706307163072630736307463075630766307763078630796308063081630826308363084630856308663087630886308963090630916309263093630946309563096630976309863099631006310163102631036310463105631066310763108631096311063111631126311363114631156311663117631186311963120631216312263123631246312563126631276312863129631306313163132631336313463135631366313763138631396314063141631426314363144631456314663147631486314963150631516315263153631546315563156631576315863159631606316163162631636316463165631666316763168631696317063171631726317363174631756317663177631786317963180631816318263183631846318563186631876318863189631906319163192631936319463195631966319763198631996320063201632026320363204632056320663207632086320963210632116321263213632146321563216632176321863219632206322163222632236322463225632266322763228632296323063231632326323363234632356323663237632386323963240632416324263243632446324563246632476324863249632506325163252632536325463255632566325763258632596326063261632626326363264632656326663267632686326963270632716327263273632746327563276632776327863279632806328163282632836328463285632866328763288632896329063291632926329363294632956329663297632986329963300633016330263303633046330563306633076330863309633106331163312633136331463315633166331763318633196332063321633226332363324633256332663327633286332963330633316333263333633346333563336633376333863339633406334163342633436334463345633466334763348633496335063351633526335363354633556335663357633586335963360633616336263363633646336563366633676336863369633706337163372633736337463375633766337763378633796338063381633826338363384633856338663387633886338963390633916339263393633946339563396633976339863399634006340163402634036340463405634066340763408634096341063411634126341363414634156341663417634186341963420634216342263423634246342563426634276342863429634306343163432634336343463435634366343763438634396344063441634426344363444634456344663447634486344963450634516345263453634546345563456634576345863459634606346163462634636346463465634666346763468634696347063471634726347363474634756347663477634786347963480634816348263483634846348563486634876348863489634906349163492634936349463495634966349763498634996350063501635026350363504635056350663507635086350963510635116351263513635146351563516635176351863519635206352163522635236352463525635266352763528635296353063531635326353363534635356353663537635386353963540635416354263543635446354563546635476354863549635506355163552635536355463555635566355763558635596356063561635626356363564635656356663567635686356963570635716357263573635746357563576635776357863579635806358163582635836358463585635866358763588635896359063591635926359363594635956359663597635986359963600636016360263603636046360563606636076360863609636106361163612636136361463615636166361763618636196362063621636226362363624636256362663627636286362963630636316363263633636346363563636636376363863639636406364163642636436364463645636466364763648636496365063651636526365363654636556365663657636586365963660636616366263663636646366563666636676366863669636706367163672636736367463675636766367763678636796368063681636826368363684636856368663687636886368963690636916369263693636946369563696636976369863699637006370163702637036370463705637066370763708637096371063711637126371363714637156371663717637186371963720637216372263723637246372563726637276372863729637306373163732637336373463735637366373763738637396374063741637426374363744637456374663747637486374963750637516375263753637546375563756637576375863759637606376163762637636376463765637666376763768637696377063771637726377363774637756377663777637786377963780637816378263783637846378563786637876378863789637906379163792637936379463795637966379763798637996380063801638026380363804638056380663807638086380963810638116381263813638146381563816638176381863819638206382163822638236382463825638266382763828638296383063831638326383363834638356383663837638386383963840638416384263843638446384563846638476384863849638506385163852638536385463855638566385763858638596386063861638626386363864638656386663867638686386963870638716387263873638746387563876638776387863879638806388163882638836388463885638866388763888638896389063891638926389363894638956389663897638986389963900639016390263903639046390563906639076390863909639106391163912639136391463915639166391763918639196392063921639226392363924639256392663927639286392963930639316393263933639346393563936639376393863939639406394163942639436394463945639466394763948639496395063951639526395363954639556395663957639586395963960639616396263963639646396563966639676396863969639706397163972639736397463975639766397763978639796398063981639826398363984639856398663987639886398963990639916399263993639946399563996639976399863999640006400164002640036400464005640066400764008640096401064011640126401364014640156401664017640186401964020640216402264023640246402564026640276402864029640306403164032640336403464035640366403764038640396404064041640426404364044640456404664047640486404964050640516405264053640546405564056640576405864059640606406164062640636406464065640666406764068640696407064071640726407364074640756407664077640786407964080640816408264083640846408564086640876408864089640906409164092640936409464095640966409764098640996410064101641026410364104641056410664107641086410964110641116411264113641146411564116641176411864119641206412164122641236412464125641266412764128641296413064131641326413364134641356413664137641386413964140641416414264143641446414564146641476414864149641506415164152641536415464155641566415764158641596416064161641626416364164641656416664167641686416964170641716417264173641746417564176641776417864179641806418164182641836418464185641866418764188641896419064191641926419364194641956419664197641986419964200642016420264203642046420564206642076420864209642106421164212642136421464215642166421764218642196422064221642226422364224642256422664227642286422964230642316423264233642346423564236642376423864239642406424164242642436424464245642466424764248642496425064251642526425364254642556425664257642586425964260642616426264263642646426564266642676426864269642706427164272642736427464275642766427764278642796428064281642826428364284642856428664287642886428964290642916429264293642946429564296642976429864299643006430164302643036430464305643066430764308643096431064311643126431364314643156431664317643186431964320643216432264323643246432564326643276432864329643306433164332643336433464335643366433764338643396434064341643426434364344643456434664347643486434964350643516435264353643546435564356643576435864359643606436164362643636436464365643666436764368643696437064371643726437364374643756437664377643786437964380643816438264383643846438564386643876438864389643906439164392643936439464395643966439764398643996440064401644026440364404644056440664407644086440964410644116441264413644146441564416644176441864419644206442164422644236442464425644266442764428644296443064431644326443364434644356443664437644386443964440644416444264443644446444564446644476444864449644506445164452644536445464455644566445764458644596446064461644626446364464644656446664467644686446964470644716447264473644746447564476644776447864479644806448164482644836448464485644866448764488644896449064491644926449364494644956449664497644986449964500645016450264503645046450564506645076450864509645106451164512645136451464515645166451764518645196452064521645226452364524645256452664527645286452964530645316453264533645346453564536645376453864539645406454164542645436454464545645466454764548645496455064551645526455364554645556455664557645586455964560645616456264563645646456564566645676456864569645706457164572645736457464575645766457764578645796458064581645826458364584645856458664587645886458964590645916459264593645946459564596645976459864599646006460164602646036460464605646066460764608646096461064611646126461364614646156461664617646186461964620646216462264623646246462564626646276462864629646306463164632646336463464635646366463764638646396464064641646426464364644646456464664647646486464964650646516465264653646546465564656646576465864659646606466164662646636466464665646666466764668646696467064671646726467364674646756467664677646786467964680646816468264683646846468564686646876468864689646906469164692646936469464695646966469764698646996470064701647026470364704647056470664707647086470964710647116471264713647146471564716647176471864719647206472164722647236472464725647266472764728647296473064731647326473364734647356473664737647386473964740647416474264743647446474564746647476474864749647506475164752647536475464755647566475764758647596476064761647626476364764647656476664767647686476964770647716477264773647746477564776647776477864779647806478164782647836478464785647866478764788647896479064791647926479364794647956479664797647986479964800648016480264803648046480564806648076480864809648106481164812648136481464815648166481764818648196482064821648226482364824648256482664827648286482964830648316483264833648346483564836648376483864839648406484164842648436484464845648466484764848648496485064851648526485364854648556485664857648586485964860648616486264863648646486564866648676486864869648706487164872648736487464875648766487764878648796488064881648826488364884648856488664887648886488964890648916489264893648946489564896648976489864899649006490164902649036490464905649066490764908649096491064911649126491364914649156491664917649186491964920649216492264923649246492564926649276492864929649306493164932649336493464935649366493764938649396494064941649426494364944649456494664947649486494964950649516495264953649546495564956649576495864959649606496164962649636496464965649666496764968649696497064971649726497364974649756497664977649786497964980649816498264983649846498564986649876498864989649906499164992649936499464995649966499764998649996500065001650026500365004650056500665007650086500965010650116501265013650146501565016650176501865019650206502165022650236502465025650266502765028650296503065031650326503365034650356503665037650386503965040650416504265043650446504565046650476504865049650506505165052650536505465055650566505765058650596506065061650626506365064650656506665067650686506965070650716507265073650746507565076650776507865079650806508165082650836508465085650866508765088650896509065091650926509365094650956509665097650986509965100651016510265103651046510565106651076510865109651106511165112651136511465115651166511765118651196512065121651226512365124651256512665127651286512965130651316513265133651346513565136651376513865139651406514165142651436514465145651466514765148651496515065151651526515365154651556515665157651586515965160651616516265163651646516565166651676516865169651706517165172651736517465175651766517765178651796518065181651826518365184651856518665187651886518965190651916519265193651946519565196651976519865199652006520165202652036520465205652066520765208652096521065211652126521365214652156521665217652186521965220652216522265223652246522565226652276522865229652306523165232652336523465235652366523765238652396524065241652426524365244652456524665247652486524965250652516525265253652546525565256652576525865259652606526165262652636526465265652666526765268652696527065271652726527365274652756527665277652786527965280652816528265283652846528565286652876528865289652906529165292652936529465295652966529765298652996530065301653026530365304653056530665307653086530965310653116531265313653146531565316653176531865319653206532165322653236532465325653266532765328653296533065331653326533365334653356533665337653386533965340653416534265343653446534565346653476534865349653506535165352653536535465355653566535765358653596536065361653626536365364653656536665367653686536965370653716537265373653746537565376653776537865379653806538165382653836538465385653866538765388653896539065391653926539365394653956539665397653986539965400654016540265403654046540565406654076540865409654106541165412654136541465415654166541765418654196542065421654226542365424654256542665427654286542965430654316543265433654346543565436654376543865439654406544165442654436544465445654466544765448654496545065451654526545365454654556545665457654586545965460654616546265463654646546565466654676546865469654706547165472654736547465475654766547765478654796548065481654826548365484654856548665487654886548965490654916549265493654946549565496654976549865499655006550165502655036550465505655066550765508655096551065511655126551365514655156551665517655186551965520655216552265523655246552565526655276552865529655306553165532655336553465535655366553765538655396554065541655426554365544655456554665547655486554965550655516555265553655546555565556655576555865559655606556165562655636556465565655666556765568655696557065571655726557365574655756557665577655786557965580655816558265583655846558565586655876558865589655906559165592655936559465595655966559765598655996560065601656026560365604656056560665607656086560965610656116561265613656146561565616656176561865619656206562165622656236562465625656266562765628656296563065631656326563365634656356563665637656386563965640656416564265643656446564565646656476564865649656506565165652656536565465655656566565765658656596566065661656626566365664656656566665667656686566965670656716567265673656746567565676656776567865679656806568165682656836568465685656866568765688656896569065691656926569365694656956569665697656986569965700657016570265703657046570565706657076570865709657106571165712657136571465715657166571765718657196572065721657226572365724657256572665727657286572965730657316573265733657346573565736657376573865739657406574165742657436574465745657466574765748657496575065751657526575365754657556575665757657586575965760657616576265763657646576565766657676576865769657706577165772657736577465775657766577765778657796578065781657826578365784657856578665787657886578965790657916579265793657946579565796657976579865799658006580165802658036580465805658066580765808658096581065811658126581365814658156581665817658186581965820658216582265823658246582565826658276582865829658306583165832658336583465835658366583765838658396584065841658426584365844658456584665847658486584965850658516585265853658546585565856658576585865859658606586165862658636586465865658666586765868658696587065871658726587365874658756587665877658786587965880658816588265883658846588565886658876588865889658906589165892658936589465895658966589765898658996590065901659026590365904659056590665907659086590965910659116591265913659146591565916659176591865919659206592165922659236592465925659266592765928659296593065931659326593365934659356593665937659386593965940659416594265943659446594565946659476594865949659506595165952659536595465955659566595765958659596596065961659626596365964659656596665967659686596965970659716597265973659746597565976659776597865979659806598165982659836598465985659866598765988659896599065991659926599365994659956599665997659986599966000660016600266003660046600566006660076600866009660106601166012660136601466015660166601766018660196602066021660226602366024660256602666027660286602966030660316603266033660346603566036660376603866039660406604166042660436604466045660466604766048660496605066051660526605366054660556605666057660586605966060660616606266063660646606566066660676606866069660706607166072660736607466075660766607766078660796608066081660826608366084660856608666087660886608966090660916609266093660946609566096660976609866099661006610166102661036610466105661066610766108661096611066111661126611366114661156611666117661186611966120661216612266123661246612566126661276612866129661306613166132661336613466135661366613766138661396614066141661426614366144661456614666147661486614966150661516615266153661546615566156661576615866159661606616166162661636616466165661666616766168661696617066171661726617366174661756617666177661786617966180661816618266183661846618566186661876618866189661906619166192661936619466195661966619766198661996620066201662026620366204662056620666207662086620966210662116621266213662146621566216662176621866219662206622166222662236622466225662266622766228662296623066231662326623366234662356623666237662386623966240662416624266243662446624566246662476624866249662506625166252662536625466255662566625766258662596626066261662626626366264662656626666267662686626966270662716627266273662746627566276662776627866279662806628166282662836628466285662866628766288662896629066291662926629366294662956629666297662986629966300663016630266303663046630566306663076630866309663106631166312663136631466315663166631766318663196632066321663226632366324663256632666327663286632966330663316633266333663346633566336663376633866339663406634166342663436634466345663466634766348663496635066351663526635366354663556635666357663586635966360663616636266363663646636566366663676636866369663706637166372663736637466375663766637766378663796638066381663826638366384663856638666387663886638966390663916639266393663946639566396663976639866399664006640166402664036640466405664066640766408664096641066411664126641366414664156641666417664186641966420664216642266423664246642566426664276642866429664306643166432664336643466435664366643766438664396644066441664426644366444664456644666447664486644966450664516645266453664546645566456664576645866459664606646166462664636646466465664666646766468664696647066471664726647366474664756647666477664786647966480664816648266483664846648566486664876648866489664906649166492664936649466495664966649766498664996650066501665026650366504665056650666507665086650966510665116651266513665146651566516665176651866519665206652166522665236652466525665266652766528665296653066531665326653366534665356653666537665386653966540665416654266543665446654566546665476654866549665506655166552665536655466555665566655766558665596656066561665626656366564665656656666567665686656966570665716657266573665746657566576665776657866579665806658166582665836658466585665866658766588665896659066591665926659366594665956659666597665986659966600666016660266603666046660566606666076660866609666106661166612666136661466615666166661766618666196662066621666226662366624666256662666627666286662966630666316663266633666346663566636666376663866639666406664166642666436664466645666466664766648666496665066651666526665366654666556665666657666586665966660666616666266663666646666566666666676666866669666706667166672666736667466675666766667766678666796668066681666826668366684666856668666687666886668966690666916669266693666946669566696666976669866699667006670166702667036670466705667066670766708667096671066711667126671366714667156671666717667186671966720667216672266723667246672566726667276672866729667306673166732667336673466735667366673766738667396674066741667426674366744667456674666747667486674966750667516675266753667546675566756667576675866759667606676166762667636676466765667666676766768667696677066771667726677366774667756677666777667786677966780667816678266783667846678566786667876678866789667906679166792667936679466795667966679766798667996680066801668026680366804668056680666807668086680966810668116681266813668146681566816668176681866819668206682166822668236682466825668266682766828668296683066831668326683366834668356683666837668386683966840668416684266843668446684566846668476684866849668506685166852668536685466855668566685766858668596686066861668626686366864668656686666867668686686966870668716687266873668746687566876668776687866879668806688166882668836688466885668866688766888668896689066891668926689366894668956689666897668986689966900669016690266903669046690566906669076690866909669106691166912669136691466915669166691766918669196692066921669226692366924669256692666927669286692966930669316693266933669346693566936669376693866939669406694166942669436694466945669466694766948669496695066951669526695366954669556695666957669586695966960669616696266963669646696566966669676696866969669706697166972669736697466975669766697766978669796698066981669826698366984669856698666987669886698966990669916699266993669946699566996669976699866999670006700167002670036700467005670066700767008670096701067011670126701367014670156701667017670186701967020670216702267023670246702567026670276702867029670306703167032670336703467035670366703767038670396704067041670426704367044670456704667047670486704967050670516705267053670546705567056670576705867059670606706167062670636706467065670666706767068670696707067071670726707367074670756707667077670786707967080670816708267083670846708567086670876708867089670906709167092670936709467095670966709767098670996710067101671026710367104671056710667107671086710967110671116711267113671146711567116671176711867119671206712167122671236712467125671266712767128671296713067131671326713367134671356713667137671386713967140671416714267143671446714567146671476714867149671506715167152671536715467155671566715767158671596716067161671626716367164671656716667167671686716967170671716717267173671746717567176671776717867179671806718167182671836718467185671866718767188671896719067191671926719367194671956719667197671986719967200672016720267203672046720567206672076720867209672106721167212672136721467215672166721767218672196722067221672226722367224672256722667227672286722967230672316723267233672346723567236672376723867239672406724167242672436724467245672466724767248672496725067251672526725367254672556725667257672586725967260672616726267263672646726567266672676726867269672706727167272672736727467275672766727767278672796728067281672826728367284672856728667287672886728967290672916729267293672946729567296672976729867299673006730167302673036730467305673066730767308673096731067311673126731367314673156731667317673186731967320673216732267323673246732567326673276732867329673306733167332673336733467335673366733767338673396734067341673426734367344673456734667347673486734967350673516735267353673546735567356673576735867359673606736167362673636736467365673666736767368673696737067371673726737367374673756737667377673786737967380673816738267383673846738567386673876738867389673906739167392673936739467395673966739767398673996740067401674026740367404674056740667407674086740967410674116741267413674146741567416674176741867419674206742167422674236742467425674266742767428674296743067431674326743367434674356743667437674386743967440674416744267443674446744567446674476744867449674506745167452674536745467455674566745767458674596746067461674626746367464674656746667467674686746967470674716747267473674746747567476674776747867479674806748167482674836748467485674866748767488674896749067491674926749367494674956749667497674986749967500675016750267503675046750567506675076750867509675106751167512675136751467515675166751767518675196752067521675226752367524675256752667527675286752967530675316753267533675346753567536675376753867539675406754167542675436754467545675466754767548675496755067551675526755367554675556755667557675586755967560675616756267563675646756567566675676756867569675706757167572675736757467575675766757767578675796758067581675826758367584675856758667587675886758967590675916759267593675946759567596675976759867599676006760167602676036760467605676066760767608676096761067611676126761367614676156761667617676186761967620676216762267623676246762567626676276762867629676306763167632676336763467635676366763767638676396764067641676426764367644676456764667647676486764967650676516765267653676546765567656676576765867659676606766167662676636766467665676666766767668676696767067671676726767367674676756767667677676786767967680676816768267683676846768567686676876768867689676906769167692676936769467695676966769767698676996770067701677026770367704677056770667707677086770967710677116771267713677146771567716677176771867719677206772167722677236772467725677266772767728677296773067731677326773367734677356773667737677386773967740677416774267743677446774567746677476774867749677506775167752677536775467755677566775767758677596776067761677626776367764677656776667767677686776967770677716777267773677746777567776677776777867779677806778167782677836778467785677866778767788677896779067791677926779367794677956779667797677986779967800678016780267803678046780567806678076780867809678106781167812678136781467815678166781767818678196782067821678226782367824678256782667827678286782967830678316783267833678346783567836678376783867839678406784167842678436784467845678466784767848678496785067851678526785367854678556785667857678586785967860678616786267863678646786567866678676786867869678706787167872678736787467875678766787767878678796788067881678826788367884678856788667887678886788967890678916789267893678946789567896678976789867899679006790167902679036790467905679066790767908679096791067911679126791367914679156791667917679186791967920679216792267923679246792567926679276792867929679306793167932679336793467935679366793767938679396794067941679426794367944679456794667947679486794967950679516795267953679546795567956679576795867959679606796167962679636796467965679666796767968679696797067971679726797367974679756797667977679786797967980679816798267983679846798567986679876798867989679906799167992679936799467995679966799767998679996800068001680026800368004680056800668007680086800968010680116801268013680146801568016680176801868019680206802168022680236802468025680266802768028680296803068031680326803368034680356803668037680386803968040680416804268043680446804568046680476804868049680506805168052680536805468055680566805768058680596806068061680626806368064680656806668067680686806968070680716807268073680746807568076680776807868079680806808168082680836808468085680866808768088680896809068091680926809368094680956809668097680986809968100681016810268103681046810568106681076810868109681106811168112681136811468115681166811768118681196812068121681226812368124681256812668127681286812968130681316813268133681346813568136681376813868139681406814168142681436814468145681466814768148681496815068151681526815368154681556815668157681586815968160681616816268163681646816568166681676816868169681706817168172681736817468175681766817768178681796818068181681826818368184681856818668187681886818968190681916819268193681946819568196681976819868199682006820168202682036820468205682066820768208682096821068211682126821368214682156821668217682186821968220682216822268223682246822568226682276822868229682306823168232682336823468235682366823768238682396824068241682426824368244682456824668247682486824968250682516825268253682546825568256682576825868259682606826168262682636826468265682666826768268682696827068271682726827368274682756827668277682786827968280682816828268283682846828568286682876828868289682906829168292682936829468295682966829768298682996830068301683026830368304683056830668307683086830968310683116831268313683146831568316683176831868319683206832168322683236832468325683266832768328683296833068331683326833368334683356833668337683386833968340683416834268343683446834568346683476834868349683506835168352683536835468355683566835768358683596836068361683626836368364683656836668367683686836968370683716837268373683746837568376683776837868379683806838168382683836838468385683866838768388683896839068391683926839368394683956839668397683986839968400684016840268403684046840568406684076840868409684106841168412684136841468415684166841768418684196842068421684226842368424684256842668427684286842968430684316843268433684346843568436684376843868439684406844168442684436844468445684466844768448684496845068451684526845368454684556845668457684586845968460684616846268463684646846568466684676846868469684706847168472684736847468475684766847768478684796848068481684826848368484684856848668487684886848968490684916849268493684946849568496684976849868499685006850168502685036850468505685066850768508685096851068511685126851368514685156851668517685186851968520685216852268523685246852568526685276852868529685306853168532685336853468535685366853768538685396854068541685426854368544685456854668547685486854968550685516855268553685546855568556685576855868559685606856168562685636856468565685666856768568685696857068571685726857368574685756857668577685786857968580685816858268583685846858568586685876858868589685906859168592685936859468595685966859768598685996860068601686026860368604686056860668607686086860968610686116861268613686146861568616686176861868619686206862168622686236862468625686266862768628686296863068631686326863368634686356863668637686386863968640686416864268643686446864568646686476864868649686506865168652686536865468655686566865768658686596866068661686626866368664686656866668667686686866968670686716867268673686746867568676686776867868679686806868168682686836868468685686866868768688686896869068691686926869368694686956869668697686986869968700687016870268703687046870568706687076870868709687106871168712687136871468715687166871768718687196872068721687226872368724687256872668727687286872968730687316873268733687346873568736687376873868739687406874168742687436874468745687466874768748687496875068751687526875368754687556875668757687586875968760687616876268763687646876568766687676876868769687706877168772687736877468775687766877768778687796878068781687826878368784687856878668787687886878968790687916879268793687946879568796687976879868799688006880168802688036880468805688066880768808688096881068811688126881368814688156881668817688186881968820688216882268823688246882568826688276882868829688306883168832688336883468835688366883768838688396884068841688426884368844688456884668847688486884968850688516885268853688546885568856688576885868859688606886168862688636886468865688666886768868688696887068871688726887368874688756887668877688786887968880688816888268883688846888568886688876888868889688906889168892688936889468895688966889768898688996890068901689026890368904689056890668907689086890968910689116891268913689146891568916689176891868919689206892168922689236892468925689266892768928689296893068931689326893368934689356893668937689386893968940689416894268943689446894568946689476894868949689506895168952689536895468955689566895768958689596896068961689626896368964689656896668967689686896968970689716897268973689746897568976689776897868979689806898168982689836898468985689866898768988689896899068991689926899368994689956899668997689986899969000690016900269003690046900569006690076900869009690106901169012690136901469015690166901769018690196902069021690226902369024690256902669027690286902969030690316903269033690346903569036690376903869039690406904169042690436904469045690466904769048690496905069051690526905369054690556905669057690586905969060690616906269063690646906569066690676906869069690706907169072690736907469075690766907769078690796908069081690826908369084690856908669087690886908969090690916909269093690946909569096690976909869099691006910169102691036910469105691066910769108691096911069111691126911369114691156911669117691186911969120691216912269123691246912569126691276912869129691306913169132691336913469135691366913769138691396914069141691426914369144691456914669147691486914969150691516915269153691546915569156691576915869159691606916169162691636916469165691666916769168691696917069171691726917369174691756917669177691786917969180691816918269183691846918569186691876918869189691906919169192691936919469195691966919769198691996920069201692026920369204692056920669207692086920969210692116921269213692146921569216692176921869219692206922169222692236922469225692266922769228692296923069231692326923369234692356923669237692386923969240692416924269243692446924569246692476924869249692506925169252692536925469255692566925769258692596926069261692626926369264692656926669267692686926969270692716927269273692746927569276692776927869279692806928169282692836928469285692866928769288692896929069291692926929369294692956929669297692986929969300693016930269303693046930569306693076930869309693106931169312693136931469315693166931769318693196932069321693226932369324693256932669327693286932969330693316933269333693346933569336693376933869339693406934169342693436934469345693466934769348693496935069351693526935369354693556935669357693586935969360693616936269363693646936569366693676936869369693706937169372693736937469375693766937769378693796938069381693826938369384693856938669387693886938969390693916939269393693946939569396693976939869399694006940169402694036940469405694066940769408694096941069411694126941369414694156941669417694186941969420694216942269423694246942569426694276942869429694306943169432694336943469435694366943769438694396944069441694426944369444694456944669447694486944969450694516945269453694546945569456694576945869459694606946169462694636946469465694666946769468694696947069471694726947369474694756947669477694786947969480694816948269483694846948569486694876948869489694906949169492694936949469495694966949769498694996950069501695026950369504695056950669507695086950969510695116951269513695146951569516695176951869519695206952169522695236952469525695266952769528695296953069531695326953369534695356953669537695386953969540695416954269543695446954569546695476954869549695506955169552695536955469555695566955769558695596956069561695626956369564695656956669567695686956969570695716957269573695746957569576695776957869579695806958169582695836958469585695866958769588695896959069591695926959369594695956959669597695986959969600696016960269603696046960569606696076960869609696106961169612696136961469615696166961769618696196962069621696226962369624696256962669627696286962969630696316963269633696346963569636696376963869639696406964169642696436964469645696466964769648696496965069651696526965369654696556965669657696586965969660696616966269663696646966569666696676966869669696706967169672696736967469675696766967769678696796968069681696826968369684696856968669687696886968969690696916969269693696946969569696696976969869699697006970169702697036970469705697066970769708697096971069711697126971369714697156971669717697186971969720697216972269723697246972569726697276972869729697306973169732697336973469735697366973769738697396974069741697426974369744697456974669747697486974969750697516975269753697546975569756697576975869759697606976169762697636976469765697666976769768697696977069771697726977369774697756977669777697786977969780697816978269783697846978569786697876978869789697906979169792697936979469795697966979769798697996980069801698026980369804698056980669807698086980969810698116981269813698146981569816698176981869819698206982169822698236982469825698266982769828698296983069831698326983369834698356983669837698386983969840698416984269843698446984569846698476984869849698506985169852698536985469855698566985769858698596986069861698626986369864698656986669867698686986969870698716987269873698746987569876698776987869879698806988169882698836988469885698866988769888698896989069891698926989369894698956989669897698986989969900699016990269903699046990569906699076990869909699106991169912699136991469915699166991769918699196992069921699226992369924699256992669927699286992969930699316993269933699346993569936699376993869939699406994169942699436994469945699466994769948699496995069951699526995369954699556995669957699586995969960699616996269963699646996569966699676996869969699706997169972699736997469975699766997769978699796998069981699826998369984699856998669987699886998969990699916999269993699946999569996699976999869999700007000170002700037000470005700067000770008700097001070011700127001370014700157001670017700187001970020700217002270023700247002570026700277002870029700307003170032700337003470035700367003770038700397004070041700427004370044700457004670047700487004970050700517005270053700547005570056700577005870059700607006170062700637006470065700667006770068700697007070071700727007370074700757007670077700787007970080700817008270083700847008570086700877008870089700907009170092700937009470095700967009770098700997010070101701027010370104701057010670107701087010970110701117011270113701147011570116701177011870119701207012170122701237012470125701267012770128701297013070131701327013370134701357013670137701387013970140701417014270143701447014570146701477014870149701507015170152701537015470155701567015770158701597016070161701627016370164701657016670167701687016970170701717017270173701747017570176701777017870179701807018170182701837018470185701867018770188701897019070191701927019370194701957019670197701987019970200702017020270203702047020570206702077020870209702107021170212702137021470215702167021770218702197022070221702227022370224702257022670227702287022970230702317023270233702347023570236702377023870239702407024170242702437024470245702467024770248702497025070251702527025370254702557025670257702587025970260702617026270263702647026570266702677026870269702707027170272702737027470275702767027770278702797028070281702827028370284702857028670287702887028970290702917029270293702947029570296702977029870299703007030170302703037030470305703067030770308703097031070311703127031370314703157031670317703187031970320703217032270323703247032570326703277032870329703307033170332703337033470335703367033770338703397034070341703427034370344703457034670347703487034970350703517035270353703547035570356703577035870359703607036170362703637036470365703667036770368703697037070371703727037370374703757037670377703787037970380703817038270383703847038570386703877038870389703907039170392703937039470395703967039770398703997040070401704027040370404704057040670407704087040970410704117041270413704147041570416704177041870419704207042170422704237042470425704267042770428704297043070431704327043370434704357043670437704387043970440704417044270443704447044570446704477044870449704507045170452704537045470455704567045770458704597046070461704627046370464704657046670467704687046970470704717047270473704747047570476704777047870479704807048170482704837048470485704867048770488704897049070491704927049370494704957049670497704987049970500705017050270503705047050570506705077050870509705107051170512705137051470515705167051770518705197052070521705227052370524705257052670527705287052970530705317053270533705347053570536705377053870539705407054170542705437054470545705467054770548705497055070551705527055370554705557055670557705587055970560705617056270563705647056570566705677056870569705707057170572705737057470575705767057770578705797058070581705827058370584705857058670587705887058970590705917059270593705947059570596705977059870599706007060170602706037060470605706067060770608706097061070611706127061370614706157061670617706187061970620706217062270623706247062570626706277062870629706307063170632706337063470635706367063770638706397064070641706427064370644706457064670647706487064970650706517065270653706547065570656706577065870659706607066170662706637066470665706667066770668706697067070671706727067370674706757067670677706787067970680706817068270683706847068570686706877068870689706907069170692706937069470695706967069770698706997070070701707027070370704707057070670707707087070970710707117071270713707147071570716707177071870719707207072170722707237072470725707267072770728707297073070731707327073370734707357073670737707387073970740707417074270743707447074570746707477074870749707507075170752707537075470755707567075770758707597076070761707627076370764707657076670767707687076970770707717077270773707747077570776707777077870779707807078170782707837078470785707867078770788707897079070791707927079370794707957079670797707987079970800708017080270803708047080570806708077080870809708107081170812708137081470815708167081770818708197082070821708227082370824708257082670827708287082970830708317083270833708347083570836708377083870839708407084170842708437084470845708467084770848708497085070851708527085370854708557085670857708587085970860708617086270863708647086570866708677086870869708707087170872708737087470875708767087770878708797088070881708827088370884708857088670887708887088970890708917089270893708947089570896708977089870899709007090170902709037090470905709067090770908709097091070911709127091370914709157091670917709187091970920709217092270923709247092570926709277092870929709307093170932709337093470935709367093770938709397094070941709427094370944709457094670947709487094970950709517095270953709547095570956709577095870959709607096170962709637096470965709667096770968709697097070971709727097370974709757097670977709787097970980709817098270983709847098570986709877098870989709907099170992709937099470995709967099770998709997100071001710027100371004710057100671007710087100971010710117101271013710147101571016710177101871019710207102171022710237102471025710267102771028710297103071031710327103371034710357103671037710387103971040710417104271043710447104571046710477104871049710507105171052710537105471055710567105771058710597106071061710627106371064710657106671067710687106971070710717107271073710747107571076710777107871079710807108171082710837108471085710867108771088710897109071091710927109371094710957109671097710987109971100711017110271103711047110571106711077110871109711107111171112711137111471115711167111771118711197112071121711227112371124711257112671127711287112971130711317113271133711347113571136711377113871139711407114171142711437114471145711467114771148711497115071151711527115371154711557115671157711587115971160711617116271163711647116571166711677116871169711707117171172711737117471175711767117771178711797118071181711827118371184711857118671187711887118971190711917119271193711947119571196711977119871199712007120171202712037120471205712067120771208712097121071211712127121371214712157121671217712187121971220712217122271223712247122571226712277122871229712307123171232712337123471235712367123771238712397124071241712427124371244712457124671247712487124971250712517125271253712547125571256712577125871259712607126171262712637126471265712667126771268712697127071271712727127371274712757127671277712787127971280712817128271283712847128571286712877128871289712907129171292712937129471295712967129771298712997130071301713027130371304713057130671307713087130971310713117131271313713147131571316713177131871319713207132171322713237132471325713267132771328713297133071331713327133371334713357133671337713387133971340713417134271343713447134571346713477134871349713507135171352713537135471355713567135771358713597136071361713627136371364713657136671367713687136971370713717137271373713747137571376713777137871379713807138171382713837138471385713867138771388713897139071391713927139371394713957139671397713987139971400714017140271403714047140571406714077140871409714107141171412714137141471415714167141771418714197142071421714227142371424714257142671427714287142971430714317143271433714347143571436714377143871439714407144171442714437144471445714467144771448714497145071451714527145371454714557145671457714587145971460714617146271463714647146571466714677146871469714707147171472714737147471475714767147771478714797148071481714827148371484714857148671487714887148971490714917149271493714947149571496714977149871499715007150171502715037150471505715067150771508715097151071511715127151371514715157151671517715187151971520715217152271523715247152571526715277152871529715307153171532715337153471535715367153771538715397154071541715427154371544715457154671547715487154971550715517155271553715547155571556715577155871559715607156171562715637156471565715667156771568715697157071571715727157371574715757157671577715787157971580715817158271583715847158571586715877158871589715907159171592715937159471595715967159771598715997160071601716027160371604716057160671607716087160971610716117161271613716147161571616716177161871619716207162171622716237162471625716267162771628716297163071631716327163371634716357163671637716387163971640716417164271643716447164571646716477164871649716507165171652716537165471655716567165771658716597166071661716627166371664716657166671667716687166971670716717167271673716747167571676716777167871679716807168171682716837168471685716867168771688716897169071691716927169371694716957169671697716987169971700717017170271703717047170571706717077170871709717107171171712717137171471715717167171771718717197172071721717227172371724717257172671727717287172971730717317173271733717347173571736717377173871739717407174171742717437174471745717467174771748717497175071751717527175371754717557175671757717587175971760717617176271763717647176571766717677176871769717707177171772717737177471775717767177771778717797178071781717827178371784717857178671787717887178971790717917179271793717947179571796717977179871799718007180171802718037180471805718067180771808718097181071811718127181371814718157181671817718187181971820718217182271823718247182571826718277182871829718307183171832718337183471835718367183771838718397184071841718427184371844718457184671847718487184971850718517185271853718547185571856718577185871859718607186171862718637186471865718667186771868718697187071871718727187371874718757187671877718787187971880718817188271883718847188571886718877188871889718907189171892718937189471895718967189771898718997190071901719027190371904719057190671907719087190971910719117191271913719147191571916719177191871919719207192171922719237192471925719267192771928719297193071931719327193371934719357193671937719387193971940719417194271943719447194571946719477194871949719507195171952719537195471955719567195771958719597196071961719627196371964719657196671967719687196971970719717197271973719747197571976719777197871979719807198171982719837198471985719867198771988719897199071991719927199371994719957199671997719987199972000720017200272003720047200572006720077200872009720107201172012720137201472015720167201772018720197202072021720227202372024720257202672027720287202972030720317203272033720347203572036720377203872039720407204172042720437204472045720467204772048720497205072051720527205372054720557205672057720587205972060720617206272063720647206572066720677206872069720707207172072720737207472075720767207772078720797208072081720827208372084720857208672087720887208972090720917209272093720947209572096720977209872099721007210172102721037210472105721067210772108721097211072111721127211372114721157211672117721187211972120721217212272123721247212572126721277212872129721307213172132721337213472135721367213772138721397214072141721427214372144721457214672147721487214972150721517215272153721547215572156721577215872159721607216172162721637216472165721667216772168721697217072171721727217372174721757217672177721787217972180721817218272183721847218572186721877218872189721907219172192721937219472195721967219772198721997220072201722027220372204722057220672207722087220972210722117221272213722147221572216722177221872219722207222172222722237222472225722267222772228722297223072231722327223372234722357223672237722387223972240722417224272243722447224572246722477224872249722507225172252722537225472255722567225772258722597226072261722627226372264722657226672267722687226972270722717227272273722747227572276722777227872279722807228172282722837228472285722867228772288722897229072291722927229372294722957229672297722987229972300723017230272303723047230572306723077230872309723107231172312723137231472315723167231772318723197232072321723227232372324723257232672327723287232972330723317233272333723347233572336723377233872339723407234172342723437234472345723467234772348723497235072351723527235372354723557235672357723587235972360723617236272363723647236572366723677236872369723707237172372723737237472375723767237772378723797238072381723827238372384723857238672387723887238972390723917239272393723947239572396723977239872399724007240172402724037240472405724067240772408724097241072411724127241372414724157241672417724187241972420724217242272423724247242572426724277242872429724307243172432724337243472435724367243772438724397244072441724427244372444724457244672447724487244972450724517245272453724547245572456724577245872459724607246172462724637246472465724667246772468724697247072471724727247372474724757247672477724787247972480724817248272483724847248572486724877248872489724907249172492724937249472495724967249772498724997250072501725027250372504725057250672507725087250972510725117251272513725147251572516725177251872519725207252172522725237252472525725267252772528725297253072531725327253372534725357253672537725387253972540725417254272543725447254572546725477254872549725507255172552725537255472555725567255772558725597256072561725627256372564725657256672567725687256972570725717257272573725747257572576725777257872579725807258172582725837258472585725867258772588725897259072591725927259372594725957259672597725987259972600726017260272603726047260572606726077260872609726107261172612726137261472615726167261772618726197262072621726227262372624726257262672627726287262972630726317263272633726347263572636726377263872639726407264172642726437264472645726467264772648726497265072651726527265372654726557265672657726587265972660726617266272663726647266572666726677266872669726707267172672726737267472675726767267772678726797268072681726827268372684726857268672687726887268972690726917269272693726947269572696726977269872699727007270172702727037270472705727067270772708727097271072711727127271372714727157271672717727187271972720727217272272723727247272572726727277272872729727307273172732727337273472735727367273772738727397274072741727427274372744727457274672747727487274972750727517275272753727547275572756727577275872759727607276172762727637276472765727667276772768727697277072771727727277372774727757277672777727787277972780727817278272783727847278572786727877278872789727907279172792727937279472795727967279772798727997280072801728027280372804728057280672807728087280972810728117281272813728147281572816728177281872819728207282172822728237282472825728267282772828728297283072831728327283372834728357283672837728387283972840728417284272843728447284572846728477284872849728507285172852728537285472855728567285772858728597286072861728627286372864728657286672867728687286972870728717287272873728747287572876728777287872879728807288172882728837288472885728867288772888728897289072891728927289372894728957289672897728987289972900729017290272903729047290572906729077290872909729107291172912729137291472915729167291772918729197292072921729227292372924729257292672927729287292972930729317293272933729347293572936729377293872939729407294172942729437294472945729467294772948729497295072951729527295372954729557295672957729587295972960729617296272963729647296572966729677296872969729707297172972729737297472975729767297772978729797298072981729827298372984729857298672987729887298972990729917299272993729947299572996729977299872999730007300173002730037300473005730067300773008730097301073011730127301373014730157301673017730187301973020730217302273023730247302573026730277302873029730307303173032730337303473035730367303773038730397304073041730427304373044730457304673047730487304973050730517305273053730547305573056730577305873059730607306173062730637306473065730667306773068730697307073071730727307373074730757307673077730787307973080730817308273083730847308573086730877308873089730907309173092730937309473095730967309773098730997310073101731027310373104731057310673107731087310973110731117311273113731147311573116731177311873119731207312173122731237312473125731267312773128731297313073131731327313373134731357313673137731387313973140731417314273143731447314573146731477314873149731507315173152731537315473155731567315773158731597316073161731627316373164731657316673167731687316973170731717317273173731747317573176731777317873179731807318173182731837318473185731867318773188731897319073191731927319373194731957319673197731987319973200732017320273203732047320573206732077320873209732107321173212732137321473215732167321773218732197322073221732227322373224732257322673227732287322973230732317323273233732347323573236732377323873239732407324173242732437324473245732467324773248732497325073251732527325373254732557325673257732587325973260732617326273263732647326573266732677326873269732707327173272732737327473275732767327773278732797328073281732827328373284732857328673287732887328973290732917329273293732947329573296732977329873299733007330173302733037330473305733067330773308733097331073311733127331373314733157331673317733187331973320733217332273323733247332573326733277332873329733307333173332733337333473335733367333773338733397334073341733427334373344733457334673347733487334973350733517335273353733547335573356733577335873359733607336173362733637336473365733667336773368733697337073371733727337373374733757337673377733787337973380733817338273383733847338573386733877338873389733907339173392733937339473395733967339773398733997340073401734027340373404734057340673407734087340973410734117341273413734147341573416734177341873419734207342173422734237342473425734267342773428734297343073431734327343373434734357343673437734387343973440734417344273443734447344573446734477344873449734507345173452734537345473455734567345773458734597346073461734627346373464734657346673467734687346973470734717347273473734747347573476734777347873479734807348173482734837348473485734867348773488734897349073491734927349373494734957349673497734987349973500735017350273503735047350573506735077350873509735107351173512735137351473515735167351773518735197352073521735227352373524735257352673527735287352973530735317353273533735347353573536735377353873539735407354173542735437354473545735467354773548735497355073551735527355373554735557355673557735587355973560735617356273563735647356573566735677356873569735707357173572735737357473575735767357773578735797358073581735827358373584735857358673587735887358973590735917359273593735947359573596735977359873599736007360173602736037360473605736067360773608736097361073611736127361373614736157361673617736187361973620736217362273623736247362573626736277362873629736307363173632736337363473635736367363773638736397364073641736427364373644736457364673647736487364973650736517365273653736547365573656736577365873659736607366173662736637366473665736667366773668736697367073671736727367373674736757367673677736787367973680736817368273683736847368573686736877368873689736907369173692736937369473695736967369773698736997370073701737027370373704737057370673707737087370973710737117371273713737147371573716737177371873719737207372173722737237372473725737267372773728737297373073731737327373373734737357373673737737387373973740737417374273743737447374573746737477374873749737507375173752737537375473755737567375773758737597376073761737627376373764737657376673767737687376973770737717377273773737747377573776737777377873779737807378173782737837378473785737867378773788737897379073791737927379373794737957379673797737987379973800738017380273803738047380573806738077380873809738107381173812738137381473815738167381773818738197382073821738227382373824738257382673827738287382973830738317383273833738347383573836738377383873839738407384173842738437384473845738467384773848738497385073851738527385373854738557385673857738587385973860738617386273863738647386573866738677386873869738707387173872738737387473875738767387773878738797388073881738827388373884738857388673887738887388973890738917389273893738947389573896738977389873899739007390173902739037390473905739067390773908739097391073911739127391373914739157391673917739187391973920739217392273923739247392573926739277392873929739307393173932739337393473935739367393773938739397394073941739427394373944739457394673947739487394973950739517395273953739547395573956739577395873959739607396173962739637396473965739667396773968739697397073971739727397373974739757397673977739787397973980739817398273983739847398573986739877398873989739907399173992739937399473995739967399773998739997400074001740027400374004740057400674007740087400974010740117401274013740147401574016740177401874019740207402174022740237402474025740267402774028740297403074031740327403374034740357403674037740387403974040740417404274043740447404574046740477404874049740507405174052740537405474055740567405774058740597406074061740627406374064740657406674067740687406974070740717407274073740747407574076740777407874079740807408174082740837408474085740867408774088740897409074091740927409374094740957409674097740987409974100741017410274103741047410574106741077410874109741107411174112741137411474115741167411774118741197412074121741227412374124741257412674127741287412974130741317413274133741347413574136741377413874139741407414174142741437414474145741467414774148741497415074151741527415374154741557415674157741587415974160741617416274163741647416574166741677416874169741707417174172741737417474175741767417774178741797418074181741827418374184741857418674187741887418974190741917419274193741947419574196741977419874199742007420174202742037420474205742067420774208742097421074211742127421374214742157421674217742187421974220742217422274223742247422574226742277422874229742307423174232742337423474235742367423774238742397424074241742427424374244742457424674247742487424974250742517425274253742547425574256742577425874259742607426174262742637426474265742667426774268742697427074271742727427374274742757427674277742787427974280742817428274283742847428574286742877428874289742907429174292742937429474295742967429774298742997430074301743027430374304743057430674307743087430974310743117431274313743147431574316743177431874319743207432174322743237432474325743267432774328743297433074331743327433374334743357433674337743387433974340743417434274343743447434574346743477434874349743507435174352743537435474355743567435774358743597436074361743627436374364743657436674367743687436974370743717437274373743747437574376743777437874379743807438174382743837438474385743867438774388743897439074391743927439374394743957439674397743987439974400744017440274403744047440574406744077440874409744107441174412744137441474415744167441774418744197442074421744227442374424744257442674427744287442974430744317443274433744347443574436744377443874439744407444174442744437444474445744467444774448744497445074451744527445374454744557445674457744587445974460744617446274463744647446574466744677446874469744707447174472744737447474475744767447774478744797448074481744827448374484744857448674487744887448974490744917449274493744947449574496744977449874499745007450174502745037450474505745067450774508745097451074511745127451374514745157451674517745187451974520745217452274523745247452574526745277452874529745307453174532745337453474535745367453774538745397454074541745427454374544745457454674547745487454974550745517455274553745547455574556745577455874559745607456174562745637456474565745667456774568745697457074571745727457374574745757457674577745787457974580745817458274583745847458574586745877458874589745907459174592745937459474595745967459774598745997460074601746027460374604746057460674607746087460974610746117461274613746147461574616746177461874619746207462174622746237462474625746267462774628746297463074631746327463374634746357463674637746387463974640746417464274643746447464574646746477464874649746507465174652746537465474655746567465774658746597466074661746627466374664746657466674667746687466974670746717467274673746747467574676746777467874679746807468174682746837468474685746867468774688746897469074691746927469374694746957469674697746987469974700747017470274703747047470574706747077470874709747107471174712747137471474715747167471774718747197472074721747227472374724747257472674727747287472974730747317473274733747347473574736747377473874739747407474174742747437474474745747467474774748747497475074751747527475374754747557475674757747587475974760747617476274763747647476574766747677476874769747707477174772747737477474775747767477774778747797478074781747827478374784747857478674787747887478974790747917479274793747947479574796747977479874799748007480174802748037480474805748067480774808748097481074811748127481374814748157481674817748187481974820748217482274823748247482574826748277482874829748307483174832748337483474835748367483774838748397484074841748427484374844748457484674847748487484974850748517485274853748547485574856748577485874859748607486174862748637486474865748667486774868748697487074871748727487374874748757487674877748787487974880748817488274883748847488574886748877488874889748907489174892748937489474895748967489774898748997490074901749027490374904749057490674907749087490974910749117491274913749147491574916749177491874919749207492174922749237492474925749267492774928749297493074931749327493374934749357493674937749387493974940749417494274943749447494574946749477494874949749507495174952749537495474955749567495774958749597496074961749627496374964749657496674967749687496974970749717497274973749747497574976749777497874979749807498174982749837498474985749867498774988749897499074991749927499374994749957499674997749987499975000750017500275003750047500575006750077500875009750107501175012750137501475015750167501775018750197502075021750227502375024750257502675027750287502975030750317503275033750347503575036750377503875039750407504175042750437504475045750467504775048750497505075051750527505375054750557505675057750587505975060750617506275063750647506575066750677506875069750707507175072750737507475075750767507775078750797508075081750827508375084750857508675087750887508975090750917509275093750947509575096750977509875099751007510175102751037510475105751067510775108751097511075111751127511375114751157511675117751187511975120751217512275123751247512575126751277512875129751307513175132751337513475135751367513775138751397514075141751427514375144751457514675147751487514975150751517515275153751547515575156751577515875159751607516175162751637516475165751667516775168751697517075171751727517375174751757517675177751787517975180751817518275183751847518575186751877518875189751907519175192751937519475195751967519775198751997520075201752027520375204752057520675207752087520975210752117521275213752147521575216752177521875219752207522175222752237522475225752267522775228752297523075231752327523375234752357523675237752387523975240752417524275243752447524575246752477524875249752507525175252752537525475255752567525775258752597526075261752627526375264752657526675267752687526975270752717527275273752747527575276752777527875279752807528175282752837528475285752867528775288752897529075291752927529375294752957529675297752987529975300753017530275303753047530575306753077530875309753107531175312753137531475315753167531775318753197532075321753227532375324753257532675327753287532975330753317533275333753347533575336753377533875339753407534175342753437534475345753467534775348753497535075351753527535375354753557535675357753587535975360753617536275363753647536575366753677536875369753707537175372753737537475375753767537775378753797538075381753827538375384753857538675387753887538975390753917539275393753947539575396753977539875399754007540175402754037540475405754067540775408754097541075411754127541375414754157541675417754187541975420754217542275423754247542575426754277542875429754307543175432754337543475435754367543775438754397544075441754427544375444754457544675447754487544975450754517545275453754547545575456754577545875459754607546175462754637546475465754667546775468754697547075471754727547375474754757547675477754787547975480754817548275483754847548575486754877548875489754907549175492754937549475495754967549775498754997550075501755027550375504755057550675507755087550975510755117551275513755147551575516755177551875519755207552175522755237552475525755267552775528755297553075531755327553375534755357553675537755387553975540755417554275543755447554575546755477554875549755507555175552755537555475555755567555775558755597556075561755627556375564755657556675567755687556975570755717557275573755747557575576755777557875579755807558175582755837558475585755867558775588755897559075591755927559375594755957559675597755987559975600756017560275603756047560575606756077560875609756107561175612756137561475615756167561775618756197562075621756227562375624756257562675627756287562975630756317563275633756347563575636756377563875639756407564175642756437564475645756467564775648756497565075651756527565375654756557565675657756587565975660756617566275663756647566575666756677566875669756707567175672756737567475675756767567775678756797568075681756827568375684756857568675687756887568975690756917569275693756947569575696756977569875699757007570175702757037570475705757067570775708757097571075711757127571375714757157571675717757187571975720757217572275723757247572575726757277572875729757307573175732757337573475735757367573775738757397574075741757427574375744757457574675747757487574975750757517575275753757547575575756757577575875759757607576175762757637576475765757667576775768757697577075771757727577375774757757577675777757787577975780757817578275783757847578575786757877578875789757907579175792757937579475795757967579775798757997580075801758027580375804758057580675807758087580975810758117581275813758147581575816758177581875819758207582175822758237582475825758267582775828758297583075831758327583375834758357583675837758387583975840758417584275843758447584575846758477584875849758507585175852758537585475855758567585775858758597586075861758627586375864758657586675867758687586975870758717587275873758747587575876758777587875879758807588175882758837588475885758867588775888758897589075891758927589375894758957589675897758987589975900759017590275903759047590575906759077590875909759107591175912759137591475915759167591775918759197592075921759227592375924759257592675927759287592975930759317593275933759347593575936759377593875939759407594175942759437594475945759467594775948759497595075951759527595375954759557595675957759587595975960759617596275963759647596575966759677596875969759707597175972759737597475975759767597775978759797598075981759827598375984759857598675987759887598975990759917599275993759947599575996759977599875999760007600176002760037600476005760067600776008760097601076011760127601376014760157601676017760187601976020760217602276023760247602576026760277602876029760307603176032760337603476035760367603776038760397604076041760427604376044760457604676047760487604976050760517605276053760547605576056760577605876059760607606176062760637606476065760667606776068760697607076071760727607376074760757607676077760787607976080760817608276083760847608576086760877608876089760907609176092760937609476095760967609776098760997610076101761027610376104761057610676107761087610976110761117611276113761147611576116761177611876119761207612176122761237612476125761267612776128761297613076131761327613376134761357613676137761387613976140761417614276143761447614576146761477614876149761507615176152761537615476155761567615776158761597616076161761627616376164761657616676167761687616976170761717617276173761747617576176761777617876179761807618176182761837618476185761867618776188761897619076191761927619376194761957619676197761987619976200762017620276203762047620576206762077620876209762107621176212762137621476215762167621776218762197622076221762227622376224762257622676227762287622976230762317623276233762347623576236762377623876239762407624176242762437624476245762467624776248762497625076251762527625376254762557625676257762587625976260762617626276263762647626576266762677626876269762707627176272762737627476275762767627776278762797628076281762827628376284762857628676287762887628976290762917629276293762947629576296762977629876299763007630176302763037630476305763067630776308763097631076311763127631376314763157631676317763187631976320763217632276323763247632576326763277632876329763307633176332763337633476335763367633776338763397634076341763427634376344763457634676347763487634976350763517635276353763547635576356763577635876359763607636176362763637636476365763667636776368763697637076371763727637376374763757637676377763787637976380763817638276383763847638576386763877638876389763907639176392763937639476395763967639776398763997640076401764027640376404764057640676407764087640976410764117641276413764147641576416764177641876419764207642176422764237642476425764267642776428764297643076431764327643376434764357643676437764387643976440764417644276443764447644576446764477644876449764507645176452764537645476455764567645776458764597646076461764627646376464764657646676467764687646976470764717647276473764747647576476764777647876479764807648176482764837648476485764867648776488764897649076491764927649376494764957649676497764987649976500765017650276503765047650576506765077650876509765107651176512765137651476515765167651776518765197652076521765227652376524765257652676527765287652976530765317653276533765347653576536765377653876539765407654176542765437654476545765467654776548765497655076551765527655376554765557655676557765587655976560765617656276563765647656576566765677656876569765707657176572765737657476575765767657776578765797658076581765827658376584765857658676587765887658976590765917659276593765947659576596765977659876599766007660176602766037660476605766067660776608766097661076611766127661376614766157661676617766187661976620766217662276623766247662576626766277662876629766307663176632766337663476635766367663776638766397664076641766427664376644766457664676647766487664976650766517665276653766547665576656766577665876659766607666176662766637666476665766667666776668766697667076671766727667376674766757667676677766787667976680766817668276683766847668576686766877668876689766907669176692766937669476695766967669776698766997670076701767027670376704767057670676707767087670976710767117671276713767147671576716767177671876719767207672176722767237672476725767267672776728767297673076731767327673376734767357673676737767387673976740767417674276743767447674576746767477674876749767507675176752767537675476755767567675776758767597676076761767627676376764767657676676767767687676976770767717677276773767747677576776767777677876779767807678176782767837678476785767867678776788767897679076791767927679376794767957679676797767987679976800768017680276803768047680576806768077680876809768107681176812768137681476815768167681776818768197682076821768227682376824768257682676827768287682976830768317683276833768347683576836768377683876839768407684176842768437684476845768467684776848768497685076851768527685376854768557685676857768587685976860768617686276863768647686576866768677686876869768707687176872768737687476875768767687776878768797688076881768827688376884768857688676887768887688976890768917689276893768947689576896768977689876899769007690176902769037690476905769067690776908769097691076911769127691376914769157691676917769187691976920769217692276923769247692576926769277692876929769307693176932769337693476935769367693776938769397694076941769427694376944769457694676947769487694976950769517695276953769547695576956769577695876959769607696176962769637696476965769667696776968769697697076971769727697376974769757697676977769787697976980769817698276983769847698576986769877698876989769907699176992769937699476995769967699776998769997700077001770027700377004770057700677007770087700977010770117701277013770147701577016770177701877019770207702177022770237702477025770267702777028770297703077031770327703377034770357703677037770387703977040770417704277043770447704577046770477704877049770507705177052770537705477055770567705777058770597706077061770627706377064770657706677067770687706977070770717707277073770747707577076770777707877079770807708177082770837708477085770867708777088770897709077091770927709377094770957709677097770987709977100771017710277103771047710577106771077710877109771107711177112771137711477115771167711777118771197712077121771227712377124771257712677127771287712977130771317713277133771347713577136771377713877139771407714177142771437714477145771467714777148771497715077151771527715377154771557715677157771587715977160771617716277163771647716577166771677716877169771707717177172771737717477175771767717777178771797718077181771827718377184771857718677187771887718977190771917719277193771947719577196771977719877199772007720177202772037720477205772067720777208772097721077211772127721377214772157721677217772187721977220772217722277223772247722577226772277722877229772307723177232772337723477235772367723777238772397724077241772427724377244772457724677247772487724977250772517725277253772547725577256772577725877259772607726177262772637726477265772667726777268772697727077271772727727377274772757727677277772787727977280772817728277283772847728577286772877728877289772907729177292772937729477295772967729777298772997730077301773027730377304773057730677307773087730977310773117731277313773147731577316773177731877319773207732177322773237732477325773267732777328773297733077331773327733377334773357733677337773387733977340773417734277343773447734577346773477734877349773507735177352773537735477355773567735777358773597736077361773627736377364773657736677367773687736977370773717737277373773747737577376773777737877379773807738177382773837738477385773867738777388773897739077391773927739377394773957739677397773987739977400774017740277403774047740577406774077740877409774107741177412774137741477415774167741777418774197742077421774227742377424774257742677427774287742977430774317743277433774347743577436774377743877439774407744177442774437744477445774467744777448774497745077451774527745377454774557745677457774587745977460774617746277463774647746577466774677746877469774707747177472774737747477475774767747777478774797748077481774827748377484774857748677487774887748977490774917749277493774947749577496774977749877499775007750177502775037750477505775067750777508775097751077511775127751377514775157751677517775187751977520775217752277523775247752577526775277752877529775307753177532775337753477535775367753777538775397754077541775427754377544775457754677547775487754977550775517755277553775547755577556775577755877559775607756177562775637756477565775667756777568775697757077571775727757377574775757757677577775787757977580775817758277583775847758577586775877758877589775907759177592775937759477595775967759777598775997760077601776027760377604776057760677607776087760977610776117761277613776147761577616776177761877619776207762177622776237762477625776267762777628776297763077631776327763377634776357763677637776387763977640776417764277643776447764577646776477764877649776507765177652776537765477655776567765777658776597766077661776627766377664776657766677667776687766977670776717767277673776747767577676776777767877679776807768177682776837768477685776867768777688776897769077691776927769377694776957769677697776987769977700777017770277703777047770577706777077770877709777107771177712777137771477715777167771777718777197772077721777227772377724777257772677727777287772977730777317773277733777347773577736777377773877739777407774177742777437774477745777467774777748777497775077751777527775377754777557775677757777587775977760777617776277763777647776577766777677776877769777707777177772777737777477775777767777777778777797778077781777827778377784777857778677787777887778977790777917779277793777947779577796777977779877799778007780177802778037780477805778067780777808778097781077811778127781377814778157781677817778187781977820778217782277823778247782577826778277782877829778307783177832778337783477835778367783777838778397784077841778427784377844778457784677847778487784977850778517785277853778547785577856778577785877859778607786177862778637786477865778667786777868778697787077871778727787377874778757787677877778787787977880778817788277883778847788577886778877788877889778907789177892778937789477895778967789777898778997790077901779027790377904779057790677907779087790977910779117791277913779147791577916779177791877919779207792177922779237792477925779267792777928779297793077931779327793377934779357793677937779387793977940779417794277943779447794577946779477794877949779507795177952779537795477955779567795777958779597796077961779627796377964779657796677967779687796977970779717797277973779747797577976779777797877979779807798177982779837798477985779867798777988779897799077991779927799377994779957799677997779987799978000780017800278003780047800578006780077800878009780107801178012780137801478015780167801778018780197802078021780227802378024780257802678027780287802978030780317803278033780347803578036780377803878039780407804178042780437804478045780467804778048780497805078051780527805378054780557805678057780587805978060780617806278063780647806578066780677806878069780707807178072780737807478075780767807778078780797808078081780827808378084780857808678087780887808978090780917809278093780947809578096780977809878099781007810178102781037810478105781067810778108781097811078111781127811378114781157811678117781187811978120781217812278123781247812578126781277812878129781307813178132781337813478135781367813778138781397814078141781427814378144781457814678147781487814978150781517815278153781547815578156781577815878159781607816178162781637816478165781667816778168781697817078171781727817378174781757817678177781787817978180781817818278183781847818578186781877818878189781907819178192781937819478195781967819778198781997820078201782027820378204782057820678207782087820978210782117821278213782147821578216782177821878219782207822178222782237822478225782267822778228782297823078231782327823378234782357823678237782387823978240782417824278243782447824578246782477824878249782507825178252782537825478255782567825778258782597826078261782627826378264782657826678267782687826978270782717827278273782747827578276782777827878279782807828178282782837828478285782867828778288782897829078291782927829378294782957829678297782987829978300783017830278303783047830578306783077830878309783107831178312783137831478315783167831778318783197832078321783227832378324783257832678327783287832978330783317833278333783347833578336783377833878339783407834178342783437834478345783467834778348783497835078351783527835378354783557835678357783587835978360783617836278363783647836578366783677836878369783707837178372783737837478375783767837778378783797838078381783827838378384783857838678387783887838978390783917839278393783947839578396783977839878399784007840178402784037840478405784067840778408784097841078411784127841378414784157841678417784187841978420784217842278423784247842578426784277842878429784307843178432784337843478435784367843778438784397844078441784427844378444784457844678447784487844978450784517845278453784547845578456784577845878459784607846178462784637846478465784667846778468784697847078471784727847378474784757847678477784787847978480784817848278483784847848578486784877848878489784907849178492784937849478495784967849778498784997850078501785027850378504785057850678507785087850978510785117851278513785147851578516785177851878519785207852178522785237852478525785267852778528785297853078531785327853378534785357853678537785387853978540785417854278543785447854578546785477854878549785507855178552785537855478555785567855778558785597856078561785627856378564785657856678567785687856978570785717857278573785747857578576785777857878579785807858178582785837858478585785867858778588785897859078591785927859378594785957859678597785987859978600786017860278603786047860578606786077860878609786107861178612786137861478615786167861778618786197862078621786227862378624786257862678627786287862978630786317863278633786347863578636786377863878639786407864178642786437864478645786467864778648786497865078651786527865378654786557865678657786587865978660786617866278663786647866578666786677866878669786707867178672786737867478675786767867778678786797868078681786827868378684786857868678687786887868978690786917869278693786947869578696786977869878699787007870178702787037870478705787067870778708787097871078711787127871378714787157871678717787187871978720787217872278723787247872578726787277872878729787307873178732787337873478735787367873778738787397874078741787427874378744787457874678747787487874978750787517875278753787547875578756787577875878759787607876178762787637876478765787667876778768787697877078771787727877378774787757877678777787787877978780787817878278783787847878578786787877878878789787907879178792787937879478795787967879778798787997880078801788027880378804788057880678807788087880978810788117881278813788147881578816788177881878819788207882178822788237882478825788267882778828788297883078831788327883378834788357883678837788387883978840788417884278843788447884578846788477884878849788507885178852788537885478855788567885778858788597886078861788627886378864788657886678867788687886978870788717887278873788747887578876788777887878879788807888178882788837888478885788867888778888788897889078891788927889378894788957889678897788987889978900789017890278903789047890578906789077890878909789107891178912789137891478915789167891778918789197892078921789227892378924789257892678927789287892978930789317893278933789347893578936789377893878939789407894178942789437894478945789467894778948789497895078951789527895378954789557895678957789587895978960789617896278963789647896578966789677896878969789707897178972789737897478975789767897778978789797898078981789827898378984789857898678987789887898978990789917899278993789947899578996789977899878999790007900179002790037900479005790067900779008790097901079011790127901379014790157901679017790187901979020790217902279023790247902579026790277902879029790307903179032790337903479035790367903779038790397904079041790427904379044790457904679047790487904979050790517905279053790547905579056790577905879059790607906179062790637906479065790667906779068790697907079071790727907379074790757907679077790787907979080790817908279083790847908579086790877908879089790907909179092790937909479095790967909779098790997910079101791027910379104791057910679107791087910979110791117911279113791147911579116791177911879119791207912179122791237912479125791267912779128791297913079131791327913379134791357913679137791387913979140791417914279143791447914579146791477914879149791507915179152791537915479155791567915779158791597916079161791627916379164791657916679167791687916979170791717917279173791747917579176791777917879179791807918179182791837918479185791867918779188791897919079191791927919379194791957919679197791987919979200792017920279203792047920579206792077920879209792107921179212792137921479215792167921779218792197922079221792227922379224792257922679227792287922979230792317923279233792347923579236792377923879239792407924179242792437924479245792467924779248792497925079251792527925379254792557925679257792587925979260792617926279263792647926579266792677926879269792707927179272792737927479275792767927779278792797928079281792827928379284792857928679287792887928979290792917929279293792947929579296792977929879299793007930179302793037930479305793067930779308793097931079311793127931379314793157931679317793187931979320793217932279323793247932579326793277932879329793307933179332793337933479335793367933779338793397934079341793427934379344793457934679347793487934979350793517935279353793547935579356793577935879359793607936179362793637936479365793667936779368793697937079371793727937379374793757937679377793787937979380793817938279383793847938579386793877938879389793907939179392793937939479395793967939779398793997940079401794027940379404794057940679407794087940979410794117941279413794147941579416794177941879419794207942179422794237942479425794267942779428794297943079431794327943379434794357943679437794387943979440794417944279443794447944579446794477944879449794507945179452794537945479455794567945779458794597946079461794627946379464794657946679467794687946979470794717947279473794747947579476794777947879479794807948179482794837948479485794867948779488794897949079491794927949379494794957949679497794987949979500795017950279503795047950579506795077950879509795107951179512795137951479515795167951779518795197952079521795227952379524795257952679527795287952979530795317953279533795347953579536795377953879539795407954179542795437954479545795467954779548795497955079551795527955379554795557955679557795587955979560795617956279563795647956579566795677956879569795707957179572795737957479575795767957779578795797958079581795827958379584795857958679587795887958979590795917959279593795947959579596795977959879599796007960179602796037960479605796067960779608796097961079611796127961379614796157961679617796187961979620796217962279623796247962579626796277962879629796307963179632796337963479635796367963779638796397964079641796427964379644796457964679647796487964979650796517965279653796547965579656796577965879659796607966179662796637966479665796667966779668796697967079671796727967379674796757967679677796787967979680796817968279683796847968579686796877968879689796907969179692796937969479695796967969779698796997970079701797027970379704797057970679707797087970979710797117971279713797147971579716797177971879719797207972179722797237972479725797267972779728797297973079731797327973379734797357973679737797387973979740797417974279743797447974579746797477974879749797507975179752797537975479755797567975779758797597976079761797627976379764797657976679767797687976979770797717977279773797747977579776797777977879779797807978179782797837978479785797867978779788797897979079791797927979379794797957979679797797987979979800798017980279803798047980579806798077980879809798107981179812798137981479815798167981779818798197982079821798227982379824798257982679827798287982979830798317983279833798347983579836798377983879839798407984179842798437984479845798467984779848798497985079851798527985379854798557985679857798587985979860798617986279863798647986579866798677986879869798707987179872798737987479875798767987779878798797988079881798827988379884798857988679887798887988979890798917989279893798947989579896798977989879899799007990179902799037990479905799067990779908799097991079911799127991379914799157991679917799187991979920799217992279923799247992579926799277992879929799307993179932799337993479935799367993779938799397994079941799427994379944799457994679947799487994979950799517995279953799547995579956799577995879959799607996179962799637996479965799667996779968799697997079971799727997379974799757997679977799787997979980799817998279983799847998579986799877998879989799907999179992799937999479995799967999779998799998000080001800028000380004800058000680007800088000980010800118001280013800148001580016800178001880019800208002180022800238002480025800268002780028800298003080031800328003380034800358003680037800388003980040800418004280043800448004580046800478004880049800508005180052800538005480055800568005780058800598006080061800628006380064800658006680067800688006980070800718007280073800748007580076800778007880079800808008180082800838008480085800868008780088800898009080091800928009380094800958009680097800988009980100801018010280103801048010580106801078010880109801108011180112801138011480115801168011780118801198012080121801228012380124801258012680127801288012980130801318013280133801348013580136801378013880139801408014180142801438014480145801468014780148801498015080151801528015380154801558015680157801588015980160801618016280163801648016580166801678016880169801708017180172801738017480175801768017780178801798018080181801828018380184801858018680187801888018980190801918019280193801948019580196801978019880199802008020180202802038020480205802068020780208802098021080211802128021380214802158021680217802188021980220802218022280223802248022580226802278022880229802308023180232802338023480235802368023780238802398024080241802428024380244802458024680247802488024980250802518025280253802548025580256802578025880259802608026180262802638026480265802668026780268802698027080271802728027380274802758027680277802788027980280802818028280283802848028580286802878028880289802908029180292802938029480295802968029780298802998030080301803028030380304803058030680307803088030980310803118031280313803148031580316803178031880319803208032180322803238032480325803268032780328803298033080331803328033380334803358033680337803388033980340803418034280343803448034580346803478034880349803508035180352803538035480355803568035780358803598036080361803628036380364803658036680367803688036980370803718037280373803748037580376803778037880379803808038180382803838038480385803868038780388803898039080391803928039380394803958039680397803988039980400804018040280403804048040580406804078040880409804108041180412804138041480415804168041780418804198042080421804228042380424804258042680427804288042980430804318043280433804348043580436804378043880439804408044180442804438044480445804468044780448804498045080451804528045380454804558045680457804588045980460804618046280463804648046580466804678046880469804708047180472804738047480475804768047780478804798048080481804828048380484804858048680487804888048980490804918049280493804948049580496804978049880499805008050180502805038050480505805068050780508805098051080511805128051380514805158051680517805188051980520805218052280523805248052580526805278052880529805308053180532805338053480535805368053780538805398054080541805428054380544805458054680547805488054980550805518055280553805548055580556805578055880559805608056180562805638056480565805668056780568805698057080571805728057380574805758057680577805788057980580805818058280583805848058580586805878058880589805908059180592805938059480595805968059780598805998060080601806028060380604806058060680607806088060980610806118061280613806148061580616806178061880619806208062180622806238062480625806268062780628806298063080631806328063380634806358063680637806388063980640806418064280643806448064580646806478064880649806508065180652806538065480655806568065780658806598066080661806628066380664806658066680667806688066980670806718067280673806748067580676806778067880679806808068180682806838068480685806868068780688806898069080691806928069380694806958069680697806988069980700807018070280703807048070580706807078070880709807108071180712807138071480715807168071780718807198072080721807228072380724807258072680727807288072980730807318073280733807348073580736807378073880739807408074180742807438074480745807468074780748807498075080751807528075380754807558075680757807588075980760807618076280763807648076580766807678076880769807708077180772807738077480775807768077780778807798078080781807828078380784807858078680787807888078980790807918079280793807948079580796807978079880799808008080180802808038080480805808068080780808808098081080811808128081380814808158081680817808188081980820808218082280823808248082580826808278082880829808308083180832808338083480835808368083780838808398084080841808428084380844808458084680847808488084980850808518085280853808548085580856808578085880859808608086180862808638086480865808668086780868808698087080871808728087380874808758087680877808788087980880808818088280883808848088580886808878088880889808908089180892808938089480895808968089780898808998090080901809028090380904809058090680907809088090980910809118091280913809148091580916809178091880919809208092180922809238092480925809268092780928809298093080931809328093380934809358093680937809388093980940809418094280943809448094580946809478094880949809508095180952809538095480955809568095780958809598096080961809628096380964809658096680967809688096980970809718097280973809748097580976809778097880979809808098180982809838098480985809868098780988809898099080991809928099380994809958099680997809988099981000810018100281003810048100581006810078100881009810108101181012810138101481015810168101781018810198102081021810228102381024810258102681027810288102981030810318103281033810348103581036810378103881039810408104181042810438104481045810468104781048810498105081051810528105381054810558105681057810588105981060810618106281063810648106581066810678106881069810708107181072810738107481075810768107781078810798108081081810828108381084810858108681087810888108981090810918109281093810948109581096810978109881099811008110181102811038110481105811068110781108811098111081111811128111381114811158111681117811188111981120811218112281123811248112581126811278112881129811308113181132811338113481135811368113781138811398114081141811428114381144811458114681147811488114981150811518115281153811548115581156811578115881159811608116181162811638116481165811668116781168811698117081171811728117381174811758117681177811788117981180811818118281183811848118581186811878118881189811908119181192811938119481195811968119781198811998120081201812028120381204812058120681207812088120981210812118121281213812148121581216812178121881219812208122181222812238122481225812268122781228812298123081231812328123381234812358123681237812388123981240812418124281243812448124581246812478124881249812508125181252812538125481255812568125781258812598126081261812628126381264812658126681267812688126981270812718127281273812748127581276812778127881279812808128181282812838128481285812868128781288812898129081291812928129381294812958129681297812988129981300813018130281303813048130581306813078130881309813108131181312813138131481315813168131781318813198132081321813228132381324813258132681327813288132981330813318133281333813348133581336813378133881339813408134181342813438134481345813468134781348813498135081351813528135381354813558135681357813588135981360813618136281363813648136581366813678136881369813708137181372813738137481375813768137781378813798138081381813828138381384813858138681387813888138981390813918139281393813948139581396813978139881399814008140181402814038140481405814068140781408814098141081411814128141381414814158141681417814188141981420814218142281423814248142581426814278142881429814308143181432814338143481435814368143781438814398144081441814428144381444814458144681447814488144981450814518145281453814548145581456814578145881459814608146181462814638146481465814668146781468814698147081471814728147381474814758147681477814788147981480814818148281483814848148581486814878148881489814908149181492814938149481495814968149781498814998150081501815028150381504815058150681507815088150981510815118151281513815148151581516815178151881519815208152181522815238152481525815268152781528815298153081531815328153381534815358153681537815388153981540815418154281543815448154581546815478154881549815508155181552815538155481555815568155781558815598156081561815628156381564815658156681567815688156981570815718157281573815748157581576815778157881579815808158181582815838158481585815868158781588815898159081591815928159381594815958159681597815988159981600816018160281603816048160581606816078160881609816108161181612816138161481615816168161781618816198162081621816228162381624816258162681627816288162981630816318163281633816348163581636816378163881639816408164181642816438164481645816468164781648816498165081651816528165381654816558165681657816588165981660816618166281663816648166581666816678166881669816708167181672816738167481675816768167781678816798168081681816828168381684816858168681687816888168981690816918169281693816948169581696816978169881699817008170181702817038170481705817068170781708817098171081711817128171381714817158171681717817188171981720817218172281723817248172581726817278172881729817308173181732817338173481735817368173781738817398174081741817428174381744817458174681747817488174981750817518175281753817548175581756817578175881759817608176181762817638176481765817668176781768817698177081771817728177381774817758177681777817788177981780817818178281783817848178581786817878178881789817908179181792817938179481795817968179781798817998180081801818028180381804818058180681807818088180981810818118181281813818148181581816818178181881819818208182181822818238182481825818268182781828818298183081831818328183381834818358183681837818388183981840818418184281843818448184581846818478184881849818508185181852818538185481855818568185781858818598186081861818628186381864818658186681867818688186981870818718187281873818748187581876818778187881879818808188181882818838188481885818868188781888818898189081891818928189381894818958189681897818988189981900819018190281903819048190581906819078190881909819108191181912819138191481915819168191781918819198192081921819228192381924819258192681927819288192981930819318193281933819348193581936819378193881939819408194181942819438194481945819468194781948819498195081951819528195381954819558195681957819588195981960819618196281963819648196581966819678196881969819708197181972819738197481975819768197781978819798198081981819828198381984819858198681987819888198981990819918199281993819948199581996819978199881999820008200182002820038200482005820068200782008820098201082011820128201382014820158201682017820188201982020820218202282023820248202582026820278202882029820308203182032820338203482035820368203782038820398204082041820428204382044820458204682047820488204982050820518205282053820548205582056820578205882059820608206182062820638206482065820668206782068820698207082071820728207382074820758207682077820788207982080820818208282083820848208582086820878208882089820908209182092820938209482095820968209782098820998210082101821028210382104821058210682107821088210982110821118211282113821148211582116821178211882119821208212182122821238212482125821268212782128821298213082131821328213382134821358213682137821388213982140821418214282143821448214582146821478214882149821508215182152821538215482155821568215782158821598216082161821628216382164821658216682167821688216982170821718217282173821748217582176821778217882179821808218182182821838218482185821868218782188821898219082191821928219382194821958219682197821988219982200822018220282203822048220582206822078220882209822108221182212822138221482215822168221782218822198222082221822228222382224822258222682227822288222982230822318223282233822348223582236822378223882239822408224182242822438224482245822468224782248822498225082251822528225382254822558225682257822588225982260822618226282263822648226582266822678226882269822708227182272822738227482275822768227782278822798228082281822828228382284822858228682287822888228982290822918229282293822948229582296822978229882299823008230182302823038230482305823068230782308823098231082311823128231382314823158231682317823188231982320823218232282323823248232582326823278232882329823308233182332823338233482335823368233782338823398234082341823428234382344823458234682347823488234982350823518235282353823548235582356823578235882359823608236182362823638236482365823668236782368823698237082371823728237382374823758237682377823788237982380823818238282383823848238582386823878238882389823908239182392823938239482395823968239782398823998240082401824028240382404824058240682407824088240982410824118241282413824148241582416824178241882419824208242182422824238242482425824268242782428824298243082431824328243382434824358243682437824388243982440824418244282443824448244582446824478244882449824508245182452824538245482455824568245782458824598246082461824628246382464824658246682467824688246982470824718247282473824748247582476824778247882479824808248182482824838248482485824868248782488824898249082491824928249382494824958249682497824988249982500825018250282503825048250582506825078250882509825108251182512825138251482515825168251782518825198252082521825228252382524825258252682527825288252982530825318253282533825348253582536825378253882539825408254182542825438254482545825468254782548825498255082551825528255382554825558255682557825588255982560825618256282563825648256582566825678256882569825708257182572825738257482575825768257782578825798258082581825828258382584825858258682587825888258982590825918259282593825948259582596825978259882599826008260182602826038260482605826068260782608826098261082611826128261382614826158261682617826188261982620826218262282623826248262582626826278262882629826308263182632826338263482635826368263782638826398264082641826428264382644826458264682647826488264982650826518265282653826548265582656826578265882659826608266182662826638266482665826668266782668826698267082671826728267382674826758267682677826788267982680826818268282683826848268582686826878268882689826908269182692826938269482695826968269782698826998270082701827028270382704827058270682707827088270982710827118271282713827148271582716827178271882719827208272182722827238272482725827268272782728827298273082731827328273382734827358273682737827388273982740827418274282743827448274582746827478274882749827508275182752827538275482755827568275782758827598276082761827628276382764827658276682767827688276982770827718277282773827748277582776827778277882779827808278182782827838278482785827868278782788827898279082791827928279382794827958279682797827988279982800828018280282803828048280582806828078280882809828108281182812828138281482815828168281782818828198282082821828228282382824828258282682827828288282982830828318283282833828348283582836828378283882839828408284182842828438284482845828468284782848828498285082851828528285382854828558285682857828588285982860828618286282863828648286582866828678286882869828708287182872828738287482875828768287782878828798288082881828828288382884828858288682887828888288982890828918289282893828948289582896828978289882899829008290182902829038290482905829068290782908829098291082911829128291382914829158291682917829188291982920829218292282923829248292582926829278292882929829308293182932829338293482935829368293782938829398294082941829428294382944829458294682947829488294982950829518295282953829548295582956829578295882959829608296182962829638296482965829668296782968829698297082971829728297382974829758297682977829788297982980829818298282983829848298582986829878298882989829908299182992829938299482995829968299782998829998300083001830028300383004830058300683007830088300983010830118301283013830148301583016830178301883019830208302183022830238302483025830268302783028830298303083031830328303383034830358303683037830388303983040830418304283043830448304583046830478304883049830508305183052830538305483055830568305783058830598306083061830628306383064830658306683067830688306983070830718307283073830748307583076830778307883079830808308183082830838308483085830868308783088830898309083091830928309383094830958309683097830988309983100831018310283103831048310583106831078310883109831108311183112831138311483115831168311783118831198312083121831228312383124831258312683127831288312983130831318313283133831348313583136831378313883139831408314183142831438314483145831468314783148831498315083151831528315383154831558315683157831588315983160831618316283163831648316583166831678316883169831708317183172831738317483175831768317783178831798318083181831828318383184831858318683187831888318983190831918319283193831948319583196831978319883199832008320183202832038320483205832068320783208832098321083211832128321383214832158321683217832188321983220832218322283223832248322583226832278322883229832308323183232832338323483235832368323783238832398324083241832428324383244832458324683247832488324983250832518325283253832548325583256832578325883259832608326183262832638326483265832668326783268832698327083271832728327383274832758327683277832788327983280832818328283283832848328583286832878328883289832908329183292832938329483295832968329783298832998330083301833028330383304833058330683307833088330983310833118331283313833148331583316833178331883319833208332183322833238332483325833268332783328833298333083331833328333383334833358333683337833388333983340833418334283343833448334583346833478334883349833508335183352833538335483355833568335783358833598336083361833628336383364833658336683367833688336983370833718337283373833748337583376833778337883379833808338183382833838338483385833868338783388833898339083391833928339383394833958339683397833988339983400834018340283403834048340583406834078340883409834108341183412834138341483415834168341783418834198342083421834228342383424834258342683427834288342983430834318343283433834348343583436834378343883439834408344183442834438344483445834468344783448834498345083451834528345383454834558345683457834588345983460834618346283463834648346583466834678346883469834708347183472834738347483475834768347783478834798348083481834828348383484834858348683487834888348983490834918349283493834948349583496834978349883499835008350183502835038350483505835068350783508835098351083511835128351383514835158351683517835188351983520835218352283523835248352583526835278352883529835308353183532835338353483535835368353783538835398354083541835428354383544835458354683547835488354983550835518355283553835548355583556835578355883559835608356183562835638356483565835668356783568835698357083571835728357383574835758357683577835788357983580835818358283583835848358583586835878358883589835908359183592835938359483595835968359783598835998360083601836028360383604836058360683607836088360983610836118361283613836148361583616836178361883619836208362183622836238362483625836268362783628836298363083631836328363383634836358363683637836388363983640836418364283643836448364583646836478364883649836508365183652836538365483655836568365783658836598366083661836628366383664836658366683667836688366983670836718367283673836748367583676836778367883679836808368183682836838368483685836868368783688836898369083691836928369383694836958369683697836988369983700837018370283703837048370583706837078370883709837108371183712837138371483715837168371783718837198372083721837228372383724837258372683727837288372983730837318373283733837348373583736837378373883739837408374183742837438374483745837468374783748837498375083751837528375383754837558375683757837588375983760837618376283763837648376583766837678376883769837708377183772837738377483775837768377783778837798378083781837828378383784837858378683787837888378983790837918379283793837948379583796837978379883799838008380183802838038380483805838068380783808838098381083811838128381383814838158381683817838188381983820838218382283823838248382583826838278382883829838308383183832838338383483835838368383783838838398384083841838428384383844838458384683847838488384983850838518385283853838548385583856838578385883859838608386183862838638386483865838668386783868838698387083871838728387383874838758387683877838788387983880838818388283883838848388583886838878388883889838908389183892838938389483895838968389783898838998390083901839028390383904839058390683907839088390983910839118391283913839148391583916839178391883919839208392183922839238392483925839268392783928839298393083931839328393383934839358393683937839388393983940839418394283943839448394583946839478394883949839508395183952839538395483955839568395783958839598396083961839628396383964839658396683967839688396983970839718397283973839748397583976839778397883979839808398183982839838398483985839868398783988839898399083991839928399383994839958399683997839988399984000840018400284003840048400584006840078400884009840108401184012840138401484015840168401784018840198402084021840228402384024840258402684027840288402984030840318403284033840348403584036840378403884039840408404184042840438404484045840468404784048840498405084051840528405384054840558405684057840588405984060840618406284063840648406584066840678406884069840708407184072840738407484075840768407784078840798408084081840828408384084840858408684087840888408984090840918409284093840948409584096840978409884099841008410184102841038410484105841068410784108841098411084111841128411384114841158411684117841188411984120841218412284123841248412584126841278412884129841308413184132841338413484135841368413784138841398414084141841428414384144841458414684147841488414984150841518415284153841548415584156841578415884159841608416184162841638416484165841668416784168841698417084171841728417384174841758417684177841788417984180841818418284183841848418584186841878418884189841908419184192841938419484195841968419784198841998420084201842028420384204842058420684207842088420984210842118421284213842148421584216842178421884219842208422184222842238422484225842268422784228842298423084231842328423384234842358423684237842388423984240842418424284243842448424584246842478424884249842508425184252842538425484255842568425784258842598426084261842628426384264842658426684267842688426984270842718427284273842748427584276842778427884279842808428184282842838428484285842868428784288842898429084291842928429384294842958429684297842988429984300843018430284303843048430584306843078430884309843108431184312843138431484315843168431784318843198432084321843228432384324843258432684327843288432984330843318433284333843348433584336843378433884339843408434184342843438434484345843468434784348843498435084351843528435384354843558435684357843588435984360843618436284363843648436584366843678436884369843708437184372843738437484375843768437784378843798438084381843828438384384843858438684387843888438984390843918439284393843948439584396843978439884399844008440184402844038440484405844068440784408844098441084411844128441384414844158441684417844188441984420844218442284423844248442584426844278442884429844308443184432844338443484435844368443784438844398444084441844428444384444844458444684447844488444984450844518445284453844548445584456844578445884459844608446184462844638446484465844668446784468844698447084471844728447384474844758447684477844788447984480844818448284483844848448584486844878448884489844908449184492844938449484495844968449784498844998450084501845028450384504845058450684507845088450984510845118451284513845148451584516845178451884519845208452184522845238452484525845268452784528845298453084531845328453384534845358453684537845388453984540845418454284543845448454584546845478454884549845508455184552845538455484555845568455784558845598456084561845628456384564845658456684567845688456984570845718457284573845748457584576845778457884579845808458184582845838458484585845868458784588845898459084591845928459384594845958459684597845988459984600846018460284603846048460584606846078460884609846108461184612846138461484615846168461784618846198462084621846228462384624846258462684627846288462984630846318463284633846348463584636846378463884639846408464184642846438464484645846468464784648846498465084651846528465384654846558465684657846588465984660846618466284663846648466584666846678466884669846708467184672846738467484675846768467784678846798468084681846828468384684846858468684687846888468984690846918469284693846948469584696846978469884699847008470184702847038470484705847068470784708847098471084711847128471384714847158471684717847188471984720847218472284723847248472584726847278472884729847308473184732847338473484735847368473784738847398474084741847428474384744847458474684747847488474984750847518475284753847548475584756847578475884759847608476184762847638476484765847668476784768847698477084771847728477384774847758477684777847788477984780847818478284783847848478584786847878478884789847908479184792847938479484795847968479784798847998480084801848028480384804848058480684807848088480984810848118481284813848148481584816848178481884819848208482184822848238482484825848268482784828848298483084831848328483384834848358483684837848388483984840848418484284843848448484584846848478484884849848508485184852848538485484855848568485784858848598486084861848628486384864848658486684867848688486984870848718487284873848748487584876848778487884879848808488184882848838488484885848868488784888848898489084891848928489384894848958489684897848988489984900849018490284903849048490584906849078490884909849108491184912849138491484915849168491784918849198492084921849228492384924849258492684927849288492984930849318493284933849348493584936849378493884939849408494184942849438494484945849468494784948849498495084951849528495384954849558495684957849588495984960849618496284963849648496584966849678496884969849708497184972849738497484975849768497784978849798498084981849828498384984849858498684987849888498984990849918499284993849948499584996849978499884999850008500185002850038500485005850068500785008850098501085011850128501385014850158501685017850188501985020850218502285023850248502585026850278502885029850308503185032850338503485035850368503785038850398504085041850428504385044850458504685047850488504985050850518505285053850548505585056850578505885059850608506185062850638506485065850668506785068850698507085071850728507385074850758507685077850788507985080850818508285083850848508585086850878508885089850908509185092850938509485095850968509785098850998510085101851028510385104851058510685107851088510985110851118511285113851148511585116851178511885119851208512185122851238512485125851268512785128851298513085131851328513385134851358513685137851388513985140851418514285143851448514585146851478514885149851508515185152851538515485155851568515785158851598516085161851628516385164851658516685167851688516985170851718517285173851748517585176851778517885179851808518185182851838518485185851868518785188851898519085191851928519385194851958519685197851988519985200852018520285203852048520585206852078520885209852108521185212852138521485215852168521785218852198522085221852228522385224852258522685227852288522985230852318523285233852348523585236852378523885239852408524185242852438524485245852468524785248852498525085251852528525385254852558525685257852588525985260852618526285263852648526585266852678526885269852708527185272852738527485275852768527785278852798528085281852828528385284852858528685287852888528985290852918529285293852948529585296852978529885299853008530185302853038530485305853068530785308853098531085311853128531385314853158531685317853188531985320853218532285323853248532585326853278532885329853308533185332853338533485335853368533785338853398534085341853428534385344853458534685347853488534985350853518535285353853548535585356853578535885359853608536185362853638536485365853668536785368853698537085371853728537385374853758537685377853788537985380853818538285383853848538585386853878538885389853908539185392853938539485395853968539785398853998540085401854028540385404854058540685407854088540985410854118541285413854148541585416854178541885419854208542185422854238542485425854268542785428854298543085431854328543385434854358543685437854388543985440854418544285443854448544585446854478544885449854508545185452854538545485455854568545785458854598546085461854628546385464854658546685467854688546985470854718547285473854748547585476854778547885479854808548185482854838548485485854868548785488854898549085491854928549385494854958549685497854988549985500855018550285503855048550585506855078550885509855108551185512855138551485515855168551785518855198552085521855228552385524855258552685527855288552985530855318553285533855348553585536855378553885539855408554185542855438554485545855468554785548855498555085551855528555385554855558555685557855588555985560855618556285563855648556585566855678556885569855708557185572855738557485575855768557785578855798558085581855828558385584855858558685587855888558985590855918559285593855948559585596855978559885599856008560185602856038560485605856068560785608856098561085611856128561385614856158561685617856188561985620856218562285623856248562585626856278562885629856308563185632856338563485635856368563785638856398564085641856428564385644856458564685647856488564985650856518565285653856548565585656856578565885659856608566185662856638566485665856668566785668856698567085671856728567385674856758567685677856788567985680856818568285683856848568585686856878568885689856908569185692856938569485695856968569785698856998570085701857028570385704857058570685707857088570985710857118571285713857148571585716857178571885719857208572185722857238572485725857268572785728857298573085731857328573385734857358573685737857388573985740857418574285743857448574585746857478574885749857508575185752857538575485755857568575785758857598576085761857628576385764857658576685767857688576985770857718577285773857748577585776857778577885779857808578185782857838578485785857868578785788857898579085791857928579385794857958579685797857988579985800858018580285803858048580585806858078580885809858108581185812858138581485815858168581785818858198582085821858228582385824858258582685827858288582985830858318583285833858348583585836858378583885839858408584185842858438584485845858468584785848858498585085851858528585385854858558585685857858588585985860858618586285863858648586585866858678586885869858708587185872858738587485875858768587785878858798588085881858828588385884858858588685887858888588985890858918589285893858948589585896858978589885899859008590185902859038590485905859068590785908859098591085911859128591385914859158591685917859188591985920859218592285923859248592585926859278592885929859308593185932859338593485935859368593785938859398594085941859428594385944859458594685947859488594985950859518595285953859548595585956859578595885959859608596185962859638596485965859668596785968859698597085971859728597385974859758597685977859788597985980859818598285983859848598585986859878598885989859908599185992859938599485995859968599785998859998600086001860028600386004860058600686007860088600986010860118601286013860148601586016860178601886019860208602186022860238602486025860268602786028860298603086031860328603386034860358603686037860388603986040860418604286043860448604586046860478604886049860508605186052860538605486055860568605786058860598606086061860628606386064860658606686067860688606986070860718607286073860748607586076860778607886079860808608186082860838608486085860868608786088860898609086091860928609386094860958609686097860988609986100861018610286103861048610586106861078610886109861108611186112861138611486115861168611786118861198612086121861228612386124861258612686127861288612986130861318613286133861348613586136861378613886139861408614186142861438614486145861468614786148861498615086151861528615386154861558615686157861588615986160861618616286163861648616586166861678616886169861708617186172861738617486175861768617786178861798618086181861828618386184861858618686187861888618986190861918619286193861948619586196861978619886199862008620186202862038620486205862068620786208862098621086211862128621386214862158621686217862188621986220862218622286223862248622586226862278622886229862308623186232862338623486235862368623786238862398624086241862428624386244862458624686247862488624986250862518625286253862548625586256862578625886259862608626186262862638626486265862668626786268862698627086271862728627386274862758627686277862788627986280862818628286283862848628586286862878628886289862908629186292862938629486295862968629786298862998630086301863028630386304863058630686307863088630986310863118631286313863148631586316863178631886319863208632186322863238632486325863268632786328863298633086331863328633386334863358633686337863388633986340863418634286343863448634586346863478634886349863508635186352863538635486355863568635786358863598636086361863628636386364863658636686367863688636986370863718637286373863748637586376863778637886379863808638186382863838638486385863868638786388863898639086391863928639386394863958639686397863988639986400864018640286403864048640586406864078640886409864108641186412864138641486415864168641786418864198642086421864228642386424864258642686427864288642986430864318643286433864348643586436864378643886439864408644186442864438644486445864468644786448864498645086451864528645386454864558645686457864588645986460864618646286463864648646586466864678646886469864708647186472864738647486475864768647786478864798648086481864828648386484864858648686487864888648986490864918649286493864948649586496864978649886499865008650186502865038650486505865068650786508865098651086511865128651386514865158651686517865188651986520865218652286523865248652586526865278652886529865308653186532865338653486535865368653786538865398654086541865428654386544865458654686547865488654986550865518655286553865548655586556865578655886559865608656186562865638656486565865668656786568865698657086571865728657386574865758657686577865788657986580865818658286583865848658586586865878658886589865908659186592865938659486595865968659786598865998660086601866028660386604866058660686607866088660986610866118661286613866148661586616866178661886619866208662186622866238662486625866268662786628866298663086631866328663386634866358663686637866388663986640866418664286643866448664586646866478664886649866508665186652866538665486655866568665786658866598666086661866628666386664866658666686667866688666986670866718667286673866748667586676866778667886679866808668186682866838668486685866868668786688866898669086691866928669386694866958669686697866988669986700867018670286703867048670586706867078670886709867108671186712867138671486715867168671786718867198672086721867228672386724867258672686727867288672986730867318673286733867348673586736867378673886739867408674186742867438674486745867468674786748867498675086751867528675386754867558675686757867588675986760867618676286763867648676586766867678676886769867708677186772867738677486775867768677786778867798678086781867828678386784867858678686787867888678986790867918679286793867948679586796867978679886799868008680186802868038680486805868068680786808868098681086811868128681386814868158681686817868188681986820868218682286823868248682586826868278682886829868308683186832868338683486835868368683786838868398684086841868428684386844868458684686847868488684986850868518685286853868548685586856868578685886859868608686186862868638686486865868668686786868868698687086871868728687386874868758687686877868788687986880868818688286883868848688586886868878688886889868908689186892868938689486895868968689786898868998690086901869028690386904869058690686907869088690986910869118691286913869148691586916869178691886919869208692186922869238692486925869268692786928869298693086931869328693386934869358693686937869388693986940869418694286943869448694586946869478694886949869508695186952869538695486955869568695786958869598696086961869628696386964869658696686967869688696986970869718697286973869748697586976869778697886979869808698186982869838698486985869868698786988869898699086991869928699386994869958699686997869988699987000870018700287003870048700587006870078700887009870108701187012870138701487015870168701787018870198702087021870228702387024870258702687027870288702987030870318703287033870348703587036870378703887039870408704187042870438704487045870468704787048870498705087051870528705387054870558705687057870588705987060870618706287063870648706587066870678706887069870708707187072870738707487075870768707787078870798708087081870828708387084870858708687087870888708987090870918709287093870948709587096870978709887099871008710187102871038710487105871068710787108871098711087111871128711387114871158711687117871188711987120871218712287123871248712587126871278712887129871308713187132871338713487135871368713787138871398714087141871428714387144871458714687147871488714987150871518715287153871548715587156871578715887159871608716187162871638716487165871668716787168871698717087171871728717387174871758717687177871788717987180871818718287183871848718587186871878718887189871908719187192871938719487195871968719787198871998720087201872028720387204872058720687207872088720987210872118721287213872148721587216872178721887219872208722187222872238722487225872268722787228872298723087231872328723387234872358723687237872388723987240872418724287243872448724587246872478724887249872508725187252872538725487255872568725787258872598726087261872628726387264872658726687267872688726987270872718727287273872748727587276872778727887279872808728187282872838728487285872868728787288872898729087291872928729387294872958729687297872988729987300873018730287303873048730587306873078730887309873108731187312873138731487315873168731787318873198732087321873228732387324873258732687327873288732987330873318733287333873348733587336873378733887339873408734187342873438734487345873468734787348873498735087351873528735387354873558735687357873588735987360873618736287363873648736587366873678736887369873708737187372873738737487375873768737787378873798738087381873828738387384873858738687387873888738987390873918739287393873948739587396873978739887399874008740187402874038740487405874068740787408874098741087411874128741387414874158741687417874188741987420874218742287423874248742587426874278742887429874308743187432874338743487435874368743787438874398744087441874428744387444874458744687447874488744987450874518745287453874548745587456874578745887459874608746187462874638746487465874668746787468874698747087471874728747387474874758747687477874788747987480874818748287483874848748587486874878748887489874908749187492874938749487495874968749787498874998750087501875028750387504875058750687507875088750987510875118751287513875148751587516875178751887519875208752187522875238752487525875268752787528875298753087531875328753387534875358753687537875388753987540875418754287543875448754587546875478754887549875508755187552875538755487555875568755787558875598756087561875628756387564875658756687567875688756987570875718757287573875748757587576875778757887579875808758187582875838758487585875868758787588875898759087591875928759387594875958759687597875988759987600876018760287603876048760587606876078760887609876108761187612876138761487615876168761787618876198762087621876228762387624876258762687627876288762987630876318763287633876348763587636876378763887639876408764187642876438764487645876468764787648876498765087651876528765387654876558765687657876588765987660876618766287663876648766587666876678766887669876708767187672876738767487675876768767787678876798768087681876828768387684876858768687687876888768987690876918769287693876948769587696876978769887699877008770187702877038770487705877068770787708877098771087711877128771387714877158771687717877188771987720877218772287723877248772587726877278772887729877308773187732877338773487735877368773787738877398774087741877428774387744877458774687747877488774987750877518775287753877548775587756877578775887759877608776187762877638776487765877668776787768877698777087771877728777387774877758777687777877788777987780877818778287783877848778587786877878778887789877908779187792877938779487795877968779787798877998780087801878028780387804878058780687807878088780987810878118781287813878148781587816878178781887819878208782187822878238782487825878268782787828878298783087831878328783387834878358783687837878388783987840878418784287843878448784587846878478784887849878508785187852878538785487855878568785787858878598786087861878628786387864878658786687867878688786987870878718787287873878748787587876878778787887879878808788187882878838788487885878868788787888878898789087891878928789387894878958789687897878988789987900879018790287903879048790587906879078790887909879108791187912879138791487915879168791787918879198792087921879228792387924879258792687927879288792987930879318793287933879348793587936879378793887939879408794187942879438794487945879468794787948879498795087951879528795387954879558795687957879588795987960879618796287963879648796587966879678796887969879708797187972879738797487975879768797787978879798798087981879828798387984879858798687987879888798987990879918799287993879948799587996879978799887999880008800188002880038800488005880068800788008880098801088011880128801388014880158801688017880188801988020880218802288023880248802588026880278802888029880308803188032880338803488035880368803788038880398804088041880428804388044880458804688047880488804988050880518805288053880548805588056880578805888059880608806188062880638806488065880668806788068880698807088071880728807388074880758807688077880788807988080880818808288083880848808588086880878808888089880908809188092880938809488095880968809788098880998810088101881028810388104881058810688107881088810988110881118811288113881148811588116881178811888119881208812188122881238812488125881268812788128881298813088131881328813388134881358813688137881388813988140881418814288143881448814588146881478814888149881508815188152881538815488155881568815788158881598816088161881628816388164881658816688167881688816988170881718817288173881748817588176881778817888179881808818188182881838818488185881868818788188881898819088191881928819388194881958819688197881988819988200882018820288203882048820588206882078820888209882108821188212882138821488215882168821788218882198822088221882228822388224882258822688227882288822988230882318823288233882348823588236882378823888239882408824188242882438824488245882468824788248882498825088251882528825388254882558825688257882588825988260882618826288263882648826588266882678826888269882708827188272882738827488275882768827788278882798828088281882828828388284882858828688287882888828988290882918829288293882948829588296882978829888299883008830188302883038830488305883068830788308883098831088311883128831388314883158831688317883188831988320883218832288323883248832588326883278832888329883308833188332883338833488335883368833788338883398834088341883428834388344883458834688347883488834988350883518835288353883548835588356883578835888359883608836188362883638836488365883668836788368883698837088371883728837388374883758837688377883788837988380883818838288383883848838588386883878838888389883908839188392883938839488395883968839788398883998840088401884028840388404884058840688407884088840988410884118841288413884148841588416884178841888419884208842188422884238842488425884268842788428884298843088431884328843388434884358843688437884388843988440884418844288443884448844588446884478844888449884508845188452884538845488455884568845788458884598846088461884628846388464884658846688467884688846988470884718847288473884748847588476884778847888479884808848188482884838848488485884868848788488884898849088491884928849388494884958849688497884988849988500885018850288503885048850588506885078850888509885108851188512885138851488515885168851788518885198852088521885228852388524885258852688527885288852988530885318853288533885348853588536885378853888539885408854188542885438854488545885468854788548885498855088551885528855388554885558855688557885588855988560885618856288563885648856588566885678856888569885708857188572885738857488575885768857788578885798858088581885828858388584885858858688587885888858988590885918859288593885948859588596885978859888599886008860188602886038860488605886068860788608886098861088611886128861388614886158861688617886188861988620886218862288623886248862588626886278862888629886308863188632886338863488635886368863788638886398864088641886428864388644886458864688647886488864988650886518865288653886548865588656886578865888659886608866188662886638866488665886668866788668886698867088671886728867388674886758867688677886788867988680886818868288683886848868588686886878868888689886908869188692886938869488695886968869788698886998870088701887028870388704887058870688707887088870988710887118871288713887148871588716887178871888719887208872188722887238872488725887268872788728887298873088731887328873388734887358873688737887388873988740887418874288743887448874588746887478874888749887508875188752887538875488755887568875788758887598876088761887628876388764887658876688767887688876988770887718877288773887748877588776887778877888779887808878188782887838878488785887868878788788887898879088791887928879388794887958879688797887988879988800888018880288803888048880588806888078880888809888108881188812888138881488815888168881788818888198882088821888228882388824888258882688827888288882988830888318883288833888348883588836888378883888839888408884188842888438884488845888468884788848888498885088851888528885388854888558885688857888588885988860888618886288863888648886588866888678886888869888708887188872888738887488875888768887788878888798888088881888828888388884888858888688887888888888988890888918889288893888948889588896888978889888899889008890188902889038890488905889068890788908889098891088911889128891388914889158891688917889188891988920889218892288923889248892588926889278892888929889308893188932889338893488935889368893788938889398894088941889428894388944889458894688947889488894988950889518895288953889548895588956889578895888959889608896188962889638896488965889668896788968889698897088971889728897388974889758897688977889788897988980889818898288983889848898588986889878898888989889908899188992889938899488995889968899788998889998900089001890028900389004890058900689007890088900989010890118901289013890148901589016890178901889019890208902189022890238902489025890268902789028890298903089031890328903389034890358903689037890388903989040890418904289043890448904589046890478904889049890508905189052890538905489055890568905789058890598906089061890628906389064890658906689067890688906989070890718907289073890748907589076890778907889079890808908189082890838908489085890868908789088890898909089091890928909389094890958909689097890988909989100891018910289103891048910589106891078910889109891108911189112891138911489115891168911789118891198912089121891228912389124891258912689127891288912989130891318913289133891348913589136891378913889139891408914189142891438914489145891468914789148891498915089151891528915389154891558915689157891588915989160891618916289163891648916589166891678916889169891708917189172891738917489175891768917789178891798918089181891828918389184891858918689187891888918989190891918919289193891948919589196891978919889199892008920189202892038920489205892068920789208892098921089211892128921389214892158921689217892188921989220892218922289223892248922589226892278922889229892308923189232892338923489235892368923789238892398924089241892428924389244892458924689247892488924989250892518925289253892548925589256892578925889259892608926189262892638926489265892668926789268892698927089271892728927389274892758927689277892788927989280892818928289283892848928589286892878928889289892908929189292892938929489295892968929789298892998930089301893028930389304893058930689307893088930989310893118931289313893148931589316893178931889319893208932189322893238932489325893268932789328893298933089331893328933389334893358933689337893388933989340893418934289343893448934589346893478934889349893508935189352893538935489355893568935789358893598936089361893628936389364893658936689367893688936989370893718937289373893748937589376893778937889379893808938189382893838938489385893868938789388893898939089391893928939389394893958939689397893988939989400894018940289403894048940589406894078940889409894108941189412894138941489415894168941789418894198942089421894228942389424894258942689427894288942989430894318943289433894348943589436894378943889439894408944189442894438944489445894468944789448894498945089451894528945389454894558945689457894588945989460894618946289463894648946589466894678946889469894708947189472894738947489475894768947789478894798948089481894828948389484894858948689487894888948989490894918949289493894948949589496894978949889499895008950189502895038950489505895068950789508895098951089511895128951389514895158951689517895188951989520895218952289523895248952589526895278952889529895308953189532895338953489535895368953789538895398954089541895428954389544895458954689547895488954989550895518955289553895548955589556895578955889559895608956189562895638956489565895668956789568895698957089571895728957389574895758957689577895788957989580895818958289583895848958589586895878958889589895908959189592895938959489595895968959789598895998960089601896028960389604896058960689607896088960989610896118961289613896148961589616896178961889619896208962189622896238962489625896268962789628896298963089631896328963389634896358963689637896388963989640896418964289643896448964589646896478964889649896508965189652896538965489655896568965789658896598966089661896628966389664896658966689667896688966989670896718967289673896748967589676896778967889679896808968189682896838968489685896868968789688896898969089691896928969389694896958969689697896988969989700897018970289703897048970589706897078970889709897108971189712897138971489715897168971789718897198972089721897228972389724897258972689727897288972989730897318973289733897348973589736897378973889739897408974189742897438974489745897468974789748897498975089751897528975389754897558975689757897588975989760897618976289763897648976589766897678976889769897708977189772897738977489775897768977789778897798978089781897828978389784897858978689787897888978989790897918979289793897948979589796897978979889799898008980189802898038980489805898068980789808898098981089811898128981389814898158981689817898188981989820898218982289823898248982589826898278982889829898308983189832898338983489835898368983789838898398984089841898428984389844898458984689847898488984989850898518985289853898548985589856898578985889859898608986189862898638986489865898668986789868898698987089871898728987389874898758987689877898788987989880898818988289883898848988589886898878988889889898908989189892898938989489895898968989789898898998990089901899028990389904899058990689907899088990989910899118991289913899148991589916899178991889919899208992189922899238992489925899268992789928899298993089931899328993389934899358993689937899388993989940899418994289943899448994589946899478994889949899508995189952899538995489955899568995789958899598996089961899628996389964899658996689967899688996989970899718997289973899748997589976899778997889979899808998189982899838998489985899868998789988899898999089991899928999389994899958999689997899988999990000900019000290003900049000590006900079000890009900109001190012900139001490015900169001790018900199002090021900229002390024900259002690027900289002990030900319003290033900349003590036900379003890039900409004190042900439004490045900469004790048900499005090051900529005390054900559005690057900589005990060900619006290063900649006590066900679006890069900709007190072900739007490075900769007790078900799008090081900829008390084900859008690087900889008990090900919009290093900949009590096900979009890099901009010190102901039010490105901069010790108901099011090111901129011390114901159011690117901189011990120901219012290123901249012590126901279012890129901309013190132901339013490135901369013790138901399014090141901429014390144901459014690147901489014990150901519015290153901549015590156901579015890159901609016190162901639016490165901669016790168901699017090171901729017390174901759017690177901789017990180901819018290183901849018590186901879018890189901909019190192901939019490195901969019790198901999020090201902029020390204902059020690207902089020990210902119021290213902149021590216902179021890219902209022190222902239022490225902269022790228902299023090231902329023390234902359023690237902389023990240902419024290243902449024590246902479024890249902509025190252902539025490255902569025790258902599026090261902629026390264902659026690267902689026990270902719027290273902749027590276902779027890279902809028190282902839028490285902869028790288902899029090291902929029390294902959029690297902989029990300903019030290303903049030590306903079030890309903109031190312903139031490315903169031790318903199032090321903229032390324903259032690327903289032990330903319033290333903349033590336903379033890339903409034190342903439034490345903469034790348903499035090351903529035390354903559035690357903589035990360903619036290363903649036590366903679036890369903709037190372903739037490375903769037790378903799038090381903829038390384903859038690387903889038990390903919039290393903949039590396903979039890399904009040190402904039040490405904069040790408904099041090411904129041390414904159041690417904189041990420904219042290423904249042590426904279042890429904309043190432904339043490435904369043790438904399044090441904429044390444904459044690447904489044990450904519045290453904549045590456904579045890459904609046190462904639046490465904669046790468904699047090471904729047390474904759047690477904789047990480904819048290483904849048590486904879048890489904909049190492904939049490495904969049790498904999050090501905029050390504905059050690507905089050990510905119051290513905149051590516905179051890519905209052190522905239052490525905269052790528905299053090531905329053390534905359053690537905389053990540905419054290543905449054590546905479054890549905509055190552905539055490555905569055790558905599056090561905629056390564905659056690567905689056990570905719057290573905749057590576905779057890579905809058190582905839058490585905869058790588905899059090591905929059390594905959059690597905989059990600906019060290603906049060590606906079060890609906109061190612906139061490615906169061790618906199062090621906229062390624906259062690627906289062990630906319063290633906349063590636906379063890639906409064190642906439064490645906469064790648906499065090651906529065390654906559065690657906589065990660906619066290663906649066590666906679066890669906709067190672906739067490675906769067790678906799068090681906829068390684906859068690687906889068990690906919069290693906949069590696906979069890699907009070190702907039070490705907069070790708907099071090711907129071390714907159071690717907189071990720907219072290723907249072590726907279072890729907309073190732907339073490735907369073790738907399074090741907429074390744907459074690747907489074990750907519075290753907549075590756907579075890759907609076190762907639076490765907669076790768907699077090771907729077390774907759077690777907789077990780907819078290783907849078590786907879078890789907909079190792907939079490795907969079790798907999080090801908029080390804908059080690807908089080990810908119081290813908149081590816908179081890819908209082190822908239082490825908269082790828908299083090831908329083390834908359083690837908389083990840908419084290843908449084590846908479084890849908509085190852908539085490855908569085790858908599086090861908629086390864908659086690867908689086990870908719087290873908749087590876908779087890879908809088190882908839088490885908869088790888908899089090891908929089390894908959089690897908989089990900909019090290903909049090590906909079090890909909109091190912909139091490915909169091790918909199092090921909229092390924909259092690927909289092990930909319093290933909349093590936909379093890939909409094190942909439094490945909469094790948909499095090951909529095390954909559095690957909589095990960909619096290963909649096590966909679096890969909709097190972909739097490975909769097790978909799098090981909829098390984909859098690987909889098990990909919099290993909949099590996909979099890999910009100191002910039100491005910069100791008910099101091011910129101391014910159101691017910189101991020910219102291023910249102591026910279102891029910309103191032910339103491035910369103791038910399104091041910429104391044910459104691047910489104991050910519105291053910549105591056910579105891059910609106191062910639106491065910669106791068910699107091071910729107391074910759107691077910789107991080910819108291083910849108591086910879108891089910909109191092910939109491095910969109791098910999110091101911029110391104911059110691107911089110991110911119111291113911149111591116911179111891119911209112191122911239112491125911269112791128911299113091131911329113391134911359113691137911389113991140911419114291143911449114591146911479114891149911509115191152911539115491155911569115791158911599116091161911629116391164911659116691167911689116991170911719117291173911749117591176911779117891179911809118191182911839118491185911869118791188911899119091191911929119391194911959119691197911989119991200912019120291203912049120591206912079120891209912109121191212912139121491215912169121791218912199122091221912229122391224912259122691227912289122991230912319123291233912349123591236912379123891239912409124191242912439124491245912469124791248912499125091251912529125391254912559125691257912589125991260912619126291263912649126591266912679126891269912709127191272912739127491275912769127791278912799128091281912829128391284912859128691287912889128991290912919129291293912949129591296912979129891299913009130191302913039130491305913069130791308913099131091311913129131391314913159131691317913189131991320913219132291323913249132591326913279132891329913309133191332913339133491335913369133791338913399134091341913429134391344913459134691347913489134991350913519135291353913549135591356913579135891359913609136191362913639136491365913669136791368913699137091371913729137391374913759137691377913789137991380913819138291383913849138591386913879138891389913909139191392913939139491395913969139791398913999140091401914029140391404914059140691407914089140991410914119141291413914149141591416914179141891419914209142191422914239142491425914269142791428914299143091431914329143391434914359143691437914389143991440914419144291443914449144591446914479144891449914509145191452914539145491455914569145791458914599146091461914629146391464914659146691467914689146991470914719147291473914749147591476914779147891479914809148191482914839148491485914869148791488914899149091491914929149391494914959149691497914989149991500915019150291503915049150591506915079150891509915109151191512915139151491515915169151791518915199152091521915229152391524915259152691527915289152991530915319153291533915349153591536915379153891539915409154191542915439154491545915469154791548915499155091551915529155391554915559155691557915589155991560915619156291563915649156591566915679156891569915709157191572915739157491575915769157791578915799158091581915829158391584915859158691587915889158991590915919159291593915949159591596915979159891599916009160191602916039160491605916069160791608916099161091611916129161391614916159161691617916189161991620916219162291623916249162591626916279162891629916309163191632916339163491635916369163791638916399164091641916429164391644916459164691647916489164991650916519165291653916549165591656916579165891659916609166191662916639166491665916669166791668916699167091671916729167391674916759167691677916789167991680916819168291683916849168591686916879168891689916909169191692916939169491695916969169791698916999170091701917029170391704917059170691707917089170991710917119171291713917149171591716917179171891719917209172191722917239172491725917269172791728917299173091731917329173391734917359173691737917389173991740917419174291743917449174591746917479174891749917509175191752917539175491755917569175791758917599176091761917629176391764917659176691767917689176991770917719177291773917749177591776917779177891779917809178191782917839178491785917869178791788917899179091791917929179391794917959179691797917989179991800918019180291803918049180591806918079180891809918109181191812918139181491815918169181791818918199182091821918229182391824918259182691827918289182991830918319183291833918349183591836918379183891839918409184191842918439184491845918469184791848918499185091851918529185391854918559185691857918589185991860918619186291863918649186591866918679186891869918709187191872918739187491875918769187791878918799188091881918829188391884918859188691887918889188991890918919189291893918949189591896918979189891899919009190191902919039190491905919069190791908919099191091911919129191391914919159191691917919189191991920919219192291923919249192591926919279192891929919309193191932919339193491935919369193791938919399194091941919429194391944919459194691947919489194991950919519195291953919549195591956919579195891959919609196191962919639196491965919669196791968919699197091971919729197391974919759197691977919789197991980919819198291983919849198591986919879198891989919909199191992919939199491995919969199791998919999200092001920029200392004920059200692007920089200992010920119201292013920149201592016920179201892019920209202192022920239202492025920269202792028920299203092031920329203392034920359203692037920389203992040920419204292043920449204592046920479204892049920509205192052920539205492055920569205792058920599206092061920629206392064920659206692067920689206992070920719207292073920749207592076920779207892079920809208192082920839208492085920869208792088920899209092091920929209392094920959209692097920989209992100921019210292103921049210592106921079210892109921109211192112921139211492115921169211792118921199212092121921229212392124921259212692127921289212992130921319213292133921349213592136921379213892139921409214192142921439214492145921469214792148921499215092151921529215392154921559215692157921589215992160921619216292163921649216592166921679216892169921709217192172921739217492175921769217792178921799218092181921829218392184921859218692187921889218992190921919219292193921949219592196921979219892199922009220192202922039220492205922069220792208922099221092211922129221392214922159221692217922189221992220922219222292223922249222592226922279222892229922309223192232922339223492235922369223792238922399224092241922429224392244922459224692247922489224992250922519225292253922549225592256922579225892259922609226192262922639226492265922669226792268922699227092271922729227392274922759227692277922789227992280922819228292283922849228592286922879228892289922909229192292922939229492295922969229792298922999230092301923029230392304923059230692307923089230992310923119231292313923149231592316923179231892319923209232192322923239232492325923269232792328923299233092331923329233392334923359233692337923389233992340923419234292343923449234592346923479234892349923509235192352923539235492355923569235792358923599236092361923629236392364923659236692367923689236992370923719237292373923749237592376923779237892379923809238192382923839238492385923869238792388923899239092391923929239392394923959239692397923989239992400924019240292403924049240592406924079240892409924109241192412924139241492415924169241792418924199242092421924229242392424924259242692427924289242992430924319243292433924349243592436924379243892439924409244192442924439244492445924469244792448924499245092451924529245392454924559245692457924589245992460924619246292463924649246592466924679246892469924709247192472924739247492475924769247792478924799248092481924829248392484924859248692487924889248992490924919249292493924949249592496924979249892499925009250192502925039250492505925069250792508925099251092511925129251392514925159251692517925189251992520925219252292523925249252592526925279252892529925309253192532925339253492535925369253792538925399254092541925429254392544925459254692547925489254992550925519255292553925549255592556925579255892559925609256192562925639256492565925669256792568925699257092571925729257392574925759257692577925789257992580925819258292583925849258592586925879258892589925909259192592925939259492595925969259792598925999260092601926029260392604926059260692607926089260992610926119261292613926149261592616926179261892619926209262192622926239262492625926269262792628926299263092631926329263392634926359263692637926389263992640926419264292643926449264592646926479264892649926509265192652926539265492655926569265792658926599266092661926629266392664926659266692667926689266992670926719267292673926749267592676926779267892679926809268192682926839268492685926869268792688926899269092691926929269392694926959269692697926989269992700927019270292703927049270592706927079270892709927109271192712927139271492715927169271792718927199272092721927229272392724927259272692727927289272992730927319273292733927349273592736927379273892739927409274192742927439274492745927469274792748927499275092751927529275392754927559275692757927589275992760927619276292763927649276592766927679276892769927709277192772927739277492775927769277792778927799278092781927829278392784927859278692787927889278992790927919279292793927949279592796927979279892799928009280192802928039280492805928069280792808928099281092811928129281392814928159281692817928189281992820928219282292823928249282592826928279282892829928309283192832928339283492835928369283792838928399284092841928429284392844928459284692847928489284992850928519285292853928549285592856928579285892859928609286192862928639286492865928669286792868928699287092871928729287392874928759287692877928789287992880928819288292883928849288592886928879288892889928909289192892928939289492895928969289792898928999290092901929029290392904929059290692907929089290992910929119291292913929149291592916929179291892919929209292192922929239292492925929269292792928929299293092931929329293392934929359293692937929389293992940929419294292943929449294592946929479294892949929509295192952929539295492955929569295792958929599296092961929629296392964929659296692967929689296992970929719297292973929749297592976929779297892979929809298192982929839298492985929869298792988929899299092991929929299392994929959299692997929989299993000930019300293003930049300593006930079300893009930109301193012930139301493015930169301793018930199302093021930229302393024930259302693027930289302993030930319303293033930349303593036930379303893039930409304193042930439304493045930469304793048930499305093051930529305393054930559305693057930589305993060930619306293063930649306593066930679306893069930709307193072930739307493075930769307793078930799308093081930829308393084930859308693087930889308993090930919309293093930949309593096930979309893099931009310193102931039310493105931069310793108931099311093111931129311393114931159311693117931189311993120931219312293123931249312593126931279312893129931309313193132931339313493135931369313793138931399314093141931429314393144931459314693147931489314993150931519315293153931549315593156931579315893159931609316193162931639316493165931669316793168931699317093171931729317393174931759317693177931789317993180931819318293183931849318593186931879318893189931909319193192931939319493195931969319793198931999320093201932029320393204932059320693207932089320993210932119321293213932149321593216932179321893219932209322193222932239322493225932269322793228932299323093231932329323393234932359323693237932389323993240932419324293243932449324593246932479324893249932509325193252932539325493255932569325793258932599326093261932629326393264932659326693267932689326993270932719327293273932749327593276932779327893279932809328193282932839328493285932869328793288932899329093291932929329393294932959329693297932989329993300933019330293303933049330593306933079330893309933109331193312933139331493315933169331793318933199332093321933229332393324933259332693327933289332993330933319333293333933349333593336933379333893339933409334193342933439334493345933469334793348933499335093351933529335393354933559335693357933589335993360933619336293363933649336593366933679336893369933709337193372933739337493375933769337793378933799338093381933829338393384933859338693387933889338993390933919339293393933949339593396933979339893399934009340193402934039340493405934069340793408934099341093411934129341393414934159341693417934189341993420934219342293423934249342593426934279342893429934309343193432934339343493435934369343793438934399344093441934429344393444934459344693447934489344993450934519345293453934549345593456934579345893459934609346193462934639346493465934669346793468934699347093471934729347393474934759347693477934789347993480934819348293483934849348593486934879348893489934909349193492934939349493495934969349793498934999350093501935029350393504935059350693507935089350993510935119351293513935149351593516935179351893519935209352193522935239352493525935269352793528935299353093531935329353393534935359353693537935389353993540935419354293543935449354593546935479354893549935509355193552935539355493555935569355793558935599356093561935629356393564935659356693567935689356993570935719357293573935749357593576935779357893579935809358193582935839358493585935869358793588935899359093591935929359393594935959359693597935989359993600936019360293603936049360593606936079360893609936109361193612936139361493615936169361793618936199362093621936229362393624936259362693627936289362993630936319363293633936349363593636936379363893639936409364193642936439364493645936469364793648936499365093651936529365393654936559365693657936589365993660936619366293663936649366593666936679366893669936709367193672936739367493675936769367793678936799368093681936829368393684936859368693687936889368993690936919369293693936949369593696936979369893699937009370193702937039370493705937069370793708937099371093711937129371393714937159371693717937189371993720937219372293723937249372593726937279372893729937309373193732937339373493735937369373793738937399374093741937429374393744937459374693747937489374993750937519375293753937549375593756937579375893759937609376193762937639376493765937669376793768937699377093771937729377393774937759377693777937789377993780937819378293783937849378593786937879378893789937909379193792937939379493795937969379793798937999380093801938029380393804938059380693807938089380993810938119381293813938149381593816938179381893819938209382193822938239382493825938269382793828938299383093831938329383393834938359383693837938389383993840938419384293843938449384593846938479384893849938509385193852938539385493855938569385793858938599386093861938629386393864938659386693867938689386993870938719387293873938749387593876938779387893879938809388193882938839388493885938869388793888938899389093891938929389393894938959389693897938989389993900939019390293903939049390593906939079390893909939109391193912939139391493915939169391793918939199392093921939229392393924939259392693927939289392993930939319393293933939349393593936939379393893939939409394193942939439394493945939469394793948939499395093951939529395393954939559395693957939589395993960939619396293963939649396593966939679396893969939709397193972939739397493975939769397793978939799398093981939829398393984939859398693987939889398993990939919399293993939949399593996939979399893999940009400194002940039400494005940069400794008940099401094011940129401394014940159401694017940189401994020940219402294023940249402594026940279402894029940309403194032940339403494035940369403794038940399404094041940429404394044940459404694047940489404994050940519405294053940549405594056940579405894059940609406194062940639406494065940669406794068940699407094071940729407394074940759407694077940789407994080940819408294083940849408594086940879408894089940909409194092940939409494095940969409794098940999410094101941029410394104941059410694107941089410994110941119411294113941149411594116941179411894119941209412194122941239412494125941269412794128941299413094131941329413394134941359413694137941389413994140941419414294143941449414594146941479414894149941509415194152941539415494155941569415794158941599416094161941629416394164941659416694167941689416994170941719417294173941749417594176941779417894179941809418194182941839418494185941869418794188941899419094191941929419394194941959419694197941989419994200942019420294203942049420594206942079420894209942109421194212942139421494215942169421794218942199422094221942229422394224942259422694227942289422994230942319423294233942349423594236942379423894239942409424194242942439424494245942469424794248942499425094251942529425394254942559425694257942589425994260942619426294263942649426594266942679426894269942709427194272942739427494275942769427794278942799428094281942829428394284942859428694287942889428994290942919429294293942949429594296942979429894299943009430194302943039430494305943069430794308943099431094311943129431394314943159431694317943189431994320943219432294323943249432594326943279432894329943309433194332943339433494335943369433794338943399434094341943429434394344943459434694347943489434994350943519435294353943549435594356943579435894359943609436194362943639436494365943669436794368943699437094371943729437394374943759437694377943789437994380943819438294383943849438594386943879438894389943909439194392943939439494395943969439794398943999440094401944029440394404944059440694407944089440994410944119441294413944149441594416944179441894419944209442194422944239442494425944269442794428944299443094431944329443394434944359443694437944389443994440944419444294443944449444594446944479444894449944509445194452944539445494455944569445794458944599446094461944629446394464944659446694467944689446994470944719447294473944749447594476944779447894479944809448194482944839448494485944869448794488944899449094491944929449394494944959449694497944989449994500945019450294503945049450594506945079450894509945109451194512945139451494515945169451794518945199452094521945229452394524945259452694527945289452994530945319453294533945349453594536945379453894539945409454194542945439454494545945469454794548945499455094551945529455394554945559455694557945589455994560945619456294563945649456594566945679456894569945709457194572945739457494575945769457794578945799458094581945829458394584945859458694587945889458994590945919459294593945949459594596945979459894599946009460194602946039460494605946069460794608946099461094611946129461394614946159461694617946189461994620946219462294623946249462594626946279462894629946309463194632946339463494635946369463794638946399464094641946429464394644946459464694647946489464994650946519465294653946549465594656946579465894659946609466194662946639466494665946669466794668946699467094671946729467394674946759467694677946789467994680946819468294683946849468594686946879468894689946909469194692946939469494695946969469794698946999470094701947029470394704947059470694707947089470994710947119471294713947149471594716947179471894719947209472194722947239472494725947269472794728947299473094731947329473394734947359473694737947389473994740947419474294743947449474594746947479474894749947509475194752947539475494755947569475794758947599476094761947629476394764947659476694767947689476994770947719477294773947749477594776947779477894779947809478194782947839478494785947869478794788947899479094791947929479394794947959479694797947989479994800948019480294803948049480594806948079480894809948109481194812948139481494815948169481794818948199482094821948229482394824948259482694827948289482994830948319483294833948349483594836948379483894839948409484194842948439484494845948469484794848948499485094851948529485394854948559485694857948589485994860948619486294863948649486594866948679486894869948709487194872948739487494875948769487794878948799488094881948829488394884948859488694887948889488994890948919489294893948949489594896948979489894899949009490194902949039490494905949069490794908949099491094911949129491394914949159491694917949189491994920949219492294923949249492594926949279492894929949309493194932949339493494935949369493794938949399494094941949429494394944949459494694947949489494994950949519495294953949549495594956949579495894959949609496194962949639496494965949669496794968949699497094971949729497394974949759497694977949789497994980949819498294983949849498594986949879498894989949909499194992949939499494995949969499794998949999500095001950029500395004950059500695007950089500995010950119501295013950149501595016950179501895019950209502195022950239502495025950269502795028950299503095031950329503395034950359503695037950389503995040950419504295043950449504595046950479504895049950509505195052950539505495055950569505795058950599506095061950629506395064950659506695067950689506995070950719507295073950749507595076950779507895079950809508195082950839508495085950869508795088950899509095091950929509395094950959509695097950989509995100951019510295103951049510595106951079510895109951109511195112951139511495115951169511795118951199512095121951229512395124951259512695127951289512995130951319513295133951349513595136951379513895139951409514195142951439514495145951469514795148951499515095151951529515395154951559515695157951589515995160951619516295163951649516595166951679516895169951709517195172951739517495175951769517795178951799518095181951829518395184951859518695187951889518995190951919519295193951949519595196951979519895199952009520195202952039520495205952069520795208952099521095211952129521395214952159521695217952189521995220952219522295223952249522595226952279522895229952309523195232952339523495235952369523795238952399524095241952429524395244952459524695247952489524995250952519525295253952549525595256952579525895259952609526195262952639526495265952669526795268952699527095271952729527395274952759527695277952789527995280952819528295283952849528595286952879528895289952909529195292952939529495295952969529795298952999530095301953029530395304953059530695307953089530995310953119531295313953149531595316953179531895319953209532195322953239532495325953269532795328953299533095331953329533395334953359533695337953389533995340953419534295343953449534595346953479534895349953509535195352953539535495355953569535795358953599536095361953629536395364953659536695367953689536995370953719537295373953749537595376953779537895379953809538195382953839538495385953869538795388953899539095391953929539395394953959539695397953989539995400954019540295403954049540595406954079540895409954109541195412954139541495415954169541795418954199542095421954229542395424954259542695427954289542995430954319543295433954349543595436954379543895439954409544195442954439544495445954469544795448954499545095451954529545395454954559545695457954589545995460954619546295463954649546595466954679546895469954709547195472954739547495475954769547795478954799548095481954829548395484954859548695487954889548995490954919549295493954949549595496954979549895499955009550195502955039550495505955069550795508955099551095511955129551395514955159551695517955189551995520955219552295523955249552595526955279552895529955309553195532955339553495535955369553795538955399554095541955429554395544955459554695547955489554995550955519555295553955549555595556955579555895559955609556195562955639556495565955669556795568955699557095571955729557395574955759557695577955789557995580955819558295583955849558595586955879558895589955909559195592955939559495595955969559795598955999560095601956029560395604956059560695607956089560995610956119561295613956149561595616956179561895619956209562195622956239562495625956269562795628956299563095631956329563395634956359563695637956389563995640956419564295643956449564595646956479564895649956509565195652956539565495655956569565795658956599566095661956629566395664956659566695667956689566995670956719567295673956749567595676956779567895679956809568195682956839568495685956869568795688956899569095691956929569395694956959569695697956989569995700957019570295703957049570595706957079570895709957109571195712957139571495715957169571795718957199572095721957229572395724957259572695727957289572995730957319573295733957349573595736957379573895739957409574195742957439574495745957469574795748957499575095751957529575395754957559575695757957589575995760957619576295763957649576595766957679576895769957709577195772957739577495775957769577795778957799578095781957829578395784957859578695787957889578995790957919579295793957949579595796957979579895799958009580195802958039580495805958069580795808958099581095811958129581395814958159581695817958189581995820958219582295823958249582595826958279582895829958309583195832958339583495835958369583795838958399584095841958429584395844958459584695847958489584995850958519585295853958549585595856958579585895859958609586195862958639586495865958669586795868958699587095871958729587395874958759587695877958789587995880958819588295883958849588595886958879588895889958909589195892958939589495895958969589795898958999590095901959029590395904959059590695907959089590995910959119591295913959149591595916959179591895919959209592195922959239592495925959269592795928959299593095931959329593395934959359593695937959389593995940959419594295943959449594595946959479594895949959509595195952959539595495955959569595795958959599596095961959629596395964959659596695967959689596995970959719597295973959749597595976959779597895979959809598195982959839598495985959869598795988959899599095991959929599395994959959599695997959989599996000960019600296003960049600596006960079600896009960109601196012960139601496015960169601796018960199602096021960229602396024960259602696027960289602996030960319603296033960349603596036960379603896039960409604196042960439604496045960469604796048960499605096051960529605396054960559605696057960589605996060960619606296063960649606596066960679606896069960709607196072960739607496075960769607796078960799608096081960829608396084960859608696087960889608996090960919609296093960949609596096960979609896099961009610196102961039610496105961069610796108961099611096111961129611396114961159611696117961189611996120961219612296123961249612596126961279612896129961309613196132961339613496135961369613796138961399614096141961429614396144961459614696147961489614996150961519615296153961549615596156961579615896159961609616196162961639616496165961669616796168961699617096171961729617396174961759617696177961789617996180961819618296183961849618596186961879618896189961909619196192961939619496195961969619796198961999620096201962029620396204962059620696207962089620996210962119621296213962149621596216962179621896219962209622196222962239622496225962269622796228962299623096231962329623396234962359623696237962389623996240962419624296243962449624596246962479624896249962509625196252962539625496255962569625796258962599626096261962629626396264962659626696267962689626996270962719627296273962749627596276962779627896279962809628196282962839628496285962869628796288962899629096291962929629396294962959629696297962989629996300963019630296303963049630596306963079630896309963109631196312963139631496315963169631796318963199632096321963229632396324963259632696327963289632996330963319633296333963349633596336963379633896339963409634196342963439634496345963469634796348963499635096351963529635396354963559635696357963589635996360963619636296363963649636596366963679636896369963709637196372963739637496375963769637796378963799638096381963829638396384963859638696387963889638996390963919639296393963949639596396963979639896399964009640196402964039640496405964069640796408964099641096411964129641396414964159641696417964189641996420964219642296423964249642596426964279642896429964309643196432964339643496435964369643796438964399644096441964429644396444964459644696447964489644996450964519645296453964549645596456964579645896459964609646196462964639646496465964669646796468964699647096471964729647396474964759647696477964789647996480964819648296483964849648596486964879648896489964909649196492964939649496495964969649796498964999650096501965029650396504965059650696507965089650996510965119651296513965149651596516965179651896519965209652196522965239652496525965269652796528965299653096531965329653396534965359653696537965389653996540965419654296543965449654596546965479654896549965509655196552965539655496555965569655796558965599656096561965629656396564965659656696567965689656996570965719657296573965749657596576965779657896579965809658196582965839658496585965869658796588965899659096591965929659396594965959659696597965989659996600966019660296603966049660596606966079660896609966109661196612966139661496615966169661796618966199662096621966229662396624966259662696627966289662996630966319663296633966349663596636966379663896639966409664196642966439664496645966469664796648966499665096651966529665396654966559665696657966589665996660966619666296663966649666596666966679666896669966709667196672966739667496675966769667796678966799668096681966829668396684966859668696687966889668996690966919669296693966949669596696966979669896699967009670196702967039670496705967069670796708967099671096711967129671396714967159671696717967189671996720967219672296723967249672596726967279672896729967309673196732967339673496735967369673796738967399674096741967429674396744967459674696747967489674996750967519675296753967549675596756967579675896759967609676196762967639676496765967669676796768967699677096771967729677396774967759677696777967789677996780967819678296783967849678596786967879678896789967909679196792967939679496795967969679796798967999680096801968029680396804968059680696807968089680996810968119681296813968149681596816968179681896819968209682196822968239682496825968269682796828968299683096831968329683396834968359683696837968389683996840968419684296843968449684596846968479684896849968509685196852968539685496855968569685796858968599686096861968629686396864968659686696867968689686996870968719687296873968749687596876968779687896879968809688196882968839688496885968869688796888968899689096891968929689396894968959689696897968989689996900969019690296903969049690596906969079690896909969109691196912969139691496915969169691796918969199692096921969229692396924969259692696927969289692996930969319693296933969349693596936969379693896939969409694196942969439694496945969469694796948969499695096951969529695396954969559695696957969589695996960969619696296963969649696596966969679696896969969709697196972969739697496975969769697796978969799698096981969829698396984969859698696987969889698996990969919699296993969949699596996969979699896999970009700197002970039700497005970069700797008970099701097011970129701397014970159701697017970189701997020970219702297023970249702597026970279702897029970309703197032970339703497035970369703797038970399704097041970429704397044970459704697047970489704997050970519705297053970549705597056970579705897059970609706197062970639706497065970669706797068970699707097071970729707397074970759707697077970789707997080970819708297083970849708597086970879708897089970909709197092970939709497095970969709797098970999710097101971029710397104971059710697107971089710997110971119711297113971149711597116971179711897119971209712197122971239712497125971269712797128971299713097131971329713397134971359713697137971389713997140971419714297143971449714597146971479714897149971509715197152971539715497155971569715797158971599716097161971629716397164971659716697167971689716997170971719717297173971749717597176971779717897179971809718197182971839718497185971869718797188971899719097191971929719397194971959719697197971989719997200972019720297203972049720597206972079720897209972109721197212972139721497215972169721797218972199722097221972229722397224972259722697227972289722997230972319723297233972349723597236972379723897239972409724197242972439724497245972469724797248972499725097251972529725397254972559725697257972589725997260972619726297263972649726597266972679726897269972709727197272972739727497275972769727797278972799728097281972829728397284972859728697287972889728997290972919729297293972949729597296972979729897299973009730197302973039730497305973069730797308973099731097311973129731397314973159731697317973189731997320973219732297323973249732597326973279732897329973309733197332973339733497335973369733797338973399734097341973429734397344973459734697347973489734997350973519735297353973549735597356973579735897359973609736197362973639736497365973669736797368973699737097371973729737397374973759737697377973789737997380973819738297383973849738597386973879738897389973909739197392973939739497395973969739797398973999740097401974029740397404974059740697407974089740997410974119741297413974149741597416974179741897419974209742197422974239742497425974269742797428974299743097431974329743397434974359743697437974389743997440974419744297443974449744597446974479744897449974509745197452974539745497455974569745797458974599746097461974629746397464974659746697467974689746997470974719747297473974749747597476974779747897479974809748197482974839748497485974869748797488974899749097491974929749397494974959749697497974989749997500975019750297503975049750597506975079750897509975109751197512975139751497515975169751797518975199752097521975229752397524975259752697527975289752997530975319753297533975349753597536975379753897539975409754197542975439754497545975469754797548975499755097551975529755397554975559755697557975589755997560975619756297563975649756597566975679756897569975709757197572975739757497575975769757797578975799758097581975829758397584975859758697587975889758997590975919759297593975949759597596975979759897599976009760197602976039760497605976069760797608976099761097611976129761397614976159761697617976189761997620976219762297623976249762597626976279762897629976309763197632976339763497635976369763797638976399764097641976429764397644976459764697647976489764997650976519765297653976549765597656976579765897659976609766197662976639766497665976669766797668976699767097671976729767397674976759767697677976789767997680976819768297683976849768597686976879768897689976909769197692976939769497695976969769797698976999770097701977029770397704977059770697707977089770997710977119771297713977149771597716977179771897719977209772197722977239772497725977269772797728977299773097731977329773397734977359773697737977389773997740977419774297743977449774597746977479774897749977509775197752977539775497755977569775797758977599776097761977629776397764977659776697767977689776997770977719777297773977749777597776977779777897779977809778197782977839778497785977869778797788977899779097791977929779397794977959779697797977989779997800978019780297803978049780597806978079780897809978109781197812978139781497815978169781797818978199782097821978229782397824978259782697827978289782997830978319783297833978349783597836978379783897839978409784197842978439784497845978469784797848978499785097851978529785397854978559785697857978589785997860978619786297863978649786597866978679786897869978709787197872978739787497875978769787797878978799788097881978829788397884978859788697887978889788997890978919789297893978949789597896978979789897899979009790197902979039790497905979069790797908979099791097911979129791397914979159791697917979189791997920979219792297923979249792597926979279792897929979309793197932979339793497935979369793797938979399794097941979429794397944979459794697947979489794997950979519795297953979549795597956979579795897959979609796197962979639796497965979669796797968979699797097971979729797397974979759797697977979789797997980979819798297983979849798597986979879798897989979909799197992979939799497995979969799797998979999800098001980029800398004980059800698007980089800998010980119801298013980149801598016980179801898019980209802198022980239802498025980269802798028980299803098031980329803398034980359803698037980389803998040980419804298043980449804598046980479804898049980509805198052980539805498055980569805798058980599806098061980629806398064980659806698067980689806998070980719807298073980749807598076980779807898079980809808198082980839808498085980869808798088980899809098091980929809398094980959809698097980989809998100981019810298103981049810598106981079810898109981109811198112981139811498115981169811798118981199812098121981229812398124981259812698127981289812998130981319813298133981349813598136981379813898139981409814198142981439814498145981469814798148981499815098151981529815398154981559815698157981589815998160981619816298163981649816598166981679816898169981709817198172981739817498175981769817798178981799818098181981829818398184981859818698187981889818998190981919819298193981949819598196981979819898199982009820198202982039820498205982069820798208982099821098211982129821398214982159821698217982189821998220982219822298223982249822598226982279822898229982309823198232982339823498235982369823798238982399824098241982429824398244982459824698247982489824998250982519825298253982549825598256982579825898259982609826198262982639826498265982669826798268982699827098271982729827398274982759827698277982789827998280982819828298283982849828598286982879828898289982909829198292982939829498295982969829798298982999830098301983029830398304983059830698307983089830998310983119831298313983149831598316983179831898319983209832198322983239832498325983269832798328983299833098331983329833398334983359833698337983389833998340983419834298343983449834598346983479834898349983509835198352983539835498355983569835798358983599836098361983629836398364983659836698367983689836998370983719837298373983749837598376983779837898379983809838198382983839838498385983869838798388983899839098391983929839398394983959839698397983989839998400984019840298403984049840598406984079840898409984109841198412984139841498415984169841798418984199842098421984229842398424984259842698427984289842998430984319843298433984349843598436984379843898439984409844198442984439844498445984469844798448984499845098451984529845398454984559845698457984589845998460984619846298463984649846598466984679846898469984709847198472984739847498475984769847798478984799848098481984829848398484984859848698487984889848998490984919849298493984949849598496984979849898499985009850198502985039850498505985069850798508985099851098511985129851398514985159851698517985189851998520985219852298523985249852598526985279852898529985309853198532985339853498535985369853798538985399854098541985429854398544985459854698547985489854998550985519855298553985549855598556985579855898559985609856198562985639856498565985669856798568985699857098571985729857398574985759857698577985789857998580985819858298583985849858598586985879858898589985909859198592985939859498595985969859798598985999860098601986029860398604986059860698607986089860998610986119861298613986149861598616986179861898619986209862198622986239862498625986269862798628986299863098631986329863398634986359863698637986389863998640986419864298643986449864598646986479864898649986509865198652986539865498655986569865798658986599866098661986629866398664986659866698667986689866998670986719867298673986749867598676986779867898679986809868198682986839868498685986869868798688986899869098691986929869398694986959869698697986989869998700987019870298703987049870598706987079870898709987109871198712987139871498715987169871798718987199872098721987229872398724987259872698727987289872998730987319873298733987349873598736987379873898739987409874198742987439874498745987469874798748987499875098751987529875398754987559875698757987589875998760987619876298763987649876598766987679876898769987709877198772987739877498775987769877798778987799878098781987829878398784987859878698787987889878998790987919879298793987949879598796987979879898799988009880198802988039880498805988069880798808988099881098811988129881398814988159881698817988189881998820988219882298823988249882598826988279882898829988309883198832988339883498835988369883798838988399884098841988429884398844988459884698847988489884998850988519885298853988549885598856988579885898859988609886198862988639886498865988669886798868988699887098871988729887398874988759887698877988789887998880988819888298883988849888598886988879888898889988909889198892988939889498895988969889798898988999890098901989029890398904989059890698907989089890998910989119891298913989149891598916989179891898919989209892198922989239892498925989269892798928989299893098931989329893398934989359893698937989389893998940989419894298943989449894598946989479894898949989509895198952989539895498955989569895798958989599896098961989629896398964989659896698967989689896998970989719897298973989749897598976989779897898979989809898198982989839898498985989869898798988989899899098991989929899398994989959899698997989989899999000990019900299003990049900599006990079900899009990109901199012990139901499015990169901799018990199902099021990229902399024990259902699027990289902999030990319903299033990349903599036990379903899039990409904199042990439904499045990469904799048990499905099051990529905399054990559905699057990589905999060990619906299063990649906599066990679906899069990709907199072990739907499075990769907799078990799908099081990829908399084990859908699087990889908999090990919909299093990949909599096990979909899099991009910199102991039910499105991069910799108991099911099111991129911399114991159911699117991189911999120991219912299123991249912599126991279912899129991309913199132991339913499135991369913799138991399914099141991429914399144991459914699147991489914999150991519915299153991549915599156991579915899159991609916199162991639916499165991669916799168991699917099171991729917399174991759917699177991789917999180991819918299183991849918599186991879918899189991909919199192991939919499195991969919799198991999920099201992029920399204992059920699207992089920999210992119921299213992149921599216992179921899219992209922199222992239922499225992269922799228992299923099231992329923399234992359923699237992389923999240992419924299243992449924599246992479924899249992509925199252992539925499255992569925799258992599926099261992629926399264992659926699267992689926999270992719927299273992749927599276992779927899279992809928199282992839928499285992869928799288992899929099291992929929399294992959929699297992989929999300993019930299303993049930599306993079930899309993109931199312993139931499315993169931799318993199932099321993229932399324993259932699327993289932999330993319933299333993349933599336993379933899339993409934199342993439934499345993469934799348993499935099351993529935399354993559935699357993589935999360993619936299363993649936599366993679936899369993709937199372993739937499375993769937799378993799938099381993829938399384993859938699387993889938999390993919939299393993949939599396993979939899399994009940199402994039940499405994069940799408994099941099411994129941399414994159941699417994189941999420994219942299423994249942599426994279942899429994309943199432994339943499435994369943799438994399944099441994429944399444994459944699447994489944999450994519945299453994549945599456994579945899459994609946199462994639946499465994669946799468994699947099471994729947399474994759947699477994789947999480994819948299483994849948599486994879948899489994909949199492994939949499495994969949799498994999950099501995029950399504995059950699507995089950999510995119951299513995149951599516995179951899519995209952199522995239952499525995269952799528995299953099531995329953399534995359953699537995389953999540995419954299543995449954599546995479954899549995509955199552995539955499555995569955799558995599956099561995629956399564995659956699567995689956999570995719957299573995749957599576995779957899579995809958199582995839958499585995869958799588995899959099591995929959399594995959959699597995989959999600996019960299603996049960599606996079960899609996109961199612996139961499615996169961799618996199962099621996229962399624996259962699627996289962999630996319963299633996349963599636996379963899639996409964199642996439964499645996469964799648996499965099651996529965399654996559965699657996589965999660996619966299663996649966599666996679966899669996709967199672996739967499675996769967799678996799968099681996829968399684996859968699687996889968999690996919969299693996949969599696996979969899699997009970199702997039970499705997069970799708997099971099711997129971399714997159971699717997189971999720997219972299723997249972599726997279972899729997309973199732997339973499735997369973799738997399974099741997429974399744997459974699747997489974999750997519975299753997549975599756997579975899759997609976199762997639976499765997669976799768997699977099771997729977399774997759977699777997789977999780997819978299783997849978599786997879978899789997909979199792997939979499795997969979799798997999980099801998029980399804998059980699807998089980999810998119981299813998149981599816998179981899819998209982199822998239982499825998269982799828998299983099831998329983399834998359983699837998389983999840998419984299843998449984599846998479984899849998509985199852998539985499855998569985799858998599986099861998629986399864998659986699867998689986999870998719987299873998749987599876998779987899879998809988199882998839988499885998869988799888998899989099891998929989399894998959989699897998989989999900999019990299903999049990599906999079990899909999109991199912999139991499915999169991799918999199992099921999229992399924999259992699927999289992999930999319993299933999349993599936999379993899939999409994199942999439994499945999469994799948999499995099951999529995399954999559995699957999589995999960999619996299963999649996599966999679996899969999709997199972999739997499975999769997799978999799998099981999829998399984999859998699987999889998999990999919999299993999949999599996999979999899999100000100001100002100003100004100005100006100007100008100009100010100011100012100013100014100015100016100017100018100019100020100021100022100023100024100025100026100027100028100029100030100031100032100033100034100035100036100037100038100039100040100041100042100043100044100045100046100047100048100049100050100051100052100053100054100055100056100057100058100059100060100061100062100063100064100065100066100067100068100069100070100071100072100073100074100075100076100077100078100079100080100081100082100083100084100085100086100087100088100089100090100091100092100093100094100095100096100097100098100099100100100101100102100103100104100105100106100107100108100109100110100111100112100113100114100115100116100117100118100119100120100121100122100123100124100125100126100127100128100129100130100131100132100133100134100135100136100137100138100139100140100141100142100143100144100145100146100147100148100149100150100151100152100153100154100155100156100157100158100159100160100161100162100163100164100165100166100167100168100169100170100171100172100173100174100175100176100177100178100179100180100181100182100183100184100185100186100187100188100189100190100191100192100193100194100195100196100197100198100199100200100201100202100203100204100205100206100207100208100209100210100211100212100213100214100215100216100217100218100219100220100221100222100223100224100225100226100227100228100229100230100231100232100233100234100235100236100237100238100239100240100241100242100243100244100245100246100247100248100249100250100251100252100253100254100255100256100257100258100259100260100261100262100263100264100265100266100267100268100269100270100271100272100273100274100275100276100277100278100279100280100281100282100283100284100285100286100287100288100289100290100291100292100293100294100295100296100297100298100299100300100301100302100303100304100305100306100307100308100309100310100311100312100313100314100315100316100317100318100319100320100321100322100323100324100325100326100327100328100329100330100331100332100333100334100335100336100337100338100339100340100341100342100343100344100345100346100347100348100349100350100351100352100353100354100355100356100357100358100359100360100361100362100363100364100365100366100367100368100369100370100371100372100373100374100375100376100377100378100379100380100381100382100383100384100385100386100387100388100389100390100391100392100393100394100395100396100397100398100399100400100401100402100403100404100405100406100407100408100409100410100411100412100413100414100415100416100417100418100419100420100421100422100423100424100425100426100427100428100429100430100431100432100433100434100435100436100437100438100439100440100441100442100443100444100445100446100447100448100449100450100451100452100453100454100455100456100457100458100459100460100461100462100463100464100465100466100467100468100469100470100471100472100473100474100475100476100477100478100479100480100481100482100483100484100485100486100487100488100489100490100491100492100493100494100495100496100497100498100499100500100501100502100503100504100505100506100507100508100509100510100511100512100513100514100515100516100517100518100519100520100521100522100523100524100525100526100527100528100529100530100531100532100533100534100535100536100537100538100539100540100541100542100543100544100545100546100547100548100549100550100551100552100553100554100555100556100557100558100559100560100561100562100563100564100565100566100567100568100569100570100571100572100573100574100575100576100577100578100579100580100581100582100583100584100585100586100587100588100589100590100591100592100593100594100595100596100597100598100599100600100601100602100603100604100605100606100607100608100609100610100611100612100613100614100615100616100617100618100619100620100621100622100623100624100625100626100627100628100629100630100631100632100633100634100635100636100637100638100639100640100641100642100643100644100645100646100647100648100649100650100651100652100653100654100655
  1. /**
  2. * Name: kankan-sdk.js
  3. * Date: 2026/3/31
  4. * Author: https://www.4dkankan.com
  5. * Copyright © 2026 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. var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
  136. function createCommonjsModule(fn) {
  137. var module = { exports: {} };
  138. return fn(module, module.exports), module.exports;
  139. }
  140. /**
  141. * Copyright (c) 2014-present, Facebook, Inc.
  142. *
  143. * This source code is licensed under the MIT license found in the
  144. * LICENSE file in the root directory of this source tree.
  145. */
  146. var runtime_1 = createCommonjsModule(function (module) {
  147. var runtime = function (exports) {
  148. var Op = Object.prototype;
  149. var hasOwn = Op.hasOwnProperty;
  150. var undefined$1; // More compressible than void 0.
  151. var $Symbol = typeof Symbol === "function" ? Symbol : {};
  152. var iteratorSymbol = $Symbol.iterator || "@@iterator";
  153. var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  154. var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  155. function define(obj, key, value) {
  156. Object.defineProperty(obj, key, {
  157. value: value,
  158. enumerable: true,
  159. configurable: true,
  160. writable: true
  161. });
  162. return obj[key];
  163. }
  164. try {
  165. // IE 8 has a broken Object.defineProperty that only works on DOM objects.
  166. define({}, "");
  167. } catch (err) {
  168. define = function define(obj, key, value) {
  169. return obj[key] = value;
  170. };
  171. }
  172. function wrap(innerFn, outerFn, self, tryLocsList) {
  173. // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
  174. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
  175. var generator = Object.create(protoGenerator.prototype);
  176. var context = new Context(tryLocsList || []); // The ._invoke method unifies the implementations of the .next,
  177. // .throw, and .return methods.
  178. generator._invoke = makeInvokeMethod(innerFn, self, context);
  179. return generator;
  180. }
  181. exports.wrap = wrap; // Try/catch helper to minimize deoptimizations. Returns a completion
  182. // record like context.tryEntries[i].completion. This interface could
  183. // have been (and was previously) designed to take a closure to be
  184. // invoked without arguments, but in all the cases we care about we
  185. // already have an existing method we want to call, so there's no need
  186. // to create a new function object. We can even get away with assuming
  187. // the method takes exactly one argument, since that happens to be true
  188. // in every case, so we don't have to touch the arguments object. The
  189. // only additional allocation required is the completion record, which
  190. // has a stable shape and so hopefully should be cheap to allocate.
  191. function tryCatch(fn, obj, arg) {
  192. try {
  193. return {
  194. type: "normal",
  195. arg: fn.call(obj, arg)
  196. };
  197. } catch (err) {
  198. return {
  199. type: "throw",
  200. arg: err
  201. };
  202. }
  203. }
  204. var GenStateSuspendedStart = "suspendedStart";
  205. var GenStateSuspendedYield = "suspendedYield";
  206. var GenStateExecuting = "executing";
  207. var GenStateCompleted = "completed"; // Returning this object from the innerFn has the same effect as
  208. // breaking out of the dispatch switch statement.
  209. var ContinueSentinel = {}; // Dummy constructor functions that we use as the .constructor and
  210. // .constructor.prototype properties for functions that return Generator
  211. // objects. For full spec compliance, you may wish to configure your
  212. // minifier not to mangle the names of these two functions.
  213. function Generator() {}
  214. function GeneratorFunction() {}
  215. function GeneratorFunctionPrototype() {} // This is a polyfill for %IteratorPrototype% for environments that
  216. // don't natively support it.
  217. var IteratorPrototype = {};
  218. define(IteratorPrototype, iteratorSymbol, function () {
  219. return this;
  220. });
  221. var getProto = Object.getPrototypeOf;
  222. var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  223. if (NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
  224. // This environment has a native %IteratorPrototype%; use it instead
  225. // of the polyfill.
  226. IteratorPrototype = NativeIteratorPrototype;
  227. }
  228. var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
  229. GeneratorFunction.prototype = GeneratorFunctionPrototype;
  230. define(Gp, "constructor", GeneratorFunctionPrototype);
  231. define(GeneratorFunctionPrototype, "constructor", GeneratorFunction);
  232. GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"); // Helper for defining the .next, .throw, and .return methods of the
  233. // Iterator interface in terms of a single ._invoke method.
  234. function defineIteratorMethods(prototype) {
  235. ["next", "throw", "return"].forEach(function (method) {
  236. define(prototype, method, function (arg) {
  237. return this._invoke(method, arg);
  238. });
  239. });
  240. }
  241. exports.isGeneratorFunction = function (genFun) {
  242. var ctor = typeof genFun === "function" && genFun.constructor;
  243. return ctor ? ctor === GeneratorFunction || // For the native GeneratorFunction constructor, the best we can
  244. // do is to check its .name property.
  245. (ctor.displayName || ctor.name) === "GeneratorFunction" : false;
  246. };
  247. exports.mark = function (genFun) {
  248. if (Object.setPrototypeOf) {
  249. Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
  250. } else {
  251. genFun.__proto__ = GeneratorFunctionPrototype;
  252. define(genFun, toStringTagSymbol, "GeneratorFunction");
  253. }
  254. genFun.prototype = Object.create(Gp);
  255. return genFun;
  256. }; // Within the body of any async function, `await x` is transformed to
  257. // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  258. // `hasOwn.call(value, "__await")` to determine if the yielded value is
  259. // meant to be awaited.
  260. exports.awrap = function (arg) {
  261. return {
  262. __await: arg
  263. };
  264. };
  265. function AsyncIterator(generator, PromiseImpl) {
  266. function invoke(method, arg, resolve, reject) {
  267. var record = tryCatch(generator[method], generator, arg);
  268. if (record.type === "throw") {
  269. reject(record.arg);
  270. } else {
  271. var result = record.arg;
  272. var value = result.value;
  273. if (value && typeof value === "object" && hasOwn.call(value, "__await")) {
  274. return PromiseImpl.resolve(value.__await).then(function (value) {
  275. invoke("next", value, resolve, reject);
  276. }, function (err) {
  277. invoke("throw", err, resolve, reject);
  278. });
  279. }
  280. return PromiseImpl.resolve(value).then(function (unwrapped) {
  281. // When a yielded Promise is resolved, its final value becomes
  282. // the .value of the Promise<{value,done}> result for the
  283. // current iteration.
  284. result.value = unwrapped;
  285. resolve(result);
  286. }, function (error) {
  287. // If a rejected Promise was yielded, throw the rejection back
  288. // into the async generator function so it can be handled there.
  289. return invoke("throw", error, resolve, reject);
  290. });
  291. }
  292. }
  293. var previousPromise;
  294. function enqueue(method, arg) {
  295. function callInvokeWithMethodAndArg() {
  296. return new PromiseImpl(function (resolve, reject) {
  297. invoke(method, arg, resolve, reject);
  298. });
  299. }
  300. return previousPromise = // If enqueue has been called before, then we want to wait until
  301. // all previous Promises have been resolved before calling invoke,
  302. // so that results are always delivered in the correct order. If
  303. // enqueue has not been called before, then it is important to
  304. // call invoke immediately, without waiting on a callback to fire,
  305. // so that the async generator function has the opportunity to do
  306. // any necessary setup in a predictable way. This predictability
  307. // is why the Promise constructor synchronously invokes its
  308. // executor callback, and why async functions synchronously
  309. // execute code before the first await. Since we implement simple
  310. // async functions in terms of async generators, it is especially
  311. // important to get this right, even though it requires care.
  312. previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, // Avoid propagating failures to Promises returned by later
  313. // invocations of the iterator.
  314. callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
  315. } // Define the unified helper method that is used to implement .next,
  316. // .throw, and .return (see defineIteratorMethods).
  317. this._invoke = enqueue;
  318. }
  319. defineIteratorMethods(AsyncIterator.prototype);
  320. define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
  321. return this;
  322. });
  323. exports.AsyncIterator = AsyncIterator; // Note that simple async functions are implemented on top of
  324. // AsyncIterator objects; they just return a Promise for the value of
  325. // the final result produced by the iterator.
  326. exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
  327. if (PromiseImpl === void 0) PromiseImpl = Promise;
  328. var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
  329. return exports.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.
  330. : iter.next().then(function (result) {
  331. return result.done ? result.value : iter.next();
  332. });
  333. };
  334. function makeInvokeMethod(innerFn, self, context) {
  335. var state = GenStateSuspendedStart;
  336. return function invoke(method, arg) {
  337. if (state === GenStateExecuting) {
  338. throw new Error("Generator is already running");
  339. }
  340. if (state === GenStateCompleted) {
  341. if (method === "throw") {
  342. throw arg;
  343. } // Be forgiving, per 25.3.3.3.3 of the spec:
  344. // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
  345. return doneResult();
  346. }
  347. context.method = method;
  348. context.arg = arg;
  349. while (true) {
  350. var delegate = context.delegate;
  351. if (delegate) {
  352. var delegateResult = maybeInvokeDelegate(delegate, context);
  353. if (delegateResult) {
  354. if (delegateResult === ContinueSentinel) continue;
  355. return delegateResult;
  356. }
  357. }
  358. if (context.method === "next") {
  359. // Setting context._sent for legacy support of Babel's
  360. // function.sent implementation.
  361. context.sent = context._sent = context.arg;
  362. } else if (context.method === "throw") {
  363. if (state === GenStateSuspendedStart) {
  364. state = GenStateCompleted;
  365. throw context.arg;
  366. }
  367. context.dispatchException(context.arg);
  368. } else if (context.method === "return") {
  369. context.abrupt("return", context.arg);
  370. }
  371. state = GenStateExecuting;
  372. var record = tryCatch(innerFn, self, context);
  373. if (record.type === "normal") {
  374. // If an exception is thrown from innerFn, we leave state ===
  375. // GenStateExecuting and loop back for another invocation.
  376. state = context.done ? GenStateCompleted : GenStateSuspendedYield;
  377. if (record.arg === ContinueSentinel) {
  378. continue;
  379. }
  380. return {
  381. value: record.arg,
  382. done: context.done
  383. };
  384. } else if (record.type === "throw") {
  385. state = GenStateCompleted; // Dispatch the exception by looping back around to the
  386. // context.dispatchException(context.arg) call above.
  387. context.method = "throw";
  388. context.arg = record.arg;
  389. }
  390. }
  391. };
  392. } // Call delegate.iterator[context.method](context.arg) and handle the
  393. // result, either by returning a { value, done } result from the
  394. // delegate iterator, or by modifying context.method and context.arg,
  395. // setting context.delegate to null, and returning the ContinueSentinel.
  396. function maybeInvokeDelegate(delegate, context) {
  397. var method = delegate.iterator[context.method];
  398. if (method === undefined$1) {
  399. // A .throw or .return when the delegate iterator has no .throw
  400. // method always terminates the yield* loop.
  401. context.delegate = null;
  402. if (context.method === "throw") {
  403. // Note: ["return"] must be used for ES3 parsing compatibility.
  404. if (delegate.iterator["return"]) {
  405. // If the delegate iterator has a return method, give it a
  406. // chance to clean up.
  407. context.method = "return";
  408. context.arg = undefined$1;
  409. maybeInvokeDelegate(delegate, context);
  410. if (context.method === "throw") {
  411. // If maybeInvokeDelegate(context) changed context.method from
  412. // "return" to "throw", let that override the TypeError below.
  413. return ContinueSentinel;
  414. }
  415. }
  416. context.method = "throw";
  417. context.arg = new TypeError("The iterator does not provide a 'throw' method");
  418. }
  419. return ContinueSentinel;
  420. }
  421. var record = tryCatch(method, delegate.iterator, context.arg);
  422. if (record.type === "throw") {
  423. context.method = "throw";
  424. context.arg = record.arg;
  425. context.delegate = null;
  426. return ContinueSentinel;
  427. }
  428. var info = record.arg;
  429. if (!info) {
  430. context.method = "throw";
  431. context.arg = new TypeError("iterator result is not an object");
  432. context.delegate = null;
  433. return ContinueSentinel;
  434. }
  435. if (info.done) {
  436. // Assign the result of the finished delegate to the temporary
  437. // variable specified by delegate.resultName (see delegateYield).
  438. context[delegate.resultName] = info.value; // Resume execution at the desired location (see delegateYield).
  439. context.next = delegate.nextLoc; // If context.method was "throw" but the delegate handled the
  440. // exception, let the outer generator proceed normally. If
  441. // context.method was "next", forget context.arg since it has been
  442. // "consumed" by the delegate iterator. If context.method was
  443. // "return", allow the original .return call to continue in the
  444. // outer generator.
  445. if (context.method !== "return") {
  446. context.method = "next";
  447. context.arg = undefined$1;
  448. }
  449. } else {
  450. // Re-yield the result returned by the delegate method.
  451. return info;
  452. } // The delegate iterator is finished, so forget it and continue with
  453. // the outer generator.
  454. context.delegate = null;
  455. return ContinueSentinel;
  456. } // Define Generator.prototype.{next,throw,return} in terms of the
  457. // unified ._invoke helper method.
  458. defineIteratorMethods(Gp);
  459. define(Gp, toStringTagSymbol, "Generator"); // A Generator should always return itself as the iterator object when the
  460. // @@iterator function is called on it. Some browsers' implementations of the
  461. // iterator prototype chain incorrectly implement this, causing the Generator
  462. // object to not be returned from this call. This ensures that doesn't happen.
  463. // See https://github.com/facebook/regenerator/issues/274 for more details.
  464. define(Gp, iteratorSymbol, function () {
  465. return this;
  466. });
  467. define(Gp, "toString", function () {
  468. return "[object Generator]";
  469. });
  470. function pushTryEntry(locs) {
  471. var entry = {
  472. tryLoc: locs[0]
  473. };
  474. if (1 in locs) {
  475. entry.catchLoc = locs[1];
  476. }
  477. if (2 in locs) {
  478. entry.finallyLoc = locs[2];
  479. entry.afterLoc = locs[3];
  480. }
  481. this.tryEntries.push(entry);
  482. }
  483. function resetTryEntry(entry) {
  484. var record = entry.completion || {};
  485. record.type = "normal";
  486. delete record.arg;
  487. entry.completion = record;
  488. }
  489. function Context(tryLocsList) {
  490. // The root entry object (effectively a try statement without a catch
  491. // or a finally block) gives us a place to store values thrown from
  492. // locations where there is no enclosing try statement.
  493. this.tryEntries = [{
  494. tryLoc: "root"
  495. }];
  496. tryLocsList.forEach(pushTryEntry, this);
  497. this.reset(true);
  498. }
  499. exports.keys = function (object) {
  500. var keys = [];
  501. for (var key in object) {
  502. keys.push(key);
  503. }
  504. keys.reverse(); // Rather than returning an object with a next method, we keep
  505. // things simple and return the next function itself.
  506. return function next() {
  507. while (keys.length) {
  508. var key = keys.pop();
  509. if (key in object) {
  510. next.value = key;
  511. next.done = false;
  512. return next;
  513. }
  514. } // To avoid creating an additional object, we just hang the .value
  515. // and .done properties off the next function object itself. This
  516. // also ensures that the minifier will not anonymize the function.
  517. next.done = true;
  518. return next;
  519. };
  520. };
  521. function values(iterable) {
  522. if (iterable) {
  523. var iteratorMethod = iterable[iteratorSymbol];
  524. if (iteratorMethod) {
  525. return iteratorMethod.call(iterable);
  526. }
  527. if (typeof iterable.next === "function") {
  528. return iterable;
  529. }
  530. if (!isNaN(iterable.length)) {
  531. var i = -1,
  532. next = function next() {
  533. while (++i < iterable.length) {
  534. if (hasOwn.call(iterable, i)) {
  535. next.value = iterable[i];
  536. next.done = false;
  537. return next;
  538. }
  539. }
  540. next.value = undefined$1;
  541. next.done = true;
  542. return next;
  543. };
  544. return next.next = next;
  545. }
  546. } // Return an iterator with no values.
  547. return {
  548. next: doneResult
  549. };
  550. }
  551. exports.values = values;
  552. function doneResult() {
  553. return {
  554. value: undefined$1,
  555. done: true
  556. };
  557. }
  558. Context.prototype = {
  559. constructor: Context,
  560. reset: function reset(skipTempReset) {
  561. this.prev = 0;
  562. this.next = 0; // Resetting context._sent for legacy support of Babel's
  563. // function.sent implementation.
  564. this.sent = this._sent = undefined$1;
  565. this.done = false;
  566. this.delegate = null;
  567. this.method = "next";
  568. this.arg = undefined$1;
  569. this.tryEntries.forEach(resetTryEntry);
  570. if (!skipTempReset) {
  571. for (var name in this) {
  572. // Not sure about the optimal order of these conditions:
  573. if (name.charAt(0) === "t" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {
  574. this[name] = undefined$1;
  575. }
  576. }
  577. }
  578. },
  579. stop: function stop() {
  580. this.done = true;
  581. var rootEntry = this.tryEntries[0];
  582. var rootRecord = rootEntry.completion;
  583. if (rootRecord.type === "throw") {
  584. throw rootRecord.arg;
  585. }
  586. return this.rval;
  587. },
  588. dispatchException: function dispatchException(exception) {
  589. if (this.done) {
  590. throw exception;
  591. }
  592. var context = this;
  593. function handle(loc, caught) {
  594. record.type = "throw";
  595. record.arg = exception;
  596. context.next = loc;
  597. if (caught) {
  598. // If the dispatched exception was caught by a catch block,
  599. // then let that catch block handle the exception normally.
  600. context.method = "next";
  601. context.arg = undefined$1;
  602. }
  603. return !!caught;
  604. }
  605. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  606. var entry = this.tryEntries[i];
  607. var record = entry.completion;
  608. if (entry.tryLoc === "root") {
  609. // Exception thrown outside of any try block that could handle
  610. // it, so set the completion value of the entire function to
  611. // throw the exception.
  612. return handle("end");
  613. }
  614. if (entry.tryLoc <= this.prev) {
  615. var hasCatch = hasOwn.call(entry, "catchLoc");
  616. var hasFinally = hasOwn.call(entry, "finallyLoc");
  617. if (hasCatch && hasFinally) {
  618. if (this.prev < entry.catchLoc) {
  619. return handle(entry.catchLoc, true);
  620. } else if (this.prev < entry.finallyLoc) {
  621. return handle(entry.finallyLoc);
  622. }
  623. } else if (hasCatch) {
  624. if (this.prev < entry.catchLoc) {
  625. return handle(entry.catchLoc, true);
  626. }
  627. } else if (hasFinally) {
  628. if (this.prev < entry.finallyLoc) {
  629. return handle(entry.finallyLoc);
  630. }
  631. } else {
  632. throw new Error("try statement without catch or finally");
  633. }
  634. }
  635. }
  636. },
  637. abrupt: function abrupt(type, arg) {
  638. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  639. var entry = this.tryEntries[i];
  640. if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) {
  641. var finallyEntry = entry;
  642. break;
  643. }
  644. }
  645. if (finallyEntry && (type === "break" || type === "continue") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {
  646. // Ignore the finally entry if control is not jumping to a
  647. // location outside the try/catch block.
  648. finallyEntry = null;
  649. }
  650. var record = finallyEntry ? finallyEntry.completion : {};
  651. record.type = type;
  652. record.arg = arg;
  653. if (finallyEntry) {
  654. this.method = "next";
  655. this.next = finallyEntry.finallyLoc;
  656. return ContinueSentinel;
  657. }
  658. return this.complete(record);
  659. },
  660. complete: function complete(record, afterLoc) {
  661. if (record.type === "throw") {
  662. throw record.arg;
  663. }
  664. if (record.type === "break" || record.type === "continue") {
  665. this.next = record.arg;
  666. } else if (record.type === "return") {
  667. this.rval = this.arg = record.arg;
  668. this.method = "return";
  669. this.next = "end";
  670. } else if (record.type === "normal" && afterLoc) {
  671. this.next = afterLoc;
  672. }
  673. return ContinueSentinel;
  674. },
  675. finish: function finish(finallyLoc) {
  676. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  677. var entry = this.tryEntries[i];
  678. if (entry.finallyLoc === finallyLoc) {
  679. this.complete(entry.completion, entry.afterLoc);
  680. resetTryEntry(entry);
  681. return ContinueSentinel;
  682. }
  683. }
  684. },
  685. "catch": function _catch(tryLoc) {
  686. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  687. var entry = this.tryEntries[i];
  688. if (entry.tryLoc === tryLoc) {
  689. var record = entry.completion;
  690. if (record.type === "throw") {
  691. var thrown = record.arg;
  692. resetTryEntry(entry);
  693. }
  694. return thrown;
  695. }
  696. } // The context.catch method must only be called with a location
  697. // argument that corresponds to a known catch block.
  698. throw new Error("illegal catch attempt");
  699. },
  700. delegateYield: function delegateYield(iterable, resultName, nextLoc) {
  701. this.delegate = {
  702. iterator: values(iterable),
  703. resultName: resultName,
  704. nextLoc: nextLoc
  705. };
  706. if (this.method === "next") {
  707. // Deliberately forget the last sent value so that we don't
  708. // accidentally pass it on to the delegate.
  709. this.arg = undefined$1;
  710. }
  711. return ContinueSentinel;
  712. }
  713. }; // Regardless of whether this script is executing as a CommonJS module
  714. // or not, return the runtime object so that we can declare the variable
  715. // regeneratorRuntime in the outer scope, which allows this module to be
  716. // injected easily by `bin/regenerator --include-runtime script.js`.
  717. return exports;
  718. }( // If this script is executing as a CommonJS module, use module.exports
  719. // as the regeneratorRuntime namespace. Otherwise create a new empty
  720. // object. Either way, the resulting object will be used to initialize
  721. // the regeneratorRuntime variable at the top of this file.
  722. module.exports );
  723. try {
  724. regeneratorRuntime = runtime;
  725. } catch (accidentalStrictMode) {
  726. // This module should not be running in strict mode, so the above
  727. // assignment should always work unless something is misconfigured. Just
  728. // in case runtime.js accidentally runs in strict mode, in modern engines
  729. // we can explicitly access globalThis. In older engines we can escape
  730. // strict mode using a global Function call. This could conceivably fail
  731. // if a Content Security Policy forbids using Function, but in that case
  732. // the proper solution is to fix the accidental strict mode problem. If
  733. // you've misconfigured your bundler to force strict mode and applied a
  734. // CSP to forbid Function, and you're not willing to fix either of those
  735. // problems, please detail your unique predicament in a GitHub issue.
  736. if (typeof globalThis === "object") {
  737. globalThis.regeneratorRuntime = runtime;
  738. } else {
  739. Function("r", "regeneratorRuntime = r")(runtime);
  740. }
  741. }
  742. });
  743. var regenerator = runtime_1;
  744. function _arrayLikeToArray$e(arr, len) {
  745. if (len == null || len > arr.length) len = arr.length;
  746. for (var i = 0, arr2 = new Array(len); i < len; i++) {
  747. arr2[i] = arr[i];
  748. }
  749. return arr2;
  750. }
  751. function _arrayWithoutHoles(arr) {
  752. if (Array.isArray(arr)) return _arrayLikeToArray$e(arr);
  753. }
  754. function _iterableToArray(iter) {
  755. if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
  756. }
  757. function _unsupportedIterableToArray$e(o, minLen) {
  758. if (!o) return;
  759. if (typeof o === "string") return _arrayLikeToArray$e(o, minLen);
  760. var n = Object.prototype.toString.call(o).slice(8, -1);
  761. if (n === "Object" && o.constructor) n = o.constructor.name;
  762. if (n === "Map" || n === "Set") return Array.from(o);
  763. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$e(o, minLen);
  764. }
  765. function _nonIterableSpread() {
  766. throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  767. }
  768. function _toConsumableArray(arr) {
  769. return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray$e(arr) || _nonIterableSpread();
  770. }
  771. function _isNativeReflectConstruct$1R() {
  772. if (typeof Reflect === "undefined" || !Reflect.construct) return false;
  773. if (Reflect.construct.sham) return false;
  774. if (typeof Proxy === "function") return true;
  775. try {
  776. Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
  777. return true;
  778. } catch (e) {
  779. return false;
  780. }
  781. }
  782. function _construct(Parent, args, Class) {
  783. if (_isNativeReflectConstruct$1R()) {
  784. _construct = Reflect.construct;
  785. } else {
  786. _construct = function _construct(Parent, args, Class) {
  787. var a = [null];
  788. a.push.apply(a, args);
  789. var Constructor = Function.bind.apply(Parent, a);
  790. var instance = new Constructor();
  791. if (Class) _setPrototypeOf(instance, Class.prototype);
  792. return instance;
  793. };
  794. }
  795. return _construct.apply(null, arguments);
  796. }
  797. var e = [],
  798. t$1 = [];
  799. function n$4(n, r) {
  800. if (n && "undefined" != typeof document) {
  801. var a,
  802. s = !0 === r.prepend ? "prepend" : "append",
  803. d = !0 === r.singleTag,
  804. i = "string" == typeof r.container ? document.querySelector(r.container) : document.getElementsByTagName("head")[0];
  805. if (d) {
  806. var u = e.indexOf(i);
  807. -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();
  808. } else a = c();
  809. 65279 === n.charCodeAt(0) && (n = n.substring(1)), a.styleSheet ? a.styleSheet.cssText += n : a.appendChild(document.createTextNode(n));
  810. }
  811. function c() {
  812. var e = document.createElement("style");
  813. if (e.setAttribute("type", "text/css"), r.attributes) for (var t = Object.keys(r.attributes), n = 0; n < t.length; n++) {
  814. e.setAttribute(t[n], r.attributes[t[n]]);
  815. }
  816. var a = "prepend" === s ? "afterbegin" : "beforeend";
  817. return i.insertAdjacentElement(a, e), e;
  818. }
  819. }
  820. var css$3 = ":root {\r\n --main-color: #00c8af;\r\n --font-color: #999;\r\n}\r\n\r\n[x-cloak] {\r\n display: none !important;\r\n}\r\n\r\n*,\r\n::before,\r\n::after {\r\n -webkit-appearance: none;\r\n -moz-appearance: none;\r\n appearance: none;\r\n -webkit-tap-highlight-color: rgba(255, 255, 255, 0);\r\n text-rendering: optimizeLegibility !important;\r\n -webkit-font-smoothing: antialiased !important;\r\n}\r\n\r\n.kankan-app {\r\n position: relative;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n background-color: #292929;\r\n}\r\n\r\n.kankan-app .player {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n z-index: 1;\r\n overflow: hidden;\r\n outline: none;\r\n border: none;\r\n}\r\n\r\n.kankan-app .player[name='copy'] {\r\n display: none;\r\n}\r\n\r\n.kankan-app .player-mark {\r\n display: none;\r\n cursor: grab;\r\n position: absolute;\r\n left: calc(50% - 56px);\r\n top: calc(50% - 56px);\r\n z-index: 999;\r\n width: 102px;\r\n height: 102px;\r\n}\r\n\r\n.kankan-app__split .player {\r\n cursor: crosshair;\r\n}\r\n\r\n.kankan-app__split .player[name='main'] {\r\n width: calc(50% - 1px);\r\n}\r\n\r\n.kankan-app__split .player[name='copy'] {\r\n width: calc(50% - 1px);\r\n display: block;\r\n left: auto;\r\n right: 0;\r\n}\r\n\r\n.kankan-app__split .player-mark {\r\n display: block;\r\n}\r\n\r\n.kankan-app__split [xui_tags] div {\r\n display: none !important;\r\n}\r\n\r\n.ui-view-layout[is-mobile='true'] .kankan-app__split .player[name='main'] {\r\n width: 100%;\r\n height: calc(50% - 1px);\r\n}\r\n\r\n.ui-view-layout[is-mobile='true'] .kankan-app__split .player[name='copy'] {\r\n width: 100%;\r\n height: calc(50% - 1px);\r\n display: block;\r\n top: 50%;\r\n left: auto;\r\n right: 0;\r\n}\r\n\r\n.kankan-app__slide-right {\r\n will-change: transform;\r\n transition: all 0.2s ease-in-out;\r\n}\r\n\r\n.kankan-app__slide-right-enter {\r\n opacity: 1;\r\n transform: translate3d(0, 0, 0);\r\n}\r\n\r\n.kankan-app__slide-right-leave {\r\n opacity: 0;\r\n transform: translate3d(100%, 0, 0);\r\n}\r\n\r\n/* plugins */\r\n.kankan-plugins input {\r\n padding: 0 5px;\r\n width: 100%;\r\n height: 34px;\r\n background: rgba(255, 255, 255, 0.1);\r\n border-radius: 4px;\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n outline: none;\r\n color: #fff;\r\n}\r\n\r\n.kankan-plugins input:focus {\r\n border: 1px solid var(--main-color);\r\n}\r\n\r\n.kankan-plugins button {\r\n cursor: pointer;\r\n width: 100%;\r\n height: 34px;\r\n outline: none;\r\n border-radius: 4px;\r\n font-size: 14px;\r\n background: none !important;\r\n transition: all 0.3s ease;\r\n color: var(--main-color);\r\n border: 1px solid var(--main-color);\r\n}\r\n\r\n/* xui */\r\n.kankan-app_combox {\r\n cursor: pointer;\r\n position: relative;\r\n background: #323233;\r\n border-radius: 4px;\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n outline: none;\r\n color: #fff;\r\n height: 34px;\r\n width: 100%;\r\n}\r\n\r\n.kankan-app_combox .inner-icon {\r\n cursor: pointer;\r\n font-size: 12px;\r\n position: absolute;\r\n right: 5px;\r\n top: 50%;\r\n transform: translateY(-50%);\r\n color: var(--font-color);\r\n}\r\n\r\n.kankan-app_combox .inner-text {\r\n display: flex;\r\n align-items: center;\r\n padding: 0 5px;\r\n height: 100%;\r\n}\r\n\r\n.kankan-app_combox .inner-list {\r\n position: absolute;\r\n left: 0px;\r\n right: 0px;\r\n top: 100%;\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n background: #323233;\r\n z-index: 1000;\r\n}\r\n\r\n.kankan-app_combox .inner-list>div {\r\n height: 34px;\r\n display: flex;\r\n align-items: center;\r\n padding: 0 5px;\r\n}\r\n\r\n.kankan-app_combox .inner-list>div:hover {\r\n color: var(--main-color);\r\n}";
  821. n$4(css$3,{});
  822. /*
  823. * @Author: Rindy
  824. * @Date: 2021-04-25 16:49:05
  825. * @LastEditors: Rindy
  826. * @LastEditTime: 2021-09-15 11:31:00
  827. * @Description: 注释
  828. */
  829. /**
  830. * 配置对象
  831. */
  832. var lang_zh = {
  833. 'common.about': '约',
  834. 'common.meter': '米',
  835. 'cad.input': '请输入名称',
  836. 'model.enter': '入户门'
  837. };
  838. var config$6 = {
  839. num: null,
  840. dom: null,
  841. /**
  842. * 运行环境
  843. */
  844. env: "development",
  845. /**
  846. * SDK版本号
  847. */
  848. version: "4.12.1-alpha.18",
  849. /**
  850. * 源码版本号
  851. */
  852. edition: null,
  853. lang: 'zh',
  854. langs: {},
  855. /**
  856. * SDK展示模式
  857. */
  858. view: true,
  859. /**
  860. * 移动端模式
  861. */
  862. mobile: false,
  863. /**
  864. * 请求参数
  865. */
  866. params: '',
  867. /**
  868. * 部署方式,本地版为local
  869. */
  870. deploy: '',
  871. /**
  872. * 区域
  873. */
  874. region: '',
  875. /**
  876. * 服务器地址
  877. */
  878. server: '',
  879. //'https://www.4dkankan.com/',
  880. /**
  881. * 场景资源地址
  882. */
  883. resource: 'https://4dkk.4dage.com/',
  884. resourceLaser: '',
  885. /**
  886. * 显示SDK信息
  887. */
  888. showSDKInfo: true,
  889. /**
  890. * 是否使用场景控制快捷键
  891. */
  892. useShortcutKeys: false,
  893. /**
  894. * statistics
  895. */
  896. useStatistics: true,
  897. /**
  898. * 是否需要用户鉴权
  899. */
  900. useAuth: false,
  901. /**
  902. * 抗锯齿
  903. */
  904. antialias: true,
  905. /**
  906. * 全景关联设置
  907. */
  908. link: {
  909. onAction: null,
  910. target: 'self'
  911. },
  912. /**
  913. * 模型设置
  914. */
  915. model: {
  916. /**
  917. * 模型名称
  918. */
  919. name: '' // 铁塔
  920. //name: 'tieta.dam',
  921. },
  922. /**
  923. * 场景设置
  924. */
  925. scene: {
  926. /**
  927. * 图片质量
  928. */
  929. quality: null,
  930. /**
  931. * 自定义marker图片地址
  932. */
  933. markerURL: null,
  934. /**
  935. * 自定义marker透明的
  936. */
  937. markerOpacity: null,
  938. /**
  939. * 自定义当前点位颜色
  940. */
  941. pathEndColor: null,
  942. /**
  943. * 自定义地面logoId
  944. */
  945. floorlogoId: null // 铁塔
  946. //floorlogoId: 2,
  947. },
  948. camera: {
  949. lookLimitUp: null,
  950. lookLimitDown: null // // 铁塔
  951. // lookLimitUp: 89.9,
  952. // lookLimitDown: -89.9,
  953. },
  954. vr: {
  955. markerHeight: null
  956. },
  957. tag: {
  958. showIn: null
  959. },
  960. /**
  961. * 获取服务器资源
  962. */
  963. getServerURL(path) {
  964. return this.server + path;
  965. },
  966. /**
  967. * 获取场景资源地址
  968. * @param {String} path 资源路径
  969. */
  970. getResourceURL(path) {
  971. return this.resource + path;
  972. },
  973. /**
  974. * 获取场景图片地址
  975. * @param {*} path 图片路径
  976. */
  977. getResourceImageURL(path) {
  978. return this.getResourceURL("scene_view_data/".concat(this.num, "/images/").concat(path));
  979. },
  980. /**
  981. * 获取场景数据地址
  982. * @param {*} path 数据路径
  983. */
  984. getResourceDataURL(path) {
  985. return this.getResourceURL("scene_view_data/".concat(this.num, "/data/").concat(path));
  986. },
  987. i18n(key) {
  988. if (this.langs[this.lang] && this.langs[this.lang][key]) {
  989. return this.langs[this.lang][key];
  990. }
  991. if (!this.langs['zh']) {
  992. this.langs['zh'] = lang_zh;
  993. }
  994. return this.langs['zh'][key] || '';
  995. },
  996. /**
  997. * 是否加载热点
  998. */
  999. isLoadTags: true
  1000. };
  1001. if (config$6.showSDKInfo) {
  1002. if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
  1003. var log$1 = ['\n %c %c 4DKanKan SDK ' + config$6.version + ' - https://www.4dkankan.com/ \n', 'background: #1fe4dc; padding:5px 0;', 'color: #000; background: #1fe4dc; padding:5px 0;'];
  1004. console.log.apply(console, log$1);
  1005. } else console && console.log('4DKanKan SDK ' + config$6.version + ' - https://www.4dkankan.com/');
  1006. }
  1007. /*
  1008. * @Author: Rindy
  1009. * @Date: 2021-09-14 20:02:23
  1010. * @LastEditors: Rindy
  1011. * @LastEditTime: 2021-09-14 20:03:48
  1012. * @Description:
  1013. */
  1014. /**
  1015. * Merges two arrays and returns the new one.
  1016. * @param a
  1017. * @param b
  1018. * @param fn
  1019. */
  1020. function mergeArrays(a, b, fn) {
  1021. var result = [];
  1022. for (var i = 0; i < a.length; i += 1) {
  1023. if (typeof a !== 'undefined') {
  1024. if (a[i] !== null && typeof a[i] === 'object') {
  1025. result[i] = fn({}, a[i]);
  1026. } else {
  1027. result[i] = a[i];
  1028. }
  1029. }
  1030. }
  1031. for (var _i = 0; _i < b.length; _i += 1) {
  1032. if (typeof b[_i] !== 'undefined') {
  1033. if (b[_i] !== null && typeof b[_i] === 'object') {
  1034. result[_i] = fn(a[_i], b[_i]);
  1035. } else {
  1036. result[_i] = b[_i];
  1037. }
  1038. }
  1039. }
  1040. return result;
  1041. }
  1042. /**
  1043. * Merge deep objects
  1044. * @param args
  1045. */
  1046. function deepExtend() {
  1047. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  1048. args[_key] = arguments[_key];
  1049. }
  1050. var a = args.shift();
  1051. for (var i = 0; i < args.length; i += 1) {
  1052. var b = args[i];
  1053. if (a !== null && b !== null && typeof a !== 'undefined' && typeof b !== 'undefined') {
  1054. // Merge objects
  1055. if (typeof a === 'object' && typeof b === 'object') {
  1056. // Merge arrays
  1057. if (a instanceof Array && b instanceof Array) {
  1058. a = mergeArrays(a, b, deepExtend);
  1059. } else {
  1060. var keys = Object.keys(b);
  1061. for (var j = 0; j < keys.length; j += 1) {
  1062. var key = keys[j]; // Avoid prototype pollution.
  1063. if (key !== '__proto__') {
  1064. if (typeof b[key] === 'object' && b[key] !== null) {
  1065. a[key] = deepExtend(a[key], b[key]);
  1066. } else if (typeof b[key] !== 'undefined') {
  1067. a[key] = b[key];
  1068. }
  1069. }
  1070. }
  1071. }
  1072. }
  1073. } else if (b !== null && typeof b !== 'undefined') {
  1074. if (b instanceof Array) {
  1075. a = mergeArrays([], b, deepExtend);
  1076. } else {
  1077. a = b;
  1078. }
  1079. }
  1080. }
  1081. return a;
  1082. }
  1083. function _classPrivateFieldBase(receiver, privateKey) {
  1084. if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) {
  1085. throw new TypeError("attempted to use private field on non-instance");
  1086. }
  1087. return receiver;
  1088. }
  1089. var id = 0;
  1090. function _classPrivateFieldKey(name) {
  1091. return "__private_" + id++ + "_" + name;
  1092. }
  1093. function isArray$4(arr) {
  1094. return Object.prototype.toString.call(arr) === '[object Array]';
  1095. }
  1096. function foreach(arr, handler) {
  1097. if (isArray$4(arr)) {
  1098. for (var i = 0; i < arr.length; i++) {
  1099. handler(arr[i]);
  1100. }
  1101. } else handler(arr);
  1102. }
  1103. function D(fn) {
  1104. var status = 'pending',
  1105. doneFuncs = [],
  1106. failFuncs = [],
  1107. progressFuncs = [],
  1108. resultArgs = null,
  1109. _promise = {
  1110. done: function done() {
  1111. for (var i = 0; i < arguments.length; i++) {
  1112. // skip any undefined or null arguments
  1113. if (!arguments[i]) {
  1114. continue;
  1115. }
  1116. if (isArray$4(arguments[i])) {
  1117. var arr = arguments[i];
  1118. for (var j = 0; j < arr.length; j++) {
  1119. // immediately call the function if the deferred has been resolved
  1120. if (status === 'resolved') {
  1121. arr[j].apply(this, resultArgs);
  1122. }
  1123. doneFuncs.push(arr[j]);
  1124. }
  1125. } else {
  1126. // immediately call the function if the deferred has been resolved
  1127. if (status === 'resolved') {
  1128. arguments[i].apply(this, resultArgs);
  1129. }
  1130. doneFuncs.push(arguments[i]);
  1131. }
  1132. }
  1133. return this;
  1134. },
  1135. fail: function fail() {
  1136. for (var i = 0; i < arguments.length; i++) {
  1137. // skip any undefined or null arguments
  1138. if (!arguments[i]) {
  1139. continue;
  1140. }
  1141. if (isArray$4(arguments[i])) {
  1142. var arr = arguments[i];
  1143. for (var j = 0; j < arr.length; j++) {
  1144. // immediately call the function if the deferred has been resolved
  1145. if (status === 'rejected') {
  1146. arr[j].apply(this, resultArgs);
  1147. }
  1148. failFuncs.push(arr[j]);
  1149. }
  1150. } else {
  1151. // immediately call the function if the deferred has been resolved
  1152. if (status === 'rejected') {
  1153. arguments[i].apply(this, resultArgs);
  1154. }
  1155. failFuncs.push(arguments[i]);
  1156. }
  1157. }
  1158. return this;
  1159. },
  1160. always: function always() {
  1161. return this.done.apply(this, arguments).fail.apply(this, arguments);
  1162. },
  1163. progress: function progress() {
  1164. for (var i = 0; i < arguments.length; i++) {
  1165. // skip any undefined or null arguments
  1166. if (!arguments[i]) {
  1167. continue;
  1168. }
  1169. if (isArray$4(arguments[i])) {
  1170. var arr = arguments[i];
  1171. for (var j = 0; j < arr.length; j++) {
  1172. // immediately call the function if the deferred has been resolved
  1173. if (status === 'pending') {
  1174. progressFuncs.push(arr[j]);
  1175. }
  1176. }
  1177. } else {
  1178. // immediately call the function if the deferred has been resolved
  1179. if (status === 'pending') {
  1180. progressFuncs.push(arguments[i]);
  1181. }
  1182. }
  1183. }
  1184. return this;
  1185. },
  1186. then: function then(done, fail, progress) {
  1187. /*
  1188. // fail callbacks
  1189. if (arguments.length > 1 && arguments[1]) {
  1190. this.fail(arguments[1])
  1191. }
  1192. // done callbacks
  1193. if (arguments.length > 0 && arguments[0]) {
  1194. this.done(arguments[0])
  1195. }
  1196. // notify callbacks
  1197. if (arguments.length > 2 && arguments[2]) {
  1198. this.progress(arguments[2])
  1199. }
  1200. return this
  1201. */
  1202. return D(function (def) {
  1203. foreach(done, function (func) {
  1204. // filter function
  1205. if (typeof func === 'function') {
  1206. deferred.done(function () {
  1207. var returnval = func.apply(this, arguments); // if a new deferred/promise is returned, its state is passed to the current deferred/promise
  1208. if (returnval && typeof returnval === 'function') {
  1209. returnval.promise().then(def.resolve, def.reject, def.notify);
  1210. } else {
  1211. // if new return val is passed, it is passed to the piped done
  1212. def.resolve(returnval);
  1213. }
  1214. });
  1215. } else {
  1216. deferred.done(def.resolve);
  1217. }
  1218. });
  1219. foreach(fail, function (func) {
  1220. if (typeof func === 'function') {
  1221. deferred.fail(function () {
  1222. var returnval = func.apply(this, arguments);
  1223. if (returnval && typeof returnval === 'function') {
  1224. returnval.promise().then(def.resolve, def.reject, def.notify);
  1225. } else {
  1226. def.reject(returnval);
  1227. }
  1228. });
  1229. } else {
  1230. deferred.fail(def.reject);
  1231. }
  1232. });
  1233. }).promise();
  1234. },
  1235. catch: function _catch() {
  1236. for (var i = 0; i < arguments.length; i++) {
  1237. // skip any undefined or null arguments
  1238. if (!arguments[i]) {
  1239. continue;
  1240. }
  1241. if (isArray$4(arguments[i])) {
  1242. var arr = arguments[i];
  1243. for (var j = 0; j < arr.length; j++) {
  1244. // immediately call the function if the deferred has been resolved
  1245. if (status === 'rejected') {
  1246. arr[j].apply(this, resultArgs);
  1247. }
  1248. failFuncs.push(arr[j]);
  1249. }
  1250. } else {
  1251. // immediately call the function if the deferred has been resolved
  1252. if (status === 'rejected') {
  1253. arguments[i].apply(this, resultArgs);
  1254. }
  1255. failFuncs.push(arguments[i]);
  1256. }
  1257. }
  1258. return this;
  1259. },
  1260. promise: function promise(obj) {
  1261. if (obj == null) {
  1262. return _promise;
  1263. } else {
  1264. for (var i in _promise) {
  1265. obj[i] = _promise[i];
  1266. }
  1267. return obj;
  1268. }
  1269. },
  1270. state: function state() {
  1271. return status;
  1272. },
  1273. debug: function debug() {
  1274. console.log('[debug]', doneFuncs, failFuncs, status);
  1275. },
  1276. isRejected: function isRejected() {
  1277. return status === 'rejected';
  1278. },
  1279. isResolved: function isResolved() {
  1280. return status === 'resolved';
  1281. },
  1282. pipe: function pipe(done, fail, progress) {
  1283. return D(function (def) {
  1284. foreach(done, function (func) {
  1285. // filter function
  1286. if (typeof func === 'function') {
  1287. deferred.done(function () {
  1288. var returnval = func.apply(this, arguments); // if a new deferred/promise is returned, its state is passed to the current deferred/promise
  1289. if (returnval && typeof returnval === 'function') {
  1290. returnval.promise().then(def.resolve, def.reject, def.notify);
  1291. } else {
  1292. // if new return val is passed, it is passed to the piped done
  1293. def.resolve(returnval);
  1294. }
  1295. });
  1296. } else {
  1297. deferred.done(def.resolve);
  1298. }
  1299. });
  1300. foreach(fail, function (func) {
  1301. if (typeof func === 'function') {
  1302. deferred.fail(function () {
  1303. var returnval = func.apply(this, arguments);
  1304. if (returnval && typeof returnval === 'function') {
  1305. returnval.promise().then(def.resolve, def.reject, def.notify);
  1306. } else {
  1307. def.reject(returnval);
  1308. }
  1309. });
  1310. } else {
  1311. deferred.fail(def.reject);
  1312. }
  1313. });
  1314. }).promise();
  1315. }
  1316. },
  1317. deferred = {
  1318. resolveWith: function resolveWith(context) {
  1319. if (status === 'pending') {
  1320. status = 'resolved';
  1321. var args = resultArgs = arguments.length > 1 ? arguments[1] : [];
  1322. for (var i = 0; i < doneFuncs.length; i++) {
  1323. doneFuncs[i].apply(context, args);
  1324. }
  1325. }
  1326. return this;
  1327. },
  1328. rejectWith: function rejectWith(context) {
  1329. if (status === 'pending') {
  1330. status = 'rejected';
  1331. var args = resultArgs = arguments.length > 1 ? arguments[1] : [];
  1332. for (var i = 0; i < failFuncs.length; i++) {
  1333. failFuncs[i].apply(context, args);
  1334. }
  1335. }
  1336. return this;
  1337. },
  1338. notifyWith: function notifyWith(context) {
  1339. if (status === 'pending') {
  1340. var args = resultArgs = arguments.length > 1 ? arguments[1] : [];
  1341. for (var i = 0; i < progressFuncs.length; i++) {
  1342. progressFuncs[i].apply(context, args);
  1343. }
  1344. }
  1345. return this;
  1346. },
  1347. resolve: function resolve() {
  1348. return this.resolveWith(this, arguments);
  1349. },
  1350. reject: function reject() {
  1351. return this.rejectWith(this, arguments);
  1352. },
  1353. notify: function notify() {
  1354. return this.notifyWith(this, arguments);
  1355. }
  1356. };
  1357. var obj = _promise.promise(deferred);
  1358. if (fn) {
  1359. fn.apply(obj, [obj]);
  1360. }
  1361. return obj;
  1362. }
  1363. D.when = function () {
  1364. if (arguments.length < 2) {
  1365. var obj = arguments.length ? arguments[0] : undefined;
  1366. if (obj && typeof obj.isResolved === 'function' && typeof obj.isRejected === 'function') {
  1367. return obj.promise();
  1368. } else {
  1369. return D().resolve(obj).promise();
  1370. }
  1371. } else {
  1372. return function (args) {
  1373. var df = D(),
  1374. size = args.length,
  1375. done = 0,
  1376. 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
  1377. for (var i = 0; i < args.length; i++) {
  1378. (function (j) {
  1379. var obj = null;
  1380. if (args[j].done) {
  1381. args[j].done(function () {
  1382. rp[j] = arguments.length < 2 ? arguments[0] : arguments;
  1383. if (++done == size) {
  1384. df.resolve.apply(df, rp);
  1385. }
  1386. }).fail(function () {
  1387. df.reject(arguments);
  1388. });
  1389. } else {
  1390. obj = args[j];
  1391. args[j] = new Deferred();
  1392. args[j].done(function () {
  1393. rp[j] = arguments.length < 2 ? arguments[0] : arguments;
  1394. if (++done == size) {
  1395. df.resolve.apply(df, rp);
  1396. }
  1397. }).fail(function () {
  1398. df.reject(arguments);
  1399. }).resolve(obj);
  1400. }
  1401. })(i);
  1402. }
  1403. return df.promise();
  1404. }(arguments);
  1405. }
  1406. };
  1407. var Defer = D;
  1408. function Deferred$1 () {
  1409. return new D();
  1410. }
  1411. var _deferrals = /*#__PURE__*/_classPrivateFieldKey("deferrals");
  1412. var Plugins = /*#__PURE__*/function () {
  1413. function Plugins(app) {
  1414. _classCallCheck(this, Plugins);
  1415. Object.defineProperty(this, _deferrals, {
  1416. writable: true,
  1417. value: {}
  1418. });
  1419. this.app = app;
  1420. }
  1421. _createClass(Plugins, [{
  1422. key: "add",
  1423. value: function () {
  1424. var _add = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(Plugin, config) {
  1425. var _this = this;
  1426. var plugin;
  1427. return regenerator.wrap(function _callee$(_context) {
  1428. while (1) {
  1429. switch (_context.prev = _context.next) {
  1430. case 0:
  1431. plugin = Plugin(this.app, config);
  1432. return _context.abrupt("return", new Promise(function (resolve, reject) {
  1433. if (plugin.then) {
  1434. plugin.then(function (instance) {
  1435. if (!instance.$name) {
  1436. return reject('require a plugin name');
  1437. }
  1438. if (_this[instance.$name]) {
  1439. return resolve(_this[instance.$name]);
  1440. }
  1441. if (instance.$html) {
  1442. if (instance.$scope) {
  1443. instance.$scope.insertAdjacentHTML('beforeend', instance.$html);
  1444. } else {
  1445. _this.app.$plugins.insertAdjacentHTML('beforeend', instance.$html);
  1446. }
  1447. delete instance.$html;
  1448. }
  1449. _this[instance.$name] = instance;
  1450. if (instance.$load) {
  1451. instance.$load();
  1452. delete instance.$load;
  1453. }
  1454. if (_classPrivateFieldBase(_this, _deferrals)[_deferrals][instance.$name]) {
  1455. _classPrivateFieldBase(_this, _deferrals)[_deferrals][instance.$name].resolve(instance);
  1456. }
  1457. resolve(instance);
  1458. });
  1459. }
  1460. }));
  1461. case 2:
  1462. case "end":
  1463. return _context.stop();
  1464. }
  1465. }
  1466. }, _callee, this);
  1467. }));
  1468. function add(_x, _x2) {
  1469. return _add.apply(this, arguments);
  1470. }
  1471. return add;
  1472. }()
  1473. }, {
  1474. key: "get",
  1475. value: function get(name) {
  1476. if (_classPrivateFieldBase(this, _deferrals)[_deferrals][name] == void 0) {
  1477. _classPrivateFieldBase(this, _deferrals)[_deferrals][name] = Deferred$1();
  1478. }
  1479. return _classPrivateFieldBase(this, _deferrals)[_deferrals][name];
  1480. }
  1481. }]);
  1482. return Plugins;
  1483. }();
  1484. var _components = /*#__PURE__*/_classPrivateFieldKey("components");
  1485. /*
  1486. * @Author: Rindy
  1487. * @Date: 2021-09-15 09:31:50
  1488. * @LastEditors: Rindy
  1489. * @LastEditTime: 2021-11-01 10:40:09
  1490. * @Description: Core Component
  1491. */
  1492. var Component = /*#__PURE__*/function () {
  1493. function Component(app) {
  1494. _classCallCheck(this, Component);
  1495. Object.defineProperty(this, _components, {
  1496. writable: true,
  1497. value: void 0
  1498. });
  1499. this.app = app;
  1500. _classPrivateFieldBase(this, _components)[_components] = {};
  1501. }
  1502. _createClass(Component, [{
  1503. key: "add",
  1504. value: function add(name, component) {
  1505. if (['store', 'resource'].indexOf(name) == -1) {
  1506. _classPrivateFieldBase(this, _components)[_components][name] = component;
  1507. } else {
  1508. this.app[name] = component;
  1509. }
  1510. }
  1511. }, {
  1512. key: "get",
  1513. value: function get(name) {
  1514. return _classPrivateFieldBase(this, _components)[_components][name];
  1515. }
  1516. }]);
  1517. return Component;
  1518. }();
  1519. /*
  1520. * @Author: Rindy
  1521. * @Date: 2021-04-26 14:18:55
  1522. * @LastEditors: Rindy
  1523. * @LastEditTime: 2021-09-13 12:28:00
  1524. * @Description: 注释
  1525. */
  1526. var baseOrigin = location.origin;
  1527. var currentScript = (document.currentScript || {}).src;
  1528. /**
  1529. * 获取当前脚本路径
  1530. */
  1531. var getScriptURL = function () {
  1532. if (!currentScript) {
  1533. var a = {};
  1534. try {
  1535. a.b();
  1536. } catch (e) {
  1537. var stack = e.stack || e.sourceURL || e.stacktrace;
  1538. var match = /(?:http|https|file):\/\/.*?\/.+?.js/.exec(stack);
  1539. if (match) {
  1540. currentScript = match[0];
  1541. }
  1542. }
  1543. }
  1544. var filepathPart = currentScript.split('/');
  1545. filepathPart.pop();
  1546. currentScript = filepathPart.join('/') + '/';
  1547. return function () {
  1548. return currentScript;
  1549. };
  1550. }();
  1551. window.addEventListener('error', function (evt) {
  1552. });
  1553. function createScript(url) {
  1554. var script = document.createElement('script');
  1555. script.async = true; // Only add cross origin for actual cross origin
  1556. // this is because Safari triggers for all
  1557. // - https://bugs.webkit.org/show_bug.cgi?id=171566
  1558. if (url.indexOf(baseOrigin + '/')) {
  1559. script.crossOrigin = 'anonymous';
  1560. }
  1561. script.src = url;
  1562. return script;
  1563. }
  1564. function loadScript(url, name, version) {
  1565. return new Promise(function (resolve, reject) {
  1566. var script = createScript(url + (version ? "?v=".concat(version) : ''));
  1567. script.addEventListener('error', function () {
  1568. console.error('load:' + url + ' error');
  1569. reject();
  1570. });
  1571. script.addEventListener('load', function () {
  1572. document.head.removeChild(script);
  1573. resolve(name);
  1574. });
  1575. document.head.appendChild(script);
  1576. });
  1577. }
  1578. function usePlugin(name, version) {
  1579. return loadScript(getScriptURL() + 'plugins/' + name + '.js', name, version);
  1580. }
  1581. var GUI = /*#__PURE__*/function () {
  1582. function GUI(app) {
  1583. _classCallCheck(this, GUI);
  1584. this.app = app;
  1585. } // data可直接传String,默认为content
  1586. /**
  1587. * @param data
  1588. * {
  1589. type: String,
  1590. delay: Number,
  1591. content: String,
  1592. showClose: Boolean
  1593. }
  1594. */
  1595. _createClass(GUI, [{
  1596. key: "toast",
  1597. value: function toast(data) {
  1598. // alert(data.content)
  1599. this.app.emit('gui.toast', data);
  1600. }
  1601. /**
  1602. * @param data
  1603. * {
  1604. title: { type: String, default: '提示' },
  1605. okText: { type: String, default: '确定' },
  1606. func: Function,
  1607. content: String
  1608. }
  1609. */
  1610. }, {
  1611. key: "alert",
  1612. value: function alert(data) {
  1613. // alert(data)
  1614. this.app.emit('gui.alert', data);
  1615. }
  1616. /**
  1617. * @param data
  1618. * {
  1619. title: { type: String, default: '提示' },
  1620. okText: { type: String, default: '确定' },
  1621. noText: { type: String, default: '取消' },
  1622. single: { type: Boolean, default: true },
  1623. func: Function,
  1624. content: String
  1625. }
  1626. */
  1627. }, {
  1628. key: "confirm",
  1629. value: function confirm(data) {
  1630. // alert(data)
  1631. this.app.emit('gui.confirm', data);
  1632. }
  1633. }]);
  1634. return GUI;
  1635. }();
  1636. function _arrayWithHoles(arr) {
  1637. if (Array.isArray(arr)) return arr;
  1638. }
  1639. function _iterableToArrayLimit(arr, i) {
  1640. var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
  1641. if (_i == null) return;
  1642. var _arr = [];
  1643. var _n = true;
  1644. var _d = false;
  1645. var _s, _e;
  1646. try {
  1647. for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
  1648. _arr.push(_s.value);
  1649. if (i && _arr.length === i) break;
  1650. }
  1651. } catch (err) {
  1652. _d = true;
  1653. _e = err;
  1654. } finally {
  1655. try {
  1656. if (!_n && _i["return"] != null) _i["return"]();
  1657. } finally {
  1658. if (_d) throw _e;
  1659. }
  1660. }
  1661. return _arr;
  1662. }
  1663. function _nonIterableRest() {
  1664. throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  1665. }
  1666. function _slicedToArray(arr, i) {
  1667. return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray$e(arr, i) || _nonIterableRest();
  1668. }
  1669. var math$2 = {
  1670. getBaseLog(x, y) {
  1671. //返回以 x 为底 y 的对数(即 logx y) . Math.log 返回一个数的自然对数
  1672. return Math.log(y) / Math.log(x);
  1673. },
  1674. convertVisionVector: function convertVisionVector(e) {
  1675. return new THREE.Vector3(e.x, e.z, -e.y);
  1676. },
  1677. invertVisionVector: function invertVisionVector(e) {
  1678. //反转给算法部
  1679. return new THREE.Vector3(e.x, -e.z, e.y);
  1680. },
  1681. convertVisionQuaternion: function convertVisionQuaternion(e) {
  1682. 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)));
  1683. },
  1684. invertVisionQuaternion: function invertVisionQuaternion(e) {
  1685. //反转给算法部
  1686. var a = e.clone().multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(-90)));
  1687. return new THREE.Quaternion(a.x, -a.z, a.y, a.w);
  1688. },
  1689. convertWorkshopVector: function convertWorkshopVector(e) {
  1690. return new THREE.Vector3(-e.x, e.y, e.z);
  1691. },
  1692. convertWorkshopQuaternion: function convertWorkshopQuaternion(e) {
  1693. 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));
  1694. },
  1695. convertWorkshopPanoramaQuaternion: function convertWorkshopPanoramaQuaternion(e) {
  1696. 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)));
  1697. },
  1698. convertWorkshopOrthoZoom: function convertWorkshopOrthoZoom(e, dom) {
  1699. //xzw
  1700. return e === -1 ? -1 : e * (dom.clientHeight / dom.clientHeight);
  1701. },
  1702. getVec2Angle: function getVec2Angle(dir1, dir2) {
  1703. return Math.acos(THREE.MathUtils.clamp(this.getVec2Cos(dir1, dir2), -1, 1));
  1704. },
  1705. getVec2Cos: function getVec2Cos(dir1, dir2) {
  1706. return dir1.dot(dir2) / dir1.length() / dir2.length();
  1707. },
  1708. closeTo: function closeTo(a, b, num) {
  1709. if (num != void 0) return Math.abs(a - b) < num;
  1710. return Math.abs(a - b) < 1e-6;
  1711. },
  1712. toPrecision: function toPrecision(e, t) {
  1713. //xzw change 保留小数
  1714. var f = function f(e, t) {
  1715. var i = Math.pow(10, t);
  1716. return Math.round(e * i) / i;
  1717. };
  1718. if (e instanceof Array) {
  1719. for (var s = 0; s < e.length; s++) {
  1720. e[s] = f(e[s], t);
  1721. }
  1722. return e;
  1723. } else if (e instanceof Object) {
  1724. for (var s in e) {
  1725. e[s] = f(e[s], t);
  1726. }
  1727. return e;
  1728. } else return f(e, t);
  1729. },
  1730. isEmptyQuaternion: function isEmptyQuaternion(e) {
  1731. return 0 === Math.abs(e.x) && 0 === Math.abs(e.y) && 0 === Math.abs(e.z) && 0 === Math.abs(e.w);
  1732. },
  1733. projectPositionToCanvas: function projectPositionToCanvas(e, t, i, domE) {
  1734. i = i || new THREE.Vector3(), i.copy(e);
  1735. var r = 0.5 * domE.clientWidth,
  1736. o = 0.5 * domE.clientHeight;
  1737. return i.project(t), i.x = i.x * r + r, i.y = -(i.y * o) + o, i;
  1738. },
  1739. convertScreenPositionToNDC: function convertScreenPositionToNDC(e, t, i, domE) {
  1740. /* return i = i || new THREE.Vector2,
  1741. i.x = e / window.innerWidth * 2 - 1,
  1742. i.y = 2 * -(t / window.innerHeight) + 1,
  1743. i
  1744. */
  1745. return i = i || new n.Vector2(), i.x = e / domE.clientWidth * 2 - 1, i.y = 2 * -(t / domE.clientHeight) + 1, i;
  1746. },
  1747. handelPadding: function () {
  1748. //去除player左边和上面的宽高,因为pc的player左上有其他element 许钟文
  1749. var pads = new Map(); //记录下来避免反复计算
  1750. return function (x, y, domE) {
  1751. var pad;
  1752. var padInfo = pads.get(domE);
  1753. if (padInfo) {
  1754. if (domE.clientWidth == padInfo.width && domE.clientHeight == padInfo.height) {
  1755. //resize
  1756. pad = padInfo.pad;
  1757. }
  1758. }
  1759. if (!pad) {
  1760. pad = domE.getBoundingClientRect();
  1761. pads.set(domE, {
  1762. width: domE.clientWidth,
  1763. height: domE.clientHeight,
  1764. pad
  1765. });
  1766. }
  1767. return {
  1768. x: x - pad.x,
  1769. y: y - pad.y
  1770. };
  1771. };
  1772. }(),
  1773. /* getOffset: function (type, element, parent) { //弃用,因body上的offset得不到
  1774. //获取元素的边距 许钟文
  1775. var offset = type == 'left' ? element.offsetLeft : element.offsetTop
  1776. if (!parent) parent = document.body
  1777. while ((element = element.offsetParent)) {
  1778. if (element == parent) break
  1779. offset += type == 'left' ? element.offsetLeft : element.offsetTop
  1780. }
  1781. return offset
  1782. }, */
  1783. constrainedTurn: function constrainedTurn(e) {
  1784. var t = e % (2 * Math.PI);
  1785. return t = t > Math.PI ? t -= 2 * Math.PI : t < -Math.PI ? t += 2 * Math.PI : t;
  1786. },
  1787. getFOVDotThreshold: function getFOVDotThreshold(e) {
  1788. return Math.cos(THREE.MathUtils.degToRad(e / 2));
  1789. },
  1790. transform2DForwardVectorByCubeFace: function transform2DForwardVectorByCubeFace(e, t, i, n) {
  1791. switch (e) {
  1792. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
  1793. i.set(1, t.y, t.x);
  1794. break;
  1795. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
  1796. i.set(-1, t.y, -t.x);
  1797. break;
  1798. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
  1799. i.set(-t.x, 1, -t.y);
  1800. break;
  1801. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
  1802. i.set(-t.x, -1, t.y);
  1803. break;
  1804. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
  1805. i.set(-t.x, t.y, 1);
  1806. break;
  1807. case GLCubeFaces.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
  1808. i.set(t.x, t.y, -1);
  1809. }
  1810. n && i.normalize();
  1811. },
  1812. getFootPoint: function getFootPoint(oldPos, p1, p2, restricInline) {
  1813. //找oldPos在线段p1, p2上的垂足
  1814. /* if(isWorld){//输出全局坐标 需要考虑meshGroup.position
  1815. p1 = p1.clone();
  1816. p2 = p2.clone();
  1817. p1.y += mainDesign.meshGroup.position.y;
  1818. p2.y += mainDesign.meshGroup.position.y;
  1819. } */
  1820. var op1 = oldPos.clone().sub(p1);
  1821. var p1p2 = p1.clone().sub(p2);
  1822. var p1p2Len = p1p2.length();
  1823. var leftLen = op1.dot(p1p2) / p1p2Len;
  1824. var pos = p1.clone().add(p1p2.multiplyScalar(leftLen / p1p2Len));
  1825. if (restricInline && pos.clone().sub(p1).dot(pos.clone().sub(p2)) > 0) {
  1826. //foot不在线段上
  1827. if (pos.distanceTo(p1) < pos.distanceTo(p2)) pos = p1.clone();else pos = p2.clone();
  1828. }
  1829. return pos;
  1830. },
  1831. /**
  1832. * 计算多边形的重心
  1833. * @param {*} points
  1834. */
  1835. getCenterOfGravityPoint: function getCenterOfGravityPoint(mPoints) {
  1836. var area = 0.0; //多边形面积
  1837. var Gx = 0.0,
  1838. Gy = 0.0; // 重心的x、y
  1839. for (var i = 1; i <= mPoints.length; i++) {
  1840. var ix = mPoints[i % mPoints.length].x;
  1841. var iy = mPoints[i % mPoints.length].y;
  1842. var nx = mPoints[i - 1].x;
  1843. var ny = mPoints[i - 1].y;
  1844. var temp = (ix * ny - iy * nx) / 2.0;
  1845. area += temp;
  1846. Gx += temp * (ix + nx) / 3.0;
  1847. Gy += temp * (iy + ny) / 3.0;
  1848. }
  1849. Gx = Gx / area;
  1850. Gy = Gy / area;
  1851. return {
  1852. x: Gx,
  1853. y: Gy
  1854. };
  1855. },
  1856. getBound: function getBound(ring) {
  1857. var bound = new THREE.Box2();
  1858. for (var j = 0, len = ring.length; j < len; j++) {
  1859. bound.expandByPoint(ring[j]);
  1860. }
  1861. return bound;
  1862. },
  1863. isPointInArea: function isPointInArea(ring, point, ifAtLine) {
  1864. //判断点是否在某个环内
  1865. var bound = this.getBound(ring);
  1866. if (point.x < bound.min.x || point.x > bound.max.x || point.y < bound.min.y || point.y > bound.max.y) return false;
  1867. var inside = false;
  1868. var x = point.x,
  1869. y = point.y;
  1870. for (var i = 0, j = ring.length - 1; i < ring.length; j = i++) {
  1871. var xi = ring[i].x,
  1872. yi = ring[i].y;
  1873. var xj = ring[j].x,
  1874. yj = ring[j].y;
  1875. if ((xi - x) * (yj - y) == (xi - x) * (yi - y) && x >= Math.min(xi, xj) && x <= Math.max(xi, xj) && //xzw add
  1876. y >= Math.min(yi, yj) && y <= Math.max(yi, yj)) {
  1877. return !!ifAtLine; //在线段上,则判断为…… (默认在外)
  1878. }
  1879. if (yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi) {
  1880. inside = !inside;
  1881. }
  1882. }
  1883. return inside;
  1884. },
  1885. getArea: function getArea(ring) {
  1886. //求面积 顺时针为正 来自three shape
  1887. for (var t = ring.length, i = 0, n = t - 1, r = 0; r < t; n = r++) {
  1888. i += ring[n].x * ring[r].y - ring[r].x * ring[n].y;
  1889. }
  1890. return -0.5 * i;
  1891. },
  1892. isInBetween: function isInBetween(a, b, c, precision) {
  1893. // 如果b几乎等于a或c,返回false.为了避免浮点运行时两值几乎相等,但存在相差0.00000...0001的这种情况出现使用下面方式进行避免
  1894. /* if (Math.abs(a - b) < 0.000001 || Math.abs(b - c) < 0.000001) {
  1895. return false;
  1896. }
  1897. return (a <= b && b <= c) || (c <= b && b <= a);*/
  1898. //更改:如果b和a或c中一个接近 就算在a和c之间
  1899. return a <= b && b <= c || c <= b && b <= a || this.closeTo(a, b, precision) || this.closeTo(b, c, precision);
  1900. },
  1901. ifPointAtLineBound: function ifPointAtLineBound(point, linePoints, precision) {
  1902. //待验证 横线和竖线比较特殊
  1903. return math$2.isInBetween(linePoints[0].x, point.x, linePoints[1].x, precision) && math$2.isInBetween(linePoints[0].y, point.y, linePoints[1].y, precision);
  1904. },
  1905. isLineIntersect: function isLineIntersect(line1, line2, notSegment) {
  1906. //线段和线段是否有交点. notSegment代表是直线而不是线段
  1907. var a1 = line1[1].y - line1[0].y;
  1908. var b1 = line1[0].x - line1[1].x;
  1909. var c1 = a1 * line1[0].x + b1 * line1[0].y; //转换成一般式: Ax+By = C
  1910. var a2 = line2[1].y - line2[0].y;
  1911. var b2 = line2[0].x - line2[1].x;
  1912. var c2 = a2 * line2[0].x + b2 * line2[0].y; // 计算交点
  1913. var d = a1 * b2 - a2 * b1; // 当d==0时,两线平行
  1914. if (d == 0) {
  1915. return false;
  1916. } else {
  1917. var x = (b2 * c1 - b1 * c2) / d;
  1918. var y = (a1 * c2 - a2 * c1) / d; // 检测交点是否在两条线段上
  1919. /* if (notSegment || (isInBetween(line1[0].x, x, line1[1].x) || isInBetween(line1[0].y, y, line1[1].y)) &&
  1920. (isInBetween(line2[0].x, x, line2[1].x) || isInBetween(line2[0].y, y, line2[1].y))) {
  1921. return {x,y};
  1922. } */
  1923. if (notSegment || math$2.ifPointAtLineBound({
  1924. x,
  1925. y
  1926. }, line1) && math$2.ifPointAtLineBound({
  1927. x,
  1928. y
  1929. }, line2)) {
  1930. return {
  1931. x,
  1932. y
  1933. };
  1934. }
  1935. }
  1936. },
  1937. getNormal: function getNormal(line2d) {
  1938. //获取二维法向量 方向向内
  1939. var x, y; //要求的向量
  1940. //line2d的向量
  1941. var x1 = line2d.points[1].x - line2d.points[0].x;
  1942. var y1 = line2d.points[1].y - line2d.points[0].y; //假设法向量的x或y固定为1或-1
  1943. if (y1 != 0) {
  1944. x = 1;
  1945. y = -(x1 * x) / y1;
  1946. } else if (x1 != 0) {
  1947. //y如果为0,正常情况x不会是0
  1948. y = 1;
  1949. x = -(y1 * y) / x1;
  1950. } else {
  1951. console.log('两个点一样');
  1952. return null;
  1953. } //判断方向里或者外:
  1954. var vNormal = new THREE.Vector3(x, 0, y);
  1955. var vLine = new THREE.Vector3(x1, 0, y1);
  1956. var vDir = vNormal.cross(vLine);
  1957. if (vDir.y > 0) {
  1958. x *= -1;
  1959. y *= -1;
  1960. }
  1961. return new THREE.Vector2(x, y).normalize();
  1962. },
  1963. getQuaBetween2Vector: function getQuaBetween2Vector(oriVec, newVec, upVec) {
  1964. //似乎可以用quternion.setFromUnitVectors代替
  1965. //获取从oriVec旋转到newVec可以应用的quaternion
  1966. var angle = oriVec.angleTo(newVec);
  1967. var axis = oriVec.clone().cross(newVec).normalize(); //两个up之间
  1968. if (axis.length() == 0) {
  1969. //当夹角为180 或 0 度时,得到的axis为(0,0,0),故使用备用的指定upVec
  1970. return new THREE.Quaternion().setFromAxisAngle(upVec, angle);
  1971. }
  1972. return new THREE.Quaternion().setFromAxisAngle(axis, angle);
  1973. },
  1974. getScaleForConstantSize: function () {
  1975. //获得规定二维大小的mesh的scale值。可以避免因camera的projection造成的mesh视觉大小改变。 来源:tag.updateDisc
  1976. var w;
  1977. var i = new THREE.Vector3(),
  1978. o = new THREE.Vector3(),
  1979. l = new THREE.Vector3(),
  1980. c = new THREE.Vector3(),
  1981. h = new THREE.Vector3();
  1982. return function () {
  1983. var op = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  1984. var player = op.player,
  1985. nearBound = op.nearBound,
  1986. farBound = op.farBound,
  1987. farBoundPlan = op.farBoundPlan,
  1988. minSize = op.minSize,
  1989. maxSize = op.maxSize;
  1990. var camera = op.camera || player.camera,
  1991. dom = op.dom || player.domElement;
  1992. if (op.width2d) w = op.width2d; //如果恒定二维宽度
  1993. else {
  1994. var _orthoCam;
  1995. var currentDis, orthoProgress, orthoCam;
  1996. if (player && (player.mode == 'floorplan' || player.mode == 'transitioning')) {
  1997. var modes = player.modeTran.split('-');
  1998. if (modes.includes('floorplan')) {
  1999. orthoCam = player.cameraControls.cameras.floorplan;
  2000. orthoProgress = player.mode == 'transitioning' ? modes[1] == 'floorplan' ? player.flyInOutProgress : 1 - player.flyInOutProgress : null;
  2001. }
  2002. }
  2003. var dis = op.position.distanceTo(camera.position); //dollhouse要直接使用player.camera, 因为activeControl.camera没有更新matrixWorld
  2004. if (!orthoCam && camera.type == 'OrthographicCamera') orthoCam = camera; //小地图
  2005. if (((_orthoCam = orthoCam) === null || _orthoCam === void 0 ? void 0 : _orthoCam.type) == 'OrthographicCamera') {
  2006. //floorplan要直接使用activeControl.camera,主要用到projectionMatrix
  2007. var orthoZoom = (orthoCam.right - orthoCam.left) / orthoCam.zoom / 3;
  2008. if (orthoProgress != void 0) {
  2009. //transitioning
  2010. currentDis = dis * (1 - orthoProgress) + orthoZoom * orthoProgress; //mix
  2011. farBoundPlan != void 0 && (farBound = farBound * (1 - orthoProgress) + farBoundPlan * orthoProgress);
  2012. op.log && console.log('orthoProgress', orthoProgress, 'dis', dis, 'orthoZoom', orthoZoom);
  2013. } else {
  2014. currentDis = orthoZoom;
  2015. farBoundPlan != void 0 && (farBound = farBoundPlan);
  2016. }
  2017. } else {
  2018. currentDis = dis;
  2019. }
  2020. if (nearBound == void 0 && farBound != void 0 || nearBound != void 0 && farBound == void 0) {
  2021. //仅限制最大或最小的话,不判断像素大小,直接限制mesh的scale
  2022. //这个判断也可以写到getScaleForConstantSize里,可以更严谨控制像素宽度,这里只简单计算大小
  2023. var scale;
  2024. if (farBound == void 0 && currentDis < nearBound) {
  2025. scale = op.scale * currentDis / nearBound;
  2026. } else if (nearBound == void 0 && currentDis > farBound) {
  2027. scale = op.scale * currentDis / farBound;
  2028. } else {
  2029. scale = op.scale;
  2030. }
  2031. return scale;
  2032. }
  2033. w = maxSize - (maxSize - minSize) * THREE.MathUtils.smoothstep(currentDis, nearBound, farBound);
  2034. op.log && console.log('w', w, 'currentDis', currentDis, 'farBound', farBound); //maxSize : mesh要表现的最大像素宽度; nearBound: 最近距离,若比nearBound近,则使用maxSize
  2035. }
  2036. i.copy(op.position).project(camera), //tag中心在屏幕上的二维坐标
  2037. o.set(dom.clientWidth / 2, dom.clientHeight / 2, 1).multiply(i), //转化成px -w/2 到 w/2的范围
  2038. l.set(w / 2, 0, 0).add(o), //加上tag宽度的一半
  2039. c.set(2 / dom.clientWidth, 2 / dom.clientHeight, 1).multiply(l), //再转回 -1 到 1的范围
  2040. h.copy(c).unproject(camera); //再转成三维坐标,求得tag边缘的位置
  2041. var g = h.distanceTo(op.position); //就能得到tag的三维半径
  2042. return g;
  2043. };
  2044. }(),
  2045. //W , H, left, top分别是rect的宽、高、左、上
  2046. getCrossPointAtRect: function getCrossPointAtRect(p1, aim, W, H, left, top) {
  2047. //求射线p1-aim在rect边界上的交点,其中aim在rect范围内,p1则不一定(交点在aim这边的延长线上)
  2048. var x, y, borderX;
  2049. var r = (aim.x - p1.x) / (aim.y - p1.y); //根据相似三角形原理先求出这个比值
  2050. var getX = function getX(y) {
  2051. return r * (y - p1.y) + p1.x;
  2052. };
  2053. var getY = function getY(x) {
  2054. return 1 / r * (x - p1.x) + p1.y;
  2055. };
  2056. if (aim.x >= p1.x) {
  2057. borderX = W + left;
  2058. } else {
  2059. borderX = left;
  2060. }
  2061. x = borderX;
  2062. y = getY(x);
  2063. if (y < top || y > top + H) {
  2064. if (y < top) {
  2065. y = top;
  2066. } else {
  2067. y = top + H;
  2068. }
  2069. x = getX(y);
  2070. }
  2071. return new THREE.Vector2(x, y);
  2072. },
  2073. getDirFromUV: function getDirFromUV(uv) {
  2074. //获取dir 反向计算 - - 二维转三维比较麻烦
  2075. var dirB; //所求 单位向量
  2076. uv.x %= 1;
  2077. if (uv.x < 0) uv.x += 1; //调整为0-1
  2078. var y = Math.cos(uv.y * Math.PI); //uv中纵向可以直接确定y, 根据上面getUVfromDir的反向计算
  2079. var angle = 2 * Math.PI * uv.x - Math.PI; //x/z代表的是角度
  2080. var axisZ; //axis为1代表是正,-1是负数
  2081. if (-Math.PI / 2 <= angle && angle < Math.PI / 2) {
  2082. axisZ = 1; //右半圆
  2083. } else {
  2084. axisZ = -1; //左半圆
  2085. }
  2086. var XDivideZ = Math.tan(angle);
  2087. var z = Math.sqrt((1 - y * y) / (1 + XDivideZ * XDivideZ));
  2088. var x = XDivideZ * z;
  2089. if (z * axisZ < 0) {
  2090. //异号
  2091. z *= -1;
  2092. x *= -1;
  2093. }
  2094. x *= -1; //计算完成后这里不能漏掉 *= -1
  2095. dirB = new THREE.Vector3(x, y, z); //理想状态下x和z和anotherDir相同
  2096. return dirB;
  2097. },
  2098. getUVfromDir: function getUVfromDir(dir) {
  2099. //获取UV 同shader里的计算
  2100. var dir = dir.clone();
  2101. dir.x *= -1; //计算前这里不能漏掉 *= -1 见shader
  2102. var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5; //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
  2103. var ty = Math.acos(dir.y) / Math.PI;
  2104. return new THREE.Vector2(tx, ty); //理想状态下tx相同
  2105. },
  2106. crossRight: function crossRight(vec3, matrix) {
  2107. //向量右乘矩阵,不能用向量的applyMatrix4(左乘)
  2108. var e = matrix.elements;
  2109. var v = new THREE.Vector3();
  2110. v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3];
  2111. v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7];
  2112. v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]; //v.w不要
  2113. return v;
  2114. },
  2115. getNormalDir: function getNormalDir(point,
  2116. /* supportsTiles, */
  2117. currentPano) {
  2118. //获取A单位法线
  2119. /* console.log("lookVector:")
  2120. console.log(objects.player.cameraControls.activeControl.lookVector) */
  2121. var dir = point.clone().sub(currentPano.position); //OA
  2122. /* console.log("A的dir(无matrix转化):")
  2123. console.log(dir.clone().normalize()); */
  2124. if (currentPano.tiled) {
  2125. var matrixWorld = currentPano.rot90Matrix.clone(); //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
  2126. } else {
  2127. var matrixWorld = currentPano.matrixWorld.clone();
  2128. }
  2129. dir = this.crossRight(dir, matrixWorld); //右乘matrixWorld 得matrix转化的向量
  2130. dir.normalize();
  2131. /* var b = player.currentPano.skyboxMesh.matrixWorld.clone().getInverse(player.currentPano.skyboxMesh.matrixWorld)
  2132. console.log(crossRight(dir,b).normalize()) */
  2133. return dir;
  2134. },
  2135. getDirByLonLat: function getDirByLonLat(lon, lat) {
  2136. var dir = new THREE.Vector3();
  2137. var phi = THREE.MathUtils.degToRad(90 - lat);
  2138. var theta = THREE.MathUtils.degToRad(lon);
  2139. dir.x = Math.sin(phi) * Math.cos(theta);
  2140. dir.y = Math.cos(phi);
  2141. dir.z = Math.sin(phi) * Math.sin(theta);
  2142. return dir;
  2143. },
  2144. //0,0 => (1,0,0) 270=>(0,0,-1)
  2145. getYawByDir(dir) {
  2146. return Math.atan2(-dir.z, dir.x); // - Math.PI / 2
  2147. },
  2148. getPitchByDir(dir) {
  2149. dir = dir.clone().normalize(); //add
  2150. var pitch;
  2151. if (dir.x === 0 && dir.z === 0) {
  2152. pitch = Math.PI / 2 * Math.sign(dir.y);
  2153. } else {
  2154. pitch = Math.atan2(dir.y, Math.sqrt(dir.x * dir.x + dir.z * dir.z));
  2155. }
  2156. return pitch;
  2157. },
  2158. getLineIntersect2() {
  2159. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  2160. //得两条直线在其向量构成的面的法线方向的交点,投影在线上点的中点。
  2161. if (o.A != void 0) {
  2162. // Ap1为一条线,Bp2为一条线
  2163. var A = o.A;
  2164. var B = o.B;
  2165. var p1 = o.p1 || new THREE.Vector3().addVctors(A, o.dir0);
  2166. var p2 = o.p2 || new THREE.Vector3().addVctors(B, o.dir1);
  2167. var dir0 = o.dir0 || new THREE.Vector3().subVectors(p1, A);
  2168. var dir1 = o.dir1 || new THREE.Vector3().subVectors(p2, B);
  2169. }
  2170. if (A.equals(B)) return {
  2171. pos3d: p1.clone()
  2172. }; //寻找两个向量所在的面
  2173. var normal = dir0.clone().cross(dir1); //面的法线
  2174. //先把整体旋转到使在xz平面上,求完交点再转回来
  2175. var qua = math$2.getQuaBetween2Vector(normal, new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, 1, 0));
  2176. var newPoints = [A, B, p1, p2].map(function (e) {
  2177. return e.clone().applyQuaternion(qua);
  2178. });
  2179. var pos2d = math$2.isLineIntersect([{
  2180. x: newPoints[0].x,
  2181. y: newPoints[0].z
  2182. }, {
  2183. x: newPoints[2].x,
  2184. y: newPoints[2].z
  2185. }], [{
  2186. x: newPoints[1].x,
  2187. y: newPoints[1].z
  2188. }, {
  2189. x: newPoints[3].x,
  2190. y: newPoints[3].z
  2191. }], true);
  2192. var quaInverse = qua.clone().invert();
  2193. var pos3d = new THREE.Vector3(pos2d.x, 0, pos2d.y);
  2194. var pos3d1 = pos3d.clone().setY(newPoints[0].y);
  2195. var pos3d2 = pos3d.clone().setY(newPoints[1].y);
  2196. pos3d1.applyQuaternion(quaInverse);
  2197. pos3d2.applyQuaternion(quaInverse);
  2198. pos3d = new THREE.Vector3().addVectors(pos3d1, pos3d2).multiplyScalar(0.5);
  2199. return {
  2200. pos3d,
  2201. mid1: pos3d1,
  2202. mid2: pos3d2
  2203. };
  2204. },
  2205. getLineIntersect(o) {
  2206. //两条三维直线相交 //取两线最短线段中心点 并且不能超出起点
  2207. o = o || {};
  2208. if (o.A != void 0) {
  2209. // Ap1为一条线,Bp2为一条线
  2210. var A = o.A;
  2211. var B = o.B;
  2212. var p1 = o.p1;
  2213. var p2 = o.p2;
  2214. }
  2215. if (A.equals(B)) return {
  2216. pos3d: p1.clone()
  2217. };
  2218. /* console.log("v1:")
  2219. console.log(A.clone().sub(p1).normalize())
  2220. console.log("v2:")
  2221. console.log(B.clone().sub(p2).normalize())
  2222. */
  2223. //调试热点夹角
  2224. var line1 = p1.clone().sub(A).normalize();
  2225. var line2 = p2.clone().sub(B).normalize();
  2226. line1.angleTo(line2); //var pano = player.model.panos.index[player.posGets.list[1]]
  2227. //console.log('真实两线夹角: ', THREE.MathUtils.radToDeg(angle)) /*+ "旧夹角min: "+getAngle(pano.recentAngleScore)+"("+pano.recentAngleScore+")" */
  2228. //----------
  2229. var compute = function compute() {
  2230. var pos3d;
  2231. var ux = p1.x - A.x;
  2232. var uy = p1.y - A.y;
  2233. var uz = p1.z - A.z;
  2234. var vx = p2.x - B.x;
  2235. var vy = p2.y - B.y;
  2236. var vz = p2.z - B.z;
  2237. var wx = A.x - B.x;
  2238. var wy = A.y - B.y;
  2239. var wz = A.z - B.z;
  2240. var a = ux * ux + uy * uy + uz * uz; //u*u
  2241. var b = ux * vx + uy * vy + uz * vz; //u*v
  2242. var c = vx * vx + vy * vy + vz * vz; //v*v
  2243. var d = ux * wx + uy * wy + uz * wz; //u*w
  2244. var e = vx * wx + vy * wy + vz * wz; //v*w
  2245. var dt = a * c - b * b;
  2246. var sd = dt;
  2247. var td = dt;
  2248. var sn = 0.0; //sn = be-cd
  2249. var tn = 0.0; //tn = ae-bd
  2250. var behind = function (index) {
  2251. //在后方交点的话,直接其中一个点 不用两posget点中心点是因为可能从不同方位 距离很大
  2252. pos3d = (index == 1 ? p1 : p2).clone(); //console.log(pos3d , ' 在后方交点,使用点' + index)
  2253. }.bind(this);
  2254. if (math$2.closeTo(dt, 0.0)) {
  2255. //两直线平行
  2256. sn = 0.0; //在s上指定取s0
  2257. sd = 1.0; //防止计算时除0错误
  2258. tn = e; //按(公式3)求tc
  2259. td = c;
  2260. } else {
  2261. sn = b * e - c * d;
  2262. tn = a * e - b * d;
  2263. if (sn < 0.0) {
  2264. //最近点在s起点以外,同平行条件
  2265. behind(1);
  2266. return {
  2267. pos3d,
  2268. behind: true
  2269. };
  2270. }
  2271. }
  2272. if (tn < 0.0) {
  2273. //最近点在t起点以外
  2274. behind(2);
  2275. return {
  2276. pos3d,
  2277. behind: true
  2278. };
  2279. }
  2280. /* else if (tn > td){ //超出终点不限制
  2281. tn = td;
  2282. if ((-d + b) < 0.0)
  2283. sn = 0.0;
  2284. else if ((-d + b) > a)
  2285. sn = sd;
  2286. else
  2287. {
  2288. sn = (-d + b);
  2289. sd = a;
  2290. }
  2291. } */
  2292. var sc = 0.0;
  2293. var tc = 0.0;
  2294. if (math$2.closeTo(sn, 0.0)) sc = 0.0;else sc = sn / sd;
  2295. if (math$2.closeTo(tn, 0.0)) tc = 0.0;else tc = tn / td; //两个最近点
  2296. var mid1 = new THREE.Vector3(A.x + sc * ux, A.y + sc * uy, A.z + sc * uz);
  2297. var mid2 = new THREE.Vector3(B.x + tc * vx, B.y + tc * vy, B.z + tc * vz);
  2298. /* console.log("v11:")
  2299. console.log(A.clone().sub(mid1).normalize())
  2300. console.log("v22:")
  2301. console.log(B.clone().sub(mid2).normalize()) */
  2302. //console.log('另一个结果', math.getLineIntersect2(o)) //结果一样的,只是没有限制后方交点
  2303. var r = {
  2304. pos3d: mid1.clone().add(mid2).multiplyScalar(0.5),
  2305. mid1,
  2306. mid2
  2307. };
  2308. return r;
  2309. };
  2310. return compute(); //https://blog.csdn.net/u011511587/article/details/52063663 三维空间两直线/线段最短距离、线段计算算法
  2311. },
  2312. getAngle(vec1, vec2, axis) {
  2313. var angle = vec1.angleTo(vec2);
  2314. var axis_ = vec1.clone().cross(vec2);
  2315. if (axis_[axis] < 0) {
  2316. angle *= -1;
  2317. }
  2318. return angle;
  2319. },
  2320. linearClamp(value, xArr, yArr) {
  2321. if (arguments.length == 5) {
  2322. xArr = [arguments[1], arguments[2]];
  2323. yArr = [arguments[3], arguments[4]];
  2324. }
  2325. var len = xArr.length;
  2326. if (value <= xArr[0]) return yArr[0];
  2327. if (value >= xArr[len - 1]) return yArr[len - 1];
  2328. var i = 0;
  2329. while (++i < len) {
  2330. if (value < xArr[i]) {
  2331. var x1 = xArr[i - 1],
  2332. x2 = xArr[i],
  2333. y1 = yArr[i - 1],
  2334. y2 = yArr[i];
  2335. value = y1 + (y2 - y1) * (value - x1) / (x2 - x1);
  2336. break;
  2337. }
  2338. }
  2339. return value;
  2340. },
  2341. isInsideFrustum(bounding, camera) {
  2342. // bounding是否在视野范围内有可见部分(视野就是一个锥状box)
  2343. var frustumMatrix = new THREE.Matrix4();
  2344. frustumMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
  2345. var frustum = new THREE.Frustum();
  2346. frustum.setFromProjectionMatrix(frustumMatrix);
  2347. if (bounding instanceof THREE.Sphere) {
  2348. return frustum.intersectsSphere(bounding);
  2349. } else {
  2350. return frustum.intersectsBox(bounding);
  2351. }
  2352. },
  2353. getStandardYaw(yaw1, yaw2) {
  2354. //使yaw1过渡到yaw2时朝角度差小的那边走。如果差距大于半个圆,就要反个方向转(把大的那个数字减去360度)
  2355. if (Math.abs(yaw1 - yaw2) > Math.PI) {
  2356. yaw1 > yaw2 ? yaw1 -= Math.PI * 2 : yaw2 -= Math.PI * 2;
  2357. }
  2358. return [yaw1, yaw2];
  2359. }
  2360. };
  2361. var easing = {}; //渐变曲线函数,反应加速度的变化
  2362. //currentTime:x轴当前时间(从0-到duration), startY:起始点, duration:总时长, wholeY:路程 (即endY-startY)
  2363. //参数基本是 x, 0, 1, 1
  2364. /*
  2365. easeOut 基本是y= m * (x-dur)^k + n, 若k为偶数,m<0, 若k为奇数,m>0; (因为偶数的话必须开口向下才能获得斜率递减的递增的那段,而奇数是对称的,单调递增. )
  2366. 根据x=0时y=0, x=dur时y=S , 得 n = S,m = -S/(-dur)^k
  2367. */
  2368. easing.getEaseOut = function (k) {
  2369. // k 是>=2的整数. 越大变化率越大, 相同初始速度所需要时间越久
  2370. var easeFun;
  2371. k = Math.round(k);
  2372. if (k < 2) {
  2373. k = Math.PI / 2;
  2374. easeFun = easing.easeOutSine;
  2375. } else {
  2376. easeFun = function easeFun(currentTime, startY, wholeY, duration) {
  2377. if (k > 2) {
  2378. console.log(k);
  2379. }
  2380. return -wholeY / Math.pow(-duration, k) * Math.pow(currentTime - duration, k) + wholeY;
  2381. };
  2382. }
  2383. return {
  2384. k,
  2385. easeFun
  2386. };
  2387. };
  2388. easing.linearTween = function (currentTime, startY, wholeY, duration) {
  2389. return wholeY * currentTime / duration + startY;
  2390. }, easing.easeInQuad = function (currentTime, startY, wholeY, duration) {
  2391. return currentTime /= duration, wholeY * currentTime * currentTime + startY;
  2392. }, easing.easeOutQuad = function (currentTime, startY, wholeY, duration) {
  2393. // 如套上实际的距离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
  2394. return currentTime /= duration, -wholeY * currentTime * (currentTime - 2) + startY;
  2395. }, easing.easeInOutQuad = function (currentTime, startY, wholeY, duration) {
  2396. return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime + startY : (currentTime--, -wholeY / 2 * (currentTime * (currentTime - 2) - 1) + startY);
  2397. }, easing.easeInCubic = function (currentTime, startY, wholeY, duration) {
  2398. return currentTime /= duration, wholeY * currentTime * currentTime * currentTime + startY;
  2399. }, easing.easeOutCubic = function (currentTime, startY, wholeY, duration) {
  2400. // y = S / dur^3 *(x-dur)^3 + S,对称中心是(dur,S),从0-dur是 斜率递减的递增函数,导数为3S/dur^3 * (x-dur)^2, 0时速度为3S/dur
  2401. return currentTime /= duration, currentTime--, wholeY * (currentTime * currentTime * currentTime + 1) + startY;
  2402. }, easing.easeInOutCubic = function (currentTime, startY, wholeY, duration) {
  2403. return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime * currentTime + startY : (currentTime -= 2, wholeY / 2 * (currentTime * currentTime * currentTime + 2) + startY);
  2404. }, easing.easeInQuart = function (currentTime, startY, wholeY, duration) {
  2405. return currentTime /= duration, wholeY * currentTime * currentTime * currentTime * currentTime + startY;
  2406. }, easing.easeOutQuart = function (currentTime, startY, wholeY, duration) {
  2407. //根据上面的计算,估计0时速度应该是4S/dur吧……
  2408. return currentTime /= duration, currentTime--, -wholeY * (currentTime * currentTime * currentTime * currentTime - 1) + startY;
  2409. }, easing.easeInOutQuart = function (currentTime, startY, wholeY, duration) {
  2410. return currentTime /= duration / 2, currentTime < 1 ? wholeY / 2 * currentTime * currentTime * currentTime * currentTime + startY : (currentTime -= 2, -wholeY / 2 * (currentTime * currentTime * currentTime * currentTime - 2) + startY);
  2411. }, easing.easeInQuint = function (currentTime, startY, wholeY, duration) {
  2412. return currentTime /= duration, wholeY * currentTime * currentTime * currentTime * currentTime * currentTime + startY;
  2413. }, easing.easeOutQuint = function (currentTime, startY, wholeY, duration) {
  2414. return currentTime /= duration, currentTime--, wholeY * (currentTime * currentTime * currentTime * currentTime * currentTime + 1) + startY;
  2415. }, easing.easeInOutQuint = function (currentTime, startY, wholeY, duration) {
  2416. 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);
  2417. }, easing.easeInSine = function (currentTime, startY, wholeY, duration) {
  2418. return -wholeY * Math.cos(currentTime / duration * (Math.PI / 2)) + wholeY + startY;
  2419. }, easing.easeOutSine = function (currentTime, startY, wholeY, duration) {
  2420. // y' = S * PI / 2 / dur * cos(PI/2/dur * x)
  2421. return wholeY * Math.sin(currentTime / duration * (Math.PI / 2)) + startY;
  2422. }, easing.easeInOutSine = function (currentTime, startY, wholeY, duration) {
  2423. return -wholeY / 2 * (Math.cos(Math.PI * currentTime / duration) - 1) + startY;
  2424. }, easing.easeInExpo = function (currentTime, startY, wholeY, duration) {
  2425. return wholeY * Math.pow(2, 10 * (currentTime / duration - 1)) + startY;
  2426. }, easing.easeOutExpo = function (currentTime, startY, wholeY, duration) {
  2427. return wholeY * (-Math.pow(2, -10 * currentTime / duration) + 1) + startY;
  2428. }, easing.easeInOutExpo = function (currentTime, startY, wholeY, duration) {
  2429. 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);
  2430. }, easing.easeInCirc = function (currentTime, startY, wholeY, duration) {
  2431. return currentTime /= duration, -wholeY * (Math.sqrt(1 - currentTime * currentTime) - 1) + startY;
  2432. }, easing.easeOutCirc = function (currentTime, startY, wholeY, duration) {
  2433. return currentTime /= duration, currentTime--, wholeY * Math.sqrt(1 - currentTime * currentTime) + startY;
  2434. }, easing.easeInOutCirc = function (currentTime, startY, wholeY, duration) {
  2435. 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);
  2436. }, easing.easeInElastic = function (currentTime, startY, wholeY, duration) {
  2437. var r = 1.70158,
  2438. o = 0,
  2439. a = wholeY;
  2440. 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);
  2441. }, easing.easeOutElastic = function (currentTime, startY, wholeY, duration) {
  2442. var r = 1.70158,
  2443. o = 0,
  2444. a = wholeY;
  2445. 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);
  2446. }, easing.easeInOutElastic = function (currentTime, startY, wholeY, duration) {
  2447. var r = 1.70158,
  2448. o = 0,
  2449. a = wholeY;
  2450. 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);
  2451. }, easing.easeInBack = function (currentTime, startY, wholeY, duration, r) {
  2452. return void 0 === r && (r = 1.70158), wholeY * (currentTime /= duration) * currentTime * ((r + 1) * currentTime - r) + startY;
  2453. }, easing.easeOutBack = function (currentTime, startY, wholeY, duration, r) {
  2454. return void 0 === r && (r = 1.70158), wholeY * ((currentTime = currentTime / duration - 1) * currentTime * ((r + 1) * currentTime + r) + 1) + startY;
  2455. }, easing.easeInOutBack = function (currentTime, startY, wholeY, duration, r) {
  2456. 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;
  2457. }, easing.easeOutBounce = function (currentTime, startY, wholeY, duration) {
  2458. 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;
  2459. }, easing.easeInBounce = function (currentTime, startY, wholeY, r) {
  2460. return wholeY - easing.easeOutBounce(r - currentTime, 0, wholeY, r) + startY;
  2461. }, easing.easeInOutBounce = function (currentTime, startY, wholeY, r) {
  2462. 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;
  2463. };
  2464. var transitions$1 = {
  2465. globalDone: null,
  2466. funcs: [],
  2467. counter: 0,
  2468. uniqueID: 0,
  2469. start(e, t, i) {
  2470. var r = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  2471. var o = arguments.length > 4 ? arguments[4] : undefined;
  2472. var a = arguments.length > 5 ? arguments[5] : undefined;
  2473. var s = arguments.length > 6 ? arguments[6] : undefined;
  2474. var cancelFun = arguments.length > 7 ? arguments[7] : undefined;
  2475. var ignoreFirstFrame = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : true;
  2476. var object = {
  2477. func: e,
  2478. current: -r * Math.abs(t),
  2479. duration: (1 - Math.max(r, 0)) * Math.abs(t),
  2480. done: i,
  2481. easing: o || easing.linearTween,
  2482. cycling: t < 0,
  2483. running: !0,
  2484. debug: r < 0,
  2485. name: a || 'T' + this.counter,
  2486. id: void 0 === s ? this.counter : s,
  2487. paused: !1,
  2488. cancelFun: cancelFun,
  2489. //取消时执行的函数
  2490. updateCount: 0,
  2491. //add
  2492. ignoreFirstFrame //add
  2493. };
  2494. this.funcs.push(object);
  2495. e(0, 16);
  2496. this.counter += 1;
  2497. return e;
  2498. },
  2499. trigger(e) {
  2500. var t = void 0 === e.delayRatio ? 0 : e.delayRatio,
  2501. i = e.func || function () {},
  2502. r = void 0 === e.duration ? 0 : e.duration;
  2503. void 0 !== e.cycling && e.cycling && (r = -Math.abs(r));
  2504. var o = e.done || null,
  2505. a = e.easing || easing.linearTween,
  2506. s = e.name || 'R' + this.counter,
  2507. l = void 0 === e.id ? this.counter : e.id;
  2508. return this.start(i, r, o, t, a, s, l);
  2509. },
  2510. setTimeout(e, t, i) {
  2511. var n = void 0 === i ? this.counter : i;
  2512. return this.trigger({
  2513. done: e,
  2514. duration: void 0 === t ? 0 : t,
  2515. name: 'O' + this.counter,
  2516. id: n
  2517. });
  2518. },
  2519. pause() {
  2520. this.paused = !0;
  2521. },
  2522. resume() {
  2523. this.paused = !1;
  2524. },
  2525. update(e) {
  2526. this.funcs.forEach(function (t) {
  2527. if (t.updateCount++ == 0 && t.ignoreFirstFrame) return; //add start可能发生在一帧中任意时刻,而每次update的是在一帧中的固定时刻,所以从start到第一次update的时间并不是所传入的delta,该delta 是上一帧的update到这一帧的update的耗时。 故去掉了第一次的update,相当于延迟一帧再update.
  2528. if (!(t.paused || (t.current += 1e3 * e, t.current < 0))) if (t.current >= t.duration && !t.cycling) {
  2529. var i = t.easing(1, 0, 1, 1);
  2530. t.func(i, 1e3 * e), t.done && t.done(), t.running = !1;
  2531. } else {
  2532. var n = t.easing(t.current % t.duration / t.duration, 0, 1, 1),
  2533. r = t.func(n, 1e3 * e) || !1;
  2534. r && (t.done && t.done(), t.running = !1);
  2535. }
  2536. });
  2537. var t = this.funcs.length;
  2538. this.funcs = this.funcs.filter(function (e) {
  2539. return e.running;
  2540. });
  2541. var i = this.funcs.length;
  2542. if (t > 0 && 0 === i && this.globalDone) {
  2543. var n = this.globalDone;
  2544. this.globalDone = null, n();
  2545. }
  2546. },
  2547. adjustSpeed(e, t) {
  2548. for (var i = this.getById(e), n = 0; n < i.length; n++) {
  2549. var r = i[n];
  2550. r.duration /= t, r.current /= t;
  2551. }
  2552. },
  2553. getById(e) {
  2554. return this.funcs.filter(function (t) {
  2555. return e === t.id;
  2556. });
  2557. },
  2558. get(e) {
  2559. for (var t = 0; t < this.funcs.length; t += 1) {
  2560. if (this.funcs[t].func === e) return this.funcs[t];
  2561. }
  2562. return null;
  2563. },
  2564. isRunning(e) {
  2565. var t = this.get(e);
  2566. return null !== t && t.running;
  2567. },
  2568. countActive() {
  2569. for (var e = 0, t = 0; t < this.funcs.length; t += 1) {
  2570. e += this.funcs[t].running;
  2571. }
  2572. return e;
  2573. },
  2574. listActive() {
  2575. for (var e = [], t = 0; t < this.funcs.length; t += 1) {
  2576. this.funcs[t].running && e.push(this.funcs[t].name);
  2577. }
  2578. return e;
  2579. },
  2580. done(e) {
  2581. this.globalDone = e;
  2582. },
  2583. cancelById: function cancelById(e, dealCancelFun) {
  2584. //xzw add dealDone
  2585. var t = void 0 === e ? 0 : e;
  2586. this.funcs = this.funcs.filter(function (e) {
  2587. var is = e.id == t;
  2588. if (is && dealCancelFun) {
  2589. e.cancelFun && e.cancelFun();
  2590. }
  2591. return !is;
  2592. });
  2593. },
  2594. cancel(e) {
  2595. this.funcs = this.funcs.filter(function (t) {
  2596. return t.func !== e;
  2597. });
  2598. },
  2599. getUniqueId() {
  2600. return this.uniqueID -= 1, this.uniqueID;
  2601. }
  2602. };
  2603. var RenderLayers = {
  2604. DEFAULT: 0,
  2605. //mesh默认都会显示在DEFAULT层。若不要需要手动toggle(DEFAULT)
  2606. MODEL: 1,
  2607. SKYBOX: 2,
  2608. PANOMARKERS: 3,
  2609. //这三个是在截图时用到的,其实也可以不用分这么多
  2610. RETICULE: 4,
  2611. // add by xzw:
  2612. Tag3d: 5,
  2613. SubScreen: 6,
  2614. Monitor: 7,
  2615. cursor_mini: 8,
  2616. magnifierContent: 9
  2617. };
  2618. function _superPropBase(object, property) {
  2619. while (!Object.prototype.hasOwnProperty.call(object, property)) {
  2620. object = _getPrototypeOf(object);
  2621. if (object === null) break;
  2622. }
  2623. return object;
  2624. }
  2625. function _get(target, property, receiver) {
  2626. if (typeof Reflect !== "undefined" && Reflect.get) {
  2627. _get = Reflect.get;
  2628. } else {
  2629. _get = function _get(target, property, receiver) {
  2630. var base = _superPropBase(target, property);
  2631. if (!base) return;
  2632. var desc = Object.getOwnPropertyDescriptor(base, property);
  2633. if (desc.get) {
  2634. return desc.get.call(receiver);
  2635. }
  2636. return desc.value;
  2637. };
  2638. }
  2639. return _get(target, property, receiver || target);
  2640. }
  2641. var ray$3 = new THREE.Raycaster();
  2642. var convertTool = {
  2643. getPos2d: function getPos2d(point, player, camera, dom) {
  2644. //获取一个三维坐标对应屏幕中的二维坐标
  2645. var camera = camera || player.camera;
  2646. var dom = dom || player.domElement;
  2647. 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);
  2648. var x, y;
  2649. x = (pos.x + 1) / 2 * dom.clientWidth;
  2650. y = (1 - (pos.y + 1) / 2) * dom.clientHeight;
  2651. var inSight = x <= dom.clientWidth && x >= 0 && //是否在屏幕中
  2652. y <= dom.clientHeight && y >= 0;
  2653. return {
  2654. pos: new THREE.Vector2(x, y),
  2655. // 屏幕像素坐标
  2656. vector: pos,
  2657. //(范围 -1 ~ 1)
  2658. trueSide: pos.z < 1,
  2659. //trueSide为false时,即使在屏幕范围内可见,也是反方向的另一个不可以被渲染的点 参见Tag.update
  2660. inSight: inSight //在屏幕范围内可见
  2661. };
  2662. },
  2663. ifShelter: function ifShelter(pos3d, player, pos2d, camera, floorIndex) {
  2664. //检测某点在视线中是否被mesh遮挡
  2665. if (!pos2d) pos2d = this.getPos2d(pos3d, player);
  2666. camera = camera || player.camera;
  2667. var ori = new THREE.Vector3(pos2d.x, pos2d.y, -1).unproject(camera); //找到视线原点
  2668. var dir = pos3d.clone().sub(ori).normalize();
  2669. ray$3.set(ori, dir); //由外向里 因为模型从内侧是可见的所以从外侧
  2670. /* if(config.isEdit && publicObjectSet.editor.mainDesign.editing){
  2671. var o = ray.intersectObjects(publicObjectSet.editor.mainDesign.wallMeshes);
  2672. }else{ */
  2673. var colliders = floorIndex == void 0 ? player.model.colliders : player.model.floors.index[floorIndex].collider.children;
  2674. var o = ray$3.intersectObjects(colliders); //}
  2675. var len = pos3d.distanceTo(ori);
  2676. if (o && o.length) {
  2677. for (var i = 0; i < o.length; i++) {
  2678. if (o[i].distance < len) {
  2679. return true;
  2680. } //有遮挡
  2681. }
  2682. }
  2683. },
  2684. /*
  2685. 拖拽时,获取鼠标在拖拽面上的位置(需要借助另一个intersectPlane面来计算,即和相机方向一样的面,可保证铺满屏幕)
  2686. 但是不一定能获取到,比如鼠标射线不朝向拖拽面时,即使获取也会是一个意外的反方向的交点。
  2687. */
  2688. getPosAtPlane: function getPosAtPlane(pos, player, info
  2689. /* , mouse, camera */
  2690. ) {
  2691. //pos:与intersectPlane的交点 见笔记
  2692. var A = pos;
  2693. var mouse = player.mouse;
  2694. var O = new THREE.Vector3(mouse.x, mouse.y, -1).unproject(player.camera);
  2695. if (info.y != void 0) {
  2696. //地面线的
  2697. var y = info.y;
  2698. if (player.mode == 'floorplan'
  2699. /* || Math.abs(O.x-pos.x)<0.0001 && Math.abs(O.z-pos.z)<0.0001) */
  2700. ) {
  2701. //intersectPlane和地面平行,无交点
  2702. var x = pos.x,
  2703. z = pos.z;
  2704. } else {
  2705. if (y < player.camera.position.y && O.y <= A.y
  2706. /* || y>player.camera.position.y && O.y >= A.y */
  2707. ) return null; //鼠标射线向上。因为相机一定位于地面以上(地面不会抬高到相机上吧?),所以无交点。
  2708. if (O.y == A.y) {
  2709. console.log('一样??');
  2710. return;
  2711. }
  2712. if (A.y == y) {
  2713. console.log('一样2??');
  2714. return;
  2715. }
  2716. var r = (O.y - y) / (A.y - y);
  2717. var x = (r * A.x - O.x) / (r - 1);
  2718. var z = (r * A.z - O.z) / (r - 1);
  2719. }
  2720. } else {
  2721. //垂直的也有越过消失点以后反向变化的情况,但使用时影响不大
  2722. var N = info.normalVec;
  2723. var P = info.pullPos;
  2724. if (N.y != 0) {
  2725. console.log('N.y != 0');
  2726. return;
  2727. } //仅仅支持垂直于地面的的墙壁,目前都是
  2728. if (O.z == A.z) {
  2729. console.log('O.z==A.z?');
  2730. return;
  2731. }
  2732. if (N.z != 0 && N.x != 0) {
  2733. //直接用这个通用的也可以,支持斜线的墙
  2734. //console.log('N.z==0 && N.x == 0?');
  2735. var c = N.x * (A.x - O.x) + N.y * (A.y - O.y) + N.z * (A.z - O.z);
  2736. if (c == 0) {
  2737. console.log('分母为0?? return;');
  2738. return;
  2739. }
  2740. 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;
  2741. var x = t * (A.x - O.x) + O.x;
  2742. var y = t * (A.y - O.y) + O.y;
  2743. var z = t * (A.z - O.z) + O.z;
  2744. /*原理: 已知空间直线L:(x-a)/m=(x-b)/n=(z-c)/p和空间平面π:Ax+By+Cz+D=0;
  2745. 求直线L与平面π的交点的坐标。
  2746. 把直线方程改写成参数形式:设(x-a)/m=(x-b)/n=(z-c)/p=t;
  2747. 则x=mt+a;y=nt+b;z=pt+c;代入平面π的方程得:
  2748. A(mt+a)+B(nt+b)+C(pt+c)+D=0
  2749. 由此解得t=-(Aa+Bb+Cc+D)/(Am+Bn+Cp)
  2750. 再代入参数方程即得交点的坐标(x,y,z). */
  2751. } else if (N.x == 0) {
  2752. //z与pullPos相等
  2753. var z = P.z;
  2754. if (O.y == A.y) {
  2755. console.log('一样??');
  2756. return;
  2757. }
  2758. if (A.y == y) {
  2759. console.log('一样2??');
  2760. return;
  2761. }
  2762. if (A.z == z) {
  2763. console.log('一样3??');
  2764. return;
  2765. }
  2766. var r = (O.z - z) / (A.z - z);
  2767. var x = (r * A.x - O.x) / (r - 1);
  2768. var y = (r * A.y - O.y) / (r - 1);
  2769. } else if (N.z == 0) {
  2770. //x与pullPos相等
  2771. var x = P.x;
  2772. if (O.y == A.y) {
  2773. console.log('一样??');
  2774. return;
  2775. }
  2776. if (A.y == y) {
  2777. console.log('一样2??');
  2778. return;
  2779. }
  2780. if (A.x == x) {
  2781. console.log('一样3??');
  2782. return;
  2783. }
  2784. var r = (O.x - x) / (A.x - x);
  2785. var y = (r * A.y - O.y) / (r - 1);
  2786. var z = (r * A.z - O.z) / (r - 1);
  2787. }
  2788. }
  2789. return new THREE.Vector3(x, y, z);
  2790. },
  2791. getMouseIntersect: function getMouseIntersect(camera, meshes, mouse) {
  2792. //获取鼠标和meshes交点
  2793. var raycaster = new THREE.Raycaster();
  2794. camera.updateMatrixWorld();
  2795. var origin = new THREE.Vector3(mouse.x, mouse.y, -1).unproject(camera),
  2796. end = new THREE.Vector3(mouse.x, mouse.y, 1).unproject(camera);
  2797. var dir = end.sub(origin).normalize();
  2798. raycaster.set(origin, dir);
  2799. meshes.forEach(function (e) {
  2800. raycaster.layers.enable(math$2.getBaseLog(2, e.layers.mask));
  2801. });
  2802. var n = raycaster.intersectObjects(meshes);
  2803. if (0 === n.length) return null;
  2804. var i = n.find(function (e) {
  2805. return e.object.visible === true;
  2806. });
  2807. if (i) return i;
  2808. return null;
  2809. },
  2810. ifIntersectChunks: function ifIntersectChunks(A, B, model) {
  2811. var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
  2812. //获取某个线段/射线和meshes的交点
  2813. var dir = B.clone().sub(A).normalize();
  2814. var len = options.InfinityLen ? Infinity : A.distanceTo(B) + (options.extLen || 0);
  2815. if (len == 0) return;
  2816. var ray = new THREE.Raycaster(A.clone(), dir, 0, len);
  2817. var meshes = options.meshes || [];
  2818. if (meshes.length == 0) {
  2819. meshes = model.floors.reduce(function (e, t) {
  2820. return t.hidden ? e : e.concat(t.collider.children);
  2821. }, meshes);
  2822. }
  2823. var o = ray.intersectObjects(meshes); //var o = ray.intersectObjects(options.meshes || model.colliders)
  2824. if (o && o.length) return o;
  2825. if (options.throughWidth) {
  2826. //允许最小宽度,防止穿过极小的缝隙导致撞墙感
  2827. var normal = math$2.getNormal({
  2828. points: [{
  2829. x: A.x,
  2830. y: A.z
  2831. }, {
  2832. x: B.x,
  2833. y: B.z
  2834. }]
  2835. }); //线段法线
  2836. normal.multiplyScalar(options.throughWidth);
  2837. var normalVec3 = new THREE.Vector3(normal.x, 0, normal.y);
  2838. var A2 = A.clone().add(normalVec3);
  2839. ray.set(A2, dir);
  2840. var o2 = ray.intersectObjects(options.meshes || model.colliders);
  2841. ray.set(A.clone().add(normalVec3.negate()), dir);
  2842. if (o2 && o2.length) return o2;
  2843. var o3 = ray.intersectObjects(options.meshes || model.colliders);
  2844. if (o3 && o3.length) return o3;
  2845. }
  2846. return null;
  2847. },
  2848. /* getPosAtSphere : function(pos3d, toPanoPos){
  2849. var dir = pos3d.clone().sub(toPanoPos);
  2850. dir.normalize();//然后计算在球中
  2851. dir.multiplyScalar(Constants.skyRadius);
  2852. dir.add(toPanoPos);
  2853. return dir;
  2854. }, */
  2855. getVisiblePano: function getVisiblePano(position, model) {
  2856. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  2857. //获取某个坐标的可见pano。即没有遮挡的位置。
  2858. var visiblePanos = []; //var wallDepth = 0.075, discScale = 0.06;
  2859. var B = position.clone();
  2860. var panos = options.panos || model.panos.list;
  2861. panos.forEach(function (pano) {
  2862. if (!pano.isAligned()) return;
  2863. var A = pano.position.clone();
  2864. var distance = A.distanceTo(B);
  2865. if (options.maxDis != void 0 && distance > options.maxDis) {
  2866. //超出这个距离不可见
  2867. //console.log('超出',pano.id, distance-options.maxDis)
  2868. return;
  2869. }
  2870. var ray = new THREE.Raycaster(A.clone(), B.clone().sub(A).normalize(), 0, distance - (options.tolerance || 0));
  2871. /* discScale / 2 - wallDepth */
  2872. var o = ray.intersectObjects(options.model || model.colliders, true);
  2873. /* if(o && o.length){
  2874. console.log('ex', pano.id, distance - o[0].distance)
  2875. }else console.log('visi',pano.id) */
  2876. if (!o || !o.length) visiblePanos.push(pano);
  2877. });
  2878. return visiblePanos;
  2879. },
  2880. raycastToFindFloor: function () {
  2881. //八个方向上寻找floor,返回碰撞到最多的floor
  2882. 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)];
  2883. return function (player, position) {
  2884. /* var floors = []; //有时候在建筑外侧,容易识别到其他层
  2885. var max = {floor:null,count:0};
  2886. for (var t = 0; t < e.length; t++) {
  2887. var i = new THREE.Raycaster(position.clone(), e[t].clone())
  2888. , n = i.intersectObjects(objects.model.colliders);
  2889. if (n.length){
  2890. var floor = n[0].object.parent.parent
  2891. var item = floors.find(item=>item.floor == floor)
  2892. if(item)item.len++
  2893. else floors.push({floor:floor , len:1})
  2894. }
  2895. }
  2896. floors.sort((a,b)=>{b.len-a.len})
  2897. if(floors[0]) return floors[0].floor */
  2898. var floors = [],
  2899. colliders = [],
  2900. floorScores = [];
  2901. for (var u in player.model.floors.list) {
  2902. //寻找高度区间
  2903. var floor = player.model.floors.list[u];
  2904. if (position.y >= floor.boundingBox.min.y && position.y <= floor.boundingBox.max.y) {
  2905. floors.push(floor);
  2906. colliders.push.apply(colliders, _toConsumableArray(floor.collider.children)); //在floor区间的话就添加
  2907. }
  2908. }
  2909. if (floors.length == 1) return floors[0];else if (floors.length > 1) {
  2910. //寻找 raycaster最多的floor
  2911. for (var t = 0; t < e.length; t++) {
  2912. var i = new THREE.Raycaster(position.clone(), e[t].clone()),
  2913. n = i.intersectObjects(colliders);
  2914. if (n.length) {
  2915. (function () {
  2916. var floor = n[0].object.parent.floor;
  2917. var item = floorScores.find(function (item) {
  2918. return item.floor == floor;
  2919. });
  2920. if (item) item.len++;else floorScores.push({
  2921. floor: floor,
  2922. len: 1
  2923. });
  2924. })();
  2925. }
  2926. }
  2927. floorScores.sort(function (a, b) {
  2928. b.len - a.len;
  2929. }); //可能数量一致
  2930. if (floorScores[0]) return floorScores[0].floor;else {
  2931. //如果找不到mesh,直接用boundingbox
  2932. floorScores = [];
  2933. floors.forEach(function (floor) {
  2934. var box = floor.boundingBox;
  2935. 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)];
  2936. var dis = 0;
  2937. points.forEach(function (p) {
  2938. return dis += p.distanceTo(position);
  2939. });
  2940. floorScores.push({
  2941. floor,
  2942. dis
  2943. });
  2944. });
  2945. floorScores.sort(function (a, b) {
  2946. a.dis - b.dis;
  2947. }); //选择boundingbox八个点到position最短的
  2948. return floorScores[0].floor;
  2949. }
  2950. } else {
  2951. //超出floor区间后要么是第一层,要么是最后一层(因为寻找最接近的)
  2952. if (position.y < player.model.floors.list[0].center.y) {
  2953. //比随意一层低 即 低于最低层
  2954. var floors = player.model.floors.list.sort(function (f1, f2) {
  2955. return f1.boundingBox.min.y - f2.boundingBox.min.y;
  2956. });
  2957. return floors[0];
  2958. } else {
  2959. var floors = player.model.floors.list.sort(function (f1, f2) {
  2960. return f2.boundingBox.max.y - f1.boundingBox.max.y;
  2961. });
  2962. return floors[0];
  2963. }
  2964. }
  2965. /* 思路笔记:1 即使1个面片都能成为floor,可能是底面,可能是墙
  2966. 2 且这个floor还不一定有panos
  2967. 3 根据上述特征 最好是根据在不同panos的visible来判断楼层
  2968. 4 但是存在一个bug : 漫游点和mesh之间可能不对应,也就是看上去在某个楼层,飞出后发现它对应的mesh是另一个。。(这个是明显错误。可以推给算法部)
  2969. 5 在漫游时和楼层无关,一直显示overlay的。所以重点是要让飞出来的mesh看上去和overlay对应。所以直接考虑mesh即可。这样可以避开4
  2970. */
  2971. };
  2972. }(),
  2973. getQuaByAim: function getQuaByAim(aim) {
  2974. var center = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new THREE.Vector3();
  2975. var up = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new THREE.Vector3(0, 1, 0);
  2976. //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
  2977. /* let aimQua = new THREE.Quaternion().setFromUnitVectors(//一个单位向量旋转到另一个单位向量的最短路径
  2978. forward, //2026.3:如果之后还要这种的就加参数吧
  2979. aim
  2980. .clone()
  2981. .sub(center)
  2982. .normalize()
  2983. ) */
  2984. var _ = new THREE.Matrix4().lookAt(center, aim, up),
  2985. aimQua = new THREE.Quaternion().setFromRotationMatrix(_); //这二者结果不一定相同,setFromUnitVectors可能使roll不为0
  2986. return aimQua;
  2987. },
  2988. getAimByQua: function getAimByQua(quaternion, center) {
  2989. return new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(center);
  2990. },
  2991. projectedRadius(radius, camera, distance, screenWidth, screenHeight) {
  2992. //from Potree
  2993. if (camera instanceof THREE.OrthographicCamera) {
  2994. return this.projectedRadiusOrtho(radius, camera.projectionMatrix, screenWidth, screenHeight);
  2995. } else if (camera instanceof THREE.PerspectiveCamera) {
  2996. return this.projectedRadiusPerspective(radius, camera.fov * Math.PI / 180, distance, screenHeight);
  2997. }
  2998. },
  2999. projectedRadiusPerspective(radius, fov, distance, screenHeight) {
  3000. var projFactor = 1 / Math.tan(fov / 2) / distance;
  3001. projFactor = projFactor * screenHeight / 2;
  3002. return radius * projFactor;
  3003. },
  3004. projectedRadiusOrtho(radius, proj, screenWidth, screenHeight) {
  3005. var p1 = new THREE.Vector4(0);
  3006. var p2 = new THREE.Vector4(radius);
  3007. p1.applyMatrix4(proj);
  3008. p2.applyMatrix4(proj);
  3009. p1 = new THREE.Vector3(p1.x, p1.y, p1.z);
  3010. p2 = new THREE.Vector3(p2.x, p2.y, p2.z);
  3011. p1.x = (p1.x + 1.0) * 0.5 * screenWidth;
  3012. p1.y = (p1.y + 1.0) * 0.5 * screenHeight;
  3013. p2.x = (p2.x + 1.0) * 0.5 * screenWidth;
  3014. p2.y = (p2.y + 1.0) * 0.5 * screenHeight;
  3015. return p1.distanceTo(p2);
  3016. }
  3017. };
  3018. 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); }; }
  3019. 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; } }
  3020. var geo = new THREE.PlaneBufferGeometry(1, 1);
  3021. var player$p;
  3022. var Sprite = /*#__PURE__*/function (_THREE$Mesh) {
  3023. _inherits(Sprite, _THREE$Mesh);
  3024. var _super = _createSuper$1Q(Sprite);
  3025. function Sprite() {
  3026. var _player;
  3027. var _this;
  3028. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  3029. _classCallCheck(this, Sprite);
  3030. _this = _super.call(this, geo, options.mat || new THREE.MeshBasicMaterial({
  3031. map: options.map,
  3032. color: 0xffffff,
  3033. transparent: true,
  3034. depthTest: false,
  3035. depthWrite: false
  3036. }));
  3037. player$p || (player$p = options.player);
  3038. _this.root = options.root || _assertThisInitialized(_this);
  3039. _this.renderOrder = options.renderOrder != void 0 ? options.renderOrder : 4;
  3040. _this.pickOrder = options.pickOrder || 0;
  3041. _this.sizeInfo = options.sizeInfo;
  3042. _this.fixOrient = options.fixOrient;
  3043. _this.options = options;
  3044. options.transform2D && (_this.position.x = options.transform2D.x, _this.position.y = options.transform2D.y); //偏移
  3045. _this.name = options.name || 'sprite';
  3046. _this.useViewport = null;
  3047. _this.visible_ = true;
  3048. _this.events = {
  3049. updatePose: _this.update.bind(_assertThisInitialized(_this))
  3050. };
  3051. (_player = player$p) === null || _player === void 0 ? void 0 : _player.on('update', _this.events.updatePose);
  3052. _this.root.addEventListener('isVisible', function (e) {
  3053. if (e.visible) {
  3054. _this.update();
  3055. }
  3056. });
  3057. return _this;
  3058. }
  3059. _createClass(Sprite, [{
  3060. key: "waitUpdate",
  3061. value: function waitUpdate() {
  3062. this.needsUpdate = true; //this.matrixMap.clear()//清空后在所有viewport上都必须更新才能渲染
  3063. }
  3064. /* realVisible() {
  3065. if (!this.visible && this.unvisibleReasons && this.unvisibleReasons.some(e => e.reason != 'unableCompute')) {
  3066. return false
  3067. }
  3068. return common.realVisible(this.root)
  3069. } */
  3070. }, {
  3071. key: "realVisible",
  3072. value: function realVisible() {
  3073. if (!this.visible && this.unvisibleReasons && this.unvisibleReasons.some(function (e) {
  3074. return e.reason != 'unableCompute';
  3075. })) {
  3076. return false;
  3077. }
  3078. return _get(_getPrototypeOf(Sprite.prototype), "realVisible", this).call(this.root);
  3079. }
  3080. }, {
  3081. key: "update",
  3082. value: function update() {
  3083. var _this2 = this;
  3084. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  3085. _ref$lastFrameChanged = _ref.lastFrameChanged,
  3086. lastFrameChanged = _ref$lastFrameChanged === void 0 ? 'level3' : _ref$lastFrameChanged;
  3087. if (lastFrameChanged && lastFrameChanged.split('level')[1] > 1) this.needsUpdate = true; //飞出后总是在微小地变几乎看不出来,忽略
  3088. if (!this.realVisible() || !this.needsUpdate) return;
  3089. this.needsUpdate = false;
  3090. if (!this.fixOrient) {
  3091. //orthoCamera一般要加dontFixOrient
  3092. var orient2dAngle;
  3093. if (this.root.lineDir) {
  3094. this.root.updateMatrix(); //先更新,getWorldPosition才能得到正确的
  3095. this.root.updateMatrixWorld(true);
  3096. var center = this.root.getWorldPosition(new THREE.Vector3()); //由于两个端点容易在屏幕外,所以使用center和center加dir
  3097. var setVisi = function setVisi(state) {
  3098. //this.visiMap.set(e.viewport, state)
  3099. common$1.updateVisible(_this2, 'unableCompute', !!state); //赋值原先的,否则之后每次render都触发update:
  3100. /* this.matrixMap.set(e.viewport, this.matrix.clone())
  3101. this.matrixMapRoot.set(e.viewport, this.root.matrix.clone()) */
  3102. };
  3103. var r1 = convertTool.getPos2d(center, player$p);
  3104. if (!r1.trueSide) return setVisi(false); // 但这句会使realVisible为false从而无法更新//console.error('!r1.trueSide') //中心点如果在背面直接不渲染了
  3105. var r2, point2;
  3106. var p2State = '',
  3107. len = 1,
  3108. p2StateHistory = [];
  3109. while (p2State != 'got' && p2StateHistory.length < 10) {
  3110. point2 = center.clone().add(this.root.lineDir.clone().multiplyScalar(len));
  3111. r2 = convertTool.getPos2d(point2, player$p);
  3112. if (!r2.trueSide) {
  3113. //很少遇到点2在背面的
  3114. if (!p2StateHistory.includes('tooLong-reverse')) {
  3115. p2State = 'tooLong-reverse'; //先尝试反向
  3116. len = -len;
  3117. } else {
  3118. p2State = 'tooLong';
  3119. len = len / 2;
  3120. }
  3121. } else {
  3122. var dis = r2.pos.distanceTo(r1.pos);
  3123. if (math$2.closeTo(dis, 0)) {
  3124. //console.log('dis == 0')
  3125. return setVisi(false);
  3126. }
  3127. if (dis < 10 && !p2StateHistory.includes('tooLong')) {
  3128. //和r1的屏幕距离太近,要加长,否则精度过低
  3129. p2State = 'tooShort';
  3130. len = 100 / dis * len;
  3131. } else {
  3132. p2State = 'got';
  3133. break;
  3134. }
  3135. }
  3136. p2StateHistory.push(p2State);
  3137. } //console.log(p2StateHistory,len)
  3138. if (!r2.trueSide) {
  3139. return setVisi(false); //, console.log(' !r2.trueSide', )
  3140. }
  3141. var p1 = r1.pos,
  3142. p2 = r2.pos;
  3143. if (p2StateHistory.filter(function (e) {
  3144. return e == 'tooLong-reverse';
  3145. }).length % 2 == 1) {
  3146. p2 = r1.pos, p1 = r2.pos;
  3147. }
  3148. var vec = new THREE.Vector2().subVectors(p1, p2);
  3149. orient2dAngle = -vec.angle(); //根据测量线在屏幕上的角度在旋转label,使之和屏幕上的二维线平行。
  3150. var y = Math.abs(this.position.y);
  3151. var facePlane = this.root.measure && this.root.measure.facePlane;
  3152. var eyeDir = new THREE.Vector3().subVectors(center, player$p.position);
  3153. var clockWise = facePlane && facePlane.normal.dot(eyeDir) < 0;
  3154. if (p1.x < p2.x) {
  3155. orient2dAngle += Math.PI; //避免字是倒着的情况。(使字一直在线的下方)
  3156. clockWise != void 0 && (this.position.y = clockWise ? y : -y);
  3157. } else {
  3158. clockWise != void 0 && (this.position.y = clockWise ? -y : y); //使area类型的edgeLabel都在外侧
  3159. } //this.parent.text && console.log(this.parent.text, clockWise, this.position.y, e.viewport.name /* THREE.Math.radToDeg(angle), p1.x < p2.x */ )
  3160. setVisi(true);
  3161. }
  3162. var parentQua = this.root.parent.getWorldQuaternion(new THREE.Quaternion());
  3163. this.root.quaternion.multiplyQuaternions(parentQua.invert(), player$p.quaternion); //乘上parentQua.invert()是为了中和掉父结点的qua,使只剩下camera.quaternion
  3164. if (orient2dAngle) {
  3165. var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), orient2dAngle);
  3166. this.root.quaternion.multiply(qua);
  3167. }
  3168. }
  3169. if (this.sizeInfo) {
  3170. //window.logSprite || (this.log111 = window.logSprite = true)
  3171. var s = math$2.getScaleForConstantSize(Object.assign({
  3172. player: player$p,
  3173. log: this.log111
  3174. }, this.sizeInfo, {
  3175. //farBound: player.mode == 'floorplan' ? this.sizeInfo.farBoundPlan || this.sizeInfo.farBound : this.sizeInfo.farBound,
  3176. position: this.root.getWorldPosition(new THREE.Vector3())
  3177. }));
  3178. this.root.scale.set(s, s, s);
  3179. }
  3180. this.afterUpdate && this.afterUpdate();
  3181. }
  3182. }, {
  3183. key: "dispose",
  3184. value: function dispose() {
  3185. var _this$parent, _player2;
  3186. this.material.dispose();
  3187. (_this$parent = this.parent) === null || _this$parent === void 0 ? void 0 : _this$parent.remove(this);
  3188. this.dispatchEvent('dispose');
  3189. this.events.updatePos && ((_player2 = player$p) === null || _player2 === void 0 ? void 0 : _player2.off('update', this.events.updatePose));
  3190. this._listeners = [];
  3191. }
  3192. }]);
  3193. return Sprite;
  3194. }(THREE.Mesh);
  3195. function _createForOfIteratorHelper$d(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$d(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; } } }; }
  3196. function _unsupportedIterableToArray$d(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$d(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$d(o, minLen); }
  3197. function _arrayLikeToArray$d(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; }
  3198. 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); }; }
  3199. 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; } }
  3200. var TextSprite = /*#__PURE__*/function (_THREE$Object3D) {
  3201. _inherits(TextSprite, _THREE$Object3D);
  3202. var _super = _createSuper$1P(TextSprite);
  3203. function TextSprite() {
  3204. var _this;
  3205. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  3206. _classCallCheck(this, TextSprite);
  3207. _this = _super.call(this);
  3208. var map = new THREE.Texture();
  3209. map.minFilter = THREE.LinearFilter; //缩小效果都不好,sizeInfo尽量放大些,用框选工具测出像素宽度大于map.image.width即可
  3210. map.magFilter = THREE.NearestFilter; //试过 放大后可以很清晰
  3211. map.anisotropy = map.anisotropy__ = options.fixOrient ? 4 : 1;
  3212. _this.sprite = new Sprite(Object.assign({
  3213. root: _assertThisInitialized(_this)
  3214. }, options, {
  3215. map
  3216. }));
  3217. _this.add(_this.sprite);
  3218. _this.fontWeight = options.fontWeight == void 0 ?
  3219. /* 'Bold' */
  3220. '' : options.fontWeight;
  3221. _this.rectBorderThick = options.rectBorderThick || 0;
  3222. _this.textBorderThick = options.textBorderThick || 0;
  3223. _this.fontface = 'Arial';
  3224. _this.fontsize = options.fontsize || 16;
  3225. _this.textBorderColor = options.textBorderColor ? common$1.CloneObject(options.textBorderColor) : {
  3226. r: 0,
  3227. g: 0,
  3228. b: 0,
  3229. a: 1.0
  3230. };
  3231. _this.backgroundColor = options.backgroundColor ? common$1.CloneObject(options.backgroundColor) : {
  3232. r: 255,
  3233. g: 255,
  3234. b: 255,
  3235. a: 0.7
  3236. };
  3237. _this.textColor = options.textColor ? common$1.CloneObject(options.textColor) : {
  3238. r: 0,
  3239. g: 0,
  3240. b: 0,
  3241. a: 1.0
  3242. };
  3243. _this.borderColor = options.borderColor || {
  3244. r: 0,
  3245. g: 0,
  3246. b: 0,
  3247. a: 0.0
  3248. };
  3249. _this.borderRadius = options.borderRadius == void 0 ? 6 : options.borderRadius;
  3250. _this.margin = options.margin;
  3251. _this.textshadowColor = options.textshadowColor;
  3252. _this.textAlign = options.textAlign || 'center';
  3253. _this.name = options.name;
  3254. _this.sizeInfo = options.sizeInfo;
  3255. _this.lineSpace = options.lineSpace;
  3256. _this.maxLineWidth = options.maxLineWidth;
  3257. _this.addEventListener('dispose', _this.dispose.bind(_assertThisInitialized(_this)));
  3258. _this.fixOrient = options.fixOrient;
  3259. _this.transform2Dpercent = options.transform2Dpercent;
  3260. _this.dontBreakWords = options.dontBreakWords;
  3261. _this.setText(options.text);
  3262. _this.updatePose();
  3263. return _this;
  3264. }
  3265. _createClass(TextSprite, [{
  3266. key: "updatePose",
  3267. value: function updatePose() {
  3268. this.sprite.waitUpdate();
  3269. }
  3270. }, {
  3271. key: "setText",
  3272. value: function setText(text) {
  3273. if (text == void 0) text = '';
  3274. if (this.text !== text) {
  3275. if (!(text instanceof Array)) {
  3276. this.text = (text + '').split('\n'); //如果是input手动输入的\n这里会是\\n且不会被拆分, 绘制的依然是\n。
  3277. //this.text = [text + '']
  3278. } else this.text = text;
  3279. this.updateTexture();
  3280. }
  3281. }
  3282. }, {
  3283. key: "setPos",
  3284. value: function setPos(pos) {
  3285. this.position.copy(pos);
  3286. this.sprite.waitUpdate();
  3287. }
  3288. }, {
  3289. key: "setTextColor",
  3290. value: function setTextColor(color) {
  3291. this.textColor = color;
  3292. this.updateTexture();
  3293. }
  3294. }, {
  3295. key: "tranColor",
  3296. value: function tranColor(c) {
  3297. var a = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  3298. if (c.isVector4) a = c.w;else if (!c.isColor) c = new THREE.Color(c);
  3299. return {
  3300. r: c.r * 255,
  3301. g: c.g * 255,
  3302. b: c.b * 255,
  3303. a
  3304. };
  3305. }
  3306. }, {
  3307. key: "setBorderColor",
  3308. value: function setBorderColor(color) {
  3309. this.borderColor = color;
  3310. this.updateTexture();
  3311. }
  3312. }, {
  3313. key: "setBackgroundColor",
  3314. value: function setBackgroundColor(color) {
  3315. this.backgroundColor = color;
  3316. this.updateTexture();
  3317. }
  3318. }, {
  3319. key: "setVisible",
  3320. value: function setVisible(v) {
  3321. this.visible = v;
  3322. }
  3323. }, {
  3324. key: "setUniforms",
  3325. value: function setUniforms(name, value) {
  3326. this.sprite.setUniforms(name, value);
  3327. }
  3328. }, {
  3329. key: "updateTexture",
  3330. value: function updateTexture() {
  3331. var _this2 = this;
  3332. //canvas原点在左上角
  3333. var canvas = document.createElement('canvas');
  3334. var context = canvas.getContext('2d');
  3335. var r = window.devicePixelRatio; //不乘会模糊
  3336. context.font = this.fontWeight + ' ' + this.fontsize * r + 'px ' + this.fontface; //context["font-weight"] = 100; //语法与 CSS font 属性相同。
  3337. var textMaxWidth = 0,
  3338. infos = [];
  3339. context.textBaseline = 'alphabetic';
  3340. var textHeightAll = 0;
  3341. var texts = [];
  3342. if (this.maxLineWidth) {
  3343. this.text.forEach(function (words) {
  3344. if (!words) {
  3345. texts.push('');
  3346. return;
  3347. }
  3348. texts = texts.concat(
  3349. /*breakLinesForCanvas */
  3350. wrapText(words, context, _this2.maxLineWidth * r, _this2.dontBreakWords));
  3351. });
  3352. } else {
  3353. texts = this.text;
  3354. }
  3355. var _iterator = _createForOfIteratorHelper$d(texts),
  3356. _step;
  3357. try {
  3358. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  3359. var text = _step.value;
  3360. var metrics = context.measureText(text);
  3361. var textWidth = metrics.width;
  3362. infos.push(metrics);
  3363. textMaxWidth = Math.max(textMaxWidth, textWidth);
  3364. textHeightAll += metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent; //文字真实高度
  3365. }
  3366. } catch (err) {
  3367. _iterator.e(err);
  3368. } finally {
  3369. _iterator.f();
  3370. }
  3371. var margin = (this.margin ? new THREE.Vector2().copy(this.margin) : new THREE.Vector2(this.fontsize, this.fontsize * 0.8)).multiplyScalar(r);
  3372. var lineSpace = (this.lineSpace || this.fontsize * 0.5) * r;
  3373. var rectBorderThick = this.rectBorderThick * r,
  3374. textBorderThick = this.textBorderThick * r;
  3375. var spriteWidth = 2 * (margin.x + rectBorderThick + textBorderThick) + textMaxWidth; //还要考虑this.textshadowColor,太麻烦了不写了
  3376. var spriteHeight = 2 * (margin.y + rectBorderThick + textBorderThick * texts.length) + lineSpace * (texts.length - 1) + textHeightAll; //canvas宽高只会向下取整数,所以为了防止拉伸模糊这里必须先取整
  3377. spriteWidth = Math.floor(spriteWidth);
  3378. spriteHeight = Math.floor(spriteHeight);
  3379. context.canvas.width = spriteWidth;
  3380. context.canvas.height = spriteHeight;
  3381. context.font = this.fontWeight + ' ' + this.fontsize * r + 'px ' + this.fontface; //为何要再写一遍??
  3382. context.strokeStyle = 'rgba(' + this.borderColor.r + ',' + this.borderColor.g + ',' + this.borderColor.b + ',' + this.borderColor.a + ')';
  3383. context.lineWidth = rectBorderThick;
  3384. context.fillStyle = 'rgba(' + this.backgroundColor.r + ',' + this.backgroundColor.g + ',' + this.backgroundColor.b + ',' + this.backgroundColor.a + ')';
  3385. this.roundRect(context, rectBorderThick / 2, rectBorderThick / 2, spriteWidth - rectBorderThick, spriteHeight - rectBorderThick, this.borderRadius * r);
  3386. context.fillStyle = 'rgba(' + this.textColor.r + ',' + this.textColor.g + ',' + this.textColor.b + ',' + this.textColor.a + ')';
  3387. var y = margin.y + rectBorderThick;
  3388. for (var i = 0; i < texts.length; i++) {
  3389. //文字y向距离从textBaseline向上算
  3390. var actualBoundingBoxAscent = infos[i].fontBoundingBoxAscent == void 0 ? this.fontsize * r * 0.8 : infos[i].fontBoundingBoxAscent; //有的流览器没有。只能大概给一个
  3391. y += actualBoundingBoxAscent + textBorderThick;
  3392. var textLeftSpace = this.textAlign == 'center' ? (textMaxWidth - infos[i].width) / 2 : this.textAlign == 'left' ? 0 : textMaxWidth - infos[i].width;
  3393. var x = rectBorderThick + textBorderThick + margin.x + textLeftSpace; // text color
  3394. if (this.textBorderThick) {
  3395. context.strokeStyle = 'rgba(' + this.textBorderColor.r + ',' + this.textBorderColor.g + ',' + this.textBorderColor.b + ',' + this.textBorderColor.a + ')';
  3396. context.lineWidth = this.textBorderThick * r;
  3397. context.strokeText(texts[i], x, y);
  3398. }
  3399. if (this.textshadowColor) {
  3400. context.shadowOffsetX = 0;
  3401. context.shadowOffsetY = 0;
  3402. context.shadowColor = this.textshadowColor; //'red'
  3403. context.shadowBlur = (this.textShadowBlur || this.fontsize / 6) * r;
  3404. }
  3405. context.fillText(texts[i], x, y);
  3406. var actualBoundingBoxDescent = infos[i].fontBoundingBoxDescent == void 0 ? this.fontsize * r * 0.2 : infos[i].fontBoundingBoxDescent;
  3407. y += actualBoundingBoxDescent + textBorderThick + lineSpace;
  3408. }
  3409. var map = this.sprite.material.map;
  3410. map.image = canvas;
  3411. {
  3412. map.anisotropy++;
  3413. map.dispose(); // 关键!释放旧 GPU 纹理, 否则贴图更新不完整(这个版本THREE会这样)
  3414. map.needsUpdate = true;
  3415. this.sprite.onBeforeRender = function () {
  3416. var _map$_listeners, _map$_listeners$dispo;
  3417. //有的还需要这样改anisotropy再恢复,如Tag3d,不知为何
  3418. if ((_map$_listeners = map._listeners) !== null && _map$_listeners !== void 0 && (_map$_listeners$dispo = _map$_listeners.dispose) !== null && _map$_listeners$dispo !== void 0 && _map$_listeners$dispo.length) {
  3419. map.anisotropy = map.anisotropy__; //console.log('onBeforeRender')
  3420. _this2.sprite.onBeforeRender = function () {};
  3421. }
  3422. };
  3423. }
  3424. var oldScale = this.sprite.scale.clone();
  3425. this.sprite.scale.set(spriteWidth * 0.01 / r, spriteHeight * 0.01 / r, 1.0);
  3426. if (!oldScale.equals(this.sprite.scale)) {
  3427. this.updateTransform2D();
  3428. this.sprite.waitUpdate(); //重新计算各个viewport的matrix
  3429. }
  3430. }
  3431. }, {
  3432. key: "roundRect",
  3433. value: function roundRect(ctx, x, y, w, h, r) {
  3434. ctx.beginPath();
  3435. ctx.moveTo(x + r, y);
  3436. ctx.lineTo(x + w - r, y);
  3437. ctx.arcTo(x + w, y, x + w, y + r, r); //圆弧。前四个参数同quadraticCurveTo
  3438. //ctx.quadraticCurveTo(x + w, y, x + w, y + r); //二次贝塞尔曲线需要两个点。第一个点是用于二次贝塞尔计算中的控制点,第二个点是曲线的结束点。
  3439. ctx.lineTo(x + w, y + h - r);
  3440. ctx.arcTo(x + w, y + h, x + w - r, y + h, r);
  3441. ctx.lineTo(x + r, y + h);
  3442. ctx.arcTo(x, y + h, x, y + h - r, r);
  3443. ctx.lineTo(x, y + r);
  3444. ctx.arcTo(x, y, x + r, y, r);
  3445. ctx.closePath();
  3446. ctx.fill();
  3447. ctx.stroke();
  3448. }
  3449. }, {
  3450. key: "updateTransform2D",
  3451. value: function updateTransform2D() {
  3452. var _this3 = this;
  3453. if (this.transform2Dpercent) {
  3454. ['x', 'y'].forEach(function (axis) {
  3455. var percent = _this3.transform2Dpercent[axis];
  3456. _this3.sprite.position.y = _this3.sprite.scale.y * percent;
  3457. });
  3458. }
  3459. }
  3460. }, {
  3461. key: "dispose",
  3462. value: function dispose() {
  3463. this.sprite.material.map.dispose();
  3464. this.parent && this.parent.remove(this);
  3465. this.sprite.dispatchEvent({
  3466. type: 'dispose'
  3467. });
  3468. this._listeners = [];
  3469. }
  3470. }]);
  3471. return TextSprite;
  3472. }(THREE.Object3D); // 文字换行算法
  3473. function wrapText(text, context, maxWidth, dontBreakWords) {
  3474. //deepseek版 dontBreakWords: for english 一个单词不要分开,符号不要换到下一行开头(也无法单独一行……)
  3475. var lines = [];
  3476. var words = dontBreakWords ? text.split(' ') : [text];
  3477. var currentLine = '';
  3478. for (var i = 0; i < words.length; i++) {
  3479. var word = words[i];
  3480. var width = context.measureText(currentLine + word).width;
  3481. if (width < maxWidth) {
  3482. currentLine += (currentLine ? ' ' : '') + word;
  3483. } else {
  3484. // 处理标点符号不能在行首的情况 dontBreakWords时失效,干脆去掉( 还依赖空格,效果不好)
  3485. if (!dontBreakWords && /^[.,!?;:)]/.test(word)) {
  3486. // 将标点符号移到上一行末尾
  3487. var lastLine = lines.pop() || '';
  3488. lines.push(lastLine + word.charAt(0));
  3489. word = word.substring(1);
  3490. } // 如果单词本身超过最大宽度,强制拆分
  3491. if (context.measureText(word).width > maxWidth) {
  3492. if (currentLine) lines.push(currentLine);
  3493. currentLine = '';
  3494. while (word.length > 0) {
  3495. var splitIndex = 1;
  3496. while (splitIndex < word.length && context.measureText(word.substring(0, splitIndex)).width < maxWidth) {
  3497. splitIndex++;
  3498. }
  3499. lines.push(word.substring(0, splitIndex));
  3500. word = word.substring(splitIndex);
  3501. }
  3502. } else {
  3503. if (currentLine) lines.push(currentLine);
  3504. currentLine = word;
  3505. }
  3506. }
  3507. }
  3508. if (currentLine) {
  3509. lines.push(currentLine);
  3510. }
  3511. return lines;
  3512. } //------
  3513. //'使用很寻常的二分查找,如果某一个位置之前的文字宽度小于等于设定的宽度,并且它之后一个字之前的文字宽度大于设定的宽度,那么这个位置就是文本的换行点。上面只是找到一个换行点,对于输入的一段文本,需要循环查找,直到不存在这样的换行点为止, 完整的代码如下',
  3514. function _createForOfIteratorHelper$c(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$c(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; } } }; }
  3515. function _unsupportedIterableToArray$c(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$c(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$c(o, minLen); }
  3516. function _arrayLikeToArray$c(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; }
  3517. var lastCallTime = 0;
  3518. var common = {
  3519. delayOneFrame(e) {
  3520. window.setTimeout(e, 1);
  3521. },
  3522. normalizeUrl(e) {
  3523. return e.replace('https://', 'http://');
  3524. },
  3525. domainFromUrl(e) {
  3526. var t = /^([^:]*:\/\/)?(www\.)?([^\/]+)/.exec(e);
  3527. return t ? t[3] : e;
  3528. },
  3529. average(e, t) {
  3530. if (0 === e.length) return null;
  3531. for (var i = 0, n = 0, r = 0; r < e.length; r++) {
  3532. var o = t ? e[r][t] : e[r];
  3533. i += o, n++;
  3534. }
  3535. return i / n;
  3536. },
  3537. countUnique(e) {
  3538. for (var t = {}, i = 0; i < e.length; i++) {
  3539. t[e[i]] = 1 + (t[e[i]] || 0);
  3540. }
  3541. return Object.keys(t).length;
  3542. },
  3543. averageVectors(e, t) {
  3544. var i = new THREE.Vector3();
  3545. if (0 === e.length) return i;
  3546. for (var r = 0, o = 0; o < e.length; o++) {
  3547. var a = t ? e[o][t] : e[o];
  3548. i.add(a), r++;
  3549. }
  3550. return i.divideScalar(r);
  3551. },
  3552. equalLists(e, t) {
  3553. if (e.length !== t.length) return !1;
  3554. for (var i = 0; i < e.length; i++) {
  3555. if (e[i] !== t[i]) return !1;
  3556. }
  3557. return !0;
  3558. },
  3559. lowerMedian(e, t) {
  3560. if (0 === e.length) return null;
  3561. t = t || 2, e.sort(function (e, t) {
  3562. return e - t;
  3563. });
  3564. var i = Math.floor(e.length / t);
  3565. return e[i];
  3566. },
  3567. stableSort(e, t) {
  3568. return e.map(function (e, t) {
  3569. return {
  3570. value: e,
  3571. index: t
  3572. };
  3573. }).sort(function (e, i) {
  3574. var n = t(e.value, i.value);
  3575. return 0 !== n ? n : e.index - i.index;
  3576. }).map(function (e) {
  3577. return e.value;
  3578. });
  3579. },
  3580. sortByScore: function sortByScore(list, request, rank) {
  3581. var i = request ? common.filterAll(list, request) : list;
  3582. return 0 === i.length ? [] : i = i.map(function (e) {
  3583. var scores = rank.map(function (f) {
  3584. return f(e);
  3585. }); //add
  3586. return {
  3587. item: e,
  3588. scores,
  3589. score: scores.reduce(function (t, i) {
  3590. return t + i;
  3591. }, 0)
  3592. };
  3593. }).sort(function (e, t) {
  3594. return t.score - e.score;
  3595. });
  3596. },
  3597. filterAll(e, t) {
  3598. return e.filter(function (e) {
  3599. return t.every(function (t) {
  3600. return t(e);
  3601. });
  3602. });
  3603. },
  3604. formatDate(e) {
  3605. return [e.getFullYear(), e.getMonth() + 1, e.getDate()].join('-');
  3606. },
  3607. formatDatetime(e) {
  3608. return [e.getFullYear(), e.getMonth() + 1, e.getDate(), e.getHours(), e.getMinutes()].join('-');
  3609. },
  3610. randomString(e) {
  3611. for (var t = '', i = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', n = 0; n < e; n++) {
  3612. t += i.charAt(Math.floor(Math.random() * i.length));
  3613. }
  3614. return t;
  3615. },
  3616. uint8ToBase64(e, t) {
  3617. t && 'number' == typeof t || (t = 8192);
  3618. for (var i = [], n = 0; n < e.length; n += t) {
  3619. i.push(String.fromCharCode.apply(null, e.subarray(n, n + t)));
  3620. }
  3621. return btoa(i.join(''));
  3622. },
  3623. uuid4: function e(t) {
  3624. return t ? (t ^ 16 * Math.random() >> t / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, e);
  3625. },
  3626. nth(e) {
  3627. return e %= 10, 1 === e ? e + 'st' : 2 === e ? e + 'nd' : 3 === e ? e + 'rd' : e + 'th';
  3628. },
  3629. extendObject(e, t) {
  3630. return Object.keys(t).forEach(function (i) {
  3631. e[i] = t[i];
  3632. }), e;
  3633. },
  3634. deepExtend: function e(t) {
  3635. t = t || {};
  3636. for (var i = 1; i < arguments.length; i++) {
  3637. var n = arguments[i];
  3638. if (n) for (var r in n) {
  3639. n.hasOwnProperty(r) && ('object' == typeof n[r] ? t[r] = e(t[r], n[r]) : t[r] = n[r]);
  3640. }
  3641. }
  3642. return t;
  3643. },
  3644. inherit(e, t) {
  3645. e.prototype = Object.create(t.prototype), e.prototype.constructor = e;
  3646. },
  3647. extend(e, t) {
  3648. for (var i in t.prototype) {
  3649. e.prototype[i] = t.prototype[i];
  3650. }
  3651. },
  3652. //额外添加的
  3653. extendObject(e, t) {
  3654. if (!(t instanceof Object)) return; //许钟文 加 ie有遇到非object的数据
  3655. return Object.keys(t).forEach(function (i) {
  3656. e[i] = t[i];
  3657. }), e;
  3658. },
  3659. _textureCache: {},
  3660. loadTextureFromCache(c, onLoad_) {
  3661. var _this = this;
  3662. if (this._textureCache[c]) {
  3663. //xzw 改 同时加载同一张图,都会执行回调
  3664. if (this._textureCache[c].image) {
  3665. onLoad_ && setTimeout(function () {
  3666. onLoad_(_this._textureCache[c]);
  3667. }, 1); //wait, return tex first
  3668. } else {
  3669. onLoad_ && this._textureCache[c].loadCallbacks.push(onLoad_);
  3670. }
  3671. } else {
  3672. this._textureCache[c] = getTexture(c);
  3673. this._textureCache[c].loadCallbacks = [];
  3674. onLoad_ && this._textureCache[c].loadCallbacks.push(onLoad_);
  3675. }
  3676. return this._textureCache[c]; //return this._textureCache[c] || (this._textureCache[c] = getTexture(c, onLoad)), this._textureCache[c]
  3677. },
  3678. extend(c, d) {
  3679. for (var f in d.prototype) {
  3680. c.prototype[f] = d.prototype[f];
  3681. }
  3682. },
  3683. valueFromHash(e, t) {
  3684. var i = new RegExp('[#&?]' + e + '=([^#&?]*)'),
  3685. n = i.exec(window.location.href);
  3686. if (!n) return t;
  3687. var r = n[1];
  3688. return 'boolean' == typeof t ? 'true' === r || '1' === r : 'number' == typeof t ? parseFloat(r) : window.decodeURIComponent(r);
  3689. },
  3690. deepFreeze(o) {
  3691. var _this2 = this;
  3692. Object.freeze(o);
  3693. Object.getOwnPropertyNames(o).forEach(function (prop) {
  3694. if (o.hasOwnProperty(prop) && o[prop] !== null && (typeof o[prop] === 'object' || typeof o[prop] === 'function') && !Object.isFrozen(o[prop])) {
  3695. _this2.deepFreeze(o[prop]);
  3696. }
  3697. });
  3698. return o;
  3699. },
  3700. defaultValue(value) {
  3701. if (value != void 0 && typeof value === 'object') {
  3702. return Array.isArray(value) ? [] : {};
  3703. }
  3704. },
  3705. randomUnique() {
  3706. return crypto.getRandomValues(new Uint32Array(1))[0];
  3707. },
  3708. debounce(fn, delay) {
  3709. var isImmediateCall = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  3710. var timer = null; // 上次调用的时刻
  3711. if (isImmediateCall) {
  3712. return function () {
  3713. var context = this;
  3714. var currentTime = Date.now();
  3715. if (currentTime - lastCallTime >= delay) {
  3716. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  3717. args[_key] = arguments[_key];
  3718. }
  3719. fn.apply(context, args);
  3720. lastCallTime = currentTime;
  3721. }
  3722. };
  3723. } else {
  3724. return function () {
  3725. for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  3726. args[_key2] = arguments[_key2];
  3727. }
  3728. if (timer) {
  3729. clearTimeout(timer);
  3730. }
  3731. var context = this;
  3732. timer = setTimeout(function () {
  3733. fn.apply(context, args);
  3734. }, delay);
  3735. };
  3736. }
  3737. },
  3738. getMixedSet: function getMixedSet(arr1, arr2) {
  3739. //交集
  3740. return arr1.filter(function (item) {
  3741. return arr2.includes(item);
  3742. });
  3743. },
  3744. getUnionSet: function getUnionSet(arr1, arr2) {
  3745. //并集
  3746. return arr1.concat(arr2.filter(function (item) {
  3747. return !arr1.includes(item);
  3748. }));
  3749. },
  3750. getDifferenceSet: function getDifferenceSet(arr1, arr2) {
  3751. //差集 不能识别重复的,如getDifferenceSet([1,2,2],[1,1,2]) 为空
  3752. var arr11 = arr1.filter(function (item) {
  3753. return !arr2.includes(item);
  3754. });
  3755. var arr22 = arr2.filter(function (item) {
  3756. return !arr1.includes(item);
  3757. });
  3758. return arr11.concat(arr22);
  3759. },
  3760. getDifferenceSetMuti: function getDifferenceSetMuti(arr) {
  3761. //收集绝对没有重复的元素,也就是判断出现次数=1的
  3762. var set = [];
  3763. arr.forEach(function (arr1) {
  3764. arr1.forEach(function (item) {
  3765. var index = set.indexOf(item);
  3766. if (index > -1) {
  3767. set.splice(index, 1);
  3768. } else {
  3769. set.push(item);
  3770. }
  3771. });
  3772. });
  3773. return set;
  3774. },
  3775. pushToGroupAuto: function pushToGroupAuto(items, groups, recognizeFunction, judgeRelationFun) {
  3776. //自动分组。 items是将分到一起的组合。items.length = 1 or 2.
  3777. var isSame = function isSame(a, b) {
  3778. return a == b || recognizeFunction && recognizeFunction(a, b);
  3779. };
  3780. var atGroups = groups.filter(function (group) {
  3781. return group.find(function (item) {
  3782. return (isSame(item, items[0]) || isSame(item, items[1])) && (!judgeRelationFun || judgeRelationFun(group));
  3783. } //根据关系进一步判断是否应该一组
  3784. );
  3785. });
  3786. if (atGroups.length) {
  3787. //在不同组
  3788. //因为items是一组的,所以先都放入组1
  3789. items.forEach(function (item) {
  3790. if (!atGroups[0].includes(item)) atGroups[0].push(item);
  3791. });
  3792. if (atGroups.length > 1) {
  3793. //如果在不同组,说明这两个组需要合并
  3794. var combineGroup = [];
  3795. combineGroup.relationships = [items.slice()];
  3796. atGroups.forEach(function (group) {
  3797. var relationships = common.getUnionSet(combineGroup.relationships, group.relationships);
  3798. combineGroup = common.getUnionSet(combineGroup, group);
  3799. combineGroup.relationships = relationships;
  3800. groups.splice(groups.indexOf(group), 1);
  3801. });
  3802. groups.push(combineGroup);
  3803. } else {
  3804. atGroups[0].relationships.push(items.slice());
  3805. }
  3806. } else {
  3807. //直接加入为一组
  3808. items.relationships = [items.slice()];
  3809. groups.push(items);
  3810. }
  3811. },
  3812. disconnectGroup: function disconnectGroup(pairs, groups, recognizeFunction) {
  3813. //将atGroup中的pairs关系解除,然后重新分组
  3814. var isSame = function isSame(a, b) {
  3815. return a == b || recognizeFunction && recognizeFunction(a, b);
  3816. };
  3817. var oldGroups = groups.slice();
  3818. pairs.forEach(function (items) {
  3819. var relationship;
  3820. var atGroup = groups.find(function (group) {
  3821. var r = group.relationships.find(function (arr) {
  3822. return items.every(function (e) {
  3823. return arr.some(function (a) {
  3824. return isSame(a, e);
  3825. });
  3826. });
  3827. });
  3828. if (r) {
  3829. relationship = r;
  3830. return true;
  3831. }
  3832. }); //能找到relationships 有包含items的, 代表它们有绑定关系
  3833. if (!atGroup) return; //断开连接时,因为组内没有其他成员的连接信息,所以需要清除整组,并将剩余的一个个重新连接
  3834. groups.splice(groups.indexOf(atGroup), 1); //删除
  3835. atGroup.relationships.splice(atGroup.relationships.indexOf(relationship), 1);
  3836. var newGroups_ = []; //为了防止裂解的该组(因之前有judgeRelationFun但现在没传)混入其他组,先放一个空组合里
  3837. atGroup.relationships.forEach(function (pair) {
  3838. //然后再重新生成这两个和组的关系,各自分组
  3839. common.pushToGroupAuto(pair, newGroups_, recognizeFunction);
  3840. });
  3841. groups.push.apply(groups, newGroups_);
  3842. });
  3843. var newGroups = groups.filter(function (e) {
  3844. return !oldGroups.includes(e);
  3845. });
  3846. return {
  3847. newGroups
  3848. };
  3849. },
  3850. removeFromGroup: function removeFromGroup(items, atGroup, groups, recognizeFunction) {
  3851. //将该组移除items中的所有元素,以及包含它的关系
  3852. var isSame = function isSame(a, b) {
  3853. return a == b || recognizeFunction && recognizeFunction(a, b);
  3854. };
  3855. var newRelations = atGroup.relationships.filter(function (arr) {
  3856. return !arr.some(function (e) {
  3857. return items.some(function (item) {
  3858. return isSame(e, item);
  3859. });
  3860. });
  3861. });
  3862. if (newRelations.length == atGroup.relationships) return; //断开连接时,因为组内没有其他成员的连接信息,所以需要清除整组,并将剩余的一个个重新连接
  3863. groups.splice(groups.indexOf(atGroup), 1); //删除
  3864. var newGroups = []; //为了防止裂解的该组(因之前有judgeRelationFun但现在没传)混入其他组,先放一个空组合里
  3865. atGroup.relationships.forEach(function (pair) {
  3866. //然后再重新生成这两个和组的关系,各自分组
  3867. common.pushToGroupAuto(pair, newGroups, recognizeFunction);
  3868. });
  3869. groups.push.apply(groups, newGroups);
  3870. return {
  3871. newGroups
  3872. };
  3873. }
  3874. };
  3875. common.getMAXCUBETEXTURESIZE = function () {
  3876. try {
  3877. var e = document.createElement('canvas'),
  3878. t = e.getContext('webgl');
  3879. t || (t = e.getContext('experimental-webgl'));
  3880. var i = t.getParameter(t.MAX_CUBE_MAP_TEXTURE_SIZE);
  3881. return i;
  3882. } catch (e) {
  3883. return 0;
  3884. }
  3885. };
  3886. var getTexture = function () {
  3887. var textureLoader = new THREE.TextureLoader();
  3888. textureLoader.setCrossOrigin('Anonymous');
  3889. textureLoader.crossOrigin = true;
  3890. return function (url
  3891. /* , onLoad, onProgress, onError */
  3892. ) {
  3893. var onLoad = function onLoad() {
  3894. var _map$loadCallbacks;
  3895. //xzw add
  3896. (_map$loadCallbacks = map.loadCallbacks) === null || _map$loadCallbacks === void 0 ? void 0 : _map$loadCallbacks.forEach(function (e) {
  3897. return e(map);
  3898. });
  3899. };
  3900. var map = textureLoader.load(url, onLoad
  3901. /* , onProgress, onError */
  3902. ); //map.magFilter = map.minFilter = THREE.LinearFilter
  3903. map.needsUpadte = true;
  3904. return map;
  3905. };
  3906. }();
  3907. common.dataURLtoBlob = function (dataurl) {
  3908. //将base64转换blob
  3909. var arr = dataurl.split(','),
  3910. mime = arr[0].match(/:(.*?);/)[1],
  3911. bstr = atob(arr[1]),
  3912. n = bstr.length,
  3913. u8arr = new Uint8Array(n);
  3914. while (n--) {
  3915. u8arr[n] = bstr.charCodeAt(n);
  3916. }
  3917. return new Blob([u8arr], {
  3918. type: mime
  3919. });
  3920. };
  3921. common.dataURLtoFile = function (dataurl, filename) {
  3922. //将base64转换为文件
  3923. var arr = dataurl.split(','),
  3924. mime = arr[0].match(/:(.*?);/)[1],
  3925. bstr = atob(arr[1]),
  3926. n = bstr.length,
  3927. u8arr = new Uint8Array(n);
  3928. while (n--) {
  3929. u8arr[n] = bstr.charCodeAt(n);
  3930. }
  3931. return new File([u8arr], filename, {
  3932. type: mime
  3933. });
  3934. };
  3935. common.saveFile = function (data, filename, cb) {
  3936. var save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
  3937. save_link.href = data;
  3938. save_link.download = filename;
  3939. var event = document.createEvent('MouseEvents');
  3940. event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  3941. save_link.dispatchEvent(event);
  3942. cb && cb();
  3943. };
  3944. common.PrefixPng = 'data:image/png;base64,';
  3945. common.getBlobSrc = function (base64, addPre) {
  3946. //base64 --> blobsrc
  3947. var blob = common.dataURLtoBlob((addPre ? common.PrefixPng : '') + base64);
  3948. return window.URL.createObjectURL(blob);
  3949. };
  3950. common.replaceAll = function (str, f, e) {
  3951. //f全部替换成e
  3952. var reg = new RegExp(f, 'g'); //创建正则RegExp对象
  3953. return str.replace(reg, e);
  3954. };
  3955. common.randomWord = function (randomFlag, min, max) {
  3956. //随机字符串
  3957. var str = '',
  3958. range = min,
  3959. 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'];
  3960. if (randomFlag) {
  3961. // 随机长度
  3962. range = Math.round(Math.random() * (max - min)) + min;
  3963. }
  3964. for (var i = 0; i < range; i++) {
  3965. var pos = Math.round(Math.random() * (arr.length - 1));
  3966. str += arr[pos];
  3967. }
  3968. return str;
  3969. };
  3970. common.getRandomSid = function () {
  3971. //5-7位随机字符串 + 6位时间 为热点准备
  3972. var pre = common.randomWord(true, 5, 7);
  3973. var post = new Date().getTime() + '';
  3974. var len = post.length;
  3975. post = post.substring(len - 8, len - 5) + post.substring(len - 3, len); //其实还是有可能重复的....
  3976. return pre + post;
  3977. };
  3978. common.getTime = function (second) {
  3979. //秒
  3980. var str = ''; //不支持大于60分钟的时间哟
  3981. var minute = Math.round(second / 60);
  3982. if (minute < 10) str += '0';
  3983. str += minute;
  3984. second = Math.round(second % 60) + '';
  3985. if (second.length == 1) second = '0' + second;
  3986. str = str + ':' + second;
  3987. return str;
  3988. };
  3989. common.CloneJson = function (data) {
  3990. var str = JSON.stringify(data);
  3991. return JSON.parse(str);
  3992. }, common.CloneObject = function (copyObj, isSimpleCopy) {
  3993. var _this3 = this;
  3994. var simpleCopyList = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
  3995. var judgeSimpleCopyFun = arguments.length > 3 ? arguments[3] : undefined;
  3996. //isSimpleCopy 只复制最外层
  3997. //复制json result的可能:普通数字或字符串、普通数组、复杂对象
  3998. simpleCopyList.includes(THREE.Object3D) || simpleCopyList.push(THREE.Object3D); //遇到simpleCopyList中的类直接使用不拷贝
  3999. judgeSimpleCopyFun || (judgeSimpleCopyFun = function judgeSimpleCopyFun() {});
  4000. if (!copyObj || typeof copyObj == 'number' || typeof copyObj == 'string' || copyObj instanceof Function || simpleCopyList.some(function (className) {
  4001. return copyObj instanceof className;
  4002. }) || judgeSimpleCopyFun(copyObj)) {
  4003. return copyObj;
  4004. }
  4005. if (copyObj instanceof Array) {
  4006. return copyObj.map(function (e) {
  4007. return _this3.CloneObject(e, isSimpleCopy, simpleCopyList, judgeSimpleCopyFun);
  4008. });
  4009. } else {
  4010. if (copyObj.clone instanceof Function) {
  4011. //解决一部分
  4012. return copyObj.clone();
  4013. }
  4014. }
  4015. var result = {};
  4016. for (var key in copyObj) {
  4017. if (copyObj[key] instanceof Object && !isSimpleCopy) result[key] = this.CloneObject(copyObj[key], isSimpleCopy, simpleCopyList, judgeSimpleCopyFun);else result[key] = copyObj[key]; //如果是函数类同基本数据,即复制引用
  4018. }
  4019. return result;
  4020. }, common.CloneClassObject = function (copyObj) {
  4021. var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  4022. _ref$ignoreList = _ref.ignoreList,
  4023. ignoreList = _ref$ignoreList === void 0 ? [] : _ref$ignoreList,
  4024. _ref$simpleCopyList = _ref.simpleCopyList,
  4025. simpleCopyList = _ref$simpleCopyList === void 0 ? [] : _ref$simpleCopyList;
  4026. //复杂类对象
  4027. var newobj = new copyObj.constructor();
  4028. this.CopyClassObject(newobj, copyObj, {
  4029. ignoreList,
  4030. simpleCopyList
  4031. });
  4032. return newobj;
  4033. }, common.CopyClassObject = function (targetObj, copyObj) {
  4034. var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  4035. _ref2$ignoreList = _ref2.ignoreList,
  4036. ignoreList = _ref2$ignoreList === void 0 ? [] : _ref2$ignoreList,
  4037. _ref2$simpleCopyList = _ref2.simpleCopyList,
  4038. simpleCopyList = _ref2$simpleCopyList === void 0 ? [] : _ref2$simpleCopyList;
  4039. //复杂类对象
  4040. for (var i in copyObj) {
  4041. if (i in copyObj.__proto__) break; //到函数了跳出
  4042. if (ignoreList.includes(i)) {
  4043. continue;
  4044. } else if (simpleCopyList.includes(i)) {
  4045. targetObj[i] = copyObj[i];
  4046. } else {
  4047. targetObj[i] = this.CloneObject(copyObj[i], false, simpleCopyList);
  4048. }
  4049. }
  4050. }, common.ifSame = function (object1, object2) {
  4051. var simpleEqualClass = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
  4052. var orderRequest = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
  4053. //对于复杂的类对象,若能简单判断就直接写进simpleEqualClass
  4054. if (object1 == object2) return true; // 0 != undefined , 0 == ''
  4055. else if (!object1 || !object2) return false;else if (object1.constructor != object2.constructor) {
  4056. return false;
  4057. } else if (simpleEqualClass.some(function (className) {
  4058. return object1 instanceof className;
  4059. })) {
  4060. return object1 == object2;
  4061. } else if (object1 instanceof Array) {
  4062. if (object1.length != object2.length) return false;
  4063. var _object2 = object2.slice(0);
  4064. if (orderRequest) {
  4065. for (var i = 0; i < object1.length; i++) {
  4066. if (!common.ifSame(object1[i], _object2[i], simpleEqualClass, orderRequest)) return false;
  4067. }
  4068. } else {
  4069. var _loop = function _loop(_i) {
  4070. u = _object2.findIndex(function (e) {
  4071. return common.ifSame(object1[_i], e, simpleEqualClass, orderRequest);
  4072. });
  4073. if (u == -1) return {
  4074. v: false
  4075. };else {
  4076. _object2.splice(u, 1);
  4077. }
  4078. };
  4079. for (var _i = 0; _i < object1.length; _i++) {
  4080. var u;
  4081. var _ret = _loop(_i);
  4082. if (typeof _ret === "object") return _ret.v;
  4083. }
  4084. }
  4085. return true;
  4086. } else if (object1.equals instanceof Function) {
  4087. //复杂数据仅支持这种,其他的可能卡住?
  4088. return object1.equals(object2);
  4089. } else if (typeof object1 == 'number' || typeof object1 == 'string') {
  4090. if (isNaN(object1) && isNaN(object2)) return true;else return object1 == object2;
  4091. } else if (typeof object1 == 'object') {
  4092. var keys1 = Object.keys(object1);
  4093. var keys2 = Object.keys(object2);
  4094. if (!common.ifSame(keys1, keys2, simpleEqualClass, orderRequest)) return false;
  4095. for (var _i2 in object1) {
  4096. var same = common.ifSame(object1[_i2], object2[_i2], simpleEqualClass, orderRequest);
  4097. if (!same) return false;
  4098. }
  4099. return true;
  4100. } else {
  4101. console.log('isSame出现例外');
  4102. }
  4103. };
  4104. common.canvasToImg = function (canvas) {
  4105. var compressRatio = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  4106. var download = arguments.length > 2 ? arguments[2] : undefined;
  4107. var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'image/jpeg';
  4108. var filename = arguments.length > 4 ? arguments[4] : undefined;
  4109. // 图片导出为 png 格式
  4110. var imgData = canvas.toDataURL(type, compressRatio); // 加工image data,替换mime type
  4111. if (download) {
  4112. this.saveTex(imgData, type, filename);
  4113. }
  4114. return imgData;
  4115. };
  4116. var _fixType = function _fixType(type) {
  4117. type = type.toLowerCase().replace(/jpg/i, 'jpeg');
  4118. var r = type.match(/png|jpeg|bmp|gif/)[0];
  4119. return 'image/' + r;
  4120. };
  4121. common.saveTex = function (imgData) {
  4122. var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'image/jpeg';
  4123. var filename = arguments.length > 2 ? arguments[2] : undefined;
  4124. return function (filename) {
  4125. imgData = imgData.replace(_fixType(type), 'image/octet-stream'); // 下载后的图片名
  4126. var filename = filename || '4dage_' + new Date().getTime() + (type == 'png' ? '.png' : '.jpg'); // download
  4127. common.saveFile(imgData, filename);
  4128. }(filename);
  4129. };
  4130. common.compressImg = /*#__PURE__*/function () {
  4131. var _ref3 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(img, maxWidth) {
  4132. return regenerator.wrap(function _callee$(_context) {
  4133. while (1) {
  4134. switch (_context.prev = _context.next) {
  4135. case 0:
  4136. return _context.abrupt("return", new Promise(function (resolve, reject) {
  4137. if (img.width > maxWidth || img.height > maxWidth) {
  4138. var ratio = maxWidth / Math.max(img.width, img.height);
  4139. console.log('compress img', img.width, img.height, 'to', maxWidth);
  4140. var width = Math.round(img.width * ratio);
  4141. var height = Math.round(img.height * ratio);
  4142. var canvas = document.createElement('canvas');
  4143. var context = canvas.getContext('2d');
  4144. context.canvas.width = width;
  4145. context.canvas.height = height;
  4146. context.drawImage(img, 0, 0, width, height);
  4147. var url = common.canvasToImg(canvas, 1);
  4148. var newImg = new Image();
  4149. newImg.src = url;
  4150. newImg.onload = function () {
  4151. resolve(newImg);
  4152. };
  4153. } else {
  4154. resolve(img);
  4155. }
  4156. }));
  4157. case 1:
  4158. case "end":
  4159. return _context.stop();
  4160. }
  4161. }
  4162. }, _callee);
  4163. }));
  4164. return function (_x, _x2) {
  4165. return _ref3.apply(this, arguments);
  4166. };
  4167. }();
  4168. common.imgAddLabel = function (img, labelImg) {
  4169. var labelInfo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  4170. //图上加另一张小图,用于添加水印
  4171. var canvas = document.createElement('canvas');
  4172. var context = canvas.getContext('2d');
  4173. context.canvas.width = img.width;
  4174. context.canvas.height = img.height;
  4175. context.drawImage(img, 0, 0, img.width, img.height); //widthRatioToImg:label的width占img的width的比例
  4176. var labelWidth = labelInfo.widthRatioToImg ? img.width * labelInfo.widthRatioToImg : labelImg.width; //widthRatioToImg:label的width占img的width的比例
  4177. var labelHeight = labelWidth * labelImg.height / labelImg.width;
  4178. if (labelInfo.leftRatioToImg == void 0 && labelInfo.rightRatioToImg != void 0) {
  4179. labelInfo.leftRatioToImg = 1 - labelInfo.rightRatioToImg - (labelInfo.widthRatioToImg || labelImg.width / img.width);
  4180. }
  4181. if (labelInfo.topRatioToImg == void 0 && labelInfo.bottomRatioToImg != void 0) {
  4182. labelInfo.topRatioToImg = 1 - labelInfo.bottomRatioToImg - labelHeight / img.height;
  4183. }
  4184. var labelLeft = img.width * labelInfo.leftRatioToImg; //leftRatioToImg:label的left占img的width的比例
  4185. var labelTop = img.height * labelInfo.topRatioToImg; //topRatioToImg:label的top占img的height的比例
  4186. context.globalAlpha = labelInfo.opacity != void 0 ? labelInfo.opacity : 1;
  4187. context.drawImage(labelImg, labelLeft, labelTop, labelWidth, labelHeight);
  4188. return common.canvasToImg(canvas, labelInfo.quality || 0.95);
  4189. };
  4190. common.imgAddText = /*#__PURE__*/function () {
  4191. var _ref4 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(img, text, labelInfo) {
  4192. var label, labelImg;
  4193. return regenerator.wrap(function _callee2$(_context2) {
  4194. while (1) {
  4195. switch (_context2.prev = _context2.next) {
  4196. case 0:
  4197. label = new TextSprite(Object.assign({
  4198. //如果直接在canvas里写字,要另外写很多和canvas.drawText有关的,所以还是借助textSprite吧
  4199. backgroundColor: {
  4200. r: 0,
  4201. g: 0,
  4202. b: 0,
  4203. a: 0
  4204. },
  4205. textColor: {
  4206. r: 255,
  4207. g: 255,
  4208. b: 255,
  4209. a: 1
  4210. },
  4211. margin: {
  4212. x: 3,
  4213. y: 3
  4214. },
  4215. renderOrder: 50,
  4216. fontsize: 20,
  4217. text,
  4218. borderRadius: 0
  4219. }, labelInfo));
  4220. labelImg = new Image();
  4221. labelImg.src = label.sprite.material.map.image.toDataURL('image/png', 1);
  4222. return _context2.abrupt("return", new Promise(function (resolve, reject) {
  4223. labelImg.onload = function () {
  4224. if (labelInfo.horizonCenter) {
  4225. //水平居中(对img来说)
  4226. labelInfo.leftRatioToImg = 0.5 - labelImg.width / img.width / 2;
  4227. }
  4228. var result = common.imgAddLabel(img, labelImg, labelInfo);
  4229. label.dispose();
  4230. resolve(result);
  4231. };
  4232. }));
  4233. case 4:
  4234. case "end":
  4235. return _context2.stop();
  4236. }
  4237. }
  4238. }, _callee2);
  4239. }));
  4240. return function (_x3, _x4, _x5) {
  4241. return _ref4.apply(this, arguments);
  4242. };
  4243. }();
  4244. common.pixelsArrayToDataUrl = function (pixels, width, height) {
  4245. var compressRatio = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.7;
  4246. var dontFlipY = arguments.length > 4 ? arguments[4] : undefined;
  4247. var canvas = document.createElement('canvas');
  4248. canvas.width = width;
  4249. canvas.height = height;
  4250. var context = canvas.getContext('2d');
  4251. pixels = new pixels.constructor(pixels);
  4252. if (!dontFlipY) {
  4253. var bytesPerLine = width * 4;
  4254. for (var i = 0; i < parseInt(height / 2); i++) {
  4255. var j = height - i - 1;
  4256. var lineI = pixels.slice(i * bytesPerLine, i * bytesPerLine + bytesPerLine);
  4257. var lineJ = pixels.slice(j * bytesPerLine, j * bytesPerLine + bytesPerLine);
  4258. pixels.set(lineJ, i * bytesPerLine);
  4259. pixels.set(lineI, j * bytesPerLine);
  4260. }
  4261. }
  4262. var imageData = context.createImageData(width, height);
  4263. imageData.data.set(pixels);
  4264. context.putImageData(imageData, 0, 0);
  4265. var dataURL = canvas.toDataURL('image/png', compressRatio);
  4266. return dataURL;
  4267. };
  4268. common.renderTargetToDataUrl = function (renderTarget, width, height, renderer) {
  4269. var compressRatio = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0.7;
  4270. var dontFlipY = arguments.length > 5 ? arguments[5] : undefined;
  4271. var pixelCount = width * height;
  4272. var buffer = new Uint8Array(4 * pixelCount);
  4273. renderer.readRenderTargetPixels(renderTarget, 0, 0, width, height, buffer); //耗时
  4274. var dataUrl = this.pixelsArrayToDataUrl(buffer, width, height, compressRatio, dontFlipY);
  4275. return dataUrl;
  4276. };
  4277. common.screenPass = new function () {
  4278. this.screenScene = new THREE.Scene();
  4279. this.screenQuad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2, 1));
  4280. this.screenQuad.material.depthTest = true;
  4281. this.screenQuad.material.depthWrite = true;
  4282. this.screenQuad.material.transparent = true;
  4283. this.screenScene.add(this.screenQuad);
  4284. this.camera = new THREE.Camera();
  4285. this.render = function (renderer, material, target) {
  4286. this.screenQuad.material = material; //material.premultipliedAlpha = true //每次都要吗
  4287. var alpha = renderer.getClearAlpha();
  4288. renderer.setClearAlpha(0);
  4289. if (typeof target === 'undefined') {
  4290. renderer.render(this.screenScene, this.camera);
  4291. } else {
  4292. var oldTarget = renderer.getRenderTarget();
  4293. renderer.setRenderTarget(target);
  4294. renderer.clear();
  4295. renderer.render(this.screenScene, this.camera);
  4296. renderer.setRenderTarget(oldTarget);
  4297. /* let data = common.renderTargetToDataUrl(target, target.width, target.height, renderer)
  4298. common.saveTex(data) */
  4299. }
  4300. renderer.setClearAlpha(alpha);
  4301. };
  4302. }();
  4303. common.renderTex = function (material, renderer, size) {
  4304. var rt = new THREE.WebGLRenderTarget(size.x, size.y, {
  4305. minFilter: THREE.LinearMipmapLinearFilter,
  4306. generateMipmaps: true,
  4307. format: THREE.RGBAFormat
  4308. });
  4309. this.screenPass.render(renderer, material, rt);
  4310. /* setTimeout(()=>{
  4311. rt.texture = null //rt.dispose报错
  4312. rt.dispose() //直接dispose图就没了
  4313. },3000) */
  4314. //rt的texture没有监听dispose,刚好可以给加一个,反向dispose rt
  4315. rt.texture.renderTarget__ = rt; //add
  4316. var dispose = function dispose() {
  4317. rt.dispose();
  4318. rt.texture.removeEventListener('dispose', dispose);
  4319. };
  4320. rt.texture.addEventListener('dispose', dispose); //add
  4321. return rt.texture;
  4322. }; //根据原因更新显示,便于将每种显示操作打上标签,管理优先级
  4323. common.updateVisible = function (object, reason, ifShow) {
  4324. var level = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  4325. var type = arguments.length > 4 ? arguments[4] : undefined;
  4326. if (!object) return; //当所有加入的条件都不为false时才显示. reason='force'一般是强制、临时的
  4327. if (!object.unvisibleReasons) object.unvisibleReasons = []; //如果length>0代表不可见
  4328. if (!object.visibleReasons) object.visibleReasons = []; //在同级时,优先可见
  4329. var update = function update() {
  4330. //先按从高到低的level排列
  4331. object.unvisibleReasons = object.unvisibleReasons.sort(function (a, b) {
  4332. return b.level - a.level;
  4333. });
  4334. object.visibleReasons = object.visibleReasons.sort(function (a, b) {
  4335. return b.level - a.level;
  4336. });
  4337. var maxVisiLevel = object.visibleReasons[0] ? object.visibleReasons[0].level : -1;
  4338. var maxunVisiLevel = object.unvisibleReasons[0] ? object.unvisibleReasons[0].level : -1;
  4339. var shouldVisi = maxVisiLevel >= maxunVisiLevel;
  4340. var visiBefore = object.visible;
  4341. if (visiBefore != shouldVisi) {
  4342. object.visible = shouldVisi;
  4343. object.dispatchEvent && object.dispatchEvent({
  4344. type: 'isVisible',
  4345. visible: shouldVisi,
  4346. reason
  4347. });
  4348. }
  4349. };
  4350. if (ifShow) {
  4351. var index = object.unvisibleReasons.findIndex(function (e) {
  4352. return e.reason == reason;
  4353. });
  4354. if (index > -1) {
  4355. type = 'cancel';
  4356. object.unvisibleReasons.splice(index, 1);
  4357. }
  4358. if (type == 'add') {
  4359. if (!object.visibleReasons.some(function (e) {
  4360. return e.reason == reason;
  4361. })) {
  4362. object.visibleReasons.push({
  4363. reason,
  4364. level
  4365. });
  4366. }
  4367. }
  4368. } else {
  4369. var index = object.visibleReasons.findIndex(function (e) {
  4370. return e.reason == reason;
  4371. });
  4372. if (index > -1) {
  4373. type = 'cancel';
  4374. object.visibleReasons.splice(index, 1);
  4375. }
  4376. if (type != 'cancel') {
  4377. if (!object.unvisibleReasons.some(function (e) {
  4378. return e.reason == reason;
  4379. })) {
  4380. object.unvisibleReasons.push({
  4381. reason,
  4382. level
  4383. });
  4384. }
  4385. }
  4386. }
  4387. update();
  4388. };
  4389. common.getObjVisiByReason = function (object, reason) {
  4390. //获取在某条件下是否可见. 注: 用户在数据集选择可不可见为"datasetSelection"
  4391. if (object.visible) return true;else {
  4392. return !object.unvisibleReasons || !object.unvisibleReasons.some(function (e) {
  4393. return e.reason == reason;
  4394. });
  4395. }
  4396. };
  4397. common.setCameraLayers = function (camera, enableLayers) {
  4398. var extraEnableLayers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
  4399. //设置相机或raycaster的layers
  4400. camera.layers.disableAll();
  4401. enableLayers.concat(extraEnableLayers).forEach(function (layerName) {
  4402. var layer = RenderLayers[layerName];
  4403. if (layer == void 0) {
  4404. console.error('setCameraLayer没找到layer!');
  4405. return;
  4406. }
  4407. camera.layers.enable(layer);
  4408. });
  4409. };
  4410. common.setObjectLayers = function (object, layerName) {
  4411. //设置物体的layers
  4412. var layer = RenderLayers[layerName];
  4413. if (layer == void 0) {
  4414. console.error('setCameraLayer没找到layer!');
  4415. return;
  4416. }
  4417. object.traverse(function (e) {
  4418. e.layers.set(layer);
  4419. });
  4420. };
  4421. common.intervalTool = {
  4422. //延时update,防止卡顿
  4423. list: [],
  4424. isWaiting: function isWaiting(name, func, delayTime) {
  4425. var _this4 = this;
  4426. var item = this.list.find(function (e) {
  4427. return e.name == name;
  4428. });
  4429. if (!item) {
  4430. //如果没有该项, 则加入循环
  4431. var ifContinue = func();
  4432. item = {
  4433. name
  4434. };
  4435. this.list.push(item);
  4436. setTimeout(function () {
  4437. var a = _this4.list.indexOf(item);
  4438. _this4.list.splice(a, 1);
  4439. if (item.requestUpdate || ifContinue) _this4.isWaiting(name, func, delayTime); //循环
  4440. }, delayTime);
  4441. } else {
  4442. //如果有该项,说明现在请求下一次继续更新
  4443. /* if(delayTime == 0){//想立刻更新一次
  4444. func()
  4445. }else{ */
  4446. item.requestUpdate = true; //}
  4447. }
  4448. }
  4449. };
  4450. common.batchHandling = {
  4451. //分批处理
  4452. lists: [],
  4453. getSlice: function getSlice(name, items, _ref5) {
  4454. var stopWhenAllUsed = _ref5.stopWhenAllUsed,
  4455. _ref5$minCount = _ref5.minCount,
  4456. minCount = _ref5$minCount === void 0 ? 5 : _ref5$minCount,
  4457. _ref5$maxCount = _ref5.maxCount,
  4458. maxCount = _ref5$maxCount === void 0 ? 100 : _ref5$maxCount,
  4459. durBound1 = _ref5.durBound1,
  4460. durBound2 = _ref5.durBound2,
  4461. maxUseCount = _ref5.maxUseCount;
  4462. if (items.length == 0 || (maxUseCount = maxUseCount == void 0 ? common.getBestCount({
  4463. name,
  4464. minCount,
  4465. maxCount,
  4466. durBound1,
  4467. durBound2,
  4468. ifLog: false
  4469. }) : maxUseCount, !maxUseCount) //本次最多可以使用的个数
  4470. ) {
  4471. return {
  4472. list: []
  4473. };
  4474. }
  4475. if (!this.lists[name]) this.lists[name] = {
  4476. list: []
  4477. }; //更新列表项目,但不变原来的顺序
  4478. var list = this.lists[name].list.filter(function (a) {
  4479. return items.some(function (item) {
  4480. return a.item == item;
  4481. });
  4482. }); //去掉已经不在items里的项目
  4483. this.lists[name].list = list;
  4484. items.forEach(function (item) {
  4485. //增加新的项目。
  4486. if (!list.some(function (a) {
  4487. return a.item == item;
  4488. })) {
  4489. list.push({
  4490. item,
  4491. count: 0
  4492. });
  4493. }
  4494. }); //至此,在后排的都是未使用的
  4495. var unUsed = list.filter(function (e) {
  4496. return e.count == 0;
  4497. }); //未使用的项目(count为0)优先
  4498. var result = [];
  4499. unUsed.slice(0, maxUseCount).forEach(function (e) {
  4500. result.push(e.item);
  4501. e.count++;
  4502. });
  4503. if (unUsed.length > maxUseCount) ; else {
  4504. //所有项目都能使用一次
  4505. if (!stopWhenAllUsed) {
  4506. //若不是全部使用就停止
  4507. var wholeCount = Math.min(items.length, maxUseCount);
  4508. var restCount = wholeCount - result.length; //补齐
  4509. list.slice(0, restCount).forEach(function (e) {
  4510. result.push(e.item);
  4511. e.count++;
  4512. });
  4513. }
  4514. list.forEach(function (e) {
  4515. return e.count--;
  4516. }); //复原,等待新的循环
  4517. }
  4518. return {
  4519. list: result
  4520. };
  4521. },
  4522. addSliceListen(_ref6) {
  4523. var getList = _ref6.getList,
  4524. callback = _ref6.callback,
  4525. minCount = _ref6.minCount,
  4526. maxCount = _ref6.maxCount;
  4527. _ref6.durBound1;
  4528. _ref6.durBound2;
  4529. _ref6.maxHistory;
  4530. var player = _ref6.player;
  4531. var unUpdate, lastUpdate;
  4532. player.on('update', function (e) {
  4533. if (player.flying) return;
  4534. var waitForUpdate = getList();
  4535. var stopWhenAllUsed = !player.lastFrameChanged;
  4536. var standardUpdate = player.lastFrameChanged || !lastUpdate; //相机变化或第一次
  4537. var list;
  4538. if (standardUpdate) {
  4539. list = waitForUpdate;
  4540. unUpdate = null;
  4541. } else {
  4542. if (!unUpdate) {
  4543. unUpdate = common.getDifferenceSet(waitForUpdate, lastUpdate); //unUpdate = unUpdate.filter(e => e.visible) //如飞出后最后一次更新之后,都隐藏了,隐藏的就不用更新了
  4544. }
  4545. list = unUpdate;
  4546. }
  4547. var result = common.batchHandling.getSlice('ifVideoInsight', list, {
  4548. stopWhenAllUsed,
  4549. minCount,
  4550. maxCount,
  4551. durBound1: 3,
  4552. durBound2: 13,
  4553. maxHistory: 3
  4554. }); //iphonex稳定后大概在7-10。
  4555. var updateList = result.list; //updateList.length && console.log(updateList.map(e=>e.sid))
  4556. updateList.forEach(callback);
  4557. if (!standardUpdate) {
  4558. //相机停止变化后只更新还未更新的
  4559. unUpdate = common.getDifferenceSet(unUpdate, updateList);
  4560. }
  4561. lastUpdate = updateList;
  4562. });
  4563. }
  4564. };
  4565. common.getBestCount = function () {
  4566. var lastCount = {};
  4567. return function (_ref7) {
  4568. var name = _ref7.name,
  4569. _ref7$minCount = _ref7.minCount,
  4570. minCount = _ref7$minCount === void 0 ? 1 : _ref7$minCount,
  4571. _ref7$maxCount = _ref7.maxCount,
  4572. maxCount = _ref7$maxCount === void 0 ? 6 : _ref7$maxCount,
  4573. _ref7$durBound = _ref7.durBound1,
  4574. durBound1 = _ref7$durBound === void 0 ? 1 : _ref7$durBound,
  4575. _ref7$durBound2 = _ref7.durBound2,
  4576. durBound2 = _ref7$durBound2 === void 0 ? 4 : _ref7$durBound2,
  4577. ifLog = _ref7.ifLog,
  4578. maxHistory = _ref7.maxHistory;
  4579. var timeStamp = performance.getEntriesByName('loop-start');
  4580. var count;
  4581. if (timeStamp.length) {
  4582. var dur = performance.now() - timeStamp[timeStamp.length - 1].startTime;
  4583. /*let k = -(maxCount - minCount) / (durBound2 - durBound1)
  4584. let m = maxCount - durBound1 * k
  4585. count = THREE.MathUtils.clamp(Math.round(k * dur + m), minCount, maxCount) //dur在iphoneX中静止有7,pc是2
  4586. */
  4587. count = Math.round(math$2.linearClamp(dur, durBound1, durBound2, maxCount, minCount));
  4588. if (maxHistory) {
  4589. if (!lastCount[name]) lastCount[name] = [];
  4590. if (count == 0 && lastCount[name].length > maxHistory - 1 && !lastCount[name].some(function (e) {
  4591. return e > 0;
  4592. })) {
  4593. count = 1;
  4594. }
  4595. lastCount[name].push(count);
  4596. if (lastCount[name].length > maxHistory) lastCount[name].splice(0, 1);
  4597. }
  4598. ifLog && console.log(name, count, ' ,dur:', dur.toFixed(3));
  4599. } else {
  4600. count = maxCount; // ?
  4601. } //主要在手机端有效果。
  4602. return count;
  4603. };
  4604. }();
  4605. common.timeMeasuring = {
  4606. reportTimings: false,
  4607. collection: {},
  4608. registerCollect(name, o) {
  4609. this.collection[name] = o;
  4610. o.measures = [];
  4611. o.sum = 0;
  4612. },
  4613. addTimeMark: function addTimeMark(name, type, ifLog) {
  4614. var record = this.collection[name];
  4615. var now = performance.now();
  4616. var needRecord = record && (record.measures.length < record.minCount || now - record.lastAddTime > record.refreshTime); //间隔时间超过refreshTime重新收集
  4617. if (needRecord || this.reportTimings) {
  4618. if (type == 'end' && performance.getEntriesByName(name + '-start').length == 0) return;
  4619. performance.mark(name + '-' + type);
  4620. if (type == 'end') {
  4621. var measure = performance.measure(name, name + '-start', name + '-end');
  4622. if (!measure) {
  4623. //console.error('没找到measure',name) //可能是其他地方报错了没进行下去所以找不到
  4624. return;
  4625. }
  4626. if (ifLog) console.log(name, '耗时', measure.duration.toFixed(3));
  4627. if (needRecord) {
  4628. if (record.measures.length >= record.minCount) {
  4629. //先清空上一轮的
  4630. record.measures = [];
  4631. record.sum = 0;
  4632. }
  4633. record.measures.push(measure.duration);
  4634. record.sum += measure.duration;
  4635. record.mean = record.sum / record.measures.length;
  4636. record.measures.sort(function (a, b) {
  4637. return a - b;
  4638. });
  4639. record.median = record.measures[parseInt(record.measures.length / 2)];
  4640. record.lastAddTime = now;
  4641. if (record.measures.length == record.minCount) ;
  4642. }
  4643. }
  4644. }
  4645. },
  4646. report: function report(timestamp) {
  4647. //原resolveTimings
  4648. //打印用时。 注:performance手机的精度只到整数位
  4649. if (!this.toggle) {
  4650. this.toggle = timestamp;
  4651. }
  4652. var duration = timestamp - this.toggle;
  4653. if (duration > 1000.0) {
  4654. if (this.reportTimings) {
  4655. var measures = performance.getEntriesByType('measure');
  4656. var names = new Set();
  4657. var _iterator = _createForOfIteratorHelper$c(measures),
  4658. _step;
  4659. try {
  4660. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  4661. var measure = _step.value;
  4662. names.add(measure.name);
  4663. }
  4664. } catch (err) {
  4665. _iterator.e(err);
  4666. } finally {
  4667. _iterator.f();
  4668. }
  4669. var groups = new Map();
  4670. var _iterator2 = _createForOfIteratorHelper$c(names),
  4671. _step2;
  4672. try {
  4673. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  4674. var name = _step2.value;
  4675. groups.set(name, {
  4676. measures: [],
  4677. sum: 0,
  4678. n: 0,
  4679. min: Infinity,
  4680. max: -Infinity
  4681. });
  4682. }
  4683. } catch (err) {
  4684. _iterator2.e(err);
  4685. } finally {
  4686. _iterator2.f();
  4687. }
  4688. var _iterator3 = _createForOfIteratorHelper$c(measures),
  4689. _step3;
  4690. try {
  4691. for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
  4692. var _measure = _step3.value;
  4693. var group = groups.get(_measure.name);
  4694. group.measures.push(_measure);
  4695. group.sum += _measure.duration;
  4696. group.n++;
  4697. group.min = Math.min(group.min, _measure.duration);
  4698. group.max = Math.max(group.max, _measure.duration);
  4699. }
  4700. } catch (err) {
  4701. _iterator3.e(err);
  4702. } finally {
  4703. _iterator3.f();
  4704. }
  4705. var _iterator4 = _createForOfIteratorHelper$c(groups),
  4706. _step4;
  4707. try {
  4708. for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
  4709. var _step4$value = _slicedToArray(_step4.value, 2),
  4710. _name = _step4$value[0],
  4711. _group = _step4$value[1];
  4712. _group.mean = _group.sum / _group.n;
  4713. _group.measures.sort(function (a, b) {
  4714. return a.duration - b.duration;
  4715. });
  4716. if (_group.n === 1) {
  4717. _group.median = _group.measures[0].duration;
  4718. } else if (_group.n > 1) {
  4719. _group.median = _group.measures[parseInt(_group.n / 2)].duration;
  4720. }
  4721. }
  4722. } catch (err) {
  4723. _iterator4.e(err);
  4724. } finally {
  4725. _iterator4.f();
  4726. }
  4727. var cn = Array.from(names).reduce(function (a, i) {
  4728. return Math.max(a, i.length);
  4729. }, 0) + 5;
  4730. var cmin = 5;
  4731. var cmed = 5;
  4732. var cmax = 5;
  4733. var csam = 4;
  4734. 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");
  4735. message += " ".concat('-'.repeat(message.length), "\n");
  4736. names = Array.from(names).sort();
  4737. var _iterator5 = _createForOfIteratorHelper$c(names),
  4738. _step5;
  4739. try {
  4740. for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
  4741. var _name2 = _step5.value;
  4742. var _group2 = groups.get(_name2);
  4743. var min = _group2.min.toFixed(2);
  4744. var median = _group2.median.toFixed(2);
  4745. var max = _group2.max.toFixed(2);
  4746. var n = _group2.n;
  4747. var ave = _group2.mean.toFixed(2); //add
  4748. 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");
  4749. }
  4750. } catch (err) {
  4751. _iterator5.e(err);
  4752. } finally {
  4753. _iterator5.f();
  4754. }
  4755. console.log(message);
  4756. }
  4757. performance.clearMarks();
  4758. performance.clearMeasures();
  4759. this.toggle = timestamp;
  4760. }
  4761. }
  4762. };
  4763. common.isVideoPlayed = function (video) {
  4764. return !video.paused && !isNaN(video.duration); //注意,有的手机首次play时会立即paused为false,但其实没加载好, duration为NAN
  4765. };
  4766. common.GifTexDeal = {
  4767. animateObjects: [],
  4768. animateTexs: [],
  4769. addAnimation: function addAnimation(texture, owner) {
  4770. var info = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
  4771. delay: 0
  4772. };
  4773. var id = arguments.length > 3 ? arguments[3] : undefined;
  4774. /* if(this.animateObjects.find(e=>
  4775. e.texture == texture && !ifSame(info, e.info)
  4776. )) */
  4777. var animation;
  4778. var tex = this.animateTexs.find(function (e) {
  4779. return e.texture == texture;
  4780. });
  4781. if (tex) {
  4782. animation = tex;
  4783. } else {
  4784. animation = {
  4785. texture,
  4786. info
  4787. };
  4788. this.animateTexs.push(animation);
  4789. this.setRepeart(animation);
  4790. }
  4791. var object = {
  4792. animation,
  4793. //默认相同的texture对应的info是一样的, 对应一个animation
  4794. owner,
  4795. id
  4796. };
  4797. this.animateObjects.push(object);
  4798. return object;
  4799. },
  4800. remove: function remove(object) {
  4801. var index = this.animateObjects.indexOf(object);
  4802. if (index > -1) {
  4803. this.animateObjects.splice(index, 1);
  4804. if (!this.animateObjects.find(function (e) {
  4805. return e.animation == object.animation;
  4806. })) {
  4807. var i = this.animateTexs.indexOf(object.animation);
  4808. this.animateTexs.splice(i, 1);
  4809. object.animation.texture.repeat.set(1, 1);
  4810. }
  4811. this.stop(object);
  4812. }
  4813. },
  4814. setRepeart: function setRepeart(animation) {
  4815. animation.texture.repeat.set(1 / animation.info.cellXcount, 1 / animation.info.cellYcount);
  4816. },
  4817. start: function start(object) {
  4818. var _this5 = this;
  4819. if (!object || object.started) return;
  4820. object.started = true;
  4821. if (object.animation.started) return;
  4822. object.animation.started = true;
  4823. var info = object.animation.info;
  4824. var count = info.cellXcount * info.cellYcount - (info.voidCount || 0);
  4825. if (count <= 1) return;
  4826. if (object.startCallback) object.startCallback();
  4827. var duration = info.duration + info.delay;
  4828. var delay = info.delay / duration;
  4829. transitions$1.start(function (progress) {
  4830. var index = Math.floor((count - 1) * progress);
  4831. var indexX = index % info.cellXcount;
  4832. var indexY = info.cellYcount - Math.floor(index / info.cellXcount) - 1; //uv.offset.y是从下到上的
  4833. object.animation.texture.offset.x = indexX / info.cellXcount;
  4834. object.animation.texture.offset.y = indexY / info.cellYcount; //console.log(object.id + " : "+ index, indexX, indexY /* object.texture.offset.toArray() */)
  4835. }, duration
  4836. /* * -1 */
  4837. , function () {
  4838. //done (-1):循环
  4839. //先停在最后一帧
  4840. object.started = false;
  4841. object.animation.started = false;
  4842. info.waitNextLoop = setTimeout(function () {
  4843. //从头开始
  4844. /* object.animation.texture.offset.x = 0;
  4845. object.animation.texture.offset.y = 0; */
  4846. _this5.start(object);
  4847. }, info.waitNextTime || 0);
  4848. }, delay, null, object.id, 'gif_' + object.animation.texture.id);
  4849. },
  4850. stop: function stop(object) {
  4851. if (!object || !object.started) return;
  4852. object.started = false; //只有该object对应的texture对应的所有object都停止了,才能真的停止动画:
  4853. if (this.animateObjects.find(function (e) {
  4854. return e.animation == object.animation && e.started;
  4855. })) return;
  4856. transitions$1.cancelById('gif_' + object.animation.texture.id);
  4857. object.animation.texture.offset.set(0, 0);
  4858. object.animation.started = false;
  4859. clearTimeout(object.animation.info.waitNextLoop);
  4860. }
  4861. };
  4862. common.getNestedValue = function (obj, path) {
  4863. // Split the path string into an array of keys.
  4864. var keys = path.split('.'); // Iterate over the keys and access the nested values.
  4865. var current = obj;
  4866. var _iterator6 = _createForOfIteratorHelper$c(keys),
  4867. _step6;
  4868. try {
  4869. for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
  4870. var key = _step6.value;
  4871. // If the current value is an array and the key is an index, access the array element.
  4872. if (Array.isArray(current) && !isNaN(parseInt(key))) {
  4873. current = current[parseInt(key)];
  4874. } else {
  4875. // If the current value is an object, access the property.
  4876. current = current[key];
  4877. } // If the current value is undefined, return undefined.
  4878. if (current === undefined) {
  4879. return undefined;
  4880. }
  4881. }
  4882. } catch (err) {
  4883. _iterator6.e(err);
  4884. } finally {
  4885. _iterator6.f();
  4886. }
  4887. return current;
  4888. };
  4889. common.watch = function (object, propName, initialValue) {
  4890. //监听某个属性的变化
  4891. var v = initialValue;
  4892. Object.defineProperty(object, propName, {
  4893. get: function get() {
  4894. return v;
  4895. },
  4896. set: function set(e) {
  4897. console.warn('watch:', propName, e);
  4898. v = e;
  4899. }
  4900. });
  4901. };
  4902. common.getDealedUrl = function (url, app, now) {
  4903. var clearCache = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  4904. //前端传过来的src总是要处理下
  4905. if (url.indexOf('http') != -1 || url.indexOf('/') === 0) {
  4906. return url;
  4907. } else {
  4908. if (typeof url === 'string' && (url.substring(0, 4) == 'blob' || url.substring(0, 10) == 'data:image')) {
  4909. return url;
  4910. } else {
  4911. return app.resource.getUserResourceURL(url, clearCache, now);
  4912. }
  4913. }
  4914. };
  4915. var common$1 = common;
  4916. /*
  4917. * @Author: Rindy
  4918. * @Date: 2021-05-12 12:05:29
  4919. * @LastEditors: Rindy
  4920. * @LastEditTime: 2021-10-20 11:09:29
  4921. * @Description: decorators
  4922. */
  4923. /**
  4924. * 集成EventEmitter
  4925. * @param {*} target
  4926. */
  4927. var Emitter = function Emitter(target) {
  4928. common$1.extend(target, EventEmitter);
  4929. };
  4930. var browser$1 = {
  4931. mobileVersion(e, t) {
  4932. var i = window.navigator.userAgent,
  4933. n = i.match(e);
  4934. return n = n ? n[1].split(t) : [], {
  4935. major: parseInt(n[0]) || 0,
  4936. minor: parseInt(n[1]) || 0,
  4937. patch: parseInt(n[2]) || 0
  4938. };
  4939. },
  4940. isFullscreen() {
  4941. return document.fullscreenElement || document.mozFullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
  4942. },
  4943. supportsFullscreen() {
  4944. return document.fullscreenEnabled || document.mozFullscreenEnabled || document.mozFullScreenEnabled || document.webkitFullscreenEnabled || document.msFullscreenEnabled;
  4945. },
  4946. isPointerLocked() {
  4947. return document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement;
  4948. },
  4949. requestFullscreen(dom, t) {
  4950. 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);
  4951. },
  4952. requestPointerLock() {
  4953. var e;
  4954. if (document.fullscreenElement) e = document.fullscreenElement();else if (document.mozFullscreenElement) e = document.mozFullscreenElement();else if (document.mozFullScreenElement) e = document.mozFullScreenElement();else {
  4955. if (!document.webkitFullscreenElement) return;
  4956. e = document.webkitFullscreenElement();
  4957. }
  4958. e.requestPointerLock = e.requestPointerLock || e.mozRequestPointerLock || e.webkitRequestPointerLock, e.requestPointerLock(), $(document).off('fullscreenchange webkitfullscreenchange mozfullscreenchange MSFullscreenChange', this);
  4959. },
  4960. exitPointerLock() {
  4961. document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock, document.exitPointerLock();
  4962. },
  4963. exitFullscreen() {
  4964. document.exitFullscreen ? document.exitFullscreen() : document.msExitFullscreen ? document.msExitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.webkitExitFullscreen && document.webkitExitFullscreen();
  4965. },
  4966. details() {
  4967. var e = navigator.userAgent.match('(Firefox|Chrome|Safari)/([\\d]+)');
  4968. return e ? {
  4969. name: e[1],
  4970. version: parseInt(e[2]),
  4971. platform: navigator.platform
  4972. } : {};
  4973. },
  4974. is(e) {
  4975. return this.details() && this.details().name === e;
  4976. },
  4977. inIframe() {
  4978. return window.parent !== window;
  4979. },
  4980. aspectRatio() {
  4981. var e = window.innerWidth / window.innerHeight;
  4982. return isFinite(e) ? e : 0;
  4983. },
  4984. userAgent() {
  4985. return window.navigator.userAgent;
  4986. },
  4987. isMobile() {
  4988. var e = navigator.userAgent || navigator.vendor || window.opera;
  4989. 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));
  4990. },
  4991. isLandscape() {
  4992. return this.isMobile && this.aspectRatio() > 1;
  4993. },
  4994. isSmallScreen() {
  4995. var e = screen.width / window.devicePixelRatio;
  4996. return e < 240;
  4997. },
  4998. detectWeixin: function detectWeixin() {
  4999. //微信 包括PC的微信
  5000. return window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger';
  5001. },
  5002. detectWeixinMiniProgram: function detectWeixinMiniProgram() {
  5003. return window.navigator.userAgent.match('miniProgram');
  5004. },
  5005. detectIE() {
  5006. var e = window.navigator.userAgent,
  5007. t = e.indexOf('MSIE ');
  5008. return t !== -1 || !!navigator.userAgent.match(/Trident.*rv\:11\./);
  5009. },
  5010. detectSafari() {
  5011. var e = window.navigator.userAgent,
  5012. t = e.indexOf('Safari');
  5013. return t !== -1 && !this.detectChrome();
  5014. },
  5015. detectFirefox() {
  5016. var e = window.navigator.userAgent;
  5017. return e.indexOf('Firefox') !== -1;
  5018. },
  5019. detectChrome() {
  5020. var e = window.navigator.userAgent;
  5021. return e.indexOf('Chrome') !== -1 && !this.detectOpera();
  5022. },
  5023. detectOpera() {
  5024. var e = window.navigator.userAgent;
  5025. return e.indexOf('OPR') !== -1;
  5026. },
  5027. detectIOS() {
  5028. return this.detectIPhone() || this.detectIPad() || this.detectIPod();
  5029. },
  5030. detectIPad() {
  5031. var e = window.navigator.userAgent,
  5032. t = /iPad/;
  5033. return t.test(e);
  5034. },
  5035. detectIPod() {
  5036. var e = window.navigator.userAgent,
  5037. t = /iPod/;
  5038. return t.test(e);
  5039. },
  5040. detectIPhone() {
  5041. var e = window.navigator.userAgent,
  5042. t = /iPhone/;
  5043. return t.test(e);
  5044. },
  5045. detectAndroid() {
  5046. var e = window.navigator.userAgent;
  5047. return e.indexOf('Android') !== -1;
  5048. },
  5049. detectAndroidMobile() {
  5050. var e = window.navigator.userAgent;
  5051. return this.detectAndroid() && e.indexOf('Mobile') !== -1;
  5052. },
  5053. detectSamsungNative() {
  5054. var e = window.navigator.userAgent;
  5055. return e.indexOf('SM-G900H') !== -1 || e.indexOf('GT-I9500') !== -1 || e.indexOf('SM-N900') !== -1;
  5056. },
  5057. detectSamsungS6() {
  5058. var e = window.navigator.userAgent;
  5059. return e.indexOf('SM-G92') !== -1;
  5060. },
  5061. /************************************************************徐世廷*************************************************************/
  5062. detectHUAWEI5X() {
  5063. return -1 !== window.navigator.userAgent.indexOf('KIW-TL00H');
  5064. },
  5065. /*******************************************************************************************************************************/
  5066. detectWebVR() {
  5067. return !(!window.navigator.getVRDisplays || !window.VRDisplay);
  5068. },
  5069. getVRDisplay() {
  5070. var _this = this;
  5071. // var e = $.Deferred()
  5072. // return this.detectWebVR()
  5073. // ? (navigator.getVRDisplays().then(function (t) {
  5074. // t.length >= 1 && e.resolve(t[0]), e.reject(null)
  5075. // }),
  5076. // e)
  5077. // : e.reject(null)
  5078. return new Promise(function (resolve, reject) {
  5079. if (_this.detectWebVR()) {
  5080. navigator.getVRDisplays().then(function (t) {
  5081. if (t.length >= 1) {
  5082. resolve(t[0]);
  5083. } else {
  5084. reject(null);
  5085. }
  5086. }).catch(function () {
  5087. return reject(null);
  5088. });
  5089. } else {
  5090. reject(null);
  5091. }
  5092. });
  5093. },
  5094. iosVersion() {
  5095. if (!this.detectIOS()) throw new DeviceMismatchException('Did not detect an iDevice');
  5096. var e = /((?:\d+\_?){1,3}) like Mac OS/,
  5097. t = '_';
  5098. return this.mobileVersion(e, t);
  5099. },
  5100. androidVersion() {
  5101. if (!this.detectAndroid()) throw new DeviceMismatchException('Did not detect an Android based device');
  5102. var e = /Android ((?:\d+\.?){1,3})/,
  5103. t = '.';
  5104. return this.mobileVersion(e, t);
  5105. },
  5106. valueFromCookie(e, t) {
  5107. var i = new RegExp(e + '=([0-9a-f]+)(; ?|$)').exec(document.cookie);
  5108. if (!i) return t;
  5109. var n = i[1];
  5110. return 'boolean' == typeof t ? 'true' === n || '1' === n : 'number' == typeof t ? parseFloat(n) : n;
  5111. },
  5112. valueFromHash(e, t) {
  5113. var i = new RegExp('[#&?]' + e + '=([^#&?]*)'),
  5114. n = i.exec(window.location.href);
  5115. if (!n) return t;
  5116. var r = n[1];
  5117. return 'boolean' == typeof t ? 'true' === r || '1' === r : 'number' == typeof t ? parseFloat(r) : window.decodeURIComponent(r);
  5118. },
  5119. valueFromUrl(key) {
  5120. return this.urlHasValue(key, true);
  5121. },
  5122. urlHasValue: function urlHasValue(key, isGetValue) {
  5123. var querys = window.location.search.substr(1).split('&');
  5124. if (isGetValue) {
  5125. for (var i = 0; i < querys.length; i++) {
  5126. var split = querys[i].indexOf('=');
  5127. var param = querys[i].substring(0, split);
  5128. var value = querys[i].substring(split + 1);
  5129. if (param == key && value) {
  5130. return value;
  5131. }
  5132. }
  5133. return '';
  5134. } else {
  5135. //return window.location.search.match("&" + key + "|\\?" + key) != null 有bug
  5136. for (var _i = 0; _i < querys.length; _i++) {
  5137. var keypair = querys[_i].split('=');
  5138. if (keypair[0] == key) {
  5139. return true;
  5140. }
  5141. }
  5142. return false;
  5143. }
  5144. },
  5145. maybeQilin() {
  5146. //可能是银河麒麟桌面系统,webgl容易出bug 2024.10
  5147. return window.navigator.userAgent.toLowerCase().includes('linux');
  5148. }
  5149. };
  5150. var Colors = {
  5151. //green: new THREE.Color('#00c8aF'),
  5152. green: new THREE.Color('#15FFE2'),
  5153. yellow: new THREE.Color('#F6FE14'),
  5154. lightGreen: new THREE.Color('#09e1c0'),
  5155. newBlue: new THREE.Color('#007BFF'
  5156. /* '#00c8ae' */
  5157. ),
  5158. //new THREE.Color(4967932),
  5159. altBlue: new THREE.Color(47355),
  5160. tagDefault: new THREE.Color(223357),
  5161. classicBlue: new THREE.Color(53759),
  5162. mpYellow: new THREE.Color(16502016),
  5163. mpOrange: new THREE.Color(16428055),
  5164. mpBlue: new THREE.Color(12096),
  5165. mpLtGrey: new THREE.Color(13751252),
  5166. mpDkGrey: new THREE.Color(10000019),
  5167. mpRed: new THREE.Color(12525854),
  5168. mpOrangeDesat: new THREE.Color(16764529),
  5169. mpBlueDesat: new THREE.Color(4034734),
  5170. mpRedDesat: new THREE.Color(14705505),
  5171. white: new THREE.Color(16777215),
  5172. black: new THREE.Color(0),
  5173. _desat(e, t) {
  5174. var i = t || 0.3,
  5175. r = new THREE.Color().copy(e).getHSL(e);
  5176. return new THREE.Color().setHSL(r.h, r.s * (1 - i), r.l);
  5177. },
  5178. _darken(e, t) {
  5179. var i = t || 0.2,
  5180. r = e.getHSL(e);
  5181. return new THREE.Color().setHSL(r.h, r.s, r.l * (1 - i));
  5182. }
  5183. };
  5184. Colors.mainColor = Colors.newBlue; //当前主题色
  5185. var WarpStyle = {
  5186. BLACK: 'black',
  5187. STD: 'std',
  5188. WALK: 'walk'
  5189. };
  5190. Math.sign = function (e) {
  5191. return e < 0 ? -1 : 1;
  5192. };
  5193. var constants$4 = {
  5194. signedUrlDefaultExpireTime: 24e4,
  5195. signedUrlCheckInterval: 1e4,
  5196. signedUrlRefreshBuffer: 15e3,
  5197. dollhouseFOV: browser$1.isMobile() ? 90 : 70,
  5198. dollhouseNear: 1,
  5199. dollhouseFar: 5e3,
  5200. insideFOV: browser$1.isMobile() ? 90 : 70,
  5201. insideFOVMax: 120,
  5202. insideNear: 0.1,
  5203. insideFar: 5e3,
  5204. insideLookSpeed: 0.12,
  5205. //产品说放开俯仰角
  5206. insideLookLimitUp: 89.8,
  5207. //60// browser.isMobile() ? 15 : 25, //browser.valueFromUrl('ai') == 'sds' ? 50 : browser.isMobile() ? 15 : 25,
  5208. insideLookLimitDown: -89.8,
  5209. //browser.valueFromUrl('ai') == 'sds' ? -50 : browser.isMobile() ? -15 : -25,
  5210. orthoNear: 1,
  5211. orthoFar: 5e3,
  5212. orthoBase: 10,
  5213. planeHeightShift: 0.1,
  5214. narrowLandscapeHeight: 290,
  5215. reallyNarrowLandscapeHeight: 250,
  5216. visionTilingStartDate: new Date('8/26/2016'),
  5217. visionTilingStartVersion: '1.1.407.13667',
  5218. windowHeightHighQualityThreshold: 900,
  5219. tourStepDelayDefault: 3500,
  5220. tourStepDelaySlideShow: 5e3,
  5221. workshopApsect: 9 / 16,
  5222. highQualityMaxZoom: 2,
  5223. ultraHighQualityMaxZoom: 3
  5224. };
  5225. var labelorder = 8;
  5226. var RenderOrder = {
  5227. boundingSkybox: 1,
  5228. visibleFloor: 1,
  5229. highTileCube: 2,
  5230. panoMarker: 2,
  5231. //不能遮挡住overlay等物体
  5232. line: 4,
  5233. overlay: 5,
  5234. //panoLabel: 6,
  5235. footIcon: 6,
  5236. reticule: 7,
  5237. tagStem: 8,
  5238. tagDisc: 9,
  5239. ribbon: 9,
  5240. ghostFloor: 10,
  5241. //透明的不能在不透明(visibleFloor、videoTag)之前渲染否则会遮住
  5242. cad: 11,
  5243. //floorplan
  5244. vrMarker: 12,
  5245. view: 13,
  5246. entryArrow: 14,
  5247. monitorPlane: 20,
  5248. tag: {
  5249. label: labelorder,
  5250. spot: labelorder,
  5251. line: labelorder - 1,
  5252. onMesh: {
  5253. line: labelorder,
  5254. spot: labelorder - 1
  5255. }
  5256. },
  5257. measure: {
  5258. marker: 16,
  5259. subLabel: 14,
  5260. label: 15,
  5261. ruler: 14
  5262. },
  5263. magnifier: 21
  5264. };
  5265. /*
  5266. renderOrder并非大的就一定能盖住小的, 透明的反而需要后渲染,否则会盖住先渲染的。
  5267. */
  5268. var settings$2 = {
  5269. visions: 2,
  5270. //2有下相机
  5271. debug: false,
  5272. version: '2.23.8-0-g24ec69e',
  5273. skyboxRadius: 2500,
  5274. job: 'dacf7dfa24ae47fab8fcebfe4dc41ab9',
  5275. preTexture: '_50k_texture_jpg_high1',
  5276. format: '_50k.dam',
  5277. skyboxRadius: 2500,
  5278. modelBoundsPadding: 5,
  5279. showNeighbors: !1,
  5280. useWheel: browser$1.valueFromHash('wh', !0),
  5281. crossOrigin: 'anonymous',
  5282. fancierTransition: !1,
  5283. wireframe: !1,
  5284. skyboxWireframe: !1,
  5285. modelAlpha: 1,
  5286. highlightPanoSelection: !1,
  5287. showSweeps: !0,
  5288. showSkyboxes: !1,
  5289. showMesh: !0,
  5290. showFloors: !1,
  5291. showFloorDuration: 300,
  5292. showFloorDelay: 300,
  5293. hideFloorDuration: 300,
  5294. hideFloorDelay: 0,
  5295. reticuleOpacityTransitionTime: 250,
  5296. reticuleColor: Colors.mainColor,
  5297. markerOpacityTransitionTime: 500,
  5298. guiAnimationSpeed: 250,
  5299. highlightAnimationDuration: 500,
  5300. modelComponentLoadSpinnerDelay: 150,
  5301. captureErrors: !1,
  5302. maxMobileTextures: 6,
  5303. minimalMemoryMode: browser$1.valueFromHash('m3', browser$1.isMobile()),
  5304. startupFlyinDelay: 3e3,
  5305. vrEnabled: false,
  5306. overlay: {
  5307. width: 1,
  5308. height: 0.5,
  5309. depth: 0.04
  5310. },
  5311. dollhouseDefault: {
  5312. minDistance: 15,
  5313. maxDistance: 50,
  5314. minPolarAngle: THREE.MathUtils.degToRad(10),
  5315. maxPolarAngle: THREE.MathUtils.degToRad(90)
  5316. },
  5317. hideReticuleTimeout: 1e3,
  5318. analytics: {
  5319. inactivityThreshold: 30,
  5320. sessionTrackingRate: 0.15,
  5321. maxTrackedErrors: 20,
  5322. sessionDurationPingFrequency: 10,
  5323. sessionDurationTimeout: 15
  5324. },
  5325. flydown: {
  5326. movementEasing: 'easeInOutQuad',
  5327. movementDelay: 0.001,
  5328. rotationEasing: 'easeInOutQuad',
  5329. rotationDelay: 0.5,
  5330. modelTextureDelay: 0.75,
  5331. skyboxDelay: 0.75
  5332. },
  5333. transition: {
  5334. /* flySpeed: 0.0037, //匀速行走的速度,稍微比正常过渡快一些 //0.01,
  5335. flyTime: 300, //750, 最小时间
  5336. flytimeMaxDistanceThreshold: 7, //5,
  5337. flytimeDistanceMultiplier: 300, //120,//150, */
  5338. flySpeed: 0.0043,
  5339. //匀速行走的速度,稍微比正常过渡快一些 //0.01,
  5340. flyTime: 650,
  5341. //750, 最小时间
  5342. flytimeMaxDistanceThreshold: 10,
  5343. //5,
  5344. flytimeDistanceMultiplier: 120,
  5345. //120,//150,
  5346. maxRotSpeed: 1.2,
  5347. //add
  5348. aimTime: 1500,
  5349. aimSlowFactor: 1.5,
  5350. blur: 0.8,
  5351. movementEasing: 'easeOutSine',
  5352. //'easeOutSine',//'easeInOutQuad',
  5353. blendEasing: 'easeInOutQuad',
  5354. fastForwardFactor: browser$1.valueFromHash('mfis', 3)
  5355. },
  5356. show360Views: {
  5357. enabled: !0,
  5358. transitionTime: 1e3
  5359. },
  5360. quickstart: {
  5361. enabled: 1,
  5362. //1 === browser.valueFromHash('qust', 0) || 1 === browser.valueFromHash('qs', 0),
  5363. animation: 1400,
  5364. showTextDelay: 500,
  5365. fadeOutDelay: 3e3,
  5366. fovChange: 10
  5367. },
  5368. appConfig: {
  5369. webvr_version: null,
  5370. segment_key: null,
  5371. embedly_key: null,
  5372. branch_key: null,
  5373. keen_write_key: null,
  5374. keen_project_id: null
  5375. },
  5376. input: {
  5377. longTapThreshold: 200,
  5378. moveToleranceNDC: 0.08,
  5379. touchMoveThreshold: 25
  5380. },
  5381. labels: {
  5382. enabled: !1,
  5383. hideUntilStart: !0,
  5384. fadeInDuration: 250,
  5385. fadeInDelay: 250,
  5386. fadeOutDuration: 250,
  5387. fadeOutDelay: 0,
  5388. zoomHideThreshhold: {
  5389. mobile: browser$1.isSmallScreen() ? 0.45 : 0.6,
  5390. desktop: 2
  5391. },
  5392. zoomTruncateThreshhold: {
  5393. mobile: browser$1.isSmallScreen() ? 0.35 : 0.45,
  5394. desktop: 0.85
  5395. },
  5396. minLengthForTruncate: 16,
  5397. truncateLength: 12,
  5398. truncateSuffix: '...'
  5399. },
  5400. tags: {
  5401. enabled: browser$1.valueFromHash('mt', 1),
  5402. startup: {
  5403. hideUntilStart: !0,
  5404. fadeInDuration: 500,
  5405. fadeInDelay: 100
  5406. },
  5407. visibility: {
  5408. anyDistance: !0,
  5409. visibleDistance: 8,
  5410. cameraClearance: 0.1,
  5411. alphaTestLevel: 0.05,
  5412. hideViaFloor: !0,
  5413. hideOffScreenDisc: !1,
  5414. hideOffScreenObject: !1
  5415. },
  5416. disc: {
  5417. opacity: 1,
  5418. disabledOpacity: 0.5,
  5419. scale: {
  5420. nearBound: 1.5,
  5421. farBound: 4.8,
  5422. linkFarBound: !1,
  5423. linkPercent: 40,
  5424. maxSize: 80,
  5425. minSize: 40,
  5426. baseViewportSize: 800,
  5427. responsiveness: 100
  5428. }
  5429. },
  5430. pole: {
  5431. enabled: !0,
  5432. height: 0.5,
  5433. width: 2,
  5434. opacity: 0.5,
  5435. color: 'white'
  5436. },
  5437. navigate: {
  5438. nearestPano: !0,
  5439. lineOfSight: !0,
  5440. reactivate: !0,
  5441. aimAt: 'disc',
  5442. tiltTolerance: 25,
  5443. rotateSpeedFactor: 0.6
  5444. }
  5445. },
  5446. view360: {
  5447. //xzw add
  5448. circleDisToCenter: 2.4,
  5449. visibleDisAtView: 15
  5450. },
  5451. boundExpandLength: 1.5,
  5452. path: {
  5453. color: Colors.mainColor,
  5454. colorUp: Colors._desat(Colors.mainColor, 0.5),
  5455. colorDown: Colors._darken(Colors.mainColor, 0.35),
  5456. opacity: 0.5,
  5457. style: 'ribbon',
  5458. height: 0.025,
  5459. ribbonWidth: 0.24,
  5460. outsideHeight: 0.5,
  5461. waypointRadius: 0.5,
  5462. waypointIndoorRadius: 0.24,
  5463. waypointPulse: 1e3,
  5464. typ: WarpStyle.BLACK,
  5465. meshFree: browser$1.valueFromHash('mf', 1),
  5466. mapGuides: browser$1.valueFromHash('guides', !0),
  5467. fadeInTime: 400,
  5468. fadeOutTime: 300
  5469. },
  5470. warp: {
  5471. nearPanoDist: 0.1,
  5472. matchCam: !1,
  5473. blur: 0.33,
  5474. fastTime: 1500,
  5475. teleportTime: 1500,
  5476. outsideTime: 2e3,
  5477. lookAheadMax: 0.3,
  5478. lookAheadDist: 2.5,
  5479. softPushDist: 0.37,
  5480. softPushEnd: 0.3,
  5481. softBendAngle: 8,
  5482. softBendTilt: 4,
  5483. softBendEnd: 0.3,
  5484. doBurns: browser$1.valueFromHash('kb', !0),
  5485. burnsAngle: 35,
  5486. minBurnsAngle: 35,
  5487. minDownAngle: -35,
  5488. maxTurnPerSec: 280,
  5489. maxAimPerSec: 35,
  5490. minRotation: 12,
  5491. maxAimRotation: 33.2,
  5492. turnFriction: 0.2,
  5493. flySpeed: 0.01,
  5494. minWarpTime: 1200,
  5495. warpInterruptionRedirectTime: 500,
  5496. tourStepDelay: browser$1.valueFromHash('st', 0),
  5497. walkDelay: 0,
  5498. walkMaxDist: 50,
  5499. walkMinDist: 0.8,
  5500. walkSlideShowThreshhold: 3e3,
  5501. walkExtraPanosDistance: 0.4,
  5502. timePerMeter: 800,
  5503. motionLeadTime: 500,
  5504. movementEasing: 'easeInOutQuad',
  5505. blendEasing: 'easeInOutQuad',
  5506. showBunny: !1,
  5507. loop: browser$1.valueFromHash('lp', !1),
  5508. auto: browser$1.valueFromHash('ts', -1),
  5509. eOrder: 'YXZ',
  5510. stepFactor: 0.25,
  5511. brakeStrength: 2,
  5512. minBrakeAngle: 0.1,
  5513. maxBrakeAngle: 1.8,
  5514. climbEffort: 4
  5515. },
  5516. rotationFriction: browser$1.isMobile() ? 0.08 : 0.05,
  5517. rotationAccelerationInside: 4.5,
  5518. rotationAccelerationOutside: 0.15,
  5519. rotationAfterMoveMultiplierX: browser$1.isMobile() ? 120 : 40,
  5520. rotationAfterMoveMultiplierY: 40,
  5521. rotationAfterMoveHistoryCount: 5,
  5522. panFriction: 0.09,
  5523. panAccelerationOutside: 60,
  5524. //onload: browser.valueFromHash('onload', Viewmode.PANORAMA),
  5525. zoomNearLimit: 0.1,
  5526. zoomFarLimit: 10,
  5527. navigation: {
  5528. panoScores: !1,
  5529. mouseDirection: !0,
  5530. filterStrictness: 0.75,
  5531. angleFactor: -30,
  5532. directionFactor: 10,
  5533. distanceFactor: -1,
  5534. optionalityFactor: 3
  5535. },
  5536. sdkInit: !1,
  5537. secretPanelWord: [38, 38, 40, 40, 37, 39, 37, 39, 66, 65],
  5538. console: browser$1.valueFromHash('console', !1),
  5539. noMeshFloorPositionOffset: new THREE.Vector3(0, -1.2, 0),
  5540. panoramaNeighbourMaxDistance: 5,
  5541. panoFloorClickRadius: 0.35,
  5542. showScreenshotLocations: !1,
  5543. showAxis: !1,
  5544. showNeighbourRaycasts: !1,
  5545. colorMarkerOnLoad: !1,
  5546. colorMarkerByFloor: !1,
  5547. tiling: {
  5548. panoPreRenderRepeatDelay: 2500,
  5549. panoPreRenderDelay: 500,
  5550. preRenderTourPanos: browser$1.valueFromHash('tileprerender', 0),
  5551. tilingFlagNames: ['usetiles', 'tiles'],
  5552. maxNavPanoQuality: browser$1.valueFromHash('maxtileq', null),
  5553. maxZoomPanoQuality: browser$1.valueFromHash('maxztileq', null),
  5554. overlayStyle: browser$1.valueFromHash('tileoverlay', 0),
  5555. uploadIntervalDelay: browser$1.valueFromHash('tileupdelay', 10),
  5556. initialIntervalDelay: browser$1.valueFromHash('itiledelay', 0),
  5557. maxNonBaseUploadsPerFrame: browser$1.valueFromHash('maxnbtpf', 2),
  5558. maxBaseUploadsPerFrame: browser$1.valueFromHash('maxbtpf', 6),
  5559. customCompression: browser$1.valueFromHash('tilecustcomp', 0),
  5560. mobileHighQualityOverride: !1,
  5561. allowUltraHighResolution: !0
  5562. },
  5563. zoom: {
  5564. enabled: !0,
  5565. forceOff: browser$1.valueFromHash('nozoom', 0),
  5566. overridemax: browser$1.valueFromHash('maxzoom', null),
  5567. overridemin: browser$1.valueFromHash('minzoom', null),
  5568. max: constants$4.highQualityMaxZoom,
  5569. min: 1,
  5570. transitionStyle: browser$1.valueFromHash('zoomtrans', 1),
  5571. activationThreshold: 1.1,
  5572. restoreTime: 500,
  5573. zoomToDefaultWhenToPano: true //add
  5574. },
  5575. profiling: {
  5576. enabled: browser$1.valueFromHash('mem', !1)
  5577. }
  5578. /*
  5579. insideFOV: browser.valueFromHash("fov", constants.insideFOV),
  5580. insideFOVMax: browser.valueFromHash("fovmax", constants.insideFOVMax),
  5581. panorama: {
  5582. transitionTime: 1e3,
  5583. modelAlpha: 0,
  5584. modelAlphaDelay: .75,
  5585. modelAlphaLength: 1,
  5586. skyboxOpacity: 1,
  5587. skyboxOpacityDelay: .75,
  5588. skyboxOpacityLength: .9,
  5589. fovLength: 1,
  5590. fovDelay: 0,
  5591. cameraMatrixDuration: .8,
  5592. cameraMatrixDelay: 0,
  5593. cameraMatrixEase: easing.easeInCubic,
  5594. reticuleOpacity: 1,
  5595. markerOpacity: .3,
  5596. markerOpacityOnHover: 1
  5597. },
  5598. dollhouse: {
  5599. transitionTime: 1e3,
  5600. modelAlpha: 1,
  5601. modelAlphaDelay: 0,
  5602. modelAlphaLength: 1 - .75,
  5603. skyboxOpacity: 0,
  5604. skyboxOpacityDelay: 0,
  5605. skyboxOpacityLength: 1 - .75,
  5606. fovLength: 1,
  5607. fovDelay: 0,
  5608. cameraMatrixDuration: .8,
  5609. cameraMatrixDelay: .3,
  5610. cameraMatrixEase: easing.easeInCubic,
  5611. reticuleOpacity: 1,
  5612. markerOpacity: 0,
  5613. markerOpacityOnHover: 0
  5614. },
  5615. floorplan: {
  5616. transitionTime: 1e3,
  5617. modelAlpha: 1,
  5618. modelAlphaDelay: 0,
  5619. modelAlphaLength: 1 - .75,
  5620. skyboxOpacity: 0,
  5621. skyboxOpacityDelay: 0,
  5622. skyboxOpacityLength: 1 - .75,
  5623. fovLength: 1,
  5624. fovDelay: 0,
  5625. cameraMatrixDuration: .5,
  5626. cameraMatrixDelay: 0,
  5627. cameraMatrixEase: easing.easeOutCubic,
  5628. reticuleOpacity: 1,
  5629. markerOpacity: 0,
  5630. markerOpacityOnHover: 0,
  5631. cameraHeight: 50
  5632. },
  5633. transitioning: {
  5634. reticuleOpacity: 0,
  5635. markerOpacity: .3,
  5636. markerOpacityOnHover: 1
  5637. },
  5638. "floorplan-dollhouse": {
  5639. rotationDelay: 0,
  5640. rotationDuration: 1
  5641. },
  5642. "floorplan-panorama": {
  5643. rotationDelay: .5,
  5644. rotationDuration: 1
  5645. },
  5646. "dollhouse-panorama": {
  5647. rotationDelay: .5,
  5648. rotationDuration: 1
  5649. },
  5650. "dollhouse-floorplan": {
  5651. rotationDelay: 0,
  5652. rotationDuration: 1,
  5653. cameraMatrixDuration: 1.05,
  5654. cameraMatrixDelay: .5
  5655. },
  5656. "panorama-dollhouse": {
  5657. rotationDelay: 0,
  5658. rotationDuration: .5
  5659. },
  5660. "panorama-floorplan": {
  5661. transitionTime: 1500,
  5662. rotationDelay: 0,
  5663. rotationDuration: .5
  5664. }
  5665. */
  5666. };
  5667. settings$2 = common$1.deepExtend(settings$2, constants$4, {
  5668. insideFOV: browser$1.valueFromHash('fov', constants$4.insideFOV),
  5669. insideFOVMax: browser$1.valueFromHash('fovmax', constants$4.insideFOVMax),
  5670. panorama: {
  5671. transitionTime: 1e3,
  5672. modelAlpha: 0,
  5673. modelAlphaDelay: settings$2.flydown.modelTextureDelay,
  5674. modelAlphaLength: 1,
  5675. skyboxOpacity: 1,
  5676. skyboxOpacityDelay: settings$2.flydown.skyboxDelay,
  5677. skyboxOpacityLength: 0.9,
  5678. fovLength: 1,
  5679. fovDelay: 0,
  5680. cameraMatrixDuration: 0.8,
  5681. cameraMatrixDelay: 0,
  5682. cameraMatrixEase: easing.easeInCubic,
  5683. reticuleOpacity: 1,
  5684. markerOpacity: 0.3,
  5685. markerOpacityOnHover: 1
  5686. },
  5687. dollhouse: {
  5688. transitionTime: 1e3,
  5689. modelAlpha: 1,
  5690. modelAlphaDelay: 0,
  5691. modelAlphaLength: 1 - settings$2.flydown.modelTextureDelay,
  5692. skyboxOpacity: 0,
  5693. skyboxOpacityDelay: 0,
  5694. skyboxOpacityLength: 1 - settings$2.flydown.skyboxDelay,
  5695. fovLength: 1,
  5696. fovDelay: 0,
  5697. cameraMatrixDuration: 0.8,
  5698. cameraMatrixDelay: 0.3,
  5699. cameraMatrixEase: easing.easeInQuint,
  5700. //原先的ease模型较大时效果不好
  5701. reticuleOpacity: 1,
  5702. markerOpacity: 0,
  5703. markerOpacityOnHover: 0
  5704. },
  5705. floorplan: {
  5706. transitionTime: 1e3,
  5707. modelAlpha: 1,
  5708. modelAlphaDelay: 0,
  5709. modelAlphaLength: 1 - settings$2.flydown.modelTextureDelay,
  5710. skyboxOpacity: 0,
  5711. skyboxOpacityDelay: 0,
  5712. skyboxOpacityLength: 1 - settings$2.flydown.skyboxDelay,
  5713. fovLength: 1,
  5714. fovDelay: 0,
  5715. cameraMatrixDuration: 0.5,
  5716. cameraMatrixDelay: 0,
  5717. cameraMatrixEase: easing.easeOutQuint,
  5718. //easing.easeOutCubic,
  5719. reticuleOpacity: 1,
  5720. markerOpacity: 0,
  5721. markerOpacityOnHover: 0,
  5722. cameraHeight: 50
  5723. },
  5724. transitioning: {
  5725. reticuleOpacity: 0,
  5726. markerOpacity: 0.3,
  5727. markerOpacityOnHover: 1
  5728. },
  5729. 'floorplan-dollhouse': {
  5730. rotationDelay: 0,
  5731. rotationDuration: 1,
  5732. cameraMatrixEase: easing.easeInQuint //原先的ease模型较大时效果不好
  5733. },
  5734. 'floorplan-panorama': {
  5735. rotationDelay: 0.5,
  5736. rotationDuration: 1
  5737. },
  5738. 'dollhouse-panorama': {
  5739. rotationDelay: 0.5,
  5740. rotationDuration: 1
  5741. },
  5742. 'dollhouse-floorplan': {
  5743. rotationDelay: 0,
  5744. rotationDuration: 1,
  5745. cameraMatrixDuration: 1.05,
  5746. cameraMatrixDelay: 0.5
  5747. },
  5748. 'panorama-dollhouse': {
  5749. rotationDelay: 0,
  5750. rotationDuration: 0.5,
  5751. cameraMatrixEase: easing.easeInOutQuad //fov渐变
  5752. },
  5753. 'panorama-floorplan': {
  5754. transitionTime: 1500,
  5755. rotationDelay: 0,
  5756. rotationDuration: 0.5
  5757. },
  5758. //底图版
  5759. /* floorMat: {
  5760. //楼层材质
  5761. 'stardard-hide': {
  5762. //没有plane时的隐藏楼层
  5763. opacity: 0.2,
  5764. brightness: 0.12,
  5765. mixRatio: 0.7,
  5766. depthTest: true,
  5767. //depthWrite: false,
  5768. renderOrder: RenderOrder.ghostFloor, //透明在上层
  5769. //transparent:true
  5770. },
  5771. 'stardard-show': {
  5772. //没有plane时的所有显示楼层
  5773. opacity: 1,
  5774. brightness: 0,
  5775. mixRatio: 0,
  5776. depthTest: true,
  5777. //depthWrite: false,
  5778. renderOrder: RenderOrder.visibleFloor,
  5779. //transparent:true
  5780. },
  5781. 'hasPlane-normal': {
  5782. //有plane时的其他楼层
  5783. opacity: 0.024,
  5784. brightness: 0.6,
  5785. mixRatio: 1,
  5786. depthTest: true,
  5787. //depthWrite: false,
  5788. renderOrder: RenderOrder.visibleFloor,
  5789. //transparent:true
  5790. },
  5791. 'hasPlane-curFloor': {
  5792. //有plane时的当前楼层
  5793. opacity: 1,
  5794. brightness: 0.3, //0.11,
  5795. mixRatio: 0.78, //0.94,
  5796. depthTest: false,
  5797. //depthWrite: false,
  5798. renderOrder: RenderOrder.ghostFloor, //当前楼在上层,所以和之前反一下
  5799. //transparent:true
  5800. },
  5801. }, */
  5802. //修改depthTest超黑版,但会引起其他物体遮挡混乱
  5803. /* 'stardard-hide': {
  5804. //没有plane时的隐藏楼层
  5805. opacity: 0.2,
  5806. brightness: 0.12,
  5807. mixRatio: 0.7,
  5808. depthTest: true,
  5809. //depthWrite: false,
  5810. renderOrder: RenderOrder.ghostFloor, //透明在上层
  5811. //transparent:true
  5812. },
  5813. 'stardard-show': {
  5814. //没有plane时的所有显示楼层
  5815. opacity: 1,
  5816. brightness: 0,
  5817. mixRatio: 0,
  5818. depthTest: true,
  5819. //depthWrite: false,
  5820. renderOrder: RenderOrder.visibleFloor,
  5821. //transparent:true
  5822. },
  5823. 'hasPlane-normal': {
  5824. //有plane时的其他楼层
  5825. opacity: 0.024,
  5826. brightness: 0.6,
  5827. mixRatio: 1,
  5828. depthTest: true,
  5829. //depthWrite: false,
  5830. renderOrder: RenderOrder.ghostFloor ,
  5831. //transparent:true
  5832. },
  5833. 'hasPlane-curFloor': {
  5834. //有plane时的当前楼层
  5835. opacity: 1,
  5836. brightness: 0.1, //0.11,
  5837. mixRatio: 0.98, //0.94,
  5838. depthTest: false,
  5839. //depthWrite: false,
  5840. renderOrder: RenderOrder.ghostFloor+1, //当前楼在上层,所以和之前反一下
  5841. //transparent:true
  5842. }, */
  5843. floorMat: {
  5844. //楼层材质
  5845. 'stardard-hide': {
  5846. //没有plane时的隐藏楼层
  5847. opacity: 0.2,
  5848. brightness: 0.12,
  5849. mixRatio: 0.7,
  5850. depthTest: true,
  5851. renderOrder: RenderOrder.ghostFloor //透明在上层
  5852. },
  5853. 'stardard-show': {
  5854. //没有plane时的所有显示楼层
  5855. opacity: 1,
  5856. brightness: 0,
  5857. mixRatio: 0,
  5858. depthTest: true,
  5859. renderOrder: RenderOrder.visibleFloor
  5860. },
  5861. 'hasPlane-normal': {
  5862. //有plane时的其他楼层
  5863. opacity: 0.024,
  5864. brightness: 0.6,
  5865. mixRatio: 1,
  5866. depthTest: true,
  5867. //depthWrite: false,
  5868. renderOrder: RenderOrder.ghostFloor
  5869. },
  5870. 'hasPlane-curFloor': {
  5871. //有plane时的当前楼层
  5872. opacity: 1,
  5873. brightness: 0.1,
  5874. //0.11,
  5875. mixRatio: 0.98,
  5876. //0.94,
  5877. depthTest: true,
  5878. renderOrder: RenderOrder.visibleFloor
  5879. }
  5880. }
  5881. });
  5882. settings$2.path.meshFree && (settings$2.path.typ = WarpStyle.WALK);
  5883. settings$2.zoom.max = settings$2.zoom.overridemax || settings$2.zoom.max;
  5884. settings$2.zoom.min = settings$2.zoom.overridemin || settings$2.zoom.min;
  5885. settings$2.HorizontalBlurShader = new THREE.ShaderPass(THREE.HorizontalBlurShader);
  5886. settings$2.VerticalBlurShader = new THREE.ShaderPass(THREE.VerticalBlurShader);
  5887. settings$2.VerticalBlurShader.renderToScreen;
  5888. settings$2.aspect = window.innerWidth / window.innerHeight;
  5889. isNaN(constants$4.aspect) && (constants$4.aspect = 1); //settings.sphereBufferGeometry = new THREE.SphereBufferGeometry(0.1)
  5890. settings$2.planeBufferGeometry = new THREE.PlaneBufferGeometry(0.4, 0.4, 1, 1);
  5891. settings$2.freeze = Object.freeze({
  5892. FlyToPano: transitions$1.getUniqueId(),
  5893. FlyToNewMode: transitions$1.getUniqueId(),
  5894. FlyToSameMode: transitions$1.getUniqueId(),
  5895. FlyToViewFloor: transitions$1.getUniqueId(),
  5896. LookTransition: transitions$1.getUniqueId(),
  5897. ZoomTransition: transitions$1.getUniqueId(),
  5898. LookRotationForPlay: transitions$1.getUniqueId(),
  5899. wallLineShine: transitions$1.getUniqueId(),
  5900. spotShine: transitions$1.getUniqueId(),
  5901. rulerShine: transitions$1.getUniqueId(),
  5902. outsideFocus: transitions$1.getUniqueId(),
  5903. shopCircle: transitions$1.getUniqueId()
  5904. });
  5905. var settings$3 = settings$2;
  5906. var _class$1, _class2, _temp;
  5907. var _root = getScriptURL();
  5908. var components = {};
  5909. function defineComponent(name, component) {
  5910. if (typeof components[name] !== 'undefined') {
  5911. console.warn("Identifier component.".concat(name, " has already been declared"));
  5912. }
  5913. if (typeof component !== 'function') {
  5914. throw TypeError("argument component not a function");
  5915. }
  5916. components[name] = component;
  5917. }
  5918. var KanKan = Emitter(_class$1 = (_temp = _class2 = /*#__PURE__*/function () {
  5919. function KanKan(options) {
  5920. _classCallCheck(this, KanKan);
  5921. this.uid = KanKan.uid++;
  5922. this.env = KanKan.env;
  5923. this.version = KanKan.version;
  5924. this.dom = null;
  5925. this.$plugins = null;
  5926. this.core = new Component(this);
  5927. this.config = KanKan.config(options, {});
  5928. this.Plugins = new Plugins(this);
  5929. this.gui = new GUI(this);
  5930. if (this.config.vr.markerHeight != null) {
  5931. settings$3.vrMarkerHeight = this.config.vr.markerHeight;
  5932. }
  5933. if (this.config.scene.markerOpacity != null) {
  5934. settings$3.panorama.markerOpacity = this.config.scene.markerOpacity;
  5935. }
  5936. if (this.config.scene.pathEndColor != null) {
  5937. settings$3.path.color = this.config.scene.pathEndColor;
  5938. }
  5939. }
  5940. _createClass(KanKan, [{
  5941. key: "withConfig",
  5942. value: function withConfig(options) {
  5943. this.config = deepExtend(this.config, options || {}); //deepMergeObject(this.config, options || {})
  5944. }
  5945. }, {
  5946. key: "withDom",
  5947. value: function withDom() {
  5948. if (this.dom) {
  5949. // 已经初始化好,不再创建dom
  5950. return;
  5951. }
  5952. var container = typeof this.config.dom === 'string' ? document.querySelector(this.config.dom) : this.config.dom;
  5953. if (!container) {
  5954. throw new Error('options.dom must be require');
  5955. }
  5956. var dom = document.createElement('div');
  5957. dom.className = 'kankan-app';
  5958. var plugins = document.createElement('div');
  5959. plugins.id = "kankan-plugins__".concat(this.uid);
  5960. plugins.className = 'kankan-plugins';
  5961. plugins.style.position = 'absolute';
  5962. plugins.style.top = 0;
  5963. plugins.style.left = 0;
  5964. plugins.style.width = '100%';
  5965. plugins.style.height = '100%';
  5966. plugins.style.pointerEvents = 'none';
  5967. plugins.style.zIndex = 10;
  5968. var player_a = document.createElement('div');
  5969. player_a.className = 'player';
  5970. player_a.setAttribute('name', 'main');
  5971. var player_b = document.createElement('div');
  5972. player_b.className = 'player';
  5973. player_b.setAttribute('name', 'copy');
  5974. var player_mark = document.createElement('div');
  5975. player_mark.className = 'player-mark';
  5976. player_mark.style.backgroundImage = "url(".concat(this.resource.base('images/tag_pointer.png'), ")");
  5977. player_a.appendChild(player_mark);
  5978. player_b.appendChild(player_mark.cloneNode());
  5979. dom.appendChild(plugins);
  5980. dom.appendChild(player_a);
  5981. dom.appendChild(player_b);
  5982. container.appendChild(dom);
  5983. this.dom = dom;
  5984. this.$plugins = plugins;
  5985. }
  5986. }, {
  5987. key: "withComponent",
  5988. value: function withComponent(name) {
  5989. var factory = components[name];
  5990. if (typeof factory === 'undefined') {
  5991. console.warn("component[".concat(name, "] not a function"));
  5992. return;
  5993. }
  5994. var Instance = factory();
  5995. Instance.prototype.$app = this;
  5996. for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
  5997. args[_key - 1] = arguments[_key];
  5998. }
  5999. this.core.add(name, _construct(Instance, args));
  6000. }
  6001. }, {
  6002. key: "withNewComponent",
  6003. value: function withNewComponent(name) {
  6004. var factory = components[name];
  6005. if (typeof factory === 'undefined') {
  6006. console.warn("component[".concat(name, "] not a function"));
  6007. return;
  6008. }
  6009. var Instance = factory();
  6010. Instance.prototype.$app = this;
  6011. for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
  6012. args[_key2 - 1] = arguments[_key2];
  6013. }
  6014. return _construct(Instance, args);
  6015. }
  6016. }], [{
  6017. key: "root",
  6018. value: function root(path) {
  6019. return _root + path;
  6020. }
  6021. }, {
  6022. key: "config",
  6023. value: function config(options, target) {
  6024. if (typeof options !== 'object') {
  6025. return config$6;
  6026. }
  6027. if (target) {
  6028. target = Object.assign(target, config$6);
  6029. }
  6030. for (var key in options) {
  6031. if (['env', 'version'].indexOf(key) != -1) {
  6032. continue;
  6033. }
  6034. if (typeof config$6[key] === 'undefined') {
  6035. continue;
  6036. }
  6037. if (target) {
  6038. target[key] = options[key];
  6039. }
  6040. config$6[key] = options[key];
  6041. }
  6042. return target || config$6;
  6043. }
  6044. }]);
  6045. return KanKan;
  6046. }(), _class2.uid = 1, _class2.env = config$6.env, _class2.version = config$6.version, _class2.Config = config$6, _temp)) || _class$1;
  6047. var MathLight = {};
  6048. MathLight.RADIANS_PER_DEGREE = Math.PI / 180;
  6049. MathLight.DEGREES_PER_RADIAN = 180 / Math.PI;
  6050. MathLight.Vector3 = function (e, t, i) {
  6051. this.x = e || 0, this.y = t || 0, this.z = i || 0;
  6052. };
  6053. MathLight.Matrix4 = function () {
  6054. 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.');
  6055. };
  6056. MathLight.Matrix4.prototype = {
  6057. identity: function identity() {
  6058. return this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1), this;
  6059. },
  6060. copy: function copy(e) {
  6061. return this.elements.set(e.elements), this;
  6062. },
  6063. applyToVector3: function applyToVector3(e) {
  6064. var t = e.x,
  6065. i = e.y,
  6066. n = e.z,
  6067. r = this.elements;
  6068. 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;
  6069. },
  6070. getInverse: function getInverse(e, t) {
  6071. var i = this.elements,
  6072. n = e.elements,
  6073. r = n[0],
  6074. o = n[1],
  6075. a = n[2],
  6076. s = n[3],
  6077. l = n[4],
  6078. c = n[5],
  6079. h = n[6],
  6080. u = n[7],
  6081. d = n[8],
  6082. p = n[9],
  6083. f = n[10],
  6084. g = n[11],
  6085. m = n[12],
  6086. v = n[13],
  6087. A = n[14],
  6088. y = n[15],
  6089. C = p * A * u - v * f * u + v * h * g - c * A * g - p * h * y + c * f * y,
  6090. I = m * f * u - d * A * u - m * h * g + l * A * g + d * h * y - l * f * y,
  6091. E = d * v * u - m * p * u + m * c * g - l * v * g - d * c * y + l * p * y,
  6092. b = m * p * h - d * v * h - m * c * f + l * v * f + d * c * A - l * p * A,
  6093. w = r * C + o * I + a * E + s * b;
  6094. if (0 === w) {
  6095. var _ = "MathLight.Matrix4.getInverse(): can't invert matrix, determinant is 0";
  6096. if (t) throw new Error(_);
  6097. return console.warn(_), this.identity();
  6098. }
  6099. var T = 1 / w;
  6100. 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;
  6101. },
  6102. makeRotationFromQuaternion: function makeRotationFromQuaternion(e) {
  6103. var t = this.elements,
  6104. i = e.x,
  6105. n = e.y,
  6106. r = e.z,
  6107. o = e.w,
  6108. a = i + i,
  6109. s = n + n,
  6110. l = r + r,
  6111. c = i * a,
  6112. h = i * s,
  6113. u = i * l,
  6114. d = n * s,
  6115. p = n * l,
  6116. f = r * l,
  6117. g = o * a,
  6118. m = o * s,
  6119. v = o * l;
  6120. 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;
  6121. }
  6122. };
  6123. MathLight.Quaternion = function (e, t, i, n) {
  6124. this._x = e || 0, this._y = t || 0, this._z = i || 0, this._w = void 0 !== n ? n : 1;
  6125. };
  6126. MathLight.Quaternion.prototype = {
  6127. get x() {
  6128. return this._x;
  6129. },
  6130. set x(e) {
  6131. this._x = e;
  6132. },
  6133. get y() {
  6134. return this._y;
  6135. },
  6136. set y(e) {
  6137. this._y = e;
  6138. },
  6139. get z() {
  6140. return this._z;
  6141. },
  6142. set z(e) {
  6143. this._z = e;
  6144. },
  6145. get w() {
  6146. return this._w;
  6147. },
  6148. set w(e) {
  6149. this._w = e;
  6150. },
  6151. copy: function copy(e) {
  6152. this._x = e.x, this._y = e.y, this._z = e.z, this._w = e.w;
  6153. },
  6154. inverse: function inverse() {
  6155. return this.conjugate().normalize();
  6156. },
  6157. conjugate: function conjugate() {
  6158. return this._x *= -1, this._y *= -1, this._z *= -1, this;
  6159. },
  6160. length: function length() {
  6161. return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w);
  6162. },
  6163. normalize: function normalize() {
  6164. var e = this.length();
  6165. 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;
  6166. },
  6167. setFromAxisAngle: function setFromAxisAngle(e, t) {
  6168. var i = t / 2,
  6169. n = Math.sin(i);
  6170. return this._x = e.x * n, this._y = e.y * n, this._z = e.z * n, this._w = Math.cos(i), this;
  6171. },
  6172. setFromUnitVectors: function () {
  6173. var e,
  6174. t,
  6175. i = 1e-6;
  6176. return function (n, o) {
  6177. 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();
  6178. };
  6179. }(),
  6180. multiply: function multiply(e) {
  6181. return this.multiplyQuaternions(this, e);
  6182. },
  6183. premultiply: function premultiply(e) {
  6184. return this.multiplyQuaternions(e, this);
  6185. },
  6186. multiplyQuaternions: function multiplyQuaternions(e, t) {
  6187. var i = e._x,
  6188. n = e._y,
  6189. r = e._z,
  6190. o = e._w,
  6191. a = t._x,
  6192. s = t._y,
  6193. l = t._z,
  6194. c = t._w;
  6195. 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;
  6196. }
  6197. };
  6198. MathLight.convertWorkshopVector = function (e) {
  6199. return new MathLight.Vector3(-e.x, e.y, e.z);
  6200. };
  6201. MathLight.convertWorkshopQuaternion = function (e) {
  6202. 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));
  6203. };
  6204. MathLight.convertWorkshopOrthoZoom = function (e) {
  6205. return e === -1 ? -1 : e / 16 * (window.innerWidth / window.innerHeight) / constants$4.workshopApsect;
  6206. };
  6207. MathLight.convertWorkshopPanoramaQuaternion = function (e) {
  6208. 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));
  6209. };
  6210. MathLight.normalize = function (e) {
  6211. var t = e.x * e.x + e.y * e.y + e.z * e.z,
  6212. i = Math.sqrt(t);
  6213. e.x /= i, e.y /= i, e.z /= i;
  6214. };
  6215. MathLight.dot = function (e, t) {
  6216. return e.x * t.x + e.y * t.y + e.z * t.z;
  6217. };
  6218. MathLight.cross = function (e, t, i) {
  6219. var n = e.x,
  6220. r = e.y,
  6221. o = e.z;
  6222. i.x = r * t.z - o * t.y, i.y = o * t.x - n * t.z, i.z = n * t.y - r * t.x;
  6223. };
  6224. MathLight.setVector = function (e, t, i, n) {
  6225. e.x = t, e.y = i, e.z = n;
  6226. };
  6227. MathLight.copyVector = function (e, t) {
  6228. t.x = e.x, t.y = e.y, t.z = e.z;
  6229. };
  6230. MathLight.addVector = function (e, t) {
  6231. e.x += t.x, e.y += t.y, e.z += t.z;
  6232. };
  6233. MathLight.subVector = function (e, t) {
  6234. e.x -= t.x, e.y -= t.y, e.z -= t.z;
  6235. };
  6236. MathLight.applyQuaternionToVector = function (e, t) {
  6237. var i = t.x,
  6238. n = t.y,
  6239. r = t.z,
  6240. o = e.x,
  6241. a = e.y,
  6242. s = e.z,
  6243. l = e.w,
  6244. c = l * i + a * r - s * n,
  6245. h = l * n + s * i - o * r,
  6246. u = l * r + o * n - a * i,
  6247. d = -o * i - a * n - s * r;
  6248. 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;
  6249. };
  6250. MathLight.angleBetweenVectors = function (e, t) {
  6251. return Math.acos(MathLight.dot(e, t));
  6252. };
  6253. MathLight.closeTo = function (e1, e2, precision) {
  6254. //xzw add 判断e1,e2是否接近
  6255. var prec = Math.pow(10, -(precision || 4));
  6256. var s1 = Math.abs(e1.x - e2.x) < prec && Math.abs(e1.y - e2.y) < prec && Math.abs(e1.z - e2.z) < prec;
  6257. if (e1.w) {
  6258. return s1 && Math.abs(e1.w - e2.w) < prec;
  6259. } else return s1;
  6260. };
  6261. /**
  6262. * 日志输出
  6263. */
  6264. var logger$1 = {
  6265. info() {
  6266. var _console;
  6267. (_console = console).log.apply(_console, arguments);
  6268. },
  6269. debug() {
  6270. var _console2;
  6271. (_console2 = console).debug.apply(_console2, arguments);
  6272. },
  6273. error() {
  6274. var _console3;
  6275. (_console3 = console).error.apply(_console3, arguments);
  6276. },
  6277. warn() {
  6278. var _console4;
  6279. (_console4 = console).warn.apply(_console4, arguments);
  6280. },
  6281. time(s) {
  6282. console.time(s);
  6283. },
  6284. timeEnd(s) {
  6285. console.timeEnd(s);
  6286. },
  6287. message(s) {
  6288. alert(s);
  6289. }
  6290. };
  6291. var BlackoutStyle$1 = {
  6292. NONE: 0,
  6293. MIDDLE: 1,
  6294. END: 2,
  6295. BEGINNING: 3,
  6296. FADEIN: 4
  6297. };
  6298. var ZoomStats = function ZoomStats() {
  6299. this.actionSequence = [], this.actionSequenceInProgress = !1;
  6300. }; // function r(e, t, i, n) {
  6301. ZoomStats.prototype.reset = function (e) {
  6302. this.actionSequenceInProgress = !1, this.actionSequence.length = 0;
  6303. };
  6304. ZoomStats.prototype.addZoomAction = function () {
  6305. var e = null,
  6306. t = null,
  6307. i = !1,
  6308. n = function n() {
  6309. if (e = null, this.actionSequence.length > 0) {
  6310. this.actionSequence[0].start;
  6311. this.actionSequence[this.actionSequence.length - 1].end;
  6312. }
  6313. this.reset();
  6314. };
  6315. return function (r, o, a) {
  6316. if (r !== o) {
  6317. i || (n = n.bind(this), i = !0), e && (window.clearTimeout(e), e = null), a === t && this.actionSequenceInProgress || (this.reset(), t = a), this.actionSequenceInProgress = !0;
  6318. var s = {
  6319. start: r,
  6320. end: o
  6321. };
  6322. this.actionSequence.push(s), e = window.setTimeout(n, 150);
  6323. }
  6324. };
  6325. }();
  6326. var Joystick = {
  6327. UP: 1,
  6328. DOWN: -1,
  6329. LEFT: 'L',
  6330. RIGHT: 'R',
  6331. FORWARD: 'F',
  6332. BACK: 'B',
  6333. reverse: {},
  6334. opposite: function opposite(e) {
  6335. return this.reverse[e.toString()];
  6336. }
  6337. };
  6338. !function () {
  6339. 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;
  6340. }();
  6341. var History$1 = /*#__PURE__*/function () {
  6342. function History() {
  6343. _classCallCheck(this, History);
  6344. this.events = [];
  6345. this.valid = !1;
  6346. }
  6347. _createClass(History, [{
  6348. key: "push",
  6349. value: function push(e, t) {
  6350. this.events.push({
  6351. direction: e,
  6352. pano: t
  6353. });
  6354. this.valid = !0;
  6355. }
  6356. }, {
  6357. key: "pop",
  6358. value: function pop(e) {
  6359. var t = this.events.pop();
  6360. return this.events.length < 1 && (this.valid = !1), t;
  6361. }
  6362. }, {
  6363. key: "peek",
  6364. value: function peek() {
  6365. return this.events.length ? this.events[this.events.length - 1] : {
  6366. direction: null,
  6367. pano: null
  6368. };
  6369. }
  6370. }, {
  6371. key: "invalidate",
  6372. value: function invalidate() {
  6373. this.events = [];
  6374. this.valid = !1;
  6375. }
  6376. }, {
  6377. key: "reversePano",
  6378. value: function reversePano(e) {
  6379. if (!this.valid) return null;
  6380. var t = this.peek();
  6381. return Joystick.opposite(e) === t.direction ? (this.pop(), t.pano) : null;
  6382. }
  6383. }]);
  6384. return History;
  6385. }();
  6386. var Viewmode$1 = {
  6387. PANORAMA: 'panorama',
  6388. DOLLHOUSE: 'dollhouse',
  6389. FLOORPLAN: 'floorplan',
  6390. TRANSITIONING: 'transitioning'
  6391. };
  6392. Viewmode$1.toInt = function (mode) {
  6393. switch (mode) {
  6394. case this.PANORAMA:
  6395. return 1;
  6396. case this.DOLLHOUSE:
  6397. return 2;
  6398. case this.FLOORPLAN:
  6399. return 3;
  6400. case this.TRANSITIONING:
  6401. return -1;
  6402. }
  6403. throw new Error('未知模式: ' + c);
  6404. };
  6405. Viewmode$1.fromInt = function (mode) {
  6406. switch (mode) {
  6407. case '1':
  6408. case 1:
  6409. return this.PANORAMA;
  6410. case '2':
  6411. case 2:
  6412. return this.DOLLHOUSE;
  6413. case '3':
  6414. case 3:
  6415. return this.FLOORPLAN;
  6416. }
  6417. throw new Error('未知模式: ' + c);
  6418. };
  6419. var ModelUrls = /*#__PURE__*/function () {
  6420. function ModelUrls(projectNum, app) {
  6421. _classCallCheck(this, ModelUrls);
  6422. this.version = 1;
  6423. this.cache = null;
  6424. this.expires = 0;
  6425. this.projectNum = projectNum;
  6426. this.app = app;
  6427. }
  6428. _createClass(ModelUrls, [{
  6429. key: "validate",
  6430. value: function validate(e) {
  6431. return 'catalog.json' in e && Object.keys(e).length > 0;
  6432. }
  6433. }, {
  6434. key: "update",
  6435. value: function update(e) {
  6436. this.cache = e;
  6437. this.expires = Date.now() + constants.signedUrlDefaultExpireTime;
  6438. return Deferred$1.when();
  6439. }
  6440. }, {
  6441. key: "get",
  6442. value: function get(e) {
  6443. return this.app.resource.getViewImagesURL(e);
  6444. }
  6445. }]);
  6446. return ModelUrls;
  6447. }();
  6448. var IndexedCollection = /*#__PURE__*/function () {
  6449. function IndexedCollection() {
  6450. _classCallCheck(this, IndexedCollection);
  6451. this.list = [];
  6452. this.index = {};
  6453. Object.defineProperty(this, 'length', {
  6454. get: function get() {
  6455. return this.list.length;
  6456. }
  6457. });
  6458. if (typeof this.getIndex != 'function') {
  6459. throw new Error('IndexedCollection.getIndex not implemented in subclass.');
  6460. }
  6461. }
  6462. _createClass(IndexedCollection, [{
  6463. key: "forEach",
  6464. value: function forEach(e) {
  6465. this.list.forEach(e);
  6466. }
  6467. }, {
  6468. key: "add",
  6469. value: function add(pano) {
  6470. this.list.push(pano);
  6471. this.index[this.getIndex(pano)] = pano;
  6472. }
  6473. }, {
  6474. key: "extend",
  6475. value: function extend(e) {
  6476. for (var t = 0; t < e.length; t++) {
  6477. this.add(e[t]);
  6478. }
  6479. }
  6480. }, {
  6481. key: "get",
  6482. value: function get(panoId) {
  6483. return this.index[panoId];
  6484. }
  6485. }, {
  6486. key: "first",
  6487. value: function first() {
  6488. return this.list[0];
  6489. }
  6490. }, {
  6491. key: "last",
  6492. value: function last() {
  6493. return this.list[this.list.length - 1];
  6494. }
  6495. }, {
  6496. key: "reIndex",
  6497. value: function reIndex() {
  6498. this.index = {};
  6499. var e = this;
  6500. this.forEach(function (t) {
  6501. e.index[e.getIndex(t)] = t;
  6502. });
  6503. }
  6504. }, {
  6505. key: "filter",
  6506. value: function filter(e) {
  6507. var t = this.list.filter(e);
  6508. return this.reIndex(), t;
  6509. }
  6510. }, {
  6511. key: "reduce",
  6512. value: function reduce(e, t) {
  6513. return this.list.reduce(e, t);
  6514. }
  6515. }, {
  6516. key: "sort",
  6517. value: function sort(e) {
  6518. return this.list.sort(e);
  6519. }
  6520. }, {
  6521. key: "indexOf",
  6522. value: function indexOf(e) {
  6523. for (var t = 0; t < this.list.length; ++t) {
  6524. if (this.list[t] === e) return t;
  6525. }
  6526. return -1;
  6527. }
  6528. }, {
  6529. key: "clone",
  6530. value: function clone() {
  6531. //xzw add
  6532. var newobj = new this.constructor();
  6533. newobj.extend(this.list);
  6534. return newobj;
  6535. }
  6536. }]);
  6537. return IndexedCollection;
  6538. }();
  6539. var ChunkedCollider = /*#__PURE__*/function () {
  6540. function ChunkedCollider(chunksize) {
  6541. _classCallCheck(this, ChunkedCollider);
  6542. this.chunksize = chunksize || 10;
  6543. this.chunks = {};
  6544. this.boundingBoxes = {};
  6545. this.children = [];
  6546. this.offset = new THREE.Vector3(0, 0.5, 0);
  6547. this.material = new THREE.MeshBasicMaterial({
  6548. color: 16777215 * Math.random(),
  6549. side: THREE.DoubleSide
  6550. });
  6551. }
  6552. _createClass(ChunkedCollider, [{
  6553. key: "add",
  6554. value: function add(geometry) {
  6555. var vertices,
  6556. index,
  6557. o,
  6558. a,
  6559. s,
  6560. l,
  6561. c,
  6562. h,
  6563. u,
  6564. d,
  6565. p,
  6566. f,
  6567. g,
  6568. attributes = geometry.attributes;
  6569. if (attributes) {
  6570. vertices = attributes.position.array;
  6571. index = void 0 !== geometry.index ? geometry.index.array : void 0;
  6572. } else {
  6573. vertices = geometry.vertices;
  6574. }
  6575. var v = new THREE.Vector3();
  6576. if (index) {
  6577. for (o = 0, a = index.length; o < a; o += 3) {
  6578. var triangleIndex1 = 3 * index[o],
  6579. triangleIndex2 = 3 * index[o + 1],
  6580. triangleIndex3 = 3 * index[o + 2];
  6581. s = (vertices[triangleIndex1] + vertices[triangleIndex2] + vertices[triangleIndex3]) / 3;
  6582. l = (vertices[triangleIndex1 + 1] + vertices[triangleIndex2 + 1] + vertices[triangleIndex3 + 1]) / 3;
  6583. c = (vertices[triangleIndex1 + 2] + vertices[triangleIndex2 + 2] + vertices[triangleIndex3 + 2]) / 3;
  6584. h = Math.floor(s / this.chunksize);
  6585. u = Math.floor(l / this.chunksize);
  6586. d = Math.floor(c / this.chunksize);
  6587. p = h + '.' + u + '.' + d;
  6588. if (p in this.chunks) {
  6589. g = this.chunks[p];
  6590. f = this.boundingBoxes[p];
  6591. } else {
  6592. g = this.chunks[p] = [];
  6593. f = this.boundingBoxes[p] = new THREE.Box3();
  6594. }
  6595. 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]);
  6596. f.expandByPoint(v.set(vertices[triangleIndex1], vertices[triangleIndex1 + 1], vertices[triangleIndex1 + 2]));
  6597. f.expandByPoint(v.set(vertices[triangleIndex2], vertices[triangleIndex2 + 1], vertices[triangleIndex2 + 2]));
  6598. f.expandByPoint(v.set(vertices[triangleIndex3], vertices[triangleIndex3 + 1], vertices[triangleIndex3 + 2]));
  6599. }
  6600. } else {
  6601. for (o = 0, a = vertices.length; o < a; o += 9) {
  6602. 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;
  6603. if (p in this.chunks) {
  6604. g = this.chunks[p];
  6605. f = this.boundingBoxes[p];
  6606. } else {
  6607. g = this.chunks[p] = [];
  6608. f = this.boundingBoxes[p] = new THREE.Box3();
  6609. }
  6610. 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]);
  6611. f.expandByPoint(v.set(vertices[o], vertices[o + 1], vertices[o + 2]));
  6612. f.expandByPoint(v.set(vertices[o + 3], vertices[o + 4], vertices[o + 5]));
  6613. f.expandByPoint(v.set(vertices[o + 6], vertices[o + 7], vertices[o + 8]));
  6614. }
  6615. }
  6616. }
  6617. }, {
  6618. key: "build",
  6619. value: function build() {
  6620. var object3D = new THREE.Object3D();
  6621. object3D.material = this.material;
  6622. object3D.name = 'colliderGroup';
  6623. for (var t in this.chunks) {
  6624. var chunk = this.chunks[t],
  6625. bufferGeometry = new THREE.BufferGeometry();
  6626. bufferGeometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(chunk), 3));
  6627. bufferGeometry.boundingBox = this.boundingBoxes[t];
  6628. var mesh = new THREE.Mesh(bufferGeometry, this.material);
  6629. mesh.material.visible = !1;
  6630. mesh.name = 'collider';
  6631. object3D.add(mesh);
  6632. this.chunks[t] = [];
  6633. }
  6634. return object3D;
  6635. }
  6636. }]);
  6637. return ChunkedCollider;
  6638. }();
  6639. 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); }; }
  6640. 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; } }
  6641. var Floor$1 = /*#__PURE__*/function (_THREE$Object3D) {
  6642. _inherits(Floor, _THREE$Object3D);
  6643. var _super = _createSuper$1O(Floor);
  6644. function Floor(model, floorIndex, name) {
  6645. var _this;
  6646. _classCallCheck(this, Floor);
  6647. _this = _super.call(this);
  6648. _this.model = model;
  6649. _this.floorIndex = floorIndex;
  6650. _this.name = name || '楼层' + (floorIndex + 1);
  6651. _this.panos = [];
  6652. _this.chunksDam = [];
  6653. _this.tiles = [];
  6654. _this.colliderBuilder = new ChunkedCollider(3);
  6655. _this.collider = null;
  6656. _this.center = null;
  6657. _this.boundingBox = new THREE.Box3();
  6658. _this.size = null;
  6659. _this.hidden = !1;
  6660. _this.display = true;
  6661. _this.conservativeBoundingBox = new THREE.Box3();
  6662. _this.debugColor = 16777215 * Math.random();
  6663. _this.transition = null;
  6664. _this.entryArrow = [];
  6665. _this.views = [];
  6666. return _this;
  6667. }
  6668. _createClass(Floor, [{
  6669. key: "chunks",
  6670. get: function get() {
  6671. if (this.chunksDam.length) {
  6672. // Dam
  6673. return this.chunksDam;
  6674. } else {
  6675. // 3dTiles
  6676. var chunks = [];
  6677. this.tiles.forEach(function (tile) {
  6678. tile.traverse(function (obj) {
  6679. if (obj.isChunk) {
  6680. chunks.push(obj);
  6681. }
  6682. });
  6683. });
  6684. return chunks;
  6685. }
  6686. }
  6687. /**
  6688. * 设置为当前楼层
  6689. */
  6690. }, {
  6691. key: "enter",
  6692. value: function enter(mode) {
  6693. // setFloor会设置楼层显隐
  6694. this.model.setFloor(this, mode);
  6695. }
  6696. /**
  6697. * 显示该楼层
  6698. */
  6699. }, {
  6700. key: "show",
  6701. value: function show() {
  6702. var _this2 = this;
  6703. var player = this.model.$app.core.get('Player');
  6704. this.hidden = !1; //transparent恒为true才能设置遮挡
  6705. /* this.chunks.forEach(chunk => {
  6706. chunk.material.transparent = !1
  6707. }) */
  6708. // 显示该楼层的球幕marker(locked时、飞入时、编辑cad时不显示),
  6709. var canShowVideoMarker = this.model.$app.core.get('PanoVideoRenderer').canShowMarker();
  6710. player.modeTran.split('-')[1] == 'panorama' || player.locked || canShowVideoMarker && this.panos.forEach(function (pano) {
  6711. return pano.hasVideo && pano.hasNeighbor() && (pano.marker.material.opacity = 1);
  6712. }); // 显示楼层label和overlay等
  6713. setTimeout(function () {
  6714. // setTimeout用于防止flyToNewModel前执行show
  6715. player.mode == 'floorplan' && _this2.model.floorplanCadImg.showCadPlane(); // 显示cad
  6716. _this2.setMaterial();
  6717. player.labelManager && player.labelManager.show(_this2.floorIndex);
  6718. player.OverlayManager && player.OverlayManager.show(_this2.floorIndex, true);
  6719. player.GLTFEditor && player.GLTFEditor.show(_this2.floorIndex, true);
  6720. _this2.model.$app.Camera.monitor.control.showAll(_this2.floorIndex);
  6721. }, 1); // console.error('显示楼层:' + this.floorIndex)
  6722. }
  6723. /**
  6724. * 隐藏该楼层
  6725. */
  6726. }, {
  6727. key: "hide",
  6728. value: function hide() {
  6729. var _this3 = this;
  6730. this.hidden = !0;
  6731. /* this.chunks.forEach(chunk => {
  6732. chunk.material.transparent = !0
  6733. }) */
  6734. this.setMaterial(); // 隐藏该楼层的球幕marker
  6735. this.panos.forEach(function (pano) {
  6736. return pano.hasVideo && (pano.marker.material.opacity = 0);
  6737. }); // 隐藏楼层label和overlay等
  6738. var player = this.model.$app.core.get('Player');
  6739. setTimeout(function () {
  6740. player.labelManager && player.labelManager.hide(_this3.floorIndex);
  6741. player.OverlayManager && player.OverlayManager.hide(_this3.floorIndex);
  6742. player.GLTFEditor && player.GLTFEditor.hide(_this3.floorIndex);
  6743. _this3.model.$app.Camera.monitor.control.hideAll(_this3.floorIndex);
  6744. }, 1); // console.error('隐藏楼层:' + this.floorIndex)
  6745. }
  6746. /**
  6747. * 切换该楼层显隐
  6748. */
  6749. }, {
  6750. key: "toggle",
  6751. value: function toggle(ifShow) {
  6752. //switch状态
  6753. if (ifShow === void 0) ifShow = this.hidden;
  6754. ifShow ? this.show() : this.hide();
  6755. }
  6756. /**
  6757. * chunks(Dam)
  6758. */
  6759. }, {
  6760. key: "addChunk",
  6761. value: function addChunk(chunk) {
  6762. //chunk.renderOrder = RenderOrder.ghostFloor
  6763. this.add(chunk);
  6764. this.chunksDam.push(chunk);
  6765. this.boundingBox.union(chunk.geometry.boundingBox);
  6766. var size = new THREE.Vector3();
  6767. this.boundingBox.getSize(size);
  6768. this.size = size;
  6769. this.colliderBuilder.add(chunk.geometry);
  6770. chunk.floor = this;
  6771. }
  6772. /**
  6773. * tiles
  6774. */
  6775. }, {
  6776. key: "addTile",
  6777. value: function addTile(tileContent) {
  6778. var _this4 = this;
  6779. tileContent.floorIndex = this.floorIndex;
  6780. this.tiles.push(tileContent);
  6781. this.add(tileContent);
  6782. tileContent.modified = '';
  6783. tileContent.traverse(function (obj) {
  6784. if (obj.isChunk) {
  6785. obj.setMode(_this4.model.mode, _this4.model.$app.core.get('Player').modeTran); //obj.renderOrder = RenderOrder.ghostFloor
  6786. _this4.setMaterial(obj); // floor显隐判断
  6787. // floor显隐判断
  6788. /* if(this.hidden){
  6789. obj.material.uniforms.opacity.value = settings.floorMat['stardard-hide'].opacity
  6790. obj.material.uniforms.mixRatio && (obj.material.uniforms.mixRatio.value = settings.floorMat['stardard-hide'].mixRatio )
  6791. obj.material.uniforms.brightness && (obj.material.uniforms.brightness.value = settings.floorMat['stardard-hide'].brightness )
  6792. }else{
  6793. obj.material.uniforms.opacity.value = settings.floorMat['stardard-show'].opacity
  6794. obj.material.uniforms.mixRatio && (obj.material.uniforms.mixRatio.value = settings.floorMat['stardard-show'].mixRatio )
  6795. obj.material.uniforms.brightness && (obj.material.uniforms.brightness.value = settings.floorMat['stardard-show'].brightness )
  6796. } */
  6797. //obj.material.transparent = this.hidden
  6798. // todo 关于3dtiles的boundingBox和collider
  6799. _this4.boundingBox.union(obj.geometry.boundingBox);
  6800. var size = new THREE.Vector3();
  6801. _this4.boundingBox.getSize(size);
  6802. _this4.size = size;
  6803. _this4.colliderBuilder && _this4.colliderBuilder.add(obj.geometry);
  6804. }
  6805. });
  6806. }
  6807. }, {
  6808. key: "removeTile",
  6809. value: function removeTile(tileContent) {
  6810. this.tiles = this.tiles.filter(function (tile) {
  6811. return tile !== tileContent;
  6812. });
  6813. tileContent.traverse(function (obj) {
  6814. if (obj.isChunk) {
  6815. obj.geometry.dispose();
  6816. obj.material.dispose();
  6817. obj.material.uniforms.map.value && obj.material.uniforms.map.value.dispose();
  6818. }
  6819. });
  6820. this.remove(tileContent);
  6821. tileContent.modified = 'remove';
  6822. }
  6823. /**
  6824. * panos
  6825. */
  6826. }, {
  6827. key: "addPano",
  6828. value: function addPano(pano) {
  6829. this.panos.push(pano); //this.add(pano.skyboxMesh)
  6830. pano.marker && this.add(pano.marker);
  6831. var t = new THREE.Vector3(1, 1, 1),
  6832. i = new THREE.Box3().setFromCenterAndSize(pano.position, t);
  6833. this.boundingBox.union(i);
  6834. }
  6835. }, {
  6836. key: "removePano",
  6837. value: function removePano(pano) {
  6838. var index = this.panos.indexOf(pano);
  6839. index > -1 && this.panos.splice(index, 1);
  6840. }
  6841. /**
  6842. * 场景关联
  6843. */
  6844. }, {
  6845. key: "addView",
  6846. value: function addView(view) {
  6847. this.views.push(view);
  6848. }
  6849. }, {
  6850. key: "removeView",
  6851. value: function removeView(view) {
  6852. var index = this.views.indexOf(view);
  6853. index > -1 && this.views.splice(index, 1);
  6854. }
  6855. /**
  6856. * 初始化
  6857. */
  6858. }, {
  6859. key: "build",
  6860. value: function build() {
  6861. this.collider = this.colliderBuilder.build(!0);
  6862. this.collider.floor = this; //this.add(this.collider)
  6863. var center = new THREE.Vector3();
  6864. this.boundingBox.getCenter(center);
  6865. this.center = center;
  6866. this.conservativeBoundingBox.copy(this.boundingBox);
  6867. this.conservativeBoundingBox.min.y = common$1.lowerMedian(this.collider.children.map(function (mesh) {
  6868. return mesh.geometry.boundingBox.min.y;
  6869. }), 5);
  6870. this.conservativeBoundingBox.max.y = common$1.lowerMedian(this.collider.children.map(function (mesh) {
  6871. return mesh.geometry.boundingBox.max.y;
  6872. }), 5);
  6873. this.colliderBuilder = null;
  6874. }
  6875. }, {
  6876. key: "toShortString",
  6877. value: function toShortString() {
  6878. return common$1.nth(this.floorIndex + 1);
  6879. }
  6880. }, {
  6881. key: "toString",
  6882. value: function toString() {
  6883. return this.name;
  6884. }
  6885. }, {
  6886. key: "setMaterial",
  6887. value: function setMaterial(mesh) {
  6888. var matPropName, meshes;
  6889. if (mesh) {
  6890. matPropName = this.matPropName, meshes = [mesh];
  6891. } else {
  6892. this.model.$app.core.get('Player').modeTran;
  6893. /* let hasCadPlane =
  6894. modeTran.split('-')[1] == 'floorplan' && this.model.currentFloor.shouldShowPlane && !this.model.currentFloor.imgLoadFailed && this.model.$app.store.getValue('metadata').floorPlanUser //需要展示cad(默认floorplan没有all的可能)
  6895. */
  6896. var hasCadPlane = false; //cad的也不变暗
  6897. matPropName = this.matPropName = hasCadPlane ? this.hidden ? 'hasPlane-normal' : 'hasPlane-curFloor' : this.hidden ? 'stardard-hide' : 'stardard-show';
  6898. meshes = this.chunks; //console.log(matPropName, hasCadPlane)
  6899. }
  6900. var matProps = settings$3.floorMat[matPropName];
  6901. meshes.forEach(function (chunk) {
  6902. for (var name in matProps) {
  6903. if (name == 'renderOrder') {
  6904. chunk.renderOrder = matProps[name];
  6905. } else if (name == 'depthTest' || name == 'depthWrite' || name == 'transparent') {
  6906. //不知道为什么当前楼层不能完全遮住其他楼层,即使更改了depthTest等
  6907. chunk.materialOutside[name] = matProps[name];
  6908. } else {
  6909. chunk.materialOutside.extraValues[name] = chunk.materialOutside.uniforms[name].value = matProps[name];
  6910. }
  6911. }
  6912. });
  6913. }
  6914. }]);
  6915. return Floor;
  6916. }(THREE.Object3D);
  6917. 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); }; }
  6918. 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; } }
  6919. var FloorCollection = /*#__PURE__*/function (_IndexedCollection) {
  6920. _inherits(FloorCollection, _IndexedCollection);
  6921. var _super = _createSuper$1N(FloorCollection);
  6922. function FloorCollection(model) {
  6923. var _this;
  6924. _classCallCheck(this, FloorCollection);
  6925. _this = _super.call(this);
  6926. _this.model = model;
  6927. _this.exploded = !1;
  6928. return _this;
  6929. }
  6930. _createClass(FloorCollection, [{
  6931. key: "add",
  6932. value: function add(floor) {
  6933. _get(_getPrototypeOf(FloorCollection.prototype), "add", this).call(this, floor);
  6934. this.model.add(floor);
  6935. }
  6936. }, {
  6937. key: "getIndex",
  6938. value: function getIndex(floor) {
  6939. return floor.floorIndex;
  6940. }
  6941. }, {
  6942. key: "build",
  6943. value: function build() {
  6944. this.list.forEach(function (floor) {
  6945. floor.build();
  6946. });
  6947. }
  6948. }, {
  6949. key: "nextFloor",
  6950. value: function nextFloor(e, t) {
  6951. return this.index[e.floorIndex + t] || null;
  6952. }
  6953. }, {
  6954. key: "getOrMakeFloor",
  6955. value: function getOrMakeFloor(floorIndex) {
  6956. var floor = this.index[floorIndex];
  6957. if (!floor) {
  6958. floor = new Floor$1(this.model, floorIndex);
  6959. this.add(floor);
  6960. }
  6961. return floor;
  6962. }
  6963. }, {
  6964. key: "hide",
  6965. value: function hide() {
  6966. this.list.forEach(function (floor) {
  6967. floor.hide();
  6968. });
  6969. }
  6970. }, {
  6971. key: "show",
  6972. value: function show() {
  6973. this.list.forEach(function (floor) {
  6974. floor.show();
  6975. });
  6976. }
  6977. }, {
  6978. key: "getFloorAtPoint",
  6979. value: function getFloorAtPoint(e) {
  6980. for (var t = null, i = 1 / 0, n = 0; n < this.list.length; n++) {
  6981. var r = this.list[n],
  6982. o = r.distanceToPoint(e);
  6983. (!t || i > o) && (i = o, t = r);
  6984. }
  6985. return t;
  6986. }
  6987. }]);
  6988. return FloorCollection;
  6989. }(IndexedCollection);
  6990. var lerp = {
  6991. vector: function vector(e, t, f) {
  6992. //xzw change, add f
  6993. var i = e.clone();
  6994. return t = t.clone(), function (n) {
  6995. e.set(i.x * (1 - n) + t.x * n, i.y * (1 - n) + t.y * n, i.z * (1 - n) + t.z * n);
  6996. f && f(e, n);
  6997. };
  6998. },
  6999. quaternion: function quaternion(e, t, f) {
  7000. //xzw change, add f
  7001. var i = e.clone();
  7002. return function (n) {
  7003. e.copy(i).slerp(t, n);
  7004. f && f(e, n);
  7005. };
  7006. },
  7007. color: function color(e, t, f) {
  7008. var i = e.clone();
  7009. return function (n) {
  7010. e.copy(i).lerp(t, n);
  7011. f && f(e, n);
  7012. };
  7013. },
  7014. property(e, t, i, n) {
  7015. var r = e[t];
  7016. return function (o) {
  7017. e[t] = r * (1 - o) + i * o, n && n(e[t]);
  7018. };
  7019. },
  7020. uniform(e, t, i) {
  7021. var n = e.material.uniforms[t].value;
  7022. return function (r) {
  7023. e.material.uniforms[t] && (e.material.uniforms[t].value = n * (1 - r) + i * r);
  7024. };
  7025. },
  7026. matrix4(e, t) {
  7027. var i = e.clone();
  7028. return function (n) {
  7029. for (var r = e.elements, o = i.elements, a = t.elements, s = 0; s < 16; s++) {
  7030. r[s] = o[s] * (1 - n) + a[s] * n;
  7031. }
  7032. };
  7033. },
  7034. allUniforms(e, t, i) {
  7035. var n = e.map(function (e) {
  7036. return this.uniform(e, t, i);
  7037. }.bind(this));
  7038. return function (e) {
  7039. n.forEach(function (t) {
  7040. t(e);
  7041. });
  7042. };
  7043. }
  7044. };
  7045. var PanoRendererEvents = {
  7046. PanoRenderComplete: 'panorama.render.complete',
  7047. TileRenderFailure: 'panorama.tile.render.failed',
  7048. TileRenderSuccess: 'panorama.tile.render.success',
  7049. TileUploadAttempted: 'panorama.tile.upload.attempted',
  7050. UploadAttemptedForAllTiles: 'panorama.upload.attempted.all.tiles',
  7051. ZoomLevelRenderStarted: 'panorama.zoom.render.started'
  7052. };
  7053. var PanoramaEvents = {
  7054. LoadComplete: 'panorama.load.complete',
  7055. LoadFailed: 'panorama.load.failed',
  7056. TileLoaded: 'panorama.tile.loaded'
  7057. };
  7058. var PanoSizeClass = {
  7059. BASE: 1,
  7060. STANDARD: 2,
  7061. HIGH: 3,
  7062. ULTRAHIGH: 4
  7063. };
  7064. /*
  7065. * @Author: Rindy
  7066. * @Date: 2021-05-07 15:48:57
  7067. * @LastEditors: Rindy
  7068. * @LastEditTime: 2021-05-07 15:49:49
  7069. * @Description: 注释
  7070. */
  7071. var basicTextured = {
  7072. uniforms: {
  7073. tDiffuse: {
  7074. type: 't',
  7075. value: null
  7076. },
  7077. alpha: {
  7078. type: 'f',
  7079. value: 1
  7080. }
  7081. },
  7082. vertexShader: "\n varying vec2 vUv;\n #ifdef UV_Transform \n uniform mat3 uvTransform;\n #endif\n void main() { \n #ifdef UV_Transform \n vUv = ( uvTransform * vec3( uv, 1 ) ).xy; //include <uv_vertex> \n #else\n vUv = uv;\n #endif\n \n \n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }",
  7083. fragmentShader: "varying vec2 vUv;\n uniform float opacity;\n uniform vec3 baseColor; \n uniform sampler2D map;\n #if defined mapOverlay\n uniform vec3 mapColor;\n #endif\n \n void main() {\n /* vec4 texColor = texture2D(map, vUv);\n gl_FragColor = vec4(texColor.rgb, texColor.a * opacity); */\n \n vec4 color = vec4(baseColor, opacity);\n vec4 colorFromMap = texture2D(map, vUv);\n \n #if defined mapOverlay\n //\u8D34\u56FE\u53E0\u52A0\u5728\u57FA\u7840\u8272\u4E0A\uFF0C\u800C\u975E\u76F8\u4E58\n colorFromMap.rgb *= mapColor;\n color = color * (1.0-colorFromMap.a) + colorFromMap;\n #else\n color *= colorFromMap;\n \n #endif\n \n gl_FragColor = color;\n \n \n }\n \n \n "
  7084. };
  7085. /*
  7086. * @Author: Rindy
  7087. * @Date: 2021-05-07 15:50:38
  7088. * @LastEditors: Rindy
  7089. * @LastEditTime: 2021-05-07 15:51:20
  7090. * @Description: 注释
  7091. */
  7092. var copyCubeMap = {
  7093. uniforms: {
  7094. tDiffuse: {
  7095. type: 't',
  7096. value: null
  7097. },
  7098. alpha: {
  7099. type: 'f',
  7100. value: 1
  7101. }
  7102. },
  7103. 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}',
  7104. 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}'
  7105. };
  7106. /*
  7107. * @Author: Rindy
  7108. * @Date: 2021-05-07 15:52:29
  7109. * @LastEditors: Rindy
  7110. * @LastEditTime: 2021-05-07 15:53:00
  7111. * @Description: 注释
  7112. */
  7113. var cube = {
  7114. uniforms: {
  7115. map: {
  7116. type: 't',
  7117. value: null
  7118. },
  7119. opacity: {
  7120. type: 'f',
  7121. value: 1
  7122. }
  7123. },
  7124. vertexShader: 'varying vec3 vWorldPosition;\n\nvoid main() {\n vWorldPosition = position;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n',
  7125. 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'
  7126. };
  7127. /*
  7128. * @Author: Rindy
  7129. * @Date: 2021-05-07 16:02:08
  7130. * @LastEditors: Rindy
  7131. * @LastEditTime: 2021-05-07 16:02:27
  7132. * @Description: 注释
  7133. */
  7134. var customDepth = {
  7135. uniforms: {
  7136. panoPosition: {
  7137. type: 'v3',
  7138. value: new THREE.Vector3()
  7139. }
  7140. },
  7141. 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',
  7142. 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'
  7143. };
  7144. /*
  7145. * @Author: Rindy
  7146. * @Date: 2021-05-07 15:52:29
  7147. * @LastEditors: Rindy
  7148. * @LastEditTime: 2021-05-12 15:35:23
  7149. * @Description: 注释
  7150. */
  7151. var modelPaint = {
  7152. fragmentShader: {
  7153. 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 \n vec2 uv_ = uv;\n #ifdef Not_Cube //xzw add\n uv_.x += 0.25;\n if(uv_.x > 1.0) uv_.x -= 1.0;\n #endif\n \n \n \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 // \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 ",
  7154. Buffer: "\n \n varying vec2 vUv;\n \n void main()\n {\n vec2 uv = vUv;\n gl_FragColor = modelPaint(uv, 0);\n }\n "
  7155. }
  7156. };
  7157. /*
  7158. 裁剪
  7159. */
  7160. var clipBox = {
  7161. fragmentShader: {
  7162. define: "\n #ifdef HasClip \n //\u88C1\u526A\u6A21\u5757\n varying vec3 vPos;\n uniform vec3 clipBoxPoints[clipBoxCount*4]; \n //4\u4E2Avec3\u4E3A\u4E00\u7EC4(\u4E00\u4E2A\u7ACB\u65B9\u4F53)\n uniform int clipBoxType[clipBoxCount];\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 #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 ",
  7163. main: "\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 \n for(int i = 0; i < clipBoxCount; i++) {\n clipBoxType[i] == -1 ? \n isClip = isClip : \n clipBoxType[i] == 0 ?\n inBox(vPos, clipBoxPoints[i*4], clipBoxPoints[i*4+1], clipBoxPoints[i*4+2], clipBoxPoints[i*4+3]) == 1.0 ?\n isClip = 2.0 :\n isClip = isClip \n : isClip != 2.0 ? \n isClip != -1.0 && inBox(vPos, clipBoxPoints[i*4], clipBoxPoints[i*4+1], clipBoxPoints[i*4+2], clipBoxPoints[i*4+3]) == 0.0 ? isClip = 1.0 : isClip = -1.0 :\n isClip = 2.0;\n }\n \n if(isClip > 0.0) discard;\n #endif\n "
  7164. }
  7165. };
  7166. /*
  7167. * @Author: Rindy
  7168. * @Date: 2021-05-07 15:52:29
  7169. * @LastEditors: Rindy
  7170. * @LastEditTime: 2021-05-12 15:35:23
  7171. * @Description: 注释
  7172. */
  7173. var model$1 = {
  7174. //非fish
  7175. uniforms: {
  7176. //许钟文加 和编辑墙有关
  7177. minOpa: {
  7178. //最小透明度系数
  7179. type: 'f',
  7180. value: 0.14
  7181. },
  7182. minDistance: {
  7183. //最小距离控制
  7184. type: 'f',
  7185. value: 2.5
  7186. },
  7187. maxDistance: {
  7188. //最大距离控制
  7189. type: 'f',
  7190. value: 4
  7191. },
  7192. //---------------
  7193. map: {
  7194. // 模型贴图(即dollhouse贴图);当定义了BasePanoMap后,它就是全景贴图,但用的是普通映射
  7195. type: 't',
  7196. value: null
  7197. },
  7198. repeatInfoMap: {
  7199. //重复比率图 sxz
  7200. type: 't',
  7201. value: null
  7202. },
  7203. modelAlpha: {
  7204. type: 'f',
  7205. value: settings$3.modelAlpha
  7206. },
  7207. baseColor: {
  7208. //用来调试的颜色
  7209. type: 'v3',
  7210. value: new THREE.Color(1, 1, 1)
  7211. },
  7212. opacity: {
  7213. type: 'f',
  7214. value: 1
  7215. },
  7216. progress: {
  7217. type: 'f',
  7218. value: 0
  7219. },
  7220. blackout: {
  7221. type: 'i',
  7222. value: 0
  7223. },
  7224. // pano0Map和pano1Map的区分是为了过渡,pano0Map是上一个点位全景图,pano1Map是下一个。一般取pano1Map为当前点位。
  7225. pano0Map: {
  7226. type: 't',
  7227. value: null
  7228. },
  7229. pano0Position: {
  7230. type: 'v3',
  7231. value: new THREE.Vector3()
  7232. },
  7233. pano0Matrix: {
  7234. type: 'm4',
  7235. value: new THREE.Matrix4()
  7236. },
  7237. pano1Map: {
  7238. type: 't',
  7239. value: null
  7240. },
  7241. pano1Position: {
  7242. type: 'v3',
  7243. value: new THREE.Vector3()
  7244. },
  7245. pano1Matrix: {
  7246. type: 'm4',
  7247. value: new THREE.Matrix4()
  7248. },
  7249. /**球幕视频 */
  7250. videoReady: {
  7251. type: '',
  7252. value: 0
  7253. },
  7254. videoTexture: {
  7255. type: 't',
  7256. value: null
  7257. },
  7258. exposure: {
  7259. type: 'f',
  7260. value: 1
  7261. },
  7262. parameters: {
  7263. type: 'm4',
  7264. 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)
  7265. },
  7266. clipRect: {
  7267. type: 'v4',
  7268. value: new THREE.Vector4(0.1, 0.1, 0.5, 0.5)
  7269. },
  7270. blendFov: {
  7271. type: 'f',
  7272. value: 5
  7273. },
  7274. // 用于判断球幕视频是否横竖旋转
  7275. bFlag: {
  7276. type: 'i',
  7277. value: 1
  7278. },
  7279. /**马赛克 */
  7280. paint1Map: {
  7281. type: 't',
  7282. value: null
  7283. },
  7284. paint0Map: {
  7285. type: 't',
  7286. value: null
  7287. },
  7288. iShowBrush: {
  7289. type: 'i',
  7290. value: 0
  7291. },
  7292. iMouse: {
  7293. type: 'v4',
  7294. value: new THREE.Vector4()
  7295. },
  7296. iResolution: {
  7297. type: 'v2',
  7298. value: new THREE.Vector2()
  7299. },
  7300. iChannel0: {
  7301. type: 't',
  7302. value: null
  7303. },
  7304. iChannel1: {
  7305. type: 't',
  7306. value: null
  7307. },
  7308. iBrushType: {
  7309. type: 'i',
  7310. value: 1
  7311. },
  7312. iBrushSize: {
  7313. type: 'f',
  7314. value: null
  7315. },
  7316. // 相机的上下转角和左右转角
  7317. iAngle: {
  7318. type: 'f',
  7319. value: null
  7320. },
  7321. iPitch: {
  7322. type: 'f',
  7323. value: null
  7324. },
  7325. /**滤镜 */
  7326. // [-1.0, 1.0] 亮度 对比度 饱和度
  7327. filterBase0: {
  7328. type: 'v3',
  7329. value: new THREE.Vector3(0, 0, 0) // brightness contrast saturation
  7330. },
  7331. // [-1.0, 1.0] 色温调节范围,[ 冷 -- 暖 ]
  7332. filterTemperature0: {
  7333. type: 'f',
  7334. value: 0
  7335. },
  7336. filterBase1: {
  7337. type: 'v3',
  7338. value: new THREE.Vector3(0, 0, 0)
  7339. },
  7340. filterTemperature1: {
  7341. type: 'f',
  7342. value: 0
  7343. },
  7344. //裁剪
  7345. clipBoxType: {
  7346. type: 'a',
  7347. value: null
  7348. },
  7349. clipBoxPoints: {
  7350. type: 'a',
  7351. value: null
  7352. }
  7353. },
  7354. //全景贴图的shader不同-许钟文-----------------
  7355. /* fragmentShader: prefixFragment + (config.scene_version == 1 ? "\n#define Not_Cube\n":"") +
  7356. "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);}"
  7357. */
  7358. 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 ",
  7359. 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 " + clipBox.fragmentShader.define + " \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 #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 \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 " + clipBox.fragmentShader.main + " \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 ",
  7360. fragmentBufferShader: modelPaint.fragmentShader.Common + modelPaint.fragmentShader.Buffer
  7361. };
  7362. /*
  7363. * @Author: Rindy
  7364. * @Date: 2021-05-07 16:01:31
  7365. * @LastEditors: Rindy
  7366. * @LastEditTime: 2021-05-12 15:35:42
  7367. * @Description: 注释
  7368. */
  7369. var modelDebug = {
  7370. uniforms: {
  7371. map: {
  7372. type: 't',
  7373. value: null
  7374. },
  7375. modelAlpha: {
  7376. type: 'f',
  7377. value: settings$3.modelAlpha
  7378. },
  7379. depthmapRatio: {
  7380. type: 'f',
  7381. value: 0
  7382. },
  7383. opacity: {
  7384. type: 'f',
  7385. value: 1
  7386. },
  7387. progress: {
  7388. type: 'f',
  7389. value: 0
  7390. },
  7391. considerOcclusion: {
  7392. type: 'i',
  7393. value: settings$3.fancierTransition
  7394. },
  7395. highlightPanoSelection: {
  7396. type: 'i',
  7397. value: 0
  7398. },
  7399. useThirdPano: {
  7400. type: 'i',
  7401. value: settings$3.useThirdPano
  7402. },
  7403. pano0Map: {
  7404. type: 't',
  7405. value: null
  7406. },
  7407. pano0Depth: {
  7408. type: 't',
  7409. value: null
  7410. },
  7411. pano0Position: {
  7412. type: 'v3',
  7413. value: new THREE.Vector3()
  7414. },
  7415. pano0Matrix: {
  7416. type: 'm4',
  7417. value: new THREE.Matrix4()
  7418. },
  7419. pano0Weight: {
  7420. type: 'f',
  7421. value: settings$3.transition.pano0Weight
  7422. },
  7423. pano1Map: {
  7424. type: 't',
  7425. value: null
  7426. },
  7427. pano1Depth: {
  7428. type: 't',
  7429. value: null
  7430. },
  7431. pano1Position: {
  7432. type: 'v3',
  7433. value: new THREE.Vector3()
  7434. },
  7435. pano1Matrix: {
  7436. type: 'm4',
  7437. value: new THREE.Matrix4()
  7438. },
  7439. pano1Weight: {
  7440. type: 'f',
  7441. value: settings$3.transition.pano1Weight
  7442. },
  7443. pano2Map: {
  7444. type: 't',
  7445. value: null
  7446. },
  7447. pano2Depth: {
  7448. type: 't',
  7449. value: null
  7450. },
  7451. pano2Position: {
  7452. type: 'v3',
  7453. value: new THREE.Vector3()
  7454. },
  7455. pano2Matrix: {
  7456. type: 'm4',
  7457. value: new THREE.Matrix4()
  7458. },
  7459. pano2Weight: {
  7460. type: 'f',
  7461. value: settings$3.transition.pano2Weight
  7462. }
  7463. },
  7464. 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',
  7465. 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'
  7466. };
  7467. /*
  7468. * @Author: Rindy
  7469. * @Date: 2021-05-07 15:52:29
  7470. * @LastEditors: Rindy
  7471. * @LastEditTime: 2021-05-07 15:59:37
  7472. * @Description: 注释
  7473. */
  7474. var modelOutside = {
  7475. uniforms: {
  7476. map: {
  7477. type: 't',
  7478. value: null
  7479. },
  7480. opacity: {
  7481. type: 'f',
  7482. value: 1
  7483. },
  7484. brightness: {
  7485. type: 'f',
  7486. value: 0.23
  7487. },
  7488. mixRatio: {
  7489. type: 'f',
  7490. value: 0.3
  7491. },
  7492. //裁剪
  7493. clipBoxType: {
  7494. type: 'a',
  7495. value: null
  7496. },
  7497. clipBoxPoints: {
  7498. type: 'a',
  7499. value: null
  7500. }
  7501. },
  7502. // vertexShader: 'varying vec2 vUv;\n\nvoid main() {\n\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n}\n',
  7503. 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 }",
  7504. fragmentShader: "\n uniform sampler2D map;\n uniform float opacity;\n varying vec2 vUv;\n uniform float brightness;\n uniform float mixRatio;\n " + clipBox.fragmentShader.define + " \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 \n \n void main() {\n " + clipBox.fragmentShader.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 \n colorFromTexture = mix(colorFromTexture, grey, mixRatio ); \n gl_FragColor = vec4(colorFromTexture.rgb, opacity);\n }\n "
  7505. };
  7506. /*
  7507. * @Author: Rindy
  7508. * @Date: 2021-05-07 15:59:59
  7509. * @LastEditors: Rindy
  7510. * @LastEditTime: 2021-05-12 15:36:01
  7511. * @Description: 注释
  7512. */
  7513. var ribbon = {
  7514. uniforms: {
  7515. map: {
  7516. type: 't',
  7517. value: null
  7518. },
  7519. opacity: {
  7520. type: 'f',
  7521. value: 1
  7522. },
  7523. color: {
  7524. type: 'c',
  7525. value: new THREE.Color(settings$3.path.color)
  7526. }
  7527. },
  7528. 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',
  7529. 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'
  7530. };
  7531. /*
  7532. * @Author: Rindy
  7533. * @Date: 2021-05-07 16:02:38
  7534. * @LastEditors: Rindy
  7535. * @LastEditTime: 2021-05-07 16:03:01
  7536. * @Description: 注释
  7537. */
  7538. var skysphere = {
  7539. uniforms: {
  7540. radius: {
  7541. type: 'f',
  7542. value: 0
  7543. }
  7544. },
  7545. 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',
  7546. 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'
  7547. };
  7548. /*
  7549. * @Author: Rindy
  7550. * @Date: 2021-05-07 16:03:13
  7551. * @LastEditors: Rindy
  7552. * @LastEditTime: 2021-05-07 16:03:51
  7553. * @Description: 注释
  7554. */
  7555. var tagDisc = {
  7556. uniforms: {
  7557. opacity: {
  7558. type: 'f',
  7559. value: 0
  7560. },
  7561. color: {
  7562. type: 'c',
  7563. value: new THREE.Color()
  7564. },
  7565. bg: {
  7566. type: 't',
  7567. value: null
  7568. },
  7569. mask: {
  7570. type: 't',
  7571. value: null
  7572. }
  7573. },
  7574. vertexShader: 'varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}',
  7575. 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'
  7576. };
  7577. /*
  7578. * @Author: Rindy
  7579. * @Date: 2021-05-07 16:03:13
  7580. * @LastEditors: Rindy
  7581. * @LastEditTime: 2021-05-07 16:03:51
  7582. * @Description: 注释
  7583. */
  7584. var tagDiscDefault = {
  7585. uniforms: {
  7586. uTime: {
  7587. value: 0
  7588. },
  7589. opacity: {
  7590. value: 1
  7591. },
  7592. dark: {
  7593. type: 'i',
  7594. value: 0
  7595. },
  7596. openning: {
  7597. type: 'f',
  7598. value: 0
  7599. },
  7600. uColor: {
  7601. value: new THREE.Color().setRGB(0.0, 0.7843137254901961, 0.6862745098039216)
  7602. }
  7603. },
  7604. 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 ",
  7605. 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 "
  7606. };
  7607. /*
  7608. * @Author: Rindy
  7609. * @Date: 2021-05-07 16:03:13
  7610. * @LastEditors: Rindy
  7611. * @LastEditTime: 2021-05-07 16:03:51
  7612. * @Description: 注释
  7613. */
  7614. var tagDiscCustom = {
  7615. uniforms: {
  7616. opacity: {
  7617. type: 'f',
  7618. value: 1
  7619. },
  7620. dark: {
  7621. //hover时会颜色会变深
  7622. type: 'i',
  7623. value: 0
  7624. },
  7625. map: {
  7626. type: 't',
  7627. value: null
  7628. },
  7629. uTime: {
  7630. value: 0
  7631. },
  7632. openning: {
  7633. type: 'f',
  7634. value: 0
  7635. }
  7636. },
  7637. 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 ",
  7638. 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 "
  7639. };
  7640. /*
  7641. * @Author: Rindy
  7642. * @Date: 2021-05-07 16:03:13
  7643. * @LastEditors: Rindy
  7644. * @LastEditTime: 2021-05-07 16:03:51
  7645. * @Description: 注释 videoPano Tag的shader 视频播放按钮
  7646. */
  7647. var tagVideoMarker = {
  7648. // uniforms: {
  7649. // opacity: {
  7650. // type: 'f',
  7651. // value: 1,
  7652. // },
  7653. // dark: {
  7654. // //hover时会颜色会变深
  7655. // type: 'i',
  7656. // value: 0,
  7657. // },
  7658. // map: {
  7659. // type: 't',
  7660. // value: null,
  7661. // },
  7662. // uTime: {
  7663. // value: 0,
  7664. // },
  7665. // openning: {
  7666. // type: 'f',
  7667. // value: 0,
  7668. // },
  7669. // },
  7670. uniforms: {
  7671. progress: {
  7672. type: 'f',
  7673. value: 0
  7674. },
  7675. bigCircleProgress: {
  7676. type: 'f',
  7677. value: 0
  7678. },
  7679. smallCircleProgress: {
  7680. type: 'f',
  7681. value: 0
  7682. },
  7683. map: {
  7684. type: 't',
  7685. value: null
  7686. },
  7687. map0: {
  7688. type: 't',
  7689. value: null
  7690. },
  7691. map1: {
  7692. type: 't',
  7693. value: null
  7694. },
  7695. map2: {
  7696. type: 't',
  7697. value: null
  7698. },
  7699. opacity: {
  7700. type: 'f',
  7701. value: 0
  7702. }
  7703. },
  7704. 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 ",
  7705. 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 "
  7706. };
  7707. /*
  7708. * @Author: Rindy
  7709. * @Date: 2021-05-07 16:00:54
  7710. * @LastEditors: Rindy
  7711. * @LastEditTime: 2021-05-12 15:36:15
  7712. * @Description: 注释
  7713. */
  7714. var waypoint = {
  7715. uniforms: {
  7716. map: {
  7717. type: 't',
  7718. value: null
  7719. },
  7720. opacity: {
  7721. type: 'f',
  7722. value: 1
  7723. },
  7724. pulse: {
  7725. type: 'f',
  7726. value: 1
  7727. },
  7728. nearFade: {
  7729. type: 'v2',
  7730. value: new THREE.Vector2(2 * settings$3.insideNear, 2 * settings$3.path.waypointIndoorRadius)
  7731. },
  7732. color: {
  7733. type: 'c',
  7734. value: new THREE.Color('#fff')
  7735. }
  7736. },
  7737. 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',
  7738. 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'
  7739. };
  7740. //球上的鱼眼(无过渡):
  7741. var skybox = {
  7742. uniforms: {
  7743. opacity: {
  7744. type: 'f',
  7745. value: 1
  7746. },
  7747. pano1Map: {
  7748. type: 't',
  7749. value: null
  7750. },
  7751. pano1Matrix: {
  7752. type: 'm4',
  7753. value: new THREE.Matrix4()
  7754. }
  7755. },
  7756. vertexShader: 'uniform mat4 pano1Matrix;varying vec3 vWorldPosition;void main(){vWorldPosition=(vec4(position,1.0)*pano1Matrix).xyz;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}',
  7757. 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);}'
  7758. };
  7759. /*
  7760. * @Author: Rindy
  7761. * @Date: 2021-05-07 15:48:57
  7762. * @LastEditors: zhou enguang
  7763. * @LastEditTime: 2022-01-12 16:49:49
  7764. * @Description: 注释
  7765. */
  7766. var videoLoading = {
  7767. uniforms: {
  7768. uColor: {
  7769. type: 'vec4',
  7770. value: null
  7771. },
  7772. uTime: {
  7773. type: 'f',
  7774. value: 0
  7775. }
  7776. },
  7777. 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 ",
  7778. 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 "
  7779. };
  7780. /*
  7781. * @Author: Rindy
  7782. * @Date: 2021-05-07 15:48:57
  7783. * @LastEditors: zhou enguang
  7784. * @LastEditTime: 2022-01-12 16:49:49
  7785. * @Description: 注释
  7786. */
  7787. var videoMakerWidget = {
  7788. uniforms: {
  7789. opacity: {
  7790. type: 'f',
  7791. value: 1
  7792. },
  7793. dark: {
  7794. //hover时会颜色会变深
  7795. type: 'i',
  7796. value: 0
  7797. },
  7798. map: {
  7799. type: 't',
  7800. value: null
  7801. },
  7802. position: {
  7803. value: new THREE.Vector3(0, 0, 0)
  7804. }
  7805. },
  7806. 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 ",
  7807. 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 "
  7808. };
  7809. /*
  7810. * @Author: Rindy
  7811. * @Date: 2021-05-07 15:48:57
  7812. * @LastEditors: zhou enguang
  7813. * @LastEditTime: 2022-01-12 16:49:49
  7814. * @Description: 注释 videoPano marker 的shader
  7815. */
  7816. var videoPanoMarker = {
  7817. uniforms: {
  7818. progress: {
  7819. type: 'f',
  7820. value: 0
  7821. },
  7822. bigCircleProgress: {
  7823. type: 'f',
  7824. value: 0
  7825. },
  7826. smallCircleProgress: {
  7827. type: 'f',
  7828. value: 0
  7829. },
  7830. map: {
  7831. type: 't',
  7832. value: null
  7833. },
  7834. /* map0: {
  7835. type: 't',
  7836. value: null,
  7837. },
  7838. map1: {
  7839. type: 't',
  7840. value: null
  7841. },
  7842. map2: {
  7843. type: 't',
  7844. value: null
  7845. }, */
  7846. opacity: {
  7847. type: 'f',
  7848. value: 0
  7849. }
  7850. },
  7851. 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 ",
  7852. 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 "
  7853. };
  7854. /*
  7855. * @Author: xst
  7856. * @Date: 2021-05-07 15:48:57
  7857. * @LastEditors: xst
  7858. * @LastEditTime: 2022-01-12 16:49:49
  7859. * @Description: 注释
  7860. */
  7861. var videoStemLine = {
  7862. uniforms: {
  7863. progress: {
  7864. type: 'f',
  7865. value: 0
  7866. },
  7867. bigCircleProgress: {
  7868. type: 'f',
  7869. value: 0
  7870. },
  7871. smallCircleProgress: {
  7872. type: 'f',
  7873. value: 0
  7874. },
  7875. map: {
  7876. type: 't',
  7877. value: null
  7878. },
  7879. map0: {
  7880. type: 't',
  7881. value: null
  7882. },
  7883. map1: {
  7884. type: 't',
  7885. value: null
  7886. },
  7887. map2: {
  7888. type: 't',
  7889. value: null
  7890. },
  7891. opacity: {
  7892. type: 'f',
  7893. value: 0
  7894. }
  7895. },
  7896. 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 ",
  7897. 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 "
  7898. };
  7899. /*
  7900. * @Author: Rindy
  7901. * @Date: 2021-05-07 15:48:57
  7902. * @LastEditors: Rindy
  7903. * @LastEditTime: 2021-05-07 15:49:49
  7904. * @Description: 注释
  7905. */
  7906. var linkSpot = {
  7907. //balloon
  7908. uniforms: {
  7909. /* isActive: {
  7910. type: 'i',
  7911. value: 0,
  7912. }, */
  7913. activeProgress: {
  7914. type: 'f',
  7915. value: 0
  7916. },
  7917. mapIn: {
  7918. type: 't',
  7919. value: null
  7920. },
  7921. mapOut: {
  7922. type: 't',
  7923. value: null
  7924. },
  7925. mapOut2: {
  7926. type: 't',
  7927. value: null
  7928. },
  7929. opacity: {
  7930. type: 'f',
  7931. value: 0
  7932. },
  7933. changeMap: {
  7934. type: 'i',
  7935. value: 0
  7936. }
  7937. },
  7938. 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",
  7939. 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 const vec4 sumColor = vec4(1.44,1.24,1.44,2.0);//\u7528\u4E8E\u4E2D\u5FC3\u90E8\u5206\u53CD\u8F6C\u9ED1\u767D\u7684\u989C\u8272\n \n vec4 getColor_default(vec4 mapColor, vec4 mapColor2, int where,vec2 vUvInside ,vec4 white){\n vec4 color;\n if(where != 2){ \n color = vec4(1.0,1.0,1.0,mapColor.a);\n }else{ \n if(changeMap == 1){ \n vec4 color0 = texture2D(mapIn,vUvInside);\n if(mapColor2.r==1.0){color = color0;} //\u5706\u5185\u90E8\n else color = mix(white, color0, mapColor2.r);//\u5E73\u6ED11\u7684\u5185\u8FB9\u7F18 \n \n }else{ \n \n vec4 color0 = sumColor-mapColor; \n if(mapColor2.r==1.0){color = color0 ;}//\u5706\u5185\u90E8 //\u4E0D\u77E5\u4E3A\u4F55\u6539\u4E3A\u84DD\u8272\u56FE\u540E\uFF0C1\u5185\u5C42\u6709\u7EA2\u8272\uFF0C\u90A3\u8FB9\u7684mapColor2.r\u660E\u660E\u4E0D\u662F1\n else{\n color = mix(white, color0, mapColor2.r);//\u5E73\u6ED11\u7684\u5185\u8FB9\u7F18 \n }\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 } \n return color;\n }\n \n vec4 getColor_hovered(vec4 mapColor, vec4 mapColor2, int where,vec2 vUvInside ,vec4 newColor){\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(newColor, color0, mapColor2.r);//\u5E73\u6ED1\u5185\u8FB9\u7F18 \n }\n else if(mapColor.a>0.0 && mapColor.a<1.0) color = newColor; //\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.9 ) ? 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 vec4 blue = vec4(0.0, 0.48235294117647, 1.0, mapColor.a);\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 , blue); \n }else{\n vec4 color0 = getColor_default(mapColor, mapColor2, where, vUvInside , white);\n vec4 color1 = getColor_hovered(mapColor, mapColor2, where, vUvInside , blue);\n \n gl_FragColor = mix(color0,color1,activeProgress);\n } \n \n gl_FragColor.a *= opacity; \n \n \n }\n "
  7940. /* fragmentShader: `
  7941. varying vec2 vUv;
  7942. uniform sampler2D mapOut;
  7943. uniform sampler2D mapOut2;
  7944. uniform sampler2D mapIn;
  7945. uniform float opacity;
  7946. uniform int isActive;
  7947. uniform int changeMap; //是否有mapIn贴图,有的话就是中间要换成mapIn
  7948. void main(){
  7949. vec4 mapColor = texture2D(mapOut,vUv);
  7950. vec4 mapColor2 = texture2D(mapOut2,vUv);//用于分区的贴图
  7951. vec4 sumColor = vec4(1.24,1.24,1.24,2.0);//用于中心部分反转黑白的颜色
  7952. float x1=0.2333, x2=0.76669, y1=0.388, y2=0.9333;
  7953. vec2 vUvInside = vec2((vUv.x-x1)/(x2-x1), (vUv.y-y1)/(y2-y1));
  7954. //绿色的 r=0 白色r=1
  7955. //where: 0是外层, 1是环, 2是中间层
  7956. int where = mapColor2.a <= 0.0 ? 0 : (mapColor2.r <= 0.0 || mapColor2.a<1.0) ? 1 : 2; //2中包含1-2的过渡,待平滑
  7957. vec4 green = vec4(0.0, 0.7843137, 0.6823529, mapColor.a);
  7958. vec4 white = vec4(1.0, 1.0, 1.0, mapColor.a);
  7959. if(isActive!=1){ //普通
  7960. if(where == 1){
  7961. gl_FragColor = vec4(1.0,1.0,1.0,mapColor.a);
  7962. }else{
  7963. if(changeMap == 1){
  7964. if(where == 2){
  7965. vec4 color = texture2D(mapIn,vUvInside);
  7966. if(mapColor2.r==1.0){gl_FragColor = color;}
  7967. else gl_FragColor = mix(white, color, mapColor2.r);//平滑内边缘
  7968. }
  7969. else gl_FragColor = mapColor;
  7970. }else{
  7971. if(where == 2){
  7972. vec4 color = sumColor-mapColor;
  7973. if(mapColor2.r==1.0){gl_FragColor = color;}
  7974. else gl_FragColor = mix(white, color, mapColor2.r);//平滑内边缘
  7975. }
  7976. else gl_FragColor = mapColor;
  7977. }
  7978. }
  7979. }else{//hover时
  7980. if(changeMap == 1){
  7981. if(where == 2){
  7982. vec4 color = texture2D(mapIn,vUvInside);
  7983. if(mapColor2.r==1.0){gl_FragColor = color;}
  7984. else gl_FragColor = mix(green, color, mapColor2.r);//平滑内边缘
  7985. }
  7986. else if(mapColor.a>0.0 && mapColor.a<1.0) gl_FragColor = green; //因为开启了抗锯齿,导致外边缘有点问题,所以自己绘制
  7987. else gl_FragColor = mapColor;
  7988. }else{
  7989. if(mapColor.a>0.0 && mapColor.a<1.0) gl_FragColor = green;
  7990. else gl_FragColor = mapColor;
  7991. }
  7992. }
  7993. gl_FragColor.a *= opacity;
  7994. }
  7995. `, */
  7996. };
  7997. /*
  7998. * @Author: Rindy
  7999. * @Date: 2021-05-07 15:48:57
  8000. * @LastEditors: Rindy
  8001. * @LastEditTime: 2021-05-07 15:49:49
  8002. * @Description: 注释
  8003. */
  8004. var linkSpotInside = {
  8005. //circle
  8006. uniforms: {
  8007. circleRadius: {
  8008. //UV内半径的平方
  8009. type: 'f',
  8010. value: 0.785 //0.815,
  8011. },
  8012. progress: {
  8013. type: 'f',
  8014. value: 0
  8015. },
  8016. mapOut: {
  8017. type: 't',
  8018. value: null
  8019. },
  8020. mapIn: {
  8021. type: 't',
  8022. value: null
  8023. },
  8024. changeMap: {
  8025. type: 'i',
  8026. value: 0
  8027. }
  8028. },
  8029. vertexShader:
  8030. /* prefixVertex + */
  8031. " \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",
  8032. fragmentShader:
  8033. /* prefixFragment + */
  8034. "\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 vec4 ringColorNew = vec4(0.0, 0.48235294117647, 1.0, 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 "
  8035. };
  8036. var sphereRenderToCube = {
  8037. uniforms: {
  8038. tDiffuse: {
  8039. type: 't',
  8040. value: null
  8041. }
  8042. /* ,
  8043. panoMatrix:{
  8044. type:'m4',
  8045. value:new THREE.Matrix4
  8046. } */
  8047. },
  8048. vertexShader:
  8049. /* prefixVertex + */
  8050. " \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",
  8051. fragmentShader:
  8052. /* prefixFragment + */
  8053. "\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 "
  8054. };
  8055. /*
  8056. * @Author: Rindy
  8057. * @Date: 2021-05-07 15:44:55
  8058. * @LastEditors: Rindy
  8059. * @LastEditTime: 2021-05-08 16:01:48
  8060. * @Description: 注释
  8061. */
  8062. function mergePrefixVertex(vertex) {
  8063. 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;
  8064. }
  8065. function mergePrefixFragment(fragment) {
  8066. return 'precision highp float;\nprecision highp int;\n\nuniform mat4 viewMatrix;\nuniform vec3 cameraPosition;\n' + fragment;
  8067. }
  8068. function margePrefix(shader) {
  8069. if (shader.vertexShader) {
  8070. shader.vertexShader = mergePrefixVertex(shader.vertexShader);
  8071. }
  8072. if (shader.fragmentShader) {
  8073. shader.fragmentShader = mergePrefixFragment(shader.fragmentShader);
  8074. shader == model$1 && (shader.fragmentBufferShader = mergePrefixFragment(shader.fragmentBufferShader));
  8075. }
  8076. }
  8077. margePrefix(cube);
  8078. margePrefix(customDepth);
  8079. margePrefix(model$1);
  8080. margePrefix(modelDebug);
  8081. margePrefix(modelOutside);
  8082. margePrefix(ribbon);
  8083. margePrefix(skysphere);
  8084. margePrefix(tagDisc);
  8085. margePrefix(tagDiscDefault);
  8086. margePrefix(tagDiscCustom);
  8087. margePrefix(tagVideoMarker);
  8088. margePrefix(waypoint);
  8089. margePrefix(skybox);
  8090. margePrefix(videoLoading);
  8091. margePrefix(videoMakerWidget);
  8092. margePrefix(videoPanoMarker);
  8093. margePrefix(videoStemLine);
  8094. margePrefix(linkSpot);
  8095. margePrefix(linkSpotInside);
  8096. margePrefix(sphereRenderToCube);
  8097. var shaders = {
  8098. cube,
  8099. customDepth,
  8100. model: model$1,
  8101. modelDebug,
  8102. modelOutside,
  8103. ribbon,
  8104. skysphere,
  8105. tagDisc,
  8106. tagDiscDefault,
  8107. tagDiscCustom,
  8108. tagVideoMarker,
  8109. waypoint,
  8110. basicTextured,
  8111. copyCubeMap,
  8112. skybox,
  8113. videoLoading,
  8114. videoMakerWidget,
  8115. videoPanoMarker,
  8116. videoStemLine,
  8117. linkSpot,
  8118. linkSpotInside,
  8119. sphereRenderToCube
  8120. }; //
  8121. var bind$1 = function bind(fn, thisArg) {
  8122. return function wrap() {
  8123. var args = new Array(arguments.length);
  8124. for (var i = 0; i < args.length; i++) {
  8125. args[i] = arguments[i];
  8126. }
  8127. return fn.apply(thisArg, args);
  8128. };
  8129. };
  8130. /*global toString:true*/
  8131. // utils is a library of generic helper functions non-specific to axios
  8132. var toString = Object.prototype.toString;
  8133. /**
  8134. * Determine if a value is an Array
  8135. *
  8136. * @param {Object} val The value to test
  8137. * @returns {boolean} True if value is an Array, otherwise false
  8138. */
  8139. function isArray$3(val) {
  8140. return toString.call(val) === '[object Array]';
  8141. }
  8142. /**
  8143. * Determine if a value is undefined
  8144. *
  8145. * @param {Object} val The value to test
  8146. * @returns {boolean} True if the value is undefined, otherwise false
  8147. */
  8148. function isUndefined(val) {
  8149. return typeof val === 'undefined';
  8150. }
  8151. /**
  8152. * Determine if a value is a Buffer
  8153. *
  8154. * @param {Object} val The value to test
  8155. * @returns {boolean} True if value is a Buffer, otherwise false
  8156. */
  8157. function isBuffer$2(val) {
  8158. return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
  8159. }
  8160. /**
  8161. * Determine if a value is an ArrayBuffer
  8162. *
  8163. * @param {Object} val The value to test
  8164. * @returns {boolean} True if value is an ArrayBuffer, otherwise false
  8165. */
  8166. function isArrayBuffer(val) {
  8167. return toString.call(val) === '[object ArrayBuffer]';
  8168. }
  8169. /**
  8170. * Determine if a value is a FormData
  8171. *
  8172. * @param {Object} val The value to test
  8173. * @returns {boolean} True if value is an FormData, otherwise false
  8174. */
  8175. function isFormData(val) {
  8176. return typeof FormData !== 'undefined' && val instanceof FormData;
  8177. }
  8178. /**
  8179. * Determine if a value is a view on an ArrayBuffer
  8180. *
  8181. * @param {Object} val The value to test
  8182. * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
  8183. */
  8184. function isArrayBufferView(val) {
  8185. var result;
  8186. if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
  8187. result = ArrayBuffer.isView(val);
  8188. } else {
  8189. result = val && val.buffer && val.buffer instanceof ArrayBuffer;
  8190. }
  8191. return result;
  8192. }
  8193. /**
  8194. * Determine if a value is a String
  8195. *
  8196. * @param {Object} val The value to test
  8197. * @returns {boolean} True if value is a String, otherwise false
  8198. */
  8199. function isString$2(val) {
  8200. return typeof val === 'string';
  8201. }
  8202. /**
  8203. * Determine if a value is a Number
  8204. *
  8205. * @param {Object} val The value to test
  8206. * @returns {boolean} True if value is a Number, otherwise false
  8207. */
  8208. function isNumber$1(val) {
  8209. return typeof val === 'number';
  8210. }
  8211. /**
  8212. * Determine if a value is an Object
  8213. *
  8214. * @param {Object} val The value to test
  8215. * @returns {boolean} True if value is an Object, otherwise false
  8216. */
  8217. function isObject$3(val) {
  8218. return val !== null && typeof val === 'object';
  8219. }
  8220. /**
  8221. * Determine if a value is a plain Object
  8222. *
  8223. * @param {Object} val The value to test
  8224. * @return {boolean} True if value is a plain Object, otherwise false
  8225. */
  8226. function isPlainObject(val) {
  8227. if (toString.call(val) !== '[object Object]') {
  8228. return false;
  8229. }
  8230. var prototype = Object.getPrototypeOf(val);
  8231. return prototype === null || prototype === Object.prototype;
  8232. }
  8233. /**
  8234. * Determine if a value is a Date
  8235. *
  8236. * @param {Object} val The value to test
  8237. * @returns {boolean} True if value is a Date, otherwise false
  8238. */
  8239. function isDate$1(val) {
  8240. return toString.call(val) === '[object Date]';
  8241. }
  8242. /**
  8243. * Determine if a value is a File
  8244. *
  8245. * @param {Object} val The value to test
  8246. * @returns {boolean} True if value is a File, otherwise false
  8247. */
  8248. function isFile(val) {
  8249. return toString.call(val) === '[object File]';
  8250. }
  8251. /**
  8252. * Determine if a value is a Blob
  8253. *
  8254. * @param {Object} val The value to test
  8255. * @returns {boolean} True if value is a Blob, otherwise false
  8256. */
  8257. function isBlob$1(val) {
  8258. return toString.call(val) === '[object Blob]';
  8259. }
  8260. /**
  8261. * Determine if a value is a Function
  8262. *
  8263. * @param {Object} val The value to test
  8264. * @returns {boolean} True if value is a Function, otherwise false
  8265. */
  8266. function isFunction$1(val) {
  8267. return toString.call(val) === '[object Function]';
  8268. }
  8269. /**
  8270. * Determine if a value is a Stream
  8271. *
  8272. * @param {Object} val The value to test
  8273. * @returns {boolean} True if value is a Stream, otherwise false
  8274. */
  8275. function isStream(val) {
  8276. return isObject$3(val) && isFunction$1(val.pipe);
  8277. }
  8278. /**
  8279. * Determine if a value is a URLSearchParams object
  8280. *
  8281. * @param {Object} val The value to test
  8282. * @returns {boolean} True if value is a URLSearchParams object, otherwise false
  8283. */
  8284. function isURLSearchParams(val) {
  8285. return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
  8286. }
  8287. /**
  8288. * Trim excess whitespace off the beginning and end of a string
  8289. *
  8290. * @param {String} str The String to trim
  8291. * @returns {String} The String freed of excess whitespace
  8292. */
  8293. function trim(str) {
  8294. return str.replace(/^\s*/, '').replace(/\s*$/, '');
  8295. }
  8296. /**
  8297. * Determine if we're running in a standard browser environment
  8298. *
  8299. * This allows axios to run in a web worker, and react-native.
  8300. * Both environments support XMLHttpRequest, but not fully standard globals.
  8301. *
  8302. * web workers:
  8303. * typeof window -> undefined
  8304. * typeof document -> undefined
  8305. *
  8306. * react-native:
  8307. * navigator.product -> 'ReactNative'
  8308. * nativescript
  8309. * navigator.product -> 'NativeScript' or 'NS'
  8310. */
  8311. function isStandardBrowserEnv() {
  8312. if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || navigator.product === 'NativeScript' || navigator.product === 'NS')) {
  8313. return false;
  8314. }
  8315. return typeof window !== 'undefined' && typeof document !== 'undefined';
  8316. }
  8317. /**
  8318. * Iterate over an Array or an Object invoking a function for each item.
  8319. *
  8320. * If `obj` is an Array callback will be called passing
  8321. * the value, index, and complete array for each item.
  8322. *
  8323. * If 'obj' is an Object callback will be called passing
  8324. * the value, key, and complete object for each property.
  8325. *
  8326. * @param {Object|Array} obj The object to iterate
  8327. * @param {Function} fn The callback to invoke for each item
  8328. */
  8329. function forEach(obj, fn) {
  8330. // Don't bother if no value provided
  8331. if (obj === null || typeof obj === 'undefined') {
  8332. return;
  8333. } // Force an array if not already something iterable
  8334. if (typeof obj !== 'object') {
  8335. /*eslint no-param-reassign:0*/
  8336. obj = [obj];
  8337. }
  8338. if (isArray$3(obj)) {
  8339. // Iterate over array values
  8340. for (var i = 0, l = obj.length; i < l; i++) {
  8341. fn.call(null, obj[i], i, obj);
  8342. }
  8343. } else {
  8344. // Iterate over object keys
  8345. for (var key in obj) {
  8346. if (Object.prototype.hasOwnProperty.call(obj, key)) {
  8347. fn.call(null, obj[key], key, obj);
  8348. }
  8349. }
  8350. }
  8351. }
  8352. /**
  8353. * Accepts varargs expecting each argument to be an object, then
  8354. * immutably merges the properties of each object and returns result.
  8355. *
  8356. * When multiple objects contain the same key the later object in
  8357. * the arguments list will take precedence.
  8358. *
  8359. * Example:
  8360. *
  8361. * ```js
  8362. * var result = merge({foo: 123}, {foo: 456});
  8363. * console.log(result.foo); // outputs 456
  8364. * ```
  8365. *
  8366. * @param {Object} obj1 Object to merge
  8367. * @returns {Object} Result of all merge properties
  8368. */
  8369. function merge() {
  8370. var result = {};
  8371. function assignValue(val, key) {
  8372. if (isPlainObject(result[key]) && isPlainObject(val)) {
  8373. result[key] = merge(result[key], val);
  8374. } else if (isPlainObject(val)) {
  8375. result[key] = merge({}, val);
  8376. } else if (isArray$3(val)) {
  8377. result[key] = val.slice();
  8378. } else {
  8379. result[key] = val;
  8380. }
  8381. }
  8382. for (var i = 0, l = arguments.length; i < l; i++) {
  8383. forEach(arguments[i], assignValue);
  8384. }
  8385. return result;
  8386. }
  8387. /**
  8388. * Extends object a by mutably adding to it the properties of object b.
  8389. *
  8390. * @param {Object} a The object to be extended
  8391. * @param {Object} b The object to copy properties from
  8392. * @param {Object} thisArg The object to bind function to
  8393. * @return {Object} The resulting value of object a
  8394. */
  8395. function extend$1(a, b, thisArg) {
  8396. forEach(b, function assignValue(val, key) {
  8397. if (thisArg && typeof val === 'function') {
  8398. a[key] = bind$1(val, thisArg);
  8399. } else {
  8400. a[key] = val;
  8401. }
  8402. });
  8403. return a;
  8404. }
  8405. /**
  8406. * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
  8407. *
  8408. * @param {string} content with BOM
  8409. * @return {string} content value without BOM
  8410. */
  8411. function stripBOM(content) {
  8412. if (content.charCodeAt(0) === 0xFEFF) {
  8413. content = content.slice(1);
  8414. }
  8415. return content;
  8416. }
  8417. var utils = {
  8418. isArray: isArray$3,
  8419. isArrayBuffer: isArrayBuffer,
  8420. isBuffer: isBuffer$2,
  8421. isFormData: isFormData,
  8422. isArrayBufferView: isArrayBufferView,
  8423. isString: isString$2,
  8424. isNumber: isNumber$1,
  8425. isObject: isObject$3,
  8426. isPlainObject: isPlainObject,
  8427. isUndefined: isUndefined,
  8428. isDate: isDate$1,
  8429. isFile: isFile,
  8430. isBlob: isBlob$1,
  8431. isFunction: isFunction$1,
  8432. isStream: isStream,
  8433. isURLSearchParams: isURLSearchParams,
  8434. isStandardBrowserEnv: isStandardBrowserEnv,
  8435. forEach: forEach,
  8436. merge: merge,
  8437. extend: extend$1,
  8438. trim: trim,
  8439. stripBOM: stripBOM
  8440. };
  8441. function encode$5(val) {
  8442. return encodeURIComponent(val).replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']');
  8443. }
  8444. /**
  8445. * Build a URL by appending params to the end
  8446. *
  8447. * @param {string} url The base of the url (e.g., http://www.google.com)
  8448. * @param {object} [params] The params to be appended
  8449. * @returns {string} The formatted url
  8450. */
  8451. var buildURL = function buildURL(url, params, paramsSerializer) {
  8452. /*eslint no-param-reassign:0*/
  8453. if (!params) {
  8454. return url;
  8455. }
  8456. var serializedParams;
  8457. if (paramsSerializer) {
  8458. serializedParams = paramsSerializer(params);
  8459. } else if (utils.isURLSearchParams(params)) {
  8460. serializedParams = params.toString();
  8461. } else {
  8462. var parts = [];
  8463. utils.forEach(params, function serialize(val, key) {
  8464. if (val === null || typeof val === 'undefined') {
  8465. return;
  8466. }
  8467. if (utils.isArray(val)) {
  8468. key = key + '[]';
  8469. } else {
  8470. val = [val];
  8471. }
  8472. utils.forEach(val, function parseValue(v) {
  8473. if (utils.isDate(v)) {
  8474. v = v.toISOString();
  8475. } else if (utils.isObject(v)) {
  8476. v = JSON.stringify(v);
  8477. }
  8478. parts.push(encode$5(key) + '=' + encode$5(v));
  8479. });
  8480. });
  8481. serializedParams = parts.join('&');
  8482. }
  8483. if (serializedParams) {
  8484. var hashmarkIndex = url.indexOf('#');
  8485. if (hashmarkIndex !== -1) {
  8486. url = url.slice(0, hashmarkIndex);
  8487. }
  8488. url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
  8489. }
  8490. return url;
  8491. };
  8492. function InterceptorManager() {
  8493. this.handlers = [];
  8494. }
  8495. /**
  8496. * Add a new interceptor to the stack
  8497. *
  8498. * @param {Function} fulfilled The function to handle `then` for a `Promise`
  8499. * @param {Function} rejected The function to handle `reject` for a `Promise`
  8500. *
  8501. * @return {Number} An ID used to remove interceptor later
  8502. */
  8503. InterceptorManager.prototype.use = function use(fulfilled, rejected) {
  8504. this.handlers.push({
  8505. fulfilled: fulfilled,
  8506. rejected: rejected
  8507. });
  8508. return this.handlers.length - 1;
  8509. };
  8510. /**
  8511. * Remove an interceptor from the stack
  8512. *
  8513. * @param {Number} id The ID that was returned by `use`
  8514. */
  8515. InterceptorManager.prototype.eject = function eject(id) {
  8516. if (this.handlers[id]) {
  8517. this.handlers[id] = null;
  8518. }
  8519. };
  8520. /**
  8521. * Iterate over all the registered interceptors
  8522. *
  8523. * This method is particularly useful for skipping over any
  8524. * interceptors that may have become `null` calling `eject`.
  8525. *
  8526. * @param {Function} fn The function to call for each interceptor
  8527. */
  8528. InterceptorManager.prototype.forEach = function forEach(fn) {
  8529. utils.forEach(this.handlers, function forEachHandler(h) {
  8530. if (h !== null) {
  8531. fn(h);
  8532. }
  8533. });
  8534. };
  8535. var InterceptorManager_1 = InterceptorManager;
  8536. /**
  8537. * Transform the data for a request or a response
  8538. *
  8539. * @param {Object|String} data The data to be transformed
  8540. * @param {Array} headers The headers for the request or response
  8541. * @param {Array|Function} fns A single function or Array of functions
  8542. * @returns {*} The resulting transformed data
  8543. */
  8544. var transformData = function transformData(data, headers, fns) {
  8545. /*eslint no-param-reassign:0*/
  8546. utils.forEach(fns, function transform(fn) {
  8547. data = fn(data, headers);
  8548. });
  8549. return data;
  8550. };
  8551. var isCancel = function isCancel(value) {
  8552. return !!(value && value.__CANCEL__);
  8553. };
  8554. var normalizeHeaderName = function normalizeHeaderName(headers, normalizedName) {
  8555. utils.forEach(headers, function processHeader(value, name) {
  8556. if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
  8557. headers[normalizedName] = value;
  8558. delete headers[name];
  8559. }
  8560. });
  8561. };
  8562. /**
  8563. * Update an Error with the specified config, error code, and response.
  8564. *
  8565. * @param {Error} error The error to update.
  8566. * @param {Object} config The config.
  8567. * @param {string} [code] The error code (for example, 'ECONNABORTED').
  8568. * @param {Object} [request] The request.
  8569. * @param {Object} [response] The response.
  8570. * @returns {Error} The error.
  8571. */
  8572. var enhanceError = function enhanceError(error, config, code, request, response) {
  8573. error.config = config;
  8574. if (code) {
  8575. error.code = code;
  8576. }
  8577. error.request = request;
  8578. error.response = response;
  8579. error.isAxiosError = true;
  8580. error.toJSON = function toJSON() {
  8581. return {
  8582. // Standard
  8583. message: this.message,
  8584. name: this.name,
  8585. // Microsoft
  8586. description: this.description,
  8587. number: this.number,
  8588. // Mozilla
  8589. fileName: this.fileName,
  8590. lineNumber: this.lineNumber,
  8591. columnNumber: this.columnNumber,
  8592. stack: this.stack,
  8593. // Axios
  8594. config: this.config,
  8595. code: this.code
  8596. };
  8597. };
  8598. return error;
  8599. };
  8600. /**
  8601. * Create an Error with the specified message, config, error code, request and response.
  8602. *
  8603. * @param {string} message The error message.
  8604. * @param {Object} config The config.
  8605. * @param {string} [code] The error code (for example, 'ECONNABORTED').
  8606. * @param {Object} [request] The request.
  8607. * @param {Object} [response] The response.
  8608. * @returns {Error} The created error.
  8609. */
  8610. var createError = function createError(message, config, code, request, response) {
  8611. var error = new Error(message);
  8612. return enhanceError(error, config, code, request, response);
  8613. };
  8614. /**
  8615. * Resolve or reject a Promise based on response status.
  8616. *
  8617. * @param {Function} resolve A function that resolves the promise.
  8618. * @param {Function} reject A function that rejects the promise.
  8619. * @param {object} response The response.
  8620. */
  8621. var settle = function settle(resolve, reject, response) {
  8622. var validateStatus = response.config.validateStatus;
  8623. if (!response.status || !validateStatus || validateStatus(response.status)) {
  8624. resolve(response);
  8625. } else {
  8626. reject(createError('Request failed with status code ' + response.status, response.config, null, response.request, response));
  8627. }
  8628. };
  8629. var cookies = utils.isStandardBrowserEnv() ? // Standard browser envs support document.cookie
  8630. function standardBrowserEnv() {
  8631. return {
  8632. write: function write(name, value, expires, path, domain, secure) {
  8633. var cookie = [];
  8634. cookie.push(name + '=' + encodeURIComponent(value));
  8635. if (utils.isNumber(expires)) {
  8636. cookie.push('expires=' + new Date(expires).toGMTString());
  8637. }
  8638. if (utils.isString(path)) {
  8639. cookie.push('path=' + path);
  8640. }
  8641. if (utils.isString(domain)) {
  8642. cookie.push('domain=' + domain);
  8643. }
  8644. if (secure === true) {
  8645. cookie.push('secure');
  8646. }
  8647. document.cookie = cookie.join('; ');
  8648. },
  8649. read: function read(name) {
  8650. var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
  8651. return match ? decodeURIComponent(match[3]) : null;
  8652. },
  8653. remove: function remove(name) {
  8654. this.write(name, '', Date.now() - 86400000);
  8655. }
  8656. };
  8657. }() : // Non standard browser env (web workers, react-native) lack needed support.
  8658. function nonStandardBrowserEnv() {
  8659. return {
  8660. write: function write() {},
  8661. read: function read() {
  8662. return null;
  8663. },
  8664. remove: function remove() {}
  8665. };
  8666. }();
  8667. /**
  8668. * Determines whether the specified URL is absolute
  8669. *
  8670. * @param {string} url The URL to test
  8671. * @returns {boolean} True if the specified URL is absolute, otherwise false
  8672. */
  8673. var isAbsoluteURL = function isAbsoluteURL(url) {
  8674. // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
  8675. // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
  8676. // by any combination of letters, digits, plus, period, or hyphen.
  8677. return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url);
  8678. };
  8679. /**
  8680. * Creates a new URL by combining the specified URLs
  8681. *
  8682. * @param {string} baseURL The base URL
  8683. * @param {string} relativeURL The relative URL
  8684. * @returns {string} The combined URL
  8685. */
  8686. var combineURLs = function combineURLs(baseURL, relativeURL) {
  8687. return relativeURL ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL;
  8688. };
  8689. /**
  8690. * Creates a new URL by combining the baseURL with the requestedURL,
  8691. * only when the requestedURL is not already an absolute URL.
  8692. * If the requestURL is absolute, this function returns the requestedURL untouched.
  8693. *
  8694. * @param {string} baseURL The base URL
  8695. * @param {string} requestedURL Absolute or relative URL to combine
  8696. * @returns {string} The combined full path
  8697. */
  8698. var buildFullPath = function buildFullPath(baseURL, requestedURL) {
  8699. if (baseURL && !isAbsoluteURL(requestedURL)) {
  8700. return combineURLs(baseURL, requestedURL);
  8701. }
  8702. return requestedURL;
  8703. };
  8704. // Headers whose duplicates are ignored by node
  8705. // c.f. https://nodejs.org/api/http.html#http_message_headers
  8706. 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'];
  8707. /**
  8708. * Parse headers into an object
  8709. *
  8710. * ```
  8711. * Date: Wed, 27 Aug 2014 08:58:49 GMT
  8712. * Content-Type: application/json
  8713. * Connection: keep-alive
  8714. * Transfer-Encoding: chunked
  8715. * ```
  8716. *
  8717. * @param {String} headers Headers needing to be parsed
  8718. * @returns {Object} Headers parsed into an object
  8719. */
  8720. var parseHeaders = function parseHeaders(headers) {
  8721. var parsed = {};
  8722. var key;
  8723. var val;
  8724. var i;
  8725. if (!headers) {
  8726. return parsed;
  8727. }
  8728. utils.forEach(headers.split('\n'), function parser(line) {
  8729. i = line.indexOf(':');
  8730. key = utils.trim(line.substr(0, i)).toLowerCase();
  8731. val = utils.trim(line.substr(i + 1));
  8732. if (key) {
  8733. if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
  8734. return;
  8735. }
  8736. if (key === 'set-cookie') {
  8737. parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
  8738. } else {
  8739. parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
  8740. }
  8741. }
  8742. });
  8743. return parsed;
  8744. };
  8745. var isURLSameOrigin = utils.isStandardBrowserEnv() ? // Standard browser envs have full support of the APIs needed to test
  8746. // whether the request URL is of the same origin as current location.
  8747. function standardBrowserEnv() {
  8748. var msie = /(msie|trident)/i.test(navigator.userAgent);
  8749. var urlParsingNode = document.createElement('a');
  8750. var originURL;
  8751. /**
  8752. * Parse a URL to discover it's components
  8753. *
  8754. * @param {String} url The URL to be parsed
  8755. * @returns {Object}
  8756. */
  8757. function resolveURL(url) {
  8758. var href = url;
  8759. if (msie) {
  8760. // IE needs attribute set twice to normalize properties
  8761. urlParsingNode.setAttribute('href', href);
  8762. href = urlParsingNode.href;
  8763. }
  8764. urlParsingNode.setAttribute('href', href); // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
  8765. return {
  8766. href: urlParsingNode.href,
  8767. protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
  8768. host: urlParsingNode.host,
  8769. search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
  8770. hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
  8771. hostname: urlParsingNode.hostname,
  8772. port: urlParsingNode.port,
  8773. pathname: urlParsingNode.pathname.charAt(0) === '/' ? urlParsingNode.pathname : '/' + urlParsingNode.pathname
  8774. };
  8775. }
  8776. originURL = resolveURL(window.location.href);
  8777. /**
  8778. * Determine if a URL shares the same origin as the current location
  8779. *
  8780. * @param {String} requestURL The URL to test
  8781. * @returns {boolean} True if URL shares the same origin, otherwise false
  8782. */
  8783. return function isURLSameOrigin(requestURL) {
  8784. var parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;
  8785. return parsed.protocol === originURL.protocol && parsed.host === originURL.host;
  8786. };
  8787. }() : // Non standard browser envs (web workers, react-native) lack needed support.
  8788. function nonStandardBrowserEnv() {
  8789. return function isURLSameOrigin() {
  8790. return true;
  8791. };
  8792. }();
  8793. var xhr = function xhrAdapter(config) {
  8794. return new Promise(function dispatchXhrRequest(resolve, reject) {
  8795. var requestData = config.data;
  8796. var requestHeaders = config.headers;
  8797. if (utils.isFormData(requestData)) {
  8798. delete requestHeaders['Content-Type']; // Let the browser set it
  8799. }
  8800. var request = new XMLHttpRequest(); // HTTP basic authentication
  8801. if (config.auth) {
  8802. var username = config.auth.username || '';
  8803. var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
  8804. requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
  8805. }
  8806. var fullPath = buildFullPath(config.baseURL, config.url);
  8807. request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); // Set the request timeout in MS
  8808. request.timeout = config.timeout; // Listen for ready state
  8809. request.onreadystatechange = function handleLoad() {
  8810. if (!request || request.readyState !== 4) {
  8811. return;
  8812. } // The request errored out and we didn't get a response, this will be
  8813. // handled by onerror instead
  8814. // With one exception: request that using file: protocol, most browsers
  8815. // will return status as 0 even though it's a successful request
  8816. if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
  8817. return;
  8818. } // Prepare the response
  8819. var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
  8820. var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
  8821. var response = {
  8822. data: responseData,
  8823. status: request.status,
  8824. statusText: request.statusText,
  8825. headers: responseHeaders,
  8826. config: config,
  8827. request: request
  8828. };
  8829. settle(resolve, reject, response); // Clean up request
  8830. request = null;
  8831. }; // Handle browser request cancellation (as opposed to a manual cancellation)
  8832. request.onabort = function handleAbort() {
  8833. if (!request) {
  8834. return;
  8835. }
  8836. reject(createError('Request aborted', config, 'ECONNABORTED', request)); // Clean up request
  8837. request = null;
  8838. }; // Handle low level network errors
  8839. request.onerror = function handleError() {
  8840. // Real errors are hidden from us by the browser
  8841. // onerror should only fire if it's a network error
  8842. reject(createError('Network Error', config, null, request)); // Clean up request
  8843. request = null;
  8844. }; // Handle timeout
  8845. request.ontimeout = function handleTimeout() {
  8846. var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';
  8847. if (config.timeoutErrorMessage) {
  8848. timeoutErrorMessage = config.timeoutErrorMessage;
  8849. }
  8850. reject(createError(timeoutErrorMessage, config, 'ECONNABORTED', request)); // Clean up request
  8851. request = null;
  8852. }; // Add xsrf header
  8853. // This is only done if running in a standard browser environment.
  8854. // Specifically not if we're in a web worker, or react-native.
  8855. if (utils.isStandardBrowserEnv()) {
  8856. // Add xsrf header
  8857. var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? cookies.read(config.xsrfCookieName) : undefined;
  8858. if (xsrfValue) {
  8859. requestHeaders[config.xsrfHeaderName] = xsrfValue;
  8860. }
  8861. } // Add headers to the request
  8862. if ('setRequestHeader' in request) {
  8863. utils.forEach(requestHeaders, function setRequestHeader(val, key) {
  8864. if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
  8865. // Remove Content-Type if data is undefined
  8866. delete requestHeaders[key];
  8867. } else {
  8868. // Otherwise add header to the request
  8869. request.setRequestHeader(key, val);
  8870. }
  8871. });
  8872. } // Add withCredentials to request if needed
  8873. if (!utils.isUndefined(config.withCredentials)) {
  8874. request.withCredentials = !!config.withCredentials;
  8875. } // Add responseType to request if needed
  8876. if (config.responseType) {
  8877. try {
  8878. request.responseType = config.responseType;
  8879. } catch (e) {
  8880. // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.
  8881. // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.
  8882. if (config.responseType !== 'json') {
  8883. throw e;
  8884. }
  8885. }
  8886. } // Handle progress if needed
  8887. if (typeof config.onDownloadProgress === 'function') {
  8888. request.addEventListener('progress', config.onDownloadProgress);
  8889. } // Not all browsers support upload events
  8890. if (typeof config.onUploadProgress === 'function' && request.upload) {
  8891. request.upload.addEventListener('progress', config.onUploadProgress);
  8892. }
  8893. if (config.cancelToken) {
  8894. // Handle cancellation
  8895. config.cancelToken.promise.then(function onCanceled(cancel) {
  8896. if (!request) {
  8897. return;
  8898. }
  8899. request.abort();
  8900. reject(cancel); // Clean up request
  8901. request = null;
  8902. });
  8903. }
  8904. if (!requestData) {
  8905. requestData = null;
  8906. } // Send the request
  8907. request.send(requestData);
  8908. });
  8909. };
  8910. var DEFAULT_CONTENT_TYPE = {
  8911. 'Content-Type': 'application/x-www-form-urlencoded'
  8912. };
  8913. function setContentTypeIfUnset(headers, value) {
  8914. if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
  8915. headers['Content-Type'] = value;
  8916. }
  8917. }
  8918. function getDefaultAdapter() {
  8919. var adapter;
  8920. if (typeof XMLHttpRequest !== 'undefined') {
  8921. // For browsers use XHR adapter
  8922. adapter = xhr;
  8923. } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
  8924. // For node use HTTP adapter
  8925. adapter = xhr;
  8926. }
  8927. return adapter;
  8928. }
  8929. var defaults = {
  8930. adapter: getDefaultAdapter(),
  8931. transformRequest: [function transformRequest(data, headers) {
  8932. normalizeHeaderName(headers, 'Accept');
  8933. normalizeHeaderName(headers, 'Content-Type');
  8934. if (utils.isFormData(data) || utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)) {
  8935. return data;
  8936. }
  8937. if (utils.isArrayBufferView(data)) {
  8938. return data.buffer;
  8939. }
  8940. if (utils.isURLSearchParams(data)) {
  8941. setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
  8942. return data.toString();
  8943. }
  8944. if (utils.isObject(data)) {
  8945. setContentTypeIfUnset(headers, 'application/json;charset=utf-8');
  8946. return JSON.stringify(data);
  8947. }
  8948. return data;
  8949. }],
  8950. transformResponse: [function transformResponse(data) {
  8951. /*eslint no-param-reassign:0*/
  8952. if (typeof data === 'string') {
  8953. try {
  8954. data = JSON.parse(data);
  8955. } catch (e) {
  8956. /* Ignore */
  8957. }
  8958. }
  8959. return data;
  8960. }],
  8961. /**
  8962. * A timeout in milliseconds to abort a request. If set to 0 (default) a
  8963. * timeout is not created.
  8964. */
  8965. timeout: 0,
  8966. xsrfCookieName: 'XSRF-TOKEN',
  8967. xsrfHeaderName: 'X-XSRF-TOKEN',
  8968. maxContentLength: -1,
  8969. maxBodyLength: -1,
  8970. validateStatus: function validateStatus(status) {
  8971. return status >= 200 && status < 300;
  8972. }
  8973. };
  8974. defaults.headers = {
  8975. common: {
  8976. 'Accept': 'application/json, text/plain, */*'
  8977. }
  8978. };
  8979. utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
  8980. defaults.headers[method] = {};
  8981. });
  8982. utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  8983. defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
  8984. });
  8985. var defaults_1 = defaults;
  8986. /**
  8987. * Throws a `Cancel` if cancellation has been requested.
  8988. */
  8989. function throwIfCancellationRequested(config) {
  8990. if (config.cancelToken) {
  8991. config.cancelToken.throwIfRequested();
  8992. }
  8993. }
  8994. /**
  8995. * Dispatch a request to the server using the configured adapter.
  8996. *
  8997. * @param {object} config The config that is to be used for the request
  8998. * @returns {Promise} The Promise to be fulfilled
  8999. */
  9000. var dispatchRequest = function dispatchRequest(config) {
  9001. throwIfCancellationRequested(config); // Ensure headers exist
  9002. config.headers = config.headers || {}; // Transform request data
  9003. config.data = transformData(config.data, config.headers, config.transformRequest); // Flatten headers
  9004. config.headers = utils.merge(config.headers.common || {}, config.headers[config.method] || {}, config.headers);
  9005. utils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], function cleanHeaderConfig(method) {
  9006. delete config.headers[method];
  9007. });
  9008. var adapter = config.adapter || defaults_1.adapter;
  9009. return adapter(config).then(function onAdapterResolution(response) {
  9010. throwIfCancellationRequested(config); // Transform response data
  9011. response.data = transformData(response.data, response.headers, config.transformResponse);
  9012. return response;
  9013. }, function onAdapterRejection(reason) {
  9014. if (!isCancel(reason)) {
  9015. throwIfCancellationRequested(config); // Transform response data
  9016. if (reason && reason.response) {
  9017. reason.response.data = transformData(reason.response.data, reason.response.headers, config.transformResponse);
  9018. }
  9019. }
  9020. return Promise.reject(reason);
  9021. });
  9022. };
  9023. /**
  9024. * Config-specific merge-function which creates a new config-object
  9025. * by merging two configuration objects together.
  9026. *
  9027. * @param {Object} config1
  9028. * @param {Object} config2
  9029. * @returns {Object} New object resulting from merging config2 to config1
  9030. */
  9031. var mergeConfig = function mergeConfig(config1, config2) {
  9032. // eslint-disable-next-line no-param-reassign
  9033. config2 = config2 || {};
  9034. var config = {};
  9035. var valueFromConfig2Keys = ['url', 'method', 'data'];
  9036. var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy', 'params'];
  9037. 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'];
  9038. var directMergeKeys = ['validateStatus'];
  9039. function getMergedValue(target, source) {
  9040. if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
  9041. return utils.merge(target, source);
  9042. } else if (utils.isPlainObject(source)) {
  9043. return utils.merge({}, source);
  9044. } else if (utils.isArray(source)) {
  9045. return source.slice();
  9046. }
  9047. return source;
  9048. }
  9049. function mergeDeepProperties(prop) {
  9050. if (!utils.isUndefined(config2[prop])) {
  9051. config[prop] = getMergedValue(config1[prop], config2[prop]);
  9052. } else if (!utils.isUndefined(config1[prop])) {
  9053. config[prop] = getMergedValue(undefined, config1[prop]);
  9054. }
  9055. }
  9056. utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {
  9057. if (!utils.isUndefined(config2[prop])) {
  9058. config[prop] = getMergedValue(undefined, config2[prop]);
  9059. }
  9060. });
  9061. utils.forEach(mergeDeepPropertiesKeys, mergeDeepProperties);
  9062. utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {
  9063. if (!utils.isUndefined(config2[prop])) {
  9064. config[prop] = getMergedValue(undefined, config2[prop]);
  9065. } else if (!utils.isUndefined(config1[prop])) {
  9066. config[prop] = getMergedValue(undefined, config1[prop]);
  9067. }
  9068. });
  9069. utils.forEach(directMergeKeys, function merge(prop) {
  9070. if (prop in config2) {
  9071. config[prop] = getMergedValue(config1[prop], config2[prop]);
  9072. } else if (prop in config1) {
  9073. config[prop] = getMergedValue(undefined, config1[prop]);
  9074. }
  9075. });
  9076. var axiosKeys = valueFromConfig2Keys.concat(mergeDeepPropertiesKeys).concat(defaultToConfig2Keys).concat(directMergeKeys);
  9077. var otherKeys = Object.keys(config1).concat(Object.keys(config2)).filter(function filterAxiosKeys(key) {
  9078. return axiosKeys.indexOf(key) === -1;
  9079. });
  9080. utils.forEach(otherKeys, mergeDeepProperties);
  9081. return config;
  9082. };
  9083. /**
  9084. * Create a new instance of Axios
  9085. *
  9086. * @param {Object} instanceConfig The default config for the instance
  9087. */
  9088. function Axios(instanceConfig) {
  9089. this.defaults = instanceConfig;
  9090. this.interceptors = {
  9091. request: new InterceptorManager_1(),
  9092. response: new InterceptorManager_1()
  9093. };
  9094. }
  9095. /**
  9096. * Dispatch a request
  9097. *
  9098. * @param {Object} config The config specific for this request (merged with this.defaults)
  9099. */
  9100. Axios.prototype.request = function request(config) {
  9101. /*eslint no-param-reassign:0*/
  9102. // Allow for axios('example/url'[, config]) a la fetch API
  9103. if (typeof config === 'string') {
  9104. config = arguments[1] || {};
  9105. config.url = arguments[0];
  9106. } else {
  9107. config = config || {};
  9108. }
  9109. config = mergeConfig(this.defaults, config); // Set config.method
  9110. if (config.method) {
  9111. config.method = config.method.toLowerCase();
  9112. } else if (this.defaults.method) {
  9113. config.method = this.defaults.method.toLowerCase();
  9114. } else {
  9115. config.method = 'get';
  9116. } // Hook up interceptors middleware
  9117. var chain = [dispatchRequest, undefined];
  9118. var promise = Promise.resolve(config);
  9119. this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
  9120. chain.unshift(interceptor.fulfilled, interceptor.rejected);
  9121. });
  9122. this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
  9123. chain.push(interceptor.fulfilled, interceptor.rejected);
  9124. });
  9125. while (chain.length) {
  9126. promise = promise.then(chain.shift(), chain.shift());
  9127. }
  9128. return promise;
  9129. };
  9130. Axios.prototype.getUri = function getUri(config) {
  9131. config = mergeConfig(this.defaults, config);
  9132. return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, '');
  9133. }; // Provide aliases for supported request methods
  9134. utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
  9135. /*eslint func-names:0*/
  9136. Axios.prototype[method] = function (url, config) {
  9137. return this.request(mergeConfig(config || {}, {
  9138. method: method,
  9139. url: url,
  9140. data: (config || {}).data
  9141. }));
  9142. };
  9143. });
  9144. utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
  9145. /*eslint func-names:0*/
  9146. Axios.prototype[method] = function (url, data, config) {
  9147. return this.request(mergeConfig(config || {}, {
  9148. method: method,
  9149. url: url,
  9150. data: data
  9151. }));
  9152. };
  9153. });
  9154. var Axios_1 = Axios;
  9155. /**
  9156. * A `Cancel` is an object that is thrown when an operation is canceled.
  9157. *
  9158. * @class
  9159. * @param {string=} message The message.
  9160. */
  9161. function Cancel(message) {
  9162. this.message = message;
  9163. }
  9164. Cancel.prototype.toString = function toString() {
  9165. return 'Cancel' + (this.message ? ': ' + this.message : '');
  9166. };
  9167. Cancel.prototype.__CANCEL__ = true;
  9168. var Cancel_1 = Cancel;
  9169. /**
  9170. * A `CancelToken` is an object that can be used to request cancellation of an operation.
  9171. *
  9172. * @class
  9173. * @param {Function} executor The executor function.
  9174. */
  9175. function CancelToken(executor) {
  9176. if (typeof executor !== 'function') {
  9177. throw new TypeError('executor must be a function.');
  9178. }
  9179. var resolvePromise;
  9180. this.promise = new Promise(function promiseExecutor(resolve) {
  9181. resolvePromise = resolve;
  9182. });
  9183. var token = this;
  9184. executor(function cancel(message) {
  9185. if (token.reason) {
  9186. // Cancellation has already been requested
  9187. return;
  9188. }
  9189. token.reason = new Cancel_1(message);
  9190. resolvePromise(token.reason);
  9191. });
  9192. }
  9193. /**
  9194. * Throws a `Cancel` if cancellation has been requested.
  9195. */
  9196. CancelToken.prototype.throwIfRequested = function throwIfRequested() {
  9197. if (this.reason) {
  9198. throw this.reason;
  9199. }
  9200. };
  9201. /**
  9202. * Returns an object that contains a new `CancelToken` and a function that, when called,
  9203. * cancels the `CancelToken`.
  9204. */
  9205. CancelToken.source = function source() {
  9206. var cancel;
  9207. var token = new CancelToken(function executor(c) {
  9208. cancel = c;
  9209. });
  9210. return {
  9211. token: token,
  9212. cancel: cancel
  9213. };
  9214. };
  9215. var CancelToken_1 = CancelToken;
  9216. /**
  9217. * Syntactic sugar for invoking a function and expanding an array for arguments.
  9218. *
  9219. * Common use case would be to use `Function.prototype.apply`.
  9220. *
  9221. * ```js
  9222. * function f(x, y, z) {}
  9223. * var args = [1, 2, 3];
  9224. * f.apply(null, args);
  9225. * ```
  9226. *
  9227. * With `spread` this example can be re-written.
  9228. *
  9229. * ```js
  9230. * spread(function(x, y, z) {})([1, 2, 3]);
  9231. * ```
  9232. *
  9233. * @param {Function} callback
  9234. * @returns {Function}
  9235. */
  9236. var spread = function spread(callback) {
  9237. return function wrap(arr) {
  9238. return callback.apply(null, arr);
  9239. };
  9240. };
  9241. /**
  9242. * Determines whether the payload is an error thrown by Axios
  9243. *
  9244. * @param {*} payload The value to test
  9245. * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
  9246. */
  9247. var isAxiosError = function isAxiosError(payload) {
  9248. return typeof payload === 'object' && payload.isAxiosError === true;
  9249. };
  9250. /**
  9251. * Create an instance of Axios
  9252. *
  9253. * @param {Object} defaultConfig The default config for the instance
  9254. * @return {Axios} A new instance of Axios
  9255. */
  9256. function createInstance(defaultConfig) {
  9257. var context = new Axios_1(defaultConfig);
  9258. var instance = bind$1(Axios_1.prototype.request, context); // Copy axios.prototype to instance
  9259. utils.extend(instance, Axios_1.prototype, context); // Copy context to instance
  9260. utils.extend(instance, context);
  9261. return instance;
  9262. } // Create the default instance to be exported
  9263. var axios$1 = createInstance(defaults_1); // Expose Axios class to allow class inheritance
  9264. axios$1.Axios = Axios_1; // Factory for creating new instances
  9265. axios$1.create = function create(instanceConfig) {
  9266. return createInstance(mergeConfig(axios$1.defaults, instanceConfig));
  9267. }; // Expose Cancel & CancelToken
  9268. axios$1.Cancel = Cancel_1;
  9269. axios$1.CancelToken = CancelToken_1;
  9270. axios$1.isCancel = isCancel; // Expose all/spread
  9271. axios$1.all = function all(promises) {
  9272. return Promise.all(promises);
  9273. };
  9274. axios$1.spread = spread; // Expose isAxiosError
  9275. axios$1.isAxiosError = isAxiosError;
  9276. var axios_1 = axios$1; // Allow use of default import syntax in TypeScript
  9277. var _default$1 = axios$1;
  9278. axios_1.default = _default$1;
  9279. var axios = axios_1;
  9280. var fetch$1 = null;
  9281. var config$5 = null;
  9282. var instance = null;
  9283. Promise.prototype.done = Promise.prototype.then;
  9284. Promise.prototype.fail = Promise.prototype.catch; // TextDecoder polyfills for lower browser
  9285. if (undefined === window.TextEncoder) {
  9286. window.TextEncoder = /*#__PURE__*/function () {
  9287. function _TextEncoder() {
  9288. _classCallCheck(this, _TextEncoder);
  9289. }
  9290. _createClass(_TextEncoder, [{
  9291. key: "encode",
  9292. value: function encode(s) {
  9293. return unescape(encodeURIComponent(s)).split('').map(function (val) {
  9294. return val.charCodeAt();
  9295. });
  9296. }
  9297. }]);
  9298. return _TextEncoder;
  9299. }();
  9300. window.TextDecoder = /*#__PURE__*/function () {
  9301. function _TextDecoder() {
  9302. _classCallCheck(this, _TextDecoder);
  9303. }
  9304. _createClass(_TextDecoder, [{
  9305. key: "decode",
  9306. value: function decode(code_arr) {
  9307. return decodeURIComponent(escape(String.fromCharCode.apply(null, code_arr)));
  9308. }
  9309. }]);
  9310. return _TextDecoder;
  9311. }();
  9312. }
  9313. var http = {
  9314. retry(func) {
  9315. var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  9316. var delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000;
  9317. return new Promise(function (resolve, reject) {
  9318. func().then(resolve).catch(function (error) {
  9319. if (retries <= 1) {
  9320. reject(error);
  9321. } else {
  9322. setTimeout(function () {
  9323. http.retry(func, retries - 1, delay).then(resolve).catch(reject);
  9324. }, delay);
  9325. }
  9326. });
  9327. });
  9328. },
  9329. get(url, data) {
  9330. if (data && typeof data === 'object') {
  9331. if (url.indexOf('?') == -1) {
  9332. url += '?';
  9333. } else {
  9334. url += '&';
  9335. }
  9336. url += new URLSearchParams(data).toString();
  9337. }
  9338. return fetch$1.get(url);
  9339. },
  9340. getImage(url) {
  9341. var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
  9342. if (config$5.region == 'aws') {
  9343. if (url.indexOf('x-oss-process=image') != -1) {
  9344. var arr = url.split('?');
  9345. url = arr[0] + encodeURIComponent('?' + arr[1].replace(/\//g, '@'));
  9346. }
  9347. }
  9348. return http.retry(function () {
  9349. return new Promise(function (resolve, reject) {
  9350. var img = new Image();
  9351. img.crossOrigin = 'anonymous';
  9352. img.src = url;
  9353. img.onload = function () {
  9354. resolve(img);
  9355. };
  9356. img.onerror = function () {
  9357. reject("[".concat(url, "] load fail"));
  9358. };
  9359. });
  9360. }, retries);
  9361. },
  9362. getText(url) {
  9363. return fetch$1.get(url, {
  9364. responseType: 'text'
  9365. });
  9366. },
  9367. getBueffer(url) {
  9368. return fetch$1.get(url, {
  9369. responseType: 'arraybuffer'
  9370. });
  9371. },
  9372. getBlob(url) {
  9373. return fetch$1.get(url, {
  9374. responseType: 'blob'
  9375. });
  9376. },
  9377. post(url, data) {
  9378. return fetch$1.post(url, data);
  9379. },
  9380. postFile(url, data, json) {
  9381. var form = new FormData();
  9382. var cb = null;
  9383. if (data.onUploadProgress) {
  9384. cb = data.onUploadProgress;
  9385. delete data.onUploadProgress;
  9386. }
  9387. for (var key in data) {
  9388. if (key === 'files' && data[key].length > 0) {
  9389. for (var i = 0; i < data[key].length; i++) {
  9390. var file = data[key][i];
  9391. if (file instanceof File) {
  9392. form.append(key, file);
  9393. } else if (file.file) {
  9394. if (file.filename) {
  9395. form.append(key, file.file, file.filename);
  9396. } else {
  9397. form.append(key, file.file);
  9398. }
  9399. } else {
  9400. console.warn('file is wong !', data);
  9401. }
  9402. }
  9403. } else if (key == 'file' || key === 'filename') {
  9404. if (key == 'file') {
  9405. if (data.filename) {
  9406. form.append('file', data[key], data.filename);
  9407. } else {
  9408. form.append('file', data[key]);
  9409. }
  9410. }
  9411. } else {
  9412. form.append(key, data[key]);
  9413. }
  9414. } // if (json) {
  9415. // for (let jsonKey in json) {
  9416. // // const blob = json[jsonKey]
  9417. // // form.append(
  9418. // // jsonKey,
  9419. // // new Blob([blob], {
  9420. // // type: 'application/json',
  9421. // // })
  9422. // // )
  9423. // form.append(jsonKey, JSON.stringify(json[jsonKey]))
  9424. // }
  9425. // }
  9426. return fetch$1.post(url, form, {
  9427. headers: {
  9428. 'Content-Type': 'multipart/form-data'
  9429. },
  9430. onUploadProgress: cb
  9431. });
  9432. }
  9433. };
  9434. function setup$1(app) {
  9435. if (!app || instance) {
  9436. return;
  9437. }
  9438. config$5 = app.config;
  9439. instance = app;
  9440. fetch$1 = axios.create({
  9441. // baseURL: 'https://v4-test.4dkankan.com',
  9442. // baseURL: 'http://192.168.0.47',
  9443. baseURL: config$5.server || ''
  9444. });
  9445. fetch$1.interceptors.request.use(function (config) {
  9446. if (config.url.indexOf('/service/') != -1) {
  9447. var token = browser$1.valueFromUrl('token') || localStorage.getItem('token') || '';
  9448. if (token) {
  9449. config.headers['token'] = token;
  9450. }
  9451. }
  9452. return config;
  9453. }, function (error) {
  9454. return Promise.reject(error);
  9455. });
  9456. fetch$1.interceptors.response.use(function (response) {
  9457. // 正常的文件流
  9458. if (!/json/gi.test(response.headers['content-type'])) {
  9459. return response.data;
  9460. } // 以文件流方式请求但是返回json,需要解析为JSON对象
  9461. if (response.request.responseType === 'arraybuffer') {
  9462. var enc = new TextDecoder('utf-8');
  9463. var res = JSON.parse(enc.decode(new Uint8Array(response.data)));
  9464. return res;
  9465. }
  9466. if (instance && response.data.success === false) {
  9467. instance.Scene.emit('error', {
  9468. type: 'network',
  9469. code: response.data.code,
  9470. message: response.data.message
  9471. });
  9472. }
  9473. return response.data;
  9474. }, function (error) {
  9475. if (instance) {
  9476. var data = null;
  9477. if (error.response && error.response.data) {
  9478. data = error.response.data;
  9479. } else {
  9480. data = {
  9481. code: 500,
  9482. message: error
  9483. };
  9484. }
  9485. if (error.config && error.config.url.indexOf('data/mapping') == -1 && error.config.url.indexOf('floorplan.json') == -1 && error.config.url.indexOf('vision2.modeldata') == -1) {
  9486. instance.Scene.emit('error', {
  9487. type: 'network',
  9488. code: data.code,
  9489. message: data.message
  9490. });
  9491. }
  9492. }
  9493. if (error.response && error.response.data) {
  9494. return Promise.reject(error.response);
  9495. }
  9496. return Promise.reject(error);
  9497. });
  9498. }
  9499. var sdk_domain = getScriptURL(); //.match(/^http(s)?:\/\/(.*?)\//)[0]
  9500. var texture = {
  9501. data: {}
  9502. };
  9503. texture.load = function (imgUrl, addTextureFunc, failFnc) {
  9504. var _texture = texture.data[imgUrl];
  9505. if (_texture) {
  9506. addTextureFunc && setTimeout(function () {
  9507. addTextureFunc(_texture);
  9508. }, 1);
  9509. return _texture;
  9510. } else {
  9511. _texture = new THREE.Texture();
  9512. if (settings$3.minimalMemoryMode) {
  9513. _texture.minFilter = THREE.LinearFilter;
  9514. _texture.magFilter = THREE.LinearFilter;
  9515. _texture.generateMipmaps = !1;
  9516. }
  9517. _texture.sourceFile = imgUrl;
  9518. texture.data[imgUrl] = _texture;
  9519. http.getImage(imgUrl).then(function (img) {
  9520. _texture.image = img;
  9521. _texture.needsUpdate = !0;
  9522. addTextureFunc && addTextureFunc(_texture);
  9523. }).catch(failFnc);
  9524. return _texture;
  9525. }
  9526. };
  9527. texture.loadWithoutUpdate = /*#__PURE__*/function () {
  9528. var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(imgUrl, addTextureFunc, failFnc) {
  9529. var _texture;
  9530. return regenerator.wrap(function _callee$(_context) {
  9531. while (1) {
  9532. switch (_context.prev = _context.next) {
  9533. case 0:
  9534. _texture = texture.data[imgUrl.split('?')[0]];
  9535. if (!_texture) {
  9536. _context.next = 6;
  9537. break;
  9538. }
  9539. addTextureFunc && addTextureFunc(_texture);
  9540. return _context.abrupt("return", _texture);
  9541. case 6:
  9542. _texture = new THREE.Texture();
  9543. if (settings$3.minimalMemoryMode) {
  9544. _texture.minFilter = THREE.LinearFilter;
  9545. _texture.magFilter = THREE.LinearFilter;
  9546. _texture.generateMipmaps = !1;
  9547. }
  9548. _texture.sourceFile = imgUrl;
  9549. texture.data[imgUrl.split('?')[0]] = _texture;
  9550. _context.next = 12;
  9551. return http.getImage(imgUrl).then(function (img) {
  9552. _texture.image = img;
  9553. _texture.needsUpdate = !0;
  9554. addTextureFunc && addTextureFunc(_texture);
  9555. }).catch(failFnc);
  9556. case 12:
  9557. return _context.abrupt("return", _texture);
  9558. case 13:
  9559. case "end":
  9560. return _context.stop();
  9561. }
  9562. }
  9563. }, _callee);
  9564. }));
  9565. return function (_x, _x2, _x3) {
  9566. return _ref.apply(this, arguments);
  9567. };
  9568. }();
  9569. texture.loadBase64 = function (base64, fileType) {
  9570. fileType = fileType || 'png';
  9571. var _texture = new THREE.Texture();
  9572. _texture.image = document.createElement('img');
  9573. _texture.image.setAttribute('src', 'data:image/' + fileType + ';base64,' + base64);
  9574. if (settings$3.minimalMemoryMode) {
  9575. _texture.minFilter = THREE.LinearFilter;
  9576. _texture.magFilter = THREE.LinearFilter;
  9577. _texture.generateMipmaps = !1;
  9578. }
  9579. _texture.needsUpdate = !0;
  9580. return _texture;
  9581. };
  9582. texture.isLoaded = function (imgUrl) {
  9583. return !!texture.data[imgUrl];
  9584. };
  9585. texture.getImageURL = function (path) {
  9586. if (path && path.indexOf('http') === 0) {
  9587. return path;
  9588. }
  9589. return sdk_domain + path;
  9590. };
  9591. var warnImg = {};
  9592. texture.getWarnImg = function (name, text, maxLineWidth, dontBreakWords) {
  9593. if (!warnImg[name]) {
  9594. var label = new TextSprite({
  9595. //如果直接在canvas里写字,要另外写很多和canvas.drawText有关的,所以还是借助textSprite吧
  9596. backgroundColor: {
  9597. r: 0,
  9598. g: 0,
  9599. b: 0,
  9600. a: 1
  9601. },
  9602. textColor: {
  9603. r: 255,
  9604. g: 255,
  9605. b: 255,
  9606. a: 1
  9607. },
  9608. margin: {
  9609. x: 50,
  9610. y: 100
  9611. },
  9612. renderOrder: 50,
  9613. fontsize: 30,
  9614. text,
  9615. maxLineWidth,
  9616. borderRadius: 0,
  9617. dontBreakWords
  9618. });
  9619. warnImg[name] = label.sprite.material.map.image;
  9620. label.dispose();
  9621. }
  9622. return warnImg[name];
  9623. };
  9624. 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); }; }
  9625. 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; } }
  9626. /**
  9627. * @author WestLangley / http://github.com/WestLangley
  9628. *
  9629. * parameters = {
  9630. * color: <hex>,
  9631. * lineWidth: <float>,
  9632. * dashed: <boolean>,
  9633. * dashScale: <float>,
  9634. * dashSize: <float>,
  9635. * gapSize: <float>,
  9636. * resolution: <Vector2>, // to be set by renderer
  9637. * }
  9638. */
  9639. var line = {
  9640. lineWidth: {
  9641. value: 1,
  9642. type: 'f'
  9643. },
  9644. resolution: {
  9645. value: new THREE.Vector2(300, 300),
  9646. type: 'v2'
  9647. },
  9648. dashScale: {
  9649. value: 1,
  9650. type: 'f'
  9651. },
  9652. dashSize: {
  9653. value: 1,
  9654. type: 'f'
  9655. },
  9656. gapSize: {
  9657. value: 1,
  9658. type: 'f'
  9659. } // todo FIX - maybe change to totalSize
  9660. };
  9661. var shaderLib = {
  9662. uniforms: THREE.UniformsUtils.merge([THREE.UniformsLib.common, THREE.UniformsLib.fog, line]),
  9663. 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} ',
  9664. 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 }'
  9665. };
  9666. var lineMats = [],
  9667. resolution = new THREE.Vector2(300, 300);
  9668. var LineMaterial = /*#__PURE__*/function (_THREE$ShaderMaterial) {
  9669. _inherits(LineMaterial, _THREE$ShaderMaterial);
  9670. var _super = _createSuper$1M(LineMaterial);
  9671. function LineMaterial(parameters) {
  9672. var _this;
  9673. _classCallCheck(this, LineMaterial);
  9674. parameters.resolution || (parameters.resolution = resolution.clone());
  9675. _this = _super.call(this, {
  9676. type: 'LineMaterial',
  9677. uniforms: THREE.UniformsUtils.clone(shaderLib.uniforms),
  9678. vertexShader: shaderLib.vertexShader,
  9679. fragmentShader: shaderLib.fragmentShader
  9680. }); // 因为opacity会与ShaderMaterial.opacity冲突,所以必须放在super之后
  9681. Object.defineProperties(_assertThisInitialized(_this), {
  9682. opacity: {
  9683. enumerable: true,
  9684. get: function get() {
  9685. return this.uniforms.opacity.value;
  9686. },
  9687. set: function set(value) {
  9688. this.uniforms.opacity.value = value;
  9689. }
  9690. }
  9691. });
  9692. _this.isLineMaterial = true;
  9693. _this.dashed = false;
  9694. _this.setValues(parameters); //add:
  9695. lineMats.push(_assertThisInitialized(_this));
  9696. _this.addEventListener('dispose', function () {
  9697. var i = lineMats.indexOf(_assertThisInitialized(_this));
  9698. i > -1 && lineMats.splice(i, 1);
  9699. });
  9700. return _this;
  9701. }
  9702. _createClass(LineMaterial, [{
  9703. key: "color",
  9704. get: function get() {
  9705. return this.uniforms.diffuse.value;
  9706. },
  9707. set: function set(value) {
  9708. this.uniforms.diffuse.value = value;
  9709. }
  9710. }, {
  9711. key: "lineWidth",
  9712. get: function get() {
  9713. return this.uniforms.lineWidth.value;
  9714. },
  9715. set: function set(value) {
  9716. this.uniforms.lineWidth.value = value;
  9717. }
  9718. }, {
  9719. key: "dashScale",
  9720. get: function get() {
  9721. return this.uniforms.dashScale.value;
  9722. },
  9723. set: function set(value) {
  9724. this.uniforms.dashScale.value = value;
  9725. }
  9726. }, {
  9727. key: "dashSize",
  9728. get: function get() {
  9729. return this.uniforms.dashSize.value;
  9730. },
  9731. set: function set(value) {
  9732. this.uniforms.dashSize.value = value;
  9733. }
  9734. }, {
  9735. key: "gapSize",
  9736. get: function get() {
  9737. return this.uniforms.gapSize.value;
  9738. },
  9739. set: function set(value) {
  9740. this.uniforms.gapSize.value = value;
  9741. }
  9742. }, {
  9743. key: "resolution",
  9744. get: function get() {
  9745. return this.uniforms.resolution.value;
  9746. },
  9747. set: function set(value) {
  9748. this.uniforms.resolution.value.copy(value);
  9749. }
  9750. }, {
  9751. key: "dashed",
  9752. get: function get() {
  9753. return 'USE_DASH' in this.defines;
  9754. },
  9755. set: function set(value) {
  9756. if (value) {
  9757. this.defines.USE_DASH = '';
  9758. } else {
  9759. delete this.defines.USE_DASH;
  9760. }
  9761. this.needsUpdate = true;
  9762. }
  9763. }, {
  9764. key: "copy",
  9765. value: function copy(source) {
  9766. THREE.ShaderMaterial.prototype.copy.call(this, source);
  9767. this.color.copy(source.color);
  9768. this.lineWidth = source.lineWidth;
  9769. this.resolution = source.resolution; // todo
  9770. return this;
  9771. }
  9772. }], [{
  9773. key: "init",
  9774. value: function init(app) {
  9775. app.core.get('SceneRenderer').addComponent(this);
  9776. }
  9777. }, {
  9778. key: "setSize",
  9779. value: function setSize(x, y) {
  9780. resolution.set(x, y); //暂时只用在这一个viewport里渲染
  9781. lineMats.forEach(function (e) {
  9782. e.resolution = new THREE.Vector2(x, y);
  9783. });
  9784. }
  9785. }]);
  9786. return LineMaterial;
  9787. }(THREE.ShaderMaterial); // LineMaterial.prototype = Object.create(THREE.ShaderMaterial.prototype)
  9788. // LineMaterial.prototype.constructor = THREE.LineMaterial
  9789. // LineMaterial.prototype.isLineMaterial = true
  9790. /**
  9791. * @author WestLangley / http://github.com/WestLangley
  9792. *
  9793. */
  9794. var LineSegmentsGeometry = /*#__PURE__*/function (_THREE$InstancedBuffe) {
  9795. _inherits(LineSegmentsGeometry, _THREE$InstancedBuffe);
  9796. var _super2 = _createSuper$1M(LineSegmentsGeometry);
  9797. function LineSegmentsGeometry() {
  9798. var _this2;
  9799. _classCallCheck(this, LineSegmentsGeometry);
  9800. _this2 = _super2.call(this);
  9801. _this2.computeBoundingBox = function () {
  9802. var box = new THREE.Box3();
  9803. return function () {
  9804. if (_this2.boundingBox === null) {
  9805. _this2.boundingBox = new THREE.Box3();
  9806. }
  9807. var start = _this2.attributes.instanceStart;
  9808. var end = _this2.attributes.instanceEnd;
  9809. if (start !== undefined && end !== undefined) {
  9810. _this2.boundingBox.setFromBufferAttribute(start);
  9811. box.setFromBufferAttribute(end);
  9812. _this2.boundingBox.union(box);
  9813. }
  9814. };
  9815. }();
  9816. _this2.computeBoundingSphere = function () {
  9817. var vector = new THREE.Vector3();
  9818. return function () {
  9819. if (_this2.boundingSphere === null) {
  9820. _this2.boundingSphere = new THREE.Sphere();
  9821. }
  9822. if (_this2.boundingBox === null) {
  9823. _this2.computeBoundingBox();
  9824. }
  9825. var start = _this2.attributes.instanceStart;
  9826. var end = _this2.attributes.instanceEnd;
  9827. if (start !== undefined && end !== undefined) {
  9828. var center = _this2.boundingSphere.center;
  9829. _this2.boundingBox.getCenter(center);
  9830. var maxRadiusSq = 0;
  9831. for (var i = 0, il = start.count; i < il; i++) {
  9832. vector.fromBufferAttribute(start, i);
  9833. maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector));
  9834. vector.fromBufferAttribute(end, i);
  9835. maxRadiusSq = Math.max(maxRadiusSq, center.distanceToSquared(vector));
  9836. }
  9837. _this2.boundingSphere.radius = Math.sqrt(maxRadiusSq);
  9838. if (isNaN(_this2.boundingSphere.radius)) {
  9839. console.error('LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', _assertThisInitialized(_this2));
  9840. }
  9841. }
  9842. };
  9843. }();
  9844. _this2.type = 'LineSegmentsGeometry';
  9845. new THREE.BufferGeometry();
  9846. 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];
  9847. var uvs = [-1, 2, 1, 2, -1, 1, 1, 1, -1, -1, 1, -1, -1, -2, 1, -2];
  9848. 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);
  9849. _this2.setIndex(index);
  9850. _this2.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
  9851. _this2.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));
  9852. _this2.isLineSegmentsGeometry = true;
  9853. return _this2;
  9854. }
  9855. _createClass(LineSegmentsGeometry, [{
  9856. key: "applyMatrix",
  9857. value: function applyMatrix(matrix) {
  9858. var start = this.attributes.instanceStart;
  9859. var end = this.attributes.instanceEnd;
  9860. if (start !== undefined) {
  9861. matrix.applyToBufferAttribute(start);
  9862. matrix.applyToBufferAttribute(end);
  9863. start.data.needsUpdate = true;
  9864. }
  9865. if (this.boundingBox !== null) {
  9866. this.computeBoundingBox();
  9867. }
  9868. if (this.boundingSphere !== null) {
  9869. this.computeBoundingSphere();
  9870. }
  9871. return this;
  9872. }
  9873. }, {
  9874. key: "setPositions",
  9875. value: function setPositions(array) {
  9876. var lineSegments;
  9877. if (array instanceof Float32Array) {
  9878. lineSegments = array;
  9879. } else if (Array.isArray(array)) {
  9880. lineSegments = new Float32Array(array);
  9881. }
  9882. var instanceBuffer = new THREE.InstancedInterleavedBuffer(lineSegments, 6, 1); // xyz, xyz
  9883. this.setAttribute('instanceStart', new THREE.InterleavedBufferAttribute(instanceBuffer, 3, 0)); // xyz
  9884. this.setAttribute('instanceEnd', new THREE.InterleavedBufferAttribute(instanceBuffer, 3, 3)); // xyz
  9885. //
  9886. this.computeBoundingBox();
  9887. this.computeBoundingSphere();
  9888. return this;
  9889. }
  9890. }, {
  9891. key: "setColors",
  9892. value: function setColors(array) {
  9893. var colors;
  9894. if (array instanceof Float32Array) {
  9895. colors = array;
  9896. } else if (Array.isArray(array)) {
  9897. colors = new Float32Array(array);
  9898. }
  9899. var instanceColorBuffer = new THREE.InstancedInterleavedBuffer(colors, 6, 1); // rgb, rgb
  9900. this.setAttribute('instanceColorStart', new THREE.InterleavedBufferAttribute(instanceColorBuffer, 3, 0)); // rgb
  9901. this.setAttribute('instanceColorEnd', new THREE.InterleavedBufferAttribute(instanceColorBuffer, 3, 3)); // rgb
  9902. return this;
  9903. }
  9904. }, {
  9905. key: "fromWireframeGeometry",
  9906. value: function fromWireframeGeometry(geometry) {
  9907. this.setPositions(geometry.attributes.position.array);
  9908. return this;
  9909. }
  9910. }, {
  9911. key: "fromEdgesGeometry",
  9912. value: function fromEdgesGeometry(geometry) {
  9913. this.setPositions(geometry.attributes.position.array);
  9914. return this;
  9915. }
  9916. }, {
  9917. key: "fromMesh",
  9918. value: function fromMesh(mesh) {
  9919. this.fromWireframeGeometry(new THREE.WireframeGeometry(mesh.geometry)); // set colors, maybe
  9920. return this;
  9921. }
  9922. }, {
  9923. key: "fromLineSegements",
  9924. value: function fromLineSegements(lineSegments) {
  9925. var geometry = lineSegments.geometry;
  9926. if (geometry.isGeometry) {
  9927. this.setPositions(geometry.vertices);
  9928. } else if (geometry.isBufferGeometry) {
  9929. this.setPositions(geometry.position.array); // assumes non-indexed
  9930. } // set colors, maybe
  9931. return this;
  9932. }
  9933. }, {
  9934. key: "toJSON",
  9935. value: function toJSON() {// todo
  9936. }
  9937. }, {
  9938. key: "clone",
  9939. value: function clone() {// todo
  9940. }
  9941. }, {
  9942. key: "copy",
  9943. value: function copy(source) {
  9944. // todo
  9945. return this;
  9946. }
  9947. }]);
  9948. return LineSegmentsGeometry;
  9949. }(THREE.InstancedBufferGeometry);
  9950. /**
  9951. * @author WestLangley / http://github.com/WestLangley
  9952. *
  9953. */
  9954. var LineGeometry = /*#__PURE__*/function (_LineSegmentsGeometry) {
  9955. _inherits(LineGeometry, _LineSegmentsGeometry);
  9956. var _super3 = _createSuper$1M(LineGeometry);
  9957. function LineGeometry() {
  9958. var _this3;
  9959. _classCallCheck(this, LineGeometry);
  9960. _this3 = _super3.call(this);
  9961. _this3.type = 'LineGeometry';
  9962. _this3.isLineGeometry = true;
  9963. return _this3;
  9964. }
  9965. _createClass(LineGeometry, [{
  9966. key: "setPositions",
  9967. value: function setPositions(arr) {
  9968. // converts [ x1, y1, z1, x2, y2, z2, ... ] to pairs format
  9969. var length = arr.length - 3;
  9970. var points = new Float32Array(2 * length);
  9971. for (var i = 0; i < length; i += 3) {
  9972. points[2 * i] = arr[i];
  9973. points[2 * i + 1] = arr[i + 1];
  9974. points[2 * i + 2] = arr[i + 2];
  9975. points[2 * i + 3] = arr[i + 3];
  9976. points[2 * i + 4] = arr[i + 4];
  9977. points[2 * i + 5] = arr[i + 5];
  9978. }
  9979. _get(_getPrototypeOf(LineGeometry.prototype), "setPositions", this).call(this, points);
  9980. return this;
  9981. }
  9982. }, {
  9983. key: "setColors",
  9984. value: function setColors(array) {
  9985. // converts [ r1, g1, b1, r2, g2, b2, ... ] to pairs format
  9986. var length = array.length - 3;
  9987. var colors = new Float32Array(2 * length);
  9988. for (var i = 0; i < length; i += 3) {
  9989. colors[2 * i] = array[i];
  9990. colors[2 * i + 1] = array[i + 1];
  9991. colors[2 * i + 2] = array[i + 2];
  9992. colors[2 * i + 3] = array[i + 3];
  9993. colors[2 * i + 4] = array[i + 4];
  9994. colors[2 * i + 5] = array[i + 5];
  9995. }
  9996. _get(_getPrototypeOf(LineGeometry.prototype), "setColors", this).call(this, colors);
  9997. return this;
  9998. }
  9999. }, {
  10000. key: "fromLine",
  10001. value: function fromLine(line) {
  10002. var geometry = line.geometry;
  10003. if (geometry.isGeometry) {
  10004. this.setPositions(geometry.vertices);
  10005. } else if (geometry.isBufferGeometry) {
  10006. this.setPositions(geometry.position.array); // assumes non-indexed
  10007. } // set colors, maybe
  10008. return this;
  10009. }
  10010. }, {
  10011. key: "copy",
  10012. value: function copy(source) {
  10013. // todo
  10014. return this;
  10015. }
  10016. }]);
  10017. return LineGeometry;
  10018. }(LineSegmentsGeometry);
  10019. /**
  10020. * @author WestLangley / http://github.com/WestLangley
  10021. *
  10022. */
  10023. new THREE.Vector3();
  10024. new THREE.Vector3();
  10025. var _start4 = new THREE.Vector4();
  10026. var _end4 = new THREE.Vector4();
  10027. var _ssOrigin = new THREE.Vector4();
  10028. var _ssOrigin3 = new THREE.Vector3();
  10029. var _mvMatrix = new THREE.Matrix4();
  10030. var _line = new THREE.Line3();
  10031. var _closestPoint = new THREE.Vector3();
  10032. var _box = new THREE.Box3();
  10033. var _sphere = new THREE.Sphere();
  10034. var _clipToWorldVector = new THREE.Vector4();
  10035. var _ray, _lineWidth; // Returns the margin required to expand by in world space given the distance from the camera,
  10036. // line width, resolution, and camera projection
  10037. function getWorldSpaceHalfWidth(camera, distance, resolution) {
  10038. // transform into clip space, adjust the x and y values by the pixel width offset, then
  10039. // transform back into world space to get world offset. Note clip space is [-1, 1] so full
  10040. // width does not need to be halved.
  10041. _clipToWorldVector.set(0, 0, -distance, 1.0).applyMatrix4(camera.projectionMatrix);
  10042. _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w);
  10043. _clipToWorldVector.x = _lineWidth / resolution.width;
  10044. _clipToWorldVector.y = _lineWidth / resolution.height;
  10045. _clipToWorldVector.applyMatrix4(camera.projectionMatrixInverse);
  10046. _clipToWorldVector.multiplyScalar(1.0 / _clipToWorldVector.w);
  10047. return Math.abs(Math.max(_clipToWorldVector.x, _clipToWorldVector.y));
  10048. }
  10049. function raycastScreenSpace(lineSegments, camera, intersects) {
  10050. var projectionMatrix = camera.projectionMatrix;
  10051. var material = lineSegments.material;
  10052. var resolution = material.resolution;
  10053. var matrixWorld = lineSegments.matrixWorld;
  10054. var geometry = lineSegments.geometry;
  10055. var instanceStart = geometry.attributes.instanceStart;
  10056. var instanceEnd = geometry.attributes.instanceEnd;
  10057. var near = -camera.near; //
  10058. // pick a point 1 unit out along the ray to avoid the ray origin
  10059. // sitting at the camera origin which will cause "w" to be 0 when
  10060. // applying the projection matrix.
  10061. _ray.at(1, _ssOrigin); // ndc space [ - 1.0, 1.0 ]
  10062. _ssOrigin.w = 1;
  10063. _ssOrigin.applyMatrix4(camera.matrixWorldInverse);
  10064. _ssOrigin.applyMatrix4(projectionMatrix);
  10065. _ssOrigin.multiplyScalar(1 / _ssOrigin.w); // screen space
  10066. _ssOrigin.x *= resolution.x / 2;
  10067. _ssOrigin.y *= resolution.y / 2;
  10068. _ssOrigin.z = 0;
  10069. _ssOrigin3.copy(_ssOrigin);
  10070. _mvMatrix.multiplyMatrices(camera.matrixWorldInverse, matrixWorld);
  10071. for (var i = 0, l = instanceStart.count; i < l; i++) {
  10072. _start4.fromBufferAttribute(instanceStart, i);
  10073. _end4.fromBufferAttribute(instanceEnd, i);
  10074. _start4.w = 1;
  10075. _end4.w = 1; // camera space
  10076. _start4.applyMatrix4(_mvMatrix);
  10077. _end4.applyMatrix4(_mvMatrix); // skip the segment if it's entirely behind the camera
  10078. var isBehindCameraNear = _start4.z > near && _end4.z > near;
  10079. if (isBehindCameraNear) {
  10080. continue;
  10081. } // trim the segment if it extends behind camera near
  10082. if (_start4.z > near) {
  10083. var deltaDist = _start4.z - _end4.z;
  10084. var t = (_start4.z - near) / deltaDist;
  10085. _start4.lerp(_end4, t);
  10086. } else if (_end4.z > near) {
  10087. var _deltaDist = _end4.z - _start4.z;
  10088. var _t = (_end4.z - near) / _deltaDist;
  10089. _end4.lerp(_start4, _t);
  10090. } // clip space
  10091. _start4.applyMatrix4(projectionMatrix);
  10092. _end4.applyMatrix4(projectionMatrix); // ndc space [ - 1.0, 1.0 ]
  10093. _start4.multiplyScalar(1 / _start4.w);
  10094. _end4.multiplyScalar(1 / _end4.w); // screen space
  10095. _start4.x *= resolution.x / 2;
  10096. _start4.y *= resolution.y / 2;
  10097. _end4.x *= resolution.x / 2;
  10098. _end4.y *= resolution.y / 2; // create 2d segment
  10099. _line.start.copy(_start4);
  10100. _line.start.z = 0;
  10101. _line.end.copy(_end4);
  10102. _line.end.z = 0; // get closest point on ray to segment
  10103. var param = _line.closestPointToPointParameter(_ssOrigin3, true);
  10104. _line.at(param, _closestPoint); // check if the intersection point is within clip space
  10105. var zPos = THREE.MathUtils.lerp(_start4.z, _end4.z, param);
  10106. var isInClipSpace = zPos >= -1 && zPos <= 1;
  10107. var isInside = _ssOrigin3.distanceTo(_closestPoint) < _lineWidth * 0.5;
  10108. if (isInClipSpace && isInside) {
  10109. _line.start.fromBufferAttribute(instanceStart, i);
  10110. _line.end.fromBufferAttribute(instanceEnd, i);
  10111. _line.start.applyMatrix4(matrixWorld);
  10112. _line.end.applyMatrix4(matrixWorld);
  10113. var pointOnLine = new THREE.Vector3();
  10114. var point = new THREE.Vector3();
  10115. _ray.distanceSqToSegment(_line.start, _line.end, point, pointOnLine);
  10116. intersects.push({
  10117. point: point,
  10118. pointOnLine: pointOnLine,
  10119. distance: _ray.origin.distanceTo(point),
  10120. object: lineSegments,
  10121. face: null,
  10122. faceIndex: i,
  10123. uv: null,
  10124. uv2: null
  10125. });
  10126. }
  10127. }
  10128. }
  10129. var LineSegments2 = /*#__PURE__*/function (_THREE$Mesh) {
  10130. _inherits(LineSegments2, _THREE$Mesh);
  10131. var _super4 = _createSuper$1M(LineSegments2);
  10132. function LineSegments2(_geometry, material) {
  10133. var _this4;
  10134. _classCallCheck(this, LineSegments2);
  10135. _this4 = _super4.call(this, _geometry, material);
  10136. _this4.computeLineDistances = function () {
  10137. // for backwards-compatability, but could be a method of LineSegmentsGeometry...
  10138. var start = new THREE.Vector3();
  10139. var end = new THREE.Vector3();
  10140. return function () {
  10141. var geometry = _this4.geometry;
  10142. var instanceStart = geometry.attributes.instanceStart;
  10143. var instanceEnd = geometry.attributes.instanceEnd;
  10144. var lineDistances = new Float32Array(2 * instanceStart.data.count);
  10145. for (var i = 0, j = 0, l = instanceStart.data.count; i < l; i++, j += 2) {
  10146. start.fromBufferAttribute(instanceStart, i);
  10147. end.fromBufferAttribute(instanceEnd, i);
  10148. lineDistances[j] = j === 0 ? 0 : lineDistances[j - 1];
  10149. lineDistances[j + 1] = lineDistances[j] + start.distanceTo(end);
  10150. }
  10151. var instanceDistanceBuffer = new THREE.InstancedInterleavedBuffer(lineDistances, 2, 1); // d0, d1
  10152. geometry.setAttribute('instanceDistanceStart', new THREE.InterleavedBufferAttribute(instanceDistanceBuffer, 1, 0)); // d0
  10153. geometry.setAttribute('instanceDistanceEnd', new THREE.InterleavedBufferAttribute(instanceDistanceBuffer, 1, 1)); // d1
  10154. return _assertThisInitialized(_this4);
  10155. };
  10156. }();
  10157. _this4.type = 'LineSegments2';
  10158. _this4.isLineSegments2 = true;
  10159. _this4.geometry = _geometry !== undefined ? _geometry : new LineSegmentsGeometry();
  10160. _this4.material = material !== undefined ? material : new LineMaterial({
  10161. color: Math.random() * 0xffffff
  10162. });
  10163. return _this4;
  10164. }
  10165. _createClass(LineSegments2, [{
  10166. key: "raycast",
  10167. value: function raycast(raycaster, intersects) {
  10168. var worldUnits = this.material.worldUnits;
  10169. var camera = raycaster.camera;
  10170. if (camera === null && !worldUnits) {
  10171. console.error('LineSegments2: "Raycaster.camera" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.');
  10172. }
  10173. var threshold = raycaster.params.Line2 !== undefined ? raycaster.params.Line2.threshold || 0 : 0;
  10174. _ray = raycaster.ray;
  10175. var matrixWorld = this.matrixWorld;
  10176. var geometry = this.geometry;
  10177. var material = this.material;
  10178. _lineWidth = material.lineWidth + threshold;
  10179. geometry.attributes.instanceStart;
  10180. geometry.attributes.instanceEnd; // check if we intersect the sphere bounds
  10181. if (geometry.boundingSphere === null) {
  10182. geometry.computeBoundingSphere();
  10183. }
  10184. _sphere.copy(geometry.boundingSphere).applyMatrix4(matrixWorld); // increase the sphere bounds by the worst case line screen space width
  10185. var sphereMargin;
  10186. if (worldUnits) {
  10187. sphereMargin = _lineWidth * 0.5;
  10188. } else {
  10189. var distanceToSphere = Math.max(camera.near, _sphere.distanceToPoint(_ray.origin));
  10190. sphereMargin = getWorldSpaceHalfWidth(camera, distanceToSphere, material.resolution);
  10191. }
  10192. _sphere.radius += sphereMargin;
  10193. if (_ray.intersectsSphere(_sphere) === false) {
  10194. return;
  10195. } // check if we intersect the box bounds
  10196. if (geometry.boundingBox === null) {
  10197. geometry.computeBoundingBox();
  10198. }
  10199. _box.copy(geometry.boundingBox).applyMatrix4(matrixWorld); // increase the box bounds by the worst case line width
  10200. var boxMargin;
  10201. if (worldUnits) {
  10202. boxMargin = _lineWidth * 0.5;
  10203. } else {
  10204. var distanceToBox = Math.max(camera.near, _box.distanceToPoint(_ray.origin));
  10205. boxMargin = getWorldSpaceHalfWidth(camera, distanceToBox, material.resolution);
  10206. }
  10207. _box.expandByScalar(boxMargin);
  10208. if (_ray.intersectsBox(_box) === false) {
  10209. return;
  10210. }
  10211. if (worldUnits) {
  10212. raycastWorldUnits(this, intersects);
  10213. } else {
  10214. raycastScreenSpace(this, camera, intersects);
  10215. }
  10216. }
  10217. }, {
  10218. key: "copy",
  10219. value: function copy(source) {
  10220. // todo
  10221. return this;
  10222. }
  10223. }]);
  10224. return LineSegments2;
  10225. }(THREE.Mesh);
  10226. var Fatline = /*#__PURE__*/function (_LineSegments) {
  10227. _inherits(Fatline, _LineSegments);
  10228. var _super5 = _createSuper$1M(Fatline);
  10229. function Fatline(geometry, material) {
  10230. var _this5;
  10231. _classCallCheck(this, Fatline);
  10232. _this5 = _super5.call(this, geometry, material);
  10233. _this5.type = 'Fatline';
  10234. _this5.isFatline = true;
  10235. _this5.geometry = geometry !== undefined ? geometry : new LineGeometry();
  10236. _this5.material = material !== undefined ? material : new LineMaterial({
  10237. color: Math.random() * 0xffffff
  10238. });
  10239. return _this5;
  10240. }
  10241. _createClass(Fatline, [{
  10242. key: "copy",
  10243. value: function copy(source) {
  10244. // todo
  10245. return this;
  10246. }
  10247. }]);
  10248. return Fatline;
  10249. }(LineSegments2);
  10250. var defaultColor$1 = Colors.lightGreen;
  10251. var player$o = null;
  10252. var LineDraw = {
  10253. /*
  10254. 多段普通线 (第二个点和第三个点之间是没有线段的, 所以不用在意线段顺序)
  10255. */
  10256. createLine: function createLine(posArr) {
  10257. var o = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  10258. var mat;
  10259. if (o.mat) {
  10260. mat = o.mat;
  10261. } else {
  10262. var _o$transparent, _o$depthTest, _o$depthWrite;
  10263. var prop = {
  10264. color: o.color || defaultColor$1,
  10265. /* transparent: o.dontAlwaysSeen ? false : true,
  10266. depthTest: o.dontAlwaysSeen ? true : false, */
  10267. transparent: (_o$transparent = o.transparent) !== null && _o$transparent !== void 0 ? _o$transparent : false,
  10268. depthTest: (_o$depthTest = o.depthTest) !== null && _o$depthTest !== void 0 ? _o$depthTest : true,
  10269. depthWrite: (_o$depthWrite = o.depthWrite) !== null && _o$depthWrite !== void 0 ? _o$depthWrite : true
  10270. };
  10271. if (o.deshed) {
  10272. prop.lineWidth = o.lineWidth || 1; //windows无效。 似乎mac/ios上粗细有效 ?
  10273. prop.dashSize = o.dashSize || 0.1;
  10274. prop.gapSize = o.gapSize || 0.1;
  10275. }
  10276. mat = new THREE[o.deshed ? 'LineDashedMaterial' : 'LineBasicMaterial'](prop);
  10277. }
  10278. var line = new THREE.LineSegments(new THREE.BufferGeometry(), mat);
  10279. line.renderOrder = o.renderOrder || 4;
  10280. this.moveLine(line, posArr);
  10281. return line;
  10282. },
  10283. moveLine: function moveLine(line, posArr) {
  10284. var position = [];
  10285. posArr.forEach(function (e) {
  10286. return position.push(e.x, e.y, e.z);
  10287. });
  10288. line.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(position), 3));
  10289. line.geometry.attributes.position.needsUpdate = true;
  10290. line.geometry.computeBoundingSphere();
  10291. if (line.material instanceof THREE.LineDashedMaterial) {
  10292. line.computeLineDistances();
  10293. }
  10294. },
  10295. createFatLineMat: function createFatLineMat(o) {
  10296. var matParam = Object.assign({}, {
  10297. //默认
  10298. lineWidth: 5,
  10299. color: 0xffffff,
  10300. transparent: true,
  10301. depthWrite: false,
  10302. depthTest: false,
  10303. dashSize: 0.1,
  10304. gapSize: 0.1
  10305. }, o, {//修正覆盖:
  10306. // dashed
  10307. /* polygonOffset: true, //是否开启多边形偏移 for not cover the lineMesh
  10308. polygonOffsetFactor: -o.width * 2.5 || -5, //多边形偏移因子
  10309. polygonOffsetUnits: -4.0, //多边形偏移单位 */
  10310. });
  10311. var mat = new LineMaterial(matParam);
  10312. return mat;
  10313. },
  10314. /*
  10315. 创建可以改变粗细的线。
  10316. */
  10317. createFatLine: function createFatLine(posArr, o) {
  10318. var geometry = new LineGeometry();
  10319. geometry.setColors(o.color || [1, 1, 1]);
  10320. var matLine = o.material || this.createFatLineMat(o);
  10321. var line = new Fatline(geometry, matLine); //line.computeLineDistances();
  10322. line.scale.set(1, 1, 1);
  10323. line.renderOrder = 2;
  10324. this.moveFatLine(line, posArr);
  10325. return line;
  10326. },
  10327. /* createFatLine: function (posArr, o) {
  10328. var geometry = new THREE.BufferGeometry()
  10329. geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(posArr), 3))
  10330. geometry.setAttribute('color', new THREE.BufferAttribute(new Float32Array(o.color || [1, 1, 1]), 3))
  10331. var matLine = o.material || this.createFatLineMat(o)
  10332. var line = new THREE.Line(geometry, matLine)
  10333. line.computeLineDistances()
  10334. line.scale.set(1, 1, 1)
  10335. line.renderOrder = 2
  10336. return line
  10337. }, */
  10338. moveFatLine: function moveFatLine(line, posArr) {
  10339. var geometry = line.geometry;
  10340. var positions = [];
  10341. posArr.forEach(function (e) {
  10342. return positions.push(e.x, e.y, e.z);
  10343. });
  10344. if (positions.length > 0) {
  10345. if (!geometry) {
  10346. geometry = line.geometry = new LineGeometry();
  10347. }
  10348. if (geometry.attributes.instanceEnd && geometry.attributes.instanceEnd.data.array.length != positions.length) {
  10349. //positions个数改变会有部分显示不出来,所以重建
  10350. geometry.dispose();
  10351. geometry = new LineGeometry();
  10352. line.geometry = geometry;
  10353. }
  10354. geometry.setPositions(positions);
  10355. if (line.material.dashed) {
  10356. line.computeLineDistances();
  10357. }
  10358. line.geometry.computeBoundingSphere();
  10359. } else {
  10360. geometry.dispose();
  10361. line.geometry = new LineGeometry();
  10362. }
  10363. },
  10364. updateLine: function updateLine(line, posArr) {
  10365. if (line.material instanceof LineMaterial) {
  10366. LineDraw.moveFatLine(line, posArr);
  10367. } else {
  10368. LineDraw.moveLine(line, posArr);
  10369. }
  10370. },
  10371. /*
  10372. 为line创建用于检测鼠标的透明mesh,实际是个1-2段圆台。
  10373. 由于近大远小的原因,假设没有透视畸变、创建的是等粗的圆柱的话, 所看到的线上每个位置的粗细应该和距离成反比。所以将圆柱改为根据距离线性渐变其截面半径的圆台,在最近点(相机到线的垂足)最细。如果最近点在线段上,则分成两段圆台,否则一段。
  10374. */
  10375. createBoldLine: function createBoldLine(points, o, p) {
  10376. player$o = p;
  10377. o = o || {};
  10378. var cylinder = o && o.cylinder;
  10379. var CD = points[1].clone().sub(points[0]);
  10380. var rotate = function rotate() {
  10381. //根据端点旋转好模型
  10382. cylinder.lastVector = CD; //记录本次的端点向量
  10383. var AB = new THREE.Vector3(0, -1, 0);
  10384. var axisVec = AB.clone().cross(CD).normalize(); //得到垂直于它们的向量,也就是旋转轴
  10385. var rotationAngle = AB.angleTo(CD);
  10386. cylinder.quaternion.setFromAxisAngle(axisVec, rotationAngle);
  10387. };
  10388. if (o && o.type == 'init') {
  10389. cylinder = new THREE.Mesh();
  10390. cylinder.material = o.mat;
  10391. if (CD.length() == 0) return cylinder;
  10392. rotate();
  10393. }
  10394. if (CD.length() == 0) return cylinder;
  10395. if (o.type != 'update') {
  10396. var CDcenter = points[0].clone().add(points[1]).multiplyScalar(0.5);
  10397. cylinder.position.copy(CDcenter);
  10398. if (!cylinder.lastVector || o.type == 'moveAndRotate') rotate();else if (cylinder.lastVector && CD.angleTo(cylinder.lastVector) > 0) rotate(); //线方向改了or线反向了 重新旋转一下模型
  10399. // if (config.isEdit && !objects.mainDesign.editing) return cylinder //节省初始加载时间?
  10400. } //为了保证线段任何地方的可检测点击范围看起来一样大,更新圆台的结构(但是在镜头边缘会比中心看起来大)
  10401. var height = points[0].distanceTo(points[1]);
  10402. var standPos = o && o.standPos || player$o.position;
  10403. var k = config$6.isMobile ? 20 : 40;
  10404. var dis1 = points[0].distanceTo(standPos);
  10405. var dis2 = points[1].distanceTo(standPos);
  10406. var foot = math$2.getFootPoint(standPos, points[0], points[1]); //垂足
  10407. if (o.constantBold || player$o.mode != 'panorama') {
  10408. var width = 0.1; //0.08;
  10409. var pts = [new THREE.Vector2(width, height / 2), new THREE.Vector2(width, -height / 2)];
  10410. } else if (foot.clone().sub(points[0]).dot(foot.clone().sub(points[1])) > 0) {
  10411. //foot不在线段上
  10412. var pts = [new THREE.Vector2(dis1 / k, height / 2), new THREE.Vector2(dis2 / k, -height / 2)];
  10413. } else {
  10414. //在线段上的话,要在垂足这加一个节点,因它距离站位最近,而两端较远
  10415. var dis3 = foot.distanceTo(standPos);
  10416. var len = foot.distanceTo(points[0]);
  10417. var pts = [new THREE.Vector2(dis1 / k, height / 2), new THREE.Vector2(dis3 / k, height / 2 - len), new THREE.Vector2(dis2 / k, -height / 2)];
  10418. }
  10419. cylinder.geometry && cylinder.geometry.dispose(); //若不删除会占用内存
  10420. cylinder.geometry = new THREE.LatheBufferGeometry(pts, 4
  10421. /* Math.min(dis1,dis2)<10?4:3 */
  10422. );
  10423. cylinder.renderOrder = 2;
  10424. return cylinder;
  10425. },
  10426. updateBoldLine: function updateBoldLine(cylinder, points, type, standPos, constantBold) {
  10427. this.createBoldLine(points, {
  10428. type: type,
  10429. cylinder: cylinder,
  10430. standPos: standPos,
  10431. constantBold
  10432. }, player$o); //type:move:平移 会改长短 , type:update根据距离和角度更新 不改长短
  10433. },
  10434. Fatline,
  10435. fatLineGeometry: LineGeometry
  10436. };
  10437. 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); }; }
  10438. 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; } }
  10439. var markerGeometry = new THREE.PlaneBufferGeometry(0.4, 0.4, 1, 1);
  10440. var stemLineLen = 0.5;
  10441. var config$4, player$n;
  10442. var videoPanoTags = [];
  10443. var getStemMat = function () {
  10444. var stemMat;
  10445. return function () {
  10446. return stemMat || (stemMat = new VideoLineMaterial(), stemMat);
  10447. };
  10448. }();
  10449. var getVideoSpotMat = function () {
  10450. var spotMat;
  10451. return function () {
  10452. return spotMat || (spotMat = new VideoPlayerMaterial(), spotMat);
  10453. };
  10454. }();
  10455. var getVideoMarkerMat = function () {
  10456. var mat;
  10457. return function () {
  10458. return mat || (mat = new VideoPanoMarkerMaterial(), mat);
  10459. };
  10460. }();
  10461. var getMarkerTex = function () {
  10462. var markerTex;
  10463. return function (name) {
  10464. if (!markerTex) {
  10465. markerTex = common$1.loadTextureFromCache(texture.getImageURL(config$4.scene.markerURL || 'images/marker.png'));
  10466. markerTex.minFilter = THREE.LinearMipMapLinearFilter;
  10467. markerTex.generateMipmaps = true;
  10468. markerTex.anisotropy = 4; // 各向异性过滤 .防止倾斜模糊
  10469. }
  10470. return markerTex;
  10471. };
  10472. }();
  10473. /* var getVideTex = (function () {
  10474. let markerTex
  10475. return function (name) {
  10476. if (!markerTex) {
  10477. markerTex = common.loadTextureFromCache(texture.getImageURL(config.scene.markerURL || 'images/marker.png'))
  10478. markerTex.minFilter = THREE.LinearMipMapLinearFilter
  10479. markerTex.generateMipmaps = true
  10480. markerTex.anisotropy = 4 // 各向异性过滤 .防止倾斜模糊
  10481. }
  10482. return markerTex
  10483. })()
  10484. */
  10485. var initOpacityProp = function initOpacityProp(material, marker) {
  10486. var opa = material.opacity;
  10487. Object.defineProperty(material, 'opacity', {
  10488. get: function get() {
  10489. return opa;
  10490. },
  10491. set: function set(o) {
  10492. if (material instanceof VideoPanoMarkerMaterial) {
  10493. marker = material.marker; //仅有一个,切换到不同pano上
  10494. }
  10495. opa = o; //if(o>0)console.log('o>0',this.pano.id)
  10496. common$1.updateVisible(marker, 'hideWhenZeroOpa', o != 0);
  10497. }
  10498. });
  10499. };
  10500. var Marker = /*#__PURE__*/function (_THREE$Mesh) {
  10501. _inherits(Marker, _THREE$Mesh);
  10502. var _super = _createSuper$1L(Marker);
  10503. function Marker(pano) {
  10504. var _this;
  10505. _classCallCheck(this, Marker);
  10506. _this = _super.call(this);
  10507. player$n = pano.$app.core.get('Player');
  10508. _this.pano = pano;
  10509. _this.config = config$4 = pano.$app.config;
  10510. _this.geometry = markerGeometry;
  10511. _this.widget = null;
  10512. _this.material = new THREE.MeshBasicMaterial({
  10513. map: getMarkerTex('normalMarker'),
  10514. side: THREE.DoubleSide,
  10515. opacity: 0,
  10516. //许钟文 change
  10517. transparent: !0,
  10518. depthWrite: !1,
  10519. depthTest: false
  10520. });
  10521. _this.visible = false; //add 加速加载
  10522. _this.renderOrder = RenderOrder.panoMarker;
  10523. _this.name = 'marker';
  10524. _this.layers.set(RenderLayers.PANOMARKERS);
  10525. _this.updateMatrixWorld();
  10526. _this.initAnimate();
  10527. settings$3.colorMarkerOnLoad && _this.on('load', function () {
  10528. this.marker.material.color.set(65280);
  10529. }); //xzw
  10530. {
  10531. initOpacityProp(_this.material, _assertThisInitialized(_this));
  10532. var vis = _this.visible;
  10533. Object.defineProperty(_assertThisInitialized(_this), 'visible', {
  10534. get: function get() {
  10535. return vis;
  10536. },
  10537. set: function set(v) {
  10538. if (pano.flagSpot) {
  10539. v ? pano.flagSpot.show() : pano.flagSpot.hide(); //console.log('marker Visi', pano.id, v)
  10540. }
  10541. vis = v;
  10542. }
  10543. });
  10544. }
  10545. return _this;
  10546. }
  10547. _createClass(Marker, [{
  10548. key: "updateStyle",
  10549. value: function updateStyle(model, type) {
  10550. //console.log('updateStyle', this.pano.id, type)
  10551. var oldOpacity = this.material.opacity;
  10552. if (type == 'animate') {
  10553. var videoMarkerMat = getVideoMarkerMat();
  10554. videoMarkerMat.marker = this;
  10555. if (this.material != videoMarkerMat) {
  10556. this.normalMaterial = this.material;
  10557. this.material = videoMarkerMat;
  10558. }
  10559. } else {
  10560. this.normalMaterial && (this.material = this.normalMaterial);
  10561. if (type == 'video') {
  10562. this.setWidget(model, this.pano, type);
  10563. } else {
  10564. this.pano.oldFlagSpot = this.pano.flagSpot;
  10565. this.pano.flagSpot = null;
  10566. this.pano.oldFlagSpot && this.pano.oldFlagSpot.hide();
  10567. }
  10568. }
  10569. this.material.opacity = oldOpacity;
  10570. }
  10571. }, {
  10572. key: "setWidget",
  10573. value: function setWidget(model, pano, type) {
  10574. // 球幕播放图标
  10575. if (type == 'video') {
  10576. if (pano.oldFlagSpot) {
  10577. pano.flagSpot = pano.oldFlagSpot;
  10578. } else if (!pano.flagSpot) {
  10579. var tag = new VideoPanoTag(model, 'flagSpot___' + pano.id, {
  10580. position: pano.position.clone(),
  10581. state: 'videoPanoFlag',
  10582. sid: 'flagSpot___' + pano.id,
  10583. style: 'videoMarker',
  10584. pano
  10585. });
  10586. tag.style = 'videoMarker'; // 球幕图标线
  10587. var line = tag.createMarkLine({
  10588. type: 'flagSpot',
  10589. stemLineLen,
  10590. markerPos: this.position
  10591. });
  10592. line.marker = this;
  10593. 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)))
  10594. videoPanoTags.push(tag); // 用于animate
  10595. pano.flagSpot = tag;
  10596. if (!this.visible) tag.hide(); //初始化可见性
  10597. }
  10598. }
  10599. }
  10600. }, {
  10601. key: "initAnimate",
  10602. value: function initAnimate() {
  10603. if (animateInited) return;
  10604. player$n.on('update', function () {
  10605. animate();
  10606. });
  10607. animateInited = true;
  10608. }
  10609. }]);
  10610. return Marker;
  10611. }(THREE.Mesh);
  10612. var animateMaterialQuene = [];
  10613. var progress = 0; //let minProgress = 0;
  10614. //let maxProgress = 0;
  10615. var bigCircleProgress = 0;
  10616. var smallCircleProgress0 = -0.12; //间隔
  10617. var smallCircleProgress = smallCircleProgress0;
  10618. var animateInited;
  10619. var speed = 0.0045;
  10620. var noGif = true;
  10621. function animate() {
  10622. for (var i = 0; i < animateMaterialQuene.length; i++) {
  10623. animateMaterialQuene[i].uniforms['progress'].value = progress;
  10624. animateMaterialQuene[i].uniforms['bigCircleProgress'].value = bigCircleProgress;
  10625. animateMaterialQuene[i].uniforms['smallCircleProgress'].value = smallCircleProgress;
  10626. }
  10627. videoPanoTags.forEach(function (tag) {
  10628. return tag.update();
  10629. });
  10630. if (progress > 1) {
  10631. progress = 0;
  10632. }
  10633. progress += speed;
  10634. if (bigCircleProgress > 1.0) {
  10635. if (noGif) {
  10636. //为false的话在别处调控
  10637. bigCircleProgress = 0;
  10638. smallCircleProgress = smallCircleProgress0; //间隔
  10639. }
  10640. } else {
  10641. bigCircleProgress += speed;
  10642. smallCircleProgress += speed;
  10643. }
  10644. }
  10645. var VideoPanoTag = /*#__PURE__*/function (_EventEmitter) {
  10646. _inherits(VideoPanoTag, _EventEmitter);
  10647. var _super2 = _createSuper$1L(VideoPanoTag);
  10648. function VideoPanoTag(model, sid, tagData) {
  10649. var _this2;
  10650. _classCallCheck(this, VideoPanoTag);
  10651. _this2 = _super2.call(this);
  10652. _this2.model = model;
  10653. _this2.sid = sid;
  10654. _this2.floor = null;
  10655. _this2.floors = [];
  10656. _this2.position = new THREE.Vector3().copy(tagData.position); //position最好提到外面,像pano的position一样,因为有的计算函数就是这么用的
  10657. _this2.content = {};
  10658. _this2.initContent(tagData);
  10659. _this2.snapInfo = tagData.snapInfo;
  10660. _this2.style = tagData.style || 'default';
  10661. _this2.color = new THREE.Color().setRGB(0.0, 0.7843137254901961, 0.6862745098039216);
  10662. tagData.color && _this2.color.setStyle(tagData.color);
  10663. _this2.styleImageURL = tagData.styleImageURL;
  10664. _this2.hoverColor = Colors._darken(_this2.content.color, 0.2);
  10665. _this2.animTime = 0;
  10666. _this2.animated = false;
  10667. _this2.openning = 0;
  10668. _this2.openTransition = null;
  10669. _this2.mode = Viewmode$1.PANORAMA;
  10670. _this2.obj3d = null; //THREE.Object3D 类型
  10671. _this2.disc = null; //mesh类型
  10672. _this2.discWorldPosition = null;
  10673. _this2.discScale = 0.06;
  10674. _this2.floorIndex = tagData.floorIndex;
  10675. _this2.visibleTransition = null;
  10676. _this2.hoveringDisc = !1;
  10677. _this2.state = tagData.state;
  10678. _this2.videoPano = tagData.pano;
  10679. _this2.build();
  10680. return _this2;
  10681. }
  10682. _createClass(VideoPanoTag, [{
  10683. key: "initContent",
  10684. value: function initContent(tagData) {
  10685. //和billboard有关
  10686. this.content.description = tagData.description;
  10687. this.content.label = tagData.label;
  10688. this.content.link = tagData.link;
  10689. this.content.outLink = tagData.outLink;
  10690. this.content.color = new THREE.Color().set(tagData.color || Colors.tagDefault); //this.content.floorIndex = tagData.floorIndex || 0;
  10691. this.content.fileName = tagData.fileName || {}; //存储音频视频原文件名
  10692. this.content.fileSrc = tagData.fileSrc || {}; //存储音频视频的完整地址。原先是七牛,现在是阿里云的oss了
  10693. this.content.media = tagData.media || [];
  10694. }
  10695. }, {
  10696. key: "getFloors",
  10697. value: function getFloors() {
  10698. var _this3 = this;
  10699. //根据floor和visiblePanos 得到热点所在的所有可能楼层。 包括原先所在的floor和所有可见点所在楼层。
  10700. this.floors = []; //拥有多楼层的原因: 热点会在tagVisibleOnCurrentFloor来隐藏热点,会使楼道间的热点只在部分位置可见。
  10701. this.visiblePanos && this.visiblePanos.forEach(function (id) {
  10702. if (_this3.model.panos.index[id]) {
  10703. if (!_this3.floors.includes(_this3.model.panos.index[id].floor)) {
  10704. _this3.floors.push(_this3.model.panos.index[id].floor);
  10705. }
  10706. }
  10707. });
  10708. if (this.floor && !this.floors.includes(this.floor)) this.floors.push(this.floor);
  10709. }
  10710. }, {
  10711. key: "rePos",
  10712. value: function rePos(pos) {
  10713. //add by xzw 重新定位置
  10714. this.position.copy(pos);
  10715. this.obj3d.position.copy(pos);
  10716. }
  10717. }, {
  10718. key: "createMarkLine",
  10719. value: function createMarkLine(o) {
  10720. this.markLine = new VideoMarkLine({
  10721. type: o.type,
  10722. stemLineLen: o.stemLineLen,
  10723. markerPos: o.markerPos,
  10724. tag: this,
  10725. model: this.model
  10726. });
  10727. return this.markLine;
  10728. }
  10729. }, {
  10730. key: "build",
  10731. value: function build() {
  10732. this.floor = this.videoPano.floor;
  10733. this.floorIndex = this.floor.floorIndex;
  10734. if (this.floor) {
  10735. this.obj3d = this.buildObject3D();
  10736. this.floor.add(this.obj3d);
  10737. }
  10738. this.getFloors();
  10739. return this;
  10740. }
  10741. }, {
  10742. key: "buildObject3D",
  10743. value: function buildObject3D() {
  10744. var _this4 = this;
  10745. var group = new THREE.Object3D();
  10746. group.position.copy(this.position);
  10747. var config = this.model.$app.config;
  10748. this.animated = true;
  10749. var planeGeo = config.isMobile ? new THREE.PlaneBufferGeometry(2.4, 2.4) : new THREE.PlaneBufferGeometry(1, 1);
  10750. this.disc = new THREE.Mesh(planeGeo, getVideoSpotMat());
  10751. this.disc.layers.set(RenderLayers.PANOMARKERS);
  10752. this.disc.renderOrder = RenderOrder.panoMarker; //tagDisc 不要遮住overlay等
  10753. player$n.on('mode.changing', function (from, to) {
  10754. _this4.disc.renderOrder = to != 'floorplan' ? RenderOrder.panoMarker : 5; //floorplan时需要提高,其他时候需要比透明楼层低
  10755. });
  10756. this.disc.tag = this;
  10757. this.disc.pano = this.videoPano;
  10758. this.disc.name = 'disc';
  10759. group.add(this.disc);
  10760. group.name = 'tagGroup';
  10761. return group;
  10762. }
  10763. }, {
  10764. key: "hide",
  10765. value: function hide(e, t) {
  10766. if (this.hidden) return;else this.hidden = true; // var i = KanKan.Deferred()
  10767. // if (0 === this.disc.material.uniforms.opacity.value && !transitions.isRunning(this.visibleTransition)) return i.resolve().promise()
  10768. // ;(e = e || 0), (t = t || 0), transitions.cancel(this.visibleTransition)
  10769. if (this.markLine) this.markLine.hide(); //add
  10770. //xst
  10771. if (this.disc) {
  10772. this.disc.visible = false;
  10773. }
  10774. }
  10775. }, {
  10776. key: "show",
  10777. value: function show(e, t) {
  10778. if (!this.hidden) return;else this.hidden = false; // var i = KanKan.Deferred()
  10779. // if (this.disc.material.uniforms.opacity.value === 1 && !transitions.isRunning(this.visibleTransition)) return i.resolve().promise()
  10780. // ;(e = e || 0), (t = t || 0), transitions.cancel(this.visibleTransition)
  10781. if (this.markLine) this.markLine.show(); //add
  10782. //xst
  10783. if (this.disc) {
  10784. this.disc.visible = true;
  10785. }
  10786. }
  10787. }, {
  10788. key: "update",
  10789. value: function update() {
  10790. if (!this.disc) return;
  10791. this.discWorldPosition = this.disc.getWorldPosition(new THREE.Vector3());
  10792. this.updateDisc();
  10793. }
  10794. /* 更新disc的大小和朝向
  10795. 朝向: billboard的效果,只需要mesh.quaternion = camera.quaternion
  10796. 大小:在保证距离不变的情况下,要消除屏幕边缘放大的效果,需要结合camera和屏幕(应该和projection有关),如下一顿操作
  10797. 然后再考虑距离,smoothstep化近大远小
  10798. */
  10799. }, {
  10800. key: "updateDisc",
  10801. value: function updateDisc() {
  10802. var mode = this.model.mode;
  10803. var camera = this.model.player.mode == 'floorplan' ? this.model.player.cameraControls.activeControl.camera : this.model.player.camera; //floorplan 时要用到OrthographicCamera
  10804. var u = settings$3.tags.visibility,
  10805. d = settings$3.tags.disc.scale,
  10806. p = mode === Viewmode$1.DOLLHOUSE || mode === Viewmode$1.FLOORPLAN ? settings$3.tags.visibility.visibleDistance : camera.position.distanceTo(this.discWorldPosition); //改 许钟文
  10807. // 只是用来设置obj3d.visible。显隐控制要设置marker
  10808. 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));
  10809. if (this.obj3d.visible && this.disc.visible) {
  10810. //add this.disc.visible
  10811. //this.markLine.stemLine.quaternion.copy(camera.quaternion)
  10812. 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)
  10813. var _player = this.model.$app.core.get('Player');
  10814. if (_player.modeTran.split('-')[1] == 'floorplan') {
  10815. this.disc.quaternion.copy(camera.quaternion);
  10816. } else {
  10817. this.disc.lookAt(camera.position); //for video tag 看起来和marker一样有点歪斜、立体点
  10818. } //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
  10819. //scale:
  10820. var scale = math$2.getScaleForConstantSize({
  10821. maxSize: d.maxSize,
  10822. minSize: this.state == 'videoPanoFlag' && mode != Viewmode$1.PANORAMA ? 30 : d.minSize,
  10823. nearBound: d.nearBound,
  10824. farBound: d.farBound,
  10825. position: this.discWorldPosition,
  10826. player: _player
  10827. });
  10828. var response = 1 + settings$3.tags.disc.scale.responsiveness / 100 * (VideoPanoTag.viewportScale() - 1);
  10829. this.discScale = scale * response;
  10830. try {
  10831. //editor player可能还没有
  10832. if (this.model.player.linkEditor.setTagVisible) {
  10833. //许钟文add 编辑热点可视时放大热点
  10834. this.discScale *= 1.5; // config.isMobile ? 2 : 1.5
  10835. } else if (this.isMeasurePoint) {
  10836. this.discScale *= 0.9;
  10837. } else if (this.model.$app.TagManager.editHandle && this.model.$app.TagManager.editHandle.editing) {
  10838. this.discScale *= 2.5;
  10839. }
  10840. } catch (mode) {}
  10841. this.disc.scale.set(2 * this.discScale, 2 * this.discScale, 2 * this.discScale); //使stem的顶部在圆圈底部
  10842. var circleRadius = this.discScale * 0.95;
  10843. this.markLine.stemLine.scale.y = (stemLineLen - circleRadius) / stemLineLen; //不要覆盖住圆圈
  10844. this.markLine.stemLine.position.copy(this.markLine.stemLine.originPos);
  10845. this.markLine.stemLine.position.y -= circleRadius / 2; // if (this.animated) {
  10846. // this.animTime += 0.016
  10847. // this.disc.material.uniforms['uTime'].value = this.animTime
  10848. // }
  10849. }
  10850. }
  10851. }, {
  10852. key: "tagVisibleOnCurrentFloor",
  10853. value: function tagVisibleOnCurrentFloor(e) {
  10854. return !(e === Viewmode$1.DOLLHOUSE || e === Viewmode$1.FLOORPLAN) || this.model.allFloorsVisible || !!this.floors.find(function (floor) {
  10855. return !floor.hidden;
  10856. });
  10857. } // updateVideoFlagVisible() {
  10858. // if (!this.obj3d.visible || this.model.player.mode != 'dollhouse') return
  10859. // if (this.model.allFloorsVisible && convertTool.ifShelter(this.position, this.model.player, null, null, this.model.currentFloor.floorIndex)) {
  10860. // this.videoPano.marker.visible = false
  10861. // } else {
  10862. // this.videoPano.marker.visible = !!this.videoPano.marker.visibleOri
  10863. // }
  10864. // }
  10865. }], [{
  10866. key: "viewportScale",
  10867. value: function viewportScale() {
  10868. var player = document.getElementsByClassName('player')[0];
  10869. 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;
  10870. }
  10871. }]);
  10872. return VideoPanoTag;
  10873. }(EventEmitter);
  10874. var VideoMarkLine = /*#__PURE__*/function () {
  10875. function VideoMarkLine(o) {
  10876. _classCallCheck(this, VideoMarkLine);
  10877. this.tag = o.tag;
  10878. this.groundPoint = o.groundPoint || o.markerPos; //垂线和地面交点
  10879. // this.stemLine = LineDraw.createLine([o.stemLineLen ? this.groundPoint.clone().add(new THREE.Vector3(0, o.stemLineLen, 0)) : o.tag.position, this.groundPoint], {
  10880. // width: 2,
  10881. // color: o.stemLineColor || '#eee',
  10882. // }) //垂线
  10883. this.stemLine = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.006, o.stemLineLen), getStemMat());
  10884. this.stemLine.position.copy(this.groundPoint.clone().add(new THREE.Vector3(0, o.stemLineLen / 2, 0)));
  10885. this.stemLine.originPos = this.stemLine.position.clone();
  10886. this.stemLine.name = 'markGroup-stemLine';
  10887. this.stemLine.layers.set(RenderLayers.PANOMARKERS);
  10888. this.stemLine.renderOrder = RenderOrder.panoMarker;
  10889. this.tag.obj3d.parent.add(this.stemLine);
  10890. }
  10891. _createClass(VideoMarkLine, [{
  10892. key: "hide",
  10893. value: function hide() {
  10894. this.stemLine.visible = false;
  10895. }
  10896. }, {
  10897. key: "show",
  10898. value: function show() {
  10899. this.stemLine.visible = true;
  10900. }
  10901. }]);
  10902. return VideoMarkLine;
  10903. }(); //闪烁的marker
  10904. var VideoPanoMarkerMaterial = /*#__PURE__*/function (_THREE$RawShaderMater) {
  10905. _inherits(VideoPanoMarkerMaterial, _THREE$RawShaderMater);
  10906. var _super3 = _createSuper$1L(VideoPanoMarkerMaterial);
  10907. function VideoPanoMarkerMaterial() {
  10908. var _this5;
  10909. _classCallCheck(this, VideoPanoMarkerMaterial);
  10910. _this5 = _super3.call(this);
  10911. var u = THREE.UniformsUtils.clone(shaders.videoPanoMarker.uniforms);
  10912. u.map.value = getMarkerTex('normalMarker');
  10913. u.opacity.value = 1;
  10914. _this5.vertexShader = shaders.videoPanoMarker.vertexShader;
  10915. _this5.fragmentShader = shaders.videoPanoMarker.fragmentShader;
  10916. _this5.uniforms = u;
  10917. _this5.transparent = true;
  10918. _this5.depthTest = false; //browser.detectIOS() && (this.defines['useColor2'] = '')
  10919. initOpacityProp(_assertThisInitialized(_this5));
  10920. animateMaterialQuene.push(_assertThisInitialized(_this5));
  10921. return _this5;
  10922. }
  10923. return VideoPanoMarkerMaterial;
  10924. }(THREE.RawShaderMaterial);
  10925. var VideoLineMaterial = /*#__PURE__*/function (_THREE$RawShaderMater2) {
  10926. _inherits(VideoLineMaterial, _THREE$RawShaderMater2);
  10927. var _super4 = _createSuper$1L(VideoLineMaterial);
  10928. function VideoLineMaterial() {
  10929. var _this6;
  10930. _classCallCheck(this, VideoLineMaterial);
  10931. _this6 = _super4.call(this);
  10932. var u = THREE.UniformsUtils.clone(shaders.videoStemLine.uniforms);
  10933. _this6.vertexShader = shaders.videoStemLine.vertexShader, _this6.fragmentShader = shaders.videoStemLine.fragmentShader, _this6.uniforms = u;
  10934. _this6.transparent = true;
  10935. _this6.depthTest = false;
  10936. _this6.side = THREE.DoubleSide;
  10937. animateMaterialQuene.push(_assertThisInitialized(_this6));
  10938. return _this6;
  10939. }
  10940. return VideoLineMaterial;
  10941. }(THREE.RawShaderMaterial);
  10942. /* //视频播放按钮
  10943. class VideoPlayerMaterial extends THREE.RawShaderMaterial {
  10944. constructor() {
  10945. super()
  10946. var u = THREE.UniformsUtils.clone(shaders.tagVideoMarker.uniforms)
  10947. ;(this.vertexShader = shaders.tagVideoMarker.vertexShader), (this.fragmentShader = shaders.tagVideoMarker.fragmentShader), (this.uniforms = u)
  10948. this.transparent = true
  10949. this.depthTest = false
  10950. this.side = THREE.DoubleSide
  10951. this.uniforms.map.value = getMarkerTex('shineMarker')
  10952. animateMaterialQuene.push(this)
  10953. }
  10954. }
  10955. */
  10956. var VideoPlayerMaterial = /*#__PURE__*/function (_THREE$MeshBasicMater) {
  10957. _inherits(VideoPlayerMaterial, _THREE$MeshBasicMater);
  10958. var _super5 = _createSuper$1L(VideoPlayerMaterial);
  10959. function VideoPlayerMaterial() {
  10960. var _this7;
  10961. _classCallCheck(this, VideoPlayerMaterial);
  10962. var map = texture.load(texture.getImageURL('images/videoTag.png'));
  10963. var animateInfo = {
  10964. cellXcount: 6,
  10965. cellYcount: 5,
  10966. voidCount: 0,
  10967. loop: true,
  10968. duration: 1200,
  10969. //动画时长
  10970. delay: 600,
  10971. //延迟
  10972. waitNextTime: 1700 //间隔
  10973. };
  10974. _this7 = _super5.call(this, {
  10975. map,
  10976. transparent: true,
  10977. depthTest: false
  10978. }); //飞出要被模型遮挡
  10979. _this7.animation = common$1.GifTexDeal.addAnimation(map, _assertThisInitialized(_this7), animateInfo, 0);
  10980. _this7.animation.startCallback = function () {
  10981. bigCircleProgress = 0;
  10982. smallCircleProgress = smallCircleProgress0; //间隔
  10983. };
  10984. noGif = false;
  10985. common$1.GifTexDeal.start(_this7.animation);
  10986. player$n.on('mode.changing', function (from, to) {
  10987. _this7.depthTest = to != 'floorplan' && to != 'panorama'; //因为即使提高了renderOrder还是会被透明的楼层遮住所以设置一下这个(renderOrder需要比透明楼层低才能不被遮,但又要比当前楼层高,而当前楼层要比透明的高,所以不可能)
  10988. });
  10989. return _this7;
  10990. }
  10991. return VideoPlayerMaterial;
  10992. }(THREE.MeshBasicMaterial);
  10993. var GLCubeFaces$1 = {
  10994. GL_TEXTURE_CUBE_MAP_POSITIVE_X: 0,
  10995. GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1,
  10996. GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 2,
  10997. GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 3,
  10998. GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 4,
  10999. GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 5
  11000. };
  11001. var TileUtils = {
  11002. TILE_SIZE: 512,
  11003. FACES_PER_PANO: 6,
  11004. LocationOnTile: {
  11005. Center: 0,
  11006. UpperLeft: 1,
  11007. UpperRight: 2,
  11008. LowerRight: 3,
  11009. LowerLeft: 4
  11010. },
  11011. /* initTileClass(tileClass){//add
  11012. this.tileClass = tileClass
  11013. }, */
  11014. getTileSize(panoSize) {
  11015. return panoSize == 6144 ? 768 : TileUtils.TILE_SIZE;
  11016. }
  11017. }
  11018. /*
  11019. * 获取某tile在cube中的方向 direction (向量起点在cube中心,终点在tile图的指定位置)。spherical通过先求uv,再直接得到dir
  11020. * @param {*} size 面分辨率
  11021. * @param {*} cubeFace 所在面
  11022. * @param {*} Center 在tile上的目标位置,默认为中心,其他位置就是四个顶点
  11023. * @param {*} c 似乎是在tile的缩进百分比,根据所在面的不同,分别向不同方向缩进,但都是向tile的中心
  11024. * @param {*} dir 所求方向
  11025. */
  11026. ;
  11027. TileUtils.getTileVector = function () {
  11028. //获取某tile在cube中的方向 direction (向量起点在cube中心,终点在tile图的中心)
  11029. return function (size, tileSize, cubeFace, tileX, tileY, Center, c, dir) {
  11030. //c似乎是缩进百分比
  11031. Center = Center || TileUtils.LocationOnTile.Center; //假设该cube边长为2:
  11032. var u = size / tileSize,
  11033. d = tileX / u;
  11034. tileY = -tileY + (u - 1);
  11035. var p = tileY / u,
  11036. f = tileSize / size,
  11037. g = 2 * f,
  11038. //一个tile的宽度 (乘以2是因为cube边长是2)
  11039. m = g / 2,
  11040. v = 2 * d - 1 + m,
  11041. A = 2 * p - 1 + m;
  11042. switch (Center //计算在tile中指定位置带来的偏移
  11043. ) {
  11044. case TileUtils.LocationOnTile.UpperLeft:
  11045. v -= m, A += m, v += c * g; //似乎是向内缩进
  11046. break;
  11047. case TileUtils.LocationOnTile.UpperRight:
  11048. v += m, A += m, A -= c * g;
  11049. break;
  11050. case TileUtils.LocationOnTile.LowerRight:
  11051. v += m, A -= m, v -= c * g;
  11052. break;
  11053. case TileUtils.LocationOnTile.LowerLeft:
  11054. v -= m, A -= m, A += c * g;
  11055. break;
  11056. case TileUtils.LocationOnTile.Center: //0
  11057. }
  11058. switch (cubeFace) {
  11059. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
  11060. MathLight.setVector(dir, -1, A, -v);
  11061. break;
  11062. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
  11063. MathLight.setVector(dir, 1, A, v);
  11064. break;
  11065. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
  11066. //顶面
  11067. MathLight.setVector(dir, -v, 1, -A);
  11068. break;
  11069. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
  11070. MathLight.setVector(dir, -v, -1, A);
  11071. break;
  11072. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
  11073. MathLight.setVector(dir, -v, A, 1);
  11074. break;
  11075. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
  11076. MathLight.setVector(dir, v, A, -1);
  11077. }
  11078. MathLight.normalize(dir);
  11079. };
  11080. }(), TileUtils.getFaceForTile = function (size, index) {
  11081. //获取该tile在第几个面
  11082. var tileSize = this.getTileSize(size); //xzw改
  11083. size < TileUtils.TILE_SIZE && (tileSize = size);
  11084. var n = Math.floor(size / tileSize),
  11085. sum = n * n; //得每个面tile总数
  11086. return Math.floor(index / sum);
  11087. }, TileUtils.getTileLocation = function (size, t, result) {
  11088. var tileSize = this.getTileSize(size); //xzw改
  11089. size < TileUtils.TILE_SIZE && (tileSize = size);
  11090. var r = TileUtils.getFaceForTile(size, t),
  11091. a = Math.floor(size / tileSize),
  11092. s = a * a,
  11093. l = t - r * s;
  11094. result.tileX = l % a;
  11095. result.tileY = Math.floor(l / a);
  11096. result.face = r;
  11097. result.faceTileIndex = l;
  11098. if (result.tileY > 20) {
  11099. console.log(333);
  11100. }
  11101. return result; //add
  11102. }, TileUtils.getTileCountForSize = function (size) {
  11103. //没招了,硬写. 传不了TILE_SIZE。
  11104. var tileSize = this.getTileSize(size);
  11105. if (size <= tileSize) return TileUtils.FACES_PER_PANO;
  11106. var t = Math.floor(size / tileSize),
  11107. i = t * t,
  11108. n = i * TileUtils.FACES_PER_PANO;
  11109. return n;
  11110. }, TileUtils.getRelativeDirection = function () {
  11111. var e = new MathLight.Matrix4(),
  11112. t = new MathLight.Quaternion();
  11113. return function (i, n) {
  11114. //i是pano.quaternion, n是camera的direction
  11115. t.copy(i), t.inverse(), e.makeRotationFromQuaternion(t), e.applyToVector3(n), MathLight.normalize(n);
  11116. };
  11117. }(), TileUtils.matchingTilesInDirection = function () {
  11118. var e = new MathLight.Vector3(),
  11119. t = new MathLight.Vector3(0, 0, -1),
  11120. i = new MathLight.Quaternion(),
  11121. n = function n(e, t) {
  11122. e.push({
  11123. face: t.face,
  11124. faceTileIndex: t.faceTileIndex,
  11125. tileX: t.tileX,
  11126. tileY: t.tileY
  11127. });
  11128. },
  11129. a = function () {
  11130. var e = {
  11131. face: -1,
  11132. faceTileIndex: -1,
  11133. tileX: -1,
  11134. tileY: -1
  11135. };
  11136. return function (size, i, r) {
  11137. for (var a = TileUtils.getTileCountForSize(size), s = 0, l = 0; l < a; l++) {
  11138. TileUtils.getTileLocation(size, l, e), i && !i(e) || (s++, r && n(r, e));
  11139. }
  11140. return s;
  11141. };
  11142. }();
  11143. return function (pano, size, dir, hFov, vFov, result) {
  11144. var d = size < TileUtils.TILE_SIZE ? size : TileUtils.TILE_SIZE; //TileUtils.getTileCountForSize(size);
  11145. if (!hFov && !vFov) return a(size, null, result);
  11146. var p = !!vFov;
  11147. 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);
  11148. if (p) {
  11149. //如果有vFov hFov
  11150. i.setFromUnitVectors(e, t);
  11151. var f = function f(e) {
  11152. return TileUtils.isTileWithinFrustum(size, d, e.face, e.tileX, e.tileY, i, hFov, vFov); //在视野中的
  11153. };
  11154. return a(size, f, result);
  11155. }
  11156. var g = function g(t) {
  11157. //如果仅有hFov
  11158. return TileUtils.isTileWithinFOV(size, d, t.face, t.tileX, t.tileY, e, hFov);
  11159. };
  11160. return a(size, g, result);
  11161. };
  11162. }(), TileUtils.isTileWithinFrustum = function () {
  11163. var e = new MathLight.Vector3(),
  11164. t = 1e-5;
  11165. return function (i, n, a, s, l, c, h, u) {
  11166. 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++) {
  11167. TileUtils.getTileVector(i, n, m, s, l, b, 0, e), //get e // size, tileSize, cubeFace, tileX, tileY, Center, c, dir
  11168. MathLight.applyQuaternionToVector(c, e);
  11169. if (e.z >= -t) //似乎是在相机背面
  11170. ;else {
  11171. var w = -1 / e.z,
  11172. _ = e.x * w,
  11173. T = e.y * w;
  11174. T > d ? v++ : T < p && A++, //这四种似乎代表在这个画框之外,如在左、在上、在下、在右
  11175. _ > f ? y++ : _ < g && C++, E++;
  11176. }
  11177. }
  11178. return A !== E && v !== E && y !== E && C !== E; //如果有一项和E相等代表要么是在相机背面要么是tile的四个顶点都画在画布的同一边,所以肯定不在画布上
  11179. };
  11180. }(), TileUtils.isTileWithinFOV = function () {
  11181. var e = new MathLight.Vector3(),
  11182. t = new MathLight.Vector3(0, 1, 0),
  11183. i = new MathLight.Vector3(1, 0, 0);
  11184. return function (panoSize, tileSize, face, tileX, tileY, direction, fov) {
  11185. //direction是作用了pano.quaternion的camera.direction
  11186. var d = TileUtils.mapFaceToCubemapFace(face);
  11187. MathLight.cross(direction, t, i); //get i 好像没用到
  11188. TileUtils.getTileVector(panoSize, tileSize, d, tileX, tileY, TileUtils.LocationOnTile.Center, 0, e);
  11189. if (TileUtils.isWithinFOV(e, direction, fov, null)) //先判断tile中心在不在FOV内
  11190. return !0;
  11191. for (var p = fov / 360, f = Math.floor(1 / p), g = 0, m = 0; m < f; m++) {
  11192. for (var v = TileUtils.LocationOnTile.UpperLeft; v <= TileUtils.LocationOnTile.LowerLeft; v++) {
  11193. if (TileUtils.getTileVector(panoSize, tileSize, d, tileX, tileY, v, g, e), TileUtils.isWithinFOV(e, direction, fov, null)) return !0;
  11194. }
  11195. g += p; //可能是考虑到有可能tile比fov覆盖了fov(虽然一般不可能,除非fov特别小),所以将tile分成若干段,取tile中的点再检测下
  11196. }
  11197. return !1;
  11198. };
  11199. }(), TileUtils.isWithinFOV = function () {
  11200. var e = new MathLight.Vector3(),
  11201. t = new MathLight.Vector3();
  11202. return function (dir, cameraDir, fov, a) {
  11203. if (MathLight.copyVector(dir, t), a) {
  11204. MathLight.copyVector(a, e), MathLight.normalize(e);
  11205. var s = MathLight.dot(e, dir);
  11206. e.x *= s, e.y *= s, e.z *= s, MathLight.subVector(t, e);
  11207. }
  11208. var l = fov / 2 * MathLight.RADIANS_PER_DEGREE,
  11209. c = Math.cos(l),
  11210. h = MathLight.dot(t, cameraDir);
  11211. return h >= c;
  11212. };
  11213. }(), TileUtils.mapFaceToCubemapFace = function () {
  11214. var e = {
  11215. 0: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
  11216. 1: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
  11217. 2: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
  11218. 3: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
  11219. 4: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
  11220. 5: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
  11221. };
  11222. return function (t) {
  11223. return e[t];
  11224. };
  11225. }();
  11226. var Vectors$1 = {
  11227. UP: new THREE.Vector3(0, 1, 0),
  11228. DOWN: new THREE.Vector3(0, -1, 0),
  11229. LEFT: new THREE.Vector3(-1, 0, 0),
  11230. RIGHT: new THREE.Vector3(1, 0, 0),
  11231. FORWARD: new THREE.Vector3(0, 0, -1),
  11232. BACK: new THREE.Vector3(0, 0, 1),
  11233. ZERO: new THREE.Vector3(0, 0, 0)
  11234. };
  11235. 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); }; }
  11236. 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; } }
  11237. var rot90$1 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), -Math.PI / 2);
  11238. var labelProp$1 = {
  11239. backgroundColor: {
  11240. r: 0,
  11241. g: 0,
  11242. b: 0,
  11243. a: 0
  11244. },
  11245. textColor: {
  11246. r: 255,
  11247. g: 255,
  11248. b: 255,
  11249. a: 1
  11250. },
  11251. //textBorderColor:{r:30 , g:30, b: 30, a: 1 },
  11252. //textBorderThick:3,
  11253. //textshadowColor: '#888',
  11254. fixOrient: true,
  11255. renderOrder: RenderOrder.panoMarker,
  11256. //panoLabel,
  11257. fontsize: 30
  11258. };
  11259. var labelProp2 = {
  11260. backgroundColor: {
  11261. r: 255,
  11262. g: 255,
  11263. b: 255,
  11264. a: 0.4
  11265. },
  11266. textColor: {
  11267. r: 0,
  11268. g: 0,
  11269. b: 0,
  11270. a: 1
  11271. },
  11272. borderRadius: 15,
  11273. renderOrder: RenderOrder.panoMarker
  11274. }; // 显示点位
  11275. var addLabel$3 = browser$1.urlHasValue('panoLabel');
  11276. var Panorama = /*#__PURE__*/function (_EventEmitter) {
  11277. _inherits(Panorama, _EventEmitter);
  11278. var _super = _createSuper$1K(Panorama);
  11279. function Panorama($app, sweepuuid, sweepLocation, videoInfo, supportsTiles) {
  11280. var _this;
  11281. _classCallCheck(this, Panorama);
  11282. _this = _super.call(this);
  11283. _this.raycastToFindFloor = function () {
  11284. 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)];
  11285. return function () {
  11286. //logger.warn("Performance warning: Raycasting to find floor index");
  11287. for (var t = 0; t < e.length; t++) {
  11288. var i = new THREE.Raycaster(this.position.clone(), e[t].clone()),
  11289. n = i.intersectObjects(this.model.colliders);
  11290. if (n.length) return n[0].object.parent.floor;
  11291. }
  11292. return null;
  11293. };
  11294. }();
  11295. _this.findNeighourPanos = function () {
  11296. return this.model.panos.setNeighbour(this.id, this.id, !1), this.model.panos.forEach(function (e) {
  11297. if (e !== this && (!this.model.panos.neighbourMap[this.id] || void 0 === this.model.panos.neighbourMap[this.id][e.id])) {
  11298. var t = this.position.distanceTo(e.position);
  11299. if (t > settings$3.panoramaNeighbourMaxDistance) return this.model.panos.setNeighbour(this, e, !1), void Panorama.raycastsSkipped++;
  11300. var i = e.position.clone().sub(this.position).normalize(),
  11301. o = new THREE.Raycaster(this.position, i.clone(), 0, t),
  11302. s = o.intersectObjects(this.model.colliders);
  11303. 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)));
  11304. }
  11305. }.bind(this)), this.model.panos.neighbourMap[this.id];
  11306. };
  11307. _this.enter = function () {
  11308. /* var e = null
  11309. return function () {
  11310. this.setZoomed(!1),
  11311. this.emit('enter', {
  11312. oldPano: e,
  11313. newPano: this,
  11314. }),
  11315. (e = this)
  11316. } */
  11317. var old = null;
  11318. return function () {
  11319. this.setZoomed(!1), this.emit(PanoramaEvents.Enter, old, this), old = this;
  11320. this.model.setHighMap(this); //add
  11321. this.model.dispatchEvent({
  11322. type: 'panoEntered'
  11323. });
  11324. };
  11325. }();
  11326. _this.loadTiledPano = function () {
  11327. var downloaded = {},
  11328. eventAdded = {},
  11329. latestPartialRequest = {}; //每个pano对应一组这些
  11330. return function (size, dir, fov, o, a, s) {
  11331. null !== o && void 0 !== o || (o = !0), null !== a && void 0 !== a || (a = !0);
  11332. var l = this.getWaitDeferred(size),
  11333. c = l.deferred,
  11334. h = null,
  11335. u = null;
  11336. fov && ('number' == typeof fov ? h = fov : (h = fov.hFov, u = fov.vFov));
  11337. if (!this.isLoaded(size)) {
  11338. //console.log('开始加载贴图', this.id, size )
  11339. if (!l.active) {
  11340. l.active = !0;
  11341. var name = this.id + ':' + size;
  11342. downloaded[name] = downloaded[name] || [];
  11343. /*
  11344. this.downloaded = downloaded
  11345. this.latestPartialRequest = latestPartialRequest
  11346. */
  11347. latestPartialRequest[name] = null;
  11348. if (fov) {
  11349. var tileArr = []; //add
  11350. var d = TileUtils.matchingTilesInDirection(this, size, dir, h, u, tileArr);
  11351. latestPartialRequest[name] = tileArr;
  11352. downloaded[name].forEach(function (e) {
  11353. var item = latestPartialRequest[name].find(function (a) {
  11354. return e.faceTileIndex == a.faceTileIndex && e.face == a.face;
  11355. });
  11356. if (item) {
  11357. item.loaded = true;
  11358. }
  11359. });
  11360. if (!latestPartialRequest[name].some(function (e) {
  11361. return !e.loaded;
  11362. })) {
  11363. //所需要的全部加载成功
  11364. //let total = TileUtils.getTileCountForSize(size)
  11365. //this.onPanoRendered(this.id, size, total, !0);
  11366. c.resolve(size
  11367. /* , total */
  11368. );
  11369. this.resetWaitDeferred(size); //console.log('该部分早已经加载好了'+size, this.id)
  11370. latestPartialRequest[name] = null;
  11371. }
  11372. logger$1.info('Loading partial pano: ' + this.id + ' with ' + d + ' tiles');
  11373. }
  11374. if (!eventAdded[this.id]) {
  11375. eventAdded[this.id] = !0;
  11376. this.on(PanoramaEvents.LoadComplete, function (e, t) {
  11377. //本次任务全部加载完毕
  11378. //console.warn('点位(可能部分)下载完成 ', 'id:' + this.id, 'count:' + t)
  11379. var i = this.getWaitDeferred(e).deferred; //"pending"为还未完成
  11380. i && 'pending' === i.state() && this.highestPartialTileRenderOpCompleted >= e && (i.resolve(e, t), this.resetWaitDeferred(e)); //恢复active为false
  11381. }.bind(this));
  11382. this.on(PanoramaEvents.LoadFailed, function (e) {
  11383. var t = this.getWaitDeferred(e).deferred;
  11384. t && 'pending' === t.state() && this.highestPartialTileRenderOpCompleted >= e && (t.reject(e), this.resetWaitDeferred(e)); //恢复active为false
  11385. }.bind(this));
  11386. this.on(PanoramaEvents.TileLoaded, function (size, tileIndex, total) {
  11387. //每张加载完时
  11388. //size == 512 && console.log('tileLoaded', 'id:' + this.id, 'size:' + size, 'index:' + tileIndex, this.copyForSplitView ? 'isCopy' : '')
  11389. var name = this.id + ':' + size;
  11390. downloaded[name] = downloaded[name] || []; //不是所有的加载都是从loadTiledPano获取的所以会有未定义的情况
  11391. var _TileUtils$getTileLoc = TileUtils.getTileLocation(size, tileIndex, {}),
  11392. faceTileIndex = _TileUtils$getTileLoc.faceTileIndex,
  11393. face = _TileUtils$getTileLoc.face;
  11394. downloaded[name].push({
  11395. faceTileIndex,
  11396. face
  11397. });
  11398. var r = this.getWaitDeferred(size).deferred;
  11399. if (r && 'pending' === r.state()) {
  11400. r.notify(size, tileIndex, total);
  11401. if (latestPartialRequest[name]) {
  11402. var item = latestPartialRequest[name].find(function (e) {
  11403. return e.faceTileIndex == faceTileIndex && e.face == face;
  11404. });
  11405. item && (item.loaded = true);
  11406. if (!latestPartialRequest[name].some(function (e) {
  11407. return !e.loaded;
  11408. })) {
  11409. //所需要的局部tiles全部加载成功
  11410. this.onPanoRendered(this.id, size, total, !0); //onPanoRendered还会触发 PanoramaEvents.LoadComplete
  11411. r.resolve(size, total);
  11412. this.resetWaitDeferred(size); //console.log('该部分加载好了'+size, this.id)
  11413. latestPartialRequest[name] = null;
  11414. }
  11415. }
  11416. }
  11417. }.bind(this));
  11418. }
  11419. }
  11420. this.tileDownloader.clearForceQueue();
  11421. this.tileDownloader.forceQueueTilesForPano(this, size, dir, h, u, s);
  11422. var quality = this.curTileQuality || this.qualityManager.getMaxNavPanoSize(); //xzw: add quality
  11423. this.tiledPanoRenderTarget = this.panoRenderer.activateTiledPano(this, quality, o);
  11424. this.panoRenderer.renderPanoTiles(this.id, dir, a, null, quality);
  11425. } else {
  11426. //console.log('早已经全加载好了' + size, this.id)
  11427. c.resolve(size);
  11428. }
  11429. return c.promise();
  11430. };
  11431. }();
  11432. _this.id = sweepuuid;
  11433. _this.panoType = sweepLocation.panoType; //标记特殊 如 'assistant'校准热点时的相机协助点 '360view' 独立全景
  11434. //alignmentType是用来标记户外的拍摄点是否校准了,这个数据存放在vision.modeldata里,我们四维看看没有这个数据
  11435. //UNKNOWN = 0;ALIGNED = 1;UNALIGNED = 2;MANUALLY_PLACED = 3;
  11436. //this.alignmentType = sweepLocation.alignmentType || AlignmentType.ALIGNED;
  11437. _this.neighbourUUIDs = sweepLocation.neighbours || []; //null
  11438. _this.neighbourPanos = null;
  11439. _this.floor = null;
  11440. _this.floorIndex = sweepLocation.subgroup || 0;
  11441. _this.failedLoadingAt = 0;
  11442. _this.maxLoadRetries = 4;
  11443. _this.origin = sweepLocation.position.clone(); //this.position = this.alignmentType === AlignmentType.UNALIGNED ? new THREE.Vector3(0,-5,0) : sweepLocation.position.clone();
  11444. _this.position = sweepLocation.position.clone();
  11445. _this.quaternion = sweepLocation.quaternion.clone();
  11446. _this.appId = sweepLocation.index + 1;
  11447. _this.$app = $app;
  11448. _this.model = _this.$app.core.get('Player').model;
  11449. /*
  11450. this.skyboxMesh = new THREE.Mesh(settings.sphereBufferGeometry) //skyboxMesh飞出后能表示当前position的小球
  11451. this.skyboxMesh.position.copy(this.position)
  11452. this.skyboxMesh.name = 'skybox'
  11453. */
  11454. _this.debugColor = new THREE.Color().setHSL(0.06 + 0.53 * Math.random(), 0.8 + 0.2 * Math.random(), 0.5 + 0.2 * Math.random());
  11455. _this.floorPosition = sweepLocation.puck ? sweepLocation.puck.clone() : null;
  11456. _this.marker = null; //许钟文:
  11457. _this.noBlockPanos = []; //不穿墙 sweepLocation.noBlocks,//算法很不准,不用了
  11458. _this.blocks = []; //会导致穿墙的mesh
  11459. _this.seeMarkers = sweepLocation.seeMarkers;
  11460. _this.tiled = sweepLocation.tiled != void 0 ? sweepLocation.tiled : _this.model.supportsTiles;
  11461. if (_this.isAligned()) {
  11462. _this.marker = new Marker(_assertThisInitialized(_this));
  11463. }
  11464. var rot90qua = new THREE.Quaternion().multiplyQuaternions(_this.quaternion, rot90$1); //改 为球目全景照片而改
  11465. var rot90Matrix = new THREE.Matrix4().compose(_this.position, rot90qua, new THREE.Vector3(1, 1, 1)); //转90度后的
  11466. if (_this.tiled) {
  11467. /*var quaternion = new THREE.Quaternion().multiplyQuaternions(this.quaternion, rot90) //改 为球目全景照片而改
  11468. this.skyboxMesh.quaternion.copy(quaternion)
  11469. this.skyboxMesh.updateMatrix()
  11470. this.skyboxMesh.updateMatrixWorld()
  11471. this.rot90Matrix = this.skyboxMesh.matrixWorld.clone()
  11472. */
  11473. //this.panoMatrix = new THREE.Matrix4().makeRotationFromQuaternion(this.quaternion)
  11474. _this.rot90Matrix = rot90Matrix; // 给热点校准用 因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
  11475. _this.matrixWorld = new THREE.Matrix4().compose(_this.position, _this.quaternion, new THREE.Vector3(1, 1, 1));
  11476. } else {
  11477. _this.solidSkybox = new THREE.Texture([null, null, null, null, null, null]);
  11478. _this.solidSkybox.flipY = !1;
  11479. if (settings$3.minimalMemoryMode) {
  11480. _this.solidSkybox.minFilter = THREE.LinearFilter;
  11481. _this.solidSkybox.magFilter = THREE.LinearFilter;
  11482. _this.solidSkybox.generateMipmaps = !1;
  11483. } //-------许钟文-----全景贴图的quaternion不同-----
  11484. /* var quaternion = sweepLocation.quaternion.clone()
  11485. //var rot90 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0,1,0), -Math.PI/2);
  11486. this.quaternion = new THREE.Quaternion().multiplyQuaternions(quaternion, rot90) //改 为球目全景照片而改
  11487. */
  11488. _this.quaternion = rot90qua;
  11489. _this.matrixWorld = rot90Matrix;
  11490. }
  11491. /* this.skyboxMesh.material.color = new THREE.Color(1, 1, 1)
  11492. this.skyboxMesh.quaternion.copy(this.quaternion)
  11493. this.skyboxMesh.name = 'skybox'
  11494. this.skyboxMesh.visible = !1
  11495. this.skyboxMesh.updateMatrix()
  11496. this.skyboxMesh.updateMatrixWorld() */
  11497. _this.zoomed = !1;
  11498. _this.panoRenderer = null;
  11499. _this.qualityManager = null;
  11500. _this.tileDownloader = null;
  11501. _this.tiledPanoRenderTarget = null;
  11502. _this.resolutionPromise = {};
  11503. _this.minimumTiledPanoLoaded = !1;
  11504. _this.highestPartialTileRenderOpCompleted = 0;
  11505. _this.highestFullTileRenderOpCompleted = 0;
  11506. _this.shouldRedrawOnBaseLoaded = !1;
  11507. _this.lockUntilRenderingComplete = !1;
  11508. if (videoInfo) {
  11509. _this.hasVideo = true; //是否有球幕视频
  11510. _this.videoInfo = videoInfo;
  11511. } else {
  11512. _this.hasVideo = false; //是否有球幕视频
  11513. }
  11514. _this.panoVideo = false; //是否有去绿布视频
  11515. /* settings.colorMarkerOnLoad && this.on('load', function () {
  11516. this.marker.material.color.set(65280)
  11517. }) */
  11518. _this.filterEffect = {
  11519. brightness: 0,
  11520. contrast: 0,
  11521. saturation: 0,
  11522. temperature: 0
  11523. };
  11524. return _this;
  11525. }
  11526. _createClass(Panorama, [{
  11527. key: "hasFilter",
  11528. get: function get() {
  11529. var _ref = this.$app.FilterManager.filterTemp[this.id] || this.filterEffect,
  11530. brightness = _ref.brightness,
  11531. contrast = _ref.contrast,
  11532. saturation = _ref.saturation,
  11533. temperature = _ref.temperature;
  11534. return brightness !== 0 || contrast !== 0 || saturation !== 0 || temperature !== 0;
  11535. }
  11536. }, {
  11537. key: "exit",
  11538. value: function exit() {
  11539. //console.log('exit', this.id)
  11540. if (this.tiled) {
  11541. this.clearWaitDeferreds();
  11542. this.minimumTiledPanoLoaded = !1;
  11543. this.tiledPanoRenderTarget = null;
  11544. this.setZoomed(!1);
  11545. this.panoRenderer.deactivateTiledPano(this);
  11546. this.highestPartialTileRenderOpCompleted = 0;
  11547. this.highestFullTileRenderOpCompleted = 0;
  11548. } else {
  11549. this.solidSkybox.dispose();
  11550. this.solidSkybox.loaded = !1;
  11551. this.solidSkybox.version = 0;
  11552. }
  11553. this.emit('exit');
  11554. }
  11555. }, {
  11556. key: "hoverOn",
  11557. value: function hoverOn(e) {
  11558. if (
  11559. /* (this.hasVideo && this.panoVideoRenderer.ifEnable()) || */
  11560. settings$3[e].markerOpacityOnHover == 0 || this.$app.core.get('Player').locked) return;
  11561. if (this.marker) {
  11562. transitions$1.start(lerp.property(this.marker.material, 'opacity', settings$3[e].markerOpacityOnHover), 250);
  11563. }
  11564. }
  11565. }, {
  11566. key: "hoverOff",
  11567. value: function hoverOff(e) {
  11568. if (
  11569. /* (this.hasVideo && this.panoVideoRenderer.ifEnable()) || */
  11570. settings$3[e].markerOpacity == 0 || this.$app.core.get('Player').locked) return;
  11571. this.marker && transitions$1.start(lerp.property(this.marker.material, 'opacity', settings$3[e].markerOpacity), 250);
  11572. }
  11573. }, {
  11574. key: "build1",
  11575. value: function build1() {
  11576. this.floor = this.floor || this.model.floors.get(this.floorIndex) || this.raycastToFindFloor() || this.model.floors.list[0]; //this.model.getFloorAtPoint(this.position)
  11577. if (this.floor) {
  11578. this.floorIndex = this.floor.floorIndex; //xzw add 2023.12.28 否则wallManager错的楼层获取的错的data
  11579. this.floor.addPano(this);
  11580. if (settings$3.colorMarkerByFloor && this.marker) {
  11581. this.marker.material.color.set(this.floor.debugColor);
  11582. }
  11583. }
  11584. this.floorPosition = this.floorPosition || this.raycastFloorPosition();
  11585. this.neighbourPanos = this.neighbourPanos || this.findNeighourPanos();
  11586. }
  11587. }, {
  11588. key: "build2",
  11589. value: function build2() {
  11590. var _this2 = this;
  11591. this.floorPosition = this.floorPosition || this.interpolateFloorPosition();
  11592. this.height = this.position.distanceTo(this.floorPosition);
  11593. this.placeMarker();
  11594. if (this.isAligned()) {
  11595. this.$app.config.view || this.addLabel();
  11596. setTimeout(function () {
  11597. addLabel$3 && _this2.addLabel2();
  11598. }, 1);
  11599. }
  11600. }
  11601. }, {
  11602. key: "placeMarker",
  11603. value: function placeMarker() {
  11604. if (this.marker) {
  11605. this.marker.position.copy(this.floorPosition);
  11606. this.marker.position.y += 0.01;
  11607. this.marker.lookAt(new THREE.Vector3(0, 1, 0).add(this.marker.position));
  11608. }
  11609. }
  11610. }, {
  11611. key: "attachToPanoRenderer",
  11612. value: function attachToPanoRenderer(panoRenderer) {
  11613. this.panoRenderer = panoRenderer;
  11614. this.panoRenderer.on(PanoRendererEvents.TileRenderSuccess, this.onTileRendered.bind(this));
  11615. this.panoRenderer.on(PanoRendererEvents.PanoRenderComplete, this.onPanoRendered.bind(this));
  11616. this.panoRenderer.on(PanoRendererEvents.TileRenderFailure, this.onTileRenderFail.bind(this));
  11617. this.panoRenderer.on(PanoRendererEvents.UploadAttemptedForAllTiles, this.onUploadAttemptedForAllTiles.bind(this));
  11618. }
  11619. }, {
  11620. key: "updateMakerStyle",
  11621. value: function updateMakerStyle(type) {
  11622. if (!this.marker) return;
  11623. if (type == 'animate') {
  11624. this.marker.updateStyle(this.model, 'animate', this);
  11625. } else if (this.hasVideo && this.panoVideoRenderer.ifEnable() || this.panoVideo) {
  11626. this.marker.updateStyle(this.model, 'video', this);
  11627. } else {
  11628. this.marker.updateStyle(this.model, 'normal', this);
  11629. }
  11630. }
  11631. /* updateMarkerVisible(ifShow, player) {
  11632. //video
  11633. if (!this.flagSpot) return
  11634. if (!this.isAligned()) return
  11635. // 强制隐藏
  11636. if (!ifShow) {
  11637. this.marker.visible = false
  11638. return
  11639. }
  11640. // 漫游可行时要全部显示
  11641. if (player.linkEditor && player.linkEditor.setPanoVisible) {
  11642. this.marker.visible = true
  11643. return
  11644. }
  11645. // 没有邻居点时隐藏
  11646. if (!player.linkEditor.checkHasNeighbor(this)) {
  11647. this.marker.visible = false
  11648. // if (player.mode != 'panorama') this.marker.visible = true
  11649. // if (!this.flagSpot) this.marker.visible = false
  11650. return
  11651. }
  11652. // PANORAMA时,当前点位不可视时隐藏
  11653. if (player.currentPano == Viewmode.PANORAMA && !this.neighbourPanos[player.currentPano.id]) {
  11654. this.marker.visible = false
  11655. return
  11656. }
  11657. this.marker.visible = true
  11658. // if (this.flagSpot) this.flagSpot.updateVideoFlagVisible() //注:不用hasVideo来判断,因有的手机没有flagSpot
  11659. } */
  11660. }, {
  11661. key: "createVrMarker",
  11662. value: function createVrMarker(vrTexture, player) {
  11663. var _this3 = this;
  11664. if (this.isAligned()) {
  11665. this.vrMarker = new THREE.Sprite(new THREE.SpriteMaterial({
  11666. color: new THREE.Color('#00c8af'),
  11667. //16777215,
  11668. transparent: !0,
  11669. opacity: 0.55,
  11670. map: vrTexture,
  11671. depthTest: false
  11672. }));
  11673. this.vrMarker.name = 'vrMarker';
  11674. this.vrMarker.scale.set(0.16, 0.16, 1), this.vrMarker.boluoType = 'vr'; //this.vrMarker.position.z = 1,
  11675. this.vrMarker.position.copy(this.position), this.vrMarker.position.y -= 0.2, this.vrMarker.enabled = !0;
  11676. this.vrMarker.visible = !1;
  11677. this.vrMarker.renderOrder = RenderOrder.vrMarker //add
  11678. ;
  11679. this.vrMarker.pano = this, //xzw add
  11680. this.model.vrMarkers.push(this.vrMarker);
  11681. this.model.add(this.vrMarker);
  11682. this.vrMarker.addEventListener('click', function () {
  11683. if (window.VRScreenType != 'portrait') {
  11684. player.flyToPano({
  11685. pano: _this3
  11686. });
  11687. }
  11688. });
  11689. }
  11690. }
  11691. }, {
  11692. key: "hasNeighbor",
  11693. value: function hasNeighbor() {
  11694. var _this4 = this;
  11695. return this.neighbourUUIDs.filter(function (id) {
  11696. return id != _this4.id;
  11697. }).length > 0;
  11698. }
  11699. /**
  11700. * lv yuanyuan
  11701. * 球幕视频
  11702. */
  11703. }, {
  11704. key: "attachToPanoVideoRenderer",
  11705. value: function attachToPanoVideoRenderer(panoVideoRenderer) {
  11706. if (!this.hasVideo) return;
  11707. this.panoVideoRenderer = panoVideoRenderer; //this.panoVideoRenderer.on(PanoVideoRendererEvents.ResumeRender, this.onVideoRendered.bind(this));
  11708. this.on(PanoramaEvents.Enter, panoVideoRenderer.onVideoPanoramasEnter.bind(panoVideoRenderer));
  11709. this.on(PanoramaEvents.Exit, panoVideoRenderer.onVideoPanoramasExit.bind(panoVideoRenderer));
  11710. }
  11711. }, {
  11712. key: "getWaitDeferred",
  11713. value: function getWaitDeferred(size) {
  11714. var t = this.resolutionPromise[this.id];
  11715. t || (t = {}, this.resolutionPromise[this.id] = t);
  11716. var i = t[size];
  11717. return i || (i = {
  11718. deferred: Deferred$1(),
  11719. active: !1
  11720. }, t[size] = i), i;
  11721. }
  11722. }, {
  11723. key: "resetWaitDeferred",
  11724. value: function resetWaitDeferred(e) {
  11725. var t = this.getWaitDeferred(e);
  11726. t.active = !1;
  11727. t.deferred = Deferred$1();
  11728. }
  11729. }, {
  11730. key: "clearWaitDeferreds",
  11731. value: function clearWaitDeferreds() {
  11732. var e = this.resolutionPromise[this.id];
  11733. e || (e = {}, this.resolutionPromise[this.id] = e);
  11734. for (var t in e) {
  11735. if (e.hasOwnProperty(t)) {
  11736. var i = e[t];
  11737. i.active = !1, i.deferred = Deferred$1();
  11738. }
  11739. }
  11740. }
  11741. }, {
  11742. key: "onUploadAttemptedForAllTiles",
  11743. value: function onUploadAttemptedForAllTiles(e, t, i) {
  11744. if (e === this.id) {
  11745. var n = this.qualityManager.getPanoSize(PanoSizeClass.BASE);
  11746. if (t === n && this.shouldRedrawOnBaseLoaded) {
  11747. this.shouldRedrawOnBaseLoaded = !1;
  11748. this.panoRenderer.resetRenderStatus(this.id, !0, !1);
  11749. this.panoRenderer.renderPanoTiles(this.id, null, !0, !0);
  11750. }
  11751. }
  11752. }
  11753. }, {
  11754. key: "onTileRendered",
  11755. value: function onTileRendered(e, t, i, n) {
  11756. e === this.id && this.emit(PanoramaEvents.TileLoaded, t, i, n);
  11757. }
  11758. }, {
  11759. key: "onPanoRendered",
  11760. value: function onPanoRendered(e, t, i, n) {
  11761. if (e === this.id) {
  11762. //console.log('onPanoRendered', this.id)
  11763. this.minimumTiledPanoLoaded = !0;
  11764. this.updateSkyboxForZoomLevel();
  11765. t > this.highestPartialTileRenderOpCompleted && (this.highestPartialTileRenderOpCompleted = t);
  11766. !n && t > this.highestFullTileRenderOpCompleted && (this.highestFullTileRenderOpCompleted = t);
  11767. this.emit('load', t);
  11768. this.model.emit('load', this);
  11769. this.emit(PanoramaEvents.LoadComplete, t, i);
  11770. }
  11771. }
  11772. }, {
  11773. key: "setZoomed",
  11774. value: function setZoomed(e) {
  11775. this.zoomed = e;
  11776. this.updateSkyboxForZoomLevel();
  11777. if (e) {
  11778. //add
  11779. if (this.$app.core.get('QualityManager').navTileClass != '1k') {
  11780. this.model.showHighMap();
  11781. }
  11782. } else {
  11783. this.model.hideHighMap();
  11784. }
  11785. }
  11786. }, {
  11787. key: "ensureSkyboxReadyForRender",
  11788. value: function ensureSkyboxReadyForRender() {
  11789. if (this.tiled) ; else {
  11790. this.solidSkybox.loaded || (this.solidSkybox.needsUpdate = !0);
  11791. this.solidSkybox.loaded = !0;
  11792. }
  11793. }
  11794. }, {
  11795. key: "updateSkyboxForZoomLevel",
  11796. value: function updateSkyboxForZoomLevel() {
  11797. this.minimumTiledPanoLoaded && this.model.updateProjectedPanos(this); //xzw add this
  11798. }
  11799. }, {
  11800. key: "getSkyboxTexture",
  11801. value: function getSkyboxTexture() {
  11802. if (this.tiled) {
  11803. if (this.minimumTiledPanoLoaded) {
  11804. if (this.zoomed && this.qualityManager.maxRenderTargetSize > this.qualityManager.maxNavPanoSize) {
  11805. //change 如果放大后和不放大都是2k就不用这个
  11806. return this.panoRenderer.zoomRenderTarget.texture;
  11807. } else {
  11808. return this.tiledPanoRenderTarget && this.tiledPanoRenderTarget.texture;
  11809. }
  11810. } else {
  11811. return null;
  11812. }
  11813. } else {
  11814. return this.solidSkybox;
  11815. }
  11816. }
  11817. }, {
  11818. key: "onTileRenderFail",
  11819. value: function onTileRenderFail(e, t, i) {
  11820. e === this.id && this.emit(PanoramaEvents.LoadFailed, t);
  11821. } //e是'high'或者'low'
  11822. /* isLoaded(e) {
  11823. if (this.tiled) {
  11824. if (e && 'string' == typeof e) throw new BasicException('Wrong panoSize given to Panorama.isLoaded(); a tiled pano uses PanoSizeClass')
  11825. return !!this.minimumTiledPanoLoaded && (!e || this.highestPartialTileRenderOpCompleted >= e)
  11826. }
  11827. if (e && 'number' == typeof e) {
  11828. console.error('Wrong panoSize given to Panorama.isLoaded(); a non-tiled pano uses high/low.')
  11829. }
  11830. return !!this.solidSkybox.high || e in this.solidSkybox
  11831. } */
  11832. }, {
  11833. key: "isLoaded",
  11834. value: function isLoaded(e) {
  11835. if (this.tiled) {
  11836. if (e && 'string' == typeof e) console.error('Wrong panoSize given to Panorama.isLoaded(); a tiled pano uses PanoSizeClass');
  11837. return !!this.minimumTiledPanoLoaded && (!e || this.highestFullTileRenderOpCompleted >= e); //改:原本是:this.highestPartialTileRenderOpCompleted >= e, 希望这代表全部加载完
  11838. }
  11839. if (e && 'number' == typeof e) console.error('Wrong panoSize given to Panorama.isLoaded(); a non-tiled pano uses high/low.');
  11840. return !!this.solidSkybox.high || e in this.solidSkybox;
  11841. }
  11842. /* loadCube(e) {//旧的加载六张
  11843. if (this.isLoaded(e)) {
  11844. logger.info('Skipping load of pano, already loaded')
  11845. return Deferred().when()
  11846. }
  11847. this.emit('loading', e)
  11848. this.model.emit('loading', this)
  11849. var t = this.getCubemapUrls(this.id, e),
  11850. i = t.filter(function (e) {
  11851. return !e
  11852. })
  11853. if ('low' === e && i.length > 0) {
  11854. logger.info('Pano', this.id, 'not available in low res, loading high res right away')
  11855. e = 'high'
  11856. t = this.getCubemapUrls(this.id, e)
  11857. }
  11858. var n = 0,
  11859. r = [0, 1, 2, 3, 4, 5].map(
  11860. function (e, i, n) {
  11861. return this.loadCubeImage(t[i])
  11862. }.bind(this)
  11863. )
  11864. return Deferred()
  11865. .when(r[0], r[1], r[2], r[3], r[4], r[5])
  11866. .then(
  11867. function (t, i, n, r, o, a) {
  11868. return (
  11869. (this.solidSkybox[e] = [t, i, n, r, o, a]),
  11870. ('high' !== e && this.solidSkybox.high) || ((this.solidSkybox.image = this.solidSkybox[e]), (this.solidSkybox.low = null)),
  11871. (this.solidSkybox.needsUpdate = !0),
  11872. this.emit('load', e),
  11873. this.model.emit('load', this),
  11874. this
  11875. )
  11876. }.bind(this),
  11877. function () {
  11878. logger.error('Downloading cubemap for pano', this.id, 'failed'), (this.failedLoadingAt = Date.now())
  11879. }.bind(this),
  11880. function () {
  11881. return Deferred().when(++n, 6)
  11882. }
  11883. )
  11884. } */
  11885. }, {
  11886. key: "loadCube",
  11887. value: function () {
  11888. var _loadCube = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(imgRatio) {
  11889. var cubeImgUrl, player, ext;
  11890. return regenerator.wrap(function _callee2$(_context2) {
  11891. while (1) {
  11892. switch (_context2.prev = _context2.next) {
  11893. case 0:
  11894. if (!this.isLoaded(imgRatio)) {
  11895. _context2.next = 3;
  11896. break;
  11897. }
  11898. logger$1.info('Skipping load of pano, already loaded');
  11899. return _context2.abrupt("return", Defer.when());
  11900. case 3:
  11901. this.emit('loading', imgRatio);
  11902. this.model.emit('loading', this);
  11903. cubeImgUrl = this.getCubemapUrls(imgRatio);
  11904. if (!(this.panoType == '360view')) {
  11905. _context2.next = 12;
  11906. break;
  11907. }
  11908. //xzw add
  11909. //cubeImgUrl = cubeImgUrl.replace("tiles/", (config.isEdit ? ("panorama_edit/"+this.id) : ("panorama/"+this.id) ) + "/tiles/" );
  11910. player = this.$app.core.get('Player');
  11911. if (player.viewLinkManager.views[this.id]) {
  11912. _context2.next = 10;
  11913. break;
  11914. }
  11915. return _context2.abrupt("return");
  11916. case 10:
  11917. ext = player.viewLinkManager.views[this.id].panoImgVersion;
  11918. ext && (cubeImgUrl += '&' + ext);
  11919. case 12:
  11920. return _context2.abrupt("return", http.getImage(cubeImgUrl).then( /*#__PURE__*/function () {
  11921. var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(imgData) {
  11922. var maxWidth;
  11923. return regenerator.wrap(function _callee$(_context) {
  11924. while (1) {
  11925. switch (_context.prev = _context.next) {
  11926. case 0:
  11927. if (!this.mapSrc) {
  11928. _context.next = 5;
  11929. break;
  11930. }
  11931. //360view edit preview
  11932. maxWidth = browser$1.maybeQilin() ? 4096 : 8192;
  11933. _context.next = 4;
  11934. return common$1.compressImg(imgData, maxWidth);
  11935. case 4:
  11936. imgData = _context.sent;
  11937. case 5:
  11938. this.solidSkybox[imgRatio] = imgData;
  11939. this.solidSkybox.minFilter = THREE.LinearFilter; //1006 防止竖条纹
  11940. // "high" !== imgRatio && this.solidSkybox.high || (this.solidSkybox.image = this.solidSkybox[imgRatio],
  11941. // this.solidSkybox.low = null),
  11942. //1006 防止竖条纹
  11943. // "high" !== imgRatio && this.solidSkybox.high || (this.solidSkybox.image = this.solidSkybox[imgRatio],
  11944. // this.solidSkybox.low = null),
  11945. if ('high' !== imgRatio && this.solidSkybox.high) ; else {
  11946. this.solidSkybox.image = this.solidSkybox[imgRatio];
  11947. this.solidSkybox.low = null;
  11948. }
  11949. this.solidSkybox.dispose(); //xzw add 需要加这句,否则在从外部飞入后,low无法切换为high,会警告Offset overflows texture dimensions. 似乎是因为在使用贴图时切换image尺寸造成的。
  11950. //xzw add 需要加这句,否则在从外部飞入后,low无法切换为high,会警告Offset overflows texture dimensions. 似乎是因为在使用贴图时切换image尺寸造成的。
  11951. this.solidSkybox.needsUpdate = !0;
  11952. this.emit('load', imgRatio);
  11953. this.model.emit('load', this); //this.emit(PanoramaEvents.LoadComplete,/* t, i */) //?
  11954. return _context.abrupt("return", this);
  11955. case 13:
  11956. case "end":
  11957. return _context.stop();
  11958. }
  11959. }
  11960. }, _callee, this);
  11961. }));
  11962. return function (_x2) {
  11963. return _ref2.apply(this, arguments);
  11964. };
  11965. }().bind(this), function () {
  11966. logger$1.error('Downloading cubemap for pano', this.id, 'failed'), this.failedLoadingAt = Date.now();
  11967. }.bind(this), function () {
  11968. console.log('load cubeTex 出现问题?'); //return $.when(++n, 6)//什么?
  11969. }));
  11970. case 13:
  11971. case "end":
  11972. return _context2.stop();
  11973. }
  11974. }
  11975. }, _callee2, this);
  11976. }));
  11977. function loadCube(_x) {
  11978. return _loadCube.apply(this, arguments);
  11979. }
  11980. return loadCube;
  11981. }()
  11982. }, {
  11983. key: "loadCubeImage",
  11984. value: function loadCubeImage(c) {
  11985. var h = Deferred$1(),
  11986. i = new Image();
  11987. return i.onerror = function () {
  11988. h.reject();
  11989. }, i.onload = function () {
  11990. h.resolve(i);
  11991. }, i.crossOrigin = THREE.ImageUtils.crossOrigin, i.src = c, h;
  11992. }
  11993. }, {
  11994. key: "getCubemapUrls",
  11995. value: function getCubemapUrls(type) {
  11996. /* return [2, 4, 0, 5, 1, 3].map(
  11997. function (h) {
  11998. return config.getResourceImageURL(this.model.sid + '/pan/' + type + '/' + this.id + '_skybox' + h + '.jpg')
  11999. }.bind(this)
  12000. ) */
  12001. if (this.mapSrc) return this.mapSrc; // 360 edit
  12002. // 判断随心装同屏需要降低全景图分辨率,否则过渡会卡顿
  12003. var splitup = false;
  12004. if (browser$1.valueFromUrl('m') && browser$1.valueFromUrl('m2')) {
  12005. var metadata = this.$app.store.getValue('metadata');
  12006. if (metadata.sceneFrom == 'sxz') {
  12007. splitup = true;
  12008. }
  12009. }
  12010. return this.$app.resource.getViewImagesURL("pan/".concat(type, "/").concat(this.id, ".jpg").concat(splitup ? '?x-oss-process=image/resize,m_lfit,w_4096' : ''));
  12011. }
  12012. }, {
  12013. key: "worldPosition",
  12014. value: function worldPosition() {
  12015. return this.position;
  12016. }
  12017. }, {
  12018. key: "isAligned",
  12019. value: function isAligned() {
  12020. return !this.panoType; //this.alignmentType === AlignmentType.ALIGNED
  12021. }
  12022. }, {
  12023. key: "updateTileQuality",
  12024. value:
  12025. /* updateTileQuality(state, min) {
  12026. let player = this.$app.core.get('Player')
  12027. let navSize = this.qualityManager.getMaxNavPanoSize()
  12028. if(typeof(state) == 'number'){
  12029. this.curTileQuality = state
  12030. }else if (state == 'full') {
  12031. this.curTileQuality = navSize
  12032. } else if (state == 'standard') {
  12033. this.curTileQuality = player.lowTile == 'level2' ? 512 : player.lowTile ? 1024 : 2048
  12034. } else if (state == 'low') {
  12035. this.curTileQuality = 512
  12036. }
  12037. this.curTileQuality = Math.min(this.curTileQuality, navSize)
  12038. if (min) this.curTileQuality = Math.min(this.curTileQuality, min)
  12039. return this.curTileQuality
  12040. } */
  12041. function updateTileQuality(size) {
  12042. this.$app.core.get('Player');
  12043. var navSize = this.qualityManager.getMaxNavPanoSize();
  12044. this.curTileQuality = Math.min(size, navSize);
  12045. }
  12046. }, {
  12047. key: "getVideoFilter",
  12048. value: function getVideoFilter(type) {
  12049. var _this5 = this;
  12050. //视频漫游点角度范围内隐藏遮挡物
  12051. var panoVideoFilter, angle, dir;
  12052. if (this.hasVideo && this.$app.core.get('PanoVideoRenderer').ifEnable()) {
  12053. if (this.videoInfo.dir) {
  12054. dir = this.videoInfo.dir.clone();
  12055. angle = THREE.MathUtils.degToRad(this.videoInfo.hfov / 2);
  12056. } else {
  12057. var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(this.model.supportsTiles ? 90 : 180));
  12058. var lookAtPoint = Vectors$1.FORWARD.clone().applyQuaternion(qua.multiply(this.quaternion)).add(this.position);
  12059. dir = lookAtPoint.clone().sub(this.position);
  12060. angle = THREE.MathUtils.degToRad(65 / 2);
  12061. }
  12062. } else if (this.panoVideo) {
  12063. dir = this.panoVideo.dir.clone();
  12064. angle = THREE.MathUtils.degToRad(this.panoVideo.hfov / 2);
  12065. }
  12066. if (dir) {
  12067. if (type == 'across') {
  12068. //传送两个点,看是否在这两个点区间内包含视频
  12069. panoVideoFilter = function panoVideoFilter(p1, p2) {
  12070. var dir1 = new THREE.Vector3().subVectors(p1, _this5.position).setY(0).normalize();
  12071. var dir2 = new THREE.Vector3().subVectors(p2, _this5.position).setY(0).normalize();
  12072. var midVec = new THREE.Vector3().addVectors(dir1, dir2).normalize(); //以此反向假扮视频区域
  12073. var angle_ = dir1.angleTo(midVec);
  12074. var midPoint = new THREE.Vector3().addVectors(_this5.position, dir); //视频中点
  12075. return Panorama.filters.isInFanAngle(_this5.position, midVec, angle_)(midPoint); //看视频中点是否落在p1p2区间
  12076. };
  12077. } else {
  12078. panoVideoFilter = Panorama.filters.isInFanAngle(this.position, dir, angle);
  12079. }
  12080. }
  12081. return panoVideoFilter;
  12082. }
  12083. }, {
  12084. key: "addLabel",
  12085. value: function addLabel() {
  12086. //圈内的数字
  12087. this.label = new TextSprite(Object.assign({
  12088. player: this.$app.core.get('Player')
  12089. }, labelProp$1, {
  12090. text: this.appId
  12091. }));
  12092. var s = math$2.linearClamp(this.label.text.length, 2, 6, 0.4, 0.2); //应该不会多于6位数
  12093. this.label.scale.set(s, s, s);
  12094. this.marker.add(this.label);
  12095. }
  12096. }, {
  12097. key: "addLabel2",
  12098. value: function addLabel2() {
  12099. //漂浮的数字
  12100. this.removeLabel();
  12101. this.label2 = new TextSprite(Object.assign({
  12102. player: this.$app.core.get('Player'),
  12103. sizeInfo: {
  12104. minSize: 50,
  12105. maxSize: 300,
  12106. nearBound: 0.2,
  12107. farBound: Math.max(20, this.model.size.length() / 3),
  12108. farBoundPlan: 250
  12109. }
  12110. }, labelProp2, {
  12111. text: "".concat(this.id, "-f").concat(this.floorIndex)
  12112. })); //this.label2.sprite.material.depthTest = true
  12113. var position = this.floorPosition.clone();
  12114. position.y += 0.4;
  12115. this.label2.position.copy(position);
  12116. this.floor.add(this.label2);
  12117. }
  12118. }, {
  12119. key: "removeLabel",
  12120. value: function removeLabel() {
  12121. this.label2 && (this.floor.remove(this.label2), this.label2.material.dispose(), this.label2 = null);
  12122. }
  12123. }]);
  12124. return Panorama;
  12125. }(EventEmitter);
  12126. Panorama.raycastsSkipped = 0;
  12127. Panorama.raycastsDone = 0;
  12128. Panorama.filters = {
  12129. inDirection: function inDirection(e, t, i) {
  12130. return function (n) {
  12131. var r = n.position.clone().sub(e).normalize();
  12132. return r.dot(t) > i;
  12133. };
  12134. },
  12135. inFloorDirection: function inFloorDirection(e, t, i) {
  12136. return function (n) {
  12137. var r = n.floorPosition.clone().sub(e).normalize();
  12138. return r.dot(t) > i;
  12139. };
  12140. },
  12141. inFloorDirection_2d: function inFloorDirection_2d(e, t, i) {
  12142. return function (n) {
  12143. var origin = new THREE.Vector2(n.floorPosition.x, n.floorPosition.z);
  12144. var target = new THREE.Vector2(e.x, e.z); //var r = n.floorPosition.clone().sub(e).normalize()
  12145. var r = origin.sub(target).normalize();
  12146. return r.dot(new THREE.Vector2(t.x, t.z)) > i;
  12147. };
  12148. },
  12149. inPanoDirection: function inPanoDirection(e, t, i) {
  12150. return i = settings$3.navigation.panoScores ? settings$3.navigation.filterStrictness : i, function (n) {
  12151. var r = n.floorPosition.clone().sub(e).normalize(),
  12152. o = n.position.clone().sub(e).normalize();
  12153. return r.dot(t) > i || o.dot(t) > i;
  12154. };
  12155. },
  12156. atFloor: function atFloor(e) {
  12157. return function (t) {
  12158. return !e || t.floor === e;
  12159. };
  12160. },
  12161. not: function not(e) {
  12162. return function (t) {
  12163. return t !== e;
  12164. };
  12165. },
  12166. notIn: function notIn(e) {
  12167. return function (t) {
  12168. return e.indexOf(t) === -1;
  12169. };
  12170. },
  12171. isLoaded: function isLoaded() {
  12172. return function (e) {
  12173. return e.isLoaded();
  12174. };
  12175. },
  12176. isNotLoaded: function isNotLoaded() {
  12177. return function (e) {
  12178. return !e.isLoaded();
  12179. };
  12180. },
  12181. isCloseEnoughTo: function isCloseEnoughTo(e, t) {
  12182. return function (i) {
  12183. return e.distanceTo(i.floorPosition) < t;
  12184. };
  12185. },
  12186. isClampDisSquaredTo: function isClampDisSquaredTo(e, min, max) {
  12187. //add
  12188. return function (i) {
  12189. var dis = e.distanceToSquared(i.floorPosition);
  12190. return dis > min && dis < max;
  12191. };
  12192. },
  12193. hasMinimumHeightDifferenceTo: function hasMinimumHeightDifferenceTo(e, t) {
  12194. return function (i) {
  12195. return Math.abs(i.position.y - e.y) > t;
  12196. };
  12197. },
  12198. isNotBehindNormal: function isNotBehindNormal(e, t) {
  12199. var i = new THREE.Vector3();
  12200. return t = t.clone(), function (n) {
  12201. var r = i.copy(n.position).sub(e).normalize();
  12202. return r.dot(t) > 0;
  12203. };
  12204. },
  12205. isNeighbourPanoTo: function isNeighbourPanoTo(e) {
  12206. return function (t) {
  12207. return !e || !e.neighbourPanos || !!e.neighbourPanos[t.id];
  12208. };
  12209. },
  12210. isNeighbourOfNeighbourTo: function isNeighbourOfNeighbourTo(e) {
  12211. return function (t) {
  12212. return !!e.neighbourPanos[t.id] || e.neighbourUUIDs.some(function (i) {
  12213. var n = e.model.panos.get(i);
  12214. return !!n && n.neighbourPanos[t.id];
  12215. });
  12216. };
  12217. },
  12218. isNotRecentlyFailed: function isNotRecentlyFailed(e) {
  12219. return function (t) {
  12220. return Date.now() - t.failedLoadingAt > e;
  12221. };
  12222. },
  12223. isOnVisibleFloor: function isOnVisibleFloor() {
  12224. return function (e) {
  12225. return !e.floor.hidden;
  12226. };
  12227. },
  12228. isPanoAligned: function isPanoAligned() {
  12229. return function (e) {
  12230. return e.isAligned();
  12231. };
  12232. },
  12233. /* isInFanAngle: function (curPos, dir, maxAngle) {
  12234. //是否和中心方向的dir的角度不超过maxAngle
  12235. return function (position) {
  12236. var v1 = dir.setY(0)
  12237. var v2 = position.clone().sub(curPos).setY(0)
  12238. return v1.angleTo(v2) <= maxAngle
  12239. }
  12240. }, */
  12241. isInFanAngle: function isInFanAngle(curPos, dir, maxAngle) {
  12242. //是否和中心方向的dir的角度不超过maxAngle
  12243. return function (position) {
  12244. var v1 = dir.setY(0);
  12245. var v2 = position.clone().sub(curPos).setY(0);
  12246. return v1.angleTo(v2) <= maxAngle;
  12247. };
  12248. }
  12249. };
  12250. Panorama.sortFunctions = {
  12251. distanceToPoint: function distanceToPoint(e) {
  12252. return function (t, i) {
  12253. return t.position.distanceTo(e) - i.position.distanceTo(e);
  12254. };
  12255. },
  12256. floorDistanceToPoint: function floorDistanceToPoint(e) {
  12257. return function (t, i) {
  12258. return t.floorPosition.distanceTo(e) - i.floorPosition.distanceTo(e);
  12259. };
  12260. },
  12261. choose: function choose(e) {
  12262. return function (t, i) {
  12263. return e.id === t.id ? -1 : e.id === i.id ? 1 : 0;
  12264. };
  12265. }
  12266. };
  12267. Panorama.scoreFunctions = {
  12268. distance: function distance(e, t) {
  12269. return t = t || settings$3.navigation.distanceFactor, function (i) {
  12270. return e ? e.position.distanceTo(i.position) * t : 0;
  12271. };
  12272. },
  12273. distanceSquared: function distanceSquared(e, t) {
  12274. return t = t || settings$3.navigation.distanceFactor, function (i) {
  12275. return e ? e.position.distanceToSquared(i.position) * t : 0;
  12276. };
  12277. },
  12278. direction: function direction(e, t, r) {
  12279. return function (i) {
  12280. var n = i.position.clone().sub(e).normalize();
  12281. return n.dot(t) * (r || settings$3.navigation.directionFactor);
  12282. };
  12283. },
  12284. directionFloor: function directionFloor(e, t) {
  12285. //add
  12286. return function (i) {
  12287. var n = i.floorPosition.clone().sub(e).normalize();
  12288. return n.dot(t) * settings$3.navigation.directionFactor;
  12289. };
  12290. },
  12291. angle: function angle(e, t) {
  12292. return function (i) {
  12293. var n = i.position.clone().sub(e).normalize();
  12294. return n.angleTo(t) * settings$3.navigation.angleFactor;
  12295. };
  12296. },
  12297. inFieldOfView: function inFieldOfView(e, t) {
  12298. return function (i) {
  12299. var n = i.position.clone().sub(e).normalize();
  12300. return n.dot(t) > 0.75 ? 10 : -1;
  12301. };
  12302. },
  12303. optionality: function optionality(e) {
  12304. return function (t) {
  12305. var i = t.neighbourUUIDs.filter(function (t) {
  12306. return !(t in e.neighbourUUIDs) && t !== e.id;
  12307. });
  12308. return i.length * settings$3.navigation.optionalityFactor;
  12309. };
  12310. },
  12311. penalizeHeightDifferenceUnder: function penalizeHeightDifferenceUnder(e, t) {
  12312. return function (i) {
  12313. return e.y - i.position.y < t ? -20 : 0;
  12314. };
  12315. }
  12316. };
  12317. 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); }; }
  12318. 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; } }
  12319. var PanoramaCollection = /*#__PURE__*/function (_IndexedCollection) {
  12320. _inherits(PanoramaCollection, _IndexedCollection);
  12321. var _super = _createSuper$1J(PanoramaCollection);
  12322. function PanoramaCollection(app) {
  12323. var _this;
  12324. _classCallCheck(this, PanoramaCollection);
  12325. _this = _super.call(this);
  12326. _this.neighbourMap = {};
  12327. _this.map = null;
  12328. _this.animatePanoId = null;
  12329. app && app.TourManager.player.then(function (player) {
  12330. player.on('play2', function () {
  12331. _this.list.forEach(function (e) {
  12332. e.label && common$1.updateVisible(e.label, 'recordTour', false); //为了防止录屏时将点位录入 2023.10.8
  12333. });
  12334. });
  12335. player.on('end', function () {
  12336. _this.list.forEach(function (e) {
  12337. e.label && common$1.updateVisible(e.label, 'recordTour', true);
  12338. });
  12339. });
  12340. player.on('pause', function () {
  12341. _this.list.forEach(function (e) {
  12342. e.label && common$1.updateVisible(e.label, 'recordTour', true);
  12343. });
  12344. });
  12345. });
  12346. return _this;
  12347. }
  12348. _createClass(PanoramaCollection, [{
  12349. key: "getIndex",
  12350. value: function getIndex(pano) {
  12351. return pano.id;
  12352. }
  12353. }, {
  12354. key: "find",
  12355. value: function find(e, t) {
  12356. var i = common$1.filterAll(this.list, e);
  12357. return 0 === i.length ? null : (t && t.forEach(function (e) {
  12358. i = common$1.stableSort(i, e);
  12359. }), i[0]);
  12360. }
  12361. /* sortByScore(e, t) {
  12362. var i = common.filterAll(this.list, e)
  12363. return 0 === i.length
  12364. ? null
  12365. : (i = i
  12366. .map(function (e) {
  12367. return {
  12368. pano: e,
  12369. score: t.reduce(function (t, i) {
  12370. return t + i(e)
  12371. }, 0),
  12372. }
  12373. })
  12374. .sort(function (e, t) {
  12375. return t.score - e.score
  12376. }))
  12377. } */
  12378. }, {
  12379. key: "lowestByScore",
  12380. value: function lowestByScore(e, t, i) {
  12381. return this.findRankedByScore(0, e, t, i);
  12382. }
  12383. }, {
  12384. key: "findRankedByScore",
  12385. value: function findRankedByScore(e, t, i, n) {
  12386. n && (n.candidates = null, n.pano = null), e || (e = 0);
  12387. var r = common$1.sortByScore(this.list, t, i);
  12388. return !r || 0 === r.length || e >= r.length ? null : (n && (n.candidates = r, n.pano = r[e].item), r[e].item);
  12389. }
  12390. }, {
  12391. key: "getNeighbours",
  12392. value: function getNeighbours(pano) {
  12393. return this.neighbourMap[pano.id];
  12394. }
  12395. }, {
  12396. key: "setNeighbour",
  12397. value: function setNeighbour(pano, neighbourPano, isNeighbour) {
  12398. this.neighbourMap[pano.id] || (this.neighbourMap[pano.id] = {});
  12399. this.neighbourMap[neighbourPano.id] || (this.neighbourMap[neighbourPano.id] = {});
  12400. this.neighbourMap[pano.id][pano.id] = !0;
  12401. this.neighbourMap[neighbourPano.id][neighbourPano.id] = !0;
  12402. this.neighbourMap[pano.id][neighbourPano.id] = isNeighbour;
  12403. this.neighbourMap[neighbourPano.id][pano.id] = isNeighbour;
  12404. return this.neighbourMap[pano.id];
  12405. }
  12406. }, {
  12407. key: "findClosest",
  12408. value: function findClosest(position, t) {
  12409. var func = [Panorama.filters.isPanoAligned()];
  12410. t && func.push(Panorama.filters.inDirection(position, t, 0.75));
  12411. return this.find(func, [Panorama.sortFunctions.distanceToPoint(position)]);
  12412. }
  12413. }, {
  12414. key: "fadeMarkerOpacity",
  12415. value: function fadeMarkerOpacity(e, t, gr) {
  12416. //许钟文 改
  12417. transitions$1.cancelById('fadeMarkerOpacity');
  12418. var n = this.list.findIndex(function (e) {
  12419. //why? 难道没有marker的pano吗 findeIndex:获取数组中函数返回值不为fasle的第一个元素索引位置
  12420. return e.marker;
  12421. });
  12422. if (n < 0) {
  12423. logger.info('marker findIndex<0');
  12424. return;
  12425. }
  12426. var group;
  12427. var tran = function tran(list, index) {
  12428. list.member = list.member.filter(function (m) {
  12429. return m.marker && m.marker.material.opacity != list.toOp;
  12430. });
  12431. transitions$1.trigger({
  12432. func: function (e, t) {
  12433. //e:0-1
  12434. list.member.forEach(function (m) {
  12435. var o = m.marker.oldOpacity;
  12436. var i = o + e * (list.toOp - o);
  12437. m.marker && (m.marker.material.opacity = i);
  12438. });
  12439. }.bind(this),
  12440. duration: void 0 == t ? settings$3.markerOpacityTransitionTime : t,
  12441. name: '_fpm_' + index,
  12442. id: 'fadeMarkerOpacity'
  12443. });
  12444. };
  12445. this.forEach(function (e) {
  12446. //先记录旧的opacity
  12447. e.marker && (e.marker.oldOpacity = e.marker.material.opacity);
  12448. });
  12449. e = void 0 == e ? settings$3.panorama.markerOpacity : e;
  12450. if (e > 0 && gr) {
  12451. group = gr;
  12452. } else {
  12453. group = [{
  12454. member: this.list,
  12455. toOp: e
  12456. }];
  12457. }
  12458. for (var i = 0; i < group.length; i++) {
  12459. tran(group[i], i);
  12460. }
  12461. }
  12462. }, {
  12463. key: "closestPanoTowardPoint",
  12464. value: function closestPanoTowardPoint(o) {
  12465. //改自closestPanoTowardTag by:xzw
  12466. var point = o.point,
  12467. require = o.require || [],
  12468. temp = {
  12469. position: point
  12470. },
  12471. a = new THREE.Vector3(),
  12472. rank = o.rank || [Panorama.scoreFunctions.distanceSquared(temp, -2)];
  12473. o.force;
  12474. var getAll = o.getAll,
  12475. angleTolerDecrease = o.angleTolerDecrease || 2; // let player = window.kankan.core.get('Player')
  12476. // if (player.linkEditor && !player.linkEditor.noPanoHasNeighbor) {
  12477. // //xzw add 如果不是全孤立点的话,就要避开孤立点
  12478. // require.push(pano => {
  12479. // return player.linkEditor.checkHasNeighbor(pano)
  12480. // })
  12481. // }
  12482. require.push(Panorama.filters.isPanoAligned());
  12483. require.push(function (pano) {
  12484. return pano.hasNeighbor();
  12485. /* || pano == this.$app.core.get('Scene').firstView.pano */
  12486. });
  12487. require.push(function (pano) {
  12488. a.copy(point).sub(pano.position);
  12489. var angle = -THREE.MathUtils.radToDeg(Math.atan(a.y / Math.sqrt(a.x * a.x + a.z * a.z))),
  12490. tolerance = settings$3.insideFOV / 2 - angleTolerDecrease;
  12491. var a1 = settings$3.insideLookLimitDown - tolerance;
  12492. var a2 = settings$3.insideLookLimitUp + tolerance;
  12493. return a1 < angle && angle < a2;
  12494. /* if(angle < settings.insideLookLimitDown){
  12495. return -10 * (angle-settings.insideLookLimitDown)
  12496. }else if(angle > settings.insideLookLimitUp){
  12497. return -10 * (angle-settings.insideLookLimitDown)
  12498. } */
  12499. });
  12500. if (o.floor) require.push(Panorama.filters.atFloor(o.floor));
  12501. var g = common$1.sortByScore(this.list, require, rank); //console.log(g)
  12502. if (getAll) return g;
  12503. return g && g.length > 0 && g[0].item;
  12504. }
  12505. }]);
  12506. return PanoramaCollection;
  12507. }(IndexedCollection);
  12508. 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); }; }
  12509. 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; } }
  12510. //skybox
  12511. var BoundingMesh = /*#__PURE__*/function (_THREE$Mesh) {
  12512. _inherits(BoundingMesh, _THREE$Mesh);
  12513. var _super = _createSuper$1I(BoundingMesh);
  12514. function BoundingMesh(boundingBox, material) {
  12515. var _this;
  12516. var skyHeight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 50;
  12517. _classCallCheck(this, BoundingMesh);
  12518. //boundingBox = boundingBox.clone().expandByScalar(0.01) //许钟文改: 稍微放大了一丢丢的,避免和其他mesh冲突闪烁。尤其在飞入飞出时,地面闪烁一下,好像是和chunk冲突。过去是和marker冲突。
  12519. //大部分没有mesh的都是户外,所以放大些,作为天空盒背景. 另外地板因为可能破损,所以position向上提升使最低高度不变
  12520. boundingBox = boundingBox.clone().expandByVector(new THREE.Vector3(skyHeight, skyHeight, skyHeight));
  12521. var size = new THREE.Vector3();
  12522. boundingBox.getSize(size);
  12523. var geometry = new THREE.BoxGeometry(size.x, size.y, size.z); //geometry.boundingBox = boundingBox; //xzw delete 较早:这句加上不对。因为后面算鼠标与skybox交点时 要用到的是boundingbox加上position才是真实skybox真实位置,所以boundingbox要居中的,而不应该是整体模型所在的位置。
  12524. geometry.computeBoundingBox(); //需要重新计算对称的bounding, 在获取鼠标交点时需要。否则热点加不上
  12525. _this = _super.call(this, geometry, material);
  12526. var center = new THREE.Vector3();
  12527. boundingBox.getCenter(center);
  12528. skyHeight && (center.y += skyHeight - 0.1);
  12529. _this.position.copy(center);
  12530. _this.frustumCulled = !1; //flag && this.add(new THREE.WireframeHelper(this))
  12531. return _this;
  12532. }
  12533. return BoundingMesh;
  12534. }(THREE.Mesh);
  12535. 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); }; }
  12536. 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; } }
  12537. /**
  12538. * 全景贴图材质
  12539. */
  12540. var ModelTextureMaterial = /*#__PURE__*/function (_THREE$RawShaderMater) {
  12541. _inherits(ModelTextureMaterial, _THREE$RawShaderMater);
  12542. var _super = _createSuper$1H(ModelTextureMaterial);
  12543. /* constructor(parameters) {
  12544. parameters = parameters || {}
  12545. super(
  12546. common.extendObject(
  12547. {
  12548. fragmentShader: shaders.model.fragmentShader,
  12549. vertexShader: shaders.model.vertexShader,
  12550. uniforms: THREE.UniformsUtils.clone(shaders.model.uniforms),
  12551. name: 'ModelTextureMaterial',
  12552. },
  12553. parameters
  12554. )
  12555. )
  12556. } */
  12557. function ModelTextureMaterial(parameters, matName) {
  12558. var _this;
  12559. _classCallCheck(this, ModelTextureMaterial);
  12560. parameters = parameters || {}; //使用的是单张全景图,不是cube型的
  12561. if (parameters.not_Cube) {
  12562. var defines = parameters.defines || {};
  12563. defines.Not_Cube = '';
  12564. parameters.defines = defines;
  12565. }
  12566. var matName = matName || 'model';
  12567. _this = _super.call(this, common$1.extendObject({
  12568. fragmentShader: shaders[matName].fragmentShader,
  12569. vertexShader: shaders[matName].vertexShader,
  12570. uniforms: THREE.UniformsUtils.clone(shaders[matName].uniforms),
  12571. name: 'ModelTextureMaterial'
  12572. }, parameters));
  12573. if (_this.uniforms.progress) {
  12574. var progress = 0;
  12575. Object.defineProperty(_this.uniforms.progress, 'value', {
  12576. get: function get() {
  12577. return progress;
  12578. },
  12579. set: function set(e) {
  12580. if (e < 1) {
  12581. if (!('usePanoMap0' in _this.defines)) {
  12582. _this.defines.usePanoMap0 = '';
  12583. _this.needsUpdate = true;
  12584. }
  12585. } else {
  12586. if ('usePanoMap0' in _this.defines) {
  12587. delete _this.defines.usePanoMap0;
  12588. _this.needsUpdate = true;
  12589. }
  12590. }
  12591. progress = e;
  12592. }
  12593. });
  12594. } //-------------------------------------
  12595. return _this;
  12596. }
  12597. /**
  12598. * 用于点位跳转
  12599. * 跳转后,pano0和pano1都会被赋值为currentPano,uniforms.progress由0过渡为1
  12600. * @param {*} pano0 跳转前的点位
  12601. * @param {*} pano1 跳转后的点位
  12602. * @param {*} flag 将progress重置为0
  12603. */
  12604. _createClass(ModelTextureMaterial, [{
  12605. key: "setProjectedPanos",
  12606. value: function setProjectedPanos(pano0, pano1, flag) {
  12607. var _this2 = this;
  12608. if (!('BasePanoMap' in this.defines)) {
  12609. flag && (this.uniforms.progress.value = 0); // pano0的贴图、坐标、旋转
  12610. pano0.ensureSkyboxReadyForRender();
  12611. pano1.ensureSkyboxReadyForRender();
  12612. this.updateTexDefines(pano0, pano1); // 判断是全景图还是六面图
  12613. }
  12614. this.uniforms.pano0Map.value = pano0.getSkyboxTexture();
  12615. this.uniforms.pano0Position.value.copy(pano0.position);
  12616. this.uniforms.pano0Matrix.value.copy(pano0.matrixWorld);
  12617. this.uniforms.pano1Map.value = pano1.getSkyboxTexture();
  12618. this.uniforms.pano1Position.value.copy(pano1.position);
  12619. this.uniforms.pano1Matrix.value.copy(pano1.matrixWorld);
  12620. delete this.defines['HasVideo'];
  12621. if (pano1.hasVideo) {
  12622. // 存在球幕视频
  12623. this.uniforms.exposure.value = pano1.videoInfo.exposure || 1; // 曝光
  12624. this.uniforms.blendFov.value = pano1.videoInfo.blendFov || 5; // 目前全都取默认值
  12625. // 球幕区域
  12626. 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);
  12627. this.defines['VideoMapping'] = pano1.videoInfo.mapping || 0; // 球幕视频与全景图混合方式
  12628. this.defines['HasVideo'] = pano1.videoInfo.cameraType || 8; // 业务需求:bFlag用于判断当球幕视频宽大于高时,需要翻转90度
  12629. var videoPlayer = pano1.panoVideoRenderer.videoPlayer;
  12630. var video = videoPlayer._resource ? videoPlayer._resource.get(pano1.id).video : videoPlayer.instances.get(pano1.id).videoElement;
  12631. if (video.readyState == 0) {
  12632. video.addEventListener('resize', function (ev) {
  12633. _this2.uniforms.bFlag.value = video.videoWidth > video.videoHeight ? 1 : 0;
  12634. }, false);
  12635. } else this.uniforms.bFlag.value = video.videoWidth > video.videoHeight ? 1 : 0;
  12636. } // 没有hasFilter时,会绕过滤镜相关代码,节省gpu
  12637. // 考虑到过渡效果,pano1和pano0任意一个hasFilter,就要执行滤镜代码
  12638. if (pano1.hasFilter || pano0.hasFilter) {
  12639. this.defines['hasFilter'] = true;
  12640. } else {
  12641. delete this.defines['hasFilter'];
  12642. }
  12643. this.needsUpdate = true; //console.log('setProjectedPanos', pano0.id, pano1.id)
  12644. } // 判断pano贴图是全景图还是六面图
  12645. }, {
  12646. key: "updateTexDefines",
  12647. value: function updateTexDefines(pano0, pano1) {
  12648. var _this3 = this;
  12649. var hasChanged = false;
  12650. var change = function change(pano, index) {
  12651. if (!pano.tiled) {
  12652. // 全景图
  12653. if (_this3.defines['Not_Cube_' + index] == void 0) {
  12654. _this3.defines['Not_Cube_' + index] = '';
  12655. hasChanged = true;
  12656. }
  12657. } else {
  12658. // 六面图
  12659. if (_this3.defines['Not_Cube_' + index] != void 0) {
  12660. delete _this3.defines['Not_Cube_' + index];
  12661. hasChanged = true;
  12662. }
  12663. }
  12664. };
  12665. change(pano0, 0);
  12666. change(pano1, 1);
  12667. hasChanged && (this.needsUpdate = true);
  12668. }
  12669. }]);
  12670. return ModelTextureMaterial;
  12671. }(THREE.RawShaderMaterial);
  12672. 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); }; }
  12673. 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; } }
  12674. var BoundingTextureSkybox = /*#__PURE__*/function (_BoundingMesh) {
  12675. _inherits(BoundingTextureSkybox, _BoundingMesh);
  12676. var _super = _createSuper$1G(BoundingTextureSkybox);
  12677. function BoundingTextureSkybox(bounding, skyHeight) {
  12678. var _this;
  12679. _classCallCheck(this, BoundingTextureSkybox);
  12680. logger$1.time('Computing a nice bounding cubemap');
  12681. var material = new ModelTextureMaterial({
  12682. side: THREE.BackSide,
  12683. transparent: !0
  12684. });
  12685. material.uniforms.modelAlpha.value = 0;
  12686. material.uniforms.opacity.value = 1 - settings$3.modelAlpha;
  12687. _this = _super.call(this, bounding, material, skyHeight);
  12688. _this.renderOrder = RenderOrder.boundingSkybox;
  12689. logger$1.timeEnd('Computing a nice bounding cubemap');
  12690. return _this;
  12691. }
  12692. return BoundingTextureSkybox;
  12693. }(BoundingMesh);
  12694. function E$1() {// Keep this empty so it's easier to inherit from
  12695. // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
  12696. }
  12697. E$1.prototype = {
  12698. on: function on(name, callback, ctx) {
  12699. var e = this.e || (this.e = {});
  12700. (e[name] || (e[name] = [])).push({
  12701. fn: callback,
  12702. ctx: ctx
  12703. });
  12704. return this;
  12705. },
  12706. once: function once(name, callback, ctx) {
  12707. var self = this;
  12708. function listener() {
  12709. self.off(name, listener);
  12710. callback.apply(ctx, arguments);
  12711. }
  12712. listener._ = callback;
  12713. return this.on(name, listener, ctx);
  12714. },
  12715. emit: function emit(name) {
  12716. var data = [].slice.call(arguments, 1);
  12717. var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
  12718. var i = 0;
  12719. var len = evtArr.length;
  12720. for (i; i < len; i++) {
  12721. evtArr[i].fn.apply(evtArr[i].ctx, data);
  12722. }
  12723. return this;
  12724. },
  12725. off: function off(name, callback) {
  12726. var e = this.e || (this.e = {});
  12727. var evts = e[name];
  12728. var liveEvents = [];
  12729. if (evts && callback) {
  12730. for (var i = 0, len = evts.length; i < len; i++) {
  12731. if (evts[i].fn !== callback && evts[i].fn._ !== callback) liveEvents.push(evts[i]);
  12732. }
  12733. } // Remove event from queue to prevent memory leak
  12734. // Suggested by https://github.com/lazd
  12735. // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
  12736. liveEvents.length ? e[name] = liveEvents : delete e[name];
  12737. return this;
  12738. }
  12739. };
  12740. var tinyEmitter = E$1;
  12741. var TinyEmitter = E$1;
  12742. tinyEmitter.TinyEmitter = TinyEmitter;
  12743. /*
  12744. * @Author: Rindy
  12745. * @Date: 2021-05-07 15:52:29
  12746. * @LastEditors: Rindy
  12747. * @LastEditTime: 2021-05-07 15:53:00
  12748. * @Description: 注释
  12749. */
  12750. /**
  12751. * 地面logo
  12752. */
  12753. var floorLogo = {
  12754. uniforms: {
  12755. map: {
  12756. type: 't',
  12757. value: null
  12758. },
  12759. opacity: {
  12760. type: 'f',
  12761. value: 1
  12762. },
  12763. opaRadius: {
  12764. //百分比
  12765. type: 'f',
  12766. value: 0.2
  12767. }
  12768. },
  12769. vertexShader: "\n varying vec2 vUv;\n void main() {\n vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",
  12770. 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 "
  12771. };
  12772. 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); }; }
  12773. 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; } }
  12774. var texLoader$2 = new THREE.TextureLoader();
  12775. var settings$1 = {
  12776. floorLogo: {
  12777. name: 'floorLogoImg.png',
  12778. geometry: new THREE.Vector4(2.5, 2.5, 1, 1),
  12779. size: 100,
  12780. position: new THREE.Vector3(0, -1.49, 0),
  12781. renderOrder: 99
  12782. }
  12783. };
  12784. var planeGeo$5 = new THREE.PlaneGeometry(2.5, 2.5, 1, 1);
  12785. var FloorLogos = /*#__PURE__*/function (_Emiter) {
  12786. _inherits(FloorLogos, _Emiter);
  12787. var _super = _createSuper$1F(FloorLogos);
  12788. function FloorLogos(app) {
  12789. var _this;
  12790. _classCallCheck(this, FloorLogos);
  12791. _this = _super.call(this);
  12792. _this.changefloorLogoOpa = function (o) {
  12793. var logo = o.index == 0 ? this.firstLogo : this.secondLogo;
  12794. transitions$1.cancelById('flOpa_' + o.index); //先停止之前该logo的透明度变化
  12795. if (o.from != void 0) logo.material.opacity = o.from; //初始透明度
  12796. if (!o.dur) {
  12797. //立刻
  12798. logo.material.opacity = o.opa;
  12799. } else {
  12800. transitions$1.start(lerp.property(logo.material, 'opacity', o.opa), o.dur || 0, null, o.delay || 0, easing['easeInQuad'], 'changefloorLogoOpa', 'flOpa_' + o.index);
  12801. }
  12802. };
  12803. _this.updateFloorlogo = function () {
  12804. new THREE.Quaternion();
  12805. return function (Q) {
  12806. if (this.fixDirection) return;
  12807. if (!Q || !this.ready) return;
  12808. var rotation, visible;
  12809. if (this.firstLogo.visible || this.firstLogo.material.opacity != 0 || this.secondLogo.visible || this.secondLogo.material.opacity != 0) {
  12810. visible = true;
  12811. }
  12812. if (!visible) {
  12813. return; //如果两个都不可见,就不更改,如果有一个可见,就都改
  12814. } //因为导览时有直接更改quaternion而不是lon的情况 所以更改为下面的
  12815. var yaw = this.app.core.get('Player').yaw - Math.PI / 2; //水平方向朝向
  12816. if (this.isCompass && this.compassArrow1) {
  12817. rotation = new THREE.Euler(0, 0, yaw - this.firstLogo.rotation.z);
  12818. this.compassArrow1.rotation.copy(rotation);
  12819. this.compassArrow2.rotation.copy(rotation);
  12820. } else {
  12821. rotation = new THREE.Euler(-Math.PI / 2, 0, yaw);
  12822. this.firstLogo.rotation.copy(rotation);
  12823. this.secondLogo.rotation.copy(rotation);
  12824. } //console.log('floorlogo changed')
  12825. };
  12826. }();
  12827. _this.setDir = function (angle) {
  12828. //根据compass设置北方向
  12829. if (!this.fixDirection) return;
  12830. this.firstLogo.rotation.z = THREE.MathUtils.degToRad(-angle);
  12831. this.secondLogo.rotation.z = THREE.MathUtils.degToRad(-angle);
  12832. };
  12833. _this.app = app;
  12834. _this.ready = false;
  12835. _this.fixDirection = false; //固定东南西北朝向
  12836. _this.baseSize = 1;
  12837. _this.curSize = 1;
  12838. _this.firstLogo = new THREE.Mesh(planeGeo$5, new THREE.MeshBasicMaterial({
  12839. transparent: true,
  12840. depthWrite: !1,
  12841. depthTest: false //改 在chunk\skybox外也可看到
  12842. }));
  12843. _this.secondLogo = _this.firstLogo.clone();
  12844. _this.secondLogo.material = _this.firstLogo.material.clone();
  12845. common$1.updateVisible(_this.secondLogo, 'flyToPano', false);
  12846. _this.app.store.on('flooruser', function (data) {
  12847. //在cad页面 点击保存后,compass更新旋转后这里也同步
  12848. setTimeout(function () {
  12849. _this.setCompassAngle();
  12850. }, 30);
  12851. });
  12852. return _this;
  12853. }
  12854. _createClass(FloorLogos, [{
  12855. key: "bindEvents",
  12856. value: function bindEvents() {}
  12857. }, {
  12858. key: "createFloorLogo",
  12859. value: function createFloorLogo() {
  12860. var _this2 = this;
  12861. //const { url, scale = size / 100 } = this.getLogo()
  12862. var logoMeta = this.getLogo();
  12863. var url = logoMeta.url;
  12864. var scale = logoMeta.size / 100;
  12865. this.setSize(scale);
  12866. this.setLogoMesh(this.firstLogo);
  12867. this.setLogoMesh(this.secondLogo);
  12868. var done = function done() {
  12869. _this2.firstLogo.material.needsUpdate = true;
  12870. _this2.secondLogo.material.needsUpdate = true;
  12871. common$1.updateVisible(_this2.firstLogo, 'unready', true);
  12872. common$1.updateVisible(_this2.secondLogo, 'unready', true);
  12873. _this2.emit('ready');
  12874. _this2.ready = true;
  12875. };
  12876. if (logoMeta.isCompass) {
  12877. //this.app.core.get('Player').cameraControls.controls.panorama.insideLookLimitDown = -60
  12878. this.changeToCompass(done);
  12879. } else {
  12880. var map = texLoader$2.load(url, function () {
  12881. _this2.changeTex(map);
  12882. done();
  12883. });
  12884. }
  12885. }
  12886. }, {
  12887. key: "setLogoMesh",
  12888. value: function setLogoMesh(logo) {
  12889. logo.name = 'floorlogo';
  12890. logo.position.set(settings$1.floorLogo.position.x, settings$1.floorLogo.position.y, settings$1.floorLogo.position.z);
  12891. logo.rotation.set(-Math.PI / 2, 0, 0);
  12892. logo.renderOrder = settings$1.floorLogo.renderOrder; //cover the videoSkybox
  12893. common$1.updateVisible(logo, 'unready', false);
  12894. common$1.updateVisible(logo, 'outside', false);
  12895. return logo;
  12896. }
  12897. }, {
  12898. key: "changeTex",
  12899. value: function changeTex(tex, opaRadius) {
  12900. var material = this.firstLogo.material;
  12901. material.map && material.map.dispose();
  12902. var outputTex = this.getTex(tex, opaRadius);
  12903. this.firstLogo.material.map = outputTex;
  12904. this.secondLogo.material.map = outputTex;
  12905. }
  12906. }, {
  12907. key: "changeToCompass",
  12908. value: function changeToCompass(done) {
  12909. var _this3 = this;
  12910. this.isCompass = true;
  12911. var count = 0;
  12912. var loaded = function loaded(tex) {
  12913. count++;
  12914. if (count == 2) {
  12915. _this3.changeTex(compassMap, 1);
  12916. if (!_this3.compassArrow1) {
  12917. _this3.compassArrow1 = new THREE.Mesh(planeGeo$5, new THREE.MeshBasicMaterial({
  12918. map: arrowMap,
  12919. transparent: true,
  12920. side: THREE.SingleSide,
  12921. depthTest: false
  12922. }));
  12923. _this3.compassArrow1.name = 'compassArrow';
  12924. _this3.firstLogo.add(_this3.compassArrow1);
  12925. _this3.compassArrow1.position.set(0, 0, 0.01);
  12926. _this3.compassArrow2 = _this3.compassArrow1.clone();
  12927. _this3.secondLogo.add(_this3.compassArrow2);
  12928. _this3.compassArrow1.renderOrder = _this3.compassArrow2.renderOrder = settings$1.floorLogo.renderOrder + 1;
  12929. }
  12930. _this3.compassArrow1.visible = _this3.compassArrow2.visible = true;
  12931. _this3.setCompassAngle();
  12932. _this3.baseSize = 0.64; //缩小
  12933. _this3.setSize();
  12934. done && done();
  12935. }
  12936. };
  12937. var arrowMap = texLoader$2.load(this.app.resource.getAppURL("images/floorlogos/compass_arrow.png"), loaded);
  12938. var compassMap = texLoader$2.load(this.app.resource.getAppURL("images/floorlogos/compass_floor.png"), loaded);
  12939. }
  12940. }, {
  12941. key: "setCompassAngle",
  12942. value: function setCompassAngle() {
  12943. if (!this.isCompass) return;
  12944. var angle = -THREE.MathUtils.degToRad(this.app.core.get('Player').compass.angle);
  12945. this.firstLogo.rotation.set(-Math.PI / 2, 0, angle);
  12946. this.secondLogo.rotation.set(-Math.PI / 2, 0, angle);
  12947. }
  12948. }, {
  12949. key: "changeFloorLogo",
  12950. value: function changeFloorLogo(logo) {
  12951. if (!this.ready) {
  12952. return;
  12953. } //logo.isCompass = true
  12954. if (logo.isCompass
  12955. /* && !logo.size */
  12956. ) {
  12957. this.changeToCompass();
  12958. } else if ('url' in logo || 'id' in logo || 'image' in logo) {
  12959. this.isCompass = false;
  12960. this.compassArrow1 && (this.compassArrow1.visible = this.compassArrow2.visible = false);
  12961. if (logo.url) {
  12962. texLoader$2.load(logo.url, this.changeTex.bind(this));
  12963. } else if (logo.id) {
  12964. texLoader$2.load(this.app.resource.getAppURL("images/floorlogos/".concat(logo.id, ".png")), this.changeTex.bind(this));
  12965. } else if (logo.image) {
  12966. var tex = new THREE.Texture(logo.image);
  12967. tex.needsUpdate = !0;
  12968. this.changeTex(tex);
  12969. }
  12970. }
  12971. if (logo.size) {
  12972. this.setSize(logo.size / 100);
  12973. }
  12974. }
  12975. }, {
  12976. key: "setSize",
  12977. value: function setSize(s) {
  12978. s && (this.curSize = s);
  12979. var scale = this.curSize * this.baseSize;
  12980. this.firstLogo.scale.set(scale, scale, scale);
  12981. this.secondLogo.scale.set(scale, scale, scale);
  12982. }
  12983. }, {
  12984. key: "getTex",
  12985. value: function getTex(map, opaRadius) {
  12986. var uniforms = THREE.UniformsUtils.clone(floorLogo.uniforms);
  12987. uniforms.map.value = map;
  12988. var materialFirst = new THREE.ShaderMaterial({
  12989. fragmentShader: floorLogo.fragmentShader,
  12990. vertexShader: floorLogo.vertexShader,
  12991. uniforms: uniforms,
  12992. side: THREE.SingleSide,
  12993. transparent: !0,
  12994. premultipliedAlpha: true // !!! 不加这句的话透明部分会变黑
  12995. });
  12996. opaRadius != void 0 && (materialFirst.uniforms.opaRadius.value = opaRadius);
  12997. materialFirst.needsUpdate = true;
  12998. var tex = common$1.renderTex(materialFirst, this.app.core.get('SceneRenderer').renderer, {
  12999. x: map.image.width,
  13000. y: map.image.height
  13001. });
  13002. materialFirst.dispose();
  13003. tex.anisotropy = 5; //防止倾斜模糊
  13004. return tex;
  13005. }
  13006. }, {
  13007. key: "getLogo",
  13008. value: function getLogo() {
  13009. var metadata = this.app.store.getValue('metadata');
  13010. var url = '',
  13011. size = metadata.floorLogoSize || 100;
  13012. var isCompass = parseInt(metadata.floorLogoType) === 0;
  13013. if (!isCompass) {
  13014. var logo = this.app.config.scene.floorlogoId || metadata.floorLogo || '0';
  13015. if (this.app.config.lang != 'zh') {
  13016. logo = 'en/' + logo;
  13017. }
  13018. if (this.app.config.region == 'aws') {
  13019. logo = 'aws/' + logo;
  13020. }
  13021. if (metadata.floorLogo === 'user') {
  13022. url = this.app.resource.getUserResourceURL(metadata.floorLogoFile);
  13023. } else {
  13024. url = this.app.resource.getAppURL("images/floorlogos/".concat(logo, ".png"));
  13025. }
  13026. }
  13027. return {
  13028. url,
  13029. size,
  13030. isCompass
  13031. };
  13032. } //渐变opacity
  13033. }]);
  13034. return FloorLogos;
  13035. }(tinyEmitter);
  13036. 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); }; }
  13037. 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; } }
  13038. var BoxBufferGeometry = THREE.BoxBufferGeometry,
  13039. BufferGeometry = THREE.BufferGeometry,
  13040. Color = THREE.Color,
  13041. CylinderBufferGeometry = THREE.CylinderBufferGeometry,
  13042. DoubleSide = THREE.DoubleSide,
  13043. Euler = THREE.Euler,
  13044. Float32BufferAttribute$1 = THREE.Float32BufferAttribute,
  13045. Line$1 = THREE.Line;
  13046. THREE.LineBasicMaterial;
  13047. var Matrix4$1 = THREE.Matrix4,
  13048. Mesh = THREE.Mesh,
  13049. MeshBasicMaterial = THREE.MeshBasicMaterial,
  13050. Object3D = THREE.Object3D,
  13051. OctahedronBufferGeometry = THREE.OctahedronBufferGeometry,
  13052. PlaneBufferGeometry = THREE.PlaneBufferGeometry,
  13053. Quaternion$1 = THREE.Quaternion;
  13054. THREE.Raycaster;
  13055. var TorusBufferGeometry = THREE.TorusBufferGeometry;
  13056. var changeEvent, mouseDownEvent, mouseMoveEvent, mouseUpEvent, objectChangeEvent; // Reusable utility variables
  13057. var ray$2 = new THREE.Raycaster();
  13058. var _tempVector = new THREE.Vector3();
  13059. var _tempVector2 = new THREE.Vector3();
  13060. var _tempQuaternion = new THREE.Quaternion();
  13061. var _unit = {
  13062. X: new THREE.Vector3(1, 0, 0),
  13063. Y: new THREE.Vector3(0, 1, 0),
  13064. Z: new THREE.Vector3(0, 0, 1)
  13065. };
  13066. var pointStart = new THREE.Vector3();
  13067. var pointEnd = new THREE.Vector3();
  13068. var offset = new THREE.Vector3();
  13069. var rotationAxis = new THREE.Vector3();
  13070. var startNorm = new THREE.Vector3();
  13071. var endNorm = new THREE.Vector3();
  13072. var rotationAngle = 0;
  13073. var cameraPosition = new THREE.Vector3();
  13074. var cameraQuaternion = new THREE.Quaternion();
  13075. var cameraScale = new THREE.Vector3();
  13076. var parentPosition = new THREE.Vector3();
  13077. var parentQuaternion = new THREE.Quaternion();
  13078. var parentQuaternionInv = new THREE.Quaternion();
  13079. var parentScale = new THREE.Vector3();
  13080. var worldPositionStart = new THREE.Vector3();
  13081. var worldQuaternionStart = new THREE.Quaternion();
  13082. var worldScaleStart = new THREE.Vector3();
  13083. var worldPosition = new THREE.Vector3();
  13084. var worldQuaternion = new THREE.Quaternion();
  13085. var worldQuaternionInv = new THREE.Quaternion();
  13086. var worldScale = new THREE.Vector3();
  13087. var eye = new THREE.Vector3();
  13088. var positionStart = new THREE.Vector3();
  13089. var quaternionStart = new THREE.Quaternion();
  13090. var scaleStart = new THREE.Vector3();
  13091. var _gizmo, _plane;
  13092. var lastRotationAngle = 0; // 用于计算旋转时的deltaAngle
  13093. var TransformControls = /*#__PURE__*/function (_THREE$Object3D) {
  13094. _inherits(TransformControls, _THREE$Object3D);
  13095. var _super = _createSuper$1E(TransformControls);
  13096. function TransformControls(camera, domElement, options) {
  13097. var _this;
  13098. _classCallCheck(this, TransformControls);
  13099. _this = _super.call(this);
  13100. if (domElement === undefined) {
  13101. console.warn('THREE.TransformControls: The second parameter "domElement" is now mandatory.');
  13102. domElement = document;
  13103. }
  13104. _this.visible = false;
  13105. _this.domElement = domElement;
  13106. _gizmo = new TransformControlsGizmo(options);
  13107. _this.add(_gizmo);
  13108. _plane = new TransformControlsPlane(options);
  13109. _this.add(_plane);
  13110. _this.player = options.player; //xzw add
  13111. _this.options = options; //xzw add
  13112. changeEvent = {
  13113. type: 'change'
  13114. };
  13115. mouseDownEvent = {
  13116. type: 'mouseDown'
  13117. };
  13118. mouseUpEvent = {
  13119. type: 'mouseUp',
  13120. mode: _this.mode
  13121. };
  13122. mouseMoveEvent = {
  13123. type: 'mousing'
  13124. };
  13125. objectChangeEvent = {
  13126. type: 'objectChange'
  13127. }; // Define properties with getters/setter
  13128. // Setting the defined property will automatically trigger change event
  13129. // Defined properties are passed down to gizmo and plane
  13130. _this.defineProperty('camera', camera);
  13131. _this.defineProperty('object', undefined);
  13132. _this.defineProperty('enabled', true);
  13133. _this.defineProperty('axis', null);
  13134. _this.defineProperty('mode', 'translate');
  13135. _this.defineProperty('translationSnap', null);
  13136. _this.defineProperty('rotationSnap', null);
  13137. _this.defineProperty('scaleSnap', null);
  13138. _this.defineProperty('space', 'world');
  13139. _this.defineProperty('spaceForRotate', null);
  13140. _this.defineProperty('size', 1);
  13141. _this.defineProperty('dragging', false);
  13142. _this.defineProperty('showX', true);
  13143. _this.defineProperty('showY', true);
  13144. _this.defineProperty('showZ', true); // TODO: remove properties unused in plane and gizmo
  13145. _this.defineProperty('worldPosition', worldPosition);
  13146. _this.defineProperty('worldPositionStart', worldPositionStart);
  13147. _this.defineProperty('worldQuaternion', worldQuaternion);
  13148. _this.defineProperty('worldQuaternionStart', worldQuaternionStart);
  13149. _this.defineProperty('cameraPosition', cameraPosition);
  13150. _this.defineProperty('cameraQuaternion', cameraQuaternion);
  13151. _this.defineProperty('pointStart', pointStart);
  13152. _this.defineProperty('pointEnd', pointEnd);
  13153. _this.defineProperty('rotationAxis', rotationAxis);
  13154. _this.defineProperty('rotationAngle', rotationAngle);
  13155. _this.defineProperty('eye', eye);
  13156. domElement.addEventListener('mousedown', _this.onPointerDown.bind(_assertThisInitialized(_this)), false);
  13157. domElement.addEventListener('touchstart', _this.onPointerDown.bind(_assertThisInitialized(_this)), false);
  13158. domElement.addEventListener('mousemove', _this.onPointerHover.bind(_assertThisInitialized(_this)), false);
  13159. domElement.addEventListener('touchmove', _this.onPointerHover.bind(_assertThisInitialized(_this)), false);
  13160. domElement.addEventListener('touchmove', _this.onPointerMove.bind(_assertThisInitialized(_this)), false);
  13161. window.addEventListener('mouseup', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
  13162. window.addEventListener('pointerup', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
  13163. domElement.addEventListener('touchend', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
  13164. domElement.addEventListener('touchcancel', _this.onPointerUp.bind(_assertThisInitialized(_this)), false);
  13165. domElement.addEventListener('touchleave', _this.onPointerUp.bind(_assertThisInitialized(_this)), false); // this.player.$app.core.get('SceneRenderer').addComponent(this)
  13166. _this.isTransformControls = true;
  13167. return _this;
  13168. }
  13169. _createClass(TransformControls, [{
  13170. key: "dispose",
  13171. value: function dispose() {
  13172. domElement.removeEventListener('mousedown', this.onPointerDown.bind(this));
  13173. domElement.removeEventListener('touchstart', this.onPointerDown.bind(this));
  13174. domElement.removeEventListener('mousemove', this.onPointerHover.bind(this));
  13175. document.removeEventListener('mousemove', this.onPointerMove.bind(this));
  13176. domElement.removeEventListener('touchmove', this.onPointerHover.bind(this));
  13177. domElement.removeEventListener('touchmove', this.onPointerMove.bind(this));
  13178. window.removeEventListener('mouseup', this.onPointerUp.bind(this), false);
  13179. window.removeEventListener('pointerup', this.onPointerUp.bind(this), false);
  13180. domElement.removeEventListener('touchend', this.onPointerUp.bind(this));
  13181. domElement.removeEventListener('touchcancel', this.onPointerUp.bind(this));
  13182. domElement.removeEventListener('touchleave', this.onPointerUp.bind(this));
  13183. this.traverse(function (child) {
  13184. if (child.geometry) child.geometry.dispose();
  13185. if (child.material) child.material.dispose();
  13186. });
  13187. } // Set current object
  13188. // 通过设置object的width和depth来设置箭头偏移
  13189. }, {
  13190. key: "attach",
  13191. value: function attach(object) {
  13192. this.object = object;
  13193. this.visible = true;
  13194. config$6.isTyping = true; //add
  13195. return this;
  13196. } // Detatch from object
  13197. }, {
  13198. key: "detach",
  13199. value: function detach() {
  13200. this.object = undefined;
  13201. this.visible = false;
  13202. this.axis = null;
  13203. config$6.isTyping = false; //add
  13204. return this;
  13205. } //add
  13206. }, {
  13207. key: "setSize",
  13208. value: function setSize(x, y) {}
  13209. }, {
  13210. key: "switchEditState",
  13211. value: function switchEditState(state) {
  13212. var oldScaleAxis = JSON.stringify(this.options.scaleAxis);
  13213. if (state == 'overlay') {
  13214. this.options.NoScaleZ = true;
  13215. this.options.scaleAxis = ['x', 'y'];
  13216. } else if (state == 'panovideo') {
  13217. this.mode = 'scale';
  13218. this.options.NoScaleZ = true;
  13219. this.options.scaleAxis = ['x', 'y'];
  13220. } else if (state == 'decoration') {
  13221. this.options.NoScaleZ = false;
  13222. this.options.scaleAxis = ['x', 'y', 'z'];
  13223. } else if (state == 'clipbox') {
  13224. this.options.NoScaleZ = false;
  13225. this.options.scaleAxis = ['x', 'y', 'z'];
  13226. } else if (state == 'css3dpanel') {
  13227. this.options.NoScaleZ = false;
  13228. this.options.scaleAxis = ['x', 'y'];
  13229. }
  13230. if (oldScaleAxis != JSON.stringify(this.options.scaleAxis)) {
  13231. this.rebuildAxis('scale');
  13232. }
  13233. this.editState = state; //this.visible = true
  13234. }
  13235. }, {
  13236. key: "filterRotateAxis",
  13237. value: function filterRotateAxis(axisArr) {
  13238. var oldRotateAxis = JSON.stringify(this.options.rotateAxis);
  13239. this.options.rotateAxis = axisArr;
  13240. if (oldRotateAxis != JSON.stringify(this.options.rotateAxis)) {
  13241. this.rebuildAxis('rotate');
  13242. }
  13243. }
  13244. }, {
  13245. key: "rebuildAxis",
  13246. value: function rebuildAxis(transType) {
  13247. _gizmo.gizmo[transType].removeFromParent();
  13248. _gizmo.picker[transType].removeFromParent();
  13249. _gizmo.gizmo[transType].traverse(function (child) {
  13250. if (child.geometry) child.geometry.dispose();
  13251. if (child.material) child.material.dispose();
  13252. });
  13253. _gizmo.picker[transType].traverse(function (child) {
  13254. if (child.geometry) child.geometry.dispose();
  13255. if (child.material) child.material.dispose();
  13256. });
  13257. var _gizmo2 = _gizmo['update' + transType.charAt(0).toUpperCase() + transType.slice(1)](),
  13258. gizmo = _gizmo2.gizmo,
  13259. picker = _gizmo2.picker; // updateScale()、updateRotate()
  13260. _gizmo.add(_gizmo.gizmo[transType] = _gizmo.setupGizmo(gizmo));
  13261. _gizmo.add(_gizmo.picker[transType] = _gizmo.setupGizmo(picker));
  13262. _gizmo.picker[transType].visible = false;
  13263. }
  13264. }, {
  13265. key: "handleDragStart",
  13266. value: function handleDragStart() {
  13267. this.editState && this.onPointerDown();
  13268. }
  13269. }, {
  13270. key: "handleDragging",
  13271. value: function handleDragging() {
  13272. this.editState && this.onPointerMove();
  13273. }
  13274. }, {
  13275. key: "handleDragEnd",
  13276. value: function handleDragEnd() {
  13277. this.editState && this.onPointerUp();
  13278. } //-------------------
  13279. // Defined getter, setter and store for a property
  13280. }, {
  13281. key: "defineProperty",
  13282. value: function defineProperty(propName, defaultValue) {
  13283. var propValue = defaultValue;
  13284. Object.defineProperty(this, propName, {
  13285. get: function get() {
  13286. return propValue !== undefined ? propValue : defaultValue;
  13287. },
  13288. set: function set(value) {
  13289. if (propValue !== value) {
  13290. propValue = value;
  13291. _plane[propName] = value;
  13292. _gizmo[propName] = value;
  13293. this.dispatchEvent({
  13294. type: propName + '-changed',
  13295. value: value
  13296. });
  13297. this.dispatchEvent(changeEvent);
  13298. }
  13299. }
  13300. });
  13301. this[propName] = defaultValue;
  13302. _plane[propName] = defaultValue;
  13303. _gizmo[propName] = defaultValue;
  13304. } // updateMatrixWorld updates key transformation variables
  13305. }, {
  13306. key: "updateMatrixWorld",
  13307. value: function updateMatrixWorld() {
  13308. if (this.object !== undefined) {
  13309. this.object.updateMatrixWorld();
  13310. this.object.parent.matrixWorld.decompose(parentPosition, parentQuaternion, parentScale);
  13311. this.object.matrixWorld.decompose(worldPosition, worldQuaternion, worldScale);
  13312. parentQuaternionInv.copy(parentQuaternion).invert();
  13313. worldQuaternionInv.copy(worldQuaternion).invert();
  13314. }
  13315. this.camera.updateMatrixWorld();
  13316. this.camera.matrixWorld.decompose(cameraPosition, cameraQuaternion, cameraScale);
  13317. eye.copy(cameraPosition).sub(worldPosition).normalize();
  13318. Object3D.prototype.updateMatrixWorld.call(this);
  13319. }
  13320. }, {
  13321. key: "pointerHover",
  13322. value: function pointerHover(pointer) {
  13323. if (this.object === undefined || this.dragging === true || pointer.button !== undefined && pointer.button !== 0) return; //ray.setFromCamera( pointer, this.camera ); //������floorplanģʽget����intersect
  13324. var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera);
  13325. ray$2.set(origin, this.player.getMouseDirection(pointer));
  13326. var intersect = ray$2.intersectObjects(_gizmo.picker[this.mode].children, true)[0] || false;
  13327. if (intersect) {
  13328. this.axis = intersect.object.name;
  13329. this.intersect = intersect.object; //add
  13330. this.player.domElement.style.cursor = 'pointer';
  13331. } else {
  13332. this.intersect = null;
  13333. this.axis = null;
  13334. this.player.domElement.style.cursor = '';
  13335. }
  13336. }
  13337. }, {
  13338. key: "pointerDown",
  13339. value: function pointerDown(pointer) {
  13340. if (this.object === undefined || this.dragging === true || pointer.button !== undefined && pointer.button !== 0) return;
  13341. if ((pointer.button === 0 || pointer.button === undefined) && this.axis !== null) {
  13342. //ray.setFromCamera( pointer, this.camera ); //������floorplanģʽget����intersect
  13343. var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera);
  13344. ray$2.set(origin, this.player.getMouseDirection(pointer));
  13345. var planeIntersect = ray$2.intersectObjects([_plane], true)[0] || false;
  13346. if (planeIntersect) {
  13347. var space = this.space;
  13348. if (this.mode === 'scale') {
  13349. space = 'local';
  13350. } else if (this.axis === 'E' || this.axis === 'XYZE' || this.axis === 'XYZ') {
  13351. space = 'world';
  13352. }
  13353. if (space === 'local' && this.mode === 'rotate') {
  13354. var snap = this.rotationSnap;
  13355. if (this.axis === 'X' && snap) this.object.rotation.x = Math.round(this.object.rotation.x / snap) * snap;
  13356. if (this.axis === 'Y' && snap) this.object.rotation.y = Math.round(this.object.rotation.y / snap) * snap;
  13357. if (this.axis === 'Z' && snap) this.object.rotation.z = Math.round(this.object.rotation.z / snap) * snap;
  13358. }
  13359. this.object.updateMatrixWorld();
  13360. this.object.parent.updateMatrixWorld();
  13361. positionStart.copy(this.object.position);
  13362. quaternionStart.copy(this.object.quaternion);
  13363. scaleStart.copy(this.object.scale);
  13364. this.object.matrixWorld.decompose(worldPositionStart, worldQuaternionStart, worldScaleStart);
  13365. pointStart.copy(planeIntersect.point).sub(worldPositionStart);
  13366. if (this.player.cameraControls.activeControl) {
  13367. //this.player.cameraControls.activeControl.locked = true; //add
  13368. this.player.cameraControls.activeControl.enabled = false; //add
  13369. }
  13370. }
  13371. this.dragging = true;
  13372. mouseDownEvent.mode = this.mode;
  13373. this.dispatchEvent(mouseDownEvent);
  13374. }
  13375. }
  13376. }, {
  13377. key: "pointerMove",
  13378. value: function pointerMove(pointer) {
  13379. var axis = this.axis;
  13380. var mode = this.mode;
  13381. var object = this.object;
  13382. var space = this.space;
  13383. if (mode === 'scale') {
  13384. space = 'local';
  13385. } else if (axis === 'E' || axis === 'XYZE' || axis === 'XYZ') {
  13386. space = 'world';
  13387. } //console.log(axis)
  13388. if (object === undefined || axis === null || this.dragging === false || pointer.button !== undefined && pointer.button !== 0) return; //ray.setFromCamera( pointer, this.camera ); //������floorplanģʽget����intersect
  13389. var origin = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera);
  13390. ray$2.set(origin, this.player.getMouseDirection(pointer));
  13391. var planeIntersect = ray$2.intersectObjects([_plane], true)[0] || false;
  13392. if (planeIntersect === false) return;
  13393. pointEnd.copy(planeIntersect.point).sub(worldPositionStart);
  13394. if (mode === 'translate') {
  13395. // Apply translate
  13396. offset.copy(pointEnd).sub(pointStart);
  13397. if (space === 'local' && axis !== 'XYZ') {
  13398. offset.applyQuaternion(worldQuaternionInv);
  13399. }
  13400. if (axis.indexOf('X') === -1) offset.x = 0;
  13401. if (axis.indexOf('Y') === -1) offset.y = 0;
  13402. if (axis.indexOf('Z') === -1) offset.z = 0;
  13403. if (space === 'local' && axis !== 'XYZ') {
  13404. offset.applyQuaternion(quaternionStart).divide(parentScale);
  13405. } else {
  13406. offset.applyQuaternion(parentQuaternionInv).divide(parentScale);
  13407. }
  13408. if (object.overlayType) {
  13409. // overlay高度略小于地面高度时会出bug
  13410. var heightProtect = object.floor.boundingBox.min.y - offset.y - positionStart.y;
  13411. if (heightProtect > 0 && heightProtect < 0.024) offset.y = object.floor.boundingBox.min.y - positionStart.y;
  13412. } // 当scale缩放为负时,offset得出的y、z值符号相反,原因不明,目前先打个补丁
  13413. offset.y *= Math.sign(object.scale.y);
  13414. offset.z *= Math.sign(object.scale.z);
  13415. object.position.copy(offset).add(positionStart); // Apply translation snap
  13416. if (this.translationSnap) {
  13417. if (space === 'local') {
  13418. object.position.applyQuaternion(_tempQuaternion.copy(quaternionStart).invert());
  13419. if (axis.search('X') !== -1) {
  13420. object.position.x = Math.round(object.position.x / this.translationSnap) * this.translationSnap;
  13421. }
  13422. if (axis.search('Y') !== -1) {
  13423. object.position.y = Math.round(object.position.y / this.translationSnap) * this.translationSnap;
  13424. }
  13425. if (axis.search('Z') !== -1) {
  13426. object.position.z = Math.round(object.position.z / this.translationSnap) * this.translationSnap;
  13427. }
  13428. object.position.applyQuaternion(quaternionStart);
  13429. }
  13430. if (space === 'world') {
  13431. if (object.parent) {
  13432. object.position.add(_tempVector.setFromMatrixPosition(object.parent.matrixWorld));
  13433. }
  13434. if (axis.search('X') !== -1) {
  13435. object.position.x = Math.round(object.position.x / this.translationSnap) * this.translationSnap;
  13436. }
  13437. if (axis.search('Y') !== -1) {
  13438. object.position.y = Math.round(object.position.y / this.translationSnap) * this.translationSnap;
  13439. }
  13440. if (axis.search('Z') !== -1) {
  13441. object.position.z = Math.round(object.position.z / this.translationSnap) * this.translationSnap;
  13442. }
  13443. if (object.parent) {
  13444. object.position.sub(_tempVector.setFromMatrixPosition(object.parent.matrixWorld));
  13445. }
  13446. }
  13447. }
  13448. } else if (mode === 'scale') {
  13449. if (axis.search('XYZ') !== -1) {
  13450. var d = pointEnd.length() / pointStart.length();
  13451. if (pointEnd.dot(pointStart) < 0) d *= -1;
  13452. if (this.options.NoScaleZ) {
  13453. //xzw add
  13454. _tempVector2.set(d, d, 1);
  13455. } else {
  13456. _tempVector2.set(d, d, d);
  13457. }
  13458. } else if (axis.search('XY') !== -1) {
  13459. //add 等比例for plane
  13460. var d = pointEnd.length() / pointStart.length();
  13461. if (pointEnd.dot(pointStart) < 0) d *= -1;
  13462. _tempVector2.set(d, d, 1);
  13463. } else {
  13464. _tempVector.copy(pointStart);
  13465. _tempVector2.copy(pointEnd);
  13466. _tempVector.applyQuaternion(worldQuaternionInv);
  13467. _tempVector2.applyQuaternion(worldQuaternionInv);
  13468. _tempVector2.divide(_tempVector);
  13469. if (axis.search('X') === -1) {
  13470. _tempVector2.x = 1;
  13471. }
  13472. if (axis.search('Y') === -1) {
  13473. _tempVector2.y = 1;
  13474. }
  13475. if (axis.search('Z') === -1) {
  13476. _tempVector2.z = 1;
  13477. }
  13478. } // Apply scale
  13479. /*if (this.editState == 'overlay' ) {
  13480. // 将视频缩放大小限制在0.1到10之间
  13481. if (Math.abs(scaleStart.x * _tempVector2.x * settings.overlay.width) < 0.1) return
  13482. if (Math.abs(scaleStart.x * _tempVector2.x * settings.overlay.width) > 10) return
  13483. if (Math.abs(scaleStart.y * _tempVector2.y * settings.overlay.height) < 0.1) return
  13484. if (Math.abs(scaleStart.y * _tempVector2.y * settings.overlay.height) > 10) return
  13485. }
  13486. if (this.editState == 'decoration') {
  13487. // 将模型缩放大小限制在0.1到10之间
  13488. if (Math.abs(scaleStart.x * _tempVector2.x) < 0.1) return
  13489. if (Math.abs(scaleStart.x * _tempVector2.x) > 10) return
  13490. if (Math.abs(scaleStart.y * _tempVector2.y) < 0.1) return
  13491. if (Math.abs(scaleStart.y * _tempVector2.y) > 10) return
  13492. if (Math.abs(scaleStart.z * _tempVector2.z) < 0.1) return
  13493. if (Math.abs(scaleStart.z * _tempVector2.z) > 10) return
  13494. } */
  13495. if (this.editState == 'overlay' || this.editState == 'decoration') {
  13496. // 将模型缩放大小限制在0.1到10之间
  13497. var min = 0.1,
  13498. max = 10;
  13499. if (this.editState == 'overlay') {
  13500. //先暂乘以geo长宽比率,修改为真实大小
  13501. scaleStart.x *= settings$3.overlay.width;
  13502. scaleStart.y *= settings$3.overlay.height;
  13503. }
  13504. var axises = ['x', 'y', 'z'];
  13505. var result = {
  13506. min: {
  13507. v: Infinity
  13508. },
  13509. max: {
  13510. v: -Infinity
  13511. }
  13512. };
  13513. axises.forEach(function (e) {
  13514. _tempVector2[e] = Math.abs(_tempVector2[e]); //先保证都是非负
  13515. if (_tempVector2[e] != 1) {
  13516. var v = _tempVector2[e] * scaleStart[e];
  13517. if (v < result.min.v) {
  13518. result.min.axis = e, result.min.v = v;
  13519. } else if (v > result.min.v) {
  13520. result.max.axis = e, result.max.v = v;
  13521. }
  13522. }
  13523. }); //已知_tempVector2 的三个轴的值除了1其他的都一样
  13524. var newS;
  13525. if (result.min.v < min) {
  13526. //用最小的得到最小比值
  13527. newS = min / scaleStart[result.min.axis];
  13528. } else if (result.max.v > max) {
  13529. //用最大的得到最大比值
  13530. newS = max / scaleStart[result.max.axis];
  13531. } //newS && console.log('newS',newS,result)
  13532. newS && axises.forEach(function (e) {
  13533. if (_tempVector2[e] != 1) {
  13534. //1的是绝对不能更改的轴
  13535. _tempVector2[e] = newS;
  13536. }
  13537. });
  13538. if (this.editState == 'overlay') {
  13539. //恢复
  13540. scaleStart.x /= settings$3.overlay.width;
  13541. scaleStart.y /= settings$3.overlay.height;
  13542. } //注,拖拽缩小时,容易缩放不到0(如0.3)就直接变大,因为需要无限接近原点才行。
  13543. }
  13544. if (this.editState == 'clipbox') ;
  13545. object.scale.copy(scaleStart).multiply(_tempVector2);
  13546. if (this.scaleSnap) {
  13547. if (axis.search('X') !== -1) {
  13548. object.scale.x = Math.round(object.scale.x / this.scaleSnap) * this.scaleSnap || this.scaleSnap;
  13549. }
  13550. if (axis.search('Y') !== -1) {
  13551. object.scale.y = Math.round(object.scale.y / this.scaleSnap) * this.scaleSnap || this.scaleSnap;
  13552. }
  13553. if (axis.search('Z') !== -1) {
  13554. object.scale.z = Math.round(object.scale.z / this.scaleSnap) * this.scaleSnap || this.scaleSnap;
  13555. }
  13556. } //add
  13557. if (this.editState == 'overlay') {
  13558. object.width = settings$3.overlay.width * object.scale.x;
  13559. object.height = settings$3.overlay.height * object.scale.y;
  13560. this.player.EditOverlay.updateOverlayScaleDisplay();
  13561. }
  13562. } else if (mode === 'rotate') {
  13563. offset.copy(pointEnd).sub(pointStart);
  13564. if (this.player.mode == 'floorplan') {
  13565. var flcamera = this.player.cameraControls.cameras.floorplan;
  13566. var eyeDistance = (flcamera.right - flcamera.left) / flcamera.aspect;
  13567. var ROTATION_SPEED = 5 / eyeDistance;
  13568. } else var ROTATION_SPEED = 5 / worldPosition.distanceTo(_tempVector.setFromMatrixPosition(this.camera.matrixWorld));
  13569. if (axis === 'E') {
  13570. rotationAxis.copy(eye);
  13571. rotationAngle = pointEnd.angleTo(pointStart);
  13572. startNorm.copy(pointStart).normalize();
  13573. endNorm.copy(pointEnd).normalize();
  13574. rotationAngle *= endNorm.cross(startNorm).dot(eye) < 0 ? 1 : -1;
  13575. } else if (axis === 'XYZE') {
  13576. rotationAxis.copy(offset).cross(eye).normalize();
  13577. rotationAngle = offset.dot(_tempVector.copy(rotationAxis).cross(this.eye)) * ROTATION_SPEED;
  13578. } else if (axis === 'X' || axis === 'Y' || axis === 'Z') {
  13579. rotationAxis.copy(_unit[axis]);
  13580. _tempVector.copy(_unit[axis]);
  13581. if (space === 'local') {
  13582. _tempVector.applyQuaternion(worldQuaternion);
  13583. }
  13584. rotationAngle = offset.dot(_tempVector.cross(eye).normalize()) * ROTATION_SPEED;
  13585. } // Apply rotation snap
  13586. if (this.rotationSnap) rotationAngle = Math.round(rotationAngle / this.rotationSnap) * this.rotationSnap;
  13587. this.rotationAngle = rotationAngle; // Apply rotate
  13588. var isLocalSpace = space === 'local';
  13589. if (this.spaceForRotate) {
  13590. if (axis === 'X') isLocalSpace = this.spaceForRotate.x === 'local';
  13591. if (axis === 'Y') isLocalSpace = this.spaceForRotate.y === 'local';
  13592. if (axis === 'Z') isLocalSpace = this.spaceForRotate.z === 'local';
  13593. }
  13594. if (isLocalSpace && axis !== 'E' && axis !== 'XYZE') {
  13595. object.quaternion.copy(quaternionStart);
  13596. object.quaternion.multiply(_tempQuaternion.setFromAxisAngle(rotationAxis, rotationAngle)).normalize();
  13597. } else {
  13598. rotationAxis.applyQuaternion(parentQuaternionInv);
  13599. object.quaternion.copy(_tempQuaternion.setFromAxisAngle(rotationAxis, rotationAngle));
  13600. object.quaternion.multiply(quaternionStart).normalize();
  13601. }
  13602. }
  13603. this.dispatchEvent(Object.assign(mouseMoveEvent, {
  13604. mode: this.mode,
  13605. state: this.editState,
  13606. axis,
  13607. angle: rotationAngle,
  13608. deltaAngle: rotationAngle - lastRotationAngle
  13609. }));
  13610. this.dispatchEvent(changeEvent);
  13611. this.dispatchEvent(objectChangeEvent);
  13612. lastRotationAngle = rotationAngle;
  13613. }
  13614. }, {
  13615. key: "pointerUp",
  13616. value: function pointerUp(pointer) {
  13617. if (this.object === undefined) return; //if ( pointer.button !== undefined && pointer.button !== 0 ) return;
  13618. if (this.dragging && this.axis !== null) {
  13619. mouseUpEvent.mode = this.mode;
  13620. this.dispatchEvent(mouseUpEvent);
  13621. }
  13622. this.dragging = false;
  13623. if (pointer.button === undefined) this.axis = null;
  13624. if (this.player.cameraControls.activeControl) {
  13625. //this.player.cameraControls.activeControl.locked = false; //add
  13626. this.player.cameraControls.activeControl.pointerDragOn = false; //add
  13627. this.player.cameraControls.activeControl.enabled = true;
  13628. }
  13629. lastRotationAngle = 0;
  13630. } // normalize mouse / touch pointer and remap {x,y} to view space.
  13631. }, {
  13632. key: "getPointer",
  13633. value: function getPointer(event) {
  13634. if (!event) {
  13635. console.log('hhahhhahah');
  13636. return;
  13637. }
  13638. if (document.pointerLockElement) {
  13639. return {
  13640. x: 0,
  13641. y: 0,
  13642. button: event.button
  13643. };
  13644. } else {
  13645. var pointer = event.changedTouches ? event.changedTouches[0] : event;
  13646. var rect = domElement.getBoundingClientRect();
  13647. return {
  13648. x: (pointer.clientX - rect.left) / rect.width * 2 - 1,
  13649. y: -(pointer.clientY - rect.top) / rect.height * 2 + 1,
  13650. button: event.button
  13651. };
  13652. }
  13653. } // mouse / touch event handlers
  13654. }, {
  13655. key: "onPointerHover",
  13656. value: function onPointerHover(event) {
  13657. if (!this.enabled) return; //this.pointerHover( getPointer( event ) );
  13658. this.pointerHover(this.player.mouse);
  13659. }
  13660. }, {
  13661. key: "onPointerDown",
  13662. value: function onPointerDown(event) {
  13663. if (!this.enabled) return; //document.addEventListener( "mousemove", onPointerMove, false );
  13664. /* this.pointerHover( getPointer( event ) );
  13665. this.pointerDown( getPointer( event ) ); */
  13666. this.pointerHover(this.player.mouse);
  13667. this.pointerDown(this.player.mouse);
  13668. }
  13669. }, {
  13670. key: "onPointerMove",
  13671. value: function onPointerMove(event) {
  13672. if (!this.enabled || !this.dragging) return; //xzw change
  13673. //this.pointerMove( getPointer( event ) );
  13674. this.pointerMove(this.player.mouse);
  13675. }
  13676. }, {
  13677. key: "onPointerUp",
  13678. value: function onPointerUp(event) {
  13679. if (!this.enabled) return; //document.removeEventListener( "mousemove", onPointerMove, false );
  13680. //this.pointerUp( getPointer( event ) );
  13681. this.pointerUp(this.player.mouse);
  13682. } // TODO: deprecate
  13683. }, {
  13684. key: "getMode",
  13685. value: function getMode() {
  13686. return this.mode;
  13687. }
  13688. }, {
  13689. key: "setMode",
  13690. value: function setMode(mode) {
  13691. this.mode = mode;
  13692. }
  13693. }, {
  13694. key: "setTranslationSnap",
  13695. value: function setTranslationSnap(translationSnap) {
  13696. this.translationSnap = translationSnap;
  13697. }
  13698. }, {
  13699. key: "setRotationSnap",
  13700. value: function setRotationSnap(rotationSnap) {
  13701. this.rotationSnap = rotationSnap;
  13702. }
  13703. }, {
  13704. key: "setScaleSnap",
  13705. value: function setScaleSnap(scaleSnap) {
  13706. this.scaleSnap = scaleSnap;
  13707. }
  13708. /* this.setSize = function ( size ) {
  13709. this.size = size;
  13710. }; */
  13711. }, {
  13712. key: "setSpace",
  13713. value: function setSpace(space) {
  13714. this.space = space;
  13715. }
  13716. }, {
  13717. key: "update",
  13718. value: function update() {
  13719. console.warn('THREE.TransformControls: update function has no more functionality and therefore has been deprecated.');
  13720. }
  13721. }]);
  13722. return TransformControls;
  13723. }(THREE.Object3D); // TransformControls.prototype = Object.assign(Object.create(Object3D.prototype), {
  13724. // constructor: TransformControls,
  13725. // isTransformControls: true,
  13726. // })
  13727. var TransformControlsGizmo = /*#__PURE__*/function (_THREE$Object3D2) {
  13728. _inherits(TransformControlsGizmo, _THREE$Object3D2);
  13729. var _super2 = _createSuper$1E(TransformControlsGizmo);
  13730. function TransformControlsGizmo(options) {
  13731. var _this2;
  13732. _classCallCheck(this, TransformControlsGizmo);
  13733. _this2 = _super2.call(this);
  13734. _this2.type = 'TransformControlsGizmo';
  13735. _this2.options = options;
  13736. _this2.player = options.player; // shared materials
  13737. var gizmoMaterial = new THREE.MeshBasicMaterial({
  13738. depthTest: false,
  13739. depthWrite: false,
  13740. transparent: true,
  13741. side: DoubleSide,
  13742. fog: false
  13743. });
  13744. var gizmoLineMaterial = new THREE.LineBasicMaterial({
  13745. depthTest: false,
  13746. depthWrite: false,
  13747. transparent: true,
  13748. linewidth: 1,
  13749. fog: false
  13750. }); // Make unique material for each axis/color
  13751. var matInvisible = gizmoMaterial.clone();
  13752. matInvisible.opacity = 0.35;
  13753. var matHelper = gizmoMaterial.clone();
  13754. matHelper.opacity = 0.1; //У׼��
  13755. var matRed = gizmoMaterial.clone();
  13756. matRed.color.set(0xff0000);
  13757. var matGreen = gizmoMaterial.clone();
  13758. matGreen.color.set(0x00ff00);
  13759. var matBlue = gizmoMaterial.clone();
  13760. matBlue.color.set(0x0000ff);
  13761. var matWhiteTransparent = gizmoMaterial.clone();
  13762. matWhiteTransparent.opacity = 0.75;
  13763. matWhiteTransparent.color.set(0xf0f0f0); // matWhiteTransparent.color.set(0x00d0fd) //xzw add
  13764. var matYellowTransparent = matWhiteTransparent.clone();
  13765. matYellowTransparent.color.set(0xffff00);
  13766. var matCyanTransparent = matWhiteTransparent.clone();
  13767. matCyanTransparent.color.set(0x00ffff);
  13768. var matMagentaTransparent = matWhiteTransparent.clone();
  13769. matMagentaTransparent.color.set(0xff00ff);
  13770. var matYellow = gizmoMaterial.clone();
  13771. matYellow.color.set(0xffff00);
  13772. var matLineRed = gizmoLineMaterial.clone();
  13773. matLineRed.color.set(0xff0000);
  13774. var matLineGreen = gizmoLineMaterial.clone();
  13775. matLineGreen.color.set(0x00ff00);
  13776. var matLineBlue = gizmoLineMaterial.clone();
  13777. matLineBlue.color.set(0x0000ff);
  13778. var matLineCyan = gizmoLineMaterial.clone();
  13779. matLineCyan.color.set(0x00ffff);
  13780. var matLineMagenta = gizmoLineMaterial.clone();
  13781. matLineMagenta.color.set(0xff00ff);
  13782. var matLineYellow = gizmoLineMaterial.clone();
  13783. matLineYellow.color.set(0xffff00);
  13784. var matLineGray = gizmoLineMaterial.clone();
  13785. matLineGray.color.set(0x787878);
  13786. var matLineYellowTransparent = matLineYellow.clone();
  13787. matLineYellowTransparent.opacity = 0.25; // reusable geometry
  13788. var arrowGeometry = new CylinderBufferGeometry(0, 0.07, 0.2, 12, 1, false);
  13789. var scaleHandleGeometry = new BoxBufferGeometry(0.125, 0.125, 0.125);
  13790. var lineGeometry = new BufferGeometry();
  13791. lineGeometry.setAttribute('position', new Float32BufferAttribute$1([0, 0, 0, 1, 0, 0], 3)); //--------------- xzw add fatLines: -----------------
  13792. var fatLinePoints = {
  13793. 'x+': [{
  13794. x: 0,
  13795. y: 0,
  13796. z: 0
  13797. }, {
  13798. x: 0.5,
  13799. y: 0,
  13800. z: 0
  13801. }],
  13802. 'x-': [{
  13803. x: 0,
  13804. y: 0,
  13805. z: 0
  13806. }, {
  13807. x: -0.5,
  13808. y: 0,
  13809. z: 0
  13810. }],
  13811. 'y+': [{
  13812. x: 0,
  13813. y: 0,
  13814. z: 0
  13815. }, {
  13816. x: 0,
  13817. y: 0.5,
  13818. z: 0
  13819. }],
  13820. 'y-': [{
  13821. x: 0,
  13822. y: 0,
  13823. z: 0
  13824. }, {
  13825. x: 0,
  13826. y: -0.5,
  13827. z: 0
  13828. }],
  13829. 'z+': [{
  13830. x: 0,
  13831. y: 0,
  13832. z: 0
  13833. }, {
  13834. x: 0,
  13835. y: 0,
  13836. z: 0.5
  13837. }],
  13838. 'z-': [{
  13839. x: 0,
  13840. y: 0,
  13841. z: 0
  13842. }, {
  13843. x: 0,
  13844. y: 0,
  13845. z: -0.5
  13846. }]
  13847. };
  13848. var fatLineGeos = {};
  13849. var fatLintMats = {
  13850. x: LineDraw.createFatLineMat({
  13851. lineWidth: 3,
  13852. color: 0xff0000,
  13853. depthTest: false,
  13854. opacity: 0.9
  13855. }),
  13856. y: LineDraw.createFatLineMat({
  13857. lineWidth: 3,
  13858. color: 0x00ff00,
  13859. depthTest: false,
  13860. opacity: 0.9
  13861. }),
  13862. z: LineDraw.createFatLineMat({
  13863. lineWidth: 3,
  13864. color: 0x0000ff,
  13865. depthTest: false,
  13866. opacity: 0.9
  13867. })
  13868. };
  13869. var getFatLine = function getFatLine(geoName, matName) {
  13870. var points = fatLinePoints[geoName];
  13871. var material = fatLintMats[matName];
  13872. var line = LineDraw.createFatLine(points, {
  13873. material
  13874. });
  13875. fatLineGeos[geoName] = line.geometry; //record
  13876. line.renderOrder = 4;
  13877. return line;
  13878. }; //--------------------------------------------------
  13879. var CircleGeometry = function CircleGeometry(radius, arc) {
  13880. var geometry = new BufferGeometry();
  13881. var vertices = [];
  13882. for (var i = 0; i <= 64 * arc; ++i) {
  13883. vertices.push(0, Math.cos(i / 32 * Math.PI) * radius, Math.sin(i / 32 * Math.PI) * radius);
  13884. }
  13885. geometry.setAttribute('position', new Float32BufferAttribute$1(vertices, 3));
  13886. return geometry;
  13887. }; // Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position
  13888. var TranslateHelperGeometry = function TranslateHelperGeometry() {
  13889. var geometry = new BufferGeometry();
  13890. geometry.setAttribute('position', new Float32BufferAttribute$1([0, 0, 0, 1, 1, 1], 3));
  13891. return geometry;
  13892. }; // Gizmo definitions - custom hierarchy definitions for setupGizmo() function
  13893. var gizmoTranslate = {
  13894. 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' ],
  13895. [getFatLine('x+', 'x')
  13896. /* new Line( lineGeometry, matLineRed ) */
  13897. ]],
  13898. 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' ],
  13899. [getFatLine('y+', 'y')
  13900. /* new Line( lineGeometry, matLineGreen ) */
  13901. ]],
  13902. 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' ],
  13903. [getFatLine('z+', 'z')
  13904. /* new Line( lineGeometry, matLineBlue ) */
  13905. ]]
  13906. /* XYZ: [
  13907. [ new Mesh( new OctahedronBufferGeometry( 0.1, 0 ), matWhiteTransparent.clone() ), [ 0, 0, 0 ], [ 0, 0, 0 ]]
  13908. ],
  13909. XY: [
  13910. [ new Mesh( new PlaneBufferGeometry( 0.295, 0.295 ), matYellowTransparent.clone() ), [ 0.15, 0.15, 0 ]],
  13911. [ new Line( lineGeometry, matLineYellow ), [ 0.18, 0.3, 0 ], null, [ 0.125, 1, 1 ]],
  13912. [ new Line( lineGeometry, matLineYellow ), [ 0.3, 0.18, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]
  13913. ],
  13914. YZ: [
  13915. [ new Mesh( new PlaneBufferGeometry( 0.295, 0.295 ), matCyanTransparent.clone() ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],
  13916. [ new Line( lineGeometry, matLineCyan ), [ 0, 0.18, 0.3 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]],
  13917. [ new Line( lineGeometry, matLineCyan ), [ 0, 0.3, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
  13918. ],
  13919. XZ: [
  13920. [ new Mesh( new PlaneBufferGeometry( 0.295, 0.295 ), matMagentaTransparent.clone() ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],
  13921. [ new Line( lineGeometry, matLineMagenta ), [ 0.18, 0, 0.3 ], null, [ 0.125, 1, 1 ]],
  13922. [ new Line( lineGeometry, matLineMagenta ), [ 0.3, 0, 0.18 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]
  13923. ]*/
  13924. };
  13925. var pickerTranslate = {
  13926. X: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0.3, 0, 0], [0, 0, -Math.PI / 2]]],
  13927. Y: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0.3, 0]]],
  13928. Z: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0, 0.3], [Math.PI / 2, 0, 0]]]
  13929. /* XYZ: [
  13930. [ new Mesh( new OctahedronBufferGeometry( 0.2, 0 ), matInvisible ) ]
  13931. ],
  13932. XY: [
  13933. [ new Mesh( new PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0.2, 0 ]]
  13934. ],
  13935. YZ: [
  13936. [ new Mesh( new PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ]]
  13937. ],
  13938. XZ: [
  13939. [ new Mesh( new PlaneBufferGeometry( 0.4, 0.4 ), matInvisible ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ]]
  13940. ]*/
  13941. };
  13942. var helperTranslate = {
  13943. START: [[new Mesh(new OctahedronBufferGeometry(0.01, 2), matHelper), null, null, null, 'helper']],
  13944. END: [[new Mesh(new OctahedronBufferGeometry(0.01, 2), matHelper), null, null, null, 'helper']],
  13945. DELTA: [[new Line$1(TranslateHelperGeometry(), matHelper), null, null, null, 'helper']],
  13946. X: [[new Line$1(lineGeometry, matHelper.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], 'helper']],
  13947. Y: [[new Line$1(lineGeometry, matHelper.clone()), [0, -1e3, 0], [0, 0, Math.PI / 2], [1e6, 1, 1], 'helper']],
  13948. Z: [[new Line$1(lineGeometry, matHelper.clone()), [0, 0, -1e3], [0, -Math.PI / 2, 0], [1e6, 1, 1], 'helper']]
  13949. };
  13950. _this2.updateRotate = function () {
  13951. var gizmoRotate = {
  13952. 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]]],
  13953. 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]]],
  13954. 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]]],
  13955. /* E: [
  13956. [ new Line( CircleGeometry( 1.25, 1 ), matLineYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]],
  13957. [ 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 ]],
  13958. [ 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 ]],
  13959. [ 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 ]],
  13960. [ new Mesh( new CylinderBufferGeometry( 0.03, 0, 0.15, 4, 1, false ), matLineYellowTransparent ), [ 0, 1.17, 0 ], [ 0, 0, 0 ], [ 1, 1, 0.001 ]],
  13961. ] , */
  13962. XYZE: [[new Line$1(CircleGeometry(1, 1), matLineGray), null, [0, Math.PI / 2, 0]]]
  13963. };
  13964. var helperRotate = {
  13965. AXIS: [[new Line$1(lineGeometry, matHelper.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], 'helper']]
  13966. };
  13967. var pickerRotate = {
  13968. X: [[new Mesh(new TorusBufferGeometry(1, 0.1, 4, 24), matInvisible), [0, 0, 0], [0, -Math.PI / 2, -Math.PI / 2]]],
  13969. Y: [[new Mesh(new TorusBufferGeometry(1, 0.1, 4, 24), matInvisible), [0, 0, 0], [Math.PI / 2, 0, 0]]],
  13970. Z: [[new Mesh(new TorusBufferGeometry(1, 0.1, 4, 24), matInvisible), [0, 0, 0], [0, 0, -Math.PI / 2]]]
  13971. /*E: [
  13972. [ new Mesh( new TorusBufferGeometry( 1.25, 0.1, 2, 24 ), matInvisible ) ]
  13973. ] ,
  13974. XYZE: [
  13975. [ new Mesh( new SphereBufferGeometry( 0.7, 10, 8 ), matInvisible ) ]
  13976. ] */
  13977. };
  13978. if (options.rotateAxis) {
  13979. if (options.rotateAxis.indexOf('x') < 0) {
  13980. delete gizmoRotate.X;
  13981. delete gizmoRotate.XYZE;
  13982. delete pickerRotate.X;
  13983. }
  13984. if (options.rotateAxis.indexOf('y') < 0) {
  13985. delete gizmoRotate.Y;
  13986. delete gizmoRotate.XYZE;
  13987. delete pickerRotate.Y;
  13988. }
  13989. if (options.rotateAxis.indexOf('z') < 0) {
  13990. delete gizmoRotate.Z;
  13991. delete gizmoRotate.XYZE;
  13992. delete pickerRotate.Z;
  13993. }
  13994. }
  13995. return {
  13996. gizmo: gizmoRotate,
  13997. picker: pickerRotate,
  13998. helper: helperRotate
  13999. };
  14000. };
  14001. _this2.updateScale = function () {
  14002. var gizmoScale = {
  14003. 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
  14004. ],
  14005. Y: [[new Mesh(scaleHandleGeometry, matGreen), [0, 0.5, 0]], [getFatLine('y-', 'y')]],
  14006. 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]]],
  14007. /*XY: [[ new Mesh( scaleHandleGeometry, matYellowTransparent ), [ 0.85, 0.85, 0 ], null, [ 2, 2, 0.2 ]],
  14008. [ new Line( lineGeometry, matLineYellow ), [ 0.855, 0.98, 0 ], null, [ 0.125, 1, 1 ]],
  14009. [ new Line( lineGeometry, matLineYellow ), [ 0.98, 0.855, 0 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]]],
  14010. YZ: [[ new Mesh( scaleHandleGeometry, matCyanTransparent ), [ 0, 0.85, 0.85 ], null, [ 0.2, 2, 2 ]],
  14011. [ new Line( lineGeometry, matLineCyan ), [ 0, 0.855, 0.98 ], [ 0, 0, Math.PI / 2 ], [ 0.125, 1, 1 ]],
  14012. [ new Line( lineGeometry, matLineCyan ), [ 0, 0.98, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]],
  14013. XZ: [[ new Mesh( scaleHandleGeometry, matMagentaTransparent ), [ 0.85, 0, 0.85 ], null, [ 2, 0.2, 2 ]],
  14014. [ new Line( lineGeometry, matLineMagenta ), [ 0.855, 0, 0.98 ], null, [ 0.125, 1, 1 ]],
  14015. [ new Line( lineGeometry, matLineMagenta ), [ 0.98, 0, 0.855 ], [ 0, - Math.PI / 2, 0 ], [ 0.125, 1, 1 ]]], */
  14016. /*XYZX: [[ new Mesh( new BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 1.1, 0, 0 ]],],
  14017. XYZY: [[ new Mesh( new BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 1.1, 0 ]],] ,
  14018. XYZZ: [[ new Mesh( new BoxBufferGeometry( 0.125, 0.125, 0.125 ), matWhiteTransparent.clone() ), [ 0, 0, 1.1 ]],] */
  14019. XY: [[new Mesh(scaleHandleGeometry, matYellowTransparent), [0.5, 0.5, 0]]],
  14020. YZ: [[new Mesh(scaleHandleGeometry, matCyanTransparent), [0, 0.5, 0.5]]],
  14021. XZ: [[new Mesh(scaleHandleGeometry, matMagentaTransparent), [0.5, 0, 0.5]]],
  14022. XYZX: [[new Mesh(new BoxBufferGeometry(0.125, 0.125, 0.125), matWhiteTransparent.clone()), [0.5, 0.5, 0.5]]]
  14023. };
  14024. var pickerScale = {
  14025. X: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0.3, 0, 0], [0, 0, -Math.PI / 2]]],
  14026. Y: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0.3, 0]]],
  14027. Z: [[new Mesh(new CylinderBufferGeometry(0.2, 0, 0.5, 4, 1, false), matInvisible), [0, 0, 0.3], [Math.PI / 2, 0, 0]]],
  14028. /*XY: [[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0.85, 0 ], null, [ 3, 3, 0.2 ]],],
  14029. YZ: [[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0, 0.85, 0.85 ], null, [ 0.2, 3, 3 ]],],
  14030. XZ: [[ new Mesh( scaleHandleGeometry, matInvisible ), [ 0.85, 0, 0.85 ], null, [ 3, 0.2, 3 ]],], */
  14031. /*XYZX: [[ new Mesh( new BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 1.1, 0, 0 ]],],
  14032. XYZY: [[ new Mesh( new BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 1.1, 0 ]],] ,
  14033. XYZZ: [[ new Mesh( new BoxBufferGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 1.1 ]],] */
  14034. XY: [[new Mesh(scaleHandleGeometry, matInvisible), [0.5, 0.5, 0]]],
  14035. YZ: [[new Mesh(scaleHandleGeometry, matInvisible), [0, 0.5, 0.5]]],
  14036. XZ: [[new Mesh(scaleHandleGeometry, matInvisible), [0.5, 0, 0.5]]],
  14037. XYZX: [[new Mesh(new BoxBufferGeometry(0.2, 0.2, 0.2), matInvisible), [0.5, 0.5, 0.5]]]
  14038. };
  14039. if (options.scaleAxis) {
  14040. if (options.scaleAxis.indexOf('z') < 0) {
  14041. delete gizmoScale.Z;
  14042. delete gizmoScale.YZ;
  14043. delete gizmoScale.XZ;
  14044. delete gizmoScale.XYZX;
  14045. delete pickerScale.Z;
  14046. delete pickerScale.YZ;
  14047. delete pickerScale.XZ;
  14048. delete pickerScale.XYZX;
  14049. }
  14050. if (options.scaleAxis.indexOf('x') > -1 && options.scaleAxis.indexOf('y') > -1 && options.scaleAxis.indexOf('z') > -1) {
  14051. delete gizmoScale.XY;
  14052. delete gizmoScale.YZ;
  14053. delete gizmoScale.XZ;
  14054. delete pickerScale.XY;
  14055. delete pickerScale.YZ;
  14056. delete pickerScale.XZ;
  14057. }
  14058. }
  14059. var helperScale = {
  14060. X: [[new Line$1(lineGeometry, matHelper.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], 'helper']],
  14061. Y: [[new Line$1(lineGeometry, matHelper.clone()), [0, -1e3, 0], [0, 0, Math.PI / 2], [1e6, 1, 1], 'helper']],
  14062. Z: [[new Line$1(lineGeometry, matHelper.clone()), [0, 0, -1e3], [0, -Math.PI / 2, 0], [1e6, 1, 1], 'helper']]
  14063. };
  14064. return {
  14065. gizmo: gizmoScale,
  14066. picker: pickerScale,
  14067. helper: helperScale
  14068. };
  14069. }; // Creates an Object3D with gizmos described in custom hierarchy definition.
  14070. _this2.setupGizmo = function (gizmoMap) {
  14071. var gizmo = new Object3D();
  14072. for (var name in gizmoMap) {
  14073. for (var i = gizmoMap[name].length; i--;) {
  14074. var object = gizmoMap[name][i][0];
  14075. var position = gizmoMap[name][i][1];
  14076. var rotation = gizmoMap[name][i][2];
  14077. var scale = gizmoMap[name][i][3];
  14078. var tag = gizmoMap[name][i][4];
  14079. if (object.type != 'Fatline') {
  14080. //xzw add for fatline
  14081. object = object.clone();
  14082. } // name and tag properties are essential for picking and updating logic.
  14083. object.name = name;
  14084. object.tag = tag;
  14085. if (position) {
  14086. object.position.set(position[0], position[1], position[2]);
  14087. }
  14088. if (rotation) {
  14089. object.rotation.set(rotation[0], rotation[1], rotation[2]);
  14090. }
  14091. if (scale) {
  14092. object.scale.set(scale[0], scale[1], scale[2]);
  14093. }
  14094. object.updateMatrix();
  14095. if (object.geometry.clone()) {
  14096. var tempGeometry = object.geometry.clone();
  14097. tempGeometry.applyMatrix4(object.matrix);
  14098. object.geometry = tempGeometry;
  14099. } else {
  14100. object.geometry.applyMatrix4(object.matrix);
  14101. }
  14102. object.renderOrder = Infinity;
  14103. object.position.set(0, 0, 0);
  14104. object.rotation.set(0, 0, 0);
  14105. object.scale.set(1, 1, 1);
  14106. gizmo.add(object);
  14107. }
  14108. }
  14109. return gizmo;
  14110. }; // Reusable utility variables
  14111. var tempVector = new THREE.Vector3(0, 0, 0);
  14112. var tempEuler = new Euler();
  14113. var alignVector = new THREE.Vector3(0, 1, 0);
  14114. var zeroVector = new THREE.Vector3(0, 0, 0);
  14115. var lookAtMatrix = new Matrix4$1();
  14116. var tempQuaternion = new Quaternion$1();
  14117. var tempQuaternion2 = new Quaternion$1();
  14118. var identityQuaternion = new Quaternion$1();
  14119. var unitX = new THREE.Vector3(1, 0, 0);
  14120. var unitY = new THREE.Vector3(0, 1, 0);
  14121. var unitZ = new THREE.Vector3(0, 0, 1); // Gizmo creation
  14122. _this2.gizmo = {};
  14123. _this2.picker = {};
  14124. _this2.helper = {};
  14125. _this2.add(_this2.gizmo['translate'] = _this2.setupGizmo(gizmoTranslate));
  14126. _this2.add(_this2.gizmo['rotate'] = _this2.setupGizmo(_this2.updateRotate().gizmo));
  14127. _this2.add(_this2.gizmo['scale'] = _this2.setupGizmo(_this2.updateScale().gizmo));
  14128. _this2.add(_this2.picker['translate'] = _this2.setupGizmo(pickerTranslate));
  14129. _this2.add(_this2.picker['rotate'] = _this2.setupGizmo(_this2.updateRotate().picker));
  14130. _this2.add(_this2.picker['scale'] = _this2.setupGizmo(_this2.updateScale().picker));
  14131. _this2.add(_this2.helper['translate'] = _this2.setupGizmo(helperTranslate));
  14132. _this2.add(_this2.helper['rotate'] = _this2.setupGizmo(_this2.updateRotate().helper));
  14133. _this2.add(_this2.helper['scale'] = _this2.setupGizmo(_this2.updateScale().helper)); // Pickers should be hidden always
  14134. _this2.picker['translate'].visible = false;
  14135. _this2.picker['rotate'].visible = false;
  14136. _this2.picker['scale'].visible = false; // updateMatrixWorld will update transformations and appearance of individual handles
  14137. _this2.updateMatrixWorld = function () {
  14138. var space = this.space;
  14139. if (this.mode === 'scale') space = 'local'; // scale always oriented to local rotation
  14140. var quaternion = space === 'local' ? this.worldQuaternion : identityQuaternion; // Show only gizmos for current transform mode
  14141. this.gizmo['translate'].visible = this.mode === 'translate';
  14142. this.gizmo['rotate'].visible = this.mode === 'rotate';
  14143. this.gizmo['scale'].visible = this.mode === 'scale';
  14144. this.helper['translate'].visible = this.mode === 'translate';
  14145. this.helper['rotate'].visible = this.mode === 'rotate';
  14146. this.helper['scale'].visible = this.mode === 'scale';
  14147. var handles = [];
  14148. handles = handles.concat(this.picker[this.mode].children);
  14149. handles = handles.concat(this.gizmo[this.mode].children);
  14150. handles = handles.concat(this.helper[this.mode].children);
  14151. var eyeDistance = this.worldPosition.distanceTo(this.cameraPosition); //俯视图的透视和距离无关,因此在两种相机切换切换时大小过渡比较困难
  14152. if (this.player.mode == 'transitioning' && (this.player.modeTran.split('-')[0] == 'floorplan' || this.player.modeTran.split('-')[1] == 'floorplan')) {
  14153. var flcamera = this.player.cameraControls.cameras.floorplan;
  14154. var min = (flcamera.right - flcamera.left) / flcamera.aspect;
  14155. eyeDistance = Math.min(eyeDistance, min);
  14156. } else if (this.player.mode == 'floorplan') {
  14157. var flcamera = this.player.cameraControls.cameras.floorplan;
  14158. eyeDistance = (flcamera.right - flcamera.left) / flcamera.aspect;
  14159. }
  14160. var scale = eyeDistance * this.size / 7;
  14161. for (var i = 0; i < handles.length; i++) {
  14162. var handle = handles[i]; // hide aligned to camera
  14163. handle.visible = true;
  14164. handle.rotation.set(0, 0, 0);
  14165. handle.position.copy(this.worldPosition);
  14166. handle.scale.set(1, 1, 1).multiplyScalar(scale);
  14167. /* if(this.mode == "translate" && this.parent.object){
  14168. if(handle.name == "X"){
  14169. //handle.position.copy(handle.initPos || new THREE.Vector3).add(new THREE.Vector3( this.parent.object.width / 2 / scale, 0,0));
  14170. handle.position.add(new THREE.Vector3( this.parent.object.width / 2 , 0,0));
  14171. }else if(handle.name == "Y"){
  14172. //handle.position.set(0, this.parent.object.height / 2 / scale,0);
  14173. }else if(handle.name == "Z"){
  14174. //handle.position.set( 0,0,this.parent.object.depth / scale);
  14175. }
  14176. }
  14177. */
  14178. // TODO: simplify helpers and consider decoupling from gizmo
  14179. if (handle.tag === 'helper') {
  14180. handle.visible = false;
  14181. if (handle.name === 'AXIS') {
  14182. handle.position.copy(this.worldPositionStart);
  14183. handle.visible = !!this.axis;
  14184. if (this.axis === 'X') {
  14185. tempQuaternion.setFromEuler(tempEuler.set(0, 0, 0));
  14186. handle.quaternion.copy(quaternion).multiply(tempQuaternion);
  14187. if (Math.abs(alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye)) > 0.9) {
  14188. handle.visible = false;
  14189. }
  14190. }
  14191. if (this.axis === 'Y') {
  14192. tempQuaternion.setFromEuler(tempEuler.set(0, 0, Math.PI / 2));
  14193. handle.quaternion.copy(quaternion).multiply(tempQuaternion);
  14194. if (Math.abs(alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye)) > 0.9) {
  14195. handle.visible = false;
  14196. }
  14197. }
  14198. if (this.axis === 'Z') {
  14199. tempQuaternion.setFromEuler(tempEuler.set(0, Math.PI / 2, 0));
  14200. handle.quaternion.copy(quaternion).multiply(tempQuaternion);
  14201. if (Math.abs(alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye)) > 0.9) {
  14202. handle.visible = false;
  14203. }
  14204. }
  14205. if (this.axis === 'XYZE') {
  14206. tempQuaternion.setFromEuler(tempEuler.set(0, Math.PI / 2, 0));
  14207. alignVector.copy(this.rotationAxis);
  14208. handle.quaternion.setFromRotationMatrix(lookAtMatrix.lookAt(zeroVector, alignVector, unitY));
  14209. handle.quaternion.multiply(tempQuaternion);
  14210. handle.visible = this.dragging;
  14211. }
  14212. if (this.axis === 'E') {
  14213. handle.visible = false;
  14214. }
  14215. } else if (handle.name === 'START') {
  14216. handle.position.copy(this.worldPositionStart);
  14217. handle.visible = this.dragging;
  14218. } else if (handle.name === 'END') {
  14219. handle.position.copy(this.worldPosition);
  14220. handle.visible = this.dragging;
  14221. } else if (handle.name === 'DELTA') {
  14222. handle.position.copy(this.worldPositionStart);
  14223. handle.quaternion.copy(this.worldQuaternionStart);
  14224. tempVector.set(1e-10, 1e-10, 1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1);
  14225. tempVector.applyQuaternion(this.worldQuaternionStart.clone().invert());
  14226. handle.scale.copy(tempVector);
  14227. handle.visible = this.dragging;
  14228. } else {
  14229. handle.quaternion.copy(quaternion);
  14230. if (this.dragging) {
  14231. handle.position.copy(this.worldPositionStart);
  14232. } else {
  14233. handle.position.copy(this.worldPosition);
  14234. }
  14235. if (this.axis) {
  14236. handle.visible = this.axis.search(handle.name) !== -1;
  14237. }
  14238. } // If updating helper, skip rest of the loop
  14239. continue;
  14240. } // Align handles to current local or world rotation
  14241. handle.quaternion.copy(quaternion);
  14242. if (this.mode === 'translate' || this.mode === 'scale') {
  14243. // Hide translate and scale axis facing the camera
  14244. var AXIS_HIDE_TRESHOLD = 0.99;
  14245. var PLANE_HIDE_TRESHOLD = 0.2;
  14246. var AXIS_FLIP_TRESHOLD = 0.0;
  14247. if (options.dontHideWhenFaceCamera) ; else {
  14248. if (handle.name === 'X' || handle.name === 'XYZX') {
  14249. if (Math.abs(alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye)) > AXIS_HIDE_TRESHOLD) {
  14250. handle.scale.set(1e-10, 1e-10, 1e-10);
  14251. handle.visible = false;
  14252. }
  14253. }
  14254. if (handle.name === 'Y' || handle.name === 'XYZY') {
  14255. if (Math.abs(alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye)) > AXIS_HIDE_TRESHOLD) {
  14256. handle.scale.set(1e-10, 1e-10, 1e-10);
  14257. handle.visible = false;
  14258. }
  14259. }
  14260. if (handle.name === 'Z' || handle.name === 'XYZZ') {
  14261. if (Math.abs(alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye)) > AXIS_HIDE_TRESHOLD) {
  14262. handle.scale.set(1e-10, 1e-10, 1e-10);
  14263. handle.visible = false;
  14264. }
  14265. }
  14266. if (handle.name === 'XY') {
  14267. if (Math.abs(alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye)) < PLANE_HIDE_TRESHOLD) {
  14268. handle.scale.set(1e-10, 1e-10, 1e-10);
  14269. handle.visible = false;
  14270. }
  14271. }
  14272. if (handle.name === 'YZ') {
  14273. if (Math.abs(alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye)) < PLANE_HIDE_TRESHOLD) {
  14274. handle.scale.set(1e-10, 1e-10, 1e-10);
  14275. handle.visible = false;
  14276. }
  14277. }
  14278. if (handle.name === 'XZ') {
  14279. if (Math.abs(alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye)) < PLANE_HIDE_TRESHOLD) {
  14280. handle.scale.set(1e-10, 1e-10, 1e-10);
  14281. handle.visible = false;
  14282. }
  14283. }
  14284. } // Flip translate and scale axis ocluded behind another axis
  14285. var zReverse = false;
  14286. if (alignVector.copy(unitZ).applyQuaternion(quaternion).dot(this.eye) < AXIS_FLIP_TRESHOLD) {
  14287. zReverse = true;
  14288. } //xzw modify : remove backward arrow
  14289. if (handle.name.search('X') !== -1) {
  14290. if (alignVector.copy(unitX).applyQuaternion(quaternion).dot(this.eye) < AXIS_FLIP_TRESHOLD) {
  14291. /* if ( handle.tag === 'fwd' ) {
  14292. handle.visible = false;
  14293. } else {
  14294. handle.scale.x *= - 1;
  14295. }
  14296. } else if ( handle.tag === 'bwd' ) {
  14297. handle.visible = false;*/
  14298. //反向
  14299. if (handle.type == 'Fatline') {
  14300. handle.geometry = fatLineGeos['x-'];
  14301. } else {
  14302. handle.scale.x *= -1;
  14303. }
  14304. if (this.space == 'world') {
  14305. handle.position.add(new THREE.Vector3(-0.1, 0, 0));
  14306. } else {
  14307. if (this.parent.object) {
  14308. //放置在边缘
  14309. 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));
  14310. }
  14311. }
  14312. } else {
  14313. if (handle.type == 'Fatline') {
  14314. handle.geometry = fatLineGeos['x+'];
  14315. }
  14316. if (this.space == 'world') {
  14317. handle.position.add(new THREE.Vector3(0.1, 0, 0));
  14318. } else {
  14319. if (this.parent.object) {
  14320. //放置在边缘
  14321. 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));
  14322. }
  14323. }
  14324. }
  14325. }
  14326. if (handle.name.search('Y') !== -1) {
  14327. if (alignVector.copy(unitY).applyQuaternion(quaternion).dot(this.eye) < AXIS_FLIP_TRESHOLD) {
  14328. /* if ( handle.tag === 'fwd' ) {
  14329. handle.visible = false;
  14330. } else {
  14331. handle.scale.y *= - 1;
  14332. }
  14333. } else if ( handle.tag === 'bwd' ) {
  14334. handle.visible = false;
  14335. */
  14336. if (handle.type == 'Fatline') {
  14337. handle.geometry = fatLineGeos['y-'];
  14338. } else handle.scale.y *= -1;
  14339. 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));
  14340. } else {
  14341. if (handle.type == 'Fatline') {
  14342. handle.geometry = fatLineGeos['y+'];
  14343. }
  14344. 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));
  14345. }
  14346. }
  14347. if (handle.name.search('Z') !== -1) {
  14348. if (zReverse) {
  14349. if (handle.type == 'Fatline') {
  14350. handle.geometry = fatLineGeos['z-'];
  14351. } else handle.scale.z *= -1;
  14352. if (this.space == 'world') handle.position.add(new THREE.Vector3(0, 0, -0.1));
  14353. } else {
  14354. if (handle.type == 'Fatline') {
  14355. handle.geometry = fatLineGeos['z+'];
  14356. }
  14357. /* if(this.parent.object ){
  14358. if(this.mode != "scale" ){
  14359. handle.position.add(new THREE.Vector3(0, 0 , this.parent.object.depth).applyQuaternion( handle.quaternion ));
  14360. }else{
  14361. handle.position.add(new THREE.Vector3(0, 0 , this.parent.object.depth).applyQuaternion( handle.quaternion ));
  14362. }
  14363. } */
  14364. 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));
  14365. }
  14366. }
  14367. } else if (this.mode === 'rotate') {
  14368. // Align handles to current local or world rotation
  14369. tempQuaternion2.copy(quaternion);
  14370. alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
  14371. if (handle.name.search('E') !== -1) {
  14372. handle.quaternion.setFromRotationMatrix(lookAtMatrix.lookAt(this.eye, zeroVector, unitY));
  14373. }
  14374. if (handle.name === 'X') {
  14375. if (this.spaceForRotate) {
  14376. quaternion = this.spaceForRotate.x === 'local' ? this.worldQuaternion : identityQuaternion;
  14377. tempQuaternion2.copy(quaternion);
  14378. alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
  14379. }
  14380. tempQuaternion.setFromAxisAngle(unitX, Math.atan2(-alignVector.y, alignVector.z));
  14381. tempQuaternion.multiplyQuaternions(tempQuaternion2, tempQuaternion);
  14382. handle.quaternion.copy(tempQuaternion);
  14383. }
  14384. if (handle.name === 'Y') {
  14385. if (this.spaceForRotate) {
  14386. quaternion = this.spaceForRotate.y === 'local' ? this.worldQuaternion : identityQuaternion;
  14387. tempQuaternion2.copy(quaternion);
  14388. alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
  14389. }
  14390. tempQuaternion.setFromAxisAngle(unitY, Math.atan2(alignVector.x, alignVector.z));
  14391. tempQuaternion.multiplyQuaternions(tempQuaternion2, tempQuaternion);
  14392. handle.quaternion.copy(tempQuaternion);
  14393. }
  14394. if (handle.name === 'Z') {
  14395. if (this.spaceForRotate) {
  14396. quaternion = this.spaceForRotate.z === 'local' ? this.worldQuaternion : identityQuaternion;
  14397. tempQuaternion2.copy(quaternion);
  14398. alignVector.copy(this.eye).applyQuaternion(tempQuaternion.copy(quaternion).invert());
  14399. }
  14400. tempQuaternion.setFromAxisAngle(unitZ, Math.atan2(alignVector.y, alignVector.x));
  14401. tempQuaternion.multiplyQuaternions(tempQuaternion2, tempQuaternion);
  14402. handle.quaternion.copy(tempQuaternion);
  14403. }
  14404. } // Hide disabled axes
  14405. handle.visible = handle.visible && (handle.name.indexOf('X') === -1 || this.showX);
  14406. handle.visible = handle.visible && (handle.name.indexOf('Y') === -1 || this.showY);
  14407. handle.visible = handle.visible && (handle.name.indexOf('Z') === -1 || this.showZ);
  14408. handle.visible = handle.visible && (handle.name.indexOf('E') === -1 || this.showX && this.showY && this.showZ); // highlight selected axis
  14409. handle.material._opacity = handle.material._opacity || handle.material.opacity;
  14410. handle.material._color = handle.material._color || handle.material.color.clone();
  14411. handle.material.color.copy(handle.material._color);
  14412. handle.material.opacity = handle.material._opacity;
  14413. if (!this.enabled) {
  14414. handle.material.opacity *= 0.5;
  14415. handle.material.color.lerp(new Color(1, 1, 1), 0.5);
  14416. } else if (this.axis) {
  14417. if (handle.name === this.axis) {
  14418. handle.material.opacity = 1.0;
  14419. handle.material.color.lerp(new Color(1, 1, 1), 0.5);
  14420. } else if (this.axis.split('').some(function (a) {
  14421. return handle.name === a;
  14422. })) {
  14423. handle.material.opacity = 1.0;
  14424. handle.material.color.lerp(new Color(1, 1, 1), 0.5);
  14425. } else {
  14426. handle.material.opacity *= 0.25;
  14427. handle.material.color.lerp(new Color(1, 1, 1), 0.5);
  14428. }
  14429. }
  14430. }
  14431. Object3D.prototype.updateMatrixWorld.call(this);
  14432. };
  14433. return _this2;
  14434. }
  14435. return TransformControlsGizmo;
  14436. }(THREE.Object3D); // TransformControlsGizmo.prototype = Object.assign(Object.create(Object3D.prototype), {
  14437. // constructor: TransformControlsGizmo,
  14438. // isTransformControlsGizmo: true,
  14439. // })
  14440. var unitX = new THREE.Vector3(1, 0, 0);
  14441. var unitY = new THREE.Vector3(0, 1, 0);
  14442. var unitZ = new THREE.Vector3(0, 0, 1);
  14443. var tempVector$1 = new THREE.Vector3();
  14444. var dirVector = new THREE.Vector3();
  14445. var alignVector = new THREE.Vector3();
  14446. var tempMatrix = new THREE.Matrix4();
  14447. var identityQuaternion = new THREE.Quaternion();
  14448. var unitX = new THREE.Vector3(1, 0, 0);
  14449. var unitY = new THREE.Vector3(0, 1, 0);
  14450. var unitZ = new THREE.Vector3(0, 0, 1);
  14451. var tempVector$1 = new THREE.Vector3();
  14452. var dirVector = new THREE.Vector3();
  14453. var alignVector = new THREE.Vector3();
  14454. var tempMatrix = new THREE.Matrix4();
  14455. var identityQuaternion = new THREE.Quaternion();
  14456. var TransformControlsPlane = /*#__PURE__*/function (_THREE$Mesh) {
  14457. _inherits(TransformControlsPlane, _THREE$Mesh);
  14458. var _super3 = _createSuper$1E(TransformControlsPlane);
  14459. function TransformControlsPlane(options) {
  14460. var _this3;
  14461. _classCallCheck(this, TransformControlsPlane);
  14462. _this3 = _super3.call(this, new PlaneBufferGeometry(10000, 10000, 2, 2), new MeshBasicMaterial({
  14463. color: '#ff0000',
  14464. visible: false,
  14465. wireframe: false,
  14466. side: DoubleSide,
  14467. transparent: true,
  14468. opacity: 0.6
  14469. }));
  14470. _this3.type = 'TransformControlsPlane';
  14471. return _this3;
  14472. }
  14473. _createClass(TransformControlsPlane, [{
  14474. key: "updateMatrixWorld",
  14475. value: function updateMatrixWorld() {
  14476. var space = this.space; //this.position.copy( this.worldPosition );//xzw ��
  14477. this.parent.intersect ? this.position.copy(this.parent.intersect.position) : this.position.copy(this.worldPosition);
  14478. if (this.mode === 'scale') space = 'local'; // scale always oriented to local rotation
  14479. unitX.set(1, 0, 0).applyQuaternion(space === 'local' ? this.worldQuaternion : identityQuaternion);
  14480. unitY.set(0, 1, 0).applyQuaternion(space === 'local' ? this.worldQuaternion : identityQuaternion);
  14481. unitZ.set(0, 0, 1).applyQuaternion(space === 'local' ? this.worldQuaternion : identityQuaternion); // Align the plane for current transform mode, axis and space.
  14482. alignVector.copy(unitY);
  14483. switch (this.mode) {
  14484. case 'translate':
  14485. case 'scale':
  14486. switch (this.axis) {
  14487. case 'X':
  14488. alignVector.copy(this.eye).cross(unitX);
  14489. 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 ));
  14490. break;
  14491. case 'Y':
  14492. alignVector.copy(this.eye).cross(unitY);
  14493. dirVector.copy(unitY).cross(alignVector);
  14494. break;
  14495. case 'Z':
  14496. alignVector.copy(this.eye).cross(unitZ);
  14497. dirVector.copy(unitZ).cross(alignVector);
  14498. break;
  14499. case 'XY':
  14500. dirVector.copy(unitZ);
  14501. break;
  14502. case 'YZ':
  14503. dirVector.copy(unitX);
  14504. break;
  14505. case 'XZ':
  14506. alignVector.copy(unitZ);
  14507. dirVector.copy(unitY);
  14508. break;
  14509. case 'XYZ':
  14510. case 'E':
  14511. default:
  14512. //xzw add for scale xyzz
  14513. dirVector.set(0, 0, 0);
  14514. break;
  14515. }
  14516. break;
  14517. case 'rotate':
  14518. default:
  14519. // special case for rotate
  14520. dirVector.set(0, 0, 0);
  14521. } //this.axis && console.log(this.axis)
  14522. if (dirVector.length() === 0) {
  14523. // If in rotate mode, make the plane parallel to camera
  14524. this.quaternion.copy(this.cameraQuaternion);
  14525. } else {
  14526. tempMatrix.lookAt(tempVector$1.set(0, 0, 0), dirVector, alignVector);
  14527. this.quaternion.setFromRotationMatrix(tempMatrix);
  14528. }
  14529. Object3D.prototype.updateMatrixWorld.call(this);
  14530. }
  14531. }]);
  14532. return TransformControlsPlane;
  14533. }(THREE.Mesh); // TransformControlsPlane.prototype = Object.assign(Object.create(Mesh.prototype), {
  14534. 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); }; }
  14535. 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; } }
  14536. var History = /*#__PURE__*/function (_THREE$EventDispatche) {
  14537. _inherits(History, _THREE$EventDispatche);
  14538. var _super = _createSuper$1D(History);
  14539. function History(o) {
  14540. var _this;
  14541. _classCallCheck(this, History);
  14542. _this = _super.call(this);
  14543. _this.undoList = [];
  14544. _this.redoList = [];
  14545. _this.applyData = o.applyData; //应用数据的方法
  14546. _this.getData = o.getData; //获取数据的方法
  14547. _this.dataBefore;
  14548. o.player.domElement.addEventListener('keydown', function (e) {
  14549. if (e.keyCode == 90 && e.ctrlKey) {
  14550. //Z
  14551. _this.undo();
  14552. } else if (e.keyCode == 89 && e.ctrlKey) {
  14553. //Y
  14554. _this.redo();
  14555. }
  14556. });
  14557. return _this;
  14558. }
  14559. _createClass(History, [{
  14560. key: "undo",
  14561. value: function undo() {
  14562. //回退
  14563. var length = this.undoList.length;
  14564. if (length > 0) {
  14565. var unExist;
  14566. var last = this.undoList.pop();
  14567. this.applyData && (unExist = !this.applyData(last.before));
  14568. unExist || this.redoList.push(last);
  14569. unExist && this.undo(); //找不到就回退下一个。
  14570. this.dispatchEvent('undo'); //console.log('undo',last)
  14571. }
  14572. }
  14573. }, {
  14574. key: "redo",
  14575. value: function redo() {
  14576. //撤销回退
  14577. this.undoList.length;
  14578. var last = this.redoList.pop();
  14579. if (last) {
  14580. //注意:每行的顺序不能乱
  14581. this.undoList.push(last);
  14582. this.applyData && this.applyData(last.after);
  14583. this.dispatchEvent('redo'); //console.log('redo',last)
  14584. }
  14585. }
  14586. }, {
  14587. key: "beforeChange",
  14588. value: function beforeChange(o) {
  14589. //在变化之前(可能执行好几次直到变化完,但只有第一次有效)。 o的内容完全根据getData怎么定义
  14590. if (!this.dataBefore) {
  14591. var data = this.getData(o);
  14592. data && (this.dataBefore = data);
  14593. }
  14594. }
  14595. }, {
  14596. key: "afterChange",
  14597. value: function afterChange(o) {
  14598. //变化结束,从beforeChange到此算一次操作。
  14599. if (this.dataBefore) {
  14600. this.writeIn({
  14601. before: this.dataBefore,
  14602. after: this.getData(o)
  14603. }); //写入某物体变化前和变化后的状态
  14604. this.dataBefore = null;
  14605. }
  14606. }
  14607. }, {
  14608. key: "writeIn",
  14609. value: function writeIn(data) {
  14610. this.redoList.length = 0; //一旦录入新的操作,就不允许undo了
  14611. this.undoList.push(data); //console.log('新增undo', data)
  14612. }
  14613. }, {
  14614. key: "clear",
  14615. value: function clear() {
  14616. this.redoList.length = 0;
  14617. this.undoList.length = 0;
  14618. this.dataBefore = null;
  14619. }
  14620. }]);
  14621. return History;
  14622. }(THREE.EventDispatcher);
  14623. var CursorDeal = {
  14624. priorityEvent: [//在前面的优先级高
  14625. {
  14626. hoverFirstMarker: 'pointer'
  14627. }, {
  14628. polygon_isIntersectSelf: 'not-allowed'
  14629. }, {
  14630. polygon_AtWrongPlace: 'not-allowed'
  14631. }, {
  14632. markerMove: 'grab'
  14633. }, {
  14634. crosshair: 'crosshair'
  14635. }, {
  14636. grabbing: 'grabbing'
  14637. }, //通用
  14638. {
  14639. hoverGrab: 'grab'
  14640. }, //通用
  14641. {
  14642. moving: 'move'
  14643. }, //通用
  14644. //grab move crosshair not-allowed
  14645. {
  14646. hoverTag3d: 'pointer'
  14647. }, {
  14648. polygonMark_move: 'move'
  14649. }, {
  14650. polygonMark_hover: 'pointer'
  14651. }, {
  14652. polygonMark_subPen: 'url(' + texture.getImageURL('images/polygon_mark/pic_pen_sub.png') + '),auto'
  14653. }, {
  14654. polygonMark_addPen: 'url(' + texture.getImageURL('images/polygon_mark/pic_pen_add.png') + '),auto'
  14655. }, {
  14656. polygonMark_pen: 'url(' + texture.getImageURL('images/polygon_mark/pic_pen.png') + '),auto'
  14657. }, {
  14658. hoverTranHandle: 'grab'
  14659. }, {
  14660. dragOverlay: 'move'
  14661. }, {
  14662. hoverOverlay: 'pointer'
  14663. }, {
  14664. hoverMonitor: 'pointer'
  14665. }, {
  14666. addOverlay: 'url(https://4dkk.4dage.com/v3-test/img/box_video.png),auto'
  14667. }, {
  14668. addOverlay: 'url(https://4dkk.4dage.com/v3-test/img/box_video.png),auto'
  14669. }, {
  14670. hoverFootMarker: 'pointer'
  14671. }, {
  14672. hoverView: 'pointer'
  14673. }, {
  14674. dragView: 'move'
  14675. }, {
  14676. viewChoosePos: 'pointer'
  14677. }],
  14678. list: [],
  14679. //当前存在的cursor状态
  14680. currentCursorIndex: null,
  14681. init: function init(player) {
  14682. /* app.Scene.on('loaded', () => {
  14683. player = this.app.core.get('Player')
  14684. this.domElements = [player.domeElement];
  14685. }) */
  14686. this.domElements = [player.domElement];
  14687. },
  14688. add: function add(name) {
  14689. var priorityItem = this.priorityEvent.find(function (e) {
  14690. return e[name];
  14691. });
  14692. if (!priorityItem) {
  14693. console.error('CursorDeal 未定义优先级 name:' + name);
  14694. return;
  14695. }
  14696. if (!this.list.includes(name)) {
  14697. this.judge({
  14698. addItem: priorityItem,
  14699. name
  14700. });
  14701. this.list.push(name);
  14702. }
  14703. },
  14704. remove: function remove(name) {
  14705. var index = this.list.indexOf(name);
  14706. if (index > -1) {
  14707. this.list.splice(index, 1);
  14708. this.judge();
  14709. }
  14710. },
  14711. judge: function judge() {
  14712. var _this = this;
  14713. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  14714. //console.log(o,this.list)
  14715. if (o.addItem) {
  14716. var addIndex = this.priorityEvent.indexOf(o.addItem);
  14717. if (addIndex < this.currentCursorIndex || this.currentCursorIndex == void 0) {
  14718. //console.log(o.addItem[o.name])
  14719. this.domElements.forEach(function (e) {
  14720. return e.style.cursor = o.addItem[o.name];
  14721. });
  14722. this.currentCursorIndex = addIndex;
  14723. }
  14724. } else {
  14725. var levelMax = {
  14726. index: Infinity,
  14727. cursor: null
  14728. };
  14729. this.list.forEach(function (name) {
  14730. var priorityItem = _this.priorityEvent.find(function (e) {
  14731. return e[name];
  14732. });
  14733. var index = _this.priorityEvent.indexOf(priorityItem);
  14734. if (index < levelMax.index) {
  14735. levelMax.index = index;
  14736. levelMax.cursor = priorityItem[name];
  14737. }
  14738. });
  14739. this.currentCursorIndex = levelMax.index;
  14740. this.domElements.forEach(function (e) {
  14741. return e.style.cursor = levelMax.cursor || '';
  14742. }); //console.log(levelMax.cursor)
  14743. }
  14744. }
  14745. };
  14746. function _createForOfIteratorHelper$b(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$b(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; } } }; }
  14747. function _unsupportedIterableToArray$b(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$b(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$b(o, minLen); }
  14748. function _arrayLikeToArray$b(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; }
  14749. 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); }; }
  14750. 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; } }
  14751. var OpaWhenNotSelect = 0.6;
  14752. var ScaleRatio = 3;
  14753. var OutlineColor = 0x666666;
  14754. var config$3 = {
  14755. axis: {
  14756. x: {
  14757. color: '#ea3f3f'
  14758. },
  14759. xyz: {
  14760. color: '#ccc'
  14761. },
  14762. y: {
  14763. color: '#86c215'
  14764. },
  14765. z: {
  14766. color: '#3396f8'
  14767. }
  14768. }
  14769. };
  14770. var TransformationTool = /*#__PURE__*/function (_THREE$Object3D) {
  14771. _inherits(TransformationTool, _THREE$Object3D);
  14772. var _super = _createSuper$1C(TransformationTool);
  14773. function TransformationTool(player) {
  14774. var _this;
  14775. _classCallCheck(this, TransformationTool);
  14776. _this = _super.call(this);
  14777. _this.player = player;
  14778. _this.modesEnabled = {}; //add
  14779. _this.visible = false;
  14780. _this.selection = [];
  14781. _this.pivot = new THREE.Vector3();
  14782. _this.dragging = false;
  14783. _this.showPickVolumes = false;
  14784. /*
  14785. this.viewer.addEventListener('global_touchstart',(e)=>{ //add
  14786. this.update()
  14787. })
  14788. this.viewer.addEventListener('global_mousemove',(e)=>{ //add
  14789. this.onPointerMove()
  14790. }) */
  14791. _this.player.on('update', _this.update.bind(_assertThisInitialized(_this)));
  14792. var red = config$3.axis.x.color;
  14793. var green = config$3.axis.y.color;
  14794. var blue = config$3.axis.z.color;
  14795. var white = config$3.axis.xyz.color;
  14796. _this.activeHandle = null;
  14797. _this.scaleHandles = {
  14798. 'scale.x+': {
  14799. name: 'scale.x+',
  14800. node: new THREE.Object3D(),
  14801. color: red,
  14802. alignment: [+1, +0, +0]
  14803. },
  14804. 'scale.x-': {
  14805. name: 'scale.x-',
  14806. node: new THREE.Object3D(),
  14807. color: red,
  14808. alignment: [-1, +0, +0]
  14809. },
  14810. 'scale.y+': {
  14811. name: 'scale.y+',
  14812. node: new THREE.Object3D(),
  14813. color: green,
  14814. alignment: [+0, +1, +0]
  14815. },
  14816. 'scale.y-': {
  14817. name: 'scale.y-',
  14818. node: new THREE.Object3D(),
  14819. color: green,
  14820. alignment: [+0, -1, +0]
  14821. },
  14822. 'scale.z+': {
  14823. name: 'scale.z+',
  14824. node: new THREE.Object3D(),
  14825. color: blue,
  14826. alignment: [+0, +0, +1]
  14827. },
  14828. 'scale.z-': {
  14829. name: 'scale.z-',
  14830. node: new THREE.Object3D(),
  14831. color: blue,
  14832. alignment: [+0, +0, -1]
  14833. },
  14834. lines: {
  14835. name: 'lines',
  14836. node: new THREE.Object3D(),
  14837. dontScale: true
  14838. } //add
  14839. };
  14840. _this.focusHandles = {
  14841. 'focus.x+': {
  14842. name: 'focus.x+',
  14843. node: new THREE.Object3D(),
  14844. color: red,
  14845. alignment: [+1, +0, +0]
  14846. },
  14847. 'focus.x-': {
  14848. name: 'focus.x-',
  14849. node: new THREE.Object3D(),
  14850. color: red,
  14851. alignment: [-1, +0, +0]
  14852. },
  14853. 'focus.y+': {
  14854. name: 'focus.y+',
  14855. node: new THREE.Object3D(),
  14856. color: green,
  14857. alignment: [+0, +1, +0]
  14858. },
  14859. 'focus.y-': {
  14860. name: 'focus.y-',
  14861. node: new THREE.Object3D(),
  14862. color: green,
  14863. alignment: [+0, -1, +0]
  14864. },
  14865. 'focus.z+': {
  14866. name: 'focus.z+',
  14867. node: new THREE.Object3D(),
  14868. color: blue,
  14869. alignment: [+0, +0, +1]
  14870. },
  14871. 'focus.z-': {
  14872. name: 'focus.z-',
  14873. node: new THREE.Object3D(),
  14874. color: blue,
  14875. alignment: [+0, +0, -1]
  14876. }
  14877. };
  14878. _this.translationHandles = {
  14879. 'translation.x': {
  14880. name: 'translation.x',
  14881. node: new THREE.Object3D(),
  14882. color: red,
  14883. alignment: [1, 0, 0]
  14884. },
  14885. 'translation.y': {
  14886. name: 'translation.y',
  14887. node: new THREE.Object3D(),
  14888. color: green,
  14889. alignment: [0, 1, 0]
  14890. },
  14891. 'translation.z': {
  14892. name: 'translation.z',
  14893. node: new THREE.Object3D(),
  14894. color: blue,
  14895. alignment: [0, 0, 1]
  14896. },
  14897. //add
  14898. 'translation.xyz': {
  14899. name: 'translation.xyz',
  14900. node: new THREE.Object3D(),
  14901. color: white,
  14902. alignment: [0, 0, 0],
  14903. alignment2: [1, 1, 1]
  14904. },
  14905. 'translation.plane.xy': {
  14906. name: 'translation.plane.xy',
  14907. node: new THREE.Object3D(),
  14908. color: blue,
  14909. alignment: [0, 0, 1],
  14910. alignment2: [1, 1, 0]
  14911. },
  14912. 'translation.plane.yz': {
  14913. name: 'translation.plane.yz',
  14914. node: new THREE.Object3D(),
  14915. color: red,
  14916. alignment: [1, 0, 0],
  14917. alignment2: [0, 1, 1]
  14918. },
  14919. 'translation.plane.xz': {
  14920. name: 'translation.plane.xz',
  14921. node: new THREE.Object3D(),
  14922. color: green,
  14923. alignment: [0, 1, 0],
  14924. alignment2: [1, 0, 1]
  14925. }
  14926. };
  14927. _this.rotationHandles = {
  14928. 'rotation.x': {
  14929. name: 'rotation.x',
  14930. node: new THREE.Object3D(),
  14931. color: red,
  14932. alignment: [1, 0, 0]
  14933. },
  14934. 'rotation.y': {
  14935. name: 'rotation.y',
  14936. node: new THREE.Object3D(),
  14937. color: green,
  14938. alignment: [0, 1, 0]
  14939. },
  14940. 'rotation.z': {
  14941. name: 'rotation.z',
  14942. node: new THREE.Object3D(),
  14943. color: blue,
  14944. alignment: [0, 0, 1]
  14945. }
  14946. };
  14947. _this.handles = Object.assign({}, _this.scaleHandles, {} , _this.translationHandles, _this.rotationHandles);
  14948. _this.pickVolumes = [];
  14949. _this.initializeScaleHandles();
  14950. _this.initializeFocusHandles();
  14951. _this.initializeTranslationHandles();
  14952. _this.initializeRotationHandles();
  14953. /* let boxFrameGeometry = new THREE.Geometry();
  14954. {
  14955. // bottom
  14956. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));
  14957. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));
  14958. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));
  14959. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));
  14960. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));
  14961. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));
  14962. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));
  14963. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));
  14964. // top
  14965. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));
  14966. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));
  14967. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));
  14968. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));
  14969. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));
  14970. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));
  14971. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));
  14972. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));
  14973. // sides
  14974. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, 0.5));
  14975. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, 0.5));
  14976. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, 0.5));
  14977. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, 0.5));
  14978. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, -0.5, -0.5));
  14979. boxFrameGeometry.vertices.push(new THREE.Vector3(0.5, 0.5, -0.5));
  14980. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, -0.5, -0.5));
  14981. boxFrameGeometry.vertices.push(new THREE.Vector3(-0.5, 0.5, -0.5));
  14982. } */
  14983. var boxFrameGeometry = new THREE.BufferGeometry();
  14984. {
  14985. var vertices = []; // bottom
  14986. vertices.push(-0.5, -0.5, 0.5);
  14987. vertices.push(0.5, -0.5, 0.5);
  14988. vertices.push(0.5, -0.5, 0.5);
  14989. vertices.push(0.5, -0.5, -0.5);
  14990. vertices.push(0.5, -0.5, -0.5);
  14991. vertices.push(-0.5, -0.5, -0.5);
  14992. vertices.push(-0.5, -0.5, -0.5);
  14993. vertices.push(-0.5, -0.5, 0.5); // top
  14994. vertices.push(-0.5, 0.5, 0.5);
  14995. vertices.push(0.5, 0.5, 0.5);
  14996. vertices.push(0.5, 0.5, 0.5);
  14997. vertices.push(0.5, 0.5, -0.5);
  14998. vertices.push(0.5, 0.5, -0.5);
  14999. vertices.push(-0.5, 0.5, -0.5);
  15000. vertices.push(-0.5, 0.5, -0.5);
  15001. vertices.push(-0.5, 0.5, 0.5); // sides
  15002. vertices.push(-0.5, -0.5, 0.5);
  15003. vertices.push(-0.5, 0.5, 0.5);
  15004. vertices.push(0.5, -0.5, 0.5);
  15005. vertices.push(0.5, 0.5, 0.5);
  15006. vertices.push(0.5, -0.5, -0.5);
  15007. vertices.push(0.5, 0.5, -0.5);
  15008. vertices.push(-0.5, -0.5, -0.5);
  15009. vertices.push(-0.5, 0.5, -0.5);
  15010. var positions = new Float32Array(vertices);
  15011. boxFrameGeometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
  15012. }
  15013. _this.frame = new THREE.LineSegments(boxFrameGeometry, new THREE.LineBasicMaterial({
  15014. color: 0xffff00
  15015. }));
  15016. _this.add(_this.frame); //------------------add-----------------------
  15017. _this.setModeEnable(['translation']); //init
  15018. //Potree.Utils.setObjectLayers(this.root, 'transformationTool' )
  15019. _this.traverse(function (e) {
  15020. e.pickDontCheckDis = true; //pick时不需要识别是否在点云之上
  15021. });
  15022. {
  15023. var exist = function exist(object) {
  15024. //是否没被删除(暂时不考虑换了parent)
  15025. while (object.parent) {
  15026. object = object.parent;
  15027. }
  15028. if (object instanceof THREE.Scene) {
  15029. return true;
  15030. }
  15031. };
  15032. _this.history = new History({
  15033. //也可以写到全局,但需要加个判断物品是否存在的函数
  15034. applyData: function applyData(data) {
  15035. if (exist(data.object)) {
  15036. data.matrix.decompose(data.object.position, data.object.quaternion, data.object.scale);
  15037. data.object.matrix.copy(data.matrix);
  15038. _this.dispatchEvent({
  15039. type: 'changeByHistory',
  15040. data
  15041. });
  15042. return true;
  15043. }
  15044. },
  15045. getData: function getData(data) {
  15046. return data;
  15047. },
  15048. player: _this.player
  15049. });
  15050. _this.addEventListener('transformed', function (e) {
  15051. var object = _this.selection[0];
  15052. _this.history.beforeChange({
  15053. object,
  15054. matrix: e.matrixBefore.clone()
  15055. });
  15056. });
  15057. _this.addEventListener('stopDrag', function (e) {
  15058. var object = _this.selection[0];
  15059. object && _this.history.afterChange({
  15060. object,
  15061. matrix: object.matrix.clone()
  15062. });
  15063. });
  15064. }
  15065. return _this;
  15066. }
  15067. _createClass(TransformationTool, [{
  15068. key: "attach",
  15069. value: function attach(object) {
  15070. //add
  15071. this.selection = [object];
  15072. }
  15073. }, {
  15074. key: "detach",
  15075. value: function detach(object) {
  15076. //add
  15077. if (!object) return this.selection = [];
  15078. var index = this.selection.indexOf(object);
  15079. this.selection.splice(index, 1);
  15080. }
  15081. }, {
  15082. key: "setModeEnable",
  15083. value: function setModeEnable() {
  15084. var _this2 = this;
  15085. var enableModes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  15086. //xzw add
  15087. var length = 0;
  15088. ['translation', 'scale', 'rotation'].forEach(function (mode) {
  15089. var handels = _this2[mode + 'Handles'];
  15090. var enable = enableModes.includes(mode);
  15091. for (var o in handels) {
  15092. common$1.updateVisible(handels[o].node, 'modeForce', !!enable);
  15093. }
  15094. _this2.modesEnabled[mode] = !!enable;
  15095. enable && length++;
  15096. });
  15097. if (this.style != 'mixedModes' && length > 1) {
  15098. this.changeStyle('mixedModes');
  15099. } else if (this.style != 'singleMode' && length == 1) {
  15100. this.changeStyle('singleMode');
  15101. }
  15102. }
  15103. }, {
  15104. key: "changeStyle",
  15105. value: function changeStyle(style) {
  15106. var _this3 = this;
  15107. // 切换单个mode & 多个mode混合 风格(因多个混合比较拥挤,需要做调整)
  15108. var s1 = style == 'singleMode' ? 30 : 25;
  15109. var s2 = style == 'singleMode' ? 15 : 10;
  15110. ['x', 'y', 'z'].forEach(function (axis) {
  15111. _this3.translationHandles['translation.' + axis].node.children.forEach(function (mesh) {
  15112. if (mesh.name.includes('arrow')) {
  15113. common$1.updateVisible(mesh, 'modeStyle', style == 'singleMode');
  15114. } else if (mesh.name.includes('handle')) {
  15115. mesh.material.lineWidth = style == 'singleMode' ? 5 : 7;
  15116. }
  15117. });
  15118. _this3.rotationHandles['rotation.' + axis].translateNode.scale.set(s1, s1, s1);
  15119. });
  15120. ['xy', 'yz', 'xz'].forEach(function (axis) {
  15121. var handle = _this3.translationHandles['translation.plane.' + axis];
  15122. handle.node.children[0].scale.set(s2, s2, s2);
  15123. handle.node.children[0].position.fromArray(handle.alignment2).multiplyScalar(s2 * 1.5);
  15124. });
  15125. common$1.updateVisible(this.scaleHandles['lines'].node, 'modeStyle', style == 'singleMode');
  15126. this.style = style;
  15127. }
  15128. }, {
  15129. key: "initializeTranslationHandles",
  15130. value: function initializeTranslationHandles() {
  15131. var _this4 = this;
  15132. //大改
  15133. var boxGeometry = new THREE.BoxGeometry(1, 1, 1);
  15134. var length = 100,
  15135. arrowRadius = 4,
  15136. arrowHeight = 10;
  15137. var arrowGeometry = new THREE.CylinderBufferGeometry(0, arrowRadius, arrowHeight, 12, 1, false); //add 箭头朝(0,1,0)
  15138. var arrowInitialQua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 2); //先将qua旋转到朝向0,0,-1, 因为一般quaternion不设置时默认表示朝向0,0,-1,
  15139. var octahedronGeometry = new THREE.OctahedronBufferGeometry(5, 0);
  15140. var planeGeometry = new THREE.PlaneBufferGeometry(1, 1);
  15141. var _loop = function _loop() {
  15142. var handleName = _Object$keys[_i];
  15143. var handle = _this4.handles[handleName];
  15144. var node = handle.node;
  15145. _this4.add(node);
  15146. node.name = handleName; //add
  15147. var alignment = _construct(THREE.Vector3, _toConsumableArray(handle.alignment));
  15148. var geometry = void 0,
  15149. mesh = void 0,
  15150. pickVolume = void 0,
  15151. pickScale = void 0,
  15152. position = void 0,
  15153. lookAtPoint = void 0,
  15154. hasPick = true,
  15155. meshPickable = false,
  15156. renderOrder = void 0;
  15157. var matProp = {
  15158. color: handle.color,
  15159. opacity: OpaWhenNotSelect,
  15160. transparent: true,
  15161. side: handleName.includes('plane') ? THREE.DoubleSide : THREE.FrontSide
  15162. };
  15163. var material = new THREE.MeshBasicMaterial(matProp);
  15164. var pickMaterial = new THREE.MeshNormalMaterial({
  15165. opacity: 0.2,
  15166. transparent: true,
  15167. visible: _this4.showPickVolumes
  15168. });
  15169. if (handleName.includes('xyz')) {
  15170. geometry = octahedronGeometry;
  15171. meshPickable = true;
  15172. renderOrder = 12;
  15173. } else if (handleName.includes('plane')) {
  15174. geometry = planeGeometry;
  15175. meshPickable = true;
  15176. position = _construct(THREE.Vector3, _toConsumableArray(handle.alignment2));
  15177. lookAtPoint = alignment;
  15178. if (handleName.includes('xy')) ; else if (handleName.includes('yz')) ; else if (handleName.includes('xz')) ;
  15179. } else {
  15180. geometry = boxGeometry;
  15181. var point = new THREE.Vector3(0, 0, length / 2); //new THREE.Vector3().copy(alignment).multiplyScalar(length/2)
  15182. mesh = LineDraw.createFatLine([point, point.clone().negate()], Object.assign(matProp, {
  15183. lineWidth: 6
  15184. }));
  15185. lookAtPoint = alignment;
  15186. renderOrder = 10;
  15187. pickScale = new THREE.Vector3(4, 4, length + arrowHeight * 2); //pickScale = new THREE.Vector3(4, 4, 1.2)
  15188. {
  15189. var _arrow$position;
  15190. var arrow = new THREE.Mesh(arrowGeometry, material);
  15191. arrow.name = "".concat(handleName, ".arrow");
  15192. arrow.renderOrder = 11;
  15193. (_arrow$position = arrow.position).set.apply(_arrow$position, _toConsumableArray(handle.alignment)).multiplyScalar(length / 2 + arrowHeight / 2);
  15194. arrow.lookAt(0, 0, 0);
  15195. node.add(arrow);
  15196. var arrow2 = arrow.clone();
  15197. arrow2.position.negate();
  15198. arrow2.lookAt(0, 0, 0);
  15199. node.add(arrow2);
  15200. arrow.quaternion.multiply(arrowInitialQua); //乘上初始旋转
  15201. arrow2.quaternion.multiply(arrowInitialQua);
  15202. }
  15203. }
  15204. mesh || (mesh = new THREE.Mesh(geometry, material));
  15205. mesh.name = "".concat(handleName, ".handle");
  15206. node.add(mesh);
  15207. renderOrder && (mesh.renderOrder = renderOrder);
  15208. lookAtPoint && mesh.lookAt(lookAtPoint);
  15209. position && mesh.position.copy(position);
  15210. if (!meshPickable && hasPick) {
  15211. pickVolume = new THREE.Mesh(geometry, pickMaterial);
  15212. pickScale && pickVolume.scale.copy(pickScale);
  15213. } else if (meshPickable) {
  15214. pickVolume = mesh;
  15215. }
  15216. if (pickVolume) {
  15217. if (mesh != pickVolume) {
  15218. mesh.add(pickVolume);
  15219. pickVolume.name = "".concat(handleName, ".pick_volume");
  15220. } else {
  15221. pickVolume.name += ' & pick_volume';
  15222. }
  15223. pickVolume.handle = handleName;
  15224. _this4.pickVolumes.push(pickVolume);
  15225. }
  15226. node.setOpacity = function (target) {
  15227. if (handleName.includes('plane')) {
  15228. var more = 1.5; //减掉更多,使min更低,max还是1
  15229. target = 1 - (1 - target) * more;
  15230. }
  15231. var opacity = {
  15232. x: material.opacity
  15233. };
  15234. var t = new TWEEN.Tween(opacity).to({
  15235. x: target
  15236. }, 0);
  15237. t.onUpdate(function () {
  15238. mesh.visible = opacity.x > 0;
  15239. pickVolume && (pickVolume.visible = opacity.x > 0);
  15240. material.opacity = opacity.x;
  15241. mesh.material.opacity = opacity.x; //outlineMaterial.opacity = opacity.x;
  15242. pickMaterial.opacity = opacity.x * 0.5;
  15243. });
  15244. t.start();
  15245. };
  15246. pickVolume.addEventListener('drag', function (e) {
  15247. _this4.dragTranslationHandle(e);
  15248. });
  15249. pickVolume.addEventListener('drop', function (e) {
  15250. _this4.dropTranslationHandle(e);
  15251. });
  15252. };
  15253. for (var _i = 0, _Object$keys = Object.keys(this.translationHandles); _i < _Object$keys.length; _i++) {
  15254. _loop();
  15255. }
  15256. }
  15257. }, {
  15258. key: "initializeScaleHandles",
  15259. value: function initializeScaleHandles() {
  15260. var _this5 = this;
  15261. var sgSphere = new THREE.SphereGeometry(1, 32, 32);
  15262. var sgLowPolySphere = new THREE.SphereGeometry(1, 16, 16);
  15263. var _loop2 = function _loop2() {
  15264. var _node$position;
  15265. var handleName = _Object$keys2[_i2];
  15266. var handle = _this5.scaleHandles[handleName];
  15267. var node = handle.node;
  15268. node.name = handleName; //add
  15269. _this5.add(node);
  15270. if (handleName == 'lines') {
  15271. ['x', 'y', 'z'].forEach(function (axis) {
  15272. var handle1_ = _this5.scaleHandles['scale.' + axis + '+'];
  15273. var handle2_ = _this5.scaleHandles['scale.' + axis + '-'];
  15274. var line = LineDraw.createFatLine([new THREE.Vector3().fromArray(handle1_.alignment).multiplyScalar(0.5), new THREE.Vector3().fromArray(handle2_.alignment).multiplyScalar(0.5)], {
  15275. color: handle1_.color,
  15276. lineWidth: 4
  15277. } // , dontAlwaysSeen:true
  15278. );
  15279. node.add(line);
  15280. });
  15281. node.setOpacity = function (opacity) {
  15282. opacity *= 0.6;
  15283. node.children.forEach(function (e) {
  15284. return e.material.opacity = opacity;
  15285. });
  15286. };
  15287. return "continue";
  15288. }
  15289. (_node$position = node.position).set.apply(_node$position, _toConsumableArray(handle.alignment)).multiplyScalar(0.5);
  15290. var material = new THREE.MeshBasicMaterial({
  15291. color: handle.color,
  15292. side: THREE.DoubleSide,
  15293. //xzw add
  15294. opacity: OpaWhenNotSelect,
  15295. transparent: true
  15296. });
  15297. var outlineMaterial = new THREE.MeshBasicMaterial({
  15298. color: OutlineColor,
  15299. side: THREE.BackSide,
  15300. opacity: OpaWhenNotSelect,
  15301. transparent: true
  15302. });
  15303. var pickMaterial = new THREE.MeshNormalMaterial({
  15304. opacity: 0.2,
  15305. transparent: true,
  15306. side: THREE.DoubleSide,
  15307. //xzw add for orthoCam, 缩小画面时因球体放大导致到相机背面去了而看不到球体正面
  15308. visible: _this5.showPickVolumes
  15309. });
  15310. var sphere = new THREE.Mesh(sgSphere, material);
  15311. sphere.scale.set(5, 5, 5);
  15312. sphere.name = "".concat(handleName, ".handle");
  15313. node.add(sphere);
  15314. sphere.renderOrder = 10;
  15315. /* let outline = new THREE.Mesh(sgSphere, outlineMaterial);
  15316. outline.scale.set(1.1, 1.1, 1.1);
  15317. outline.name = `${handleName}.outline`;
  15318. sphere.add(outline); */
  15319. var pickSphere = new THREE.Mesh(sgLowPolySphere, pickMaterial);
  15320. pickSphere.name = "".concat(handleName, ".pick_volume");
  15321. pickSphere.scale.set(1.5, 1.5, 1.5);
  15322. sphere.add(pickSphere);
  15323. pickSphere.handle = handleName;
  15324. _this5.pickVolumes.push(pickSphere);
  15325. node.setOpacity = function (target) {
  15326. var opacity = {
  15327. x: material.opacity
  15328. };
  15329. var t = new TWEEN.Tween(opacity).to({
  15330. x: target
  15331. }, 0); //xzw改 原100毫秒,因为太慢容易选错
  15332. t.onUpdate(function () {
  15333. sphere.visible = opacity.x > 0;
  15334. pickSphere.visible = opacity.x > 0;
  15335. material.opacity = opacity.x;
  15336. outlineMaterial.opacity = opacity.x;
  15337. pickSphere.material.opacity = opacity.x * 0.5;
  15338. });
  15339. t.start();
  15340. };
  15341. pickSphere.addEventListener('drag', function (e) {
  15342. return _this5.dragScaleHandle(e);
  15343. });
  15344. pickSphere.addEventListener('drop', function (e) {
  15345. return _this5.dropScaleHandle(e);
  15346. });
  15347. };
  15348. for (var _i2 = 0, _Object$keys2 = Object.keys(this.scaleHandles); _i2 < _Object$keys2.length; _i2++) {
  15349. var _ret = _loop2();
  15350. if (_ret === "continue") continue;
  15351. }
  15352. }
  15353. }, {
  15354. key: "initializeRotationHandles",
  15355. value: function initializeRotationHandles() {
  15356. var _this6 = this;
  15357. var boldAdjust = 2.3;
  15358. var torusGeometry = new THREE.TorusGeometry(1.3, boldAdjust * 0.015, 8, 64, Math.PI / 2); //let outlineGeometry = new THREE.TorusGeometry(1, boldAdjust * 0.018, 8, 64, Math.PI / 2);
  15359. var pickGeometry = new THREE.TorusGeometry(1.3, boldAdjust * 0.06, 6, 4, Math.PI / 2);
  15360. var _loop3 = function _loop3() {
  15361. var handleName = _Object$keys3[_i3];
  15362. var handle = _this6.handles[handleName];
  15363. var node = handle.node;
  15364. _this6.add(node);
  15365. node.name = handleName; //add
  15366. var material = new THREE.MeshBasicMaterial({
  15367. color: handle.color,
  15368. opacity: OpaWhenNotSelect,
  15369. transparent: true
  15370. });
  15371. /* let outlineMaterial = new THREE.MeshBasicMaterial({
  15372. color: OutlineColor,
  15373. side: THREE.BackSide,
  15374. opacity: OpaWhenNotSelect,
  15375. transparent: true
  15376. }); */
  15377. var pickMaterial = new THREE.MeshNormalMaterial({
  15378. opacity: 0.2,
  15379. transparent: true,
  15380. visible: _this6.showPickVolumes
  15381. });
  15382. var box = new THREE.Mesh(torusGeometry, material);
  15383. box.name = "".concat(handleName, ".handle");
  15384. box.scale.set(30, 30, 30);
  15385. box.lookAt(_construct(THREE.Vector3, _toConsumableArray(handle.alignment)));
  15386. node.add(box);
  15387. handle.translateNode = box;
  15388. /* let outline = new THREE.Mesh(outlineGeometry, outlineMaterial);
  15389. outline.name = `${handleName}.outline`;
  15390. outline.scale.set(1, 1, 1);
  15391. outline.renderOrder = 0;
  15392. box.add(outline);
  15393. */
  15394. var pickVolume = new THREE.Mesh(pickGeometry, pickMaterial);
  15395. pickVolume.name = "".concat(handleName, ".pick_volume");
  15396. pickVolume.scale.set(1, 1, 1);
  15397. pickVolume.handle = handleName;
  15398. box.add(pickVolume);
  15399. _this6.pickVolumes.push(pickVolume);
  15400. node.setOpacity = function (target) {
  15401. var opacity = {
  15402. x: material.opacity
  15403. };
  15404. var t = new TWEEN.Tween(opacity).to({
  15405. x: target
  15406. }, 0);
  15407. t.onUpdate(function () {
  15408. box.visible = opacity.x > 0;
  15409. pickVolume.visible = opacity.x > 0;
  15410. material.opacity = opacity.x; //outlineMaterial.opacity = opacity.x;
  15411. pickMaterial.opacity = opacity.x * 0.5;
  15412. });
  15413. t.start();
  15414. };
  15415. pickVolume.addEventListener('drag', function (e) {
  15416. _this6.dragRotationHandle(e);
  15417. });
  15418. pickVolume.addEventListener('drop', function (e) {
  15419. _this6.dropRotationHandle(e);
  15420. });
  15421. };
  15422. for (var _i3 = 0, _Object$keys3 = Object.keys(this.rotationHandles); _i3 < _Object$keys3.length; _i3++) {
  15423. _loop3();
  15424. }
  15425. }
  15426. }, {
  15427. key: "initializeFocusHandles",
  15428. value: function initializeFocusHandles() {
  15429. return; //add
  15430. }
  15431. }, {
  15432. key: "dragRotationHandle",
  15433. value: function dragRotationHandle(e) {
  15434. var drag = e.drag;
  15435. var handle = this.activeHandle;
  15436. this.player.camera;
  15437. if (!handle || !handle.name.includes('rotation')) {
  15438. return;
  15439. }
  15440. var localNormal = _construct(THREE.Vector3, _toConsumableArray(handle.alignment));
  15441. var n = new THREE.Vector3();
  15442. n.copy(_construct(THREE.Vector4, _toConsumableArray(localNormal.toArray()).concat([0])).applyMatrix4(handle.node.matrixWorld));
  15443. n.normalize();
  15444. if (!drag.intersectionStart) {
  15445. drag.intersectionStart = drag.point;
  15446. drag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());
  15447. drag.handle = handle;
  15448. var plane = new THREE.Plane().setFromNormalAndCoplanarPoint(n, drag.intersectionStart);
  15449. drag.dragPlane = plane;
  15450. drag.pivot = drag.intersectionStart;
  15451. } else {
  15452. handle = drag.handle;
  15453. }
  15454. if (!drag.dragPlane) return; //xzw add 因有时候没有
  15455. this.dragging = true;
  15456. /* let pointer = this.player.inputHandler.pointer
  15457. let domElement = this.player.renderer.domElement;
  15458. let ray = Utils.mouseToRay(pointer, camera, domElement.clientWidth, domElement.clientHeight); */
  15459. var ray = this.player.raycaster.ray;
  15460. var I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());
  15461. if (I) {
  15462. var center = this.getWorldPosition(new THREE.Vector3()); //bounding中心
  15463. var from = drag.pivot;
  15464. var to = I;
  15465. var v1 = from.clone().sub(center).normalize();
  15466. var v2 = to.clone().sub(center).normalize();
  15467. var angle = Math.acos(v1.dot(v2));
  15468. var sign = Math.sign(v1.cross(v2).dot(n));
  15469. angle = angle * sign;
  15470. if (Number.isNaN(angle)) {
  15471. return;
  15472. }
  15473. var matrixBefore = this.selection[0].matrix.clone();
  15474. var normal = _construct(THREE.Vector3, _toConsumableArray(handle.alignment));
  15475. var _iterator = _createForOfIteratorHelper$b(this.selection),
  15476. _step;
  15477. try {
  15478. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  15479. var selection = _step.value;
  15480. //直接修改matrix,使整体绕boundingBox中心旋转。 xzw
  15481. var quaternion = selection.quaternion.clone();
  15482. var diffQua = new THREE.Quaternion().setFromAxisAngle(normal, angle); //变化量,参考 selection.rotateOnAxis(normal, angle);
  15483. var moveToZero = new THREE.Matrix4().setPosition(center.clone().negate()); //先将boundingBox中心(整体)移动到原点
  15484. var rotM = new THREE.Matrix4().makeRotationFromQuaternion(quaternion.clone().invert().premultiply(diffQua).premultiply(quaternion)); //再旋转。根据selection.rotateOnAxis,应该是旧的qua 右乘 diffQua,所以先用invert消掉旧的qua
  15485. var moveBack = new THREE.Matrix4().setPosition(center.clone()); //移动回去,使boundingBox中心位置还原
  15486. selection.matrix.premultiply(moveToZero).premultiply(rotM).premultiply(moveBack);
  15487. selection.matrix.decompose(selection.position, selection.quaternion, selection.scale); //记录 (scale基本不变)
  15488. selection.updateMatrixWorld(); //xzw add 保险起见立即update
  15489. selection.dispatchEvent({
  15490. type: 'orientation_changed',
  15491. object: selection
  15492. });
  15493. selection.dispatchEvent({
  15494. //当boundingBox中心不在原点时
  15495. type: 'position_changed',
  15496. object: selection
  15497. });
  15498. }
  15499. } catch (err) {
  15500. _iterator.e(err);
  15501. } finally {
  15502. _iterator.f();
  15503. }
  15504. this.dispatchEvent({
  15505. type: 'transformed',
  15506. changeType: ['orientation'],
  15507. matrixBefore
  15508. }); //add
  15509. drag.pivot = I;
  15510. }
  15511. }
  15512. }, {
  15513. key: "dropRotationHandle",
  15514. value: function dropRotationHandle(e) {
  15515. this.dragging = false;
  15516. this.setActiveHandle(null);
  15517. this.dispatchEvent({
  15518. type: 'stopDrag',
  15519. handle: 'rotation'
  15520. }); //add
  15521. }
  15522. }, {
  15523. key: "dragTranslationHandle",
  15524. value: function dragTranslationHandle(e) {
  15525. //---大改,参考transformControls,为了加上xyz xy yz xz 这四个方向的变换。 (但感觉好像plane上有丢丢延迟?是因为drag延迟还是worldmatrix没更新)
  15526. var drag = e.drag;
  15527. var handle = this.activeHandle;
  15528. this.player.camera;
  15529. var direction = this.player.getDirection();
  15530. if (handle && handle.name.includes('translation') && this.selection[0]) {
  15531. var posWorld = this.getWorldPosition(new THREE.Vector3()); //bounding中心
  15532. if (!drag.intersectionStart) {
  15533. drag.intersectionStart = drag.point;
  15534. drag.worldPositionStart = this.selection[0].getWorldPosition(new THREE.Vector3());
  15535. drag.objectQua = this.selection[0].quaternion.clone(); //不考虑父级
  15536. drag.objectQuaInv = drag.objectQua.clone().invert();
  15537. this.dragging = true;
  15538. }
  15539. if (drag.intersectionStart) {
  15540. var ray = this.player.raycaster.ray; //方向滑动所在面
  15541. var normal;
  15542. var axisName = handle.name.split('.').pop();
  15543. if (axisName == 'xyz') {
  15544. // 平行于屏幕滑动
  15545. normal = direction;
  15546. } else {
  15547. var alignVector = new THREE.Vector3();
  15548. normal = new THREE.Vector3();
  15549. var unitX = new THREE.Vector3(1, 0, 0).applyQuaternion(drag.objectQua);
  15550. var unitY = new THREE.Vector3(0, 1, 0).applyQuaternion(drag.objectQua);
  15551. var unitZ = new THREE.Vector3(0, 0, 1).applyQuaternion(drag.objectQua);
  15552. switch (axisName) {
  15553. case 'x':
  15554. alignVector.copy(direction).cross(unitX);
  15555. normal.copy(unitX).cross(alignVector);
  15556. break;
  15557. case 'y':
  15558. alignVector.copy(direction).cross(unitY);
  15559. normal.copy(unitY).cross(alignVector);
  15560. break;
  15561. case 'z':
  15562. alignVector.copy(direction).cross(unitZ);
  15563. normal.copy(unitZ).cross(alignVector);
  15564. break;
  15565. case 'xy':
  15566. normal.copy(unitZ);
  15567. break;
  15568. case 'yz':
  15569. normal.copy(unitX);
  15570. break;
  15571. case 'xz':
  15572. normal.copy(unitY);
  15573. break;
  15574. } //参考transformControls.使跟手
  15575. }
  15576. drag.dragPlane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, posWorld); //过center的与视线垂直的平面
  15577. var I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());
  15578. if (I) {
  15579. var offset = new THREE.Vector3().subVectors(I, drag.worldPositionStart); //let offset = new THREE.Vector3().subVectors(iOnLine, drag.worldPositionStart);
  15580. if (!drag.pointStart) {
  15581. drag.pointStart = offset;
  15582. } else {
  15583. drag.pointEnd = offset;
  15584. var diff = new THREE.Vector3().subVectors(drag.pointEnd, drag.pointStart);
  15585. diff.applyQuaternion(drag.objectQuaInv); // 得到在该物体local空间上的offset
  15586. if (!handle.name.includes('x')) diff.x = 0;
  15587. if (!handle.name.includes('y')) diff.y = 0;
  15588. if (!handle.name.includes('z')) diff.z = 0; //恢复为world offset
  15589. diff.applyQuaternion(drag.objectQua); //-------------
  15590. var matrixBefore = this.selection[0].matrix.clone();
  15591. this.selection[0].position.copy(diff).add(drag.worldPositionStart);
  15592. var _iterator2 = _createForOfIteratorHelper$b(this.selection),
  15593. _step2;
  15594. try {
  15595. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  15596. var selection = _step2.value;
  15597. selection.updateMatrixWorld(); //xzw add 保险起见立即update
  15598. selection.dispatchEvent({
  15599. type: 'position_changed',
  15600. object: selection
  15601. });
  15602. }
  15603. } catch (err) {
  15604. _iterator2.e(err);
  15605. } finally {
  15606. _iterator2.f();
  15607. }
  15608. this.dispatchEvent({
  15609. type: 'transformed',
  15610. changeType: ['position'],
  15611. matrixBefore
  15612. }); //add
  15613. }
  15614. }
  15615. }
  15616. }
  15617. }
  15618. }, {
  15619. key: "dropTranslationHandle",
  15620. value: function dropTranslationHandle(e) {
  15621. this.dragging = false;
  15622. this.setActiveHandle(null);
  15623. this.dispatchEvent({
  15624. type: 'stopDrag',
  15625. handle: 'translation'
  15626. }); //add
  15627. }
  15628. }, {
  15629. key: "dropScaleHandle",
  15630. value: function dropScaleHandle(e) {
  15631. this.dragging = false;
  15632. this.setActiveHandle(null);
  15633. this.dispatchEvent({
  15634. type: 'stopDrag',
  15635. handle: 'scale'
  15636. }); //add
  15637. }
  15638. }, {
  15639. key: "dragScaleHandle",
  15640. value: function dragScaleHandle(e) {
  15641. var drag = e.drag;
  15642. var handle = this.activeHandle;
  15643. if (!handle || !handle.name.includes('scale')) return;
  15644. var camera = this.player.camera;
  15645. if (!drag.intersectionStart) {
  15646. drag.intersectionStart = drag.point;
  15647. drag.objectStart = drag.object.getWorldPosition(new THREE.Vector3());
  15648. drag.handle = handle;
  15649. var start = drag.intersectionStart;
  15650. var dir = _construct(THREE.Vector4, _toConsumableArray(handle.alignment).concat([0])).applyMatrix4(this.matrixWorld);
  15651. var end = new THREE.Vector3().addVectors(start, dir);
  15652. var line = new THREE.Line3(start.clone(), end.clone());
  15653. drag.line = line;
  15654. var normal;
  15655. if (camera.type == 'OrthographicCamera') {
  15656. //xzw add
  15657. normal = new THREE.Vector3(0, 0, -1).applyQuaternion(camera.quaternion);
  15658. } else {
  15659. var camOnLine = line.closestPointToPoint(camera.position, false, new THREE.Vector3());
  15660. normal = new THREE.Vector3().subVectors(camera.position, camOnLine);
  15661. }
  15662. var plane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, drag.intersectionStart); //过轴线的一个能铺满屏幕的平面
  15663. drag.dragPlane = plane;
  15664. drag.pivot = drag.intersectionStart; //Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05);
  15665. } else {
  15666. handle = drag.handle;
  15667. }
  15668. this.dragging = true;
  15669. if (drag.dragPlane) {
  15670. //xzw add 因有时候没有
  15671. /* let pointer = this.viewer.inputHandler.pointer
  15672. let domElement = this.viewer.renderer.domElement;
  15673. let ray = Utils.mouseToRay(pointer, camera, domElement.clientWidth, domElement.clientHeight); */
  15674. var ray = this.player.raycaster.ray;
  15675. var I = ray.intersectPlane(drag.dragPlane, new THREE.Vector3());
  15676. if (I) {
  15677. var iOnLine = drag.line.closestPointToPoint(I, false, new THREE.Vector3());
  15678. var direction = handle.alignment.reduce(function (a, v) {
  15679. return a + v;
  15680. }, 0);
  15681. var toObjectSpace = this.selection[0].matrixWorld.clone().invert();
  15682. var iOnLineOS = iOnLine.clone().applyMatrix4(toObjectSpace);
  15683. var pivotOS = drag.pivot.clone().applyMatrix4(toObjectSpace);
  15684. var diffOS = new THREE.Vector3().subVectors(iOnLineOS, pivotOS);
  15685. var dragDirectionOS = diffOS.clone().normalize();
  15686. if (iOnLine.distanceTo(drag.pivot) === 0) {
  15687. dragDirectionOS.set(0, 0, 0);
  15688. }
  15689. var dragDirection = dragDirectionOS.dot(_construct(THREE.Vector3, _toConsumableArray(handle.alignment)));
  15690. var alignment = _construct(THREE.Vector3, _toConsumableArray(handle.alignment));
  15691. var diff = new THREE.Vector3().subVectors(iOnLine, drag.pivot);
  15692. var diffScale = alignment.clone().multiplyScalar(diff.length() * direction * dragDirection); //let diffPosition = diff.clone().multiplyScalar(0.5); //这个仅当bound包含原点才准确。
  15693. var matrixBefore = this.selection[0].matrix.clone();
  15694. var _iterator3 = _createForOfIteratorHelper$b(this.selection),
  15695. _step3;
  15696. try {
  15697. for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
  15698. var selection = _step3.value;
  15699. //xzw 改:否则不跟手
  15700. var _selection$boundingBo = selection.boundingBox,
  15701. min = _selection$boundingBo.min,
  15702. max = _selection$boundingBo.max;
  15703. var fixPoint = alignment.x != 0 ? (alignment.x > 0 ? min : max).clone().setY(0).setZ(0) //要保证另一边不能移动
  15704. : alignment.y != 0 ? (alignment.y > 0 ? min : max).clone().setX(0).setZ(0) : (alignment.z > 0 ? min : max).clone().setX(0).setY(0);
  15705. var fixPointBefore = fixPoint.clone().applyMatrix4(selection.matrixWorld);
  15706. var size = selection.boundingBox.getSize(new THREE.Vector3());
  15707. var diffScale_ = diffScale.clone().divide(size);
  15708. size.x == 0 && (diffScale_.x = 0); //add 若为0,不改此轴大小
  15709. size.y == 0 && (diffScale_.y = 0);
  15710. size.z == 0 && (diffScale_.z = 0);
  15711. selection.scale.add(diffScale_);
  15712. selection.scale.max(new THREE.Vector3(0.1, 0.1, 0.1)); //selection.position.add(diffPosition);
  15713. selection.updateMatrixWorld();
  15714. var fixPointAfter = fixPoint.clone().applyMatrix4(this.selection[0].matrixWorld);
  15715. selection.position.sub(new THREE.Vector3().subVectors(fixPointAfter, fixPointBefore)); //保证另一边不能移动所需要的位移
  15716. selection.updateMatrixWorld(); //xzw add 保险起见立即update
  15717. selection.dispatchEvent({
  15718. type: 'position_changed',
  15719. object: selection
  15720. });
  15721. selection.dispatchEvent({
  15722. type: 'scale_changed',
  15723. object: selection
  15724. });
  15725. }
  15726. } catch (err) {
  15727. _iterator3.e(err);
  15728. } finally {
  15729. _iterator3.f();
  15730. }
  15731. this.dispatchEvent({
  15732. type: 'transformed',
  15733. changeType: ['position', 'scale'],
  15734. matrixBefore
  15735. }); //add
  15736. drag.pivot.copy(iOnLine); //Utils.debugSphere(viewer.scene.scene, drag.pivot, 0.05);
  15737. }
  15738. }
  15739. }
  15740. }, {
  15741. key: "setActiveHandle",
  15742. value: function setActiveHandle(handle) {
  15743. if (this.dragging) {
  15744. return;
  15745. }
  15746. if (this.activeHandle === handle) {
  15747. return;
  15748. }
  15749. this.activeHandle = handle;
  15750. if (handle === null) {
  15751. for (var _i5 = 0, _Object$keys5 = Object.keys(this.handles); _i5 < _Object$keys5.length; _i5++) {
  15752. var handleName = _Object$keys5[_i5];
  15753. var _handle = this.handles[handleName];
  15754. _handle.node.setOpacity(0);
  15755. }
  15756. }
  15757. this.activeHandle ? CursorDeal.add('hoverTranHandle') : CursorDeal.remove('hoverTranHandle');
  15758. for (var _i7 = 0, _Object$keys7 = Object.keys(this.translationHandles); _i7 < _Object$keys7.length; _i7++) {
  15759. var _handleName2 = _Object$keys7[_i7];
  15760. var _handle3 = this.translationHandles[_handleName2];
  15761. if (this.activeHandle === _handle3) {
  15762. _handle3.node.setOpacity(1.0);
  15763. } else {
  15764. _handle3.node.setOpacity(OpaWhenNotSelect);
  15765. }
  15766. }
  15767. for (var _i8 = 0, _Object$keys8 = Object.keys(this.rotationHandles); _i8 < _Object$keys8.length; _i8++) {
  15768. var _handleName3 = _Object$keys8[_i8];
  15769. var _handle4 = this.rotationHandles[_handleName3]; //if(this.activeHandle === handle){
  15770. // handle.node.setOpacity(1.0);
  15771. //}else{
  15772. // handle.node.setOpacity(OpaWhenNotSelect)
  15773. //}
  15774. _handle4.node.setOpacity(OpaWhenNotSelect);
  15775. }
  15776. for (var _i9 = 0, _Object$keys9 = Object.keys(this.scaleHandles); _i9 < _Object$keys9.length; _i9++) {
  15777. var _handleName4 = _Object$keys9[_i9];
  15778. var _handle5 = this.scaleHandles[_handleName4];
  15779. if (this.activeHandle === _handle5) {
  15780. _handle5.node.setOpacity(1.0);
  15781. for (var _i10 = 0, _Object$keys10 = Object.keys(this.translationHandles); _i10 < _Object$keys10.length; _i10++) {
  15782. var translationHandleName = _Object$keys10[_i10];
  15783. var translationHandle = this.translationHandles[translationHandleName];
  15784. translationHandle.node.setOpacity(OpaWhenNotSelect);
  15785. } //let relatedTranslationHandle = this.translationHandles[
  15786. // handle.name.replace("scale", "translation").replace(/[+-]/g, "")];
  15787. //let relatedTranslationNode = relatedTranslationHandle.node;
  15788. //relatedTranslationNode.setOpacity(OpaWhenNotSelect);
  15789. } else {
  15790. _handle5.node.setOpacity(OpaWhenNotSelect);
  15791. }
  15792. }
  15793. if (handle) {
  15794. handle.node.setOpacity(1.0);
  15795. }
  15796. }
  15797. }, {
  15798. key: "update",
  15799. value: function update() {
  15800. var _this8 = this;
  15801. if (this.selection.length === 1) {
  15802. this.visible = true;
  15803. this.updateMatrix();
  15804. this.updateMatrixWorld();
  15805. var selected = this.selection[0]; //selected.updateMatrixWorld();//add 否则scale的sphere抖动
  15806. selected.matrixWorld;
  15807. var camera = this.player.camera; //this.viewer.scene.getActiveCamera();
  15808. var domElement = this.player.domElement;
  15809. var center = selected.boundingBox.getCenter(new THREE.Vector3()).clone().applyMatrix4(selected.matrixWorld);
  15810. var scale = selected.boundingBox.getSize(new THREE.Vector3()).multiply(selected.scale);
  15811. scale.max(new THREE.Vector3(0.1, 0.1, 0.1)); //xzw add 如果是plane,没有厚度,会导致该tool消失
  15812. this.scale.copy(scale);
  15813. this.position.copy(center);
  15814. this.rotation.copy(selected.rotation); //这里只考虑当前子级的scale rotation
  15815. //如果是世界坐标 (缩放方向有bug。)
  15816. /*
  15817. let boundingBox = selected.boundingBox.clone().applyMatrix4(selected.matrixWorld);
  15818. let center = boundingBox.getCenter(new THREE.Vector3())
  15819. this.position.copy(center);
  15820. this.scale.copy(boundingBox.getSize(new THREE.Vector3()));
  15821. */
  15822. this.updateMatrixWorld();
  15823. {
  15824. // adjust rotation handles
  15825. if (!this.dragging) {
  15826. if (this.modesEnabled.rotation || this.modesEnabled.translation) {
  15827. var tWorld = this.matrixWorld;
  15828. var tObject = tWorld.clone().invert();
  15829. var camObjectPos = camera.getWorldPosition(new THREE.Vector3()).applyMatrix4(tObject);
  15830. if (this.modesEnabled.translation) {
  15831. ['xy', 'yz', 'xz'].forEach(function (axis) {
  15832. var handle = _this8.translationHandles['translation.plane.' + axis];
  15833. var pos = handle.node.children[0].position;
  15834. camObjectPos.x && (pos.x = Math.sign(camObjectPos.x) * Math.abs(pos.x));
  15835. camObjectPos.y && (pos.y = Math.sign(camObjectPos.y) * Math.abs(pos.y));
  15836. camObjectPos.z && (pos.z = Math.sign(camObjectPos.z) * Math.abs(pos.z));
  15837. });
  15838. }
  15839. if (this.modesEnabled.rotation) {
  15840. var above = camObjectPos.z > 0;
  15841. var below = !above;
  15842. var PI_HALF = Math.PI / 2;
  15843. var x = this.rotationHandles['rotation.x'].node.rotation;
  15844. var y = this.rotationHandles['rotation.y'].node.rotation;
  15845. var z = this.rotationHandles['rotation.z'].node.rotation;
  15846. x.order = 'ZYX';
  15847. y.order = 'ZYX';
  15848. if (above) {
  15849. if (camObjectPos.x > 0 && camObjectPos.y > 0) {
  15850. x.x = 1 * PI_HALF;
  15851. y.y = 3 * PI_HALF;
  15852. z.z = 0 * PI_HALF;
  15853. } else if (camObjectPos.x < 0 && camObjectPos.y > 0) {
  15854. x.x = 1 * PI_HALF;
  15855. y.y = 2 * PI_HALF;
  15856. z.z = 1 * PI_HALF;
  15857. } else if (camObjectPos.x < 0 && camObjectPos.y < 0) {
  15858. x.x = 2 * PI_HALF;
  15859. y.y = 2 * PI_HALF;
  15860. z.z = 2 * PI_HALF;
  15861. } else if (camObjectPos.x > 0 && camObjectPos.y < 0) {
  15862. x.x = 2 * PI_HALF;
  15863. y.y = 3 * PI_HALF;
  15864. z.z = 3 * PI_HALF;
  15865. }
  15866. } else if (below) {
  15867. if (camObjectPos.x > 0 && camObjectPos.y > 0) {
  15868. x.x = 0 * PI_HALF;
  15869. y.y = 0 * PI_HALF;
  15870. z.z = 0 * PI_HALF;
  15871. } else if (camObjectPos.x < 0 && camObjectPos.y > 0) {
  15872. x.x = 0 * PI_HALF;
  15873. y.y = 1 * PI_HALF;
  15874. z.z = 1 * PI_HALF;
  15875. } else if (camObjectPos.x < 0 && camObjectPos.y < 0) {
  15876. x.x = 3 * PI_HALF;
  15877. y.y = 1 * PI_HALF;
  15878. z.z = 2 * PI_HALF;
  15879. } else if (camObjectPos.x > 0 && camObjectPos.y < 0) {
  15880. x.x = 3 * PI_HALF;
  15881. y.y = 0 * PI_HALF;
  15882. z.z = 3 * PI_HALF;
  15883. }
  15884. }
  15885. }
  15886. }
  15887. } // adjust scale of components
  15888. for (var _i11 = 0, _Object$keys11 = Object.keys(this.handles); _i11 < _Object$keys11.length; _i11++) {
  15889. var handleName = _Object$keys11[_i11];
  15890. var handle = this.handles[handleName];
  15891. var node = handle.node; //xzw add:---- -当该轴正对相机时隐藏。(主要针对ortho类型camera。
  15892. if (!common$1.getObjVisiByReason(node, 'modeForce')) continue;
  15893. var alignment = handle.alignment;
  15894. if (alignment && (!handleName.includes('rotation') || camera.type == 'OrthographicCamera')) {
  15895. //旋转的话正常都应该显示
  15896. var normal = void 0;
  15897. var dir = _construct(THREE.Vector3, _toConsumableArray(alignment)).applyQuaternion(this.quaternion);
  15898. if (camera.type == 'OrthographicCamera') {
  15899. normal = new THREE.Vector3(0, 0, -1).applyQuaternion(camera.quaternion);
  15900. } else {
  15901. normal = new THREE.Vector3().subVectors(center, camera.position).normalize();
  15902. }
  15903. var ifOnLine = void 0;
  15904. if (handleName.includes('rotation') || handleName.includes('plane')) {
  15905. // 旋转轴和视线垂直时隐藏
  15906. ifOnLine = Math.abs(dir.dot(normal)) < 0.1;
  15907. } else {
  15908. ifOnLine = Math.abs(dir.dot(normal)) > 0.995;
  15909. }
  15910. common$1.updateVisible(node, 'faceToCamHide', !ifOnLine);
  15911. } else {
  15912. common$1.updateVisible(node, 'faceToCamHide', true);
  15913. }
  15914. if (!node.visible) continue; //------------------------------------------------------------------------
  15915. if (handle.dontScale) continue; //add
  15916. var handlePos = node.getWorldPosition(new THREE.Vector3());
  15917. var distance = handlePos.distanceTo(camera.position);
  15918. var pr = convertTool.projectedRadius(1, camera, distance, domElement.clientWidth, domElement.clientHeight);
  15919. var ws = node.parent.getWorldScale(new THREE.Vector3());
  15920. var s = ScaleRatio / pr;
  15921. var _scale = new THREE.Vector3(s, s, s).divide(ws);
  15922. var rot = new THREE.Matrix4().makeRotationFromEuler(node.rotation); //需要使用到旋转,所以我把设置scale的移到旋转后了,否则在视图上下旋转的分界线处rotateHandel会被拉长从而闪烁。
  15923. var rotInv = rot.clone().invert();
  15924. _scale.applyMatrix4(rotInv);
  15925. _scale.x = Math.abs(_scale.x);
  15926. _scale.y = Math.abs(_scale.y);
  15927. _scale.z = Math.abs(_scale.z);
  15928. node.scale.copy(_scale);
  15929. }
  15930. }
  15931. } else {
  15932. this.visible = false;
  15933. }
  15934. }
  15935. }, {
  15936. key: "onPointerMove",
  15937. value: function onPointerMove() {
  15938. var _this9 = this;
  15939. //let pointer = this.viewer.inputHandler.pointer;
  15940. this.player.camera;
  15941. if (this.selection.length === 1) {
  15942. //xzw 添加dragging条件
  15943. if (!this.dragging) {
  15944. //let ray = Utils.mouseToRay(pointer, camera );
  15945. /* let raycaster = new THREE.Raycaster(ray.origin, ray.direction);
  15946. raycaster.layers.enableAll()//add */
  15947. var raycaster = this.player.raycaster;
  15948. var pickVolumes = this.pickVolumes.filter(function (v) {
  15949. var mode = v.handle.split('.')[0];
  15950. if (!_this9.modesEnabled[mode]) return;
  15951. return v.parent.parent.visible; //可能被隐藏该轴
  15952. });
  15953. var intersects = raycaster.intersectObjects(pickVolumes, true);
  15954. intersects = intersects.sort(function (a, b) {
  15955. var order2 = b.object.renderOrder || 0;
  15956. var order1 = a.object.renderOrder || 0;
  15957. return order2 - order1;
  15958. }); // 降序
  15959. if (intersects.length > 0) {
  15960. var I = intersects[0];
  15961. var handleName = I.object.handle; //console.log(handleName)
  15962. this.setActiveHandle(this.handles[handleName]);
  15963. this.intersect = I;
  15964. } else {
  15965. this.intersect;
  15966. this.setActiveHandle(null);
  15967. this.intersect = null;
  15968. }
  15969. } else {
  15970. if (this.intersect) {
  15971. this.intersect.object.dispatchEvent({
  15972. type: 'drag',
  15973. drag: this.drag
  15974. });
  15975. }
  15976. }
  15977. }
  15978. }
  15979. }, {
  15980. key: "handleDragStart",
  15981. value: function handleDragStart() {
  15982. //add
  15983. if (this.selection.length === 1) {
  15984. //搜寻有加事件的object 发送事件 参考potree的inputHandler
  15985. if (this.intersect) {
  15986. this.drag = this.intersect;
  15987. this.intersect.object.dispatchEvent({
  15988. type: 'drag',
  15989. drag: this.drag
  15990. });
  15991. if (this.player.cameraControls.activeControl) {
  15992. //this.player.cameraControls.activeControl.locked = true; //add
  15993. this.player.cameraControls.activeControl.enabled = false; //add
  15994. }
  15995. }
  15996. /* let target = && this.hoveredElements.find(el => (//只有左键能拖拽
  15997. el.object._listeners &&
  15998. el.object._listeners['drag'] &&
  15999. el.object._listeners['drag'].length > 0));
  16000. if (target) {
  16001. this.startDragging(target.object, {location: target.point});
  16002. } else {
  16003. this.startDragging(null);
  16004. } */
  16005. }
  16006. }
  16007. }, {
  16008. key: "handleDragEnd",
  16009. value: function handleDragEnd() {
  16010. //add
  16011. if (this.drag) {
  16012. this.drag.object.dispatchEvent({
  16013. type: 'drop'
  16014. });
  16015. this.drag = null;
  16016. if (this.player.cameraControls.activeControl) {
  16017. //this.player.cameraControls.activeControl.locked = true; //add
  16018. this.player.cameraControls.activeControl.enabled = true; //add
  16019. }
  16020. }
  16021. }
  16022. }]);
  16023. return TransformationTool;
  16024. }(THREE.Object3D);
  16025. /*
  16026. note:
  16027. transformationTool.scene会跟随选中物体,其scale就是boundingbox的大小。因此transformationTool.frame这个框也会跟着缩放
  16028. */
  16029. var PlayerEvents = {
  16030. Move: 'move',
  16031. Rotate: 'rotate',
  16032. //xst
  16033. Zoom: 'zoom',
  16034. //xst
  16035. EndRotation: 'endRotation',
  16036. //xst
  16037. MoveModel: 'moveModel',
  16038. //xst
  16039. MoveComplete: 'move.complete',
  16040. ModeChanged: 'mode.changed',
  16041. ModeChanging: 'mode.changing',
  16042. PanoChosen: 'pano.chosen',
  16043. ClosestPanoChanging: 'closest.pano.changing',
  16044. WarpStarted: 'warp.started',
  16045. WarpInterrupted: 'warp.interrupted',
  16046. WarpEnded: 'warp.ended',
  16047. FlyinFinished: 'flyin.finished',
  16048. FlyingStarted: 'flying.started',
  16049. FlyingInterrupted: 'flying.interrupted',
  16050. FlyingEnded: 'flying.ended',
  16051. Ready: 'ready',
  16052. StartInside: 'start.inside',
  16053. StartOutside: 'start.outside',
  16054. ViewChanged: 'view.changed',
  16055. WarpInterruptedWithFlyTo: 'warp.interrupted.flyto',
  16056. InputStart: 'input.start'
  16057. };
  16058. new THREE.TextureLoader();
  16059. var showForOpacity = 1;
  16060. var hideForOpacity = 0;
  16061. var planeGeo$4 = new THREE.PlaneBufferGeometry(1, 1);
  16062. var FloorplanCadImg = /*#__PURE__*/function () {
  16063. function FloorplanCadImg(app) {
  16064. _classCallCheck(this, FloorplanCadImg);
  16065. this.app = app;
  16066. this.config = this.app.config;
  16067. this.show = true;
  16068. this.done = 0;
  16069. this.ready = false;
  16070. this.center = new THREE.Vector3();
  16071. this.deferred = Deferred$1();
  16072. }
  16073. _createClass(FloorplanCadImg, [{
  16074. key: "getCadInfo",
  16075. value: function getCadInfo(index) {
  16076. var cadInfo = this.app.store.getValue('flooruser').cadInfo;
  16077. if (cadInfo instanceof Array) {
  16078. //初始加载时没有id, 所以用下标;等保存时会有subgroup,一般就是单层的subgroup和下标不一样,所以使用subgroup
  16079. if (this.model.floors.list.length == 1) {
  16080. cadInfo = cadInfo[0];
  16081. } else {
  16082. var info = cadInfo.find(function (info) {
  16083. return info.subgroup == index;
  16084. });
  16085. info || (info = cadInfo[index]);
  16086. cadInfo = info;
  16087. }
  16088. } else if (!cadInfo) {
  16089. //console.error('no cadInfo,可能是导入的平面图', index)
  16090. return null;
  16091. }
  16092. return cadInfo;
  16093. } //临时改变所有楼层的floorplane图的显示
  16094. }, {
  16095. key: "changeCadVisible",
  16096. value: function changeCadVisible(v) {
  16097. var o = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  16098. if (o.show != void 0) this.show = o.show; //编辑页面的设置开关控制show
  16099. this.model.floors.forEach(function (floor) {
  16100. if (floor.plane) {
  16101. floor.plane.visible = !!v;
  16102. } else {
  16103. console.warn('还没有创建plane');
  16104. }
  16105. });
  16106. }
  16107. /****************************************************************************************************************************************************************/
  16108. }, {
  16109. key: "deleteCustomFloorTexture",
  16110. value: function deleteCustomFloorTexture(index) {
  16111. console.log('deleteCustomFloorTexture!查看是否有问题', index);
  16112. var floor = this.model.floors.index[index];
  16113. floor.plane.visible = false;
  16114. floor.plane.material.opacity = hideForOpacity;
  16115. floor.plane.material.map = null;
  16116. floor.plane.material.needsUpdate = !0;
  16117. }
  16118. /* addCustomFloorTexture(index, url) {
  16119. let floor = this.model.floors.index[index]
  16120. floor.plane.material = new THREE.MeshBasicMaterial({
  16121. map: loader.load(url),
  16122. opacity: showForOpacity,
  16123. transparent: !0,
  16124. side: THREE.DoubleSide,
  16125. depthTest: false //防止遮挡热点等物体
  16126. })
  16127. floor.plane.visible = true
  16128. floor.plane.material.needsUpdate = !0
  16129. } */
  16130. }, {
  16131. key: "updateCustomFloorTexture",
  16132. value: function updateCustomFloorTexture(index, url) {
  16133. console.log('updateCustomFloorTexture!', index);
  16134. this.floorPlanImgUrls[index] = url;
  16135. this.updateCadPlane(index);
  16136. /* let floor = this.model.floors.index[index]
  16137. let plane = floor.plane
  16138. plane.material = new THREE.MeshBasicMaterial({
  16139. map: loader.load(url),
  16140. opacity: showForOpacity,
  16141. transparent: !0,
  16142. side: THREE.DoubleSide,
  16143. depthTest: false //防止遮挡热点等物体
  16144. })
  16145. let boundingBox = floor.boundingBox
  16146. let center = boundingBox.getCenter(this.center)
  16147. plane.position.set(center.x, boundingBox.max.y + constants.planeHeightShift, center.z)
  16148. let size = boundingBox.getSize(new THREE.Vector3())
  16149. plane.scale.set(Math.abs(size.x), Math.abs(size.z), 1)
  16150. if (this.model.currentFloor.floorIndex != index) {
  16151. floor.plane.visible = false
  16152. floor.plane.material.opacity = hideForOpacity
  16153. } else {
  16154. floor.plane.visible = true
  16155. floor.plane.material.opacity = showForOpacity
  16156. } */
  16157. }
  16158. /* createCustomPlane(index, url) {
  16159. let floor = this.model.floors.index[index]
  16160. let boundingBox = floor.boundingBox
  16161. let center = boundingBox.getCenter(this.center)
  16162. let size = boundingBox.getSize(new THREE.Vector3())
  16163. let plane = floor.plane
  16164. if (!plane) {
  16165. var geometry = new THREE.PlaneBufferGeometry(1, 1)
  16166. var material = new THREE.MeshBasicMaterial({
  16167. //map: THREE.ImageUtils.loadTexture(url),
  16168. map: texture.load(url),
  16169. opacity: this.player.modeTran && this.player.modeTran.split('-')[1] == 'floorplan' ? showForOpacity : hideForOpacity,
  16170. //opacity: 1,
  16171. transparent: !0,
  16172. side: THREE.DoubleSide,
  16173. depthTest: false //防止遮挡热点等物体
  16174. })
  16175. material.needsUpdate = !0
  16176. plane = new THREE.Mesh(geometry, material)
  16177. plane.renderOrder = RenderOrder.cad //盖住模型,否则其他层模型会影响它
  16178. plane.name = 'floorplanImg'
  16179. plane.rotateX(-Math.PI / 2)
  16180. this.model.add(plane)
  16181. } else {
  16182. plane.material = new THREE.MeshBasicMaterial({
  16183. //map: THREE.ImageUtils.loadTexture(url),
  16184. map: loader.load(url),
  16185. opacity: showForOpacity,
  16186. transparent: !0,
  16187. side: THREE.DoubleSide,
  16188. depthTest: false //防止遮挡热点等物体
  16189. })
  16190. plane.visible = true
  16191. plane.material.needsUpdate = !0
  16192. }
  16193. plane.position.set(center.x, boundingBox.max.y + constants.planeHeightShift, center.z)
  16194. plane.scale.set(Math.abs(size.x), Math.abs(size.z), 1)
  16195. floor.plane = plane
  16196. if (this.model.currentFloor.floorIndex != index) {
  16197. floor.plane.visible = false
  16198. }
  16199. } */
  16200. }, {
  16201. key: "createCustomPlane",
  16202. value: function createCustomPlane(index, url) {
  16203. this.floorPlanImgUrls[index] = url;
  16204. this.updateCadPlane(index);
  16205. /* if (this.model.currentFloor.floorIndex != index) {
  16206. floor.plane.visible = false
  16207. } */
  16208. }
  16209. }, {
  16210. key: "changeModelOpacity",
  16211. value: function changeModelOpacity() {
  16212. //console.log('changeModelOpacity', type)
  16213. return;
  16214. }
  16215. /*changeModelOpacity(type) {
  16216. let setOpacity = e => {
  16217. // if (e.parent.hidden && value > 0.5) {
  16218. // return
  16219. // }
  16220. // if (value == showForModelOpacity) {
  16221. // e.visible = false
  16222. // } else {
  16223. // e.visible = true
  16224. // }
  16225. // ;(e.materialInside.uniforms.opacity.value = value), (e.materialOutside.uniforms.opacity.value = value)
  16226. if (visible) {
  16227. e.material.uniforms.opacity.value = 1
  16228. e.material.transparent = !1
  16229. } else {
  16230. e.material.uniforms.opacity.value = 0
  16231. e.material.transparent = !0
  16232. }
  16233. }
  16234. if (this.player.modeTran.split('-')[1] === Viewmode.FLOORPLAN) {
  16235. // FLOORPLAN模式下修改模型透明度,仅限当前楼层
  16236. this.model.currentFloor.chunks.forEach(setOpacity)
  16237. } else {
  16238. this.model.chunks.forEach(setOpacity)
  16239. }
  16240. }*/
  16241. /********************************************************************重构***************************************************************************************/
  16242. }, {
  16243. key: "init",
  16244. value: function init(model) {
  16245. var _this = this;
  16246. this.player = this.app.core.get('Player');
  16247. this.model = model;
  16248. var floorplan = this.app.store.getValue('flooruser');
  16249. if (floorplan) {
  16250. //获取所有楼层的cad图片的url
  16251. this.getCadImgUrl(floorplan); //创建多楼层平面
  16252. //this.createCadAllPlanes(floorplan)
  16253. } else {
  16254. this.app.store.on('flooruser', function (floor) {
  16255. //获取所有楼层的cad图片的url
  16256. _this.getCadImgUrl(floor); //创建多楼层平面
  16257. //this.createCadAllPlanes(floor)
  16258. });
  16259. }
  16260. this.player.on(PlayerEvents.ModeChanging, function (lastMode, mode, pano, dur) {
  16261. if (mode == Viewmode$1.FLOORPLAN) {
  16262. var view360ShowDur = 1000;
  16263. _this.shouldShowPlane = true;
  16264. setTimeout(function () {
  16265. _this.shouldShowPlane && _this.showCadPlane();
  16266. }, Math.min(view360ShowDur, dur));
  16267. } else {
  16268. _this.shouldShowPlane = false; //console.log('mode',mode, 'hideCadPlane')
  16269. _this.hideCadPlane();
  16270. _this.changeModelOpacity('hidePlane'); //恢复材质
  16271. }
  16272. });
  16273. this.ready = true;
  16274. } //创建多楼层平面
  16275. }, {
  16276. key: "createCadAllPlanes",
  16277. value: function createCadAllPlanes(cadData) {
  16278. var _this2 = this;
  16279. //采用用户上传的图片
  16280. if (cadData.type == 'image') {
  16281. cadData.floors.forEach(function (floor) {
  16282. _this2.createCustomPlane(floor.subgroup, _this2.app.resource.getUserResourceURL(floor.filename));
  16283. });
  16284. this.ready = true;
  16285. } //采用矢量数据
  16286. else {
  16287. // 初始数据,不能加载图片
  16288. if (!this.app.store.getValue('metadata').floorPlanUser) {
  16289. this.ready = true;
  16290. this.deferred.resolve();
  16291. return;
  16292. }
  16293. this.model.floors.forEach(function (floor) {
  16294. //创建每个楼层的平面
  16295. _this2.createCadPlane(floor.floorIndex);
  16296. });
  16297. }
  16298. }
  16299. }, {
  16300. key: "createCadPlane",
  16301. value: function createCadPlane(floorIndex) {
  16302. this.updateCadPlane(floorIndex);
  16303. } //更新某个户型图
  16304. }, {
  16305. key: "updateCadPlane",
  16306. value: function updateCadPlane(floorIndex) {
  16307. var _this3 = this;
  16308. var opacity = 0;
  16309. var imgUrl = this.floorPlanImgUrls[floorIndex];
  16310. var floor = this.model.floors.index[floorIndex]; //有图片才会有plane
  16311. console.log("\u5F00\u59CB\u52A0\u8F7Dfloorplan_".concat(floorIndex, ".png, imgUrl: ").concat(imgUrl));
  16312. if (imgUrl) {
  16313. var deferred = floor.deferred = new Deferred$1();
  16314. opacity = this.player.modeTran && this.player.modeTran.split('-')[1] == 'floorplan' ? showForOpacity : hideForOpacity;
  16315. texture.load(imgUrl, function (texture) {
  16316. //加载完成:
  16317. if (!texture.image || floor.deferred != deferred) return; //还没加载完或又重新加载了
  16318. floor.cadImg = texture.image;
  16319. if (floor.shouldShowPlane) {
  16320. texture.needsUpdate = !0;
  16321. console.warn("\u52A0\u8F7D\u5B8C\u6BD5floorplan_".concat(floorIndex, ".png, ").concat(imgUrl));
  16322. } else {
  16323. texture.dispose();
  16324. console.error('dispose Tex');
  16325. texture = null;
  16326. }
  16327. var plane = floor.plane; //之前没有plane的话,得创建
  16328. if (!plane) {
  16329. var material = _this3.createCadPlaneMaterial(texture, opacity);
  16330. plane = new THREE.Mesh(planeGeo$4, material);
  16331. floor.shouldShowPlane || (plane.visible = false);
  16332. } else {
  16333. plane.material.map = texture;
  16334. plane.material.needsUpdate = true;
  16335. }
  16336. _this3.model.add(plane);
  16337. floor.plane = plane;
  16338. _this3.setCadPlanePose(plane, floorIndex); //注意:图和模型吻合的前提是模型生成正确 且和cad图一致。比如不能模型多了一个房间或者修改过了添加了个东西导致boundingbox变化之类的 (所以以floor.json来重新算了次boundingbox)
  16339. floor.deferred = null;
  16340. deferred.resolve(true);
  16341. }, function (xhr) {
  16342. floor.deferred = null;
  16343. floor.imgLoadFailed = true;
  16344. deferred.resolve(false); //当显示户型图平面的时候,需要修改模型材质
  16345. _this3.changeModelOpacity('hidePlane');
  16346. console.warn("\u6CA1\u6709floorplan_".concat(floorIndex, ".png, ").concat(imgUrl));
  16347. });
  16348. return floor.deferred;
  16349. } //没有图片,但是之前已经有了plane,这时候需要删除
  16350. else {
  16351. this.deleteCadPlane(floor);
  16352. floor.imgLoadFailed = true; //没有图也算加载失败
  16353. }
  16354. }
  16355. }, {
  16356. key: "createCadPlaneMaterial",
  16357. value: function createCadPlaneMaterial(floorTexture, opacity) {
  16358. var material = new THREE.MeshBasicMaterial({
  16359. map: floorTexture,
  16360. opacity: opacity,
  16361. transparent: !0,
  16362. side: THREE.DoubleSide,
  16363. depthTest: false //防止遮挡热点等物体
  16364. });
  16365. return material;
  16366. } //floorplanData表示户型数据
  16367. }, {
  16368. key: "getCadImgUrl",
  16369. value: function getCadImgUrl(cadData) {
  16370. var _this4 = this;
  16371. this.floorPlanImgUrls = [];
  16372. if (this.app.store.getValue('metadata').floorPlanUser) {
  16373. this.model.floors.forEach(function (floor) {
  16374. var floorIndex = floor.floorIndex; //如果是用户自己上传的图片
  16375. if (cadData.type == 'image') {
  16376. // 如果是颠倒楼层会出现楼层与图片不对应的bug,需要重新获取对应的图片
  16377. var findFloorIndex = cadData.floors.findIndex(function (c) {
  16378. return c.subgroup == floorIndex;
  16379. });
  16380. if (findFloorIndex == -1) {
  16381. findFloorIndex = floorIndex;
  16382. }
  16383. if (!cadData.floors[findFloorIndex]) {
  16384. return console.error('cad缺少此楼层数据,楼层:', findFloorIndex);
  16385. }
  16386. _this4.floorPlanImgUrls[floorIndex] = _this4.app.resource.getUserResourceURL(cadData.floors[findFloorIndex].filename);
  16387. } else {
  16388. _this4.floorPlanImgUrls[floorIndex] = _this4.app.resource.getUserResourceURL("floor-cad-".concat(floorIndex, ".png"));
  16389. }
  16390. });
  16391. }
  16392. } //设置cad面的坐标,大小和角度,确保与模型对准
  16393. }, {
  16394. key: "setCadPlanePose",
  16395. value: function setCadPlanePose(plane, index) {
  16396. var floor = this.model.floors.index[index];
  16397. var boundingBox = floor.boundingBox;
  16398. var center = boundingBox.getCenter(this.center);
  16399. var size = boundingBox.getSize(new THREE.Vector3()); //plane.rotateX(-Math.PI / 2)
  16400. plane.rotation.x = -Math.PI / 2; //靠这参数设置plane的大小和位置
  16401. var cadInfo; //let info = this.app.store.getValue('metadata').floorPlanUser
  16402. var data = this.app.store.getValue('flooruser');
  16403. if (data.type != 'image') {
  16404. //非导入
  16405. cadInfo = this.getCadInfo(index);
  16406. if (cadInfo && cadInfo.bound) {
  16407. size.x = cadInfo.bound.right - cadInfo.bound.left;
  16408. size.z = cadInfo.bound.bottom - cadInfo.bound.top;
  16409. center.x = (cadInfo.bound.right + cadInfo.bound.left) / 2;
  16410. center.z = (cadInfo.bound.bottom + cadInfo.bound.top) / 2; //本来不需要旋转的(导入的就不用),但cad那边转了之后也改了size,这里就要旋转
  16411. var metadata = this.app.store.getValue('metadata');
  16412. var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0); //plane.rotateZ(floorPlanAngle)
  16413. plane.rotation.z = floorPlanAngle;
  16414. }
  16415. }
  16416. plane.renderOrder = RenderOrder.cad; //盖住模型,否则其他层模型会影响它
  16417. plane.name = 'floorplanImg';
  16418. this.adjustModelForPlane(boundingBox, index, size, center, false, cadInfo);
  16419. }
  16420. }, {
  16421. key: "adjustModelForPlane",
  16422. value: function adjustModelForPlane(boundingBox, index, size, center, onlyHeight, cadInfo) {
  16423. var floor = this.model.floors.index[index];
  16424. if (onlyHeight) {
  16425. floor.plane.position.y = boundingBox.max.y + constants$4.planeHeightShift;
  16426. return;
  16427. }
  16428. size = size || boundingBox.getSize(new THREE.Vector3());
  16429. center = center || boundingBox.getCenter(new THREE.Vector3());
  16430. if (cadInfo) {
  16431. /* if (!floor.plane.material || !floor.plane.material.map || !floor.plane.material.map.image) {
  16432. return
  16433. } */
  16434. //为了让图片刚好和模型吻合(cadInfo包含的信息是像素为单位,表示出了图中从哪到哪为模型的部分,贴在plane上通过缩放位移就能调整好)
  16435. var floorPlanImgWidth = floor.cadImg.width;
  16436. var floorPlanImgHeight = floor.cadImg.height; //let floorPlanImgWidth = 3840
  16437. //let floorPlanImgHeight = 2160
  16438. var ratio = floor.cadImgRatio = size.x / (floorPlanImgWidth - cadInfo.left - cadInfo.right); //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
  16439. //var ratio = (floor.cadImgRatio = size.y / (floorPlanImgHeight - cadInfo.top - cadInfo.bottom)) //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
  16440. var width = ratio * floorPlanImgWidth;
  16441. var height = ratio * floorPlanImgHeight;
  16442. this.width = width;
  16443. this.height = height;
  16444. var shiftX = (cadInfo.left - cadInfo.right) / 2 * ratio; //偏移中心的距离
  16445. var shiftY = (cadInfo.top - cadInfo.bottom) / 2 * ratio;
  16446. floor.plane.position.set(center.x - shiftX, boundingBox.max.y + constants$4.planeHeightShift, center.z - shiftY);
  16447. floor.plane.scale.set(width, height, 1); //this.player.planLabels.forEach(label => label.update()) //因才获得cadImgRatio ,更新下
  16448. } else {
  16449. //导入的平面图
  16450. //floor.plane.scale.set(size.x, size.z, 1)
  16451. //xzw改为 保持图比例,不拉伸 2025.10 bugID=54182 不知道会不会影响之前的
  16452. var _floor$plane$material = floor.plane.material.map.image,
  16453. _width = _floor$plane$material.width,
  16454. _height = _floor$plane$material.height;
  16455. var k = Math.sqrt(size.x * size.z / _width / _height);
  16456. floor.plane.scale.set(_width * k, _height * k, 1);
  16457. floor.plane.position.copy(center).setY(boundingBox.max.y + constants$4.planeHeightShift);
  16458. }
  16459. } //设置是否可见
  16460. }, {
  16461. key: "setVisibleForCadImg",
  16462. value: function setVisibleForCadImg() {
  16463. var _this5 = this;
  16464. // 是否隐藏户型图
  16465. var hideBigMap = this.app.store.getValue('metadata').controls.showBigMap === 0;
  16466. if (!this.show || hideBigMap) {
  16467. return;
  16468. }
  16469. if (!this.ready) {
  16470. return this.deferred.then(function () {
  16471. return _this5.showCadPlane();
  16472. });
  16473. } // 不显示户型图
  16474. if (this.app.TagManager.showTagsVisible || // 热点可视
  16475. this.app.ViewLinkEdit.markView || // 编辑场景关联
  16476. this.player.EditOverlay.isAdding || this.player.EditOverlay.editPlane || // 编辑空间贴图
  16477. this.player.GLTFEditor.adding || this.player.GLTFEditor.selecting // 编辑空间模型
  16478. ) {
  16479. this.hideCadPlane();
  16480. }
  16481. } //显示某楼层的户型图
  16482. }, {
  16483. key: "showCadPlane",
  16484. value: function showCadPlane(floorIndex) {
  16485. var _this6 = this;
  16486. // 是否隐藏户型图
  16487. var hideBigMap = this.app.store.getValue('metadata').controls.showBigMap === 0;
  16488. if (floorIndex == void 0) {
  16489. floorIndex = this.model.currentFloor.floorIndex;
  16490. }
  16491. var floor = this.model.floors.index[floorIndex]; // 这些情况下,即使调用了也不显示户型图
  16492. if (!this.show || hideBigMap || this.app.TagManager.showTagsVisible || // 热点可视
  16493. this.app.ViewLinkEdit.markView || // 编辑场景关联
  16494. this.player.EditOverlay.isAdding || this.player.EditOverlay.editPlane || // 编辑空间贴图
  16495. 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且非导入的平面图
  16496. ) return floor.shouldShowPlane = false;
  16497. if (floor.deferred) {
  16498. //仍在加载
  16499. return;
  16500. /* floor.deferred.then(() => { //done就不重复写了,加载完会执行原先的
  16501. this.showCadPlane(floorIndex)
  16502. }) */
  16503. } //先隐藏其他楼层的cad
  16504. if (this.model.floors.list.length > 1) {
  16505. this.hideCadPlane({
  16506. ignoreFloor: floor
  16507. });
  16508. }
  16509. floor.shouldShowPlane = true;
  16510. var plane = floor.plane;
  16511. if (!plane && !floor.imgLoadFailed) {
  16512. var deferred = this.updateCadPlane(floorIndex);
  16513. if (deferred) {
  16514. return deferred.then(function () {
  16515. floor.shouldShowPlane && _this6.showCadPlane(floorIndex);
  16516. });
  16517. } else {
  16518. return this.changeModelOpacity(); //改为普通材质
  16519. }
  16520. } //当显示户型图平面的时候,需要修改模型材质
  16521. this.changeModelOpacity();
  16522. var showModel = this.model.showOnFloorplan; // || this.player.linkEditor?.setPanoVisible || this.player.linkEditor?.setTagVisible
  16523. this.model.setModelDisplay(showModel, 'hideOnfloorplan');
  16524. if (plane) {
  16525. plane.material.opacity = showForOpacity;
  16526. plane.visible = true; //console.log(' plane.visible = true')
  16527. if (!plane.material.map) {
  16528. //恢复
  16529. plane.material.map = new THREE.Texture(floor.cadImg);
  16530. plane.material.map.needsUpdate = true; //为什么不加这句显示不出
  16531. plane.material.needsUpdate = true;
  16532. }
  16533. }
  16534. } //隐藏户型图
  16535. }, {
  16536. key: "hideCadPlane",
  16537. value: function hideCadPlane() {
  16538. var _this7 = this;
  16539. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  16540. ignoreFloor = _ref.ignoreFloor;
  16541. if (!this.ready) {
  16542. return this.deferred.then(function () {
  16543. return _this7.hideCadPlane();
  16544. });
  16545. }
  16546. this.model.floors.forEach(function (floor) {
  16547. if (ignoreFloor == floor) return;
  16548. floor.shouldShowPlane = false;
  16549. if (floor.plane) {
  16550. //if(floor.plane.visible)console.log('visible = false')
  16551. floor.plane.visible = false; //floor.plane.material.opacity = hideForOpacity
  16552. if (floor.plane.material.map) {
  16553. //dispose
  16554. floor.plane.material.map.dispose();
  16555. floor.plane.material.map = null;
  16556. floor.plane.material.needsUpdate = true;
  16557. }
  16558. }
  16559. });
  16560. this.changeModelOpacity();
  16561. }
  16562. /**
  16563. * 手动显示/隐藏户型图
  16564. * @param {*} show
  16565. */
  16566. }, {
  16567. key: "displayCadPlane",
  16568. value: function displayCadPlane(show) {
  16569. this.setVisible(show);
  16570. show ? this.showCadPlane() : this.hideCadPlane();
  16571. } //cad编辑模块那里,因为允许用户重置,所以这里可以删除cad图片
  16572. }, {
  16573. key: "deleteAllCadPlanes",
  16574. value: function deleteAllCadPlanes() {
  16575. var _this8 = this;
  16576. this.model.floors.forEach( /*#__PURE__*/function () {
  16577. var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(floor) {
  16578. return regenerator.wrap(function _callee$(_context) {
  16579. while (1) {
  16580. switch (_context.prev = _context.next) {
  16581. case 0:
  16582. _this8.deleteCadPlane(floor);
  16583. case 1:
  16584. case "end":
  16585. return _context.stop();
  16586. }
  16587. }
  16588. }, _callee);
  16589. }));
  16590. return function (_x) {
  16591. return _ref2.apply(this, arguments);
  16592. };
  16593. }());
  16594. }
  16595. }, {
  16596. key: "deleteCadPlane",
  16597. value: function deleteCadPlane(floor) {
  16598. if (floor.plane) {
  16599. floor.plane.geometry.dispose();
  16600. floor.plane.material.map && floor.plane.material.map.dispose();
  16601. floor.plane.material.dispose();
  16602. this.model.remove(floor.plane);
  16603. floor.plane = null;
  16604. }
  16605. floor.cadImg = null;
  16606. floor.imgLoadFailed = false;
  16607. } //更新全部楼层的户型图
  16608. //cad编辑模块那里,有时候会重新载入数据,这时候等于重新执行createCadAllPlanes,但是plane可能已经创建好了,只是需要更新图片即可
  16609. }, {
  16610. key: "updateAllCadPlanes",
  16611. value: function updateAllCadPlanes() {
  16612. var _this9 = this;
  16613. //重新获取cad矢量数据
  16614. var floorplan = this.app.store.getValue('flooruser');
  16615. this.getCadImgUrl(floorplan);
  16616. this.model.floors.forEach(function (floor) {
  16617. //创建每个楼层的平面
  16618. /* floor.cadImg = null
  16619. floor.imgLoadFailed = false
  16620. this.updateCadPlane(floor.floorIndex) */
  16621. _this9.deleteCadPlane(floor);
  16622. });
  16623. } //设置模型的透明度
  16624. }, {
  16625. key: "setModelOpacity",
  16626. value: function setModelOpacity(floorIndex) {}
  16627. }, {
  16628. key: "getVisible",
  16629. value: function getVisible() {
  16630. return this.show;
  16631. }
  16632. }, {
  16633. key: "setVisible",
  16634. value: function setVisible(value) {
  16635. this.show = value;
  16636. }
  16637. }, {
  16638. key: "planUserChange",
  16639. value: function planUserChange(floorPlanUser) {
  16640. var _this$app$core$get$mo;
  16641. //保存cad后执行
  16642. //__sdk.store.getValue('metadata').floorPlanUser 是否保存过cad
  16643. //console.log('planUserChange' )
  16644. var modes = (_this$app$core$get$mo = this.app.core.get('Player').modeTran) === null || _this$app$core$get$mo === void 0 ? void 0 : _this$app$core$get$mo.split('-');
  16645. if (modes && modes.includes('floorplan')) {
  16646. //从绘图导入的平面图不显示痕迹物证
  16647. var visible = this.app.store.getValue('flooruser').type != 'image' || modes[0] == 'floorplan';
  16648. this.app.TagManager.switchLabels({
  16649. type: 'traces',
  16650. visible
  16651. }, null, 'onFloorplan');
  16652. this.app.TagManager.switchLabels({
  16653. type: 'billboards',
  16654. visible
  16655. }, null, 'onFloorplan');
  16656. }
  16657. }
  16658. }]);
  16659. return FloorplanCadImg;
  16660. }();
  16661. // init2(model) {
  16662. // this.player = this.app.core.get('Player')
  16663. // this.model = model
  16664. // // 保证数据加载后调用
  16665. // if (this.app.store.getValue('flooruser')) {
  16666. // this.createCad(this.app.store.getValue('flooruser'))
  16667. // } else {
  16668. // this.app.store.on('flooruser', floor => this.createCad(floor))
  16669. // }
  16670. // this.player.on(PlayerEvents.ModeChanging, (lastMode, mode, pano, dur) => {
  16671. // if (mode == Viewmode.FLOORPLAN) {
  16672. // let view360ShowDur = 1000
  16673. // setTimeout(this.showCad.bind(this), Math.min(view360ShowDur, dur))
  16674. // } else {
  16675. // this.hideCad()
  16676. // }
  16677. // })
  16678. // }
  16679. // /**
  16680. // * 显示户型图
  16681. // * @returns
  16682. // */
  16683. // showCad() {
  16684. // // 是否隐藏户型图
  16685. // const hideBigMap = this.app.store.getValue('metadata').controls.showBigMap === 0
  16686. // if (!this.show || hideBigMap) {
  16687. // return
  16688. // }
  16689. // if (!this.ready) {
  16690. // return this.deferred.then(() => this.showCad())
  16691. // }
  16692. // // 不显示户型图
  16693. // if (
  16694. // this.app.TagManager.showTagsVisible || // 热点可视
  16695. // this.app.ViewLinkEdit.markView || // 编辑场景关联
  16696. // this.player.EditOverlay.isAdding ||
  16697. // this.player.EditOverlay.editPlane || // 编辑空间贴图
  16698. // this.player.GLTFEditor.adding ||
  16699. // this.player.GLTFEditor.selecting // 编辑空间模型
  16700. // )
  16701. // return
  16702. // this.hideCad()
  16703. // // console.log('showCad ' + this.model.currentFloor.floorIndex)
  16704. // let plane = this.model.floors.index[this.model.currentFloor.floorIndex].plane
  16705. // if (plane) {
  16706. // plane.material.opacity = showForOpacity
  16707. // plane.visible = true
  16708. // this.changeModelOpacity(showForModelOpacity)
  16709. // }
  16710. // }
  16711. // /**
  16712. // * 隐藏户型图
  16713. // * @returns
  16714. // */
  16715. // hideCad() {
  16716. // if (!this.ready) {
  16717. // return this.deferred.then(() => this.hideCad())
  16718. // }
  16719. // // console.log('hideCad ' + this.model.currentFloor.floorIndex)
  16720. // this.model.floors.forEach(floor => {
  16721. // if (floor.plane) {
  16722. // floor.plane.visible = false
  16723. // floor.plane.material.opacity = hideForOpacity
  16724. // } else {
  16725. // console.warn('还没有创建plane')
  16726. // }
  16727. // })
  16728. // this.changeModelOpacity(hideForModelOpacity)
  16729. // }
  16730. // /**
  16731. // * 手动显示/隐藏户型图
  16732. // * @param {*} show
  16733. // */
  16734. // displayCad(show) {
  16735. // this.show = show
  16736. // this.show ? this.showCad() : this.hideCad()
  16737. // }
  16738. // /**
  16739. // * 创建户型图的贴图
  16740. // */
  16741. // createCad(floor) {
  16742. // if (floor.type == 'image') {
  16743. // // 图片模式
  16744. // floor.floors.forEach(floor => {
  16745. // this.createCustomPlane(floor.subgroup, this.app.resource.getUserResourceURL(floor.filename))
  16746. // })
  16747. // this.ready = true
  16748. // } else {
  16749. // // CAD模式
  16750. // if (!this.app.store.getValue('metadata').floorPlanUser) {
  16751. // this.ready = true
  16752. // this.deferred.resolve()
  16753. // return
  16754. // }
  16755. // this.model.floors.forEach(floor => {
  16756. // floor.floorTexture && (floor.floorTexture.dispose(), (floor.floorTexture = null))
  16757. // texture.load(
  16758. // this.app.resource.getUserResourceURL(`floor-cad-${floor.floorIndex}.png`),
  16759. // texture => {
  16760. // //加载完成:
  16761. // texture.needsUpdate = !0
  16762. // floor.floorTexture = texture
  16763. // this.createPlane(floor.floorIndex)
  16764. // },
  16765. // xhr => {
  16766. // if (++this.done == this.model.floors.length) {
  16767. // this.ready = true
  16768. // this.deferred.resolve()
  16769. // }
  16770. // console.warn(`没有floorplan_${floor.floorIndex}.png`)
  16771. // }
  16772. // )
  16773. // })
  16774. // }
  16775. // }
  16776. // createPlane(index) {
  16777. // var floor = this.model.floors.index[index]
  16778. // var needAdjust = false
  16779. // var boundingBox = floor.boundingBox
  16780. // needAdjust = true
  16781. // var center = boundingBox.getCenter(this.center)
  16782. // var size = boundingBox.getSize(new THREE.Vector3())
  16783. // var geometry = new THREE.PlaneBufferGeometry(1, 1)
  16784. // var plane = null
  16785. // var cadInfo = this.getCadInfo(index)
  16786. // if (!cadInfo || this.app.store.getValue('flooruser').vesion) {
  16787. // plane = new THREE.Mesh(
  16788. // geometry,
  16789. // new THREE.MeshBasicMaterial({
  16790. // map: null,
  16791. // opacity: 0,
  16792. // transparent: !0,
  16793. // side: THREE.DoubleSide,
  16794. // depthTest: false, //防止遮挡热点等物体
  16795. // visible: false,
  16796. // })
  16797. // )
  16798. // } else {
  16799. // var material = new THREE.MeshBasicMaterial({
  16800. // map: floor.floorTexture,
  16801. // opacity: this.player.modeTran && this.player.modeTran.split('-')[1] == 'floorplan' ? showForOpacity : hideForOpacity,
  16802. // //opacity: 1,
  16803. // transparent: !0,
  16804. // side: THREE.DoubleSide,
  16805. // depthTest: false, //防止遮挡热点等物体
  16806. // })
  16807. // material.needsUpdate = !0
  16808. // plane = new THREE.Mesh(geometry, material)
  16809. // if (cadInfo.bound) {
  16810. // size.x = cadInfo.bound.right - cadInfo.bound.left
  16811. // size.z = cadInfo.bound.bottom - cadInfo.bound.top
  16812. // center.x = (cadInfo.bound.right + cadInfo.bound.left) / 2
  16813. // center.z = (cadInfo.bound.bottom + cadInfo.bound.top) / 2
  16814. // }
  16815. // }
  16816. // // TRANSITIONING时add会造成动画卡顿
  16817. // //if (this.player.mode !== Viewmode.TRANSITIONING) this.model.add(plane)
  16818. // //else this.player.once('mode.afterChange', () => this.model.add(plane))
  16819. // this.model.add(plane)
  16820. // floor.plane = plane
  16821. // plane.rotateX(-Math.PI / 2)
  16822. // const metadata = this.app.store.getValue('metadata')
  16823. // var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0)
  16824. // plane.rotateZ(floorPlanAngle)
  16825. // plane.renderOrder = RenderOrder.cad //盖住模型,否则其他层模型会影响它
  16826. // plane.name = 'floorplanImg'
  16827. // if (cadInfo) {
  16828. // this.adjustPlane(boundingBox, index, size, center, false, cadInfo)
  16829. // }
  16830. // //注意:图和模型吻合的前提是模型生成正确 且和cad图一致。比如不能模型多了一个房间或者修改过了添加了个东西导致boundingbox变化之类的 (所以以floor.json来重新算了次boundingbox)
  16831. // this.changeCadVisible(null, { autoJudge: true })
  16832. // if (++this.done == this.model.floors.length) {
  16833. // this.ready = true
  16834. // this.deferred.resolve()
  16835. // if (this.player.mode == Viewmode.FLOORPLAN) {
  16836. // this.showCad()
  16837. // }
  16838. // }
  16839. // }
  16840. // deletePlanes() {
  16841. // this.model.floors.forEach(async floor => {
  16842. // floor.plane.geometry.dispose()
  16843. // floor.plane.material.dispose()
  16844. // this.model.remove(floor.plane)
  16845. // floor.plane = null
  16846. // })
  16847. // }
  16848. // updatePlanes() {
  16849. // this.model.floors.forEach(async floor => {
  16850. // floor.floorTexture && (floor.floorTexture.dispose(), (floor.floorTexture = null))
  16851. // if (!floor.plane) {
  16852. // this.createCad(floor.floorIndex)
  16853. // }
  16854. // if (floor.plane) {
  16855. // floor.plane.material.opacity = hideForOpacity
  16856. // floor.plane.material.map = null
  16857. // floor.plane.material.needsUpdate = !0
  16858. // floor.plane.material.visible = false
  16859. // let imgName = null
  16860. // let flooruser = this.app.store.getValue('flooruser')
  16861. // //cad绘图保存的时候
  16862. // if (flooruser.type != 'image') {
  16863. // imgName = `floor-cad-${floor.floorIndex}.png`
  16864. // loader.load(
  16865. // this.app.resource.getUserResourceURL(imgName, true),
  16866. // //this.app.resource.getUserResourceURL(imgName, true),
  16867. // texture => {
  16868. // //加载完成:
  16869. // texture.needsUpdate = !0
  16870. // floor.floorTexture = texture
  16871. // this.updatePlane(floor.floorIndex, texture)
  16872. // },
  16873. // xhr => {
  16874. // if (++this.done == this.model.floors.length) {
  16875. // this.ready = true
  16876. // this.deferred.resolve()
  16877. // }
  16878. // console.warn(`没有 floorplan_${floor.floorIndex}.png`)
  16879. // }
  16880. // )
  16881. // } else {
  16882. // let data = flooruser.floors.find(c => c.subgroup == floor.floorIndex)
  16883. // imgName = data.filename
  16884. // floor.plane.material = new THREE.MeshBasicMaterial({
  16885. // map: loader.load(this.app.resource.getUserResourceURL(imgName, true)),
  16886. // opacity: showForOpacity,
  16887. // transparent: !0,
  16888. // side: THREE.DoubleSide,
  16889. // depthTest: false, //防止遮挡热点等物体
  16890. // })
  16891. // floor.plane.material.needsUpdate = !0
  16892. // }
  16893. // }
  16894. // })
  16895. // }
  16896. // updatePlane(index, texture) {
  16897. // var floor = this.model.floors.index[index]
  16898. // var needAdjust = false
  16899. // var boundingBox = floor.boundingBox
  16900. // needAdjust = true
  16901. // var center = boundingBox.getCenter(this.center)
  16902. // var size = boundingBox.getSize(new THREE.Vector3())
  16903. // if (floor.plane) {
  16904. // floor.plane.renderOrder = RenderOrder.cad //盖住模型,否则其他层模型会影响它
  16905. // floor.plane.name = 'floorplanImg'
  16906. // const metadata = this.app.store.getValue('metadata')
  16907. // var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0)
  16908. // floor.plane.rotation.z = 0
  16909. // floor.plane.rotateZ(floorPlanAngle)
  16910. // }
  16911. // var cadInfo = this.getCadInfo(index)
  16912. // console.log(cadInfo, '----after')
  16913. // if (!cadInfo || this.app.store.getValue('flooruser').vesion) {
  16914. // if (floor.plane) {
  16915. // floor.plane.material.opacity = hideForOpacity
  16916. // floor.plane.material.map = null
  16917. // floor.plane.material.needsUpdate = !0
  16918. // floor.plane.material.visible = false
  16919. // }
  16920. // } else if (cadInfo.bound) {
  16921. // size.x = cadInfo.bound.right - cadInfo.bound.left
  16922. // size.z = cadInfo.bound.bottom - cadInfo.bound.top
  16923. // center.x = (cadInfo.bound.right + cadInfo.bound.left) / 2
  16924. // center.z = (cadInfo.bound.bottom + cadInfo.bound.top) / 2
  16925. // if (floor.plane) {
  16926. // floor.plane.material.map = texture
  16927. // floor.plane.material.needsUpdate = !0
  16928. // floor.plane.material.visible = true
  16929. // }
  16930. // this.adjustPlane(boundingBox, index, size, center, false, cadInfo)
  16931. // }
  16932. // //注意:图和模型吻合的前提是模型生成正确 且和cad图一致。比如不能模型多了一个房间或者修改过了添加了个东西导致boundingbox变化之类的 (所以以floor.json来重新算了次boundingbox)
  16933. // this.changeCadVisible(null, { autoJudge: true })
  16934. // if (++this.done == this.model.floors.length) {
  16935. // this.ready = true
  16936. // this.deferred.resolve()
  16937. // }
  16938. // }
  16939. // adjustPlane(boundingBox, index, size, center, onlyHeight, cadInfo) {
  16940. // var floor = this.model.floors.index[index]
  16941. // if (onlyHeight) {
  16942. // floor.plane.position.y = boundingBox.max.y + constants.planeHeightShift
  16943. // return
  16944. // }
  16945. // size = size || boundingBox.getSize(new THREE.Vector3())
  16946. // center = center || boundingBox.getCenter(new THREE.Vector3())
  16947. // if (floor.floorTexture.image == null) {
  16948. // return
  16949. // }
  16950. // //为了让图片刚好和模型吻合(cadInfo包含的信息是像素为单位,表示出了图中从哪到哪为模型的部分,贴在plane上通过缩放位移就能调整好)
  16951. // let floorPlanImgWidth = floor.floorTexture.image.width
  16952. // let floorPlanImgHeight = floor.floorTexture.image.height
  16953. // //let floorPlanImgWidth = 3840
  16954. // //let floorPlanImgHeight = 2160
  16955. // var ratio = (floor.cadImgRatio = size.x / (floorPlanImgWidth - cadInfo.left - cadInfo.right)) //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
  16956. // //var ratio = (floor.cadImgRatio = size.y / (floorPlanImgHeight - cadInfo.top - cadInfo.bottom)) //模型对于图片的换算比例,这里只用了宽度来及计算,默认高度和宽度比例一样
  16957. // var width = ratio * floorPlanImgWidth
  16958. // var height = ratio * floorPlanImgHeight
  16959. // this.width = width
  16960. // this.height = height
  16961. // var shiftX = ((cadInfo.left - cadInfo.right) / 2) * ratio //偏移中心的距离
  16962. // var shiftY = ((cadInfo.top - cadInfo.bottom) / 2) * ratio
  16963. // floor.plane.position.set(center.x - shiftX, boundingBox.max.y + constants.planeHeightShift, center.z - shiftY)
  16964. // floor.plane.scale.set(width, height, 1)
  16965. // this.player.planLabels.forEach(label => label.update()) //因才获得cadImgRatio ,更新下
  16966. // }
  16967. var cameraLight = {
  16968. clampVFOV: function clampVFOV(currentFov, maxHFov, width, height) {
  16969. //限制currentFov, 使之造成的横向fov不大于指定值maxHFov
  16970. var r = cameraLight.getHFOVFromVFOV(currentFov, width, height);
  16971. return r > maxHFov ? cameraLight.getVFOVFromHFOV(maxHFov, width, height) : currentFov;
  16972. },
  16973. getHFOVForCamera: function getHFOVForCamera(camera, width, height, getRad) {
  16974. if (!width) width = camera.aspect, height = width / camera.aspect;
  16975. return cameraLight.getHFOVFromVFOV(camera.fov, width, height, getRad);
  16976. },
  16977. getHFOVFromVFOV: function getHFOVFromVFOV(fov, width, height, getRad) {
  16978. var hfov = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (width / height));
  16979. return getRad ? hfov : hfov * MathLight.DEGREES_PER_RADIAN;
  16980. },
  16981. getVFOVFromHFOV: function getVFOVFromHFOV(fov, width, height, getRad) {
  16982. var vfov = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (height / width));
  16983. return getRad ? vfov : vfov * MathLight.DEGREES_PER_RADIAN;
  16984. }
  16985. /* clampVFOV: function(fov, t, i, n) {
  16986. var r = cameraLight.getHFOVFromVFOV(fov, i, n);
  16987. return r > t ? cameraLight.getVFOVFromHFOV(t, i, n) : fov
  16988. },
  16989. getHFOVForCamera: function(e, t, i) {
  16990. return cameraLight.getHFOVFromVFOV(e.fov, t, i)
  16991. },
  16992. getHFOVFromVFOV: function(fov, t, i) {
  16993. var n = t
  16994. , o = i
  16995. , a = 2 * Math.atan(Math.tan(fov * MathLight.RADIANS_PER_DEGREE / 2) * (n / o)) * MathLight.DEGREES_PER_RADIAN;
  16996. return a
  16997. },
  16998. getVFOVFromHFOV: function(e, t, i) {
  16999. var n = t
  17000. , o = i
  17001. , a = 2 * Math.atan(Math.tan(e * MathLight.RADIANS_PER_DEGREE / 2) * (o / n)) * MathLight.DEGREES_PER_RADIAN;
  17002. return a
  17003. } */
  17004. };
  17005. /*
  17006. 二维的标尺。
  17007. 主要难度是将三维线段转化为二维。
  17008. 因此需要知道三维线段两个端点对应的二维点。 但是它们不一定同时可求。
  17009. 如果两个端点都不可求,姑且不显示这条线段(因为概率很小,虽然利用线上任意两点)
  17010. 如果一个可求一个不可求,可以利用可求点和线上任意一个可求点作一条直线,和屏幕边缘求交点,即可画出。 目前使用的是线段中点,如果中点不可求,继续尝试可求点到中点的中点……
  17011. 求出二维点后,算出和某个基准线的夹角,即可用transfrom来变换element。
  17012. */
  17013. function CornerRuler(o, player) {
  17014. var _this = this;
  17015. this.sid = o.sid;
  17016. this.showSid = o.showSid;
  17017. this.text = o.text || '';
  17018. this.state = o.state || 'active';
  17019. this.player = player;
  17020. this.app = player.$app;
  17021. this.elem = document.createElement('div');
  17022. this.elem.className = 'ruler';
  17023. this.elem.setAttribute('data-name', '');
  17024. this.elem.style.display = 'none';
  17025. 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");
  17026. this.setPoints(o.points);
  17027. this.player.cornerRulers.push(this);
  17028. var count = 0;
  17029. var tryAppend = function tryAppend() {
  17030. if (document.querySelector('.widgets-rulers')) {
  17031. document.querySelector('.widgets-rulers').append(_this.elem);
  17032. } else if (count++ < 4) {
  17033. setTimeout(tryAppend, 500);
  17034. }
  17035. };
  17036. tryAppend();
  17037. }
  17038. CornerRuler.prototype.setPoints = function (p) {
  17039. if (this.points && this.points[0].equals(p[0]) && this.points[1].equals(p[1])) return;
  17040. this.points = p;
  17041. this.updateText();
  17042. };
  17043. CornerRuler.prototype.updateText = function () {
  17044. {
  17045. //试试自动计算长度 在mp的场景应该很准确
  17046. this.length = Math.round(this.points[0].distanceTo(this.points[1]) * 100) / 100;
  17047. this.text = this.app.config.i18n('common.about') + this.length + this.app.config.i18n('common.meter') + (this.showSid ? ' | ' + this.sid : '');
  17048. }
  17049. this.elem.querySelector('.ruler-label-name').innerText = this.text;
  17050. };
  17051. CornerRuler.prototype.remove = function () {
  17052. this.elem.remove();
  17053. };
  17054. CornerRuler.prototype.getCrossPoint = function (posIn, posOut) {
  17055. //求posOut在屏幕的可见端点,也就是从posOut到posIn的射线和屏幕边界的交点。 其中posIn只是另一个端点,并不是一定在屏幕内;而posOut是一定要在屏幕外,否则..没试过。
  17056. var W = this.player.domElement.clientWidth;
  17057. var H = this.player.domElement.clientHeight;
  17058. var x, y, border;
  17059. var r = (posOut.x - posIn.x) / (posOut.y - posIn.y); //根据相似三角形原理先求出这个比值
  17060. var getX = function getX(y) {
  17061. return r * (y - posIn.y) + posIn.x;
  17062. };
  17063. var getY = function getY(x) {
  17064. return 1 / r * (x - posIn.x) + posIn.y;
  17065. };
  17066. if (posOut.x > W || posOut.x < 0) {
  17067. //x超出的情况
  17068. if (posOut.x > W) border = W;else border = 0;
  17069. if (posOut.y < 0 || posOut.y > H) {
  17070. //y也超出
  17071. if (posOut.y < 0) y = 0;else y = H;
  17072. x = getX(y);
  17073. if (x > W || x < 0) {
  17074. x = border;
  17075. y = getY(x);
  17076. }
  17077. } else {
  17078. x = border;
  17079. y = getY(x);
  17080. }
  17081. } else {
  17082. //只有y超出,x没有超出
  17083. if (posOut.y < 0) y = 0;else y = H;
  17084. x = getX(y);
  17085. }
  17086. return new THREE.Vector2(x, y);
  17087. }; //getCrossPoint的posIn版本
  17088. CornerRuler.prototype.getPosInCrossPoint = function (p1, aim) {
  17089. //求aim在边界上的交点,其中aim在屏幕范围内,p1则不一定
  17090. var W = this.player.domElement.clientWidth;
  17091. var H = this.player.domElement.clientHeight;
  17092. return math$2.getCrossPointAtRect(p1, aim, W, H, 0, 0);
  17093. };
  17094. CornerRuler.prototype.getPosAtSphere = function (toPos) {
  17095. //fish
  17096. this.fishPoints = [];
  17097. this.points.forEach(function (p) {
  17098. var pos = convertTool.getPosAtSphere(p.clone(), toPos);
  17099. this.fishPoints.push(pos);
  17100. }.bind(this));
  17101. };
  17102. var reTryCount$1 = 1;
  17103. CornerRuler.prototype.getPosInScreen = function (p1, p2, count) {
  17104. // p1 p2中一个是trueSide一个不是, 目的是得到两个trueSide
  17105. var center = p1.point.clone().add(p2.point).multiplyScalar(0.5); //二分法
  17106. var pos2d = convertTool.getPos2d(center, this.player);
  17107. if (pos2d.trueSide) {
  17108. var visi = p1.pos2d.trueSide ? p1.pos2d : p2.pos2d;
  17109. if (pos2d.inSight) {
  17110. pos2d.pos = this.getPosInCrossPoint(visi.pos, pos2d.pos);
  17111. pos2d.vector = null;
  17112. /* console.log("pos2d.inSight") */
  17113. } //要求它在边界上的点才行,否则范围被缩小
  17114. return {
  17115. result: 'p1p2',
  17116. p1: visi,
  17117. p2: pos2d
  17118. };
  17119. } else {
  17120. if (count + 1 > reTryCount$1) return; //最多重复次数
  17121. var trueSide = p1.pos2d.trueSide ? p1 : p2;
  17122. return this.getPosInScreen(trueSide, {
  17123. point: center,
  17124. pos2d: pos2d
  17125. }, ++count);
  17126. }
  17127. };
  17128. CornerRuler.prototype.update = function () {
  17129. // Todo 有bug 先注释
  17130. if (this.player.mode != 'panorama' || this.state != 'active') {
  17131. this.elem.style.display = 'none';
  17132. return;
  17133. } //似乎不能根据遮挡来取消显示,因为家具就是会遮住靠墙的尺子。所以只能根据编辑的可视点?
  17134. var p1 = convertTool.getPos2d(this.points[0], this.player);
  17135. var p2 = convertTool.getPos2d(this.points[1], this.player);
  17136. if (!p1.trueSide || !p2.trueSide) {
  17137. //背面点处理
  17138. if (!p1.trueSide && !p2.trueSide) {
  17139. //这种情况一般都是线段背离相机了,基本不用考虑
  17140. this.elem.style.display = 'none';
  17141. return;
  17142. }
  17143. var retry = this.getPosInScreen( //如果线太长了,在很多倾斜点的角度只有一个端点trueSide,那么去到线段中点找trueSide的点,化作新的端点。
  17144. {
  17145. point: this.points[0],
  17146. pos2d: p1
  17147. }, {
  17148. point: this.points[1],
  17149. pos2d: p2
  17150. }, 0);
  17151. if (!retry) {
  17152. this.elem.style.display = 'none';
  17153. return;
  17154. }
  17155. p1 = retry.p1;
  17156. p2 = retry.p2;
  17157. }
  17158. var pos1 = p1.pos,
  17159. pos2 = p2.pos;
  17160. var len = pos1.distanceTo(pos2);
  17161. if (len == 0) {
  17162. console.warn('ruler间距为0!');
  17163. return;
  17164. } //计算BA和水平向右的向量间的夹角0-180
  17165. var angle = Math.acos((pos1.x - pos2.x) / len);
  17166. angle %= 360;
  17167. angle *= 180 / Math.PI; //计算angle方向是顺时针还是逆时针(画出4种情况即可发现有这两个方向)
  17168. var BA1 = pos1.clone().sub(pos2);
  17169. var BA = new THREE.Vector3(BA1.x, BA1.y, 0);
  17170. var BC = new THREE.Vector3(1, 0, 0);
  17171. var dir = BA.cross(BC).z > 0 ? 1 : -1;
  17172. angle *= dir; //更新尺子的位置 具体绘图见笔记 //以第二个点B为基准
  17173. {
  17174. var lineElem = this.elem.querySelector('.ruler-line');
  17175. lineElem.style.width = len + 'px', lineElem.style.left = p2.pos.x + 'px';
  17176. lineElem.style.top = p2.pos.y + 'px', lineElem.style.transform = 'rotate(' + -angle + 'deg)';
  17177. } //更新label箭头的中心位置
  17178. var centerX,
  17179. centerY,
  17180. ratio = 0.5,
  17181. W = this.player.domElement.clientWidth,
  17182. H = this.player.domElement.clientHeight;
  17183. if (!p1.inSight || !p2.inSight) {
  17184. var pos1inSight, pos2inSight; //屏幕可见线段端点。
  17185. if (!p1.inSight) {
  17186. //在屏幕外的端点要求出在和屏幕边界的交点作为可见线段端点
  17187. pos1inSight = this.getCrossPoint(pos2, pos1);
  17188. } else {
  17189. pos1inSight = pos1.clone();
  17190. }
  17191. if (!p2.inSight) {
  17192. pos2inSight = this.getCrossPoint(pos1, pos2);
  17193. } else {
  17194. pos2inSight = pos2.clone();
  17195. }
  17196. var center = pos1inSight.clone().add(pos2inSight).multiplyScalar(0.5); //在屏幕上的可见中心点
  17197. centerX = center.x;
  17198. centerY = center.y;
  17199. if (center.x > W || center.x < 0 || center.y > H || center.y < 0) {
  17200. //可见中心不在屏幕范围内,那么这条线也一定不在范围内。(似乎是,想象的..因为是可见中心)
  17201. this.elem.style.display = 'none';
  17202. return;
  17203. } //ratio是center到div旋转中心(原始B点)的距离 和 线段长度 的比例
  17204. if (pos2.x == pos1.x) {
  17205. if (pos2.y == pos1.y) {
  17206. console.warn('pos1和2一样???');
  17207. return;
  17208. } else {
  17209. if (pos2.y < pos1.y) ratio = (centerY - pos2.y) / (pos1.y - pos2.y);else ratio = (pos2.y - centerY) / (pos2.y - pos1.y);
  17210. }
  17211. } else {
  17212. if (pos2.x < pos1.x) ratio = (centerX - pos2.x) / (pos1.x - pos2.x); //if B在右
  17213. else ratio = (pos2.x - centerX) / (pos2.x - pos1.x); //if B在左
  17214. }
  17215. if (ratio < 0 || ratio > 1) {
  17216. this.elem.style.display = 'none';
  17217. return;
  17218. } //如果ratio超出范围,说明可见中心脱离线段
  17219. } else {
  17220. centerX = (pos1.x + pos2.x) / 2;
  17221. }
  17222. this.elem.style.display = ''; //更新label的方向是左侧还是右侧
  17223. var labelElem = this.elem.querySelector('.ruler-label');
  17224. if (this.dir != 'left' && centerX < W / 2 || this.dir == 'right') {
  17225. labelElem.classList.add('reverse');
  17226. } else {
  17227. labelElem.classList.remove('reverse');
  17228. }
  17229. labelElem.style.transform = 'rotate(' + angle + 'deg)';
  17230. labelElem.style.left = ratio * 100 + '%';
  17231. };
  17232. var SceneRendererEvents = {
  17233. ContextCreated: 'scene-renderer-context-created',
  17234. AfterRender: 'after-render',
  17235. MemoryUsageUpdated: 'scene-renderer-memory-usage-updated'
  17236. };
  17237. var addLabel$2 = browser$1.urlHasValue('pointLabel');
  17238. var horRulerShowSid = addLabel$2;
  17239. var labelProp = {
  17240. backgroundColor: {
  17241. r: 255,
  17242. g: 255,
  17243. b: 255,
  17244. a: 0.4
  17245. },
  17246. textColor: {
  17247. r: 0,
  17248. g: 0,
  17249. b: 0,
  17250. a: 1
  17251. },
  17252. borderRadius: 15,
  17253. renderOrder: 50
  17254. };
  17255. var player$m;
  17256. var WallManager = /*#__PURE__*/function () {
  17257. function WallManager(app) {
  17258. _classCallCheck(this, WallManager);
  17259. this.app = app;
  17260. this.roomInfo = {};
  17261. this.rulerVisi = false;
  17262. this.version = 2;
  17263. this.cad = null;
  17264. this.planeNeedAdjust = [];
  17265. this.appType = null;
  17266. this.showRulers = addLabel$2; //true
  17267. this.updateList = [];
  17268. }
  17269. _createClass(WallManager, [{
  17270. key: "init",
  17271. value: function init(model) {
  17272. this.model = model;
  17273. player$m = this.app.core.get('Player');
  17274. if (Object.keys(this.roomInfo).length && this.roomInfo[Object.keys(this.roomInfo)[0]].rooms.length) {
  17275. return false; //已经创建了?
  17276. }
  17277. var metadata = this.app.store.getValue('metadata');
  17278. var floorJson = this.app.store.getValue('flooruser');
  17279. this.initRoomInfo(common$1.CloneJson(floorJson));
  17280. if (metadata && metadata.controls.showScale) {
  17281. this.showRulers = true;
  17282. return true;
  17283. }
  17284. }
  17285. }, {
  17286. key: "switchDisplay",
  17287. value: function switchDisplay(ifShow) {
  17288. this.showRulers = !!ifShow;
  17289. this.updateRulersVisi();
  17290. } // 加额外显示的label 如房间名 标尺
  17291. }, {
  17292. key: "initRoomInfo",
  17293. value: function initRoomInfo(floorJson) {
  17294. var _this = this;
  17295. new THREE.MeshBasicMaterial({
  17296. transparent: true,
  17297. wireframe: true,
  17298. opacity: 0.3,
  17299. color: '#ff9999',
  17300. depthTest: false,
  17301. side: THREE.DoubleSide
  17302. });
  17303. var oriRoomGroup = new THREE.Object3D();
  17304. this.model.add(oriRoomGroup);
  17305. oriRoomGroup.visible = false;
  17306. this.cad = floorJson;
  17307. this.initFloorPlan(floorJson);
  17308. /* performance.mark('ifPanoSeePoints-start')
  17309. this.model.panos.list.forEach((pano)=>{
  17310. this.ifPanoSeePoints(pano);
  17311. })
  17312. performance.mark('ifPanoSeePoints-end')
  17313. performance.measure('ifPanoSeePoints', 'ifPanoSeePoints-start', 'ifPanoSeePoints-end')
  17314. */
  17315. {
  17316. var update = function update() {
  17317. //console.log('update', this.updateList.length)
  17318. _this.updateList.forEach(function (ruler) {
  17319. ruler.update();
  17320. });
  17321. };
  17322. this.app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function (e) {
  17323. if (player$m.lastFrameChanged) {
  17324. common$1.intervalTool.isWaiting('updateRulersVisi_' + _this.app.resource.num, function () {
  17325. _this.updateRulersVisi();
  17326. }, 500);
  17327. update();
  17328. }
  17329. });
  17330. }
  17331. }
  17332. }, {
  17333. key: "initFloorPlan",
  17334. value: function initFloorPlan(floorCad) {
  17335. var _this2 = this;
  17336. common$1.timeMeasuring.addTimeMark('initFloorPlan', 'start');
  17337. floorCad.floors.forEach(function (floorJson, floorIndex) {
  17338. var floor = player$m.model.floors.index[floorIndex];
  17339. if (!floor) {
  17340. console.error('没找到floor', floorJson);
  17341. return;
  17342. }
  17343. var bottom = floor.boundingBox.min.y;
  17344. var top = floor.boundingBox.max.y;
  17345. floorJson.bottom = bottom;
  17346. floorJson.top = top;
  17347. for (var id in floorJson.points) {
  17348. var point = floorJson.points[id];
  17349. var walls = point.parent;
  17350. var btmPos = _this2.getPos3dFrom2d(point, bottom);
  17351. var topPos = _this2.getPos3dFrom2d(point, top);
  17352. var pointRulerInfo = {
  17353. point,
  17354. horizons: [],
  17355. verti: null
  17356. };
  17357. pointRulerInfo.verti = _this2.addRuler(btmPos, topPos, "floor".concat(floorIndex, "-p").concat(id, "-verti"));
  17358. for (var wall in walls) {
  17359. //这个不准
  17360. /* let p2type = walls[wall] == 'start' ? 'end' : 'start'
  17361. let rulerInfo = this.getHorRuler(id, floorJson.walls[wall][p2type], floorIndex, bottom)
  17362. */
  17363. //监控错误:
  17364. if (wall == 'null' || !floorJson.walls[wall]) {
  17365. console.warn('该点有wall == null的walls', point);
  17366. continue;
  17367. }
  17368. walls[wall] == 'start' ? 'end' : 'start';
  17369. var realp2Type = floorJson.walls[wall].start == id ? 'end' : 'start'; //if (p2type != realp2Type) console.error('p2type != realp2Type', wall, id)
  17370. var p2Id = floorJson.walls[wall][realp2Type];
  17371. var rulerInfo = _this2.getHorRuler(id, p2Id, floorIndex, bottom); //
  17372. pointRulerInfo.horizons.push(rulerInfo);
  17373. }
  17374. pointRulerInfo.horizons = pointRulerInfo.horizons.sort(function (r1, r2) {
  17375. return r1.angle - r2.angle;
  17376. });
  17377. point.pointRulerInfo = pointRulerInfo;
  17378. addLabel$2 && _this2.addLabel(point, btmPos, floor);
  17379. }
  17380. });
  17381. common$1.timeMeasuring.addTimeMark('initFloorPlan', 'end', true);
  17382. }
  17383. }, {
  17384. key: "getHorRuler",
  17385. value: function getHorRuler(p1Id, p2Id, floorIndex, bottom) {
  17386. if (p1Id == p2Id) {
  17387. console.error('p1Id == p2Id');
  17388. }
  17389. var id1 = p1Id.split('Point')[1];
  17390. var id2 = p2Id.split('Point')[1];
  17391. var sid1 = "f".concat(floorIndex, "-").concat(id1, "-").concat(id2, "-hor");
  17392. var sid2 = "f".concat(floorIndex, "-").concat(id2, "-").concat(id1, "-hor");
  17393. var ruler = player$m.cornerRulers.find(function (e) {
  17394. return e.sid == sid1;
  17395. });
  17396. if (ruler) return {
  17397. ruler,
  17398. angle: ruler.angle
  17399. }; //多半找不到,因为一条线最多只能从两个点找到,getHorRuler应该是创建完就从反方向get了
  17400. else ruler = player$m.cornerRulers.find(function (e) {
  17401. return e.sid == sid2;
  17402. });
  17403. if (ruler) return {
  17404. ruler,
  17405. angle: (ruler.angle + Math.PI) % (2 * Math.PI)
  17406. };else {
  17407. var json = this.cad.floors[floorIndex];
  17408. var p1 = json.points[p1Id];
  17409. var p2 = json.points[p2Id];
  17410. ruler = this.addRuler(this.getPos3dFrom2d(p1, bottom), this.getPos3dFrom2d(p2, bottom), sid1, horRulerShowSid);
  17411. ruler.angle = new THREE.Vector2().subVectors(p2, p1).angle(); //用来排序角度
  17412. ruler.pointIds = [p1Id, p2Id];
  17413. return {
  17414. ruler,
  17415. angle: ruler.angle
  17416. };
  17417. }
  17418. }
  17419. }, {
  17420. key: "addRuler",
  17421. value: function addRuler(startPos, endPos, sid, showSid) {
  17422. var ruler = new CornerRuler({
  17423. sid,
  17424. points: [startPos, endPos],
  17425. state: 'unable',
  17426. showSid
  17427. }, player$m);
  17428. return ruler;
  17429. }
  17430. }, {
  17431. key: "addLabel",
  17432. value: function addLabel(point, pos, model) {
  17433. //this.removeLabel()
  17434. var label = new TextSprite(Object.assign({}, labelProp, {
  17435. text: point.vectorId.split('Point')[1],
  17436. player: player$m
  17437. }));
  17438. label.sprite.material.depthTest = true;
  17439. var position = pos.clone();
  17440. position.y += 0.2;
  17441. label.position.copy(position);
  17442. model.add(label);
  17443. labelProp.scale || (labelProp.scale = math$2.linearClamp(this.model.size.length(), 10, 500, 0.5, 7));
  17444. var s = labelProp.scale;
  17445. label.scale.set(s, s, s);
  17446. }
  17447. }, {
  17448. key: "getPos3dFrom2d",
  17449. value: function getPos3dFrom2d(point2d, height) {
  17450. return new THREE.Vector3(point2d.x, height, -point2d.y);
  17451. }
  17452. }, {
  17453. key: "getPos2dFrom3d",
  17454. value: function getPos2dFrom3d(point3d) {
  17455. return new THREE.Vector2(point3d.x, -point3d.z);
  17456. }
  17457. }, {
  17458. key: "isShelter",
  17459. value: function isShelter(floorJson, point1, point2) {
  17460. //walls数量多时耗时
  17461. var line1 = [point1, point2];
  17462. var atWalls = [];
  17463. point1.parent && atWalls.push.apply(atWalls, _toConsumableArray(Object.keys(point1.parent)));
  17464. point2.parent && atWalls.push.apply(atWalls, _toConsumableArray(Object.keys(point2.parent)));
  17465. var intersecPoint;
  17466. var intersectLine = Object.values(floorJson.walls).find(function (wall) {
  17467. if (atWalls.some(function (e) {
  17468. return e == wall.vectorId;
  17469. })) return;
  17470. var point1_ = floorJson.points[wall.start];
  17471. var point2_ = floorJson.points[wall.end];
  17472. var line2 = [point1_, point2_];
  17473. intersecPoint = math$2.isLineIntersect(line1, line2);
  17474. if (intersecPoint) {
  17475. if (math$2.closeTo(intersecPoint.x, point1.x, 0.01) && math$2.closeTo(intersecPoint.y, point1.y, 0.01) || math$2.closeTo(intersecPoint.x, point2.x, 0.01) && math$2.closeTo(intersecPoint.y, point2.y, 0.01)) {
  17476. //console.log('a',point1_.vectorId, point2_.vectorId)
  17477. return; //点在线上,不算, 相当于atWall
  17478. } else return intersecPoint;
  17479. }
  17480. });
  17481. return !!intersectLine;
  17482. } //注:如果有两条线看起来相交,但其实没有共用交点;或线重叠了一部分。这样很容易识别为true,导致ruler不显示。如果要根据点是否在线上来排除,要计算getFootPoint,太复杂了。所以需要人为把cad调整规范
  17483. /*
  17484. !假定:
  17485. 1 每个漫游点只能看到一个point的一组边,且这两条边相邻。
  17486. 可推断:
  17487. 1 pano的可见group可以提前得到,因为和视角无关,只和位置有关
  17488. */
  17489. }, {
  17490. key: "ifPanoSeePoints",
  17491. value: function ifPanoSeePoints(pano) {
  17492. var _this3 = this;
  17493. //差不多每个pano用时0.5-2ms(在无console时)。很大的场景可能达到100ms, 还好连续漫游时只要加载不停顿就不会触发计算
  17494. common$1.timeMeasuring.addTimeMark('ifPanoSeePoints', 'start');
  17495. var panoVideoFilter = pano.getVideoFilter(); //视频漫游点角度范围内隐藏ruler
  17496. pano.visibleRulerInfos = [];
  17497. var panoPos2d = this.getPos2dFrom3d(pano.position);
  17498. var floor = this.cad.floors[pano.floorIndex];
  17499. if (!floor) {
  17500. if (!player$m.model.floors.index[pano.floorIndex] && player$m.model.floors.length == 1) {
  17501. floor = player$m.model.floors.list[0];
  17502. } else {
  17503. console.error('ifPanoSeePoints 没找到楼层');
  17504. return;
  17505. }
  17506. }
  17507. var bottom = floor.bottom;
  17508. var r1 = 1 / (2 * Math.sin(THREE.MathUtils.degToRad(5))); //5是最小可见deg的一半。假设只有一个horizon且和panoToPoint垂直
  17509. var minRad = THREE.MathUtils.degToRad(5);
  17510. var _loop = function _loop(id) {
  17511. var point = floor.points[id];
  17512. var horizons = point.pointRulerInfo.horizons; //angle已经从小到大排序
  17513. var panoAngle = new THREE.Vector2().subVectors(panoPos2d, point).angle(); //类同horizons求角度,用来排序
  17514. var neibourHorizons = []; //要挑选的在当前pano能见的该point的边
  17515. if (horizons.length > 2) {
  17516. //选择两条在pano两边最近的线
  17517. var h1 = horizons.find(function (e) {
  17518. return e.angle > panoAngle;
  17519. });
  17520. if (h1) {
  17521. var h1Index = horizons.indexOf(h1);
  17522. if (h1Index == 0) {
  17523. //pano在第一个之前
  17524. neibourHorizons = [h1, horizons[horizons.length - 1]]; //选择第一个和最后一个
  17525. } else {
  17526. neibourHorizons = [horizons[h1Index - 1], h1]; //选择h1和它前面那个
  17527. }
  17528. } else {
  17529. //在最后一个之后
  17530. neibourHorizons = [horizons[0], horizons[horizons.length - 1]]; //也是选择第一个和最后一个
  17531. } //选完后依旧是从小到大
  17532. } else {
  17533. neibourHorizons = horizons;
  17534. }
  17535. if (panoPos2d.distanceTo(point) > neibourHorizons.reduce(function (w, c) {
  17536. return w + c.ruler.length;
  17537. }, 0) * r1) {
  17538. //console.log('排除'/* , point.vectorId, pano.id */); //提前排除一些距离远的,基本看不到。但可能误伤
  17539. return "continue";
  17540. }
  17541. var mid = _this3.getPos3dFrom2d(point, bottom);
  17542. if (panoVideoFilter && panoVideoFilter(mid)) {
  17543. //遮住pano视频了
  17544. addLabel$2 && console.log('点在视频区域内', point);
  17545. return "continue";
  17546. }
  17547. /* if(this.isShelter(floor, point, panoPos2d ) ){//墙角容易遮挡,不算了(尤其是特意编辑好的户型里)
  17548. addLabel && console.log('isShelter', id, pano.id)
  17549. continue
  17550. } */
  17551. var info = [];
  17552. neibourHorizons.forEach(function (r, i) {
  17553. info[i] = {};
  17554. r.anotherPoint2d = floor.points[r.ruler.pointIds.find(function (pid) {
  17555. return pid != id;
  17556. })];
  17557. r.anotherPoint = _this3.getPos3dFrom2d(r.anotherPoint2d, bottom);
  17558. var mid2 = new THREE.Vector2().addVectors(r.anotherPoint2d, point).multiplyScalar(0.5); //用中点而不是端点是因为端点容易被遮住,如点靠在别的线上,或仅被墙角遮住一点点
  17559. if (_this3.isShelter(floor, mid2,
  17560. /* r.anotherPoint2d, */
  17561. panoPos2d)) {
  17562. addLabel$2 && console.log('isShelter线段中点被遮挡', r.ruler.pointIds, pano.id);
  17563. info[i].lineShelter = true;
  17564. return;
  17565. }
  17566. if (panoVideoFilter && panoVideoFilter(r.anotherPoint)) {
  17567. //点在视频区域内
  17568. addLabel$2 && console.log('端点在视频区域内', r);
  17569. info[i].coverVideo = true;
  17570. return;
  17571. }
  17572. if (panoVideoFilter && pano.getVideoFilter('across').apply(void 0, _toConsumableArray(r.ruler.points))) {
  17573. //线横跨视频区域
  17574. addLabel$2 && console.log('线横跨视频区域', r);
  17575. info[i].coverVideo = true;
  17576. return;
  17577. }
  17578. info[i].panoToSidePoint = new THREE.Vector3().subVectors(r.anotherPoint, pano.position).setY(0); //端点方向
  17579. info[i].panoToSidePoint.normalize();
  17580. });
  17581. neibourHorizons = neibourHorizons.filter(function (r, i) {
  17582. return !info[i].coverVideo && !info[i].lineShelter;
  17583. });
  17584. if (neibourHorizons.length == 0) return "continue";
  17585. info = info.filter(function (r, i) {
  17586. return !r.coverVideo && !r.lineShelter;
  17587. });
  17588. panoToPoint = new THREE.Vector3().subVectors(mid, pano.position).setY(0); //方向
  17589. var disSquaredToPano = panoToPoint.lengthSq();
  17590. panoToPoint.normalize();
  17591. var backSide = void 0,
  17592. coverRad = void 0,
  17593. midVec = void 0,
  17594. sidePanoVec1 = void 0,
  17595. sidePanoVec2 = void 0; //pano到两端的向量
  17596. if (neibourHorizons.length == 2) {
  17597. ruler1Vec = new THREE.Vector3().subVectors(mid, neibourHorizons[0].anotherPoint).setY(0);
  17598. ruler2Vec = new THREE.Vector3().subVectors(mid, neibourHorizons[1].anotherPoint).setY(0);
  17599. panoToPoint.clone().cross(ruler1Vec).y;
  17600. panoToPoint.clone().cross(ruler2Vec).y;
  17601. /*backSide = axis1 * axis2 > 0
  17602. if(axis1 * axis2 > 0){//必须一个顺时针一个逆时针才能两个墙壁都看到 (但是这样遇到柱子经常只能看到远的那边)//已计算遮挡这段不需要了
  17603. continue;
  17604. }
  17605. if(axis1>0){
  17606. neibourHorizons = [neibourHorizons[1], neibourHorizons[0] ]//调换顺序,使第一个在左边,第二个在右边
  17607. } */
  17608. //已知:0的angle小于1的angle,所以当pano在两个angle之间时就是正常的0为左1为右;但若pano在包含角度为0的这边就要反一下
  17609. if (panoAngle >= 0 && panoAngle < neibourHorizons[0].angle || panoAngle > neibourHorizons[1].angle && panoAngle < Math.PI * 2) {
  17610. neibourHorizons = [neibourHorizons[1], neibourHorizons[0]]; //调换顺序,使第一个在左边,第二个在右边
  17611. }
  17612. sidePanoVec1 = info[0].panoToSidePoint;
  17613. sidePanoVec2 = info[1].panoToSidePoint;
  17614. } else {
  17615. sidePanoVec1 = info[0].panoToSidePoint;
  17616. sidePanoVec2 = panoToPoint;
  17617. } //计算覆盖角度
  17618. midVec = new THREE.Vector3().addVectors(sidePanoVec1, sidePanoVec2).normalize(); //到两端方向的中间方向
  17619. coverRad = Math.acos(sidePanoVec1.dot(sidePanoVec2)); //在界面上覆盖的角度
  17620. if (panoToPoint.dot(midVec) < 0) {
  17621. //中心方向和panoToPoint夹角大于90度,需要反向
  17622. midVec.negate();
  17623. coverRad = 2 * Math.PI - coverRad;
  17624. }
  17625. if (coverRad < minRad) {
  17626. addLabel$2 && console.log('coverRad过小', id, pano.id, coverRad.toFixed(3));
  17627. return "continue"; //在界面上覆盖的角度过小
  17628. }
  17629. pano.visibleRulerInfos.push({
  17630. pId: point.vectorId,
  17631. point,
  17632. neibourHorizons,
  17633. coverRad,
  17634. panoToPoint,
  17635. disSquaredToPano,
  17636. backSide,
  17637. midVec
  17638. });
  17639. };
  17640. for (var id in floor.points) {
  17641. var panoToPoint;
  17642. var ruler1Vec;
  17643. var ruler2Vec;
  17644. var _ret = _loop(id);
  17645. if (_ret === "continue") continue;
  17646. }
  17647. common$1.timeMeasuring.addTimeMark('ifPanoSeePoints', 'end', true);
  17648. }
  17649. }, {
  17650. key: "updateRulersVisi",
  17651. value: function updateRulersVisi() {
  17652. this.lastShowRulers && this.lastShowRulers.forEach(function (ruler) {
  17653. ruler.state = 'unable';
  17654. });
  17655. var pano = player$m.currentPano;
  17656. this.updateList = this.lastShowRulers || []; //player.cornerRulers
  17657. if (this.showRulers && !player$m.flying && player$m.mode == 'panorama' && pano.isAligned() && !(settings$3.vrEnabled && settings$3.vrSplitScreen)) {
  17658. if (!pano.visibleRulerInfos) {
  17659. this.ifPanoSeePoints(pano);
  17660. }
  17661. var playerDir = player$m.getDirection().setY(0).normalize();
  17662. player$m.position;
  17663. var playerPos2d = this.getPos2dFrom3d(player$m.position);
  17664. var hfov = cameraLight.getHFOVForCamera(player$m.cameraControls.activeControl.camera, null, null, true);
  17665. var results = common$1.sortByScore(pano.visibleRulerInfos, [], [function (group) {
  17666. //离相机方向角度越小越好, ruler角度跨越越大越好
  17667. var shiftRad = Math.acos(group.midVec.dot(playerDir)); //ruler中心偏移屏幕(相机)水平中心方向的角度
  17668. //计算在屏幕中(水平)所占的fov, 它由镜头方向左侧和右侧部分组成, 假设镜头相对标尺中心偏左边(实际偏哪边结果都一样)
  17669. var leftRad = Math.min(group.coverRad / 2 + shiftRad, hfov / 2);
  17670. var righRad = Math.min(group.coverRad / 2 - shiftRad, hfov / 2);
  17671. var v = leftRad + righRad; //由于有的墙角很小,比不上旁边墙所占的fov,但focus它的时候还是希望显示它,所以加一点奖励
  17672. var v2 = (Math.PI - shiftRad) * 0.5;
  17673. var d = 5 + group.disSquaredToPano / 30;
  17674. var a = Math.pow(1 + v + v2, 3) * 3; //(+1是因为底数要大于1 . 另外所有参数都要是正数)
  17675. var w = a / d; //if(group.backSide) w = Math.min(w-2, w *= 0.8)
  17676. group.logMsg = "v ".concat(v, ", v2 ").concat(v2, ", v\u590D\u5408").concat(a, ", dis\u590D\u5408 ").concat(d, ", ");
  17677. return w;
  17678. }]);
  17679. addLabel$2 && console.log(results);
  17680. if (results[0]) {
  17681. {
  17682. //矫正高度,因模型崎岖不平,之前使用的最低点一般都低于真实值
  17683. results[0].item.neibourHorizons.forEach(function (e) {
  17684. return e.ruler.points.forEach(function (p) {
  17685. return p.y = pano.floorPosition.y;
  17686. });
  17687. });
  17688. results[0].item.point.pointRulerInfo.verti.points[0].y = pano.floorPosition.y;
  17689. results[0].item.point.pointRulerInfo.verti.updateText(); //这样房间高度会一直变会不会很奇怪?虽然可以计算所有相同neibourHorizon的pano的低高中位数,但是因为是走一个算一个所以也在变。
  17690. }
  17691. var visiRulers = results[0].item.neibourHorizons.map(function (e) {
  17692. return e.ruler;
  17693. }).concat(results[0].item.point.pointRulerInfo.verti);
  17694. visiRulers.forEach(function (ruler) {
  17695. ruler.dir = null, ruler.state = 'active';
  17696. });
  17697. this.lastShowRulers = visiRulers;
  17698. this.updateList = common$1.getUnionSet(this.updateList, visiRulers); //有些字靠的近容易打架。 故左边的朝左,右边的朝右
  17699. if (results[0].item.neibourHorizons.length == 2) {
  17700. var dis = playerPos2d.distanceTo(results[0].item.point);
  17701. var left = results[0].item.neibourHorizons[0].ruler;
  17702. var right = results[0].item.neibourHorizons[1].ruler;
  17703. if (left.length < dis / 2) left.dir = 'left';
  17704. if (right.length < dis / 2) right.dir = 'right';
  17705. }
  17706. }
  17707. } else this.lastShowRulers = [];
  17708. this.updateList.forEach(function (ruler) {
  17709. ruler.update();
  17710. });
  17711. }
  17712. }]);
  17713. return WallManager;
  17714. }(); // const wallManager = new WallManager()
  17715. 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); }; }
  17716. 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; } }
  17717. /*
  17718. z
  17719. |
  17720. |
  17721. |
  17722. |
  17723. x <-------| 中心为点云position加boudingbox中心
  17724. /
  17725. /
  17726. y
  17727. */
  17728. var lineLen = 3,
  17729. stemLen = 1.5,
  17730. arrowLen = 0.5,
  17731. lineDisToStem = 0.5;
  17732. var Axis = /*#__PURE__*/function (_THREE$Object3D) {
  17733. _inherits(Axis, _THREE$Object3D);
  17734. var _super = _createSuper$1B(Axis);
  17735. // 坐标轴
  17736. function Axis(app) {
  17737. var _this;
  17738. _classCallCheck(this, Axis);
  17739. _this = _super.call(this);
  17740. _this.app = app;
  17741. _this.getArrow();
  17742. _this.createArrows();
  17743. return _this;
  17744. }
  17745. _createClass(Axis, [{
  17746. key: "getArrow",
  17747. value: function getArrow() {
  17748. var arrowGroup = new THREE.Object3D();
  17749. var line = LineDraw.createLine([new THREE.Vector3(), new THREE.Vector3(0, 0, lineLen)]);
  17750. var stem = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.1, stemLen));
  17751. stem.position.set(0, 0, lineLen + lineDisToStem + stemLen / 2);
  17752. 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
  17753. arrow.position.set(0, 0, lineLen + lineDisToStem + stemLen + arrowLen / 2);
  17754. arrow.rotation.set(Math.PI / 2, 0, 0);
  17755. arrowGroup.add(stem);
  17756. arrowGroup.add(line);
  17757. arrowGroup.add(arrow);
  17758. this.arrowGroup = arrowGroup;
  17759. }
  17760. }, {
  17761. key: "createArrows",
  17762. value: function createArrows() {
  17763. var _this2 = this;
  17764. new THREE.MeshBasicMaterial({
  17765. color: '#00d7df',
  17766. side: 2,
  17767. transparent: true,
  17768. opacity: 0.8,
  17769. depthWrite: false
  17770. });
  17771. var colors = {
  17772. x: '#ea3f3f',
  17773. y: '#86c215',
  17774. z: '#3396f8'
  17775. };
  17776. ['x', 'y', 'z'].forEach(function (axisText) {
  17777. var color = new THREE.Color().set(colors[axisText]);
  17778. var group = _this2.arrowGroup.clone();
  17779. group.children.forEach(function (e) {
  17780. e.material = e.material.clone();
  17781. /* e.material.opacity = opacity
  17782. e.material.transparent = true */
  17783. e.material.color.copy(color);
  17784. });
  17785. var label = _this2.createLabel(axisText, color);
  17786. label.position.set(0, 0, (lineLen + stemLen + arrowLen + lineDisToStem + 0.5) * 1.05);
  17787. group.add(label);
  17788. var meter = _this2.createLabel('1m', color, 20, 0.4);
  17789. meter.position.set(0, 0, 1);
  17790. group.add(meter);
  17791. if (axisText == 'y') {
  17792. group.rotation.x = -Math.PI / 2;
  17793. } else if (axisText == 'x') {
  17794. group.rotation.y = Math.PI / 2;
  17795. }
  17796. _this2.add(group);
  17797. });
  17798. }
  17799. }, {
  17800. key: "createLabel",
  17801. value: function createLabel(text, color) {
  17802. var fontsize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 120;
  17803. var scale = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1.2;
  17804. var label = new TextSprite({
  17805. //无法解决 因其祖先有设定quaternion, 无法对着镜头
  17806. backgroundColor: {
  17807. r: 0,
  17808. g: 0,
  17809. b: 0,
  17810. a: 0
  17811. },
  17812. textColor: {
  17813. r: color.r * 255,
  17814. g: color.g * 255,
  17815. b: color.b * 255,
  17816. a: 1
  17817. },
  17818. fontsize,
  17819. //useDepth : true ,
  17820. renderOrder: 5,
  17821. // pickOrder:5,
  17822. player: this.app.core.get('Player'),
  17823. text,
  17824. name: 'axis'
  17825. });
  17826. label.scale.set(scale, scale, scale);
  17827. return label;
  17828. }
  17829. }]);
  17830. return Axis;
  17831. }(THREE.Object3D);
  17832. var _class;
  17833. 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); }; }
  17834. 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; } }
  17835. var highMapAddColor = browser$1.urlHasValue('highMapColor');
  17836. var Model = Emitter(_class = /*#__PURE__*/function (_THREE$Object3D) {
  17837. _inherits(Model, _THREE$Object3D);
  17838. var _super = _createSuper$1A(Model);
  17839. function Model(app) {
  17840. var _this;
  17841. _classCallCheck(this, Model);
  17842. _this = _super.call(this);
  17843. _this.setupCustomProperties = function () {
  17844. var e = settings$3.modelAlpha;
  17845. Object.defineProperty(this, 'alpha', {
  17846. get: function get() {
  17847. return e;
  17848. },
  17849. set: function set(t) {
  17850. e = t; //console.log('modelalpha', t)
  17851. this.chunks.forEach(function (chunk) {
  17852. if (chunk.material && chunk.material.uniforms.modelAlpha) {
  17853. chunk.material.uniforms.modelAlpha.value = e; //修改一下defines,为了在不需要map时不加载map。 by xzw
  17854. if (e) {
  17855. if (!('useModelMap' in chunk.material.defines)) {
  17856. chunk.material.defines.useModelMap = '';
  17857. chunk.material.needsUpdate = true;
  17858. }
  17859. } else {
  17860. if ('useModelMap' in chunk.material.defines) {
  17861. delete chunk.material.defines.useModelMap;
  17862. chunk.material.needsUpdate = true; //chunk.material.uniforms.map.value.dispose() //防止崩溃(但是因为这样飞出要等待时间所以被去掉了)
  17863. }
  17864. }
  17865. }
  17866. });
  17867. }
  17868. });
  17869. };
  17870. _this.build = function () {
  17871. var _this2 = this;
  17872. this.currentFloor = this.floors.last();
  17873. this.floors.build();
  17874. this.colliders = this.floors.reduce(function (array, floor) {
  17875. return array.concat(floor.collider.children);
  17876. }, []);
  17877. this.panos.forEach(function (pano) {
  17878. pano.build1(), pano.on('enter', function () {
  17879. pano.floor !== _this2.currentFloor && _this2.setFloor(pano.floor);
  17880. });
  17881. });
  17882. this.panos.forEach(function (pano) {
  17883. pano.build2();
  17884. });
  17885. this.floors.forEach(function (floor) {
  17886. this.boundingBox.union(floor.boundingBox);
  17887. }.bind(this));
  17888. var size = new THREE.Vector3();
  17889. var center = new THREE.Vector3();
  17890. this.boundingBox.getSize(size);
  17891. this.boundingBox.getCenter(center);
  17892. this.size = size;
  17893. this.center = center;
  17894. this.floors.forEach(function (floor) {
  17895. logger$1.info('Floor ' + floor + ': ' + floor.children.length + ' chunks, ' + floor.panos.length + ' panos.');
  17896. }.bind(this)); //this.panos.populate_path_graph();
  17897. this.skybox = new BoundingTextureSkybox(this.boundingBox);
  17898. this.skybox.matrixWorldNeedsUpdate = !0;
  17899. this.add(this.skybox);
  17900. {
  17901. this.skyBoxTight = new BoundingTextureSkybox(this.boundingBox, 2);
  17902. /* this.skyBoxTight = new THREE.Mesh(new THREE.BoxGeometry(size.x, size.y, size.z))
  17903. this.skyBoxTight.computeBoundingBox() //需要重新计算对称的bounding, 在获取鼠标交点时需要。否则热点加不上
  17904. this.skyBoxTight.position.copy(center) */
  17905. }
  17906. logger$1.debug('Done building model');
  17907. if (Panorama.raycastsDone > 0) {
  17908. logger$1.warn('raycasts: ' + Panorama.raycastsDone);
  17909. logger$1.warn('raycasts skipped: ' + Panorama.raycastsSkipped);
  17910. } //创建floorLogo
  17911. this.floorLogos.createFloorLogo();
  17912. this.add(this.floorLogos.firstLogo);
  17913. this.add(this.floorLogos.secondLogo);
  17914. if (browser$1.urlHasValue('axis')) {
  17915. this.add(new Axis(this.$app));
  17916. }
  17917. setTimeout(function () {
  17918. _this2.floorplanCadImg.init(_this2);
  17919. _this2.wallManager.init(_this2);
  17920. }, 100);
  17921. this.addHighMapCube();
  17922. var videoInfo = this.$app.core.get('PanoVideoRenderer').videosInfo;
  17923. if (videoInfo) {
  17924. var parameters = videoInfo.parameters;
  17925. this.updateVideoRenderParameters(parameters);
  17926. }
  17927. this.builded = true; //xzw
  17928. this.dispatchEvent({
  17929. type: 'builded'
  17930. });
  17931. this.texSizeBlock = this.chunks.reduce(function (w, e) {
  17932. var tex = e.material.uniforms.map.value;
  17933. return w + Math.pow(tex.image.width / 512, 2);
  17934. }, 0).toFixed(1); //注:初始时还没有_listeners
  17935. if (this.$app.config.mobile && browser$1.urlHasValue('vlog')) {
  17936. setInterval(function () {
  17937. var count = _this2.getDrawedTexCount().toFixed(1);
  17938. var title = document.querySelector('#app .information .title span');
  17939. if (title) {
  17940. title.innerText = count + '|' + _this2.$app.core.get('Player').lowTile;
  17941. }
  17942. }, 1000);
  17943. var right = document.querySelector('#app .information .right');
  17944. if (right) {
  17945. right.addEventListener('click', function () {
  17946. window.logEnable = !window.logEnable;
  17947. });
  17948. }
  17949. }
  17950. if (this.texSizeBlock > 40) {
  17951. setTimeout(function () {
  17952. //防止大的场景在首次飞出时卡顿一下,提前渲染 。控制未dispose的贴图块数
  17953. var player = _this2.$app.core.get('Player'); //虽然渲染的和没渲染的都有一个期望值,但是因为它们必须满足 和大于总数,所以不能随意设置。优先考虑满足飞出不卡顿,那么只考虑没渲染即可。在保证当前未渲染小于某个值的情况下向总数的一半靠拢。
  17954. var maxHasnt = _this2.$app.config.mobile ? 100 : 60; //最大能接受的飞出时不停顿的数字(大的场景稍微等待半秒、pc可以加载多点尽量不等待)
  17955. var hopeHas = _this2.texSizeBlock - Math.min(_this2.texSizeBlock * 0.5, maxHasnt); //console.log('hopeHas', hopeHas)
  17956. var lastChunkToRender,
  17957. historyRen = [];
  17958. var update = {
  17959. update: function update() {
  17960. if (player.mode == 'panorama' && !player.flying && !player.lastFrameChanged) {
  17961. if (lastChunkToRender) {
  17962. delete lastChunkToRender.material.defines.useModelMap;
  17963. lastChunkToRender.material.needsUpdate = true;
  17964. lastChunkToRender = null;
  17965. }
  17966. var c = _this2.getDrawedTexCount();
  17967. var chunk;
  17968. if (c > hopeHas) {
  17969. chunk = _this2.chunks.find(function (e) {
  17970. var tex = e.material.uniforms.map.value;
  17971. return tex && tex._listeners && tex._listeners.dispose && tex._listeners.dispose.length > 0;
  17972. });
  17973. if (chunk) {
  17974. chunk.material.uniforms.map.value.dispose(); //console.log('dispose', c)
  17975. }
  17976. } else if (c < hopeHas) {
  17977. var r = common$1.sortByScore(_this2.chunks, [function (e) {
  17978. if (historyRen.includes(e)) return; //historyRen用于记录这一次尝试渲染的chunk,万一哪个不成功就不要重复渲染
  17979. var tex = e.material.uniforms.map.value;
  17980. return tex && !(tex._listeners && tex._listeners.dispose && tex._listeners.dispose.length > 0) && Math.pow(tex.image.width / 512, 2) + c <= hopeHas;
  17981. }], [function (e) {
  17982. var s = 0;
  17983. if (e.floor == _this2.currentFloor) {
  17984. s += 1;
  17985. }
  17986. if (math$2.isInsideFrustum(e.geometry.boundingBox, player.camera)) {
  17987. s += 1;
  17988. }
  17989. return s;
  17990. }]);
  17991. if (r.length) {
  17992. chunk = r[0].item;
  17993. chunk.material.defines.useModelMap = ''; //暂时放开,使渲染
  17994. chunk.material.needsUpdate = true;
  17995. lastChunkToRender = chunk;
  17996. historyRen.push(chunk); //console.log('render', c, chunk.tileId ? chunk.tileId.split('3dtiles/')[1] : chunk.name)
  17997. }
  17998. }
  17999. } else {
  18000. historyRen.length = 0; //清空
  18001. }
  18002. }
  18003. };
  18004. _this2.$app.core.get('SceneRenderer').addComponent(update);
  18005. }, 1000);
  18006. }
  18007. return Promise.resolve(this);
  18008. };
  18009. _this.toggleAlpha = function () {
  18010. this.alpha < 1 ? this.alpha = 1 : this.alpha = 0;
  18011. };
  18012. _this.waitForLoad = function (pano, isLoadedCallbackFunc) {
  18013. if (!isLoadedCallbackFunc()) {
  18014. this.waitQueue.push({
  18015. object: pano,
  18016. isLoadedCallback: isLoadedCallbackFunc
  18017. }), 1 === this.waitQueue.length && this.emit('waiting');
  18018. }
  18019. };
  18020. _this.hide = function () {
  18021. this.floors.hide();
  18022. };
  18023. _this.show = function () {
  18024. this.floors.show();
  18025. };
  18026. _this.floorNames = function () {
  18027. return this.floors.names();
  18028. };
  18029. _this.setFloor = function (floor, mode) {
  18030. this.allFloorsVisible && this.emit('allfloors.toggled', !1, this.currentFloor);
  18031. this.allFloorsVisible = !1;
  18032. this._setFloor(floor, mode);
  18033. };
  18034. _this.toggleAllFloors = function (e) {
  18035. this.allFloorsVisible = void 0 !== e ? e : !this.allFloorsVisible;
  18036. this.emit('allfloors.toggled', this.allFloorsVisible, this.currentFloor);
  18037. this._setFloor(this.currentFloor);
  18038. };
  18039. _this._setFloor = function (floor, mode) {
  18040. var _this3 = this;
  18041. mode = mode || this.mode;
  18042. var old = this.currentFloor;
  18043. this.currentFloor = floor;
  18044. this.$app.core.get('Player').mode;
  18045. if (mode === Viewmode$1.PANORAMA) {
  18046. this.show();
  18047. } else if ( // mode === Viewmode.FLOORPLAN ||
  18048. // (mode === Viewmode.DOLLHOUSE && lastMode == mode) // UI在setMode时已让DOLLHOUSE楼层全显示,所以这里不做更改
  18049. mode === Viewmode$1.FLOORPLAN || mode === Viewmode$1.DOLLHOUSE) {
  18050. this.floors.list.forEach(function (floor, index) {
  18051. var flag = floor === this.currentFloor || this.allFloorsVisible;
  18052. floor.toggle(flag);
  18053. }.bind(this));
  18054. }
  18055. this.emit('floor.changed', this.currentFloor, mode, old); // 楼层显隐tile需要改变,要更新一下
  18056. setTimeout(function () {
  18057. return _this3.$app.core.get('SceneRenderer').update3dTiles({
  18058. force: true
  18059. });
  18060. }, 10);
  18061. };
  18062. _this.toggleExplode = function () {
  18063. this.floors.toggleExplodeHorizontal();
  18064. };
  18065. _this.toggleExplodeUp = function () {
  18066. this.floors.toggleExplodeVertical();
  18067. };
  18068. _this.nextFloor = function (nextfloor) {
  18069. return this.floors.nextFloor(this.currentFloor, nextfloor);
  18070. };
  18071. _this.addFloor = function (floor) {
  18072. this.floors.add(floor);
  18073. };
  18074. _this.getFloorAtPoint = function (position) {
  18075. return this.floors.getFloorAtPoint(position);
  18076. };
  18077. _this.addTile = function (floorIndex, tileContent) {
  18078. this.floors.getOrMakeFloor(floorIndex).addTile(tileContent);
  18079. };
  18080. _this.removeTile = function (tileContent) {
  18081. this.floors.getOrMakeFloor(tileContent.floorIndex).removeTile(tileContent);
  18082. };
  18083. _this.addChunk = function (floorIndex, chunk) {
  18084. this.floors.getOrMakeFloor(floorIndex).addChunk(chunk); // this.chunks.push(chunk)
  18085. };
  18086. _this.setMode = function (mode) {
  18087. var _this4 = this;
  18088. if (!this.supportedModes[mode]) {
  18089. throw new BasicException('Mode not supported for this model: ' + mode);
  18090. }
  18091. this.mode = mode;
  18092. this.chunks.forEach(function (chunk) {
  18093. chunk.setMode(mode, _this4.player.modeTran); // 根据mode选择materialInside/materialOutside以及单双面显隐
  18094. });
  18095. };
  18096. _this.updateProjectedPanos = function (pano) {
  18097. //xzw 改 for 无缝过渡
  18098. if (this.projectedPano0 && this.projectedPano1 && (pano == this.projectedPano0 || pano == this.projectedPano1)) {
  18099. this.setProjectedPanos(this.projectedPano0, this.projectedPano1, !1);
  18100. }
  18101. };
  18102. _this.setProjectedPanos = function (pano0, pano1, restoreFlag) {
  18103. void 0 !== restoreFlag && null !== restoreFlag || (restoreFlag = !0);
  18104. restoreFlag = !!restoreFlag;
  18105. this.projectedPano0 = pano0;
  18106. this.projectedPano1 = pano1;
  18107. this.skybox.material.setProjectedPanos(pano0, pano1, restoreFlag);
  18108. this.chunks.forEach(function (chunk) {
  18109. chunk.materialInside.setProjectedPanos(pano0, pano1, restoreFlag);
  18110. });
  18111. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  18112. tile.material.setProjectedPanos(pano0, pano1, restoreFlag);
  18113. }); //console.log('setProjectedPanos')
  18114. };
  18115. _this.setSide = function (side) {
  18116. this.floors.forEach(function (floor) {
  18117. floor.collider.material.side = side;
  18118. });
  18119. };
  18120. _this.fadePanoMarkers = function (opacity, dur) {
  18121. var _this5 = this;
  18122. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  18123. mode = _ref.mode,
  18124. hideVideoFlag = _ref.hideVideoFlag;
  18125. if (!this.player) return;
  18126. var currentPano = this.player.currentPano;
  18127. if (settings$3.vrEnabled && window.VRScreenType != 'portrait') {
  18128. this.updateVrMarker();
  18129. return;
  18130. } //console.log("fadePanoMarkers", opacity,dur,o.vrCustomer)
  18131. // // customer时保持marker隐藏
  18132. // let role = location.search.match(new RegExp('[\\?,&]role=(.*?)[&,$]'))
  18133. // if (role && role[1] == 'customer') {
  18134. // // zeg 这部分如无必要只在customer时用,否则影响正常player的lock
  18135. // if (o.vrCustomer != void 0) {
  18136. // //vr被带看的走动时不显示marker
  18137. // this.markerUnable = !!o.vrCustomer
  18138. // }
  18139. // if (this.markerUnable && o.vrCustomer == void 0) {
  18140. // return
  18141. // }
  18142. // return
  18143. // }
  18144. var canShowVideoMarker = this.$app.core.get('PanoVideoRenderer').canShowMarker();
  18145. var hideWhenFlyOut = function hideWhenFlyOut() {
  18146. var shows = [],
  18147. hides = [];
  18148. _this5.player.model.panos.forEach(function (pano) {
  18149. if (pano.hasVideo || pano.panoVideo) {
  18150. if (hideVideoFlag || !pano.hasNeighbor() || pano.floor.hidden || !canShowVideoMarker) {
  18151. hides.push(pano);
  18152. } else {
  18153. //console.log('show',pano.id)
  18154. shows.push(pano);
  18155. }
  18156. } else hides.push(pano);
  18157. });
  18158. _this5.panos.fadeMarkerOpacity(1, dur, [{
  18159. toOp: 0,
  18160. member: hides
  18161. }, {
  18162. toOp: settings$3.panorama.markerOpacity,
  18163. member: shows
  18164. }]);
  18165. };
  18166. if (opacity == 0) {
  18167. hideWhenFlyOut();
  18168. } else {
  18169. if ((mode || this.player.mode) == Viewmode$1.PANORAMA && currentPano) {
  18170. var shows = [],
  18171. //shows2 = [],
  18172. hides = [],
  18173. panoVideoFilter = currentPano.getVideoFilter(); //视频漫游点角度范围内隐藏marker
  18174. this.player.model.panos.forEach(function (pano) {
  18175. //是邻近点就显示否则隐藏
  18176. if ((!panoVideoFilter || !panoVideoFilter(pano.position)) && currentPano.seeMarkers.indexOf(pano.id) > -1) {
  18177. /* if (pano.hasVideo || pano.panoVideo) {//videomarker已经改为普通的,所以删除
  18178. // if (objects.panoVideoRenderer.ifEnable())
  18179. if (this.$app.core.get('PanoVideoRenderer').ifEnable()) pano.marker.visible = true
  18180. } else { */
  18181. shows.push(pano); //}
  18182. } else {
  18183. /* if (pano.hasVideo || pano.panoVideo) pano.marker.visible = false
  18184. else */
  18185. hides.push(pano);
  18186. }
  18187. });
  18188. this.panos.fadeMarkerOpacity(opacity, dur, [{
  18189. toOp: settings$3.panorama.markerOpacity,
  18190. member: shows
  18191. }, {
  18192. toOp: 0,
  18193. member: hides
  18194. }]);
  18195. } else if (this.player.modeTran.split('-')[1] != 'panorama') {
  18196. //飞出后marker隐藏
  18197. hideWhenFlyOut();
  18198. }
  18199. }
  18200. };
  18201. _this.outsideAllowed = function () {
  18202. return this.supportedModes[Viewmode$1.DOLLHOUSE] && this.supportedModes[Viewmode$1.FLOORPLAN];
  18203. };
  18204. _this.getOption = function ($app) {
  18205. return {
  18206. autoload: false,
  18207. floors: true,
  18208. local: false,
  18209. url: $app.config.num,
  18210. urlFiles: 'http://www.4dage.com/BigScene7niu/api/player/models/' + $app.config.num + '/files',
  18211. useVisionModelData: true
  18212. };
  18213. };
  18214. _this.getModelMeta = function ($app) {
  18215. return {
  18216. sid: $app.config.num,
  18217. name: '四维时代',
  18218. status: 'viewable',
  18219. floors: '',
  18220. metainfo: {
  18221. allowed_methods: ['GET', 'OPTIONS', 'HEAD']
  18222. },
  18223. image: 'http://7xo6he.com2.z0.glb.qiniucdn.com/images/images1/07.13.2015_16.22.30.jpg',
  18224. images: [],
  18225. job: {
  18226. uuid: 'dacf7dfa24ae47fab8fcebfe4dc41ab9'
  18227. },
  18228. layers: []
  18229. };
  18230. };
  18231. var options = _this.getOption(app);
  18232. var modelData = _this.getModelMeta(app);
  18233. _this.$app = app;
  18234. _this.sid = modelData.sid;
  18235. _this.data = modelData;
  18236. _this.options = options;
  18237. _this.urls = new ModelUrls(_this.sid, app);
  18238. _this.outdoorPanoLocations = [];
  18239. _this.floors = new FloorCollection(_assertThisInitialized(_this));
  18240. _this.floorsEnabled = void 0 === options.floors || options.floors;
  18241. _this.changingFloor = !1; // this.chunks = []
  18242. _this.panos = new PanoramaCollection(app);
  18243. _this.colliders = [];
  18244. _this.loadPanosPromise = null;
  18245. _this.loadMeshTexturesPromise = null;
  18246. _this.mesh3dTilesLoaded = !1;
  18247. _this.meshTexturesLoaded = !1;
  18248. _this.meshTextures = [];
  18249. _this.tags = new THREE.Object3D(), _this.add(_this.tags), _this.tags.name = 'tags';
  18250. _this.measurements = new THREE.Object3D(), _this.add(_this.measurements), _this.measurements.name = 'measures';
  18251. _this.measureRulers = new THREE.Object3D(), _this.add(_this.measureRulers), _this.measureRulers.name = 'measureRulers' // 双屏添加的老版本测量
  18252. ;
  18253. _this.paths = new THREE.Object3D(), _this.add(_this.paths), _this.paths.name = 'paths';
  18254. _this.supportedModes = {};
  18255. _this.supportedModes[Viewmode$1.PANORAMA] = !0;
  18256. _this.supportedModes[Viewmode$1.DOLLHOUSE] = !modelData.player_options || modelData.player_options.dollhouse && browser$1.valueFromHash('dh', 1);
  18257. _this.supportedModes[Viewmode$1.FLOORPLAN] = !modelData.player_options || modelData.player_options.floor_plan && browser$1.valueFromHash('dh', 1);
  18258. _this.supportedModes[Viewmode$1.TRANSITIONING] = !0;
  18259. _this.supportsTiles = true;
  18260. _this.supportsVR = modelData.is_vr;
  18261. _this.mode = Viewmode$1.DOLLHOUSE;
  18262. _this.size = null;
  18263. _this.center = null;
  18264. _this.boundingBox = new THREE.Box3();
  18265. _this.currentFloor = null;
  18266. _this.allFloorsVisible = !0;
  18267. _this.projectedPano0 = null;
  18268. _this.projectedPano1 = null;
  18269. _this.chunkDisplay = {
  18270. visible: true
  18271. };
  18272. _this.floorsEnabled && modelData.floors && modelData.floors.indexOf(',') !== -1 && modelData.floors.split(',').forEach(function (e, t) {
  18273. this.addFloor(new Floor(this, t, e.trim()));
  18274. }.bind(_assertThisInitialized(_this)));
  18275. _this.waitQueue = [];
  18276. _this.on('load', function (e) {
  18277. 0 !== this.waitQueue.length && (this.waitQueue = this.waitQueue.filter(function (e) {
  18278. return !e.isLoadedCallback();
  18279. }), 0 === this.waitQueue.length && this.emit('waiting-done'));
  18280. }.bind(_assertThisInitialized(_this)));
  18281. _this.setupCustomProperties(); //this.labels = new LabelCollection(this);
  18282. //other:
  18283. _this.vrMarkers = [];
  18284. _this.floorLogos = new FloorLogos(_this.$app);
  18285. _this.floorplanCadImg = new FloorplanCadImg(_this.$app);
  18286. _this.wallManager = new WallManager(_this.$app);
  18287. return _this;
  18288. }
  18289. _createClass(Model, [{
  18290. key: "chunks",
  18291. get: function get() {
  18292. var chunks = [];
  18293. this.floors.forEach(function (floor) {
  18294. return chunks.push.apply(chunks, _toConsumableArray(floor.chunks));
  18295. });
  18296. return chunks;
  18297. }
  18298. }, {
  18299. key: "getDrawedTexCount",
  18300. value: function getDrawedTexCount() {
  18301. return this.chunks.reduce(function (w, e) {
  18302. var tex = e.material.uniforms.map.value;
  18303. if (!tex) return w;
  18304. return w + (tex._listeners && tex._listeners.dispose && tex._listeners.dispose.length > 0 ? Math.pow(tex.image.width / 512, 2) : 0);
  18305. }, 0);
  18306. }
  18307. }, {
  18308. key: "createTranControl",
  18309. value: function createTranControl(player) {
  18310. //初始化控件
  18311. var options = {
  18312. player,
  18313. dontHideWhenFaceCamera: true,
  18314. scaleAxis: ['x', 'y'],
  18315. //隐藏了z轴。虽然参数没用上
  18316. NoScaleZ: true //整体缩放时只缩放xy轴。
  18317. };
  18318. this.transformControls = new TransformControls(player.camera, player.domElement, options);
  18319. this.transformControls.space = 'local';
  18320. this.transformControls.setSize(1.2);
  18321. this.add(this.transformControls);
  18322. this.transformControls.visible = false; //------ for clip
  18323. this.transformTool = new TransformationTool(player);
  18324. this.add(this.transformTool);
  18325. }
  18326. }, {
  18327. key: "updateVideoTexture",
  18328. value: function updateVideoTexture(texture) {
  18329. if (this.skybox) {
  18330. this.skybox.material.uniforms.videoTexture.value = texture;
  18331. }
  18332. this.chunks.forEach(function (item) {
  18333. item.materialInside.uniforms.videoTexture.value = texture;
  18334. });
  18335. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  18336. tile.material.uniforms.videoTexture.value = texture;
  18337. });
  18338. }
  18339. }, {
  18340. key: "suspendVideoRender",
  18341. value: function suspendVideoRender() {
  18342. if (this.skybox) {
  18343. this.skybox.material.uniforms.videoReady.value = 0;
  18344. }
  18345. this.chunks.forEach(function (item) {
  18346. item.materialInside.uniforms.videoReady.value = 0;
  18347. });
  18348. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  18349. tile.material.uniforms.videoReady.value = 0;
  18350. });
  18351. }
  18352. }, {
  18353. key: "resumeVideoRender",
  18354. value: function resumeVideoRender() {
  18355. if (this.skybox) {
  18356. this.skybox.material.uniforms.videoReady.value = 1;
  18357. this.skybox.material.uniforms.progress.value = 1;
  18358. }
  18359. this.chunks.forEach(function (item) {
  18360. item.materialInside.uniforms.videoReady.value = 1;
  18361. item.materialInside.uniforms.progress.value = 1;
  18362. });
  18363. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  18364. tile.material.uniforms.videoReady.value = 1;
  18365. tile.material.uniforms.progress.value = 1;
  18366. });
  18367. }
  18368. /* updateVideoRenderParameters(parameters) {
  18369. this.skybox.material.uniforms.parameters.value.set(
  18370. parameters.inputWidth,
  18371. parameters.inputHeight,
  18372. parameters.outputWidth,
  18373. parameters.outputHeight,
  18374. parameters.focal,
  18375. parameters.pixel,
  18376. parameters.centerX,
  18377. parameters.centerY,
  18378. parameters.translateX,
  18379. parameters.translateY,
  18380. parameters.translateZ,
  18381. 0,
  18382. parameters.lenOffsetX,
  18383. parameters.lenOffsetY,
  18384. parameters.videoWidth,
  18385. parameters.videoHeight
  18386. )
  18387. if (parameters.cameraType == 8) {
  18388. this.skybox.material.defines.HasVideo = 8 //8目
  18389. } else if (parameters.cameraType == 2) {
  18390. this.skybox.material.defines.HasVideo = 2 //2目
  18391. } else if (parameters.cameraType == 3) {
  18392. //转台双目
  18393. this.skybox.material.defines.HasVideo = 3
  18394. }
  18395. this.skybox.material.defines.VideoMapping = parameters.mapping
  18396. this.skybox.material.needsUpdate = true
  18397. this.chunks.forEach(item => {
  18398. item.materialInside.uniforms.parameters.value.set(
  18399. parameters.inputWidth,
  18400. parameters.inputHeight,
  18401. parameters.outputWidth,
  18402. parameters.outputHeight,
  18403. parameters.focal,
  18404. parameters.pixel,
  18405. parameters.centerX,
  18406. parameters.centerY,
  18407. parameters.translateX,
  18408. parameters.translateY,
  18409. parameters.translateZ,
  18410. 0,
  18411. parameters.lenOffsetX,
  18412. parameters.lenOffsetY,
  18413. parameters.videoWidth,
  18414. parameters.videoHeight
  18415. )
  18416. if (parameters.cameraType == 8) {
  18417. item.materialInside.defines.HasVideo = 8 //8目
  18418. } else if (parameters.cameraType == 2) {
  18419. item.materialInside.defines.HasVideo = 2 //2目
  18420. } else if (parameters.cameraType == 3) {
  18421. //转台双目
  18422. this.skybox.material.defines.HasVideo = 3
  18423. }
  18424. item.materialInside.defines.VideoMapping = parameters.mapping
  18425. item.materialInside.needsUpdate = true
  18426. })
  18427. } */
  18428. }, {
  18429. key: "updateVideoRenderParameters",
  18430. value: function updateVideoRenderParameters(parameters) {
  18431. var mats = [this.skybox.material].concat(_toConsumableArray(this.chunks.map(function (e) {
  18432. return e.materialInside;
  18433. })));
  18434. this.highMapCube && this.highMapCube.tiles.forEach(function (tile) {
  18435. mats.push(tile.material);
  18436. });
  18437. mats.forEach(function (material) {
  18438. 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);
  18439. if (parameters.cameraType == 8) {
  18440. material.defines.HasVideo = 8; //8目
  18441. } else if (parameters.cameraType == 2) {
  18442. material.defines.HasVideo = 2; //2目
  18443. } else if (parameters.cameraType == 3) {
  18444. //转台双目
  18445. material.defines.HasVideo = 3;
  18446. }
  18447. material.defines.VideoMapping = parameters.mapping;
  18448. material.needsUpdate = true;
  18449. });
  18450. }
  18451. }, {
  18452. key: "updateVrMarker",
  18453. value: //更新vr的漂浮球位置
  18454. function updateVrMarker(enable) {
  18455. var _this6 = this;
  18456. //enable代表vrEnable
  18457. if (!this.player.currentPano.isAligned()) return; //在全景图里的话会先出来再updateVrMarker
  18458. enable = enable == void 0 ? settings$3.vrEnabled : enable;
  18459. if (enable) {
  18460. for (var i in this.panos.index) {
  18461. var pano = this.panos.index[i];
  18462. if (pano.isAligned()) pano.marker.opacity = 0;
  18463. }
  18464. } else {
  18465. this.fadePanoMarkers(null, null);
  18466. }
  18467. this.vrMarkers.forEach(function (v) {
  18468. var visi = enable && _this6.player.currentPano.id != v.pano.id && !!_this6.player.currentPano.neighbourPanos[v.pano.id]; //!! 是防止undefined
  18469. common$1.updateVisible(v, 'vr', visi);
  18470. });
  18471. }
  18472. }, {
  18473. key: "addHighMapCube",
  18474. value: function addHighMapCube() {
  18475. var _this7 = this;
  18476. //创建8*8的tile cube
  18477. var tileClass = this.$app.core.get('QualityManager').tileClass[0];
  18478. if (tileClass >= 4 && this.$app.core.get('QualityManager').maxRenderTargetSize == 2048) {
  18479. //this.$app.store.getValue('metadata').sceneResolution == 'tiles/4k'
  18480. var geo = new THREE.PlaneGeometry(1, 1, 1, 1);
  18481. var cube = new THREE.Object3D();
  18482. cube.tiles = [];
  18483. for (var cubeIndex = 0; cubeIndex < 6; cubeIndex++) {
  18484. var face = new THREE.Object3D();
  18485. for (var i = 0; i < 8; i++) {
  18486. for (var j = 0; j < 8; j++) {
  18487. var tile = new THREE.Mesh(geo, //new THREE.MeshBasicMaterial({ side: 2, depthTest: false, depthWrite: false }))
  18488. new ModelTextureMaterial({
  18489. side: THREE.DoubleSide,
  18490. depthTest: false,
  18491. //防止chunk比cube近从而被遮 且能不遮住box视频和viewlink等
  18492. transparent: true,
  18493. //遮蔽
  18494. defines: {
  18495. BasePanoMap: '' //普通贴图当做全景图
  18496. }
  18497. }));
  18498. tile.material.uniforms.progress.value = 1;
  18499. tile.material.uniforms.modelAlpha.value = 0;
  18500. tile.position.set(i - 3.5, j - 3.5, -4);
  18501. if (highMapAddColor) {
  18502. tile.material.uniforms.opacity.value = 0.4;
  18503. var colorHue = Math.random();
  18504. tile.material.uniforms.baseColor.value = new THREE.Color().setHSL(colorHue, 0.8, 0.9);
  18505. /* 0.5, 0.95) */
  18506. /* tile.scoreLabel = new TextSprite( {
  18507. backgroundColor: { r: 0, g: 0, b: 0, a: 0 },
  18508. textColor: { r: 0, g: 0, b: 0, a: 1 },
  18509. borderRadius: 15,
  18510. renderOrder: 50, fontsize : 13,
  18511. text: ''
  18512. })
  18513. tile.add(tile.scoreLabel) */
  18514. }
  18515. tile.visible = false;
  18516. tile.tileX = i;
  18517. tile.tileY = j;
  18518. tile.cubeFace = cubeIndex;
  18519. tile.renderOrder = RenderOrder.highTileCube;
  18520. cube.tiles.push(tile);
  18521. face.add(tile);
  18522. }
  18523. }
  18524. switch (cubeIndex) {
  18525. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
  18526. face.rotation.set(0, Math.PI / 2, 0);
  18527. break;
  18528. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
  18529. face.rotation.set(0, -Math.PI / 2, 0);
  18530. break;
  18531. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
  18532. var rot1 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI);
  18533. var rot2 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI / 2);
  18534. face.quaternion.copy(rot1).multiply(rot2);
  18535. break;
  18536. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
  18537. var rot1 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI);
  18538. var rot2 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 2);
  18539. face.quaternion.copy(rot1).multiply(rot2);
  18540. break;
  18541. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
  18542. face.rotation.set(0, Math.PI, 0);
  18543. break;
  18544. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
  18545. face.rotation.set(0, 0, 0);
  18546. }
  18547. face.scale.set(1, -1, 1);
  18548. face.cubeFace = cubeIndex;
  18549. cube.add(face);
  18550. }
  18551. cube.name = 'highMapCube';
  18552. this.highMapCube = cube;
  18553. this.add(cube);
  18554. cube.scale.set(0.21, 0.21, 0.21); //camera.near is 0.1
  18555. this.highMapCube.visible = false;
  18556. this.highMapCube.texLoadedCount = 0;
  18557. this.$app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function (e) {
  18558. if (_this7.highMapCube.visibleTiles) {
  18559. _this7.updateTiles(); //逐步将visibleTiles加载完
  18560. }
  18561. if (_this7.player && _this7.player.lastFrameChanged) {
  18562. //重新获取visibleTiles
  18563. common$1.intervalTool.isWaiting('update4kTiles_' + _this7.$app.resource.num, function () {
  18564. var vectorForward = _this7.player.getDirection();
  18565. _this7.updateTiles(vectorForward);
  18566. }, 500);
  18567. }
  18568. });
  18569. }
  18570. }
  18571. /*
  18572. highMapCube会遮住场景中所有物体, 如果一定要显示的话,只能类似potree中的那样渲染一个深度贴图出来(model无需贴图),然后其他所有物体的shader中都加入一段代码。(貌似本身已经支持了?)
  18573. */
  18574. }, {
  18575. key: "isHighMapLoaded",
  18576. value: function isHighMapLoaded(cubeFace, tileX, tileY) {
  18577. var tile = this.highMapCube.children[cubeFace].children[tileX * 8 + tileY];
  18578. return !!tile.material.uniforms.map.value;
  18579. }
  18580. }, {
  18581. key: "updateTiles",
  18582. value: function updateTiles(direction) {
  18583. var _this8 = this;
  18584. if (!this.highMapCube || !this.highMapCube.visible) return;
  18585. if (this.highMapCube.tiles.filter(function (e) {
  18586. return e.image;
  18587. }).length <= 10) return; //加载的太少了
  18588. //performance.mark('updateTiles-start')
  18589. if (direction) {
  18590. var camera = this.player.cameraControls.cameras.panorama;
  18591. /* let hfov = cameraLight.getHFOVForCamera(camera, null, null, true) / 2
  18592. let vfov = THREE.MathUtils.degToRad(camera.fov) / 2 */
  18593. var frustumMatrix = new THREE.Matrix4();
  18594. frustumMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
  18595. var frustum = new THREE.Frustum();
  18596. frustum.setFromProjectionMatrix(frustumMatrix);
  18597. new THREE.Vector3();
  18598. var list = this.highMapCube.tiles;
  18599. list.forEach(function (e) {
  18600. //屏幕外的不显示
  18601. var a = frustum.intersectsObject(e); //外包围球粗略判断
  18602. if (a) {
  18603. //显示所有在屏幕上有显示的tile
  18604. e.score = 1;
  18605. } else e.score = -100;
  18606. if (e.score == -100) {
  18607. _this8.resetTile(e);
  18608. }
  18609. });
  18610. this.highMapCube.visibleTiles = list.filter(function (e) {
  18611. return e.score > -100;
  18612. }); //list.forEach(e=>e.scoreLabel.setText(e.scores))
  18613. }
  18614. var needRecover = this.highMapCube.visibleTiles.filter(function (e) {
  18615. return !e.material.uniforms.map.value;
  18616. });
  18617. if (needRecover.length) {
  18618. var maxCount = common$1.getBestCount({
  18619. name: '4kmaxTileRecover',
  18620. minCount: 0,
  18621. maxCount: 2,
  18622. durBound1: 1.5,
  18623. durBound2: 6,
  18624. ifLog: false,
  18625. maxHistory: 2
  18626. });
  18627. var count = 0;
  18628. needRecover.forEach(function (e, i) {
  18629. //只更新若干个,因为太耗时了, 其余的等下帧更新
  18630. if (count >= maxCount) return;
  18631. var r = _this8.recoverTile(e);
  18632. if (r) count++;
  18633. });
  18634. }
  18635. /*if(recoverList.length == 0)this.highMapCube.restNeedRecover = []
  18636. else{
  18637. let maxCount = common.getBestCount({name:'4kmaxTileRecover', minCount : 0, maxCount : 2, durBound1 : 1.5, durBound2 : 6, ifLog:false, maxHistory:2 } )
  18638. let count = 0,index = -1
  18639. recoverList.forEach((e,i)=>{ //只更新若干个,因为太耗时了
  18640. if(count>=maxCount)return
  18641. let r = this.recoverTile(e)
  18642. if(r) count ++
  18643. index = i
  18644. })
  18645. this.highMapCube.restNeedRecover = recoverList.slice(index+1) //其余的等下帧更新
  18646. }*/
  18647. /* performance.mark('updateTiles-end')
  18648. let measure = performance.measure('updateTiles', 'updateTiles-start', 'updateTiles-end')
  18649. console.log('updateTiles', measure.duration.toFixed(3)) */
  18650. }
  18651. }, {
  18652. key: "getHighImage",
  18653. value: function getHighImage(image, cubeFace, tileX, tileY) {
  18654. var tile = this.highMapCube.children[cubeFace].children[tileX * 8 + tileY];
  18655. tile.image = image; //先记录下来
  18656. }
  18657. }, {
  18658. key: "updateHighMap",
  18659. value: function updateHighMap(image, cubeFace, tileX, tileY) {
  18660. var tile = this.highMapCube.children[cubeFace].children[tileX * 8 + tileY];
  18661. if (image) tile.image = image; //先记录下来
  18662. var uniforms = tile.material.uniforms;
  18663. if (uniforms.map.value) return;
  18664. if (this.highMapCube.visibleTiles && !this.highMapCube.visibleTiles.includes(tile)
  18665. /* this.highMapCube.texLoadedCount >= this.getMaxTileCount() */
  18666. ) {
  18667. return;
  18668. } //简易创建贴图
  18669. /* var tex = this.$app.core.get('SceneRenderer').initSizedTexture2D(512, THREE.ClampToEdgeWrapping)
  18670. //var loaded = this.$app.core.get('Player').model.isHighMapLoaded(tile.cubeFace, tile.tileX, tile.tileY)
  18671. this.$app.core.get('SceneRenderer').uploadTexture2D(image, tex, 0, 0, 512, 512) //只替换tex对应的img,不新建
  18672. */
  18673. var tex = new THREE.Texture();
  18674. tex.image = image;
  18675. tex.flipY = false;
  18676. tex.wrapS = tex.wrapT = THREE.ClampToEdgeWrapping;
  18677. tex.generateMipmaps = false;
  18678. tex.minFilter = THREE.LinearFilter;
  18679. tex.needsUpdate = true;
  18680. uniforms.map.value = tex;
  18681. if (highMapAddColor) {
  18682. uniforms.opacity.value = 1;
  18683. }
  18684. tile.visible = true;
  18685. tile.material.needsUpdate = true; //发现每次开始放大但还未放大到4k时也会把之前加载过的4k加载
  18686. //console.log('updateHighMap',cubeFace, tileX, tileY)
  18687. }
  18688. }, {
  18689. key: "recoverTile",
  18690. value: function recoverTile(tile) {
  18691. if (tile.material.uniforms.map.value) return;
  18692. if (tile.image) {
  18693. this.updateHighMap(tile.image, tile.cubeFace, tile.tileX, tile.tileY);
  18694. return true;
  18695. }
  18696. }
  18697. }, {
  18698. key: "resetTile",
  18699. value: function resetTile(tile, kill) {
  18700. if (kill) {
  18701. //完全消灭
  18702. tile.image = null;
  18703. }
  18704. var map = tile.material.uniforms.map.value;
  18705. if (map) {
  18706. map.dispose(); //这句执行了以后,h.__webglTexture一直就是undefined
  18707. map.loaded = !1;
  18708. map.version = 0; //保底再执行一下这个,类似app.sceneRenderer.deallocateCubeTexture(tile.material.map)
  18709. var h = this.$app.core.get('SceneRenderer').renderer.properties.get(map); //console.log('__webglTexture',!!h.__webglTexture)
  18710. this.$app.core.get('SceneRenderer').renderer.getContext().deleteTexture(h.__webglTexture);
  18711. tile.material.uniforms.map.value = null;
  18712. if (highMapAddColor) {
  18713. tile.material.uniforms.opacity.value = 0.4;
  18714. }
  18715. tile.material.needsUpdate = true;
  18716. tile.visible = false; //this.highMapCube.texLoadedCount --
  18717. //console.log('resetTile'/* , tile.cubeFace, tile.tileX, tile.tileY */)
  18718. }
  18719. }
  18720. }, {
  18721. key: "resetHighMap",
  18722. value: function resetHighMap() {
  18723. var _this9 = this;
  18724. if (!this.highMapCube) return;
  18725. this.highMapCube.children.forEach(function (e) {
  18726. return e.children.forEach(function (tile) {
  18727. _this9.resetTile(tile, true);
  18728. });
  18729. }); //this.highMapCube.texLoadedCount = 0
  18730. this.highMapCube.visibleTiles = null;
  18731. this.hideHighMap(); //console.log('resetHighMap')
  18732. }
  18733. }, {
  18734. key: "setHighMap",
  18735. value: function setHighMap(pano) {
  18736. if (!this.highMapCube) return;
  18737. this.highMapCube.position.copy(pano.position);
  18738. this.highMapCube.quaternion.copy(pano.quaternion);
  18739. }
  18740. }, {
  18741. key: "showHighMap",
  18742. value: function showHighMap() {
  18743. if (!this.highMapCube) return;
  18744. this.highMapCube.visible = true; //console.log('showHighMap')
  18745. }
  18746. }, {
  18747. key: "hideHighMap",
  18748. value: function hideHighMap() {
  18749. if (!this.highMapCube) return;
  18750. this.highMapCube.visible = false; //console.log('hideHighMap')
  18751. } //缩小后继续显示cube呢还是不显示? 不显示的话,就要把cube上的复制到renderTarget上……会不会又崩溃,or没加载的显示???
  18752. }, {
  18753. key: "showLowestTile",
  18754. value: function showLowestTile(isLowest) {
  18755. // 只显示最低精度的瓦片
  18756. if (this._3dTilesRuntime) {
  18757. this._3dTilesRuntime.pauseTilesetUpdate(false); // 最低精度时,暂停_3dTilesRuntime的update
  18758. var sceneRenderer = this.$app.core.get('SceneRenderer');
  18759. sceneRenderer.autoUpdate3dTiles = !isLowest;
  18760. sceneRenderer.autoUpdate3dTiles && sceneRenderer.update3dTiles({
  18761. force: true
  18762. }); // 立即更新一次相机位置
  18763. this._3dTilesRuntime.limit2lowestDepth(isLowest); // 只显示最低瓦片精度
  18764. this._3dTilesRuntime.ingoreVisibleCompute(isLowest); // 最低精度时,忽略瓦片是否在屏幕外
  18765. this._3dTilesRuntime.pauseTilesetUpdate(isLowest);
  18766. }
  18767. }
  18768. }, {
  18769. key: "setModelDisplay",
  18770. value: function setModelDisplay(show) {
  18771. var _this10 = this;
  18772. var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'force';
  18773. var level = arguments.length > 2 ? arguments[2] : undefined;
  18774. var type = arguments.length > 3 ? arguments[3] : undefined;
  18775. //console.error('setModelDisplay', show, reason, level)
  18776. var oldVisi = this.chunkDisplay.visible;
  18777. common$1.updateVisible(this.chunkDisplay, reason, show, level, type);
  18778. if (oldVisi != this.chunkDisplay.visible) {
  18779. if (this._3dTilesRuntime) {
  18780. this._3dTilesRuntime.getTileset().visible = this.chunkDisplay.visible;
  18781. } else {
  18782. this.chunks.forEach(function (e) {
  18783. return common$1.updateVisible(e, reason, _this10.chunkDisplay.visible);
  18784. });
  18785. }
  18786. }
  18787. }
  18788. }, {
  18789. key: "showOnFloorplan",
  18790. get: function get() {
  18791. var showTexture = this.$app.store.getValue('metadata').controls.showTexture;
  18792. return showTexture || showTexture == void 0; //默认展示
  18793. }
  18794. }]);
  18795. return Model;
  18796. }(THREE.Object3D)) || _class;
  18797. /*
  18798. note:
  18799. 目前highMap 4k放大 是会遮住所有marker、viewLink等mesh的
  18800. */
  18801. 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); }; }
  18802. 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; } }
  18803. var View = /*#__PURE__*/function (_EventEmitter) {
  18804. _inherits(View, _EventEmitter);
  18805. var _super = _createSuper$1z(View);
  18806. function View(e) {
  18807. var _this;
  18808. _classCallCheck(this, View);
  18809. _this = _super.call(this);
  18810. e = e || {};
  18811. _this.position = new THREE.Vector3();
  18812. _this.quaternion = new THREE.Quaternion();
  18813. _this.update(e);
  18814. return _this;
  18815. }
  18816. _createClass(View, [{
  18817. key: "isValid",
  18818. value: function isValid() {
  18819. return !!this.cameraMode;
  18820. }
  18821. }, {
  18822. key: "update",
  18823. value: function update(e) {
  18824. 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;
  18825. }
  18826. }]);
  18827. return View;
  18828. }(EventEmitter);
  18829. 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); }; }
  18830. 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; } }
  18831. var Reticule = /*#__PURE__*/function (_THREE$Mesh) {
  18832. _inherits(Reticule, _THREE$Mesh);
  18833. var _super = _createSuper$1y(Reticule);
  18834. function Reticule(player) {
  18835. var _this;
  18836. _classCallCheck(this, Reticule);
  18837. _this = _super.call(this);
  18838. var uniform = THREE.UniformsUtils.clone(shaders.waypoint.uniforms); //uniform.map.value = settings.blueReticule;
  18839. uniform.map.value = common$1.loadTextureFromCache(texture.getImageURL('images/blueReticle.png'));
  18840. uniform.map.value.minFilter = THREE.LinearMipMapLinearFilter;
  18841. uniform.map.value.anisotropy = 4;
  18842. uniform.opacity.value = 0; //uniform.color.value.set(settings.reticuleColor)
  18843. _this = _super.call(this, new THREE.PlaneBufferGeometry(0.4, 0.4, 1, 1), new THREE.RawShaderMaterial({
  18844. side: THREE.DoubleSide,
  18845. depthWrite: !1,
  18846. depthTest: !1,
  18847. transparent: !0,
  18848. vertexShader: shaders.waypoint.vertexShader,
  18849. fragmentShader: shaders.waypoint.fragmentShader,
  18850. uniforms: uniform,
  18851. name: 'waypoint',
  18852. opacity: 0
  18853. }));
  18854. _this.layers.set(RenderLayers.RETICULE);
  18855. _this.renderOrder = RenderOrder.reticule;
  18856. _this.player = player;
  18857. _this.direction = new THREE.Vector3();
  18858. _this.hidden = !0;
  18859. _this.mouseLastMoveTime = Date.now(); //this.alwaysShow = true //for test
  18860. return _this;
  18861. }
  18862. _createClass(Reticule, [{
  18863. key: "move",
  18864. value: function move(e, t, i) {
  18865. this.hidden = i, this.mouseLastMoveTime = Date.now();
  18866. }
  18867. }, {
  18868. key: "hide",
  18869. value: function hide() {
  18870. this.hidden || (this.hidden = !0, transitions$1.start(lerp.property(this.material.uniforms.opacity, 'value', 0), settings$3.reticuleOpacityTransitionTime));
  18871. }
  18872. }, {
  18873. key: "show",
  18874. value: function show() {
  18875. 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);
  18876. }
  18877. }, {
  18878. key: "update",
  18879. value: function update() {
  18880. Date.now() - this.mouseLastMoveTime > settings$3.hideReticuleTimeout && !this.hidden && this.hide();
  18881. }
  18882. }, {
  18883. key: "updatePosition",
  18884. value: function updatePosition(e, t) {
  18885. var _t$face;
  18886. if (!this.hidden && t !== null && t !== void 0 && (_t$face = t.face) !== null && _t$face !== void 0 && _t$face.normal) {
  18887. if (!t) return this.hide();
  18888. var i = t.point,
  18889. n = e.distanceTo(i),
  18890. r = 1 + 0.01 * n;
  18891. n < 1 && (r -= 1 - n), this.show();
  18892. this.scale.set(r, r, r);
  18893. this.direction = this.direction.multiplyScalar(0.8);
  18894. this.direction.add(t.face.normal.clone().multiplyScalar(0.2));
  18895. this.position.copy(i).add(t.face.normal.clone().multiplyScalar(0.01));
  18896. this.lookAt(this.position.clone().add(this.direction));
  18897. }
  18898. }
  18899. }]);
  18900. return Reticule;
  18901. }(THREE.Mesh);
  18902. var ControlEvents = {
  18903. Move: 'move',
  18904. InteractionDirect: 'interaction.direct',
  18905. InteractionKey: 'interaction.key',
  18906. InteractionGui: 'interaction.gui',
  18907. FlyInDirection: 'fly.direction',
  18908. InputStart: 'input.start',
  18909. Pinch: 'input.pinch',
  18910. Scroll: 'input.scroll',
  18911. AutoPanInterrupt: 'autopan.interrupt',
  18912. AutoPanComplete: 'autopan.complete',
  18913. AutoPanClamped: 'autopan.clamped',
  18914. LongTap: 'longtap'
  18915. };
  18916. var DownloadStatus = Object.freeze({
  18917. None: 0,
  18918. Queued: 1,
  18919. ForceQueued: 2,
  18920. Downloading: 3,
  18921. Downloaded: 4,
  18922. DownloadFailed: 5
  18923. });
  18924. var h$1 = Object.freeze({
  18925. None: 0,
  18926. DirectionalFOV: 1
  18927. });
  18928. var u$1 = function () {
  18929. var e = function e(t, i) {
  18930. var n = e._panoSpaceDir,
  18931. r = e._fovThreshold,
  18932. o = e._fovThresholdNarrow,
  18933. a = Math.max(Math.min(n.dot(t.direction), 1), -1),
  18934. s = Math.max(Math.min(n.dot(i.direction), 1), -1);
  18935. 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);
  18936. };
  18937. return e._panoSpaceDir = new THREE.Vector3(), e._fovThreshold = -1, e._fovThresholdNarrow = -1, e;
  18938. }();
  18939. var TilePrioritizer = /*#__PURE__*/function () {
  18940. function TilePrioritizer(_e, _t, _i, _o, _a) {
  18941. _classCallCheck(this, TilePrioritizer);
  18942. this.filterAndPrioritize = function () {
  18943. var e = [],
  18944. t = [],
  18945. i = [];
  18946. return function (r, o, a) {
  18947. var maxCount = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10;
  18948. //判断哪些临近点要加载512,以及当前点的哪些tile要加载
  18949. //console.log('filterAndPrioritize', this.priorityCriteria.pano.model.sid)
  18950. if (this.priorityCriteria.pano.panoType != '360view') {
  18951. //view没有相邻(如果加上了visibleView, 使用upcomingPanos)
  18952. this.populateNeighborPanos(this.priorityCriteria.pano, o, e);
  18953. this.populateScoredPanos(this.priorityCriteria.pano, o, t, this.priorityCriteria.cameraDir, TilePrioritizer.MAX_SCORED_PANOS_TOCONSIDER);
  18954. }
  18955. var s = this.baseSize,
  18956. //512
  18957. l = this.standardSize,
  18958. //1024
  18959. c = this.highSize,
  18960. //2048
  18961. h = this.ultraHighSize; //4096
  18962. this.queueTilesForPano(r, a, this.priorityCriteria.pano, s);
  18963. if (this.priorityCriteria.upcomingPanos) {
  18964. //512
  18965. this.queueTilesForPanos(r, this.priorityCriteria.upcomingPanos, a, s, TilePrioritizer.MAX_UPCOMING_PANOS_TOADD);
  18966. } //把当前pano角度范围内的tile按照分辨率从低到高加入队列
  18967. {
  18968. //1024
  18969. i.length = 0;
  18970. if (this.canDownloadSize(l) && r.length < maxCount) {
  18971. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, l, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
  18972. }
  18973. TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDir);
  18974. TilePrioritizer.appendQueue(r, i); //i->r
  18975. } //添加邻近点t 512的tiles
  18976. this.queueTilesForPanos(r, t, a, s, TilePrioritizer.MAX_SCORED_PANOS_TOADD);
  18977. i.length = 0;
  18978. if (r.length < maxCount) {
  18979. //120deg
  18980. //2048
  18981. if (this.canDownloadSize(c) && r.length + i.length < maxCount) {
  18982. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, c, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
  18983. } //4096
  18984. if (this.canDownloadSize(h) && r.length + i.length < maxCount) {
  18985. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, h, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV_NARROW);
  18986. }
  18987. TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDir);
  18988. TilePrioritizer.appendQueue(r, i);
  18989. i.length = 0;
  18990. }
  18991. if (r.length < maxCount) {
  18992. //180deg
  18993. if (this.canDownloadSize(l) && r.length + i.length < maxCount) {
  18994. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, l, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV);
  18995. }
  18996. if (this.canDownloadSize(c) && r.length + i.length < maxCount) {
  18997. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, c, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV);
  18998. }
  18999. if (this.canDownloadSize(h) && r.length + i.length < maxCount) {
  19000. this.queueTilesInDirectionForPano(i, a, this.priorityCriteria.pano, h, this.priorityCriteria.cameraPosition, this.priorityCriteria.cameraDir, TilePrioritizer.DIRECTIONAL_FOV);
  19001. }
  19002. TilePrioritizer.sortPanoTiles(i, this.priorityCriteria.pano, this.priorityCriteria.cameraDir);
  19003. TilePrioritizer.appendQueue(r, i);
  19004. } //r.length && console.log(r.map(e=>e.pano.id + '-' + e.panoSize))
  19005. this.queueTilesForPanos(r, e, a, s);
  19006. };
  19007. }();
  19008. this.queueTilesForPano = function () {
  19009. var e = {
  19010. filter: h$1.None
  19011. };
  19012. return function (t, i, n, r) {
  19013. if (!n.tiled) return; //xzw add
  19014. return this.filterAndQueueTileDownloadDescriptors(t, i, n, r, e);
  19015. };
  19016. }();
  19017. this.queueTilesForPanosInDirection = function () {
  19018. var e = new THREE.Vector3();
  19019. return function (t, i, n, r, o, a, s, l) {
  19020. for (var h = 0, u = 0; u < n.length; u++) {
  19021. var d = n[u];
  19022. e.copy(d.position), e.sub(o), e.normalize();
  19023. var p = Math.max(Math.min(a.dot(e), 1), -1),
  19024. f = c.getFOVDotThreshold(s);
  19025. if (p >= f) {
  19026. var g = this.queueTilesInDirectionForPano(t, i, d, r, o, a, s);
  19027. if (h += g > 0 ? 1 : 0, l && h >= l) break;
  19028. }
  19029. }
  19030. return h;
  19031. };
  19032. }();
  19033. this.queueTilesInDirectionForPano = function () {
  19034. var e = {
  19035. filter: h$1.DirectionalFOV,
  19036. direction: new THREE.Vector3(),
  19037. fov: 60
  19038. },
  19039. t = new THREE.Vector3();
  19040. return function (i, n, r, o, a, s, c) {
  19041. if (!r.tiled) return; //xzw add
  19042. t.copy(s);
  19043. TileUtils.getRelativeDirection(r.quaternion, t);
  19044. e.direction.copy(t);
  19045. e.fov = c;
  19046. return this.filterAndQueueTileDownloadDescriptors(i, n, r, o, e);
  19047. };
  19048. }();
  19049. this.filterAndQueueTileDownloadDescriptors = function () {
  19050. var e = [];
  19051. return function (t, i, n, r, o) {
  19052. var a = i.getTileDownloadDescriptors(n, r);
  19053. e.length = 0, this.filterTileDownloadDescriptors(n, a, e, o);
  19054. for (var s = 0, l = 0; l < e.length; l++) {
  19055. var c = e[l];
  19056. if (c) {
  19057. t.push(c);
  19058. s++;
  19059. }
  19060. }
  19061. return s;
  19062. };
  19063. }();
  19064. this.filterTileDownloadDescriptors = function () {
  19065. new THREE.Vector3();
  19066. return function (e, t, i, n) {
  19067. var r, o;
  19068. switch (n.filter) {
  19069. case h$1.DirectionalFOV:
  19070. for (r = 0; r < t.length; r++) {
  19071. o = t[r], TileUtils.isTileWithinFOV(o.panoSize, o.tileSize, o.face, o.tileX, o.tileY, n.direction, n.fov) && i.push(o);
  19072. }
  19073. break;
  19074. default:
  19075. for (r = 0; r < t.length; r++) {
  19076. o = t[r], i.push(o);
  19077. }
  19078. }
  19079. for (r = 0; r < i.length; r++) {
  19080. o = i[r], this.canIncludeDescriptor(o) || (i[r] = null);
  19081. }
  19082. };
  19083. }();
  19084. this.qualityManager = _e;
  19085. this.maxNavQuality = this.qualityManager.getMaxNavPanoSize();
  19086. this.maxZoomQuality = this.qualityManager.getMaxZoomPanoSize();
  19087. this.baseSize = _t;
  19088. this.standardSize = _i;
  19089. this.highSize = _o;
  19090. this.ultraHighSize = _a;
  19091. this.priorityCriteria = new TilePrioritizer.PriorityCriteria(null, new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, -1), new THREE.Vector3(0, 0, -1));
  19092. }
  19093. _createClass(TilePrioritizer, [{
  19094. key: "updateCriteria",
  19095. value: function updateCriteria(pano, t, i, n) {
  19096. this.priorityCriteria.pano = pano;
  19097. this.priorityCriteria.cameraPosition.copy(t);
  19098. this.priorityCriteria.cameraDir.copy(i);
  19099. this.priorityCriteria.upcomingPanos = n;
  19100. this.maxNavQuality = this.qualityManager.limitQuality && pano.curTileQuality ? pano.curTileQuality : this.qualityManager.getMaxNavPanoSize(); //xzw : quality 表示在漫游过程中手机端先只加载低质量,静止片刻后再加载2k
  19101. this.maxZoomQuality = this.qualityManager.getMaxZoomPanoSize();
  19102. }
  19103. }, {
  19104. key: "canDownloadSize",
  19105. value: function canDownloadSize(e) {
  19106. return this.maxNavQuality >= e || this.maxZoomQuality >= e && this.zoomingActive;
  19107. }
  19108. }, {
  19109. key: "populateNeighborPanos",
  19110. value: function populateNeighborPanos(e, t, i) {
  19111. i = i || [], i.length = 0;
  19112. var n = t.getNeighbours(e);
  19113. for (var r in n) {
  19114. if (n.hasOwnProperty(r)) {
  19115. var o = t.get(r);
  19116. i.push(o);
  19117. }
  19118. }
  19119. return i;
  19120. }
  19121. }, {
  19122. key: "populateScoredPanos",
  19123. value: function populateScoredPanos(e, t, i, r, a) {
  19124. i = i || [], i.length = 0;
  19125. var s = [Panorama.filters.inPanoDirection(e.position, r, TilePrioritizer.DIRECTION_SCORE_STRICTNESS), Panorama.filters.not(e)],
  19126. l = [Panorama.scoreFunctions.distanceSquared(e), Panorama.scoreFunctions.direction(e.position, r)],
  19127. c = common$1.sortByScore(t.list, s, l);
  19128. if (c) for (var h = 0; h < c.length && h < a; h++) {
  19129. var u = c[h].item;
  19130. i.push(u);
  19131. }
  19132. return i;
  19133. }
  19134. }, {
  19135. key: "queueTilesForPanos",
  19136. value: function queueTilesForPanos(e, t, i, n, r) {
  19137. for (var o = 0, a = 0; a < t.length; a++) {
  19138. var s = t[a],
  19139. l = this.queueTilesForPano(e, i, s, n);
  19140. if (o += l > 0 ? 1 : 0, r && o >= r) break;
  19141. }
  19142. return o;
  19143. }
  19144. }, {
  19145. key: "queueTilesInDirectionForPanos",
  19146. value: function queueTilesInDirectionForPanos(e, t, i, n, r, o, a, s) {
  19147. for (var l = 0, c = 0; c < i.length; c++) {
  19148. var h = i[c],
  19149. u = this.queueTilesInDirectionForPano(e, t, h, n, o, a);
  19150. if (l += u > 0 ? 1 : 0, s && l >= s) break;
  19151. }
  19152. return l;
  19153. }
  19154. }, {
  19155. key: "canIncludeDescriptor",
  19156. value: function canIncludeDescriptor(e) {
  19157. return e.status !== DownloadStatus.Downloading && e.status !== DownloadStatus.Downloaded;
  19158. }
  19159. }, {
  19160. key: "canIncludePano",
  19161. value: function canIncludePano(e, t) {
  19162. return !e.isLoaded(t);
  19163. }
  19164. }, {
  19165. key: "setZoomingActive",
  19166. value: function setZoomingActive(e) {
  19167. e !== this.zoomingActive && (this.zoomingActive = e);
  19168. }
  19169. }], [{
  19170. key: "PriorityCriteria",
  19171. value: function PriorityCriteria(e, t, i, n, o) {
  19172. this.pano = e;
  19173. this.cameraPosition = new THREE.Vector3().copy(t);
  19174. this.cameraDir = new THREE.Vector3().copy(i);
  19175. this.panoSpaceDir = new THREE.Vector3().copy(n);
  19176. this.upcomingPanos = o;
  19177. this.copy = function (e) {
  19178. this.pano = e.pano;
  19179. this.cameraPosition.copy(e.cameraPosition);
  19180. this.cameraDir.copy(e.cameraDir);
  19181. this.panoSpaceDir.copy(e.panoSpaceDir);
  19182. this.upcomingPanos = o;
  19183. }, this.zoomingActive = !1;
  19184. }
  19185. }, {
  19186. key: "appendQueue",
  19187. value: function appendQueue(e, t) {
  19188. if (e && t) for (var i = 0; i < t.length; i++) {
  19189. e.push(t[i]);
  19190. }
  19191. }
  19192. }, {
  19193. key: "getFOVDotThreshold",
  19194. value: function getFOVDotThreshold(e) {
  19195. return Math.cos(THREE.MathUtils.degToRad(e / 2));
  19196. }
  19197. }, {
  19198. key: "sortPanoTiles",
  19199. value: function sortPanoTiles(e, t, i) {
  19200. u$1._panoSpaceDir.copy(i), TileUtils.getRelativeDirection(t.quaternion, u$1._panoSpaceDir), u$1._fovThresholdNarrow = math$2.getFOVDotThreshold(TilePrioritizer.DIRECTIONAL_FOV_NARROW), u$1._fovThreshold = math$2.getFOVDotThreshold(TilePrioritizer.DIRECTIONAL_FOV), e.sort(u$1);
  19201. }
  19202. }, {
  19203. key: "insertSortedPanoTile",
  19204. value: function insertSortedPanoTile(e, t, i, r) {
  19205. u$1._panoSpaceDir.copy(r), TileUtils.getRelativeDirection(i.quaternion, u$1._panoSpaceDir), u$1._fovThresholdNarrow = math$2.getFOVDotThreshold(TilePrioritizer.DIRECTIONAL_FOV_NARROW), u$1._fovThreshold = math$2.getFOVDotThreshold(TilePrioritizer.DIRECTIONAL_FOV);
  19206. for (var o = -1, a = 0; a < e.length; a++) {
  19207. var s = u$1(t, e[a]);
  19208. if (s <= 0) {
  19209. o = a;
  19210. break;
  19211. }
  19212. }
  19213. if (o === -1) e[e.length] = t;else {
  19214. for (var h = e.length; h > o; h--) {
  19215. e[h] = e[h - 1];
  19216. }
  19217. e[o] = t;
  19218. }
  19219. }
  19220. }]);
  19221. return TilePrioritizer;
  19222. }();
  19223. TilePrioritizer.DIRECTIONAL_FOV = 180;
  19224. TilePrioritizer.DIRECTIONAL_FOV_NARROW = 120;
  19225. TilePrioritizer.MAX_SCORED_PANOS_TOCONSIDER = 6;
  19226. TilePrioritizer.MAX_SCORED_PANOS_TOADD = 2;
  19227. TilePrioritizer.MAX_UPCOMING_PANOS_TOADD = 3;
  19228. TilePrioritizer.DIRECTION_SCORE_STRICTNESS = 0.75;
  19229. var Keys = {
  19230. ZERO: 48,
  19231. ONE: 49,
  19232. TWO: 50,
  19233. THREE: 51,
  19234. FOUR: 52,
  19235. FIVE: 53,
  19236. SIX: 54,
  19237. SEVEN: 55,
  19238. EIGHT: 56,
  19239. NINE: 57,
  19240. LEFTARROW: 37,
  19241. UPARROW: 38,
  19242. RIGHTARROW: 39,
  19243. DOWNARROW: 40,
  19244. A: 65,
  19245. B: 66,
  19246. C: 67,
  19247. D: 68,
  19248. E: 69,
  19249. F: 70,
  19250. G: 71,
  19251. H: 72,
  19252. I: 73,
  19253. J: 74,
  19254. K: 75,
  19255. L: 76,
  19256. M: 77,
  19257. N: 78,
  19258. O: 79,
  19259. P: 80,
  19260. Q: 81,
  19261. R: 82,
  19262. S: 83,
  19263. T: 84,
  19264. U: 85,
  19265. V: 86,
  19266. W: 87,
  19267. X: 88,
  19268. Y: 89,
  19269. Z: 90,
  19270. SPACE: 32,
  19271. RETURN: 13,
  19272. SEMICOLON: 186,
  19273. PLUSEQUALS: 187,
  19274. DASHUNDERSCORE: 189,
  19275. OPENBRACKET: 219
  19276. };
  19277. if (browser$1.detectFirefox()) {
  19278. Keys.SEMICOLON = 59;
  19279. Keys.PLUSEQUALS = 61;
  19280. Keys.DASHUNDERSCORE = 173;
  19281. }
  19282. var ModelManagerEvents = {
  19283. ModelAdded: 'model-added',
  19284. ActiveModelChanged: 'active-model-changed'
  19285. };
  19286. 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); }; }
  19287. 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; } }
  19288. var Snapshot = /*#__PURE__*/function (_View) {
  19289. _inherits(Snapshot, _View);
  19290. var _super = _createSuper$1x(Snapshot);
  19291. function Snapshot(objectSet) {
  19292. var _this;
  19293. _classCallCheck(this, Snapshot);
  19294. _this = _super.call(this, objectSet);
  19295. _this.panoId = objectSet.panoId;
  19296. _this.orthoZoom = objectSet.orthoZoom;
  19297. _this.floorVisibility = objectSet.floorVisibility;
  19298. _this.thumbUrl = objectSet.thumbUrl;
  19299. _this.name = objectSet.name;
  19300. return _this;
  19301. }
  19302. _createClass(Snapshot, [{
  19303. key: "isPano",
  19304. value: function isPano() {
  19305. return this.panoId && '' !== this.panoId;
  19306. }
  19307. }]);
  19308. return Snapshot;
  19309. }(View);
  19310. //导览时路径上出现的mesh 现在只用到了currentPanoMarker
  19311. var ShowPath = /*#__PURE__*/function () {
  19312. function ShowPath(director, player, controls) {
  19313. _classCallCheck(this, ShowPath);
  19314. this.flightStepWalk = function (e, t, i) {
  19315. var n = 0.001,
  19316. o = 1,
  19317. a = 1.2,
  19318. s = new THREE.Vector3(),
  19319. h = new THREE.Vector3(),
  19320. u = function u(e, t) {
  19321. var i = Math.min(this.player.position.distanceTo(e.position), settings$3.transition.flytimeMaxDistanceThreshold),
  19322. r = i * settings$3.transition.flytimeDistanceMultiplier + settings$3.transition.flyTime;
  19323. h.copy(Vectors$1.FORWARD), this.player.getDirection(h), s.copy(t).sub(e.position).normalize();
  19324. var l = s.dot(h),
  19325. u = Math.acos(l),
  19326. d = u / r;
  19327. return d > n && (r *= d / n, u < o && (r *= a)), r;
  19328. };
  19329. return function (e, t, i) {
  19330. 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) {
  19331. var n = {
  19332. pano: e,
  19333. lookAtPoint: t,
  19334. duration: null,
  19335. maxDistanceOverride: settings$3.warp.walkMaxDist,
  19336. skipWarpingCheck: !1,
  19337. constantMoveSpeed: !0
  19338. };
  19339. n.duration = u.call(this, e, t), this.player.nonInterruptingFlyToPano(n, i);
  19340. } else i && i();
  19341. };
  19342. }();
  19343. this.warpTravel_WALK = function () {
  19344. var e = [];
  19345. return function (t) {
  19346. var i = this.player.model.panos;
  19347. e.length = 0;
  19348. for (var n = null, o = !1, a = 0; a < this.nodes.length; a++) {
  19349. var s = this.nodes[a],
  19350. l = i.get(s);
  19351. a === this.nodes.length - 1;
  19352. o = n && l.position.distanceTo(n.position) < settings$3.warp.walkMinDist, n && o || (e.push(s), n = l);
  19353. }
  19354. o && this.nodes.length > 1 && (e[e.length - 1] = this.nodes[this.nodes.length - 1]);
  19355. var h = e.length,
  19356. u = i.get(e[h - 1]),
  19357. d = new Array(h + 1);
  19358. d[d.length - 1] = function () {
  19359. t && t();
  19360. }.bind(this);
  19361. for (var p = h - 1, f = d.length - 1; f > 0; f -= 1) {
  19362. var g = e[p];
  19363. u = i.get(g);
  19364. var m = new THREE.Vector3();
  19365. this.getLookAtForWalkingTourNode(e, p, m), d[f - 1] = this.makeWalkFlightFunc(u, m, d[f]), p--;
  19366. }
  19367. d[0]();
  19368. };
  19369. }();
  19370. this.getLookAtForWalkingTourNode = function () {
  19371. var e = new THREE.Vector3(),
  19372. t = new THREE.Vector3(),
  19373. i = new THREE.Vector3(),
  19374. n = new THREE.Vector3(),
  19375. o = new THREE.Vector3(),
  19376. a = 0.65,
  19377. s = 0.75,
  19378. l = 0.2,
  19379. c = 0.4,
  19380. h = 0.2,
  19381. u = 3;
  19382. return function (r, d, p) {
  19383. var f = r.length;
  19384. if (d >= f) return !1;
  19385. var g = 1,
  19386. m = 1;
  19387. t.set(0, 0, 0), o.set(0, 0, 0);
  19388. for (var v = null, A = d; A < d + u && !(A >= f); A++) {
  19389. if (v = this.player.model.panos.get(r[A]), this.getOrientationForWalkingTourNode(r, A, i), A === d && e.copy(i), n.copy(i), A > d) {
  19390. var y = n.dot(e) < a;
  19391. g *= y ? l : s, m *= y ? h : c;
  19392. }
  19393. i.multiplyScalar(g), t.add(i), o.lerp(v.position, m);
  19394. }
  19395. return t.normalize(), p.copy(o), p.add(t), !0;
  19396. };
  19397. }();
  19398. 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;
  19399. this.pathImg = {};
  19400. this.brushPrefs = {
  19401. linewidth: 7,
  19402. strokeWidth: 15,
  19403. cvSegments: 48,
  19404. paveStep: 0.1,
  19405. paveWidth: 0.2,
  19406. lookBlendDist: 3,
  19407. maxTurn: THREE.MathUtils.degToRad(2)
  19408. };
  19409. this.hintPrefs = {
  19410. rad: 0.18,
  19411. width: 0.0125,
  19412. depth: 0.0625,
  19413. setBack: -0.04,
  19414. markRad: 0.25,
  19415. markInnerRad: 0.16
  19416. };
  19417. this.init();
  19418. }
  19419. _createClass(ShowPath, [{
  19420. key: "init",
  19421. value: function init() {
  19422. //this.pathImg.path = common.loadTextureFromCache(config.path);//没用到
  19423. this.pathImg.pathEnd = common$1.loadTextureFromCache(texture.getImageURL('images/pathEnd.png')); //this.pathImg.pathStart = common.loadTextureFromCache(config.pathStart);//没用到
  19424. }
  19425. }, {
  19426. key: "setScene",
  19427. value: function setScene(scene) {
  19428. this.createCpm(scene); //this.createBunnyObj(scene);
  19429. }
  19430. }, {
  19431. key: "updateModel",
  19432. value: function updateModel() {
  19433. this.model = this.modelManager.getActiveModel();
  19434. }
  19435. }, {
  19436. key: "bindEvents",
  19437. value: function bindEvents() {
  19438. this.modelManager.on(ModelManagerEvents.ActiveModelChanged, this.updateModel.bind(this));
  19439. }
  19440. }, {
  19441. key: "pointPathDistance",
  19442. value: function pointPathDistance(points) {
  19443. for (var distance = 0, i = 1; i < points.length; i += 1) {
  19444. distance += points[i - 1].distanceTo(points[i]);
  19445. }
  19446. return distance;
  19447. }
  19448. }, {
  19449. key: "pointPathLengths",
  19450. value: function pointPathLengths(points) {
  19451. for (var t = [0], i = 1; i < points.length; i += 1) {
  19452. t.push(t[i - 1] + points[i - 1].distanceTo(points[i]));
  19453. }
  19454. return t;
  19455. }
  19456. }, {
  19457. key: "interpAlongPath",
  19458. value: function interpAlongPath(e, t, i) {
  19459. var n,
  19460. o = new THREE.Vector3(),
  19461. a = t[t.length - 1];
  19462. if (i < 1) {
  19463. n = i * a;
  19464. for (var s = 1; s < t.length; s += 1) {
  19465. if (t[s] > n) {
  19466. var l = (n - t[s - 1]) / (t[s] - t[s - 1]);
  19467. return o.copy(e[s]), o.sub(e[s - 1]), o.multiplyScalar(l), o.add(e[s - 1]), o;
  19468. }
  19469. }
  19470. } else o.copy(e[e.length - 1]);
  19471. return o;
  19472. }
  19473. }, {
  19474. key: "pathHeight",
  19475. value: function pathHeight() {
  19476. return settings$3.path.height; //this.player.mode !== ViewMode.FLOORPLAN ? settings.path.height : settings.path.outsideHeight
  19477. //outsideHeight为0.5, 导致floorplan->dollhouse下升高很多 ( 原版也是 )
  19478. }
  19479. }, {
  19480. key: "createBunnyObj",
  19481. value: function createBunnyObj(e) {
  19482. 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);
  19483. }
  19484. }, {
  19485. key: "createCpm",
  19486. value: function createCpm(e) {
  19487. if (!this.currentPanoMarker) {
  19488. var t = this.makeWaypointObj(this.pathImg.pathEnd, 'Current');
  19489. t.material.uniforms.opacity.value = 0, this.currentPanoMarker = {
  19490. mesh: t,
  19491. placed: !1
  19492. };
  19493. }
  19494. this.currentPanoMarker.mesh.parent && this.currentPanoMarker.mesh.parent.remove(this.currentPanoMarker.mesh), this.placeCpm(), this.currentPanoMarker.mesh.parent || e.add(this.currentPanoMarker.mesh);
  19495. }
  19496. }, {
  19497. key: "placeCpm",
  19498. value: function placeCpm() {
  19499. if (settings$3.path.mapGuides && this.player.currentPano && this.player.currentPano.isAligned()) {
  19500. var e = this.player.currentPano.floor;
  19501. 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);
  19502. /*
  19503. if(edit && publicObjectSet.editor.mainDesign.editing){//如果底部高度不一致 另说
  19504. var mainDesign = publicObjectSet.editor.mainDesign;
  19505. mainDesign.atRoom && this.currentPanoMarker.mesh.position.setY(mainDesign.rooms[mainDesign.atRoom].bottom);
  19506. }
  19507. */
  19508. this.currentPanoMarker.mesh.position.y += this.pathHeight();
  19509. this.currentPanoMarker.placed = !0;
  19510. } else {
  19511. this.popOutCpm();
  19512. }
  19513. }
  19514. }, {
  19515. key: "fadeInCpm",
  19516. value: function fadeInCpm(e) {
  19517. 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);
  19518. }
  19519. }, {
  19520. key: "fadeOutCpm",
  19521. value: function fadeOutCpm(e) {
  19522. transitions$1.start(lerp.property(this.currentPanoMarker.mesh.material.uniforms.opacity, 'value', 0), e);
  19523. }
  19524. }, {
  19525. key: "popInCpm",
  19526. value: function popInCpm() {
  19527. settings$3.path.mapGuides && this.currentPanoMarker.placed && this.fadeInCpm(2);
  19528. }
  19529. }, {
  19530. key: "popOutCpm",
  19531. value: function popOutCpm() {
  19532. this.fadeOutCpm(2);
  19533. }
  19534. /* panoPathDistance(e){
  19535. var t = this.model.panos;
  19536. if (!e || e.length < 2)
  19537. return 0;
  19538. for (var i = [], n = 0; n < e.length; n += 1)
  19539. i.push(t.get(e[n]).floorPosition);
  19540. return this.pointPathDistance(i)
  19541. }
  19542. loadTileTexture(e){
  19543. var t = texture.load(e, function(t) {
  19544. t.wrapS = THREE.RepeatWrapping,
  19545. t.wrapT = THREE.RepeatWrapping,
  19546. t.needsUpdate = !0,
  19547. logger.debug('path texture "' + e + '" is ready')
  19548. }, function() {
  19549. logger.error('path texture "' + e + '" failed')
  19550. });
  19551. return t.mapping = THREE.UVMapping,
  19552. t
  19553. } */
  19554. }, {
  19555. key: "buildWarpDestinationDescriptor",
  19556. value: function buildWarpDestinationDescriptor(e, t, i, n, r, o) {
  19557. var a = {
  19558. cameraMode: n,
  19559. position: e,
  19560. quaternion: t,
  19561. panoId: i,
  19562. orthoZoom: o,
  19563. floorVisibility: r,
  19564. thumbUrl: null,
  19565. name: null
  19566. };
  19567. return new Snapshot(a);
  19568. }
  19569. }, {
  19570. key: "buildWarpDestinationDescriptorFromHero",
  19571. value: function buildWarpDestinationDescriptorFromHero(e) {
  19572. return this.buildWarpDestinationDescriptor(e.position, e.quaternion, this.getHeroId(e), e.cameraMode, e.floorVisibility, e.orthoZoom);
  19573. }
  19574. }, {
  19575. key: "setWarpDestination",
  19576. value: function setWarpDestination(e) {
  19577. this.warpDestHeroLoc = e;
  19578. }
  19579. }, {
  19580. key: "setWarpDestinationByHeroIndex",
  19581. value: function setWarpDestinationByHeroIndex(e) {
  19582. var t = this.getHeroDescriptorByHeroIndex(e);
  19583. return null !== t && (this.setWarpDestination(t), !0);
  19584. }
  19585. }, {
  19586. key: "setWarpDestinationByPano",
  19587. value: function setWarpDestinationByPano(e, t) {
  19588. var i = this.model.panos.get(e.id);
  19589. return !!i && this.setWarpDestinationByPanoId(e.id, t);
  19590. }
  19591. }, {
  19592. key: "setWarpDestinationByPanoId",
  19593. value: function setWarpDestinationByPanoId(e, t) {
  19594. var i = this.model.panos.get(e);
  19595. if (i) {
  19596. t = t || new THREE.Quaternion();
  19597. var n = this.buildWarpDestinationDescriptor(i.position, t, i.id, 'panorama', [], -1);
  19598. return this.setWarpDestination(n), !0;
  19599. }
  19600. return !1;
  19601. }
  19602. }, {
  19603. key: "getHeroDescriptorByHeroIndex",
  19604. value: function getHeroDescriptorByHeroIndex(e) {
  19605. var t = objects.play.heroCount();
  19606. if (null !== this.warpDestHeroLoc && t < 2) return logger$1.info('ShowPath.getHeroDescriptorByHeroIndex() -> Only one hero location is available.'), this.model.getHeroDescriptorByIndex(0);
  19607. var hero = this.model.getHeroDescriptorByIndex(e);
  19608. hero = util.getPlayDataItem(e);
  19609. var playData = objects.store.getters['guide/plays'];
  19610. if (playData[e].type == 1) {
  19611. hero = util.getPlayDataItem(e, 0);
  19612. }
  19613. var obj = util.convertHighlight(hero);
  19614. var i = new Snapshot(obj);
  19615. if (i) {
  19616. var n = i.isPano() ? i.panoId : i.cameraMode;
  19617. logger$1.debug('ShowPath.getHeroDescriptorByHeroIndex() -> New brush/warp destination: "' + n + '" out of ' + t + ' choices.');
  19618. }
  19619. return i;
  19620. }
  19621. }, {
  19622. key: "getHeroDescriptorByPano",
  19623. value: function getHeroDescriptorByPano(e) {
  19624. var t = this.model.panos.get(e.id);
  19625. return t ? this.getHeroDescriptorByPanoId(e.id) : null;
  19626. }
  19627. }, {
  19628. key: "getHeroDescriptorByPanoId",
  19629. value: function getHeroDescriptorByPanoId(e) {
  19630. var t = this.getHeroIndexFromPanoId(e);
  19631. return this.getHeroDescriptorByHeroIndex(t);
  19632. }
  19633. }, {
  19634. key: "getHeroIndexFromPanoId",
  19635. value: function getHeroIndexFromPanoId(e) {
  19636. for (var t = 0; t < this.model.heroLocations.length; t++) {
  19637. var i = this.model.heroLocations[t],
  19638. n = this.getHeroId(i);
  19639. if (n && n === e) return t;
  19640. }
  19641. return -1;
  19642. }
  19643. }, {
  19644. key: "getHeroPano",
  19645. value: function getHeroPano(e) {
  19646. if (null === e) return logger$1.warn('getHeroPano(): no destination'), null;
  19647. var t = this.getHeroId(e),
  19648. i = this.model.panos.get(t);
  19649. return void 0 === i && (i = null, '' !== t && logger$1.debug('unable to find pano "' + t + '"')), i;
  19650. }
  19651. }, {
  19652. key: "getHeroId",
  19653. value: function getHeroId(e) {
  19654. return e.panoId;
  19655. }
  19656. }, {
  19657. key: "setWarpDestPano",
  19658. value: function setWarpDestPano() {
  19659. return this.warpDestPano = this.getHeroPano(this.warpDestHeroLoc), this.warpDestPano;
  19660. }
  19661. /* brushToWarpPano(e,t){
  19662. if (this.discardPathObject(),
  19663. !this.setWarpDestPano())
  19664. return !1;
  19665. if (this.warpDestHeroLoc.cameraMode !== ViewMode.PANORAMA && logger.warn("Can only brush from pano to pano"),
  19666. !this.warpDestPano)
  19667. return logger.info("No brush"),
  19668. !1;
  19669. if (!this.player.currentPano)
  19670. return logger.debug("No current pano, visibility undefined"),
  19671. !1;
  19672. if (!this.warpDestPano)
  19673. return logger.info("No wPano, visibility undefined"),
  19674. !1;
  19675. if (!this.warpDestPano.isAligned())
  19676. return logger.debug("Cannot brush to unaligned pano"),
  19677. !1;
  19678. var i = (e === WarpStyle.STD || e === WarpStyle.WALK) && settings.path.mapGuides
  19679. , n = !0;
  19680. if (this.player.currentPano.id === this.warpDestPano.id)
  19681. logger.debug("Already at destination pano");
  19682. else {
  19683. this.nodes = this.findShortestPath(this.player.currentPano, this.warpDestPano),
  19684. n = void 0 === this.nodes || null === this.nodes || this.nodes.length < 1,
  19685. this.obj3d = new THREE.Object3D,
  19686. logger.debug('Brushing from "' + this.player.currentPano.id + '" to "' + this.warpDestPano.id + '" (' + (this.nodes ? this.nodes.length : 0) + ")"),
  19687. n ? (logger.info('No "walkable" route, using fall-back warp style transition'),
  19688. e = t) : (this.setPathHulls(this.nodes),
  19689. this.setFloorCurves(),
  19690. 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)))),
  19691. this.player.currentPano.floor.add(this.obj3d);
  19692. var o = this.player.mode === ViewMode.DOLLHOUSE || this.player.mode === ViewMode.FLOORPLAN
  19693. , s = e === WarpStyle.STD;
  19694. if (!n && (i || s)) {
  19695. if (o) {
  19696. var h = this.makeStartMarker(this.floorHull[0], this.floorCurvePoints);
  19697. this.obj3d.add(h)
  19698. }
  19699. var u = this.makeEndMarker(this.floorHull[this.floorHull.length - 1]);
  19700. this.obj3d.add(u)
  19701. }
  19702. this.appearSlow()
  19703. }
  19704. return this.upcomingTransType = e,
  19705. !n
  19706. } */
  19707. }, {
  19708. key: "findShortestPath",
  19709. value: function findShortestPath(e, t) {
  19710. if (!e || !t) return null;
  19711. var i = settings$3.warp.walkExtraPanosDistance,
  19712. n = e.id + ':' + t.id + ':' + i;
  19713. if (this.shortPaths.hasOwnProperty(n)) return this.shortPaths[n] ? this.shortPaths[n].slice() : null;
  19714. var r = t.id + ':' + e.id + ':' + i;
  19715. if (this.shortPaths.hasOwnProperty(r)) return this.shortPaths[r] ? this.shortPaths[r].slice().reverse() : null;
  19716. var o = this.model.panos.aStarSearch(e, t);
  19717. return this.model.panos.includeNodesNearPath(o, i), this.shortPaths[n] = o ? o.slice() : null, o;
  19718. }
  19719. }, {
  19720. key: "makePathHulls",
  19721. value: function makePathHulls(e) {
  19722. var t,
  19723. i,
  19724. n,
  19725. r,
  19726. o,
  19727. a = 0,
  19728. s = [],
  19729. l = [],
  19730. h = [],
  19731. u = this.model.panos;
  19732. t = u.get(e[0]), r = t.floor.floorIndex;
  19733. for (var d = 0; d < e.length; d += 1) {
  19734. 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));
  19735. }
  19736. return a > this.longestStep && (this.longestStep = a, logger$1.debug('path contains ' + a + ' meter segment')), {
  19737. floor: s,
  19738. camera: l,
  19739. color: h
  19740. };
  19741. }
  19742. }, {
  19743. key: "makeFloorCurves",
  19744. value: function makeFloorCurves(points, colors, i) {
  19745. var radius = this.player.mode === Viewmode$1.PANORAMA ? settings$3.path.waypointIndoorRadius : settings$3.path.waypointRadius,
  19746. distance = this.pointPathDistance(points) - 2 * radius,
  19747. s = points.slice(0),
  19748. l = s[1].clone().sub(s[0]);
  19749. 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);
  19750. var h = new THREE.CatmullRomCurve3(s),
  19751. u = Math.floor(distance / i);
  19752. u = 4 * Math.floor(u / 4), u = Math.max(4, u);
  19753. for (var d, p, f, g = h.getSpacedPoints(u), m = [], v = new THREE.Vector3(), A = 0; A < g.length; A += 1) {
  19754. f = 0, d = g[A].distanceTo(points[0]);
  19755. for (var y = 1; y < points.length; y += 1) {
  19756. v.copy(g[A]).sub(points[y]), v.y *= 4, p = v.length(), p < d && (f = y);
  19757. }
  19758. m.push(colors[f]);
  19759. }
  19760. return {
  19761. distance: distance,
  19762. points: g,
  19763. colors: m
  19764. };
  19765. }
  19766. }, {
  19767. key: "makeCameraCurvePoints",
  19768. value: function makeCameraCurvePoints(points, t) {
  19769. var distance = this.pointPathDistance(points),
  19770. n = new THREE.CatmullRomCurve3(points);
  19771. return n.getSpacedPoints(Math.max(2, Math.floor(distance / t)));
  19772. }
  19773. }, {
  19774. key: "setPathHulls",
  19775. value: function setPathHulls(e) {
  19776. var t = this.makePathHulls(e);
  19777. this.floorHull = t.floor, this.cameraHull = t.camera, this.colorHull = t.color;
  19778. }
  19779. }, {
  19780. key: "setFloorCurves",
  19781. value: function setFloorCurves() {
  19782. var e = this.makeFloorCurves(this.floorHull, this.colorHull, this.brushPrefs.paveStep);
  19783. this.floorPathDistance = e.distance, this.floorCurvePoints = e.points, this.floorCurveColors = e.colors;
  19784. }
  19785. }, {
  19786. key: "setCameraCurvePoints",
  19787. value: function setCameraCurvePoints() {
  19788. this.camCurvePoints = this.makeCameraCurvePoints(this.cameraHull, settings$3.warp.stepFactor * this.brushPrefs.paveStep);
  19789. }
  19790. }, {
  19791. key: "chooseWarpPath",
  19792. value: function chooseWarpPath(e) {
  19793. var t,
  19794. i,
  19795. n,
  19796. o = this.playerControls.cameras[Viewmode$1.PANORAMA];
  19797. if (this.player.currentPano === this.warpDestPano || !e) {
  19798. this.warpPathPoints = null;
  19799. this.warpLength = 0;
  19800. return !1;
  19801. }
  19802. this.nodes = this.findShortestPath(this.player.currentPano, this.warpDestPano);
  19803. this.setPathHulls(this.nodes);
  19804. if (void 0 === this.nodes || null === this.nodes || this.nodes.length < 1) {
  19805. logger$1.debug('warp path to unreachable node');
  19806. t = this.warpDestPano.position.clone().sub(o.position);
  19807. i = t.clone().negate();
  19808. t.multiplyScalar(0.15).add(o.position);
  19809. i.multiplyScalar(0.15).add(this.warpDestPano.position);
  19810. t.y = o.position.y;
  19811. i.y = this.warpDestPano.position.y;
  19812. n = new THREE.CubicBezierCurve3(o.position.clone(), t, i, this.warpDestPano.position.clone());
  19813. this.warpPathPoints = n.getSpacedPoints(this.brushPrefs.cvSegments);
  19814. } else {
  19815. logger$1.debug('follow warp path (path distance was ' + this.nodes.length + ' nodes, ' + this.floorPathDistance + ')');
  19816. this.setCameraCurvePoints();
  19817. this.warpPathPoints = this.camCurvePoints.slice(0);
  19818. }
  19819. this.warpLength = 0, this.warpPathLengths = [0];
  19820. 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) {
  19821. s.copy(this.warpPathPoints[d - 1]).sub(this.warpPathPoints[d]);
  19822. var p = s.length();
  19823. s.y *= settings$3.warp.climbEffort;
  19824. var f = s.length() / p;
  19825. if (d > 1) {
  19826. s.setY(0).normalize(), l.copy(this.warpPathPoints[d - 2]).sub(this.warpPathPoints[d - 1]).setY(0).normalize();
  19827. var g = Math.min(1, s.dot(l)),
  19828. m = 1 + (settings$3.warp.brakeStrength - 1) * (1 - THREE.MathUtils.smoothstep(g, u, h));
  19829. f = Math.max(m, f);
  19830. }
  19831. this.warpLength += p * f, this.warpPathLengths[d] = this.warpLength;
  19832. }
  19833. return !0;
  19834. }
  19835. }, {
  19836. key: "drawPathRibbon",
  19837. value: function drawPathRibbon(e, t) {
  19838. this.bunnyObj.visible = settings$3.warp.showBunny;
  19839. 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) {
  19840. 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);
  19841. var d = new THREE.Vector3().copy(e[u]).add(o);
  19842. d.sub(n), l.vertices.push(d), d = new THREE.Vector3().copy(e[u]).add(o), d.add(n), l.vertices.push(d);
  19843. }
  19844. var p,
  19845. f = 0;
  19846. for (u = 0; u < e.length - 1; u += 1) {
  19847. var g = 2 * u,
  19848. v = f;
  19849. f += e[u + 1].distanceTo(e[u]);
  19850. var y = f,
  19851. C = t[u],
  19852. I = t[u + 1];
  19853. 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)]);
  19854. }
  19855. l.computeFaceNormals(), l.computeVertexNormals();
  19856. var E, b;
  19857. 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({
  19858. side: THREE.DoubleSide,
  19859. depthWrite: !1,
  19860. transparent: !0,
  19861. vertexShader: shaders.ribbon.vertexShader,
  19862. fragmentShader: shaders.ribbon.fragmentShader,
  19863. uniforms: b,
  19864. name: 'ribbonT',
  19865. opacity: 0
  19866. })) : E = new THREE.MeshBasicMaterial({
  19867. color: 16777215,
  19868. side: THREE.DoubleSide,
  19869. name: 'ribbonOut',
  19870. vertexColors: THREE.VertexColors
  19871. });
  19872. var _ = new THREE.Mesh(l, E);
  19873. return _.name = 'ribbon', this.player.mode === Viewmode$1.PANORAMA && (_.renderOrder = RenderOrder.ribbon), _;
  19874. }
  19875. }, {
  19876. key: "drawPathPavement",
  19877. value: function drawPathPavement(e) {
  19878. 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) {
  19879. 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);
  19880. }
  19881. var h, u, d;
  19882. for (l = 0; l < e.length - 1; l += 1) {
  19883. 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)]);
  19884. }
  19885. var p = this.player.mode === Viewmode$1.PANORAMA ? new THREE.MeshBasicMaterial({
  19886. color: settings$3.path.color,
  19887. side: THREE.DoubleSide,
  19888. transparent: !0,
  19889. depthWrite: !1,
  19890. opacity: 0,
  19891. name: 'paveT',
  19892. map: this.pathImg.path
  19893. }) : new THREE.MeshBasicMaterial({
  19894. color: settings$3.path.color,
  19895. side: THREE.DoubleSide,
  19896. transparent: !0,
  19897. depthWrite: !1,
  19898. opacity: 1,
  19899. name: 'paveO',
  19900. map: this.pathImg.path
  19901. });
  19902. return new THREE.Mesh(o, p);
  19903. }
  19904. }, {
  19905. key: "makeWaypointObj",
  19906. value: function makeWaypointObj(e, t) {
  19907. var n = this.player.mode === Viewmode$1.PANORAMA ? settings$3.path.waypointIndoorRadius : settings$3.path.waypointRadius,
  19908. o = this.pathHeight(),
  19909. 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))
  19910. // i.setAttribute('uv', new THREE.BufferAttribute(new Float32Array([0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0], 0, 2), 2))
  19911. // i.setIndex(new THREE.BufferAttribute(new Uint32Array([0, 1, 2, 2, 3, 0], 0, 1), 1))
  19912. var s = THREE.UniformsUtils.clone(shaders.waypoint.uniforms);
  19913. s.map.value = e, s.opacity.value = 0, s.color.value.set(settings$3.path.color);
  19914. var l = {
  19915. side: THREE.DoubleSide,
  19916. depthWrite: !1,
  19917. depthTest: false,
  19918. //许钟文 加
  19919. transparent: !0,
  19920. vertexShader: shaders.waypoint.vertexShader,
  19921. fragmentShader: shaders.waypoint.fragmentShader,
  19922. uniforms: s,
  19923. name: 'waypoint',
  19924. opacity: 0
  19925. };
  19926. this.player.mode !== Viewmode$1.PANORAMA && (l.depthTest = !1, l.name = 'wayPtOut');
  19927. var h = new THREE.RawShaderMaterial(l),
  19928. u = new THREE.Mesh(i, h);
  19929. u.renderOrder = RenderOrder.ribbon + 1; // .panoMarker ////许钟文加 否则在编辑模型时会时隐时现
  19930. return u.name = t, u;
  19931. }
  19932. }, {
  19933. key: "makeStartMarker",
  19934. value: function makeStartMarker(e, t) {
  19935. var i = new THREE.Vector3().copy(t[1]).sub(t[0]);
  19936. i.y = 0, i.normalize();
  19937. var n = Math.acos(i.x),
  19938. o = this.makeWaypointObj(this.pathImg.pathStart, 'Start');
  19939. return o.rotateOnAxis(new THREE.Vector3(0, 1, 0), n), o.position.copy(e), o;
  19940. }
  19941. }, {
  19942. key: "makeEndMarker",
  19943. value: function makeEndMarker(e) {
  19944. var t = this.makeWaypointObj(this.pathImg.pathEnd, 'End'),
  19945. i = this.model.panos.get(this.nodes[0]).floor.floorIndex,
  19946. n = this.model.panos.get(this.nodes[this.nodes.length - 1]).floor.floorIndex;
  19947. 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;
  19948. }
  19949. }, {
  19950. key: "pathClean",
  19951. value: function pathClean(e) {
  19952. if (e) {
  19953. for (var t in e.children) {
  19954. this.pathClean(e.children[t]);
  19955. }
  19956. e.geometry && e.geometry.dispose(), e.material && e.material.dispose();
  19957. }
  19958. }
  19959. }, {
  19960. key: "discardPathObject",
  19961. value: function discardPathObject() {
  19962. if (this.obj3d) {
  19963. var e = this.obj3d.parent;
  19964. e && e.remove(this.obj3d), this.pathClean(this.obj3d);
  19965. }
  19966. this.obj3d = null, this.popInCpm();
  19967. }
  19968. }, {
  19969. key: "discardSlow",
  19970. value: function discardSlow() {
  19971. if (this.obj3d) {
  19972. if (this.player.mode !== Viewmode$1.PANORAMA) return void this.discardPathObject();
  19973. for (var e, t = this, i = 0, n = function () {
  19974. this.discardPathObject();
  19975. }.bind(this), r = 0; r < t.obj3d.children.length; r += 1) {
  19976. 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);
  19977. }
  19978. 0 === i && this.discardPathObject(), this.player.mode !== Viewmode$1.PANORAMA && this.fadeInCpm(settings$3.path.fadeInTime - 3);
  19979. }
  19980. }
  19981. }, {
  19982. key: "appearSlow",
  19983. value: function appearSlow() {
  19984. var e,
  19985. t = this;
  19986. this.fadeOutCpm(settings$3.path.fadeInTime);
  19987. for (var i = this.player.mode === Viewmode$1.PANORAMA ? settings$3.path.opacity : 1, n = 0; n < t.obj3d.children.length; n += 1) {
  19988. 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]));
  19989. }
  19990. }
  19991. }, {
  19992. key: "update",
  19993. value: function update() {
  19994. this.obj3d && this.obj3d.updateMatrixWorld();
  19995. }
  19996. }, {
  19997. key: "calcBurnsAmount",
  19998. value: function calcBurnsAmount(e) {
  19999. var t = THREE.MathUtils.degToRad(settings$3.warp.burnsAngle);
  20000. if (this.player.mode === Viewmode$1.PANORAMA) {
  20001. var i = this.burnsDir * t;
  20002. if (this.upcomingTransType === WarpStyle.BLACK) return i;
  20003. var n = e;
  20004. if (null === n) return logger$1.warn('Transition request for non-highlight'), i;
  20005. var o = this.getHeroDescriptorByHeroIndex(n);
  20006. if (null === o) return i;
  20007. if (!o.isPano()) return i;
  20008. var s = this.getHeroPano(o),
  20009. h = this.playerControls.cameras[Viewmode$1.PANORAMA],
  20010. u = Vectors$1.FORWARD.clone().applyQuaternion(h.quaternion).setY(0).normalize(),
  20011. d = Math.min(THREE.MathUtils.degToRad(settings$3.warp.minBurnsAngle), t),
  20012. p = function p(e) {
  20013. var i = Math.acos(Math.min(1, e.dot(u))),
  20014. n = new THREE.Vector3().crossVectors(u, e);
  20015. return Math.max(d, Math.min(Math.abs(i), t)) * Math.sign(n.y);
  20016. };
  20017. if (s === this.player.currentPano) return i = p(Vectors$1.FORWARD.clone().applyQuaternion(o.quaternion).setY(0).normalize());
  20018. var f = this.findShortestPath(this.player.currentPano, s);
  20019. if (void 0 === f || null === f || f.length < 1) return logger$1.debug('Empty path ahead...'), i;
  20020. var g = this.makePathHulls(f),
  20021. m = new THREE.CatmullRomCurve3(g.camera),
  20022. v = Math.min(0.1, settings$3.warp.lookAheadDist / m.getLength());
  20023. return i = p(m.getPointAt(v).clone().sub(h.position).setY(0).normalize());
  20024. }
  20025. return this.player.mode === Viewmode$1.DOLLHOUSE ? 0.02 * this.burnsDir : this.burnsDir;
  20026. }
  20027. }, {
  20028. key: "waitNextStep",
  20029. value: function waitNextStep(e, t) {
  20030. var i = settings$3.warp.tourStepDelay;
  20031. i || (i = this.lastTransType === WarpStyle.BLACK ? constants.tourStepDelaySlideShow : constants.tourStepDelayDefault);
  20032. var n = new THREE.Euler(),
  20033. o = new THREE.Vector3();
  20034. logger$1.debug('Starting wait: ' + (void 0 !== t));
  20035. var s = this.calcBurnsAmount(e),
  20036. h = function () {
  20037. this.endWarpState(), this.player.mode === Viewmode$1.DOLLHOUSE && (this.playerControls.cameras[Viewmode$1.DOLLHOUSE].controls.rotationAcceleration.x = 0), t && t();
  20038. }.bind(this),
  20039. u = function (e, t) {
  20040. if (this.warpInterrupted) return h(), !0;
  20041. var r = t || 1e3 / 60;
  20042. if (settings$3.warp.doBurns) if (this.player.mode === Viewmode$1.PANORAMA) {
  20043. var camera = this.playerControls.cameras[Viewmode$1.PANORAMA];
  20044. n.setFromQuaternion(WarpcameraStyle.quaternion, settings$3.warp.eOrder);
  20045. var u = r * s / i;
  20046. 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);
  20047. } 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;
  20048. }.bind(this);
  20049. this.startWarpState(), transitions$1.start(u, i, h, 0, easing.easeInOutQuad, 'wait');
  20050. }
  20051. }, {
  20052. key: "warpToNonPano",
  20053. value: function warpToNonPano(e) {
  20054. if (this.discardPathObject(), this.warpDestHeroLoc.cameraMode === Viewmode$1.DOLLHOUSE || this.warpDestHeroLoc.cameraMode === Viewmode$1.FLOORPLAN) {
  20055. var t = function () {
  20056. e && e();
  20057. }.bind(this);
  20058. this.player.flyToNewMode({
  20059. mode: this.warpDestHeroLoc.cameraMode,
  20060. duration: settings$3.warp.outsideTime,
  20061. warpDest: this.warpDestHeroLoc,
  20062. callback: t,
  20063. force: !0
  20064. });
  20065. } else logger$1.warn('no warp destination!!!'), e && e();
  20066. }
  20067. }, {
  20068. key: "_resetWarpShaderParams",
  20069. value: function _resetWarpShaderParams(e) {
  20070. 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));
  20071. }
  20072. }, {
  20073. key: "_clearWarpShading",
  20074. value: function _clearWarpShading() {
  20075. for (var e = this.model.chunks, t = 0; t < e.length; t += 1) {
  20076. this._resetWarpShaderParams(e[t]), e[t].visible = !0;
  20077. }
  20078. this._resetWarpShaderParams(this.model.skybox);
  20079. }
  20080. }, {
  20081. key: "_warpStopFlying",
  20082. value: function _warpStopFlying() {
  20083. this.activeTransType = null, this.placeCpm();
  20084. }
  20085. }, {
  20086. key: "_wrapupTravelOnlyBits",
  20087. value: function _wrapupTravelOnlyBits() {
  20088. this._warpStopFlying(), this.warpPathPoints && (this.player.currentPano.exit(), this.warpDestPano.enter(), this.player.currentPano = this.warpDestPano), //this.player.spider.draw(),
  20089. this.placeCpm();
  20090. }
  20091. }, {
  20092. key: "_wrapupTravel",
  20093. value: function _wrapupTravel(e) {
  20094. this._wrapupTravelOnlyBits(), this.warpCameraAim(e);
  20095. }
  20096. }, {
  20097. key: "_wrapupWarpShading",
  20098. value: function _wrapupWarpShading(e) {
  20099. this._clearWarpShading(), this._wrapupTravel(e);
  20100. }
  20101. }, {
  20102. key: "wrapupWarpShadingOnly",
  20103. value: function wrapupWarpShadingOnly(e, t) {
  20104. t !== BlackoutStyle$1.END && this._clearWarpShading(), this._wrapupTravelOnlyBits(), this.upcomingTransType = null, e && e();
  20105. }
  20106. }, {
  20107. key: "_warpCameraAim",
  20108. value: function _warpCameraAim(e, t) {
  20109. var i = this.warpDestHeroLoc.quaternion,
  20110. n = this.playerControls.cameras[Viewmode$1.PANORAMA],
  20111. o = new THREE.Vector3(0, 0, 1).applyQuaternion(i).normalize(),
  20112. s = new THREE.Vector3(0, 0, 1).applyQuaternion(n.quaternion).normalize(),
  20113. l = s.dot(o),
  20114. u = THREE.MathUtils.radToDeg(Math.acos(l)),
  20115. f = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(i, settings$3.warp.eOrder),
  20116. g = new THREE.Euler().setFromQuaternion(n.quaternion, settings$3.warp.eOrder),
  20117. m = new THREE.Euler(f.x - g.x, f.y - g.y, f.z - g.z, settings$3.warp.eOrder);
  20118. m.y = math$2.constrainedTurn(m.y), this.burnsDir = Math.sign(m.y);
  20119. var v = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
  20120. A = new THREE.Vector3(),
  20121. C = function (e, t) {
  20122. 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));
  20123. }.bind(this);
  20124. if (u > settings$3.warp.minRotation) {
  20125. return transitions$1.start(C, e, t, 0, easing[settings$3.warp.movementEasing]);
  20126. } else {
  20127. logger$1.debug('Aim angle only is ' + u.toPrecision(3) + ' degrees, skipping explicit re-aim');
  20128. return void (t && t());
  20129. }
  20130. }
  20131. }, {
  20132. key: "_warpBendAim",
  20133. value: function _warpBendAim(e, t, i, n) {
  20134. var o = n || 0,
  20135. s = this.playerControls.cameras[Viewmode$1.PANORAMA],
  20136. l = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
  20137. u = new THREE.Euler().setFromQuaternion(s.quaternion, settings$3.warp.eOrder),
  20138. f = new THREE.Euler(l.x - u.x, l.y - u.y, l.z - u.z, settings$3.warp.eOrder);
  20139. f.y = math$2.constrainedTurn(f.y);
  20140. var g = Math.min(THREE.MathUtils.degToRad(settings$3.warp.softBendTilt), Math.abs(f.x));
  20141. 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;
  20142. var m = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
  20143. v = new THREE.Vector3(),
  20144. A = function (e, t) {
  20145. 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 {
  20146. var i = (1 - e) * settings$3.warp.softBendEnd;
  20147. m.x = l.x - i * f.x, m.y = l.y - i * f.y, m.z = l.z - i * f.z;
  20148. }
  20149. v.set(0, 0, -1), v.applyEuler(m), v.add(s.position), s.controls.lookAt(v), s.controls.lookVector.copy(v), s.lookAt(v);
  20150. }.bind(this);
  20151. return transitions$1.start(A, t, i, o, easing[settings$3.warp.movementEasing]);
  20152. }
  20153. }, {
  20154. key: "_warpStepCameraAim",
  20155. value: function _warpStepCameraAim(e, t, i) {
  20156. var n = this.playerControls.cameras[Viewmode$1.PANORAMA],
  20157. o = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
  20158. s = new THREE.Euler().setFromQuaternion(n.quaternion, settings$3.warp.eOrder),
  20159. l = new THREE.Euler(o.x - s.x, o.y - s.y, o.z - s.z, settings$3.warp.eOrder);
  20160. l.y = math$2.constrainedTurn(l.y), this.burnsDir = Math.sign(l.y);
  20161. var u = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
  20162. f = new THREE.Vector3(),
  20163. g = function (e, t) {
  20164. 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);
  20165. }.bind(this);
  20166. return transitions$1.start(g, t, i, 0, easing[settings$3.warp.movementEasing]);
  20167. }
  20168. }, {
  20169. key: "setBurnsDir",
  20170. value: function setBurnsDir() {
  20171. var e = this.playerControls.cameras[Viewmode$1.PANORAMA],
  20172. t = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
  20173. i = new THREE.Euler().setFromQuaternion(e.quaternion, settings$3.warp.eOrder),
  20174. n = new THREE.Euler(t.x - i.x, t.y - i.y, t.z - i.z, settings$3.warp.eOrder);
  20175. n.y = math$2.constrainedTurn(n.y), this.burnsDir = Math.sign(n.y);
  20176. }
  20177. }, {
  20178. key: "stepWarpPath",
  20179. value: function stepWarpPath(firstPos, e
  20180. /* t */
  20181. ) {
  20182. //black过渡时的camera位置过渡
  20183. var i = this.playerControls.cameras[Viewmode$1.PANORAMA];
  20184. var n = this.warpPathPoints ? this.warpPathPoints[0] : firstPos; //xzw add firstPos
  20185. if (!n) {
  20186. return i.position.copy(this.warpDestPano.position), !0;
  20187. }
  20188. /* if (!this.warpPathPoints) {
  20189. i.position.copy(this.warpDestPano.position)
  20190. return !0
  20191. } */
  20192. var o = this.warpDestPano.position;
  20193. if (null !== this.nodes && this.cameraHull && this.cameraHull.length > 1) {
  20194. var s = new THREE.Vector3();
  20195. 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);
  20196. i.position.copy(s);
  20197. } else {
  20198. e < 0.5 ? i.position.copy(n) : i.position.copy(o);
  20199. }
  20200. }
  20201. }, {
  20202. key: "interruptAndFastForward",
  20203. value: function interruptAndFastForward(e, t) {
  20204. 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));
  20205. }
  20206. }, {
  20207. key: "warpCameraAim",
  20208. value: function warpCameraAim(e) {
  20209. var t = settings$3.warp.minWarpTime;
  20210. if (this.upcomingTransType === WarpStyle.BLACK) t = settings$3.warp.teleportTime;else {
  20211. var i = this.playerControls.cameras[Viewmode$1.PANORAMA],
  20212. n = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder).setFromQuaternion(this.warpDestHeroLoc.quaternion, settings$3.warp.eOrder),
  20213. o = new THREE.Euler().setFromQuaternion(i.quaternion, settings$3.warp.eOrder),
  20214. s = new THREE.Euler(n.x - o.x, n.y - o.y, n.z - o.z, settings$3.warp.eOrder);
  20215. s.y = math$2.constrainedTurn(s.y);
  20216. var u = 1e3 * Math.abs(s.y) / THREE.MathUtils.degToRad(settings$3.warp.maxAimPerSec);
  20217. t = Math.max(t, u);
  20218. }
  20219. var d = function () {
  20220. this._warpStopFlying(), this.discardSlow(), e && e();
  20221. }.bind(this);
  20222. this._warpCameraAim(t, d);
  20223. }
  20224. }, {
  20225. key: "warpCommonParameters",
  20226. value: function warpCommonParameters(e, t, i, n) {
  20227. this.model.skybox.material.uniforms.blackout.value = n;
  20228. var r = lerp.uniform(this.model.skybox, 'progress', 1),
  20229. o = lerp.allUniforms(this.model.chunks, 'progress', 1),
  20230. a = !1,
  20231. s = function () {
  20232. if (this.warpInterrupted) return a = !0, !0;
  20233. }.bind(this),
  20234. l = function (e, t) {
  20235. return i && a ? (this.model.skybox.material.uniforms.progress.value = 0, !0) : void r(e, t);
  20236. }.bind(this),
  20237. h = function (e, t) {
  20238. return i && a ? (o(0), !0) : void o(e, t);
  20239. }.bind(this);
  20240. 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');
  20241. }
  20242. }, {
  20243. key: "warpTravel_STD",
  20244. value: function warpTravel_STD(e) {
  20245. var t,
  20246. i = Math.min(settings$3.warp.lookAheadMax, settings$3.warp.lookAheadDist / this.warpLength),
  20247. n = this.playerControls.cameras[a.PANORAMA],
  20248. o = (Math.min(0.25, 3 / this.warpLength), Math.min(0.35, 7 / this.warpLength)),
  20249. s = new THREE.Euler(0, 0, 0, settings$3.warp.eOrder),
  20250. f = new THREE.Vector3(),
  20251. m = new THREE.Euler().setFromQuaternion(n.quaternion, settings$3.warp.eOrder),
  20252. v = new THREE.Euler().copy(m),
  20253. C = n.position.clone(),
  20254. E = new THREE.Matrix4(),
  20255. b = new THREE.Euler(),
  20256. w = settings$3.warp.minWarpTime;
  20257. w += this.warpLength * settings$3.warp.timePerMeter, settings$3.warp.flySpeed > 0.01 && (w = 1e3 * this.warpLength / settings$3.warp.flySpeed);
  20258. var _ = !1,
  20259. T = this.warpDestHeroLoc.quaternion,
  20260. x = new THREE.Vector3(0, 0, -1).applyQuaternion(T).normalize(),
  20261. S = this.warpPathPoints[this.warpPathPoints.length - 1].clone().sub(this.warpPathPoints[this.warpPathPoints.length - 2]).normalize(),
  20262. M = S.dot(x),
  20263. R = THREE.MathUtils.radToDeg(Math.acos(M)),
  20264. P = function P(e) {
  20265. var t = o,
  20266. i = THREE.MathUtils.smoothstep(e, 0, t) * (1 - THREE.MathUtils.smoothstep(e, 1 - t, 1));
  20267. return i;
  20268. },
  20269. O = function () {
  20270. 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$2.constrainedTurn(b.y);
  20271. }.bind(this),
  20272. L = function (e, t) {
  20273. if (this.warpInterrupted) return _ = !0, !0;
  20274. }.bind(this),
  20275. D = function (e, t) {
  20276. return _ || !this.warpPathPoints ? (effects.blur(0), !0) : void effects.blur(e);
  20277. }.bind(this),
  20278. N = lerp.allUniforms(this.model.chunks, 'modelAlpha', 1),
  20279. B = function (e, t) {
  20280. return _ || !this.warpPathPoints ? (N(0), !0) : void N(e, t);
  20281. }.bind(this),
  20282. F = function (e, t) {
  20283. if (!this.warpPathPoints) return n.position.copy(this.warpDestPano.position), !0;
  20284. if (_) return !0;
  20285. var i = this.interpAlongPath(this.warpPathPoints, this.warpPathLengths, e);
  20286. n.position.copy(i), C = this.interpAlongPath(this.warpPathPoints, this.warpPathLengths, 0.99 * e);
  20287. }.bind(this),
  20288. V = function (e, n) {
  20289. return this.warpPathPoints ? !!_ || void (t = this.interpAlongPath(this.warpPathPoints, this.warpPathLengths, Math.min(e + i, 1))) : (logger$1.debug('Lost bunny.'), !0);
  20290. }.bind(this),
  20291. U = function (e, o) {
  20292. if (_) return logger$1.debug('>>>> Walkthrough interupted at t=' + e), !0;
  20293. if (!this.warpPathPoints) return !0;
  20294. var a = this.warpLength * e,
  20295. l = THREE.MathUtils.smoothstep(a, 0, this.brushPrefs.lookBlendDist),
  20296. u = THREE.MathUtils.smoothstep(a, this.warpLength - this.brushPrefs.lookBlendDist, this.warpLength);
  20297. 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$2.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$2.constrainedTurn(b.y);
  20298. var d = THREE.MathUtils.degToRad(settings$3.warp.maxTurnPerSec) * o / 1e3;
  20299. 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);
  20300. var p = t.clone().sub(C).normalize();
  20301. if (R < settings$3.warp.maxAimRotation && u > 0) {
  20302. var g = 1 - u;
  20303. 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();
  20304. }
  20305. 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));
  20306. }.bind(this),
  20307. k = function () {
  20308. _ ? (this.discardSlow(), this.upcomingTransType = l.BLACK, this.warpTravel_BLACK(-0.5, this.warpInterruptionTravelTime, BlackoutStyle$1.BEGINNING, e)) : this._wrapupWarpShading(e);
  20309. }.bind(this);
  20310. V(0);
  20311. var H = settings$3.warp.motionLeadTime + 1e3 * Math.abs(O()) / THREE.MathUtils.degToRad(settings$3.warp.maxTurnPerSec);
  20312. w += H;
  20313. var G = H / w;
  20314. 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');
  20315. }
  20316. }, {
  20317. key: "warpTravel_BLACK",
  20318. value: function warpTravel_BLACK(e, t, i, n) {
  20319. this.player.model.floorLogos.firstLogo.visible = false;
  20320. this.player.model.floorLogos.secondLogo.visible = false; //this.player.tagManager.hideAllTags();
  20321. var r = e || 0;
  20322. void 0 !== t && null !== t || (t = settings$3.warp.teleportTime), this.warpCommonParameters(t, r, !1, i), this.model.chunks.forEach(function (e) {
  20323. e.material.uniforms.blackout.value = i;
  20324. }), this._warpBendAim(null, t, null, r);
  20325. var o = function () {
  20326. this.wrapupWarpShadingOnly(n, i);
  20327. }.bind(this);
  20328. var firstPos = this.player.position.clone(); //add
  20329. transitions$1.start(this.stepWarpPath.bind(this, firstPos), t, o, r, easing[settings$3.warp.blendEasing], 'stepMotion');
  20330. }
  20331. }, {
  20332. key: "makeWalkFlightFunc",
  20333. value: function makeWalkFlightFunc(e, t, i) {
  20334. return this.flightStepWalk.bind(this, e, t, i);
  20335. }
  20336. }, {
  20337. key: "getOrientationForWalkingTourNode",
  20338. value: function getOrientationForWalkingTourNode(e, t, i) {
  20339. var n = e.length;
  20340. if (t >= n) return !1;
  20341. if (t === n - 1) i.copy(Vectors$1.FORWARD).applyQuaternion(this.warpDestHeroLoc.quaternion);else {
  20342. var r = this.player.model.panos.get(e[t]),
  20343. o = this.player.model.panos.get(e[t + 1]);
  20344. i.copy(o.position).sub(r.position);
  20345. }
  20346. return i.normalize(), !0;
  20347. }
  20348. }, {
  20349. key: "warpCameraTravel",
  20350. value: function warpCameraTravel(e, t, i, n) {
  20351. if (this.activeTransType = this.upcomingTransType, this.lastTransType = this.activeTransType, this.upcomingTransType = null, !e) {
  20352. var r = function () {
  20353. this._wrapupTravel(n);
  20354. }.bind(this),
  20355. o = {
  20356. pano: this.warpDestPano,
  20357. lookAtPoint: null,
  20358. duration: null,
  20359. maxDistanceOverride: null,
  20360. skipWarpingCheck: !1
  20361. };
  20362. return void this.player.flyToPano(o, r);
  20363. }
  20364. this.activeTransType === WarpStyle.BLACK ? this.warpTravel_BLACK(null, i, t, n) : this.activeTransType === WarpStyle.WALK ? this.warpTravel_WALK(function () {
  20365. this._clearWarpShading(), this._warpStopFlying(), this.player.spider.draw(), this.placeCpm(), n && n();
  20366. }.bind(this)) : this.warpTravel_STD(n);
  20367. }
  20368. }, {
  20369. key: "startWarpState",
  20370. value: function startWarpState() {
  20371. this.warping = !0, this.warpInterrupted = !1, this.warpInterruptionBlackoutStyle = null, this.warpInterruptionTravelTime = null;
  20372. }
  20373. }, {
  20374. key: "endWarpState",
  20375. value: function endWarpState() {
  20376. this.warping = !1;
  20377. }
  20378. }, {
  20379. key: "warpToPano",
  20380. value: function warpToPano(e, t, i, n) {
  20381. if (this.warping) return void logger$1.warn('Cannot warp when already warping');
  20382. if (this.upcomingTransType = e, this.activeTransType = null, !this.setWarpDestPano()) return this.upcomingTransType = null, void this.warpToNonPano(n);
  20383. if (this.player.mode !== Viewmode$1.PANORAMA) return this.upcomingTransType = null, this.discardSlow(), void this.player.flyToNewMode({
  20384. mode: Viewmode$1.PANORAMA,
  20385. pano: this.warpDestPano,
  20386. duration: settings$3.warp.outsideTime,
  20387. warpDest: this.warpDestHeroLoc,
  20388. callback: n,
  20389. force: !0
  20390. });
  20391. if (!this.warpDestPano) return logger$1.warn('no warp destination, callback dropped'), void (this.upcomingTransType = null);
  20392. 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),
  20393. o = this.chooseWarpPath(r);
  20394. if (o && this.upcomingTransType !== WarpStyle.WALK) {
  20395. var s = function () {
  20396. this.waitingToWarp = !1, this.warpToPano(e, t, i, n);
  20397. }.bind(this);
  20398. if (this.player.checkAndWaitForPanoLoad(this.warpDestPano, 'high', 'low', this.player.basePanoSize, s)) return void (this.waitingToWarp = !0);
  20399. }
  20400. 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);
  20401. if (this.upcomingTransType !== WarpStyle.WALK) {
  20402. this.player.emit(PlayerEvents.PanoChosen, this.player.currentPano, this.warpDestPano);
  20403. }
  20404. this.startWarpState();
  20405. var h = function () {
  20406. this.endWarpState(), n && n();
  20407. }.bind(this);
  20408. o ? this.warpCameraTravel(r, t, i, h) : this.warpCameraAim(h);
  20409. this.player.smoothZoomToDefault(settings$3.zoom.restoreTime);
  20410. }
  20411. }]);
  20412. return ShowPath;
  20413. }();
  20414. var ZoomEvents = {
  20415. ZoomIn: 'zoom.in',
  20416. ZoomOut: 'zoom.out',
  20417. ZoomMax: 'zoom.max',
  20418. ZoomMin: 'zoom.min'
  20419. };
  20420. 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); }; }
  20421. 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; } }
  20422. var _taskCache$1 = new WeakMap();
  20423. var DRACOLoader = /*#__PURE__*/function (_Loader) {
  20424. _inherits(DRACOLoader, _Loader);
  20425. var _super = _createSuper$1w(DRACOLoader);
  20426. function DRACOLoader(manager) {
  20427. var _this;
  20428. _classCallCheck(this, DRACOLoader);
  20429. _this = _super.call(this, manager);
  20430. _this.decoderPath = '';
  20431. _this.decoderConfig = {};
  20432. _this.decoderBinary = null;
  20433. _this.decoderPending = null;
  20434. _this.workerLimit = 4;
  20435. _this.workerPool = [];
  20436. _this.workerNextTaskID = 1;
  20437. _this.workerSourceURL = '';
  20438. _this.defaultAttributeIDs = {
  20439. position: 'POSITION',
  20440. normal: 'NORMAL',
  20441. color: 'COLOR',
  20442. uv: 'TEX_COORD'
  20443. };
  20444. _this.defaultAttributeTypes = {
  20445. position: 'Float32Array',
  20446. normal: 'Float32Array',
  20447. color: 'Float32Array',
  20448. uv: 'Float32Array'
  20449. };
  20450. return _this;
  20451. }
  20452. _createClass(DRACOLoader, [{
  20453. key: "setDecoderPath",
  20454. value: function setDecoderPath(path) {
  20455. this.decoderPath = path;
  20456. return this;
  20457. }
  20458. }, {
  20459. key: "setDecoderConfig",
  20460. value: function setDecoderConfig(config) {
  20461. this.decoderConfig = config;
  20462. return this;
  20463. }
  20464. }, {
  20465. key: "setWorkerLimit",
  20466. value: function setWorkerLimit(workerLimit) {
  20467. this.workerLimit = workerLimit;
  20468. return this;
  20469. }
  20470. }, {
  20471. key: "load",
  20472. value: function load(url, onLoad, onProgress, onError) {
  20473. var _this2 = this;
  20474. var loader = new THREE$1.FileLoader(this.manager);
  20475. loader.setPath(this.path);
  20476. loader.setResponseType('arraybuffer');
  20477. loader.setRequestHeader(this.requestHeader);
  20478. loader.setWithCredentials(this.withCredentials);
  20479. loader.load(url, function (buffer) {
  20480. _this2.decodeDracoFile(buffer, onLoad).catch(onError);
  20481. }, onProgress, onError);
  20482. }
  20483. }, {
  20484. key: "decodeDracoFile",
  20485. value: function decodeDracoFile(buffer, callback, attributeIDs, attributeTypes) {
  20486. var taskConfig = {
  20487. attributeIDs: attributeIDs || this.defaultAttributeIDs,
  20488. attributeTypes: attributeTypes || this.defaultAttributeTypes,
  20489. useUniqueIDs: !!attributeIDs
  20490. };
  20491. return this.decodeGeometry(buffer, taskConfig).then(callback);
  20492. }
  20493. }, {
  20494. key: "decodeGeometry",
  20495. value: function decodeGeometry(buffer, taskConfig) {
  20496. var _this3 = this;
  20497. var taskKey = JSON.stringify(taskConfig); // Check for an existing task using this buffer. A transferred buffer cannot be transferred
  20498. // again from this thread.
  20499. if (_taskCache$1.has(buffer)) {
  20500. var cachedTask = _taskCache$1.get(buffer);
  20501. if (cachedTask.key === taskKey) {
  20502. return cachedTask.promise;
  20503. } else if (buffer.byteLength === 0) {
  20504. // Technically, it would be possible to wait for the previous task to complete,
  20505. // transfer the buffer back, and decode again with the second configuration. That
  20506. // is complex, and I don't know of any reason to decode a Draco buffer twice in
  20507. // different ways, so this is left unimplemented.
  20508. throw new Error('THREE.DRACOLoader: Unable to re-decode a buffer with different ' + 'settings. Buffer has already been transferred.');
  20509. }
  20510. } //
  20511. var worker;
  20512. var taskID = this.workerNextTaskID++;
  20513. var taskCost = buffer.byteLength; // Obtain a worker and assign a task, and construct a geometry instance
  20514. // when the task completes.
  20515. var geometryPending = this._getWorker(taskID, taskCost).then(function (_worker) {
  20516. worker = _worker;
  20517. return new Promise(function (resolve, reject) {
  20518. worker._callbacks[taskID] = {
  20519. resolve,
  20520. reject
  20521. };
  20522. worker.postMessage({
  20523. type: 'decode',
  20524. id: taskID,
  20525. taskConfig,
  20526. buffer
  20527. }, [buffer]); // this.debug();
  20528. });
  20529. }).then(function (message) {
  20530. return _this3._createGeometry(message.geometry);
  20531. }); // Remove task from the task list.
  20532. // Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)
  20533. geometryPending.catch(function () {
  20534. return true;
  20535. }).then(function () {
  20536. if (worker && taskID) {
  20537. _this3._releaseTask(worker, taskID); // this.debug();
  20538. }
  20539. }); // Cache the task result.
  20540. _taskCache$1.set(buffer, {
  20541. key: taskKey,
  20542. promise: geometryPending
  20543. });
  20544. return geometryPending;
  20545. }
  20546. }, {
  20547. key: "_createGeometry",
  20548. value: function _createGeometry(geometryData) {
  20549. var geometry = new THREE$1.BufferGeometry();
  20550. if (geometryData.index) {
  20551. geometry.setIndex(new THREE$1.BufferAttribute(geometryData.index.array, 1));
  20552. }
  20553. for (var i = 0; i < geometryData.attributes.length; i++) {
  20554. var attribute = geometryData.attributes[i];
  20555. var name = attribute.name;
  20556. var array = attribute.array;
  20557. var itemSize = attribute.itemSize;
  20558. geometry.setAttribute(name, new THREE$1.BufferAttribute(array, itemSize));
  20559. }
  20560. return geometry;
  20561. }
  20562. }, {
  20563. key: "_loadLibrary",
  20564. value: function _loadLibrary(url, responseType) {
  20565. var loader = new THREE$1.FileLoader(this.manager);
  20566. loader.setPath(this.decoderPath);
  20567. loader.setResponseType(responseType);
  20568. loader.setWithCredentials(this.withCredentials);
  20569. return new Promise(function (resolve, reject) {
  20570. loader.load(url, resolve, undefined, reject);
  20571. });
  20572. }
  20573. }, {
  20574. key: "preload",
  20575. value: function preload() {
  20576. this._initDecoder();
  20577. return this;
  20578. }
  20579. }, {
  20580. key: "_initDecoder",
  20581. value: function _initDecoder() {
  20582. var _this4 = this;
  20583. if (this.decoderPending) return this.decoderPending;
  20584. var useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';
  20585. var librariesPending = [];
  20586. if (useJS) {
  20587. librariesPending.push(this._loadLibrary('draco_decoder.js', 'text'));
  20588. } else {
  20589. librariesPending.push(this._loadLibrary('draco_wasm_wrapper.js', 'text'));
  20590. librariesPending.push(this._loadLibrary('draco_decoder.wasm', 'arraybuffer'));
  20591. }
  20592. this.decoderPending = Promise.all(librariesPending).then(function (libraries) {
  20593. var jsContent = libraries[0];
  20594. if (!useJS) {
  20595. _this4.decoderConfig.wasmBinary = libraries[1];
  20596. }
  20597. var fn = DRACOWorker.toString();
  20598. var body = ['/* draco decoder */', jsContent, '', '/* worker */', fn.substring(fn.indexOf('{') + 1, fn.lastIndexOf('}'))].join('\n');
  20599. _this4.workerSourceURL = URL.createObjectURL(new Blob([body]));
  20600. });
  20601. return this.decoderPending;
  20602. }
  20603. }, {
  20604. key: "_getWorker",
  20605. value: function _getWorker(taskID, taskCost) {
  20606. var _this5 = this;
  20607. return this._initDecoder().then(function () {
  20608. if (_this5.workerPool.length < _this5.workerLimit) {
  20609. var _worker2 = new Worker(_this5.workerSourceURL);
  20610. _worker2._callbacks = {};
  20611. _worker2._taskCosts = {};
  20612. _worker2._taskLoad = 0;
  20613. _worker2.postMessage({
  20614. type: 'init',
  20615. decoderConfig: _this5.decoderConfig
  20616. });
  20617. _worker2.onmessage = function (e) {
  20618. var message = e.data;
  20619. switch (message.type) {
  20620. case 'decode':
  20621. _worker2._callbacks[message.id].resolve(message);
  20622. break;
  20623. case 'error':
  20624. _worker2._callbacks[message.id].reject(message);
  20625. break;
  20626. default:
  20627. console.error('THREE.DRACOLoader: Unexpected message, "' + message.type + '"');
  20628. }
  20629. };
  20630. _this5.workerPool.push(_worker2);
  20631. } else {
  20632. _this5.workerPool.sort(function (a, b) {
  20633. return a._taskLoad > b._taskLoad ? -1 : 1;
  20634. });
  20635. }
  20636. var worker = _this5.workerPool[_this5.workerPool.length - 1];
  20637. worker._taskCosts[taskID] = taskCost;
  20638. worker._taskLoad += taskCost;
  20639. return worker;
  20640. });
  20641. }
  20642. }, {
  20643. key: "_releaseTask",
  20644. value: function _releaseTask(worker, taskID) {
  20645. worker._taskLoad -= worker._taskCosts[taskID];
  20646. delete worker._callbacks[taskID];
  20647. delete worker._taskCosts[taskID];
  20648. }
  20649. }, {
  20650. key: "debug",
  20651. value: function debug() {
  20652. console.log('Task load: ', this.workerPool.map(function (worker) {
  20653. return worker._taskLoad;
  20654. }));
  20655. }
  20656. }, {
  20657. key: "dispose",
  20658. value: function dispose() {
  20659. for (var i = 0; i < this.workerPool.length; ++i) {
  20660. this.workerPool[i].terminate();
  20661. }
  20662. this.workerPool.length = 0;
  20663. return this;
  20664. }
  20665. }]);
  20666. return DRACOLoader;
  20667. }(THREE$1.Loader);
  20668. /* WEB WORKER */
  20669. function DRACOWorker() {
  20670. var decoderConfig;
  20671. var decoderPending;
  20672. onmessage = function onmessage(e) {
  20673. var message = e.data;
  20674. switch (message.type) {
  20675. case 'init':
  20676. decoderConfig = message.decoderConfig;
  20677. decoderPending = new Promise(function (resolve
  20678. /*, reject*/
  20679. ) {
  20680. decoderConfig.onModuleLoaded = function (draco) {
  20681. // Module is Promise-like. Wrap before resolving to avoid loop.
  20682. resolve({
  20683. draco: draco
  20684. });
  20685. };
  20686. DracoDecoderModule(decoderConfig); // eslint-disable-line no-undef
  20687. });
  20688. break;
  20689. case 'decode':
  20690. var buffer = message.buffer;
  20691. var taskConfig = message.taskConfig;
  20692. decoderPending.then(function (module) {
  20693. var draco = module.draco;
  20694. var decoder = new draco.Decoder();
  20695. var decoderBuffer = new draco.DecoderBuffer();
  20696. decoderBuffer.Init(new Int8Array(buffer), buffer.byteLength);
  20697. try {
  20698. var geometry = decodeGeometry(draco, decoder, decoderBuffer, taskConfig);
  20699. var buffers = geometry.attributes.map(function (attr) {
  20700. return attr.array.buffer;
  20701. });
  20702. if (geometry.index) buffers.push(geometry.index.array.buffer);
  20703. self.postMessage({
  20704. type: 'decode',
  20705. id: message.id,
  20706. geometry
  20707. }, buffers);
  20708. } catch (error) {
  20709. console.error(error);
  20710. self.postMessage({
  20711. type: 'error',
  20712. id: message.id,
  20713. error: error.message
  20714. });
  20715. } finally {
  20716. draco.destroy(decoderBuffer);
  20717. draco.destroy(decoder);
  20718. }
  20719. });
  20720. break;
  20721. }
  20722. };
  20723. function decodeGeometry(draco, decoder, decoderBuffer, taskConfig) {
  20724. var attributeIDs = taskConfig.attributeIDs;
  20725. var attributeTypes = taskConfig.attributeTypes;
  20726. var dracoGeometry;
  20727. var decodingStatus;
  20728. var geometryType = decoder.GetEncodedGeometryType(decoderBuffer);
  20729. if (geometryType === draco.TRIANGULAR_MESH) {
  20730. dracoGeometry = new draco.Mesh();
  20731. decodingStatus = decoder.DecodeBufferToMesh(decoderBuffer, dracoGeometry);
  20732. } else if (geometryType === draco.POINT_CLOUD) {
  20733. dracoGeometry = new draco.PointCloud();
  20734. decodingStatus = decoder.DecodeBufferToPointCloud(decoderBuffer, dracoGeometry);
  20735. } else {
  20736. throw new Error('THREE.DRACOLoader: Unexpected geometry type.');
  20737. }
  20738. if (!decodingStatus.ok() || dracoGeometry.ptr === 0) {
  20739. throw new Error('THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg());
  20740. }
  20741. var geometry = {
  20742. index: null,
  20743. attributes: []
  20744. }; // Gather all vertex attributes.
  20745. for (var attributeName in attributeIDs) {
  20746. var attributeType = self[attributeTypes[attributeName]];
  20747. var attribute = void 0;
  20748. var attributeID = void 0; // A Draco file may be created with default vertex attributes, whose attribute IDs
  20749. // are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,
  20750. // a Draco file may contain a custom set of attributes, identified by known unique
  20751. // IDs. glTF files always do the latter, and `.drc` files typically do the former.
  20752. if (taskConfig.useUniqueIDs) {
  20753. attributeID = attributeIDs[attributeName];
  20754. attribute = decoder.GetAttributeByUniqueId(dracoGeometry, attributeID);
  20755. } else {
  20756. attributeID = decoder.GetAttributeId(dracoGeometry, draco[attributeIDs[attributeName]]);
  20757. if (attributeID === -1) continue;
  20758. attribute = decoder.GetAttribute(dracoGeometry, attributeID);
  20759. }
  20760. geometry.attributes.push(decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute));
  20761. } // Add index.
  20762. if (geometryType === draco.TRIANGULAR_MESH) {
  20763. geometry.index = decodeIndex(draco, decoder, dracoGeometry);
  20764. }
  20765. draco.destroy(dracoGeometry);
  20766. return geometry;
  20767. }
  20768. function decodeIndex(draco, decoder, dracoGeometry) {
  20769. var numFaces = dracoGeometry.num_faces();
  20770. var numIndices = numFaces * 3;
  20771. var byteLength = numIndices * 4;
  20772. var ptr = draco._malloc(byteLength);
  20773. decoder.GetTrianglesUInt32Array(dracoGeometry, byteLength, ptr);
  20774. var index = new Uint32Array(draco.HEAPF32.buffer, ptr, numIndices).slice();
  20775. draco._free(ptr);
  20776. return {
  20777. array: index,
  20778. itemSize: 1
  20779. };
  20780. }
  20781. function decodeAttribute(draco, decoder, dracoGeometry, attributeName, attributeType, attribute) {
  20782. var numComponents = attribute.num_components();
  20783. var numPoints = dracoGeometry.num_points();
  20784. var numValues = numPoints * numComponents;
  20785. var byteLength = numValues * attributeType.BYTES_PER_ELEMENT;
  20786. var dataType = getDracoDataType(draco, attributeType);
  20787. var ptr = draco._malloc(byteLength);
  20788. decoder.GetAttributeDataArrayForAllPoints(dracoGeometry, attribute, dataType, byteLength, ptr);
  20789. var array = new attributeType(draco.HEAPF32.buffer, ptr, numValues).slice();
  20790. draco._free(ptr);
  20791. return {
  20792. name: attributeName,
  20793. array: array,
  20794. itemSize: numComponents
  20795. };
  20796. }
  20797. function getDracoDataType(draco, attributeType) {
  20798. switch (attributeType) {
  20799. case Float32Array:
  20800. return draco.DT_FLOAT32;
  20801. case Int8Array:
  20802. return draco.DT_INT8;
  20803. case Int16Array:
  20804. return draco.DT_INT16;
  20805. case Int32Array:
  20806. return draco.DT_INT32;
  20807. case Uint8Array:
  20808. return draco.DT_UINT8;
  20809. case Uint16Array:
  20810. return draco.DT_UINT16;
  20811. case Uint32Array:
  20812. return draco.DT_UINT32;
  20813. }
  20814. }
  20815. }
  20816. var GLTFLoader$2 = new THREE.GLTFLoader();
  20817. var dracoLoader = new DRACOLoader();
  20818. dracoLoader.setDecoderPath(texture.getImageURL('images/loaders/DRACOLoader/draco/'));
  20819. GLTFLoader$2.setDRACOLoader(dracoLoader);
  20820. var loaders = {
  20821. gltf: function gltf(url, func) {
  20822. GLTFLoader$2.load(url, func);
  20823. }
  20824. };
  20825. 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); }; }
  20826. 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; } }
  20827. var bracketModels = {}; // 支架模型数据
  20828. /**
  20829. * 空间贴图边框
  20830. */
  20831. var OverlayFrame = /*#__PURE__*/function (_THREE$Object3D) {
  20832. _inherits(OverlayFrame, _THREE$Object3D);
  20833. var _super = _createSuper$1v(OverlayFrame);
  20834. function OverlayFrame(type) {
  20835. var _this;
  20836. _classCallCheck(this, OverlayFrame);
  20837. _this = _super.call(this);
  20838. _this.parts = {
  20839. body: null,
  20840. // 随overlay缩放或旋转的部分
  20841. foot: null,
  20842. // 不随overlay缩放或旋转的部分
  20843. line: null // 线框
  20844. };
  20845. /**
  20846. * 目前有:
  20847. * 边框:wall1, wall2, wall3,
  20848. * 支架:ground1, ground2
  20849. */
  20850. _this.type = type;
  20851. _this.addEventListener('createDone', function () {
  20852. _this.traverse(function (e) {
  20853. if (e.isMesh) {
  20854. e.renderOrder = RenderOrder.overlay - 1; //低于plane的,为了让plane的透明部分不会遮住画框。若要相反的效果需要保证完全重叠
  20855. e.material.transparent = true;
  20856. }
  20857. }); //xzw:遮住marker
  20858. });
  20859. if (_this.type.indexOf('ground') > -1) {
  20860. _this.createBracket();
  20861. } else {
  20862. _this.createFrame();
  20863. }
  20864. return _this;
  20865. } // // 用于TransfromControl
  20866. // get width() {
  20867. // if (this.overlay && this.type.indexOf('wall') > -1) return this.overlay.width
  20868. // else return
  20869. // }
  20870. // get height() {
  20871. // if (this.overlay && this.type.indexOf('wall') > -1) return this.overlay.height
  20872. // else return
  20873. // }
  20874. // get depth() {
  20875. // if (this.overlay && this.type.indexOf('wall') > -1) return this.overlay.depth
  20876. // else return
  20877. // }
  20878. _createClass(OverlayFrame, [{
  20879. key: "show",
  20880. value: function show() {
  20881. // overlay隐藏时不显示
  20882. if (!this.overlay.visible) {
  20883. this.visible = false;
  20884. return;
  20885. } // wall_1厚度为0时不显示
  20886. if (this.type == 'wall_1' && this.overlay.depthTemp == 0) {
  20887. this.visible = false;
  20888. return;
  20889. }
  20890. this.visible = true;
  20891. }
  20892. }, {
  20893. key: "hide",
  20894. value: function hide() {
  20895. this.visible = false;
  20896. } // 设置厚度
  20897. }, {
  20898. key: "setFrameThickness",
  20899. value: function setFrameThickness(thickness) {
  20900. if (this.type == 'wall_1') {
  20901. isNaN(thickness) && (thickness = 0);
  20902. /* settings.overlay.depth */
  20903. this.overlay.depthTemp = thickness; // 当厚度为0时隐藏frame
  20904. !!thickness ? this.show() : this.hide();
  20905. } else if (this.type.indexOf('wall') > -1) {
  20906. thickness = settings$3.overlay.depth; // 其他贴墙固定0.04
  20907. } else {
  20908. thickness = 0; // 贴地默认无厚度
  20909. }
  20910. this.overlay.depth = thickness;
  20911. this.overlay.plane.position.set(0, 0, thickness);
  20912. this.update({
  20913. mode: 'scale'
  20914. });
  20915. }
  20916. }, {
  20917. key: "setOverlay",
  20918. value: function setOverlay(overlay, isFromInfo) {
  20919. this.overlay = overlay;
  20920. overlay.frame = this;
  20921. this.visible = overlay.visible;
  20922. if (!isFromInfo) {
  20923. this.position.copy(this.overlay.position);
  20924. this.quaternion.copy(this.overlay.quaternion); // 根据overlayFrame修正overlay坐标
  20925. var _this$computeOverlayT = this.computeOverlayTransform(),
  20926. position = _this$computeOverlayT.position,
  20927. quaternion = _this$computeOverlayT.quaternion;
  20928. this.overlay.position.copy(position);
  20929. this.overlay.quaternion.copy(quaternion);
  20930. } else {
  20931. // 初始化数据库数据时,倒推出overlay修正前坐标,作为overlayFrame位置
  20932. var _this$computeOverlayT2 = this.computeOverlayTransform({
  20933. reverse: true
  20934. }),
  20935. _position = _this$computeOverlayT2.position,
  20936. _quaternion = _this$computeOverlayT2.quaternion;
  20937. this.position.copy(_position);
  20938. this.quaternion.copy(_quaternion);
  20939. }
  20940. this.update({
  20941. mode: 'scale'
  20942. });
  20943. }
  20944. /**
  20945. * 改变overlay坐标和旋转使它适应overlayFrame
  20946. * @param {*} options
  20947. * @returns
  20948. */
  20949. }, {
  20950. key: "computeOverlayTransform",
  20951. value: function computeOverlayTransform() {
  20952. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  20953. var position = this.overlay.position.clone();
  20954. var quaternion = this.overlay.quaternion.clone();
  20955. var reverse = options.reverse ? -1 : 1;
  20956. var height = settings$3.overlay.height * this.overlay.scale.y;
  20957. switch (this.type) {
  20958. case 'ground_1':
  20959. position.add(new THREE.Vector3(0, (bracketModels[this.type].height + height / 2) * reverse, 0).applyQuaternion(this.overlay.quaternion));
  20960. break;
  20961. case 'ground_2':
  20962. quaternion.multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), -Math.PI / 6 * reverse));
  20963. position.add(new THREE.Vector3(0, bracketModels[this.type].height * reverse, 0).applyQuaternion(reverse == 1 ? this.quaternion : quaternion));
  20964. break;
  20965. case 'wall_0':
  20966. case 'wall_1':
  20967. case 'wall_2':
  20968. case 'wall_3':
  20969. position.add(new THREE.Vector3(0, (height / 2 + this.getFrameModelData().border) * reverse, 0).applyQuaternion(this.quaternion)); // 边框上移
  20970. break;
  20971. }
  20972. this.setFrameThickness(this.overlay.depth);
  20973. return {
  20974. position,
  20975. quaternion
  20976. };
  20977. } // 创建支架
  20978. }, {
  20979. key: "createBracket",
  20980. value: function createBracket() {
  20981. var _this2 = this;
  20982. var hideMaterial = new THREE.MeshPhongMaterial({
  20983. color: 0x000000
  20984. });
  20985. hideMaterial.visible = false;
  20986. if (this.type == 'ground_1') {
  20987. this.parts.body = new THREE.Group(); // 背面
  20988. var plane = new THREE.Mesh(new THREE.PlaneGeometry(settings$3.overlay.width, settings$3.overlay.height), hideMaterial);
  20989. plane.scale.z = -1;
  20990. this.parts.body.backFace = plane;
  20991. var base = new THREE.Group();
  20992. this.parts.body.bottom = base;
  20993. this.parts.body.add(base, plane);
  20994. this.add(this.parts.body);
  20995. this.initBracketMeshData(function (object) {
  20996. base.add(object); // 背面替换为底座相同材质
  20997. var material = object.children[1].material;
  20998. plane.material = material;
  20999. _this2.dispatchEvent({
  21000. type: 'createDone'
  21001. });
  21002. });
  21003. } else {
  21004. // 可移动支架
  21005. this.parts.body = new THREE.Group();
  21006. this.parts.body.rotateX(-Math.PI / 6);
  21007. this.add(this.parts.body); // 竖杆
  21008. var cube = new THREE.Mesh(new THREE.BoxGeometry(0.02, settings$3.overlay.height, 0.02), hideMaterial);
  21009. cube.position.z -= 0.01; // 上横杆
  21010. var cube1 = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.01, 0.04), hideMaterial);
  21011. cube1.position.y += settings$3.overlay.height / 2 + 0.005; // 下横杆
  21012. var cube2 = new THREE.Mesh(new THREE.BoxGeometry(0.1, 0.01, 0.04), hideMaterial);
  21013. cube2.position.y -= settings$3.overlay.height / 2 + 0.005; // 背面
  21014. var _plane = new THREE.Mesh(new THREE.PlaneGeometry(settings$3.overlay.width, settings$3.overlay.height), hideMaterial);
  21015. _plane.scale.z = -1;
  21016. this.parts.body.middle = cube;
  21017. this.parts.body.top = cube1;
  21018. this.parts.body.bottom = cube2;
  21019. this.parts.body.backFace = _plane;
  21020. this.parts.body.add(cube, cube1, cube2, _plane); // 底座支架
  21021. this.parts.foot = new THREE.Group();
  21022. this.parts.foot.position.z -= 0.02;
  21023. this.add(this.parts.foot);
  21024. this.initBracketMeshData(function (object) {
  21025. _this2.parts.foot.add(object); // 可移动支架替换为底座相同材质
  21026. var material = object.children[0].material;
  21027. cube.material = cube1.material = cube2.material = _plane.material = material;
  21028. _this2.dispatchEvent({
  21029. type: 'createDone'
  21030. });
  21031. }); // bracketModels需要先init
  21032. this.parts.body.position.y += bracketModels[this.type].height;
  21033. }
  21034. } // 创建边框
  21035. }, {
  21036. key: "createFrame",
  21037. value: function createFrame() {
  21038. var body = new THREE.Mesh();
  21039. this.parts.body = body;
  21040. var _this$getFrameModelDa = this.getFrameModelData(),
  21041. vertices = _this$getFrameModelDa.vertices,
  21042. indexs = _this$getFrameModelDa.indexs,
  21043. uvs = _this$getFrameModelDa.uvs,
  21044. normals = _this$getFrameModelDa.normals;
  21045. body.geometry = new THREE.BufferGeometry();
  21046. body.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));
  21047. body.geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvs), 2));
  21048. body.geometry.setIndex(new THREE.BufferAttribute(new Uint16Array(indexs), 1));
  21049. if (normals) body.geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3));else body.geometry.computeVertexNormals();
  21050. if (this.type == 'wall_0') {
  21051. // let frameFace = new THREE.Mesh(frameGeo, new THREE.MeshBasicMaterial({ map: texture.load(texture.getImageURL('images/zzz.jpg')) }))
  21052. body.material = new THREE.MeshPhongMaterial({
  21053. color: '#eeeeee'
  21054. });
  21055. this.parts.line = new THREE.LineSegments(new THREE.EdgesGeometry(body.geometry), new THREE.LineBasicMaterial({
  21056. color: 0x000000
  21057. }));
  21058. this.add(this.parts.line);
  21059. } else if (this.type == 'wall_3') {
  21060. body.material = new THREE.MeshStandardMaterial({
  21061. color: '#222222'
  21062. });
  21063. } else if (this.type == 'wall_2' || this.type == 'wall_1') {
  21064. body.material = new THREE.MeshLambertMaterial({
  21065. color: '#cccccc'
  21066. }); // this.parts.line = new THREE.LineSegments(new THREE.EdgesGeometry(body.geometry), new THREE.LineBasicMaterial({ color: 0xcccccc, transparent: true, opacity: 0.4}))
  21067. // this.add(this.parts.line)
  21068. }
  21069. body.position.z -= 0.001; // 向后移1mm,防止和overlay以及边框重叠
  21070. this.add(body);
  21071. this.dispatchEvent({
  21072. type: 'createDone'
  21073. });
  21074. }
  21075. /**
  21076. * overlayFrame和overlay之间互相影响变换
  21077. * @param {*} data TransformControls变换数据
  21078. */
  21079. }, {
  21080. key: "update",
  21081. value: function update(data) {
  21082. var width = Math.abs(settings$3.overlay.width * this.overlay.scale.x);
  21083. var height = Math.abs(settings$3.overlay.height * this.overlay.scale.y); // ground: 更新overlay,随overlayFrame变换(因为ground_2模型需要如此)
  21084. // wall: 更新overlayFrame,随overlay变换(需要根据长宽高更新transfromControl)
  21085. if (!data || data.mode == 'translate') {
  21086. switch (this.type) {
  21087. case 'ground_1':
  21088. this.overlay.position.copy(this.position).add(new THREE.Vector3(0, height / 2 + bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
  21089. break;
  21090. case 'ground_2':
  21091. this.overlay.position.copy(this.position).add(new THREE.Vector3(0, bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
  21092. break;
  21093. case 'wall_0':
  21094. case 'wall_1':
  21095. case 'wall_2':
  21096. case 'wall_3':
  21097. this.position.copy(this.overlay.position).add(new THREE.Vector3(0, -height / 2 - this.getFrameModelData().border, 0).applyQuaternion(this.quaternion)); // 边框上移
  21098. break;
  21099. default:
  21100. this.overlay.position.copy(this.position);
  21101. break;
  21102. }
  21103. } // 更新overlay,随overlayFrame变换(因为ground_2模型需要如此)
  21104. if (!data || data.mode == 'rotate') {
  21105. switch (this.type) {
  21106. case 'ground_1':
  21107. this.overlay.rotation.copy(this.rotation);
  21108. this.overlay.position.set(0, bracketModels[this.type].height + height / 2, 0).applyQuaternion(this.quaternion).add(this.position);
  21109. break;
  21110. case 'ground_2':
  21111. this.overlay.quaternion.setFromAxisAngle(new THREE.Vector3(1, 0, 0).applyQuaternion(this.overlay.quaternion), -Math.PI / 6).multiply(this.quaternion);
  21112. this.parts.body.quaternion.copy(this.quaternion).invert().multiply(this.overlay.quaternion); // local quaternion
  21113. this.overlay.position.copy(this.position).add(new THREE.Vector3(0, bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
  21114. break;
  21115. case 'wall_0':
  21116. case 'wall_1':
  21117. case 'wall_2':
  21118. case 'wall_3':
  21119. this.overlay.rotation.copy(this.rotation);
  21120. this.overlay.position.set(0, this.getFrameModelData().border + height / 2, 0).applyQuaternion(this.quaternion).add(this.position); // 边框上移
  21121. break;
  21122. default:
  21123. this.overlay.rotation.copy(this.rotation);
  21124. break;
  21125. }
  21126. } // 更新overlayFrame,随overlay变换(因为ground_2模型需要如此)
  21127. if (!data || data.mode == 'scale') {
  21128. switch (this.type) {
  21129. case 'ground_1':
  21130. this.parts.body.bottom.scale.x = this.overlay.scale.x;
  21131. this.parts.body.backFace.scale.set(this.overlay.scale.x, this.overlay.scale.y, -this.overlay.scale.z);
  21132. this.parts.body.backFace.position.set(0, height / 2 + bracketModels[this.type].height, 0);
  21133. this.overlay.position.copy(this.position).add(new THREE.Vector3(0, height / 2 + bracketModels[this.type].height, 0).applyQuaternion(this.quaternion));
  21134. break;
  21135. case 'ground_2':
  21136. this.parts.body.middle.scale.y = this.overlay.scale.y;
  21137. this.parts.body.top.position.y = height / 2 + 0.005;
  21138. this.parts.body.bottom.position.y = -height / 2 - 0.005;
  21139. this.parts.body.backFace.scale.set(this.overlay.scale.x, this.overlay.scale.y, -this.overlay.scale.z);
  21140. break;
  21141. case 'wall_0':
  21142. case 'wall_1':
  21143. case 'wall_2':
  21144. case 'wall_3':
  21145. var _this$getFrameModelDa2 = this.getFrameModelData(width, height),
  21146. vertices = _this$getFrameModelDa2.vertices,
  21147. normals = _this$getFrameModelDa2.normals;
  21148. this.parts.body.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));
  21149. normals && this.parts.body.geometry.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(normals), 3));
  21150. this.position.set(0, -this.getFrameModelData().border - height / 2, 0).applyQuaternion(this.quaternion).add(this.overlay.position); // 边框上移
  21151. if (this.parts.line) {
  21152. this.parts.line.geometry.dispose();
  21153. this.parts.line.geometry = new THREE.EdgesGeometry(this.parts.body.geometry);
  21154. }
  21155. break;
  21156. }
  21157. }
  21158. } // 边框模型数据
  21159. }, {
  21160. key: "getFrameModelData",
  21161. value: function getFrameModelData(width, height) {
  21162. var depth = this.overlay && !isNaN(this.overlay.depth) ? this.overlay.depth : settings$3.overlay.depth;
  21163. !width && (width = settings$3.overlay.width);
  21164. !height && (height = settings$3.overlay.height);
  21165. var bufferAttributesJson = {
  21166. wall_0: {
  21167. border: 0.05,
  21168. vertices: [width / 2, height / 2, depth, // 0
  21169. width / 2 + 0.01, height / 2 + 0.01, depth + 0.02, // 1
  21170. width / 2 + 0.05, height / 2 + 0.05, depth + 0.02, // 2
  21171. width / 2, -height / 2, depth, // 3
  21172. width / 2 + 0.01, -height / 2 - 0.01, depth + 0.02, // 4
  21173. width / 2 + 0.05, -height / 2 - 0.05, depth + 0.02, // 5
  21174. -width / 2, -height / 2, depth, // 6
  21175. -width / 2 - 0.01, -height / 2 - 0.01, depth + 0.02, // 7
  21176. -width / 2 - 0.05, -height / 2 - 0.05, depth + 0.02, // 8
  21177. -width / 2, height / 2, depth, // 9
  21178. -width / 2 - 0.01, height / 2 + 0.01, depth + 0.02, // 10
  21179. -width / 2 - 0.05, height / 2 + 0.05, depth + 0.02, // 11
  21180. width / 2 + 0.05, height / 2 + 0.05, 0, // 12
  21181. width / 2 + 0.05, -height / 2 - 0.05, 0, // 13
  21182. -width / 2 - 0.05, -height / 2 - 0.05, 0, // 14
  21183. -width / 2 - 0.05, height / 2 + 0.05, 0 // 15
  21184. ],
  21185. 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]
  21186. },
  21187. wall_1: {
  21188. border: 0,
  21189. vertices: [width / 2, height / 2, depth, // 0
  21190. width / 2, height / 2, 0, // 1
  21191. width / 2, -height / 2, depth, // 2
  21192. width / 2, -height / 2, 0, // 3
  21193. -width / 2, -height / 2, depth, // 4
  21194. -width / 2, -height / 2, 0, // 5
  21195. -width / 2, height / 2, depth, // 6
  21196. -width / 2, height / 2, 0 // 7
  21197. ],
  21198. 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],
  21199. 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]
  21200. },
  21201. wall_2: {
  21202. border: 0.06,
  21203. vertices: [width / 2 + 0.02, height / 2 + 0.02, depth, // 0
  21204. width / 2 + 0.02, height / 2 + 0.02, depth + 0.03, // 1
  21205. width / 2 + 0.06, height / 2 + 0.06, depth, // 2
  21206. width / 2 + 0.02, -height / 2 - 0.02, depth, // 3
  21207. width / 2 + 0.02, -height / 2 - 0.02, depth + 0.03, // 4
  21208. width / 2 + 0.06, -height / 2 - 0.06, depth, // 5
  21209. -width / 2 - 0.02, -height / 2 - 0.02, depth, // 6
  21210. -width / 2 - 0.02, -height / 2 - 0.02, depth + 0.03, // 7
  21211. -width / 2 - 0.06, -height / 2 - 0.06, depth, // 8
  21212. -width / 2 - 0.02, height / 2 + 0.02, depth, // 9
  21213. -width / 2 - 0.02, height / 2 + 0.02, depth + 0.03, // 10
  21214. -width / 2 - 0.06, height / 2 + 0.06, depth, // 11
  21215. width / 2 + 0.06, height / 2 + 0.06, 0, // 12
  21216. width / 2 + 0.06, -height / 2 - 0.06, 0, // 13
  21217. -width / 2 - 0.06, -height / 2 - 0.06, 0, // 14
  21218. -width / 2 - 0.06, height / 2 + 0.06, 0 // 15
  21219. ],
  21220. 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],
  21221. 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]
  21222. },
  21223. wall_3: {
  21224. border: 0.05,
  21225. vertices: [width / 2, height / 2, depth, // 0
  21226. width / 2 + 0.05, height / 2 + 0.05, depth, // 1
  21227. width / 2, -height / 2, depth, // 2
  21228. width / 2 + 0.05, -height / 2 - 0.05, depth, // 3
  21229. -width / 2, -height / 2, depth, // 4
  21230. -width / 2 - 0.05, -height / 2 - 0.05, depth, // 5
  21231. -width / 2, height / 2, depth, // 6
  21232. -width / 2 - 0.05, height / 2 + 0.05, depth, // 7
  21233. width / 2 + 0.05, height / 2 + 0.05, 0, // 8
  21234. width / 2 + 0.05, -height / 2 - 0.05, 0, // 9
  21235. -width / 2 - 0.05, -height / 2 - 0.05, 0, // 10
  21236. -width / 2 - 0.05, height / 2 + 0.05, 0 // 11
  21237. ],
  21238. 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],
  21239. 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]
  21240. }
  21241. };
  21242. var attrs = bufferAttributesJson[this.type]; // 边框上移
  21243. for (var i = 1; i < attrs.vertices.length; i += 3) {
  21244. attrs.vertices[i] += height / 2 + attrs.border;
  21245. }
  21246. attrs.uvs = [];
  21247. for (var _i = 0; _i < attrs.vertices.length * (2 / 3) / 8; _i++) {
  21248. attrs.uvs.push(0, 1, 1, 1, 1, 0, 0, 0);
  21249. }
  21250. return attrs;
  21251. }
  21252. /**
  21253. * 加载支架模型
  21254. * @param {*} func
  21255. * @returns
  21256. */
  21257. }, {
  21258. key: "initBracketMeshData",
  21259. value: function initBracketMeshData(func) {
  21260. var _this3 = this;
  21261. // 使用已有模型数据,注意需要clone
  21262. if (bracketModels[this.type] && bracketModels[this.type].loaded) {
  21263. func && func(bracketModels[this.type].object.clone());
  21264. return;
  21265. }
  21266. if (this.type == 'ground_1') {
  21267. // 长度2.44m,高度0.58m
  21268. var scaleYZ = 0.2;
  21269. bracketModels[this.type] = {
  21270. object: null,
  21271. height: 0.58 * scaleYZ,
  21272. loaded: false
  21273. };
  21274. loaders.gltf(texture.getImageURL('images/brackets/bracket_1.glb'), function (model) {
  21275. var object = model.scene;
  21276. object.position.y *= scaleYZ;
  21277. object.rotateY(Math.PI / 2);
  21278. object.scale.set(scaleYZ, scaleYZ, 1 / 2.44);
  21279. object.children.forEach(function (mesh) {
  21280. if (mesh.name !== 'Plane') mesh.material.color.setRGB(0.3, 0.3, 0.3);
  21281. });
  21282. bracketModels[_this3.type].object = object;
  21283. bracketModels[_this3.type].loaded = true;
  21284. func && func(object);
  21285. });
  21286. return bracketModels[this.type];
  21287. }
  21288. if (this.type == 'ground_2') {
  21289. // 高度1.56m
  21290. var scaleXYZ = 0.5;
  21291. bracketModels[this.type] = {
  21292. object: null,
  21293. height: 1.59 * scaleXYZ,
  21294. loaded: false
  21295. };
  21296. loaders.gltf(texture.getImageURL('images/brackets/bracket_2.glb'), function (model) {
  21297. var object = model.scene;
  21298. object.children.forEach(function (mesh) {
  21299. if (mesh.name == 'dizuo001') mesh.material.opacity = 0.6;else mesh.material.color.setRGB(0.3, 0.3, 0.3);
  21300. });
  21301. object.scale.set(scaleXYZ, scaleXYZ, scaleXYZ);
  21302. object.position.y += 0.01;
  21303. bracketModels[_this3.type].object = object;
  21304. bracketModels[_this3.type].loaded = true;
  21305. func && func(object);
  21306. });
  21307. }
  21308. }
  21309. }, {
  21310. key: "switchTranformControls",
  21311. value: function switchTranformControls(controls) {
  21312. // switch (this.type) {
  21313. // case 'ground_1':
  21314. // // 只允许沿y轴旋转
  21315. // controls.filterRotateAxis(['y'])
  21316. // break
  21317. // default:
  21318. // controls.filterRotateAxis()
  21319. // break
  21320. // }
  21321. // switch (this.type) {
  21322. // case 'ground_2':
  21323. // // 沿着水平面平移
  21324. // controls.space = controls.mode == 'translate' ? 'world' : 'local'
  21325. // break
  21326. // default:
  21327. // controls.space = 'local'
  21328. // break
  21329. // }
  21330. // switch (this.type) {
  21331. // case 'ground_2':
  21332. // // y轴旋转整个支架,沿世界坐标系旋转;x轴z轴只旋转parts.body,沿本地坐标系旋转
  21333. // controls.spaceForRotate = { x: 'local', y: 'world', z: 'local' }
  21334. // break
  21335. // default:
  21336. // controls.spaceForRotate = null
  21337. // break
  21338. // }
  21339. // 变换TranformControls对象
  21340. if (controls.mode == 'scale' || controls.mode == 'translate' && this.type.indexOf('wall') > -1) {
  21341. // 缩放、边框位移:以overlay为对象
  21342. controls.attach(this.overlay);
  21343. } else {
  21344. // 旋转、支架位移:以overlayFrame为对象
  21345. controls.attach(this);
  21346. }
  21347. } // 移除
  21348. }, {
  21349. key: "remove",
  21350. value: function remove(isFromInfo) {
  21351. this.removeFromParent();
  21352. if (!isFromInfo) {
  21353. // 数据回退时,坐标已变为数据库数据,无需重新计算
  21354. // 重新计算overlay坐标
  21355. var _this$computeOverlayT3 = this.computeOverlayTransform({
  21356. reverse: true
  21357. }),
  21358. position = _this$computeOverlayT3.position,
  21359. quaternion = _this$computeOverlayT3.quaternion;
  21360. this.overlay.position.copy(position);
  21361. this.overlay.quaternion.copy(quaternion);
  21362. }
  21363. } // 销毁
  21364. }, {
  21365. key: "dispose",
  21366. value: function dispose(isFromInfo) {
  21367. this.remove(isFromInfo);
  21368. this.traverse(function (obj) {
  21369. if (obj.isMesh) {
  21370. obj.geometry.dispose();
  21371. obj.material.dispose();
  21372. }
  21373. });
  21374. }
  21375. }]);
  21376. return OverlayFrame;
  21377. }(THREE.Object3D);
  21378. 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); }; }
  21379. 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; } }
  21380. /*
  21381. 目前只有box视频一种。分为带厚度和不带厚度两种。不带厚度时只有一个plane,带厚度时要加上一个五个面的box,这样刚好组成完整的box(变换中心调整至box背部)。
  21382. */
  21383. var isEdit$1;
  21384. var fileSizeMax = {
  21385. photo: 10,
  21386. video: 50
  21387. };
  21388. var Overlay = /*#__PURE__*/function (_THREE$Object3D) {
  21389. _inherits(Overlay, _THREE$Object3D);
  21390. var _super = _createSuper$1u(Overlay);
  21391. function Overlay(player, info, videoPlayer) {
  21392. var _this;
  21393. _classCallCheck(this, Overlay);
  21394. _this = _super.call(this);
  21395. isEdit$1 = !player.$app.config.view;
  21396. _this.player = player;
  21397. _this._planeGeometry = new THREE.PlaneGeometry(settings$3.overlay.width, settings$3.overlay.height, 1, 1);
  21398. _this._boxGeometry = new THREE.BoxBufferGeometry(settings$3.overlay.width, settings$3.overlay.height, settings$3.overlay.depth); //ie的mesh 加了polygonOffset也是会重叠。所以去掉前面的face: (但是突然ie又播放不了videoTexture)
  21399. var newIndex = _toConsumableArray(_this._boxGeometry.index.array);
  21400. newIndex.splice(4 * 6, 6);
  21401. _this._boxGeometry.setIndex(new THREE.BufferAttribute(new Uint16Array(newIndex), 1));
  21402. _this._boxMat = new THREE.MeshBasicMaterial({
  21403. //MeshStandardMaterial
  21404. color: '#eeeeee',
  21405. transparent: !0,
  21406. opacity: 0.8
  21407. });
  21408. _this.videoPlayer = videoPlayer;
  21409. _this.isHidden = false; // 用于标识是否设置可视
  21410. info.reverse == void 0 && (info.reverse = false);
  21411. info.limitToOnlyPano == void 0 && (info.limitToOnlyPano = false); //仅在当前点显示
  21412. _this.cornerPoints = [];
  21413. _this.info = info;
  21414. _this.sid = info.sid;
  21415. _this.build(info);
  21416. _this.name = 'overlay_' + _this.sid;
  21417. _this.floor = _this.player.model.floors.get(info.subgroup || info.floorIndex) || _this.raycastToFindFloor();
  21418. _this.updateVisibleOnFloor();
  21419. _this.addEventListener('isVisible', function (e) {
  21420. if (_this.player.EditOverlay.editPlane != _assertThisInitialized(_this)) return;
  21421. _this.player.EditOverlay.controlSelectOverlay(e.visible ? _assertThisInitialized(_this) : null);
  21422. });
  21423. return _this;
  21424. }
  21425. _createClass(Overlay, [{
  21426. key: "show",
  21427. value: function show() {
  21428. var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  21429. //console.error('show', reason)
  21430. common$1.updateVisible(this, reason, true);
  21431. this.frame && this.frame.show();
  21432. if (reason == 'forceHide') {
  21433. this.isHidden = false;
  21434. }
  21435. }
  21436. }, {
  21437. key: "hide",
  21438. value: function hide() {
  21439. var reason = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  21440. //console.error('hide', reason)
  21441. common$1.updateVisible(this, reason, false);
  21442. this.frame && this.frame.hide();
  21443. if (reason == 'forceHide') {
  21444. this.isHidden = true;
  21445. }
  21446. }
  21447. }, {
  21448. key: "raycastToFindFloor",
  21449. value: function raycastToFindFloor() {
  21450. //add
  21451. this.floor = convertTool.raycastToFindFloor(this.player, this.plane.getWorldPosition(new THREE.Vector3()));
  21452. if (!this.floor) {
  21453. console.error('Overlay raycastToFindFloor cannot find floor?');
  21454. this.floor = this.player.model.floors.first();
  21455. }
  21456. return this.floor;
  21457. }
  21458. }, {
  21459. key: "updateVisibleOnFloor",
  21460. value: function updateVisibleOnFloor(info) {
  21461. //仅飞出后需要按楼层显示
  21462. 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)) ||
  21463. //this.info.hide
  21464. ) {
  21465. this.hide('visiOnFloor');
  21466. } else {
  21467. this.show('visiOnFloor');
  21468. }
  21469. } //注:楼层切换时的控制写在floor.show里
  21470. }, {
  21471. key: "build",
  21472. value: function build(info) {
  21473. var _this2 = this;
  21474. this.modified = info.modified;
  21475. var plane = new THREE.Mesh(this._planeGeometry, new THREE.MeshBasicMaterial({
  21476. //MeshStandardMaterial
  21477. color: Colors.mainColor,
  21478. opacity: 0.4,
  21479. transparent: !0,
  21480. polygonOffset: true,
  21481. //是否开启多边形偏移 //ie不开启时blank也不会闪烁
  21482. polygonOffsetFactor: -0.9,
  21483. //多边形偏移因子
  21484. polygonOffsetUnits: -4.0 //多边形偏移单位
  21485. }));
  21486. plane.renderOrder = RenderOrder.overlay;
  21487. this.add(plane);
  21488. this.plane = plane;
  21489. this.player.OverlayManager.add(this);
  21490. if (config$6.mobile && info.fileSize > (1 << 20) * fileSizeMax[info.media[0]]) {
  21491. info.type = 'photo';
  21492. info.media = texture.getWarnImg('overWeight', config$6.i18n('viewer.toast.mobileFileMaxToast') || '抱歉,文件较大手机无法展示,建议用电脑打开。', 420, true); //['抱歉,文件较大手机无法展示,', '建议用电脑打开。']
  21493. plane.material.color = new THREE.Color(1, 1, 1);
  21494. info.overWeight = true;
  21495. this.dispatchEvent({
  21496. type: 'mapLoaded'
  21497. });
  21498. } else {
  21499. if (info.media) {
  21500. // console.error(info)
  21501. if (info.media.includes('video')) {
  21502. info.type = 'video';
  21503. if (isEdit$1) {
  21504. this.loadVideo();
  21505. this.videoControl(true);
  21506. } else {
  21507. //展示页面延迟加载,且监控,可见才播放(如果支持多个视频,这段要去掉,改为overlayManager里addSliceListen的那段)
  21508. this.player.on('view.changed', function () {
  21509. var time = _this2.info.media instanceof HTMLVideoElement ? 1000 : 200; //加载需要时间,所以未加载时缩短判断间隔
  21510. common$1.intervalTool.isWaiting('overlayInsight_' + _this2.player.model.sid, function () {
  21511. //延时update,防止崩溃 , 未到时间就拦截(第一次直接执行)
  21512. if (!_this2.player.flying) {
  21513. //飞行时不判断
  21514. if (_this2.visible && _this2.inSight()) {
  21515. _this2.videoControl(true);
  21516. } else {
  21517. _this2.videoControl(false);
  21518. }
  21519. }
  21520. }, time);
  21521. });
  21522. }
  21523. } else if (info.media.includes('photo')) {
  21524. var img = new Image();
  21525. img.crossOrigin = 'anonymous';
  21526. if (this.info.isBillboard) {
  21527. img.src = this.getMapSrc();
  21528. } else {
  21529. img.src = this.player.$app.resource.getUserResourceURL(info.poster);
  21530. }
  21531. img.onload = function () {
  21532. _this2.dispatchEvent({
  21533. type: 'mapLoaded'
  21534. });
  21535. };
  21536. info.media = img;
  21537. info.type = 'photo';
  21538. }
  21539. plane.material.color = new THREE.Color(1, 1, 1);
  21540. }
  21541. }
  21542. if (info.width == void 0) info.width = settings$3.overlay.width;
  21543. if (info.height == void 0) info.height = settings$3.overlay.height;
  21544. this.setFromInfo(info);
  21545. }
  21546. }, {
  21547. key: "loadVideo",
  21548. value: function loadVideo() {
  21549. if (this.info.media instanceof HTMLVideoElement) return this.info.media; //已加载
  21550. this.info.media = this.videoPlayer.getVideo(this.info.sid, null, this.info.url); //注:部分视频手机播放不了(.webm的之前没转为mp4, 得用url,但是flv也无,也要判断下)
  21551. this.info.media.addEventListener('ended', function () {
  21552. info.media.play();
  21553. if (info.media.paused) ;
  21554. });
  21555. this.setFromInfo(this.info);
  21556. this.plane.material.needsUpdate = true; //console.log('loadVideo成功')
  21557. return this.info.media;
  21558. }
  21559. }, {
  21560. key: "setFromInfo",
  21561. value: function setFromInfo(info) {
  21562. var _this3 = this;
  21563. //1 恢复到编辑之前 2 初始加载
  21564. var plane = this.plane;
  21565. info.width && (this.scale.setX(info.width / settings$3.overlay.width), this.width = info.width);
  21566. info.height && (this.scale.setY(info.height / settings$3.overlay.height), this.height = info.height);
  21567. !isNaN(info.depth) && (this.depth = info.depth);
  21568. info.pos instanceof Array && (info.pos = new THREE.Vector3().fromArray(info.pos));
  21569. info.qua instanceof Array && (info.qua = new THREE.Quaternion().fromArray(info.qua));
  21570. info.pos && this.position.copy(info.pos);
  21571. info.qua && this.quaternion.copy(info.qua);
  21572. info.reverse && (this.scale.x *= -1);
  21573. this.isHidden = info.hide;
  21574. common$1.updateVisible(this, 'forceHide', !this.isHidden);
  21575. if (info.type) {
  21576. if (!plane.material.map) {
  21577. if (info.type == 'video') {
  21578. if (!(this.info.media instanceof HTMLVideoElement)) return;
  21579. var map = new THREE.VideoTexture(info.media);
  21580. plane.material.map = map;
  21581. if (!isEdit$1) {
  21582. var needsUpdate_ = map.needsUpdate;
  21583. Object.defineProperty(map, 'needsUpdate', {
  21584. get: function get() {
  21585. return needsUpdate_;
  21586. },
  21587. set: function set(value) {
  21588. needsUpdate_ = !_this3.info.media.paused && value; //增加判断:是否在播放,不在播放就不更新贴图
  21589. if (needsUpdate_) {
  21590. //old set needsUpdate
  21591. map.version++;
  21592. map.source.needsUpdate = true;
  21593. }
  21594. }
  21595. });
  21596. }
  21597. } else {
  21598. plane.material.map = new THREE.Texture(info.media);
  21599. if (info.overWeight) {
  21600. var _plane$material$map$i = plane.material.map.image,
  21601. width = _plane$material$map$i.width,
  21602. height = _plane$material$map$i.height;
  21603. var repeat = new THREE.Vector2(1, 1),
  21604. offset = new THREE.Vector2(0, 0);
  21605. var r1 = width / height,
  21606. r2 = info.width / info.height;
  21607. if (r1 > r2) {
  21608. repeat.y = r1 / r2;
  21609. offset.y = -repeat.y / 2;
  21610. } else {
  21611. repeat.x = r2 / r1;
  21612. }
  21613. plane.material.map.repeat.copy(repeat);
  21614. plane.material.map.offset.set(-(repeat.x - 1) / 2, -(repeat.y - 1) / 2);
  21615. }
  21616. plane.material.map.needsUpdate = true;
  21617. }
  21618. plane.material.map.wrapS = plane.material.map.wrapT = THREE.ClampToEdgeWrapping;
  21619. plane.material.map.minFilter = THREE.LinearFilter; //LinearMipMapLinearFilter 会被缩放到power of 2
  21620. plane.material.map.magFilter = THREE.LinearFilter;
  21621. plane.material.map.anisotropy = 4;
  21622. plane.material.map.generateMipmaps = false;
  21623. plane.material.opacity = 1;
  21624. } else {
  21625. plane.material.map.image = info.media; //plane.material.map.needsUpdate = true
  21626. plane.material.map.dispose(); //为什么要加这句才能替换成功
  21627. }
  21628. this.file = info.file;
  21629. }
  21630. this.overlayType = info.type;
  21631. if (!info.frameType && !this.info.isBillboard) info.frameType = 'wall_1'; // 兼容旧数据
  21632. this.info.isBillboard || this.addFrame(info.frameType, this.modified !== 'new'); // 需要区分新增数据还是数据库数据
  21633. this.limitToOnlyPano = info.limitToOnlyPano ? this.player.model.panos.index[info.limitToOnlyPano] : false;
  21634. this.limitToOnlyPano && this.limitToOnlyPano != this.player.currentPano && this.hide('limitToOnlyPano');
  21635. this.visiblePanos = convertTool.getVisiblePano(this.plane.getWorldPosition(new THREE.Vector3()), this.player.model); //console.log('visiblePanos',this.sid, this.visiblePanos.map(e=>e.id))
  21636. }
  21637. }, {
  21638. key: "addFrame",
  21639. value: function addFrame(frameType, isFromInfo) {
  21640. // 没有边框直接添加,有不同的边框先删旧的再添加
  21641. if (!this.frame || this.frame.type !== frameType || isFromInfo) {
  21642. if (this.frame) {
  21643. this.frame.dispose(isFromInfo);
  21644. this.frame = null;
  21645. }
  21646. if (frameType) {
  21647. // 其他边框替换为wall_1时要重新赋值厚度,初始化或回退的时候不用管
  21648. if (!isFromInfo && frameType == 'wall_1') {
  21649. // depth是实际厚度,depthTemp用于暂存wall_1的厚度
  21650. this.depth = this.depthTemp;
  21651. }
  21652. var frame = new OverlayFrame(frameType);
  21653. frame.setOverlay(this, isFromInfo);
  21654. this.player.OverlayManager.frameGroup.add(frame);
  21655. }
  21656. } else {
  21657. // 相同边框 根据overlay重新计算frame
  21658. var _this$frame$computeOv = this.frame.computeOverlayTransform({
  21659. reverse: true
  21660. }),
  21661. position = _this$frame$computeOv.position,
  21662. quaternion = _this$frame$computeOv.quaternion;
  21663. this.frame.position.copy(position);
  21664. this.frame.quaternion.copy(quaternion);
  21665. }
  21666. }
  21667. }, {
  21668. key: "dispose",
  21669. value: function dispose() {
  21670. if (this.plane.material.map) {
  21671. //清空video
  21672. var video = this.plane.material.map.image;
  21673. if (video && video.load) {
  21674. video.src = '';
  21675. video.load();
  21676. }
  21677. }
  21678. this.plane.material.dispose();
  21679. this.plane.material.map = null;
  21680. this.parent.remove(this);
  21681. }
  21682. }, {
  21683. key: "inSight",
  21684. value: function inSight() {
  21685. if (isEdit$1) return true; // 太容易move了
  21686. if (this.player.mode == 'panorama' && this.player.currentPano) {
  21687. if (this.visiblePanos && !this.visiblePanos.includes(this.player.currentPano)) return false; //最好保存下visiblePanos
  21688. if (!this.player.camera) return;
  21689. var cornerPointInfo = this.getCornerPoint();
  21690. var cornerPoint;
  21691. var min = new THREE.Vector2(2, 2);
  21692. var scaleRatio = 1 / this.player.zoomLevel; //根据media原始大小来调整阈值: media的原始大小能代表期望显示的大小,如果显示大小的远小于期望大小,就不显示(此时能感受到贴图锯齿严重,清晰度被浪费)。比如如果gif是一个很小的按钮,即使diffLon很小也要显示。缺点:需要用户根据所需上传合适清晰度的图。
  21693. var size = this.getMediaSize();
  21694. if (size.x > 0) {
  21695. scaleRatio *= Math.sqrt(size.x * size.y) / 1000;
  21696. }
  21697. min.multiplyScalar(scaleRatio);
  21698. if (cornerPointInfo.diffLon < min.x || cornerPointInfo.diffLat < min.y) {
  21699. //console.log('two far and small')
  21700. return false;
  21701. }
  21702. if (cornerPointInfo.diffLon < 15 && cornerPointInfo.diffLat < 15) {
  21703. //当很小的时候,只判断中心点即可
  21704. cornerPoint = [cornerPointInfo.cornerPoint[0]];
  21705. } else {
  21706. cornerPoint = cornerPointInfo.cornerPoint;
  21707. }
  21708. for (var i = 0, j = cornerPoint.length; i < j; i++) {
  21709. //只要有一点可见就算看见
  21710. var pos2d = convertTool.getPos2d(cornerPoint[i], this.player);
  21711. if (pos2d.trueSide && pos2d.inSight) return true;
  21712. }
  21713. } else {
  21714. //飞出 只判断在不在画面内
  21715. var frustumMatrix = new THREE.Matrix4();
  21716. frustumMatrix.multiplyMatrices(this.player.camera.projectionMatrix, this.player.camera.matrixWorldInverse);
  21717. var frustum = new THREE.Frustum();
  21718. frustum.setFromProjectionMatrix(frustumMatrix);
  21719. if (!this.plane.geometry.boundingBox) {
  21720. this.plane.geometry.computeBoundingBox();
  21721. }
  21722. var bounding = this.plane.geometry.boundingBox.clone().applyMatrix4(this.matrixWorld);
  21723. return frustum.intersectsBox(bounding);
  21724. }
  21725. }
  21726. }, {
  21727. key: "getMediaSize",
  21728. value: function getMediaSize() {
  21729. var size = new THREE.Vector2();
  21730. if (this.info.media instanceof Image) {
  21731. size.x = this.info.media.width;
  21732. size.y = this.info.media.height;
  21733. } else if (this.info.media instanceof HTMLVideoElement) {
  21734. size.x = this.info.media.videoWidth || 1000;
  21735. size.y = this.info.media.videoHeight || 1000;
  21736. } else {
  21737. size.x = 1000;
  21738. size.y = 1000;
  21739. }
  21740. return size;
  21741. }
  21742. }, {
  21743. key: "getCornerPoint",
  21744. value: function getCornerPoint() {
  21745. var _this4 = this;
  21746. //获取在每个漫游点上的视觉边界点 可以打开boxHelper和addBall来观测是否准确
  21747. if (this.cornerPoints[this.player.currentPano.id]) {
  21748. return this.cornerPoints[this.player.currentPano.id];
  21749. } else {
  21750. var boundPoint, cornerPoint;
  21751. var center; //中心点
  21752. if (this.plane) {
  21753. center = this.plane.getWorldPosition(new THREE.Vector3());
  21754. 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)];
  21755. }
  21756. var maxLon = -Infinity;
  21757. var minLon = +Infinity;
  21758. var maxLat = -Infinity;
  21759. var minLat = +Infinity;
  21760. var pos1 = this.player.currentPano.position.clone();
  21761. center = this.position.clone(); //模型bound的中心点已经位移到了hot中心点。 注意不能用getWorldPosition,得到的会是偏移的
  21762. var dir = center.clone().sub(pos1).normalize();
  21763. var centerDirInfo = {};
  21764. this.player.cameraControls.controls.panorama.lookAt.call(centerDirInfo, null, dir);
  21765. boundPoint.forEach(function (e) {
  21766. //lon左右
  21767. var point = e.applyMatrix4(_this4.plane.matrixWorld);
  21768. var dir = point.clone().sub(pos1).normalize();
  21769. var dirInfo = {};
  21770. _this4.player.cameraControls.controls.panorama.lookAt.call(dirInfo, null, dir);
  21771. var diffLon = (dirInfo.lon - centerDirInfo.lon) % 360;
  21772. if (Math.abs(diffLon) > 180) {
  21773. //因为有时需要根据符号判断是在中心的左边还是右边,所以限制在180内
  21774. diffLon += diffLon > 0 ? -360 : 360;
  21775. }
  21776. var diffLat = dirInfo.lat - centerDirInfo.lat;
  21777. maxLon = Math.max(diffLon, maxLon);
  21778. minLon = Math.min(diffLon, minLon);
  21779. maxLat = Math.max(diffLat, maxLat);
  21780. minLat = Math.min(diffLat, minLat);
  21781. });
  21782. var diffLon = maxLon - minLon;
  21783. var diffLat = maxLat - minLat;
  21784. if (diffLat > 180) {
  21785. //可能是到了反面。不好算,直接返回所有boundPoint
  21786. cornerPoint = boundPoint;
  21787. } else {
  21788. //读取lon lat的最大最小值,勾勒出一个没有倾斜的矩形 。它比boundPoint看起来范围更大些
  21789. maxLon = maxLon + centerDirInfo.lon;
  21790. maxLat = maxLat + centerDirInfo.lat;
  21791. minLon = minLon + centerDirInfo.lon;
  21792. minLat = minLat + centerDirInfo.lat;
  21793. var dirs = [math$2.getDirByLonLat(maxLon, maxLat), math$2.getDirByLonLat(minLon, minLat), math$2.getDirByLonLat(maxLon, minLat), math$2.getDirByLonLat(minLon, maxLat)];
  21794. cornerPoint = dirs.map(function (a) {
  21795. return a.negate().add(pos1);
  21796. });
  21797. cornerPoint = [center].concat(_toConsumableArray(cornerPoint)); //最后增加一个中心点
  21798. }
  21799. /* if(this.objObject){
  21800. cornerPoint = [pos2, ...cornerPoint]
  21801. } */
  21802. //addPoints(cornerPoint)
  21803. this.cornerPoints[this.player.currentPano.id] = {
  21804. cornerPoint,
  21805. diffLon,
  21806. diffLat
  21807. };
  21808. return this.cornerPoints[this.player.currentPano.id];
  21809. }
  21810. }
  21811. }, {
  21812. key: "videoControl",
  21813. value: function videoControl(state) {
  21814. var video = this.info.media; //console.log('videoControl',state, this.sid)
  21815. this.shouldPlay = state;
  21816. if (!state || state == 'stop') {
  21817. if (video instanceof HTMLVideoElement && !video.paused) {
  21818. video.pause();
  21819. console.log('videoControl paused ');
  21820. }
  21821. /* if(state == 'stop'){
  21822. video.currentTime = 0;
  21823. } */
  21824. } else if (state) {
  21825. if (video.paused || !(video instanceof HTMLVideoElement)) {
  21826. console.log('videoControl play ');
  21827. video = this.loadVideo();
  21828. video.play(); //if (common.isVideoPlayed(video)) console.log('played ')
  21829. }
  21830. }
  21831. }
  21832. }]);
  21833. return Overlay;
  21834. }(THREE.Object3D);
  21835. 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); }; }
  21836. 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; } }
  21837. function exitFullScreen() {
  21838. if (document.fullscreenElement && document.fullscreenElement.tagName === 'VIDEO' && document.fullscreenElement.getAttribute('unfullscreen')) {
  21839. if (document.exitFullscreen) {
  21840. document.exitFullscreen();
  21841. } else if (document.msExitFullscreen) {
  21842. document.msExitFullscreen();
  21843. } else if (document.mozCancelFullScreen) {
  21844. document.mozCancelFullScreen();
  21845. } else if (document.oRequestFullscreen) {
  21846. document.oCancelFullScreen();
  21847. } else if (document.webkitExitFullscreen) {
  21848. document.webkitExitFullscreen();
  21849. } else if (document.webkitCancelFullScreen) {
  21850. document.webkitCancelFullScreen();
  21851. }
  21852. setTimeout(function () {
  21853. exitFullScreen();
  21854. }, 250);
  21855. }
  21856. }
  21857. if (browser$1.detectAndroidMobile()) {
  21858. //针对Android横屏时video会自动全屏播放的bug #39505 #43421
  21859. window.addEventListener('resize', function () {
  21860. //resize时如果全屏元素为video, 退出全屏
  21861. setTimeout(function () {
  21862. exitFullScreen();
  21863. }, 500); //太快可能检测不到document.fullscreenElement
  21864. });
  21865. window.addEventListener('orientationchange', function (e) {
  21866. // 空间视频横屏时会触发自动全屏
  21867. if (window.orientation == 0 || window.orientation == 180) {
  21868. //竖屏
  21869. var videos = document.querySelectorAll('video[box]'); //只针对有box属性的video标签(空间视频)
  21870. videos.forEach(function (item) {
  21871. item.remove();
  21872. });
  21873. setTimeout(function () {
  21874. videos.forEach(function (i) {
  21875. document.body.appendChild(i);
  21876. i.play();
  21877. });
  21878. }, 500);
  21879. } else {
  21880. // 横屏
  21881. var _videos = document.querySelectorAll('video[box]');
  21882. _videos.forEach(function (item) {
  21883. item.remove();
  21884. });
  21885. setTimeout(function () {
  21886. _videos.forEach(function (i) {
  21887. document.body.appendChild(i);
  21888. i.play();
  21889. });
  21890. }, 500);
  21891. }
  21892. });
  21893. }
  21894. var FlvVideoPlayerBase = /*#__PURE__*/function (_EventEmitter) {
  21895. _inherits(FlvVideoPlayerBase, _EventEmitter);
  21896. var _super = _createSuper$1t(FlvVideoPlayerBase);
  21897. function FlvVideoPlayerBase(player) {
  21898. var _this;
  21899. _classCallCheck(this, FlvVideoPlayerBase);
  21900. _this = _super.call(this);
  21901. _this.player = player;
  21902. _this.instances = new Map();
  21903. _this.video = null;
  21904. return _this;
  21905. } //overlay info -- [metadata.overlay]
  21906. _createClass(FlvVideoPlayerBase, [{
  21907. key: "addVideo",
  21908. value: function addVideo(sid) {
  21909. var instance = this._createVideo(this._getVideoPath(sid));
  21910. this.instances.set(sid, instance);
  21911. instance.videoElement.masters = []; //一个video可以对应多个主体,因为它们链接一样
  21912. return instance;
  21913. }
  21914. }, {
  21915. key: "getVideo",
  21916. value: function getVideo(sid, master) {
  21917. var instance = this.instances.get(sid);
  21918. if (!instance) {
  21919. instance = this.addVideo(sid);
  21920. }
  21921. master && instance.videoElement.masters.push(master);
  21922. return instance.videoElement;
  21923. }
  21924. }, {
  21925. key: "_getVideoPath",
  21926. value: function _getVideoPath(sid) {//在子类中扩展
  21927. }
  21928. }, {
  21929. key: "_createVideo",
  21930. value: function _createVideo(url) {
  21931. var _this2 = this;
  21932. var video = document.createElement('video');
  21933. video.setAttribute('crossOrigin', 'anonymous');
  21934. video.setAttribute('playsinline', 'true');
  21935. video.setAttribute('webkit-playsinline', 'true');
  21936. video.setAttribute('controls', 'true');
  21937. video.setAttribute('unfullscreen', 'true');
  21938. video.autoplay = false;
  21939. video.muted = true;
  21940. video.loop = true;
  21941. video.style.position = 'fixed';
  21942. video.style.left = '0';
  21943. video.style.top = '0';
  21944. video.style.zIndex = '0';
  21945. video.style.width = '1px'; // video.style.display = 'none'
  21946. //video.isFirstPlay = true;
  21947. video.style.opacity = '0';
  21948. document.body.appendChild(video);
  21949. video.player = this;
  21950. var player = flvjs.createPlayer({
  21951. type: 'flv',
  21952. url: url
  21953. });
  21954. player.videoElement = video;
  21955. player.attachMediaElement(video);
  21956. player.on(flvjs.Events.ERROR, function () {
  21957. _this2._onPlayerError();
  21958. console.log('尝试使用mp4链接进行播放');
  21959. video.src = url.replace('.flv', '.mp4');
  21960. });
  21961. player.load();
  21962. return player;
  21963. }
  21964. }, {
  21965. key: "_onPlayerError",
  21966. value: function _onPlayerError() {
  21967. console.warn('视频加载失败');
  21968. }
  21969. }]);
  21970. return FlvVideoPlayerBase;
  21971. }(EventEmitter);
  21972. 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); }; }
  21973. 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; } }
  21974. var FlvVideoPlayer$2 = /*#__PURE__*/function (_FlvVideoPlayerBase) {
  21975. _inherits(FlvVideoPlayer, _FlvVideoPlayerBase);
  21976. var _super = _createSuper$1s(FlvVideoPlayer);
  21977. function FlvVideoPlayer(player) {
  21978. _classCallCheck(this, FlvVideoPlayer);
  21979. return _super.call(this, player);
  21980. }
  21981. _createClass(FlvVideoPlayer, [{
  21982. key: "_createVideo",
  21983. value: function _createVideo(url) {
  21984. var video = document.createElement('video');
  21985. video.setAttribute('crossOrigin', 'anonymous');
  21986. video.setAttribute('playsinline', 'true');
  21987. video.setAttribute('webkit-playsinline', 'true');
  21988. video.setAttribute('controls', 'true');
  21989. video.setAttribute('box', 'true');
  21990. video.setAttribute('unfullscreen', 'true');
  21991. video.autoplay = false;
  21992. video.muted = true;
  21993. video.loop = true;
  21994. video.style.position = 'fixed';
  21995. video.style.left = '0';
  21996. video.style.top = '0';
  21997. video.style.zIndex = '0';
  21998. video.style.width = '1px'; // video.style.display = 'none'
  21999. //video.isFirstPlay = true;
  22000. video.style.opacity = '0';
  22001. document.body.appendChild(video);
  22002. video.player = this;
  22003. var player = flvjs.createPlayer({
  22004. type: 'flv',
  22005. url: url
  22006. });
  22007. player.videoElement = video;
  22008. player.attachMediaElement(video);
  22009. player.on(flvjs.Events.ERROR, this._onPlayerError.bind(this));
  22010. player.load();
  22011. return player;
  22012. }
  22013. }, {
  22014. key: "_getVideoPath",
  22015. value: function _getVideoPath(sid) {
  22016. // return config.getResourceImageURL(`overlay` + sid + '.flv?m=' + config.version)
  22017. return this.player.$app.resource.getUserResourceURL(sid + '.flv');
  22018. }
  22019. }]);
  22020. return FlvVideoPlayer;
  22021. }(FlvVideoPlayerBase);
  22022. 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); }; }
  22023. 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; } }
  22024. var H5VideoPlayerBase = /*#__PURE__*/function (_EventEmitter) {
  22025. _inherits(H5VideoPlayerBase, _EventEmitter);
  22026. var _super = _createSuper$1r(H5VideoPlayerBase);
  22027. function H5VideoPlayerBase(player) {
  22028. var _this;
  22029. _classCallCheck(this, H5VideoPlayerBase);
  22030. _this = _super.call(this);
  22031. _this.player = player;
  22032. _this.video = null;
  22033. _this.videos = new Map();
  22034. return _this;
  22035. } //overlay info -- [metadata.overlay]
  22036. _createClass(H5VideoPlayerBase, [{
  22037. key: "addVideo",
  22038. value: function addVideo(sid) {
  22039. var video = this._createVideoElement(this._getVideoPath(sid));
  22040. this.videos.set(sid, video);
  22041. video.masters = [];
  22042. return video;
  22043. }
  22044. }, {
  22045. key: "getVideo",
  22046. value: function getVideo(sid, master, url) {
  22047. url && (sid = url); //add
  22048. var video = this.videos.get(sid);
  22049. if (!video) {
  22050. video = this.addVideo(sid);
  22051. }
  22052. master && video.masters.push(master);
  22053. return video;
  22054. }
  22055. }, {
  22056. key: "_getVideoPath",
  22057. value: function _getVideoPath(sid) {
  22058. // return config.getResourceImageURL(window.kankan.config.num + `/overlay` + sid + '.mp4?m=' + config.version)
  22059. return this.player.$app.resource.getUserResourceURL(sid + '.mp4');
  22060. }
  22061. }, {
  22062. key: "_createVideoElement",
  22063. value: function _createVideoElement(src) {
  22064. var video = document.createElement('video');
  22065. video.setAttribute('crossOrigin', 'anonymous');
  22066. video.setAttribute('playsinline', 'true');
  22067. video.setAttribute('x5-playsinline', 'true');
  22068. video.setAttribute('webkit-playsinline', 'true');
  22069. video.setAttribute('x5-video-player-type', 'h5');
  22070. video.setAttribute('controls', 'true');
  22071. video.setAttribute('x-webkit-airplay', 'allow');
  22072. video.autoplay = true;
  22073. video.muted = true;
  22074. video.loop = true;
  22075. video.src = src;
  22076. video.style.position = 'fixed';
  22077. video.style.left = '0';
  22078. video.style.top = '0';
  22079. video.style.zIndex = '1000';
  22080. video.style.width = '300px';
  22081. video.style.height = '300px'; //video.style.display = browser.urlHasValue('debug') ? 'block' : 'none'
  22082. //document.body.appendChild(video)
  22083. return video;
  22084. }
  22085. }]);
  22086. return H5VideoPlayerBase;
  22087. }(EventEmitter);
  22088. 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); }; }
  22089. 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; } }
  22090. var H5VideoPlayer$2 = /*#__PURE__*/function (_H5VideoPlayerBase) {
  22091. _inherits(H5VideoPlayer, _H5VideoPlayerBase);
  22092. var _super = _createSuper$1q(H5VideoPlayer);
  22093. function H5VideoPlayer(player) {
  22094. _classCallCheck(this, H5VideoPlayer);
  22095. return _super.call(this, player);
  22096. }
  22097. /* _getVideoPath(sid) {
  22098. // return config.getResourceImageURL(window.kankan.config.num + `/overlay` + sid + '.mp4?m=' + config.version)
  22099. return this.player.$app.resource.getUserResourceURL(sid + '.mp4')
  22100. } */
  22101. _createClass(H5VideoPlayer, [{
  22102. key: "_getVideoPath",
  22103. value: function _getVideoPath(url) {
  22104. //支持webm
  22105. return this.player.$app.resource.getUserResourceURL(url);
  22106. }
  22107. }]);
  22108. return H5VideoPlayer;
  22109. }(H5VideoPlayerBase);
  22110. var app$1;
  22111. var store;
  22112. function intStore() {
  22113. store = {
  22114. version: 1,
  22115. upPath: '',
  22116. // videoPath: 'https://4dkk.4dage.com/video/videot-FSVqkqQ0Bi/', //config.getPublicResource("video/video#m#/"), ${this.$app.config.num}
  22117. // videoPath: config.getResourceURL('video/video' + window.kankan.config.num + '/'),
  22118. videoPath: app$1.resource.getViewResourceURL('video/'),
  22119. // scene_view_data/t-RGjyzx4/videos/ config.getResourceURL('video/video/'),
  22120. videoInfos: new Map(),
  22121. parameters: {
  22122. inputWidth: 0,
  22123. inputHeight: 0,
  22124. outputWidth: 0,
  22125. outputHeight: 0,
  22126. focal: 0,
  22127. pixel: 0,
  22128. centerX: 0,
  22129. centerY: 0,
  22130. translateX: 0,
  22131. translateY: 0,
  22132. translateZ: 0,
  22133. lenOffsetX: 0,
  22134. lenOffsetY: 0,
  22135. videoWidth: 0,
  22136. videoHeight: 0,
  22137. mapping: 0,
  22138. //0-只对x轴做了clip 1-对中央固定区域做clip 2-动态clip
  22139. cameraType: 0,
  22140. blend_fov: 5
  22141. }
  22142. };
  22143. }
  22144. function handle(sceneMeta, sdk) {
  22145. app$1 = sdk;
  22146. if (!store) intStore();
  22147. var imagesVersion = '';
  22148. if (typeof sceneMeta.version != 'undefined') {
  22149. imagesVersion = '?imagesVersion=' + sceneMeta.version;
  22150. }
  22151. if (!sceneMeta.videos) {
  22152. sceneMeta.videos = {
  22153. version: store.version,
  22154. videos: store.videoInfos,
  22155. parameters: store.parameters
  22156. };
  22157. mergeNewPanoVideo(store, sceneMeta['videosUser'], imagesVersion);
  22158. return;
  22159. } else {
  22160. try {
  22161. var checkvideos = sceneMeta.videos;
  22162. if (!checkvideos.data || !checkvideos.data.length) {
  22163. sceneMeta.videos = {
  22164. version: store.version,
  22165. videos: store.videoInfos,
  22166. parameters: store.parameters
  22167. };
  22168. mergeNewPanoVideo(store, sceneMeta['videosUser'], imagesVersion);
  22169. return;
  22170. }
  22171. } catch (err) {
  22172. console.error(err);
  22173. }
  22174. }
  22175. var sceneFrom = sceneMeta.sceneFrom || 'pro';
  22176. if (sceneFrom == 'pro') {
  22177. //8目
  22178. var videosInfo = sceneMeta.videos;
  22179. var version = videosInfo.version || 0;
  22180. store.version = version;
  22181. store.parameters.cameraType = 8;
  22182. if (version == 1) {
  22183. videosInfo.data.forEach(function (item) {
  22184. store.videoInfos.set(item.id, {
  22185. mp4: {
  22186. url: store.videoPath + item.id + '.mp4' + imagesVersion
  22187. },
  22188. mpeg: {
  22189. url: store.videoPath + item.id + '.ts',
  22190. size: item.tsSize + imagesVersion
  22191. },
  22192. flv: {
  22193. url: store.videoPath + item.id + '.flv' + imagesVersion
  22194. },
  22195. //Test,
  22196. exposure: Number(item.value) || 1,
  22197. mapping: 0,
  22198. cameraType: 8,
  22199. blend_fov: item.blend_fov || 5
  22200. });
  22201. });
  22202. } else if (version > 1) {
  22203. videosInfo.data.forEach(function (item) {
  22204. store.videoInfos.set(item.id, {
  22205. mp4: {
  22206. url: store.videoPath + item.id + '.mp4' + imagesVersion
  22207. },
  22208. mpeg: {
  22209. url: store.videoPath + item.id + '.ts' + imagesVersion,
  22210. size: item.tsSize
  22211. },
  22212. flv: {
  22213. url: store.videoPath + item.id + '.flv' + imagesVersion
  22214. },
  22215. exposure: Number(item.value) || 1,
  22216. mapping: 1,
  22217. cameraType: 8,
  22218. blend_fov: item.blend_fov || 5
  22219. });
  22220. });
  22221. }
  22222. return loadParameterFor8Cameras(videosInfo.upPath).then(function (store) {
  22223. if (version <= 2) {
  22224. store.parameters.inputWidth = 2304;
  22225. store.parameters.inputHeight = 1728;
  22226. store.parameters.outputWidth = 2048;
  22227. store.parameters.outputHeight = 1024;
  22228. } else if (version > 2) {
  22229. store.parameters.inputWidth = 4608;
  22230. store.parameters.inputHeight = 3456;
  22231. store.parameters.outputWidth = 8192;
  22232. store.parameters.outputHeight = 4096;
  22233. store.parameters.lenOffsetX = 1235;
  22234. store.parameters.lenOffsetY = 954;
  22235. store.parameters.videoWidth = 2112;
  22236. store.parameters.videoHeight = 1584;
  22237. store.parameters.mapping = 1;
  22238. }
  22239. sceneMeta.videos = {
  22240. version: store.version,
  22241. videos: store.videoInfos,
  22242. parameters: store.parameters
  22243. }; // 将新的方案数据融合进来
  22244. mergeNewPanoVideo(store, sceneMeta['videosUser'], imagesVersion);
  22245. return store;
  22246. }).catch(function (error) {
  22247. throw error;
  22248. });
  22249. } else if (sceneFrom == 'lite') {
  22250. //2目
  22251. var _videosInfo = sceneMeta.videos;
  22252. var _version = _videosInfo.version || 0;
  22253. store.version = _version;
  22254. store.parameters.cameraType = 2;
  22255. var _imagesVersion = '';
  22256. if (typeof sceneMeta.version != 'undefined') {
  22257. _imagesVersion = '?imagesVersion=' + sceneMeta.version;
  22258. }
  22259. if (_version == 1) {
  22260. _videosInfo.data.forEach(function (item) {
  22261. store.videoInfos.set(item.id, {
  22262. mp4: {
  22263. url: store.videoPath + item.id + '.mp4' + _imagesVersion
  22264. },
  22265. mpeg: {
  22266. url: store.videoPath + item.id + '.ts',
  22267. size: item.tsSize + _imagesVersion
  22268. },
  22269. flv: {
  22270. url: store.videoPath + item.id + '.flv' + _imagesVersion
  22271. },
  22272. //Test,
  22273. exposure: Number(item.value) || 1,
  22274. mapping: 1,
  22275. cameraType: 2,
  22276. blend_fov: item.blend_fov || 5
  22277. });
  22278. });
  22279. }
  22280. return loadParameterFor2Cameras(_videosInfo.upPath).then(function (store) {
  22281. if (_version == 1) {
  22282. store.parameters.inputWidth = 3000;
  22283. store.parameters.inputHeight = 3000;
  22284. store.parameters.outputWidth = 4096;
  22285. store.parameters.outputHeight = 2048;
  22286. store.parameters.pixel = 1.12;
  22287. }
  22288. sceneMeta.videos = {
  22289. version: store.version,
  22290. videos: store.videoInfos,
  22291. parameters: store.parameters
  22292. };
  22293. return store;
  22294. }).catch(function (error) {
  22295. throw error;
  22296. });
  22297. } else if (sceneFrom == 'minion' || sceneFrom == 'laser') {
  22298. //转台双目
  22299. var _videosInfo2 = sceneMeta.videos;
  22300. var _version2 = _videosInfo2.version || 0;
  22301. store.version = _version2;
  22302. store.parameters.cameraType = 3;
  22303. var _imagesVersion2 = '';
  22304. if (typeof sceneMeta.version != 'undefined') {
  22305. _imagesVersion2 = '?imagesVersion=' + sceneMeta.version;
  22306. }
  22307. _videosInfo2.data.forEach(function (item) {
  22308. store.videoInfos.set(item.id, {
  22309. mp4: {
  22310. url: store.videoPath + item.id + '.mp4' + _imagesVersion2
  22311. },
  22312. mpeg: {
  22313. url: store.videoPath + item.id + '.ts',
  22314. size: item.tsSize + _imagesVersion2
  22315. },
  22316. flv: {
  22317. url: store.videoPath + item.id + '.flv' + _imagesVersion2
  22318. },
  22319. //Test,
  22320. exposure: Number(item.value) || 1,
  22321. mapping: 1,
  22322. cameraType: 3,
  22323. blend_fov: item.blend_fov || 5
  22324. });
  22325. });
  22326. return loadParameterForRotStereoCameras(_videosInfo2.upPath).then(function (store) {
  22327. store.parameters.inputWidth = 5472;
  22328. store.parameters.inputHeight = 3648;
  22329. store.parameters.outputWidth = 4096;
  22330. store.parameters.outputHeight = 2048;
  22331. store.parameters.lenOffsetX = 920;
  22332. store.parameters.lenOffsetY = 500;
  22333. store.parameters.videoWidth = 3630;
  22334. store.parameters.videoHeight = 2670;
  22335. store.parameters.pixel = 1.12;
  22336. sceneMeta.videos = {
  22337. version: store.version,
  22338. videos: store.videoInfos,
  22339. parameters: store.parameters
  22340. };
  22341. mergeNewPanoVideo(store, sceneMeta['videosUser'], _imagesVersion2); //add
  22342. return store;
  22343. }).catch(function (error) {
  22344. throw error;
  22345. });
  22346. } else {
  22347. console.warn('有尚不支持的相机来源:', sceneFrom);
  22348. }
  22349. }
  22350. /**
  22351. * @type Promise
  22352. */
  22353. var loadParameterPromise = null;
  22354. function loadParameterFor8Cameras(url) {
  22355. if (loadParameterPromise) return loadParameterPromise;
  22356. loadParameterPromise = new Promise(function (resolve, reject) {
  22357. if (!url) reject('找不到参数请求地址');
  22358. if (!/^http(s?)/.test(url)) {
  22359. url = app$1.resource.getResourceURL(url);
  22360. }
  22361. http.getText(url).then(function (text) {
  22362. return resolve(text);
  22363. }).catch(function (reson) {
  22364. return reject(reson);
  22365. });
  22366. }).then(function (text) {
  22367. var formatted = text.split(/\n/).filter(function (item) {
  22368. return item.trim() != '';
  22369. }) //空行分割取第一个
  22370. .map(function (item) {
  22371. return item.split(':');
  22372. });
  22373. var focal = Number(formatted[0][1]);
  22374. var pixel = Number(formatted[1][1]);
  22375. var center = formatted[2][1].trim().split(/\s+/).map(function (item) {
  22376. return Number(item);
  22377. });
  22378. var translateX = formatted[7][0].trim().split(/\s+/).map(function (item) {
  22379. return Number(item);
  22380. })[3],
  22381. translateY = formatted[8][0].trim().split(/\s+/).map(function (item) {
  22382. return Number(item);
  22383. })[3],
  22384. translateZ = formatted[9][0].trim().split(/\s+/).map(function (item) {
  22385. return Number(item);
  22386. })[3];
  22387. store.parameters.focal = focal;
  22388. store.parameters.pixel = pixel;
  22389. store.parameters.centerX = center[0];
  22390. store.parameters.centerY = center[1];
  22391. store.parameters.translateX = translateX;
  22392. store.parameters.translateY = translateY;
  22393. store.parameters.translateZ = translateZ;
  22394. return store;
  22395. }).catch(function (error) {
  22396. console.warn('球幕视频【八目】:参数文件加载失败', error);
  22397. return store;
  22398. }).finally(function () {
  22399. return store;
  22400. });
  22401. return loadParameterPromise;
  22402. }
  22403. function loadParameterFor2Cameras(url) {
  22404. if (loadParameterPromise) return loadParameterPromise;
  22405. loadParameterPromise = new Promise(function (resolve, reject) {
  22406. if (!url) reject('找不到参数请求地址');
  22407. if (!/^http(s?)/.test(url)) {
  22408. url = app$1.resource.getResourceURL(url);
  22409. }
  22410. http.getText(url, null, function (text) {
  22411. resolve(text);
  22412. }, function (reson) {
  22413. reject(reson);
  22414. });
  22415. }).then(function (text) {
  22416. var properties = {};
  22417. text.split('\n').map(function (line) {
  22418. if (line.length > 0) {
  22419. var keyValueParse = line.split(':');
  22420. var key = keyValueParse[0];
  22421. var values = keyValueParse[1].trim().split(' ');
  22422. properties[key] = Number(values[0]);
  22423. }
  22424. });
  22425. store.parameters.focal = properties['focal'];
  22426. store.parameters.centerX = properties['cx'];
  22427. store.parameters.centerY = properties['cy'];
  22428. store.parameters.translateX = properties['tx'];
  22429. store.parameters.translateY = properties['ty'];
  22430. store.parameters.translateZ = properties['tz'];
  22431. return store;
  22432. }).catch(function (error) {
  22433. console.warn('球幕视频【双目】:参数文件加载失败');
  22434. return store;
  22435. }).finally(function () {
  22436. return store;
  22437. });
  22438. return loadParameterPromise;
  22439. }
  22440. function loadParameterForRotStereoCameras(url) {
  22441. // url = url.replace('Uptxt', 'Up.txt')
  22442. if (loadParameterPromise) return loadParameterPromise;
  22443. loadParameterPromise = new Promise(function (resolve, reject) {
  22444. if (!url) reject('找不到参数请求地址');
  22445. if (!/^http(s?)/.test(url)) {
  22446. url = app$1.resource.getResourceURL(url);
  22447. }
  22448. resolve(http.getText(url));
  22449. }).then(function (text) {
  22450. var properties = {};
  22451. text.split('\n').map(function (line) {
  22452. if (line.length > 0) {
  22453. var keyValueParse = line.split(':');
  22454. var key = keyValueParse[0];
  22455. var values = keyValueParse[1].trim().split(' ');
  22456. properties[key] = Number(values[0]);
  22457. }
  22458. });
  22459. store.parameters.focal = properties['focal'];
  22460. store.parameters.centerX = properties['cx'];
  22461. store.parameters.centerY = properties['cy'];
  22462. store.parameters.translateX = properties['rx'];
  22463. store.parameters.translateY = properties['ry'];
  22464. store.parameters.translateZ = properties['rz'];
  22465. return store;
  22466. }).catch(function (error) {
  22467. console.warn('球幕视频【转台】:参数文件加载失败', error);
  22468. return store;
  22469. }).finally(function () {
  22470. return store;
  22471. });
  22472. return loadParameterPromise;
  22473. }
  22474. function mergeNewPanoVideo(store, newScheme, imagesVersion) {
  22475. // if(config.isEdit){
  22476. // return
  22477. // }
  22478. if (!newScheme) return;
  22479. var data = JSON.parse(newScheme);
  22480. data.forEach(function (item) {
  22481. store.videoInfos.set(item.panoId, {
  22482. dir: new THREE.Vector3().copy(item.dir),
  22483. hfov: parseFloat(item.hfov),
  22484. vfov: parseFloat(item.vfov),
  22485. mp4: {
  22486. url: store.videoPath + item.panoId + '-user.mp4' + imagesVersion
  22487. },
  22488. mpeg: {
  22489. url: store.videoPath + item.panoId + '-user.ts',
  22490. size: item.tsSize + imagesVersion
  22491. },
  22492. flv: {
  22493. url: store.videoPath + item.panoId + '-user.flv' + imagesVersion
  22494. },
  22495. //Test,
  22496. exposure: 1,
  22497. clipRect: item.rect,
  22498. mapping: 2
  22499. });
  22500. });
  22501. store.parameters.mapping = 2; //动态clip
  22502. store.parameters.cameraType = 8;
  22503. }
  22504. function getEnvironment() {
  22505. if (!store) intStore();
  22506. /**
  22507. * @type 'PC'|'Android'|'Ios'
  22508. */
  22509. var os = 'PC';
  22510. /**
  22511. * @type 'H5'|'WeChat'|'WeChatMiniprogram'
  22512. */
  22513. var environment = 'H5';
  22514. if (browser$1.detectAndroidMobile()) {
  22515. os = 'Android';
  22516. } else if (browser$1.detectIOS()) {
  22517. os = 'Ios';
  22518. }
  22519. if (browser$1.detectWeixin()) {
  22520. environment = 'WeChat';
  22521. if (navigator.userAgent.match('miniProgram')) {
  22522. environment = 'WeChatMiniprogram';
  22523. }
  22524. }
  22525. return {
  22526. os,
  22527. environment
  22528. };
  22529. }
  22530. var VersionControl = {
  22531. handle: handle,
  22532. getEnvironment: getEnvironment
  22533. };
  22534. 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); }; }
  22535. 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; } }
  22536. var OverlayManager = /*#__PURE__*/function (_EventEmitter) {
  22537. _inherits(OverlayManager, _EventEmitter);
  22538. var _super = _createSuper$1p(OverlayManager);
  22539. function OverlayManager(player) {
  22540. var _this;
  22541. _classCallCheck(this, OverlayManager);
  22542. _this = _super.call(this);
  22543. _this.list = [];
  22544. _this.player = player;
  22545. _this.model = _this.player.model;
  22546. _this.groupRoot = new THREE.Object3D();
  22547. _this.groupRoot.name = 'groupRoot';
  22548. _this.decorateGroup = new THREE.Object3D();
  22549. _this.decorateGroup.name = 'decorateGroup';
  22550. _this.frameGroup = new THREE.Object3D();
  22551. _this.frameGroup.name = 'frameGroup';
  22552. _this.decoratePlaneGroup = new THREE.Object3D();
  22553. _this.decoratePlaneGroup.name = 'decoratePlaneGroup';
  22554. _this.billGroup = new THREE.Object3D();
  22555. _this.billGroup.name = 'billGroup';
  22556. _this.decorateGroup.add(_this.decoratePlaneGroup);
  22557. _this.decorateGroup.add(_this.frameGroup);
  22558. _this.groupRoot.add(_this.billGroup);
  22559. _this.groupRoot.add(_this.decorateGroup);
  22560. _this.model.add(_this.groupRoot); //为了好安排不同类型的可视,只好分层加多个group
  22561. player.OverlayManager = _assertThisInitialized(_this);
  22562. _this.withBox = true;
  22563. _this.lineMat = LineDraw.createFatLineMat({
  22564. depthTest: false,
  22565. lineWidth: 2,
  22566. color: Colors.mainColor,
  22567. opacity: 0.3
  22568. });
  22569. _this.player.$app.core.get('SceneRenderer').addComponent(_assertThisInitialized(_this));
  22570. _this.VideoManager = _this.player.$app.VideoManager;
  22571. var metadata = _this.player.$app.store.getValue('metadata');
  22572. if (metadata.boxVideos && metadata.boxVideos.length) {
  22573. var info = metadata.boxVideos[0]; // let nonsupportH5Video = browser.detectAndroidMobile() //|| browser.detectWeixin() && !browser.detectWeixinMiniProgram() //iphoneX微信不能用flv, vivo
  22574. var _VersionControl$getEn = VersionControl.getEnvironment(),
  22575. os = _VersionControl$getEn.os,
  22576. environment = _VersionControl$getEn.environment;
  22577. if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  22578. // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
  22579. _this.overlayVideoPlayer = new FlvVideoPlayer$2(_this.player); // console.log('use FlvVideoPlayer')
  22580. } else {
  22581. // console.log('use H5VideoPlayer')
  22582. _this.overlayVideoPlayer = new H5VideoPlayer$2(_this.player);
  22583. } //if (nonsupportH5Video) console.error('nonsupportH5Video')
  22584. // this.overlayVideoPlayer = nonsupportH5Video ? new FlvVideoPlayer(this.player) : new H5VideoPlayer(this.player)
  22585. new Overlay(_this.player, info, _this.overlayVideoPlayer);
  22586. }
  22587. if (metadata.boxPhotos && metadata.boxPhotos.length) {
  22588. metadata.boxPhotos.forEach(function (info) {
  22589. new Overlay(_this.player, info);
  22590. });
  22591. } // let videoEdit = this.VideoManager.BoxVideo.edit
  22592. // this.player.model.on('floor.changed', (toFloor, mode) => {
  22593. // this.group.children.forEach(overlay => {
  22594. // overlay.floor == toFloor ? videoEdit.setVisible(overlay.sid, true) : videoEdit.setVisible(overlay.sid, false)
  22595. // })
  22596. // })
  22597. player.on('collectIntersectMesh', function (meshes) {
  22598. //推送要intersect的mesh
  22599. meshes.push.apply(meshes, _toConsumableArray(_this.list.filter(function (e) {
  22600. return e.realVisible();
  22601. }).map(function (overlay) {
  22602. return overlay.plane;
  22603. })));
  22604. });
  22605. player.on('judgeIntersect', function (intersect, e) {
  22606. //判断是否intersect了overlay
  22607. if (
  22608. /* e.getConsumed() || */
  22609. intersect && (intersect.object.overlayType || intersect.object.parent.overlayType)) {
  22610. _this.hoverOverlay(intersect.object);
  22611. e.consume();
  22612. } else {
  22613. _this.hoverOverlay(null);
  22614. }
  22615. });
  22616. player.on('pointerStart', function () {
  22617. /* this.intersect = player.getMouseIntersect(null, this.group.children.concat(player.model.colliders))
  22618. if (this.intersect && (this.intersect.object.overlayType || this.intersect.object.parent.overlayType)) {
  22619. this.OverlayManager.hoverOverlay(this.intersect.object)
  22620. } else this.OverlayManager.hoverOverlay(null) */
  22621. //for自动播放
  22622. _this.autoPlay();
  22623. });
  22624. player.on(PlayerEvents.FlyingStarted, function (_ref) {
  22625. var panoId = _ref.panoId;
  22626. //if (!this.player.EditOverlay.editPlane) {
  22627. // 当overlay仅限某一点位显示时,其它点位或飞出则需要隐藏.
  22628. _this.list.forEach(function (e) {
  22629. if (e.limitToOnlyPano) {
  22630. if (e.limitToOnlyPano.id != panoId) {
  22631. e.hide('limitToOnlyPano');
  22632. _this.player.EditOverlay.editPlane == e && _this.VideoManager.emit('videos/panel/updatePanoVisi', false);
  22633. } else {
  22634. e.show('limitToOnlyPano');
  22635. _this.player.EditOverlay.editPlane == e && _this.VideoManager.emit('videos/panel/updatePanoVisi', true);
  22636. }
  22637. }
  22638. }); //}
  22639. });
  22640. if (player.$app.config.view) {
  22641. //展示页面。 不要遮住漫游点视频
  22642. player.on(PlayerEvents.FlyingEnded, function (_ref2) {
  22643. var currentPano = _ref2.currentPano;
  22644. var panoVideoFilter;
  22645. if (player.mode == 'panorama') {
  22646. panoVideoFilter = currentPano.getVideoFilter();
  22647. }
  22648. _this.list.forEach(function (e) {
  22649. if (panoVideoFilter && panoVideoFilter(e.position)) {
  22650. e.hide('coveredPanoVideo');
  22651. } else {
  22652. e.show('coveredPanoVideo');
  22653. }
  22654. });
  22655. }); //展示页面延迟加载,且监控,可见才播放
  22656. _this.list.filter(function (e) {
  22657. return e.info.type == 'video';
  22658. }); //如果多个视频就这么写:
  22659. /* common.batchHandling.addSliceListen({
  22660. getList: () => {
  22661. return videos
  22662. },
  22663. minCount: 0,
  22664. maxCount: 1,
  22665. durBound1: 3,
  22666. durBound2: 13,
  22667. maxHistory: 3,
  22668. player: this.player,
  22669. callback: overlay => {
  22670. if (overlay.visible && overlay.inSight()) {
  22671. overlay.videoControl(true)
  22672. } else {
  22673. overlay.videoControl(false)
  22674. }
  22675. },
  22676. }) */
  22677. }
  22678. return _this;
  22679. }
  22680. _createClass(OverlayManager, [{
  22681. key: "add",
  22682. value: function add(overlay) {
  22683. if (overlay.info.isBillboard) {
  22684. this.billGroup.add(overlay);
  22685. } else {
  22686. this.decoratePlaneGroup.add(overlay);
  22687. }
  22688. this.list.push(overlay);
  22689. }
  22690. }, {
  22691. key: "remove",
  22692. value: function remove(overlay) {
  22693. var index = this.list.indexOf(overlay);
  22694. if (index > -1) {
  22695. if (overlay == this.hoveringPlane) {
  22696. this.hoverOverlay(null, 'soon');
  22697. }
  22698. overlay.dispose();
  22699. overlay.modified = 'delete';
  22700. overlay.frame && overlay.frame.dispose();
  22701. this.list.splice(index, 1);
  22702. }
  22703. }
  22704. }, {
  22705. key: "show",
  22706. value: function show(floorIndex, keepHidden) {
  22707. // this.group.visible = true
  22708. this.list.forEach(function (overlay) {
  22709. if (keepHidden && overlay.info.hide) return;
  22710. if (floorIndex == 'all' || overlay.floor.floorIndex == floorIndex) overlay.show('visiOnFloor');
  22711. });
  22712. }
  22713. }, {
  22714. key: "hide",
  22715. value: function hide(floorIndex) {
  22716. // this.group.visible = false
  22717. this.list.forEach(function (overlay) {
  22718. if (floorIndex == 'all' || overlay.floor.floorIndex == floorIndex) overlay.hide('visiOnFloor');
  22719. });
  22720. }
  22721. }, {
  22722. key: "setGroupVisible",
  22723. value: function setGroupVisible(visi) {
  22724. /* this.group.visible = !!visi
  22725. this.frameGroup.visible = !!visi */
  22726. common$1.updateVisible(this.groupRoot, 'setGroupVisible', visi);
  22727. }
  22728. }, {
  22729. key: "setSize",
  22730. value: function setSize(x, y) {
  22731. // this.lineMat.resolution.set( x,y );
  22732. if (this.openOverlay) {
  22733. this.resizeOverlay();
  22734. }
  22735. }
  22736. /*
  22737. hover到overlay时 创建四条fatLine 并渐变opacity由0至1;反之由1至0,最后删除
  22738. */
  22739. }, {
  22740. key: "hoverOverlay",
  22741. value: function hoverOverlay(plane, type) {
  22742. //这个plane可能是box
  22743. var overlay;
  22744. if (this.withBox && plane) {
  22745. overlay = plane.parent;
  22746. plane = overlay.plane;
  22747. } else {
  22748. overlay = plane;
  22749. }
  22750. if (overlay && overlay.info.isBillboard && overlay.targetPano == void 0 && config$6.view) {
  22751. //无跳转点不响应
  22752. return;
  22753. }
  22754. if (!this.model.player.billboardManager.editPlane) {
  22755. //需要一直高亮所编辑的billboard
  22756. this.highlight(overlay, type);
  22757. }
  22758. if (!plane) {
  22759. if (this.hoveringPlane) {
  22760. if (this.hoveringPlane.info.isBillboard) {
  22761. this.model.player.billboardManager.emit('hoverBillboard', {
  22762. sid: this.hoveringPlane.info.sid,
  22763. state: false
  22764. });
  22765. }
  22766. this.hoveringPlane = null;
  22767. }
  22768. CursorDeal.remove('hoverOverlay');
  22769. CursorDeal.remove('dragOverlay');
  22770. return;
  22771. }
  22772. if (overlay.isEditing && overlay.info.isBillboard) {
  22773. CursorDeal.add('dragOverlay');
  22774. } else {
  22775. CursorDeal.add('hoverOverlay');
  22776. }
  22777. this.hoveringPlane = overlay;
  22778. if (overlay.info.isBillboard) {
  22779. this.model.player.billboardManager.emit('hoverBillboard', {
  22780. sid: overlay.info.sid,
  22781. state: true
  22782. });
  22783. }
  22784. }
  22785. }, {
  22786. key: "highlight",
  22787. value: function highlight(overlay, type) {
  22788. var _this2 = this;
  22789. if (this.player.$app.config.view) return; //4.12.0 新增 查看页不显示高亮边框
  22790. //同时只能有一个高亮
  22791. var changeTime = 200;
  22792. if (!overlay) {
  22793. if (this.highlightPlane) {
  22794. //console.log('cancel highlight')
  22795. var cancelFuc = function cancelFuc() {
  22796. fadePlane.border.children.forEach(function (line) {
  22797. line.geometry.dispose();
  22798. });
  22799. fadePlane.remove(fadePlane.border);
  22800. };
  22801. var fadePlane = this.withBox ? this.highlightPlane.plane : this.highlightPlane;
  22802. transitions$1.cancelById(settings$3.freeze.wallLineShine);
  22803. if (type == 'soon') {
  22804. this.lineMat.opacity = 0;
  22805. cancelFuc();
  22806. } else {
  22807. transitions$1.start(function (progress) {
  22808. this.lineMat.opacity = 1 - progress;
  22809. }.bind(this), changeTime, cancelFuc, 0, easing[settings$3.transition.blendEasing], 'wallLineShine', settings$3.freeze.wallLineShine, cancelFuc);
  22810. }
  22811. }
  22812. this.highlightPlane = null;
  22813. return;
  22814. }
  22815. if (!overlay.visible) return;
  22816. if (overlay == this.highlightPlane) return; // 非编辑状态并且指示牌没有跳转点位,设置不高亮
  22817. //if (overlay.info.isBillboard && !overlay.isEditing && !overlay.info.targetPano) return
  22818. if (this.highlightPlane) {
  22819. this.highlight(null);
  22820. } //console.log('highlight')
  22821. this.highlightPlane = overlay;
  22822. var points = overlay.plane.geometry.getAttribute('position').array;
  22823. var borders = new THREE.Object3D();
  22824. var indeces = [0, 1, 3, 2];
  22825. for (var j = 0; j < 4; j++) {
  22826. var p = [{
  22827. x: points[indeces[j] * 3],
  22828. y: points[indeces[j] * 3 + 1],
  22829. z: points[indeces[j] * 3 + 2]
  22830. }, {
  22831. x: points[indeces[(j + 1) % 4] * 3],
  22832. y: points[indeces[(j + 1) % 4] * 3 + 1],
  22833. z: points[indeces[(j + 1) % 4] * 3 + 2]
  22834. }];
  22835. borders.add(LineDraw.createFatLine(p, {
  22836. material: this.lineMat
  22837. }));
  22838. } // 显示边框前再清除一次所有边框,确保始终只有一个线框显示
  22839. this.list.forEach(function (overlay) {
  22840. var fadePlane = _this2.withBox ? overlay.plane : overlay;
  22841. if (fadePlane.border) {
  22842. fadePlane.border.children.forEach(function (line) {
  22843. return line.geometry.dispose();
  22844. });
  22845. fadePlane.remove(fadePlane.border);
  22846. }
  22847. });
  22848. this.lineMat.opacity = 0;
  22849. transitions$1.cancelById(settings$3.freeze.wallLineShine, true); //加true是执行消失时的cancelFun,删除border
  22850. transitions$1.start(function (opa) {
  22851. this.lineMat.opacity = opa;
  22852. }.bind(this), changeTime, null, 0, easing[settings$3.transition.blendEasing], 'wallLineShine', settings$3.freeze.wallLineShine);
  22853. overlay.plane.border = borders;
  22854. overlay.plane.add(borders);
  22855. }
  22856. }, {
  22857. key: "getMatFromCss",
  22858. value: function getMatFromCss(tran) {
  22859. if (tran.includes('matrix3d')) {
  22860. var arr = tran.slice(9, -1).split(',');
  22861. } else {
  22862. var arr = tran.slice(7, -1).split(',');
  22863. }
  22864. arr.forEach(function (v, i) {
  22865. arr[i] = parseFloat(v);
  22866. });
  22867. 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]);
  22868. return matrix;
  22869. }
  22870. }, {
  22871. key: "getCssFromMatrix",
  22872. value: function getCssFromMatrix(matrix) {
  22873. return 'matrix3d(' + matrix.elements + ')';
  22874. }
  22875. }, {
  22876. key: "getOverlayOpenPos",
  22877. value: function getOverlayOpenPos(overlay) {
  22878. //除了初次获取,在player resize后也要重新获取 ,如果相机还旋转了,也要重新获取
  22879. var paddingRatio = 0.9;
  22880. var ratioW = overlay.width / ($('#player').width() * paddingRatio);
  22881. var ratioH = overlay.height / ($('#player').height() * paddingRatio);
  22882. var ratio = 1 / Math.max(ratioW, ratioH); //缩放比例
  22883. var x = -overlay.width * ratio / $('#player').width();
  22884. var camera = player.cameraControls.activeControl ? player.cameraControls.activeControl.camera : player.camera;
  22885. var pos3dLeft = new THREE.Vector3(x, 0, -1).unproject(camera); // player.camera的projectMatrix延迟了
  22886. var camToLeft = pos3dLeft.clone().sub(player.camera.position);
  22887. var cameraDir = player.getDirection(); //same as control.lookVector
  22888. var angle = cameraDir.angleTo(camToLeft);
  22889. var camDisToPlane = overlay.width / 2 / Math.tan(angle); //plane应该离相机的距离
  22890. if (this.withBox) {
  22891. var boxDepth = overlay.plane.position.length();
  22892. camDisToPlane += boxDepth;
  22893. }
  22894. var planePos = player.camera.position.clone().add(cameraDir.clone().multiplyScalar(camDisToPlane));
  22895. if (!this.useCssRender) this.updatePlaneElemStyle(ratio);
  22896. return planePos;
  22897. }
  22898. }, {
  22899. key: "updatePlaneElemStyle",
  22900. value: function updatePlaneElemStyle(ratio) {
  22901. this.openOverlay.elem.css({
  22902. width: this.openOverlay.width * ratio + 'px',
  22903. height: this.openOverlay.height * ratio + 'px'
  22904. });
  22905. }
  22906. }, {
  22907. key: "getPlanePos",
  22908. value: function getPlanePos(overlay) {
  22909. if (this.withBox) {
  22910. return new THREE.Vector3().setFromMatrixPosition(overlay.plane.matrixWorld);
  22911. } else return overlay.position.clone();
  22912. }
  22913. /*
  22914. 点击overlay时 box视频只需要飞到最佳观影点即可,根据屏幕宽度和fov,算出刚好屏幕宽度容纳下视频宽度的距离goodDistance
  22915. */
  22916. }, {
  22917. key: "clickOverlay",
  22918. value: function clickOverlay(overlay) {
  22919. var _this3 = this;
  22920. var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  22921. dontEmit = _ref3.dontEmit,
  22922. forceFlyToPlane = _ref3.forceFlyToPlane,
  22923. afterFly = _ref3.afterFly;
  22924. //如果在outside点击了,要禁止飞入,否则涉及旋转
  22925. if (overlay.info.isBillboard) {
  22926. dontEmit || this.model.player.billboardManager.emit('clickBillboard', {
  22927. //通知编辑,更新面板
  22928. sid: overlay.info.sid //modified: overlay.info.modified,
  22929. });
  22930. var firstViewPano = this.model.player.$app.core.get('Scene').firstView.pano;
  22931. if (!forceFlyToPlane) {
  22932. var pano = this.model.player.model.panos.index[overlay.targetPano];
  22933. if (pano != void 0 && (pano == firstViewPano || pano.hasNeighbor())) {
  22934. this.model.player.flyToPano({
  22935. pano
  22936. /* lookAtPoint: overlay.position, //看向的方向最好有个指定
  22937. checkAlone: true, */
  22938. });
  22939. }
  22940. return; //没有跳转点就不响应
  22941. }
  22942. if (overlay.homePanoId != void 0) {
  22943. var _pano = this.model.player.model.panos.index[overlay.homePanoId];
  22944. if (_pano != void 0 && (_pano == firstViewPano || _pano.hasNeighbor())) {
  22945. this.model.player.flyToPano({
  22946. pano: _pano,
  22947. lookAtPoint: overlay.position,
  22948. checkAlone: true
  22949. });
  22950. return; //如果能回到绑定点的话
  22951. }
  22952. }
  22953. }
  22954. if (this.openOverlay && !overlay || this.model.player.GLTFEditor.selecting) return;
  22955. CursorDeal.remove('hoverOverlay');
  22956. var plane = this.withBox && overlay ? overlay.plane : overlay;
  22957. if (overlay.overlayType == 'video') {
  22958. plane.material.map.image.play();
  22959. } //适应屏幕的最佳距离
  22960. var tanW = this.player.cameraControls.cameras.panorama.aspect * Math.tan(THREE.MathUtils.degToRad(this.model.player.zoomFov / 2));
  22961. var tanH = Math.tan(THREE.MathUtils.degToRad(this.model.player.zoomFov / 2));
  22962. var goodDistanceW = overlay.width / 2 / tanW;
  22963. var goodDistanceH = overlay.height / 2 / tanH;
  22964. var goodDistance = Math.max(goodDistanceW, goodDistanceH);
  22965. goodDistance *= goodDistance;
  22966. console.log('goodDistance ' + goodDistance);
  22967. if (overlay.limitToOnlyPano) {
  22968. this.player.flyToPano({
  22969. pano: overlay.limitToOnlyPano,
  22970. lookAtPoint: overlay.position
  22971. });
  22972. } else {
  22973. // 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});
  22974. var visiblePanos = overlay.visiblePanos; //convertTool.getVisiblePano(overlay.plane.getWorldPosition(new THREE.Vector3()), this.model)
  22975. if (visiblePanos.length == 0) console.warn('clickOverlay 找不到visiblePanos');
  22976. var coss = {};
  22977. this.player.$app.Camera.flyToPoint(overlay.position.clone(), {
  22978. rank: [function (pano) {
  22979. //寻找正对着overlay的pano
  22980. var overlayDir = new THREE.Vector3(0, 0, 1).applyQuaternion(overlay.quaternion);
  22981. var v1 = overlayDir; //.setY(0); 朝上的话set0会得到0,0,0 无法求angle
  22982. var v2 = pano.position.clone().sub(overlay.position); //.setY(0)
  22983. //var angle = v1.angleTo(v2)
  22984. var cos = v1.dot(v2.normalize());
  22985. coss[pano.id] = cos;
  22986. return cos * 200;
  22987. }, function (pano) {
  22988. var dis = pano.position.clone().distanceToSquared(overlay.position);
  22989. var goodDistance2 = goodDistance * Math.abs(coss[pano.id]); //考虑了倾斜角度后的最佳距离
  22990. var result = -1 * Math.abs(dis - goodDistance2) / goodDistance2; //dis和goodDistance2差距越大分数越低
  22991. //console.log(pano.id, dis, goodDistance2)
  22992. return result;
  22993. }, function (i) {
  22994. var n = i.position.clone().sub(overlay.position).normalize();
  22995. return n.dot(_this3.player.getDirection()) * -500;
  22996. }],
  22997. require: [function (pano) {
  22998. //不要被模型遮挡
  22999. return visiblePanos.includes(pano); //return pano.floorIndex == overlay.floor.floorIndex && pano.neighbourUUIDs.length > 0
  23000. }],
  23001. dealDistance: 5,
  23002. //超过这个距离才换pano
  23003. done: afterFly
  23004. });
  23005. }
  23006. var isEditing = !dontEmit && this.player.EditOverlay && this.player.EditOverlay.editing;
  23007. if (!isEditing) return; // 如果已有media在编辑,禁止选中其他media
  23008. if (this.player.EditOverlay.editPlane && this.player.EditOverlay.editPlane.uuid != overlay.uuid) return; // 当正在添加media plane, 但鼠标并没有停在可用位置时,禁止添加plane
  23009. 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
  23010. if (isEditing && this.player.EditOverlay.editPlane != overlay) {
  23011. //console.log('videos/panel/display面板出现')
  23012. setTimeout(function () {
  23013. var infoCopy = JSON.parse(JSON.stringify(overlay.info));
  23014. infoCopy.sid = overlay.sid;
  23015. infoCopy.type = overlay.overlayType;
  23016. _this3.VideoManager.emit('videos/panel/display', infoCopy);
  23017. _this3.player.EditOverlay.updateOverlayPanel(overlay);
  23018. overlay.updateVisibleOnFloor(); //overlay.isHidden ? overlay.hide('forceHide') : overlay.show('forceHide')
  23019. }, 10); //延迟是为了等待添加overlay的这个页面 created 完,监听才加好
  23020. return;
  23021. }
  23022. }
  23023. }, {
  23024. key: "autoPlay",
  23025. value: function autoPlay(player) {
  23026. //有的设备需要和设备交互才能自动播放,如移动端。不这么写video不会播放 . (2022.11.29: 可为何加了Hot.updateHots之后又会自动播了?https有关?
  23027. this.list.forEach(function (overlay) {
  23028. /* if(overlay.overlayType == 'video' && overlay.shouldPlay){
  23029. console.log(1)
  23030. } */
  23031. if (!overlay.clickToPlayInited && overlay.info.media instanceof HTMLVideoElement && !common$1.isVideoPlayed(overlay.info.media) && overlay.shouldPlay) {
  23032. console.log('try mobileAutoPlay ');
  23033. overlay.videoControl(true);
  23034. if (common$1.isVideoPlayed(overlay.info.media)) {
  23035. console.log('clickToPlayInited ');
  23036. overlay.clickToPlayInited = true;
  23037. }
  23038. }
  23039. });
  23040. }
  23041. }]);
  23042. return OverlayManager;
  23043. }(EventEmitter);
  23044. 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); }; }
  23045. 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; } }
  23046. /**
  23047. * 用于3d video的编辑
  23048. */
  23049. var EditOverlay = /*#__PURE__*/function (_EventEmitter) {
  23050. _inherits(EditOverlay, _EventEmitter);
  23051. var _super = _createSuper$1o(EditOverlay);
  23052. function EditOverlay(player) {
  23053. var _this;
  23054. _classCallCheck(this, EditOverlay);
  23055. _this = _super.call(this);
  23056. _this.editing = false;
  23057. _this.overlayMaxCount = 1;
  23058. _this.meshGroup = new THREE.Object3D();
  23059. _this.player = player; // this.init()
  23060. return _this;
  23061. }
  23062. _createClass(EditOverlay, [{
  23063. key: "checkIfCanInit",
  23064. value: function checkIfCanInit() {
  23065. return this.player.model && this.player.model.chunks.length && this.player.currentPano && this.player.model.transformControls;
  23066. }
  23067. }, {
  23068. key: "waitToInit",
  23069. value: function waitToInit() {
  23070. var _this2 = this;
  23071. console.log('waitToInit');
  23072. var timer = setInterval(function () {
  23073. if (_this2.checkIfCanInit()) {
  23074. _this2.init();
  23075. clearInterval(timer);
  23076. }
  23077. }, 50);
  23078. }
  23079. }, {
  23080. key: "init",
  23081. value: function init() {
  23082. var _this3 = this;
  23083. if (!this.checkIfCanInit()) {
  23084. this.waitToInit();
  23085. return;
  23086. }
  23087. this.VideoManager = this.player.$app.VideoManager;
  23088. this.transformControls = this.player.model.transformControls;
  23089. this.transformControls.addEventListener('mousing', function (data) {
  23090. if (data.state == 'overlay') {
  23091. var _this3$editPlane;
  23092. _this3.VideoManager.emit('VideoManager.BoxVideo.transform', data.mode);
  23093. (_this3$editPlane = _this3.editPlane) === null || _this3$editPlane === void 0 ? void 0 : _this3$editPlane.frame.update(data); // 拖拽轴向时实时更新overlayFrame
  23094. }
  23095. });
  23096. this.meshGroup.name = 'overlay-group';
  23097. this.player.model.add(this.meshGroup);
  23098. this.meshGroup.visible = false;
  23099. this.player.OverlayManager.list.forEach(function (overlay) {
  23100. //获取信息
  23101. _this3.updateOverlayInfo(overlay);
  23102. });
  23103. window.addEventListener('keydown', function (e) {
  23104. //用键盘来切换变换
  23105. var mode;
  23106. if (_this3.editing) return;
  23107. switch (e.which) {
  23108. case 87:
  23109. //w or W
  23110. mode = 'translate';
  23111. break;
  23112. /* case 69://e or E
  23113. mode = "rotate"; break; */
  23114. case 82:
  23115. //r or R
  23116. mode = 'scale';
  23117. break;
  23118. }
  23119. mode && _this3.VideoManager.emit('videos/panel/switchTclMode', mode);
  23120. e.stopPropagation();
  23121. }); // this.VideoManager.on('videos/panel/useImgRatio', this.useImgRatio.bind(this))
  23122. this.enter();
  23123. }
  23124. }, {
  23125. key: "enter",
  23126. value: function enter() {
  23127. if (this.editing) return;
  23128. this.editing = true;
  23129. this.meshGroup.visible = true; //this.transformControls.switchEditState('overlay')
  23130. this.player.cameraControls.controls.dollhouse.resetRanges(3);
  23131. this.player.cameraControls.controls.panorama.insideLookLimitDown = config$6.isMobile ? -55 : -50; // player.model.wallManager.updateRulersVisi(false);
  23132. // player.model.cadFloorPlane.changeCadVisible(false)
  23133. // player.model.cadFloorPlane.updateEntryVisi({visi:false})
  23134. // if (this.player.OverlayManager.group.children.length >= this.overlayMaxCount) {
  23135. // //当前只能加一个视频,所以进入即自动开始添加或编辑
  23136. // var overlay = this.player.OverlayManager.group.children[0]
  23137. // this.player.OverlayManager.clickOverlay(overlay)
  23138. // }
  23139. // else {
  23140. // this.beginToAddPlane()
  23141. // }
  23142. }
  23143. }, {
  23144. key: "leave",
  23145. value: function leave() {
  23146. if (!this.editing) return;
  23147. this.editing = false;
  23148. this.endAddPlane();
  23149. this.meshGroup.visible = false;
  23150. this.transformControls.switchEditState(null);
  23151. this.player.cameraControls.controls.dollhouse.resetRanges();
  23152. this.player.cameraControls.controls.panorama.insideLookLimitDown = null; // this.player.model.wallManager.updateRulersVisi()
  23153. // this.player.model.cadFloorPlane.changeCadVisible(null, { autoJudge: true })
  23154. // this.player.model.cadFloorPlane.updateEntryVisi({ autoJudge: true })
  23155. // bus.emit("videos/panel/exit")
  23156. }
  23157. }, {
  23158. key: "beginToAddPlane",
  23159. value: function beginToAddPlane() {
  23160. //开始添加
  23161. this.player.viewLinkManager.exitView();
  23162. this.player.reticule.visible = false; // setTimeout(() => {
  23163. //因为莫名会被其他页面的设置覆盖,所以延迟
  23164. //this.player.domElement.style.cursor = `url(https://4dkk.4dage.com/v3-test/img/box_video.png),auto`
  23165. // playerDiv.style.cursor = `url(${config.getResourceImageURL('img')}/box_video.png),auto`
  23166. // }, 10)
  23167. this.isAdding = true;
  23168. CursorDeal.add('addOverlay');
  23169. }
  23170. }, {
  23171. key: "endAddPlane",
  23172. value: function endAddPlane() {
  23173. //结束添加状态
  23174. this.isAdding = false; //this.player.domElement.style.cursor = ''
  23175. CursorDeal.remove('addOverlay');
  23176. this.player.reticule.visible = true;
  23177. }
  23178. }, {
  23179. key: "addOverlay",
  23180. value: function addOverlay(o) {
  23181. //调整旋转值,使贴合墙壁,且不重叠。
  23182. var normal = o.intersect.face.normal.clone();
  23183. var intersectType = Vectors$1.UP.angleTo(normal) > Math.PI / 4 ? 'wall' : 'ground';
  23184. if (this.player.getMouseDirection().angleTo(o.intersect.face.normal) < Math.PI / 2) {
  23185. normal.negate();
  23186. }
  23187. {
  23188. // v4.6.0 + 使和地面垂直
  23189. //console.log('normal', normal)
  23190. if (normal.y > 0.85) {
  23191. //如果原本平行于地面的话,就使之面对相机的方向
  23192. normal = this.player.getMouseDirection().negate(); //this.player.getDirection().negate()
  23193. } // if(intersectType == "wall") {
  23194. normal.y = 0; // } else {
  23195. // normal.x = 0
  23196. // normal.z = 0
  23197. // }
  23198. normal.normalize();
  23199. }
  23200. var quaternion = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().lookAt(normal, Vectors$1.ZERO, Vectors$1.UP));
  23201. var position = o.intersect.point.add(normal.multiplyScalar(0.01)); //添加
  23202. var overlay = new Overlay(this.player, {
  23203. sid: common$1.getRandomSid(),
  23204. floorIndex: this.player.model.currentFloor.floorIndex,
  23205. pos: position,
  23206. qua: quaternion,
  23207. modified: 'new',
  23208. frameType: intersectType + '_1'
  23209. });
  23210. overlay.updateMatrixWorld();
  23211. this.player.OverlayManager.clickOverlay(overlay); //自动点击
  23212. this.VideoManager.emit('videos/panel/switchTclMode', 'translate');
  23213. this.endAddPlane(); //自动结束添加
  23214. }
  23215. }, {
  23216. key: "updateOverlayInfo",
  23217. value: function updateOverlayInfo(overlay) {
  23218. var _overlay$info;
  23219. if (overlay.info.isBillboard) return; //获取当前overlay的信息, 用于取消时恢复
  23220. overlay.info = {
  23221. width: overlay.width,
  23222. height: overlay.height,
  23223. depth: overlay.depth,
  23224. pos: overlay.position.clone(),
  23225. qua: overlay.quaternion.clone(),
  23226. reverse: overlay.scale.x < 0,
  23227. media: overlay.info.media,
  23228. //overlay.plane.material.map.image,
  23229. file: overlay.file,
  23230. type: overlay.overlayType,
  23231. hide: overlay.isHidden,
  23232. frameType: overlay.frame && overlay.frame.type,
  23233. limitToOnlyPano: overlay.limitToOnlyPano && overlay.limitToOnlyPano.id,
  23234. fileSize: (_overlay$info = overlay.info) === null || _overlay$info === void 0 ? void 0 : _overlay$info.fileSize
  23235. };
  23236. }
  23237. }, {
  23238. key: "undoEdit",
  23239. value: function undoEdit() {
  23240. // 恢复
  23241. if (!this.editPlane) return;
  23242. var overlay = this.editPlane;
  23243. if (overlay.modified == 'new') {
  23244. // 未保存过的video直接删除
  23245. this.player.OverlayManager.remove(overlay);
  23246. } else {
  23247. overlay.setFromInfo(overlay.info); // 如果是已删除的,则恢复
  23248. if (overlay.modified == 'delete') this.player.OverlayManager.add(overlay);
  23249. }
  23250. }
  23251. }, {
  23252. key: "updateOverlayScaleDisplay",
  23253. value: function updateOverlayScaleDisplay() {
  23254. //更新视频尺寸的数字
  23255. var overlay = this.editPlane;
  23256. var maxWidth = 190,
  23257. maxHeight = maxWidth; //maxWidth/2;
  23258. var ratioW = Math.abs(overlay.width) / maxWidth;
  23259. var ratioH = Math.abs(overlay.height) / maxHeight;
  23260. var ratio = 1 / Math.max(ratioW, ratioH); //缩放比例
  23261. var w = Math.round(Math.abs(overlay.width) * ratio);
  23262. var h = Math.round(Math.abs(overlay.height) * ratio); //console.log(overlay.width, overlay.height, overlay.depth)
  23263. this.VideoManager.emit('videos/panel/changeSize', {
  23264. wText: overlay.width.toFixed(2),
  23265. hText: overlay.height.toFixed(2),
  23266. width: w,
  23267. height: h,
  23268. depth: isNaN(overlay.depth) ? settings$3.overlay.depth : overlay.depth
  23269. });
  23270. }
  23271. }, {
  23272. key: "updateOverlayPanel",
  23273. value: function updateOverlayPanel(overlay) {
  23274. this.editPlane = overlay;
  23275. var plane = overlay.plane;
  23276. var video = plane.material.map && plane.material.map.image;
  23277. this.VideoManager.emit('videos/panel/updatePoster', video);
  23278. this.updateOverlayScaleDisplay();
  23279. this.transformControls.switchEditState('overlay');
  23280. if (overlay.frame) {
  23281. this.VideoManager.emit('videos/panel/changeDepth', overlay.depth * 100);
  23282. } else {
  23283. this.VideoManager.emit('videos/panel/changeDepth', 0);
  23284. }
  23285. this.player.emit('beginEditOverlay');
  23286. }
  23287. }, {
  23288. key: "controlSelectOverlay",
  23289. value: function controlSelectOverlay(overlay) {
  23290. //控制器的选择
  23291. if (overlay && overlay.visible) {
  23292. //this.transformControls.switchEditState('overlay')
  23293. overlay.frame ? overlay.frame.switchTranformControls(this.transformControls) : this.transformControls.attach(overlay);
  23294. } else {
  23295. this.transformControls.detach();
  23296. }
  23297. }
  23298. }, {
  23299. key: "useImgRatio",
  23300. value: function useImgRatio(o) {
  23301. //使用素材自身尺寸比例
  23302. var plane = this.editPlane.plane;
  23303. if (!plane.material.map) return;
  23304. var img = plane.material.map.image;
  23305. var mintranRatio = 200; //default is 200 , 防止图片太小时在墙上依旧很大
  23306. var width = this.editPlane.overlayType == 'video' ? img.videoWidth : img.width;
  23307. var height = this.editPlane.overlayType == 'video' ? img.videoHeight : img.height;
  23308. if (o == 'suitSize') {
  23309. var boundWidth = Math.min(Math.max(width, height) / mintranRatio, 1);
  23310. if (width > height) {
  23311. var w = boundWidth;
  23312. var h = boundWidth * height / width;
  23313. } else {
  23314. var h = boundWidth;
  23315. var w = boundWidth * width / height;
  23316. }
  23317. } else {
  23318. //假设不变总面积
  23319. var k = Math.sqrt(Math.abs(this.editPlane.width * this.editPlane.height) / (width * height));
  23320. var w = k * width * (this.editPlane.width < 0 ? -1 : 1);
  23321. var h = k * height * (this.editPlane.height < 0 ? -1 : 1);
  23322. }
  23323. this.editPlane.scale.setX(w / settings$3.overlay.width);
  23324. this.editPlane.scale.setY(h / settings$3.overlay.height);
  23325. this.editPlane.width = w;
  23326. this.editPlane.height = h;
  23327. this.updateOverlayScaleDisplay();
  23328. }
  23329. }, {
  23330. key: "overlayUploaded",
  23331. value: function overlayUploaded(file, media) {
  23332. //video上传成功后,调整overlay
  23333. var plane = this.editPlane.plane;
  23334. media.style.width = '100%';
  23335. media.style.height = '100%';
  23336. if (media instanceof HTMLVideoElement) {
  23337. plane.material.map = new THREE.VideoTexture(media);
  23338. plane.material.map.image.play();
  23339. this.editPlane.overlayType = 'video';
  23340. media.autoplay = true;
  23341. media.loop = true;
  23342. media.volume = 0;
  23343. media.muted = true;
  23344. } else {
  23345. plane.material.map = new THREE.Texture(media);
  23346. plane.material.map.needsUpdate = true;
  23347. this.editPlane.overlayType = 'photo';
  23348. }
  23349. plane.material.map.minFilter = THREE.LinearFilter;
  23350. this.useImgRatio(); //自适应比例
  23351. this.editPlane.file = file;
  23352. plane.material.opacity = 1;
  23353. plane.material.color = new THREE.Color(1, 1, 1);
  23354. plane.material.needsUpdate = true; // this.updateOverlayInfo(this.editPlane)
  23355. this.VideoManager.emit('videos/panel/updatePoster', media);
  23356. this.editPlane.frame && this.editPlane.frame.update({
  23357. mode: 'scale'
  23358. });
  23359. }
  23360. }, {
  23361. key: "getOverlaySavingInfo",
  23362. value: function getOverlaySavingInfo() {
  23363. //获取overlay保存信息
  23364. var overlay = this.editPlane;
  23365. if (!overlay.file && (!overlay.plane.material.map || !overlay.plane.material.map.image)) return; // 当设置limitToOnlyPano时,仅保存时的点位可视
  23366. //if (overlay.limitToOnlyPano == true) overlay.limitToOnlyPano = this.player.currentPano
  23367. var info = {
  23368. width: math$2.toPrecision(overlay.width, 4),
  23369. height: math$2.toPrecision(overlay.height, 4),
  23370. depth: math$2.toPrecision(overlay.depth, 4),
  23371. pos: math$2.toPrecision(overlay.position.toArray(), 4),
  23372. qua: math$2.toPrecision(overlay.quaternion.toArray(), 4),
  23373. reverse: overlay.scale.x < 0,
  23374. sid: overlay.sid,
  23375. media: [overlay.overlayType],
  23376. hide: overlay.isHidden,
  23377. floorIndex: overlay.floor.floorIndex,
  23378. frameType: overlay.frame && overlay.frame.type,
  23379. limitToOnlyPano: overlay.limitToOnlyPano && overlay.limitToOnlyPano.id,
  23380. fileSize: overlay.info.fileSize
  23381. };
  23382. var _self = this;
  23383. return {
  23384. data: info,
  23385. type: overlay.modified == 'new' ? 1 : 0,
  23386. needSaveMedia: !overlay.info || overlay.file != overlay.info.file,
  23387. done: function done(newData) {
  23388. try {
  23389. // if (overlay.modified == "delete") this.editPlane = null
  23390. overlay.modified = false;
  23391. overlay.visiblePanos = convertTool.getVisiblePano(overlay.position, _self.player.model);
  23392. overlay.info.fileSize = newData.fileSize; //xzw add
  23393. _self.updateOverlayInfo(overlay);
  23394. } catch (e) {
  23395. console.error(e);
  23396. }
  23397. }
  23398. };
  23399. }
  23400. /* disposeOverlay(overlay) {
  23401. //应用删除
  23402. if (overlay == this.player.OverlayManager.hoveringPlane) {
  23403. this.player.OverlayManager.hoverOverlay(null, 'soon')
  23404. }
  23405. if (overlay.plane.material.map) {
  23406. //清空video
  23407. let video = overlay.plane.material.map.image
  23408. if (video && video.load) {
  23409. video.src = ''
  23410. video.load()
  23411. }
  23412. }
  23413. overlay.dispose()
  23414. overlay.modified = 'delete'
  23415. overlay.frame && overlay.frame.dispose()
  23416. } */
  23417. }, {
  23418. key: "DeleteOverlay",
  23419. value: function DeleteOverlay(overlay, delFun) {
  23420. var _this4 = this;
  23421. //删除
  23422. delFun(overlay.sid, function () {
  23423. //删除成功后:
  23424. _this4.player.OverlayManager.remove(overlay); //this.disposeOverlay(overlay)
  23425. _this4.controlSelectOverlay(null);
  23426. });
  23427. }
  23428. }]);
  23429. return EditOverlay;
  23430. }(EventEmitter);
  23431. 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); }; }
  23432. 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; } }
  23433. /**
  23434. * 数据存储对象
  23435. */
  23436. defineComponent('store', function () {
  23437. return /*#__PURE__*/function (_Emiter) {
  23438. _inherits(Store, _Emiter);
  23439. var _super = _createSuper$1n(Store);
  23440. function Store() {
  23441. var _this;
  23442. _classCallCheck(this, Store);
  23443. _this = _super.call(this);
  23444. _this.__store = {};
  23445. return _this;
  23446. }
  23447. /**
  23448. * 获取指定key的数据
  23449. * @param {String} key 名称
  23450. * @param {Boolean} reload 是否强制重新加载
  23451. */
  23452. _createClass(Store, [{
  23453. key: "get",
  23454. value: function () {
  23455. var _get = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(key, reload) {
  23456. var data;
  23457. return regenerator.wrap(function _callee$(_context) {
  23458. while (1) {
  23459. switch (_context.prev = _context.next) {
  23460. case 0:
  23461. if (reload) {
  23462. this.$app.resource.reload = true;
  23463. }
  23464. if (!(this.__store[key] && !reload)) {
  23465. _context.next = 3;
  23466. break;
  23467. }
  23468. return _context.abrupt("return", this.__store[key]);
  23469. case 3:
  23470. data = null;
  23471. if (!(typeof this.$app.resource[key] === 'function')) {
  23472. _context.next = 8;
  23473. break;
  23474. }
  23475. _context.next = 7;
  23476. return this.$app.resource[key]();
  23477. case 7:
  23478. data = _context.sent;
  23479. case 8:
  23480. this.$app.resource.reload = false;
  23481. return _context.abrupt("return", data || this.__store[key]);
  23482. case 10:
  23483. case "end":
  23484. return _context.stop();
  23485. }
  23486. }
  23487. }, _callee, this);
  23488. }));
  23489. function get(_x, _x2) {
  23490. return _get.apply(this, arguments);
  23491. }
  23492. return get;
  23493. }()
  23494. }, {
  23495. key: "getAppImage",
  23496. value: function () {
  23497. var _getAppImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(path) {
  23498. return regenerator.wrap(function _callee2$(_context2) {
  23499. while (1) {
  23500. switch (_context2.prev = _context2.next) {
  23501. case 0:
  23502. if (!this.__store[path]) {
  23503. _context2.next = 2;
  23504. break;
  23505. }
  23506. return _context2.abrupt("return", this.__store[path]);
  23507. case 2:
  23508. _context2.next = 4;
  23509. return this.$app.resource.getAppImage(path);
  23510. case 4:
  23511. return _context2.abrupt("return", this.__store[path]);
  23512. case 5:
  23513. case "end":
  23514. return _context2.stop();
  23515. }
  23516. }
  23517. }, _callee2, this);
  23518. }));
  23519. function getAppImage(_x3) {
  23520. return _getAppImage.apply(this, arguments);
  23521. }
  23522. return getAppImage;
  23523. }()
  23524. }, {
  23525. key: "getUserImage",
  23526. value: function () {
  23527. var _getUserImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(path, reload) {
  23528. return regenerator.wrap(function _callee3$(_context3) {
  23529. while (1) {
  23530. switch (_context3.prev = _context3.next) {
  23531. case 0:
  23532. if (!(this.__store[path] && !reload)) {
  23533. _context3.next = 2;
  23534. break;
  23535. }
  23536. return _context3.abrupt("return", this.__store[path]);
  23537. case 2:
  23538. _context3.next = 4;
  23539. return this.$app.resource.getUserImage(path);
  23540. case 4:
  23541. return _context3.abrupt("return", this.__store[path]);
  23542. case 5:
  23543. case "end":
  23544. return _context3.stop();
  23545. }
  23546. }
  23547. }, _callee3, this);
  23548. }));
  23549. function getUserImage(_x4, _x5) {
  23550. return _getUserImage.apply(this, arguments);
  23551. }
  23552. return getUserImage;
  23553. }()
  23554. /**
  23555. * 获取指定key的值
  23556. * @param {String} key
  23557. * @returns any
  23558. */
  23559. }, {
  23560. key: "getValue",
  23561. value: function getValue(key) {
  23562. return this.__store[key];
  23563. }
  23564. /**
  23565. * 设置指定key的值并触发事件
  23566. * @param {String} key
  23567. * @returns any
  23568. */
  23569. }, {
  23570. key: "setValue",
  23571. value: function setValue(key, prop, value) {
  23572. if (typeof key === 'undefined' || typeof prop === 'undefined') {
  23573. return this;
  23574. }
  23575. var target = this.__store[key];
  23576. if (target) {
  23577. target[prop] = value;
  23578. this.emit(key, target, prop);
  23579. }
  23580. return this;
  23581. }
  23582. /**
  23583. * 设置指定key的数据
  23584. * @param {String} key 名称
  23585. * @param {Object} value 新数据
  23586. * @param {Boolean} isCache 是否缓存
  23587. */
  23588. }, {
  23589. key: "set",
  23590. value: function set(key, value) {
  23591. var isCache = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  23592. if (typeof key === 'undefined') {
  23593. return this;
  23594. }
  23595. if (isCache) {
  23596. this.__store[key] = value;
  23597. }
  23598. this.emit(key, value);
  23599. }
  23600. }]);
  23601. return Store;
  23602. }(tinyEmitter);
  23603. });
  23604. var DialogList3D = {
  23605. WalkManger: {
  23606. 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"),
  23607. firstPointLimit: '初始点位无法隐藏。',
  23608. link: '漫游到选中点位时,操作点位可以行走。',
  23609. unLink: '漫游到选中点位时,操作点位不可行走。',
  23610. show: '该点位已显示',
  23611. hide: '已隐藏该点位,漫游时将不再显示',
  23612. deactive: "\u5355\u51FB<img src=\"".concat(texture.getImageURL('images/roam/roam_visible.png'), "\" crossorigin=\"anonymous\">\u8BBE\u7F6E\u70B9\u4F4D\u6F2B\u6E38\u53EF\u884C\u3002"),
  23613. 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")
  23614. },
  23615. TagManger: {
  23616. unLink: '在该点位漫游时不再显示选中热点。'
  23617. }
  23618. };
  23619. 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); }; }
  23620. 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; } }
  23621. /*
  23622. 漫游可行 和 热点可视 都是利用连线来表示连接性。 借助线的name来判断是否是新增线或者删除的线。每次更换中心点或热点时保存临时信息,然后重新创建线(刷新状态)。
  23623. 复杂的点是要经常更新连接的footIcon的材质。不可见的pano就是没有neibourPanos的pano,所以漫游可行需要判断修改连接的两个pano的可见性的修改。
  23624. */
  23625. var panos, panoIndexes;
  23626. var Link = /*#__PURE__*/function () {
  23627. function Link(player) {
  23628. _classCallCheck(this, Link);
  23629. this.player = player;
  23630. this.setPanoVisible = false;
  23631. this.setMultiFloorPanoVisible = false;
  23632. this.setTagVisible = false;
  23633. this.footIcons;
  23634. this.actionIcons; //漫游可见性
  23635. this.activePano; //正在设置的漫游中心点
  23636. this.panoVLines = {}; //线条
  23637. this.panoVTemp; //修改后还没保存的临时数据
  23638. //热点可见性
  23639. this.tagVsetting; //正在设置的热点中心点
  23640. this.tagsVLines = {}; //线条
  23641. this.tagVTemp; //修改后还没保存的临时数据
  23642. this.linkToFloorPano; //设置楼层连接点时选择的另一层的连接点
  23643. panos = player.model.panos.list.filter(function (e) {
  23644. return e.isAligned();
  23645. });
  23646. panoIndexes = player.model.panos.index;
  23647. }
  23648. _createClass(Link, [{
  23649. key: "init",
  23650. value: function init() {
  23651. var _this = this;
  23652. if (this.inited) return;
  23653. this.footTex1 = texture.load(texture.getImageURL('images/End_256.png'));
  23654. this.footTex2 = texture.load(texture.getImageURL('images/End_unable_256.png'));
  23655. this.footTex1_v = texture.load(this.player.$app.resource.getAppURL('images/video_256.png'));
  23656. /* texture.getImageURL('images/video_256.png') */
  23657. 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')),
  23658. // this.footTex4 = texture.load(texture.getImageURL('images/mutil_connect_unable256.png')),
  23659. this.footTex5 = texture.load(texture.getImageURL('images/mutil_connect_upper.png'));
  23660. this.footTex6 = texture.load(texture.getImageURL('images/mutil_connect_lower.png'));
  23661. this.actionVisiTex0 = texture.load(texture.getImageURL('images/roam/roam_invisible.png'));
  23662. this.actionVisiTex1 = texture.load(texture.getImageURL('images/roam/roam_visible.png'));
  23663. this.actionLinkTex0 = texture.load(texture.getImageURL('images/roam/roam_uncheck.png'));
  23664. this.actionLinkTex1 = texture.load(texture.getImageURL('images/roam/roam_checked.png'));
  23665. this.ifAllPanoNoNeighbor();
  23666. this.meshGroup = new THREE.Object3D();
  23667. this.meshGroup.name = 'setVisible-group';
  23668. this.player.model.add(this.meshGroup);
  23669. this.player.model.on('floor.changed', function (toFloor, mode) {
  23670. if (_this.setTagVisible || _this.setPanoVisible) {
  23671. //正在设置可视
  23672. _this.gotoFloor(toFloor.floorIndex);
  23673. }
  23674. });
  23675. this.player.on('collectIntersectMesh', function (meshes) {
  23676. //推送要intersect的mesh
  23677. if (_this.footIcons && (_this.setPanoVisible || _this.setTagVisible)) {
  23678. meshes.push.apply(meshes, _toConsumableArray(_this.footIcons));
  23679. }
  23680. });
  23681. this.player.on('judgeIntersect', function (intersect, e) {
  23682. //判断是否intersect了 footIcon
  23683. if (e.getConsumed() || _this.setPanoVisible || _this.setTagVisible) {
  23684. if (intersect && intersect.object.type == 'FootIcon'
  23685. /* && this.intersect.object.visible */
  23686. ) {
  23687. CursorDeal.add('hoverFootMarker');
  23688. } else {
  23689. CursorDeal.remove('hoverFootMarker');
  23690. }
  23691. e.consume();
  23692. }
  23693. });
  23694. this.inited = true;
  23695. }
  23696. }, {
  23697. key: "enterSet",
  23698. value: function enterSet(type) {
  23699. var _this2 = this;
  23700. this.init(); // toast: `单击设置选中点位漫游可行。`
  23701. this.player.$app.gui.toast({
  23702. event: 'DialogList3D.WalkManger.enter',
  23703. content: DialogList3D.WalkManger.enter,
  23704. showClose: true
  23705. });
  23706. if (type == 'panoVisible') {
  23707. if (!this.player.modeTran) {
  23708. //一开始就在这个页面
  23709. this.player.afterCModeFuc = function () {
  23710. _this2.enterSet(type);
  23711. };
  23712. return;
  23713. }
  23714. this.setPanoVisible = true;
  23715. this.player.flyoutType = 'beginSetPanoVisible'; // if (this.player.modeTran.split('-')[1] != 'floorplan') {
  23716. // setTimeout(this.beginSetPanoVisible.bind(this), 300)
  23717. // } else {
  23718. this.beginSetPanoVisible(); // }
  23719. setTimeout(function () {
  23720. //刚开始的页面就是设置漫游可行时飞出来角度很奇怪,但是延迟一下就不会,原因未知
  23721. _this2.player.flyToMode('floorplan', function () {
  23722. _this2.updateFootIconSize();
  23723. _this2.focusFloor();
  23724. });
  23725. }, 10);
  23726. } else {
  23727. this.beginSetTagVisible();
  23728. this.player.flyToMode('floorplan', function () {
  23729. _this2.focusFloor();
  23730. });
  23731. }
  23732. }
  23733. /**
  23734. * 用于选中和取消“全部漫游可行”
  23735. * @param {undefined | "all"} show
  23736. * @returns
  23737. */
  23738. }, {
  23739. key: "toggle",
  23740. value: function toggle(show) {
  23741. var _this3 = this;
  23742. //console.log('walk/Set ' + show)
  23743. var activePano = this.activePano;
  23744. if (!show) {
  23745. // 当前点位是初始点位时,禁止隐藏
  23746. var firstView = this.player.$app.core.get('Scene').firstView;
  23747. /* let p = this.getCurNeighbors(firstView.pano)-----被驳回,所以先注释
  23748. let firstViewWillHide = p.length == 1 && p.includes(activePano.id) */
  23749. if (firstView.pano == this.activePano
  23750. /* && this.checkHasNeighbor(firstView.pano, 'beforeCreateLine') */
  23751. ) {
  23752. // toast: `初始点位无法隐藏。`
  23753. this.player.$app.WalkManager.emit(this.checkLinkStatus());
  23754. this.player.$app.gui.toast({
  23755. event: 'DialogList3D.WalkManger.firstPointLimit',
  23756. content: DialogList3D.WalkManger.firstPointLimit,
  23757. showClose: true
  23758. });
  23759. return false;
  23760. } // 全部取消连接
  23761. for (var _i in this.panoVLines) {
  23762. //隐藏相当于点击所有连线的footIcon
  23763. /* if (firstViewWillHide && i == firstView.pano.id) { -----被驳回,所以先注释
  23764. this.player.$app.gui.toast({ event: 'DialogList3D.WalkManger.firstPointLimit', content: DialogList3D.WalkManger.firstPointLimit, showClose: true })
  23765. continue
  23766. } */
  23767. this.panoVLines[_i].visible && this.dealPanoVisible(_i);
  23768. }
  23769. } else {
  23770. var list = common$1.sortByScore(panos, [function (e) {
  23771. return e.isAligned();
  23772. }], [function (pano) {
  23773. return -pano.position.distanceTo(activePano.position);
  23774. }]);
  23775. if (list.length == 1) {
  23776. console.log('仅有一个漫游点');
  23777. return;
  23778. }
  23779. var okList = [];
  23780. var s = Math.max(-list[1].score * 2, 4); //i==1的一定显示
  23781. if (show == 'all') {
  23782. // 全部连接
  23783. okList = list.filter(function (data) {
  23784. return data.score != 0 && data.item.footIcon.visible;
  23785. }
  23786. /* || this.panoVLines[data.item.id] */
  23787. );
  23788. /* //包括原先连接的另一个楼 */
  23789. okList.forEach(function (e) {
  23790. return _this3.panoVLines[e.item.id] && _this3.panoVLines[e.item.id].visible || _this3.dealPanoVisible(e.item.id);
  23791. });
  23792. } else {
  23793. //连接周围一定距离内、到该点没有遮挡的pano
  23794. var ifBlock = function ifBlock(panoA, panoB) {
  23795. var A = panoA.position.clone();
  23796. var B = panoB.position.clone();
  23797. return convertTool.ifIntersectChunks(A, B, {});
  23798. };
  23799. for (var i = 1; i < list.length; i++) {
  23800. if (-list[i].score < s) {
  23801. if (ifBlock(activePano, list[i].item)) {
  23802. list[i].block = true; //有阻挡
  23803. }
  23804. list[i].good = true;
  23805. } else {
  23806. okList || (okList = list.filter(function (e) {
  23807. return e.good && !e.block;
  23808. })); //绝对可以使用的
  23809. if (okList.length < 2) {
  23810. if (!ifBlock(activePano, list[i].item)) {
  23811. if (okList.length == 0) {
  23812. okList.push(list[i]);
  23813. } else {
  23814. //1
  23815. var lastPos = okList[0].item.position.clone().sub(activePano.position).setY(0);
  23816. var thisPos = list[i].item.position.clone().sub(activePano.position).setY(0);
  23817. if (lastPos.angleTo(thisPos) > Math.PI / 2) {
  23818. console.log('再加一个 角度' + THREE.MathUtils.radToDeg(lastPos.angleTo(thisPos)));
  23819. break;
  23820. }
  23821. }
  23822. }
  23823. } else {
  23824. break;
  23825. }
  23826. }
  23827. }
  23828. if (okList.length == 0) {
  23829. //如果length为0,至少加一个pano, 虽然是遮挡的
  23830. okList.push(list[0]);
  23831. }
  23832. okList.forEach(function (e) {
  23833. return _this3.dealPanoVisible(e.pano.id);
  23834. });
  23835. } //console.log(okList)
  23836. }
  23837. this.checkFloorLinkStatus();
  23838. return true;
  23839. } //共同的
  23840. }, {
  23841. key: "setDisplay",
  23842. value: function setDisplay(state) {
  23843. //在设置时一直显示视频漫游点,即使它被隐藏了
  23844. //panos.forEach(pano => pano.updateMarkerVisible(true, this.player))
  23845. this.player.path.currentPanoMarker.mesh.visible = !state;
  23846. this.player.OverlayManager && this.player.OverlayManager.setGroupVisible(!state);
  23847. this.player.reticule.visible = !state;
  23848. this.player.emit('linkEditorSetVisible', state);
  23849. this.player.$app.TagManager.switchLabels({
  23850. type: 'traces',
  23851. visible: !state
  23852. }, null, 'editRoamVisi');
  23853. if (!state && this.footIcons) {
  23854. for (var i = 0; i < this.footIcons.length; i++) {
  23855. var s = this.footIcons[i].pano.label._oriScale;
  23856. if (s == void 0) break;
  23857. this.footIcons[i].pano.marker.add(this.footIcons[i].pano.label); //放回
  23858. this.footIcons[i].pano.label.scale.set(s, s, s);
  23859. delete this.footIcons[i].pano.label._oriScale;
  23860. this.footIcons[i].pano.label.sprite.material.color.set('#fff');
  23861. this.footIcons[i].pano.label.sprite.material.opacity = 1;
  23862. }
  23863. } //if (!state && this.player.mode == 'floorplan' && !this.player.model.showOnFloorplan) {
  23864. // this.player.model.setModelDisplay(false, 'hideOnfloorplan') //恢复
  23865. //}
  23866. this.player.model.setModelDisplay(state, 'editLink', 2, state ? 'add' : 'cancel');
  23867. } //----------------漫游可见性---------------------------------
  23868. }, {
  23869. key: "beginSetPanoVisible",
  23870. value: function beginSetPanoVisible() {
  23871. this.panoVTemp = {};
  23872. if (this.player.currentPano.floor != this.player.model.currentFloor) {
  23873. //总是切到当前漫游点的楼层
  23874. this.player.gotoFloor(this.player.currentPano.floor.floorIndex);
  23875. }
  23876. this.SetOnePanoVisible(this.player.currentPano);
  23877. this.setDisplay(true); // UI根据是否emit过LinkStatus来判断是否编辑过,初次进入默认activePano时需要标明还未编辑
  23878. this.player.$app.WalkManager.emit(this.checkLinkStatus(), 'enter');
  23879. }
  23880. }, {
  23881. key: "SetOnePanoVisible",
  23882. value: function SetOnePanoVisible(pano) {
  23883. //点击某个pano后就对该pano点进行设置
  23884. if (this.activePano == pano) return;
  23885. this.activePano = pano; //记录正在修改的
  23886. this.delVisibleLines(); //删除线
  23887. this.showFootIcons(pano, true);
  23888. this.createPanoVisiLines(pano); //创线
  23889. }
  23890. }, {
  23891. key: "checkPanoVisiChange",
  23892. value: function checkPanoVisiChange() {
  23893. if (Object.keys(this.panoVTemp).length) return true;
  23894. for (var r in this.panoVLines) {
  23895. var line = this.panoVLines[r];
  23896. if (line.name.indexOf('new') > -1 && line.visible) {
  23897. //新设置为visible且没有取消
  23898. return true;
  23899. } else if (line.name.indexOf('new') == -1 && !line.visible) {
  23900. //旧的且已经取消
  23901. return true;
  23902. }
  23903. }
  23904. return false;
  23905. }
  23906. }, {
  23907. key: "saveLastPanoVi",
  23908. value: function saveLastPanoVi(pano) {
  23909. pano = pano || this.activePano; //xzw add on 2023.6.1
  23910. if (!pano) return; //保存刚设置过的pano
  23911. var change = [];
  23912. for (var r in this.panoVLines) {
  23913. //所有修改信息都藏在线里~
  23914. var line = this.panoVLines[r];
  23915. if (line.name.indexOf('new') > -1 && line.visible) {
  23916. //新设置为visible且没有取消
  23917. change.push({
  23918. type: 'add',
  23919. id: r
  23920. });
  23921. } else if (line.name.indexOf('new') == -1 && !line.visible) {
  23922. //旧的且已经取消
  23923. change.push({
  23924. type: 'sub',
  23925. id: r
  23926. });
  23927. }
  23928. }
  23929. if (change.length) {
  23930. var panoId = pano.id; //(pano && pano.id) || this.activePano.id
  23931. this.savePanoVisiChange(panoId, change);
  23932. }
  23933. }
  23934. }, {
  23935. key: "savePanoVisiChange",
  23936. value: function savePanoVisiChange(panoId, change) {
  23937. //添加双向的neighbour: 将修改写入panoVTemp数据
  23938. var self = this.searchNeib(panoId);
  23939. var seeMarkers_self = self.seeMarkers;
  23940. var neighbourUUIDs_self = self.neighbourUUIDs;
  23941. var neighbourPanos_self = self.neighbourPanos;
  23942. for (var i = 0; i < change.length; i++) {
  23943. var other = this.searchNeib(change[i].id);
  23944. var seeMarkers = other.seeMarkers;
  23945. var neighbourUUIDs = other.neighbourUUIDs;
  23946. var neighbourPanos = other.neighbourPanos;
  23947. if (change[i].type == 'add') {
  23948. seeMarkers.push(panoId);
  23949. neighbourUUIDs.push(panoId);
  23950. neighbourPanos[panoId] = true;
  23951. seeMarkers_self.push(change[i].id);
  23952. neighbourUUIDs_self.push(change[i].id);
  23953. neighbourPanos_self[change[i].id] = true;
  23954. } else {
  23955. var index = seeMarkers.indexOf(panoId);
  23956. index > -1 && seeMarkers.splice(index, 1);
  23957. var index = neighbourUUIDs.indexOf(panoId);
  23958. index > -1 && neighbourUUIDs.splice(index, 1);
  23959. neighbourPanos[panoId] = false;
  23960. var index = seeMarkers_self.indexOf(change[i].id);
  23961. index > -1 && seeMarkers_self.splice(index, 1);
  23962. var index = neighbourUUIDs_self.indexOf(change[i].id);
  23963. index > -1 && neighbourUUIDs_self.splice(index, 1);
  23964. neighbourPanos_self[change[i].id] = false;
  23965. }
  23966. this.panoVTemp[change[i].id] = {
  23967. //后面两个是作为保存到后台的数据存储,临时需要用到的是第一个
  23968. neighbourPanos: neighbourPanos,
  23969. seeMarkers: seeMarkers,
  23970. neighbourUUIDs: neighbourUUIDs
  23971. };
  23972. }
  23973. this.panoVTemp[panoId] = {
  23974. //加上自己
  23975. neighbourPanos: neighbourPanos_self,
  23976. seeMarkers: seeMarkers_self,
  23977. neighbourUUIDs: neighbourUUIDs_self
  23978. };
  23979. }
  23980. }, {
  23981. key: "pauseSetPanoVisible",
  23982. value: function pauseSetPanoVisible(type, currentFloor) {
  23983. var _this4 = this;
  23984. //暂停 因为点击了保存设置 但没有退出设置
  23985. if (!this.setPanoVisible) return;
  23986. if (type == 'unsaved') {
  23987. //中途点击pano从而停止一个热点的设置
  23988. this.saveLastPanoVi();
  23989. } else {
  23990. this.panoVTemp = {}; //清空数据
  23991. this.startEditPano = null;
  23992. }
  23993. this.delVisibleLines();
  23994. this.activePano = null;
  23995. this.showFootIcons(null, true, currentFloor); //清空选择
  23996. //这句要放在this.activePano = null后。 根据可见性更改透明度
  23997. panos.forEach(function (pano) {
  23998. return _this4.changeIconVisiState(pano.footIcon, _this4.checkHasNeighbor(pano));
  23999. });
  24000. } //按理说改变了neighbourPano,tag的初始visible也要改。但是这样还要考虑已经改过的tag。。很麻烦
  24001. }, {
  24002. key: "finishSetPanoVisible",
  24003. value: function finishSetPanoVisible() {
  24004. //结束 退出这个设置
  24005. if (!this.setPanoVisible) return; //否则会加多个侦听
  24006. this.setPanoVisible = false;
  24007. this.hideFootIcons();
  24008. this.delVisibleLines();
  24009. this.recoverAllState2();
  24010. this.activePano = null;
  24011. this.startEditPano = null;
  24012. this.panoVTemp = {};
  24013. this.player.flyoutType = null;
  24014. this.setDisplay(false);
  24015. CursorDeal.remove('hoverFootMarker');
  24016. } //最佳推荐操作顺序: 先设置pano可见性 再创建热点 这样热点的visible正确些,否则之后再设置热点可见性会改更多
  24017. }, {
  24018. key: "savePanoVisibles",
  24019. value: function savePanoVisibles(fuc) {
  24020. //保存
  24021. if (this.activePano) this.saveLastPanoVi(this.activePano); //获取最后设置的那个热点的改动
  24022. var PanoData = [];
  24023. for (var i in this.panoVTemp) {
  24024. PanoData.push({
  24025. //希望算法部不会更改index排序,或者更改后能将visible信息一并更改
  24026. panoID: i,
  24027. visibles: this.turnToPanoIndex(this.panoVTemp[i].seeMarkers),
  24028. visibles3: this.turnToPanoIndex(this.panoVTemp[i].neighbourUUIDs)
  24029. });
  24030. }
  24031. if (PanoData.length == 0) {
  24032. //没改变
  24033. console.warn('PanoLink没有改变');
  24034. return;
  24035. }
  24036. return PanoData;
  24037. }
  24038. }, {
  24039. key: "afterSavePanoVisibles",
  24040. value: function afterSavePanoVisibles() {
  24041. var _this5 = this;
  24042. //实施:
  24043. for (var i in this.panoVTemp) {
  24044. var pano = panoIndexes[i];
  24045. pano.seeMarkers = this.panoVTemp[i].seeMarkers;
  24046. pano.neighbourUUIDs = this.panoVTemp[i].neighbourUUIDs;
  24047. pano.neighbourPanos = this.panoVTemp[i].neighbourPanos;
  24048. }
  24049. var self = this;
  24050. if (!this.checkHasNeighbor(this.player.currentPano)) {
  24051. //currentPano变为孤立点 就要换一个防止飞入
  24052. var list = common$1.sortByScore(panos, [function (pano) {
  24053. return _this5.checkHasNeighbor(pano);
  24054. }], [function (pano) {
  24055. return -pano.position.distanceTo(self.player.currentPano.position);
  24056. }]);
  24057. if (list && list.length) {
  24058. this.player.currentPano = list[0].item; //找最近的一非孤立点
  24059. this.noPanoHasNeighbor = false; //更新状态
  24060. } else {
  24061. this.noPanoHasNeighbor = true; //更新状态
  24062. }
  24063. } else {
  24064. this.noPanoHasNeighbor = false; //更新状态
  24065. }
  24066. this.pauseSetPanoVisible();
  24067. this.player.$app.WalkManager.emit('walkManager.deactive');
  24068. this.updateFootIconSize(); //更新一下center大小 写在最后
  24069. }
  24070. }, {
  24071. key: "searchNeib",
  24072. value: function searchNeib(panoId) {
  24073. //寻找某pano的相关neighbour 可能是修改过的
  24074. var o = {};
  24075. if (this.panoVTemp[panoId]) {
  24076. o.seeMarkers = this.panoVTemp[panoId].seeMarkers;
  24077. o.neighbourUUIDs = this.panoVTemp[panoId].neighbourUUIDs;
  24078. o.neighbourPanos = this.panoVTemp[panoId].neighbourPanos;
  24079. } else {
  24080. o.seeMarkers = panoIndexes[panoId].seeMarkers.slice(0);
  24081. o.neighbourUUIDs = panoIndexes[panoId].neighbourUUIDs.slice(0);
  24082. o.neighbourPanos = common$1.CloneObject(panoIndexes[panoId].neighbourPanos);
  24083. }
  24084. return o;
  24085. }
  24086. }, {
  24087. key: "turnToPanoIndex",
  24088. value: function turnToPanoIndex(panoArr) {
  24089. var array = [];
  24090. for (var i = 0; i < panoArr.length; i++) {
  24091. var pano = panoIndexes[panoArr[i]];
  24092. var index = panos.indexOf(pano);
  24093. array.push(index);
  24094. }
  24095. return array;
  24096. } //========热点可见性==============
  24097. }, {
  24098. key: "beginSetTagVisible",
  24099. value: function beginSetTagVisible() {
  24100. if (this.setTagVisible) return;
  24101. this.setTagVisible = true;
  24102. this.tagVTemp = {}; //临时存储改动的tag的visible
  24103. this.setDisplay(true);
  24104. }
  24105. }, {
  24106. key: "SetOneTagVisible",
  24107. value: function SetOneTagVisible(tag) {
  24108. //点击某个热点后就对该热点进行设置,或者在热点修改时对其进行设置
  24109. if (this.tagVsetting == tag) return;
  24110. if (this.tagVsetting) {
  24111. this.saveLastTagVi(this.tagVsetting);
  24112. }
  24113. this.tagVsetting = tag; //记录正在修改的
  24114. this.delVisibleLines(); //删除线
  24115. this.showFootIcons();
  24116. this.createTagVisiLines(tag); //创线
  24117. this.updateFootIconSize(); //更新一下大小,尤其是上次换了中心点然后退出又进入但是镜头没有变化的话
  24118. this.player.$app.TagManager.emit(this.checkTagLinkStatus());
  24119. }
  24120. }, {
  24121. key: "checkTagVisiChange",
  24122. value: function checkTagVisiChange() {
  24123. if (Object.keys(this.tagVTemp).length) return true;
  24124. for (var r in this.tagsVLines) {
  24125. var line = this.tagsVLines[r];
  24126. if (line.name.indexOf('new') > -1 && line.visible) {
  24127. //新设置为visible且没有取消
  24128. return true;
  24129. } else if (line.name.indexOf('new') == -1 && !line.visible) {
  24130. //旧的且已经取消
  24131. return true;
  24132. }
  24133. }
  24134. return false;
  24135. }
  24136. }, {
  24137. key: "checkTagLinkStatus",
  24138. value: function checkTagLinkStatus() {
  24139. var visibleLines = Object.values(this.tagsVLines).filter(function (line) {
  24140. return line.visible;
  24141. });
  24142. var visibleIcon = this.footIcons.filter(function (icon) {
  24143. return icon.visible;
  24144. }); //是连接还是不连接
  24145. if (visibleIcon.length == visibleLines.length) {
  24146. // 全部连接
  24147. return 'tagManager.linkAll';
  24148. } else if (visibleLines.length == 0) {
  24149. // 没有连接
  24150. return 'tagManager.linkNone';
  24151. } else {
  24152. // 部分连接
  24153. return 'tagManager.linkSome';
  24154. }
  24155. }
  24156. }, {
  24157. key: "saveLastTagVi",
  24158. value: function saveLastTagVi() {
  24159. //保存刚设置过的tag
  24160. var change = false;
  24161. var newVPs = this.tagVTemp[this.tagVsetting.sid] || this.tagVsetting.visiblePanos.slice(0);
  24162. for (var r in this.tagsVLines) {
  24163. var line = this.tagsVLines[r];
  24164. if (line.name.indexOf('new') > -1 && line.visible) {
  24165. //新设置为visible且没有取消
  24166. newVPs.push(panoIndexes[r]);
  24167. change = true; //console.log("add: "+r)
  24168. } else if (line.name.indexOf('new') == -1 && !line.visible) {
  24169. //旧的且已经取消
  24170. var i = newVPs.map(function (pano) {
  24171. return pano.id;
  24172. }).indexOf(r);
  24173. if (i == -1) {
  24174. console.log('visiblePanos删除error');
  24175. continue;
  24176. }
  24177. newVPs.splice(i, 1);
  24178. change = true; //console.log("sub: "+r)
  24179. }
  24180. }
  24181. if (change) {
  24182. this.tagVTemp[this.tagVsetting.sid] = newVPs;
  24183. }
  24184. }
  24185. }, {
  24186. key: "pauseSetTagVisible",
  24187. value: function pauseSetTagVisible(type) {
  24188. //pc保存后删除连线 但还在继续设置 点选热点即开始
  24189. if (!this.setTagVisible || !this.tagVsetting) return;
  24190. if (type == 'unsaved') {
  24191. //中途点击pano从而停止一个热点的设置
  24192. this.saveLastTagVi(this.tagVsetting);
  24193. } else {
  24194. this.tagVTemp = {}; //清空数据
  24195. }
  24196. this.delVisibleLines();
  24197. this.hideFootIcons();
  24198. this.tagVsetting = null;
  24199. }
  24200. }, {
  24201. key: "finishSetTagVisible",
  24202. value: function finishSetTagVisible() {
  24203. if (!this.setTagVisible) return;
  24204. this.pauseSetTagVisible();
  24205. this.setTagVisible = false;
  24206. this.setDisplay(false);
  24207. }
  24208. }, {
  24209. key: "saveTagVisibles",
  24210. value: function saveTagVisibles() {
  24211. //保存到服务器
  24212. if (this.tagVsetting) this.saveLastTagVi(this.tagVsetting); //获取最后设置的那个热点的改动
  24213. //可能出现数据没变但保存的情况。比如先改变了然后切换别的热点但切换回来时又改回来。
  24214. var tags = [];
  24215. for (var i in this.tagVTemp) {
  24216. tags.push({
  24217. sid: i,
  24218. value: this.tagVTemp[i].filter(function (pano) {
  24219. return !!pano;
  24220. }).map(function (pano) {
  24221. return pano.id;
  24222. }) //turnToPanoIndex(this.tagVTemp[i])
  24223. });
  24224. }
  24225. return tags;
  24226. }
  24227. }, {
  24228. key: "afterSaveTagVisibles",
  24229. value: function afterSaveTagVisibles() {
  24230. this.finishSetTagVisible(); //还是保存完直接结束吧,因为现在热点可视不放在单独的设置页面了
  24231. } //------------visibles--------tag--------------------------------
  24232. }, {
  24233. key: "createTagVisiLines",
  24234. value: function createTagVisiLines(tag) {
  24235. var _this6 = this;
  24236. // 热点可见性线条
  24237. var visibleList = this.tagVTemp[tag.sid] || tag.visiblePanos;
  24238. visibleList.forEach(function (pano) {
  24239. /* if (pano && pano.floor.floorIndex == this.player.model.currentFloor.floorIndex) */
  24240. _this6.createTagSingleLine(pano, 'old', tag);
  24241. });
  24242. }
  24243. }, {
  24244. key: "createTagSingleLine",
  24245. value: function createTagSingleLine(pano, type, tag) {
  24246. var line = LineDraw.createLine([pano.floorPosition.clone(), tag.position.clone()], {
  24247. color: Colors.newBlue,
  24248. depthTest: false,
  24249. transparent: true
  24250. });
  24251. this.meshGroup.add(line);
  24252. line.name = 'tagVL-' + type + '-' + pano.id;
  24253. this.tagsVLines[pano.id] = line;
  24254. line.material.opacity = pano.floor.floorIndex == this.player.model.currentFloor.floorIndex ? 1 : 0.4;
  24255. this.changeIconLinkState(panoIndexes[pano.id].footIcon, 'linked');
  24256. }
  24257. }, {
  24258. key: "dealTagVisible",
  24259. value: function dealTagVisible(tag, panoName) {
  24260. //外部调用
  24261. if (this.tagsVLines[panoName]) {
  24262. this.tagsVLines[panoName].visible = !this.tagsVLines[panoName].visible;
  24263. this.changeIconLinkState(panoIndexes[panoName].footIcon, this.tagsVLines[panoName].visible ? 'linked' : false);
  24264. if (!this.tagsVLines[panoName].visible) this.player.$app.gui.toast({
  24265. event: 'DialogList3D.TagManger.unLink',
  24266. content: DialogList3D.TagManger.unLink,
  24267. showClose: true
  24268. });
  24269. } else {
  24270. this.createTagSingleLine(panoIndexes[panoName], 'new', tag);
  24271. }
  24272. this.player.$app.TagManager.emit(this.checkTagLinkStatus());
  24273. }
  24274. }, {
  24275. key: "setTagHideAll",
  24276. value: function setTagHideAll(tag) {
  24277. var _this7 = this;
  24278. //外部调用
  24279. Object.keys(this.tagsVLines).forEach(function (panoName) {
  24280. _this7.tagsVLines[panoName].visible = false;
  24281. _this7.changeIconLinkState(panoIndexes[panoName].footIcon, false);
  24282. });
  24283. }
  24284. }, {
  24285. key: "setTagShowAll",
  24286. value: function setTagShowAll(tag) {
  24287. var _this8 = this;
  24288. //外部调用
  24289. this.footIcons.filter(function (icon) {
  24290. return icon.visible;
  24291. }).forEach(function (icon) {
  24292. var panoName = icon.pano.id;
  24293. if (_this8.tagsVLines[panoName]) {
  24294. _this8.tagsVLines[panoName].visible = true;
  24295. _this8.changeIconLinkState(panoIndexes[panoName].footIcon, 'linked');
  24296. } else {
  24297. _this8.createTagSingleLine(panoIndexes[panoName], 'new', tag);
  24298. }
  24299. });
  24300. }
  24301. }, {
  24302. key: "delVisibleLines",
  24303. value: function delVisibleLines() {
  24304. //xzw add 所有线都删除
  24305. for (var i in this.tagsVLines) {
  24306. this.tagsVLines[i].geometry.dispose();
  24307. this.tagsVLines[i].material.dispose();
  24308. this.meshGroup.remove(this.tagsVLines[i]);
  24309. delete this.tagsVLines[i];
  24310. }
  24311. for (var i in this.panoVLines) {
  24312. this.panoVLines[i].geometry.dispose();
  24313. this.panoVLines[i].material.dispose();
  24314. this.meshGroup.remove(this.panoVLines[i]);
  24315. delete this.panoVLines[i];
  24316. }
  24317. } //--------panoVisible
  24318. }, {
  24319. key: "createPanoVisiLines",
  24320. value: function createPanoVisiLines(pano, isAllFloor) {
  24321. // pano可见性线条
  24322. var neighbours = this.panoVTemp[pano.id] && this.panoVTemp[pano.id].neighbourPanos || pano.neighbourPanos;
  24323. for (var r in neighbours) {
  24324. if (neighbours[r] && r != pano.id && !r.includes('view360_')) {
  24325. // if (panoIndexes[r].floorIndex != pano.floorIndex && !isAllFloor) continue // 多楼层连接点不显示虚线
  24326. this.createPanoSingleLine(pano, 'old', r);
  24327. }
  24328. }
  24329. }
  24330. }, {
  24331. key: "createPanoSingleLine",
  24332. value: function createPanoSingleLine(pano, type, id) {
  24333. //pano是中心
  24334. var pano2 = panoIndexes[id];
  24335. if (pano2.panoType) return; // 过滤掉场景关联pano
  24336. var p2 = pano2.floorPosition.clone();
  24337. var line = LineDraw.createLine([pano.floorPosition.clone(), p2], {
  24338. color: Colors.newBlue,
  24339. deshed: pano2.floorIndex != pano.floorIndex,
  24340. depthTest: false,
  24341. transparent: true
  24342. });
  24343. this.meshGroup.add(line);
  24344. line.name = 'PanoVL-' + type + '-' + id;
  24345. pano2.floorIndex != pano.floorIndex && (line.material.opacity = 0.5); //连接到另一楼层的pano
  24346. this.panoVLines[id] = line;
  24347. if (this.activePano) {
  24348. if (pano2.floorIndex != pano.floorIndex) this.changeIconLinkState(panoIndexes[id].footIcon, 'otherFloorLink');else this.changeIconLinkState(panoIndexes[id].footIcon, 'linked');
  24349. }
  24350. }
  24351. }, {
  24352. key: "dealPanoVisible",
  24353. value: function dealPanoVisible(panoId, icon) {
  24354. var _this9 = this;
  24355. //外部调用
  24356. if (this.setMultiFloorPanoVisible) {
  24357. // 设置多楼层连接点时(点击的icon都是要添加的,无法取消)
  24358. if (this.linkToFloorPano) {
  24359. //取消旧的
  24360. var lastIcon = this.linkToFloorPano.footIcon;
  24361. this.changeIconLinkState(lastIcon, false);
  24362. var isLinkingFloor = this.changeFloorIconState(lastIcon);
  24363. if (!isLinkingFloor) {
  24364. lastIcon.status = 'visible';
  24365. lastIcon.material.uniforms.map.value = this.linkToFloorPano.hasVideo ? this.footTex1_v : this.footTex1;
  24366. }
  24367. } else {
  24368. this.player.$app.WalkManager.emit('walkManager.multiFloorLinking', true); //解锁确定按钮
  24369. }
  24370. this.linkToFloorPano = icon.pano;
  24371. this.changeIconLinkState(icon, 'center');
  24372. if (this.setMultiFloorPanoVisible == 'upper') {
  24373. // 下楼点
  24374. icon.status = 'floor';
  24375. icon.material.uniforms.map.value = this.footTex6;
  24376. } else {
  24377. icon.status = 'floor';
  24378. icon.material.uniforms.map.value = this.footTex5;
  24379. }
  24380. } else if (icon && icon.type == 'FootIcon') {
  24381. //切换activePano
  24382. if (this.activePano) {
  24383. if (panoId == this.activePano.id) {
  24384. if (!this.startEditPano) this.startEditPano = this.activePano; // 用于撤销时激活修改之前的pano(deactive,link,unlink)
  24385. // 关闭当前pano设置
  24386. this.player.$app.WalkManager.emit('walkManager.deactive');
  24387. this.pauseSetPanoVisible('unsaved'); // 将actionIcon切换到是否可视(眼睛模式)
  24388. this.actionIcons.forEach(function (i) {
  24389. return i.material.map = i.footIcon.status == 'invisible' ? _this9.actionVisiTex0 : _this9.actionVisiTex1;
  24390. }); // toast: `单击设置点位漫游可行。`
  24391. this.player.$app.gui.toast({
  24392. event: 'DialogList3D.WalkManger.deactive',
  24393. content: DialogList3D.WalkManger.deactive
  24394. });
  24395. } else {
  24396. this.lastFloorActivePano = null;
  24397. this.pauseSetPanoVisible('unsaved');
  24398. this.SetOnePanoVisible(panoIndexes[panoId]);
  24399. this.player.$app.WalkManager.emit('walkManager.active', this.checkLinkStatus());
  24400. }
  24401. } else {
  24402. // 激活当前pano设置
  24403. this.lastFloorActivePano = null;
  24404. this.SetOnePanoVisible(panoIndexes[panoId]);
  24405. this.player.$app.WalkManager.emit('walkManager.active', this.checkLinkStatus());
  24406. }
  24407. } else if (!icon || icon.type == 'ActionIcon') {
  24408. if (this.activePano) {
  24409. // 连接 或 取消连接
  24410. var link;
  24411. if (this.panoVLines[panoId]) {
  24412. this.panoVLines[panoId].visible = !this.panoVLines[panoId].visible;
  24413. link = this.panoVLines[panoId].visible;
  24414. this.changeIconLinkState(panoIndexes[panoId].footIcon, panoIndexes[panoId].footIcon.visible ? this.panoVLines[panoId].visible ? 'linked' : false : 'otherFloorLink');
  24415. } else {
  24416. this.createPanoSingleLine(this.activePano, 'new', panoId);
  24417. link = true;
  24418. }
  24419. if (!this.startEditPano) this.startEditPano = this.activePano; // 用于撤销时激活修改之前的pano(deactive,link,unlink)
  24420. if (link) {
  24421. // 如果进行连接,直接判断该点是可见的(有附近点),(不能通过checkHasNeighbor来判断,因为新增的线条可能不在它的neighbour中
  24422. this.changeIconVisiState(panoIndexes[panoId].footIcon, true);
  24423. this.changeIconVisiState(this.activePano.footIcon, true); // 只当点击ActionIcon时才toast
  24424. if (icon && icon.type == 'ActionIcon') {
  24425. this.player.$app.WalkManager.emit(this.checkLinkStatus());
  24426. }
  24427. } else {
  24428. // 如果取消连接,则需要checkHasNeighbor
  24429. var firstViewPano = this.player.$app.core.get('Scene').firstView.pano;
  24430. if (panoIndexes[panoId].floorIndex != this.activePano.floorIndex) {
  24431. //取消楼层连接点 xzw
  24432. panoIndexes[panoId].footIcon.visible = false;
  24433. } else {
  24434. var pickPanoCheck = this.checkHasNeighbor(panoIndexes[panoId]);
  24435. this.changeIconVisiState(panoIndexes[panoId].footIcon, pickPanoCheck);
  24436. }
  24437. var activePanoCheck = this.checkHasNeighbor(this.activePano); //let activePanoCheck2 = this.checkHasNeighbor(panoIndexes[panoId]) -----被驳回,所以先注释
  24438. this.changeIconVisiState(this.activePano.footIcon, activePanoCheck);
  24439. if (icon && icon.type == 'ActionIcon') {
  24440. this.player.$app.WalkManager.emit(this.checkLinkStatus());
  24441. if (!activePanoCheck && this.activePano == firstViewPano
  24442. /* || (!activePanoCheck2 && panoIndexes[panoId] == firstViewPano)-----被驳回,所以先注释 */
  24443. ) {
  24444. // toast: `初始点位无法隐藏。`
  24445. this.player.$app.gui.toast({
  24446. event: 'DialogList3D.WalkManger.firstPointLimit',
  24447. content: DialogList3D.WalkManger.firstPointLimit
  24448. });
  24449. this.dealPanoVisible(panoId, icon); //还原
  24450. return;
  24451. }
  24452. if (!activePanoCheck) {
  24453. this.player.$app.gui.toast({
  24454. event: 'DialogList3D.WalkManger.hide',
  24455. content: DialogList3D.WalkManger.hide
  24456. });
  24457. }
  24458. }
  24459. }
  24460. } else {
  24461. // 显示 或 隐藏
  24462. // // var neighbours = (this.panoVTemp[panoIndexes[panoId].id] && this.panoVTemp[panoIndexes[panoId].id].neighbourPanos) || panoIndexes[panoId].neighbourPanos
  24463. // // let neigbIds = Object.keys(neighbours)
  24464. if (icon.footIcon.status == 'invisible') {
  24465. //变为可见点
  24466. if (this.panoVTemp[panoId]) {
  24467. // 未保存 还原保存前的neighbourPanos
  24468. var neighbourIds = Object.keys(this.panoVTemp[panoId].neighbourPanos).filter(function (id) {
  24469. return !id.includes('view360_') && id != panoId;
  24470. });
  24471. var a = neighbourIds.filter(function (id) {
  24472. return _this9.checkHasNeighbor(panoIndexes[id]);
  24473. }); //尽量不选择已经隐藏了的,否则手动隐藏了又会被显示 bugID=36883#
  24474. if (a.length) neighbourIds = a;else neighbourIds = neighbourIds.slice(0, 1);
  24475. var change = [];
  24476. neighbourIds.forEach(function (nId) {
  24477. change.push({
  24478. type: 'add',
  24479. id: nId
  24480. });
  24481. });
  24482. this.savePanoVisiChange(panoId, change);
  24483. } else {
  24484. // 已保存,自动计算neighbourPanos(有可能变为楼层连接点)
  24485. var _neighbourIds = convertTool.getVisiblePano(panoIndexes[panoId].position, this.player.model).map(function (pano) {
  24486. return pano.id;
  24487. }).filter(function (id) {
  24488. return id != panoId;
  24489. });
  24490. if (_neighbourIds.length == 0) {
  24491. //随便选一个近的点吧(没有验证过)
  24492. var list = common$1.sortByScore(panos, [function (e) {
  24493. return e.isAligned();
  24494. }], [function (pano) {
  24495. return -pano.position.distanceTo(panoIndexes[panoId].position);
  24496. }]);
  24497. var pano0 = list.map(function (e) {
  24498. return e.item;
  24499. }).find(function (pano) {
  24500. return _this9.checkHasNeighbor(pano);
  24501. }); //尽量不选择已经隐藏了的
  24502. if (pano0) _neighbourIds = [pano0.id];else _neighbourIds = [list[0].item.id];
  24503. } else {
  24504. var _a = _neighbourIds.filter(function (id) {
  24505. return _this9.checkHasNeighbor(panoIndexes[id]);
  24506. }); //尽量不选择已经隐藏了的,否则手动隐藏了又会被显示 bugID=36883#
  24507. if (_a.length) _neighbourIds = _a;else _neighbourIds = _neighbourIds.slice(0, 1);
  24508. }
  24509. var _change = [];
  24510. _neighbourIds.forEach(function (nId) {
  24511. return _change.push({
  24512. type: 'add',
  24513. id: nId
  24514. });
  24515. });
  24516. this.savePanoVisiChange(panoId, _change);
  24517. } // toast: '该点位已显示'
  24518. this.player.$app.gui.toast({
  24519. event: 'DialogList3D.WalkManger.show',
  24520. content: DialogList3D.WalkManger.show
  24521. });
  24522. } else {
  24523. //变为不可见点
  24524. var firstView = this.player.$app.core.get('Scene').firstView;
  24525. var isHideFirstView = firstView.pano.footIcon == icon.footIcon;
  24526. if (isHideFirstView) {
  24527. // toast: `初始点位无法隐藏。`
  24528. this.player.$app.gui.toast({
  24529. event: 'DialogList3D.WalkManger.firstPointLimit',
  24530. content: DialogList3D.WalkManger.firstPointLimit
  24531. });
  24532. return false;
  24533. }
  24534. /* let p = this.getCurNeighbors(firstView.pano) -----被驳回,所以先注释
  24535. let firstViewWillHide = p.length == 1 && p.includes(panoId) */
  24536. this.createPanoVisiLines(panoIndexes[panoId], true);
  24537. Object.values(this.panoVLines).forEach(function (line) {
  24538. /* if (firstViewWillHide && line.name.split('-')[2] == firstView.pano.id) {-----被驳回,所以先注释
  24539. this.player.$app.gui.toast({ event: 'DialogList3D.WalkManger.firstPointLimit', content: DialogList3D.WalkManger.firstPointLimit })
  24540. return
  24541. } */
  24542. line.visible = false;
  24543. }); // toast: '已隐藏该点位,漫游时将不再显示'
  24544. /* firstViewWillHide || */
  24545. this.player.$app.gui.toast({
  24546. event: 'DialogList3D.WalkManger.hide',
  24547. content: DialogList3D.WalkManger.hide
  24548. });
  24549. this.saveLastPanoVi(panoIndexes[panoId]); // this.pauseSetPanoVisible('unsaved')
  24550. this.delVisibleLines();
  24551. }
  24552. panos.forEach(function (pano) {
  24553. return _this9.changeIconVisiState(pano.footIcon, _this9.checkHasNeighbor(pano));
  24554. });
  24555. }
  24556. }
  24557. this.updateFootIconSize();
  24558. }
  24559. }, {
  24560. key: "showFootIcons",
  24561. value: function showFootIcons(centerPano, isPanovisible, currentFloor) {
  24562. var _this10 = this;
  24563. if (!this.footIcons) {
  24564. this.footIcons = [];
  24565. this.actionIcons = [];
  24566. var scale = 0.4;
  24567. scale *= 40 / Math.sqrt(Math.min(this.player.domElement.clientWidth, this.player.domElement.clientHeight)); //屏幕越小,放得越大
  24568. scale = THREE.MathUtils.clamp(scale, 0.3, 0.7); // console.error("scale"+scale)
  24569. var geo = new THREE.PlaneGeometry(scale, scale, 1, 1);
  24570. var actionGeo = geo.clone();
  24571. actionGeo.scale(0.5, 0.5, 0.5);
  24572. panos.forEach(function (pano) {
  24573. var foot = new FootIcon(geo, pano);
  24574. foot.material.uniforms.map.value = pano.hasVideo ? _this10.footTex1_v : _this10.footTex1;
  24575. foot.visible = false;
  24576. pano.footIcon = foot;
  24577. var actionIcon = new ActionIcon(foot, actionGeo, pano);
  24578. actionIcon.material.map = _this10.actionLinkTex0;
  24579. foot.actionIcon = actionIcon;
  24580. _this10.meshGroup.add(foot);
  24581. foot.add(actionIcon);
  24582. _this10.footIcons.push(foot);
  24583. _this10.actionIcons.push(actionIcon);
  24584. });
  24585. }
  24586. currentFloor = currentFloor || this.player.model.currentFloor;
  24587. panos.forEach(function (pano) {
  24588. if (pano.label.parent != pano.footIcon) {
  24589. pano.label._oriScale = pano.label.scale.x;
  24590. var numS = 1.65 * pano.label.scale.x;
  24591. pano.label.scale.set(numS, numS, numS);
  24592. pano.footIcon.add(pano.label);
  24593. pano.footIcon.label = pano.label;
  24594. }
  24595. if (pano.floor == currentFloor) {
  24596. pano.footIcon.visible = true;
  24597. _this10.changeIconLinkState(pano.footIcon, false);
  24598. if (isPanovisible) {
  24599. _this10.changeIconVisiState(pano.footIcon, _this10.checkHasNeighbor(panoIndexes[pano.id], 'beforeCreateLine'));
  24600. }
  24601. if (centerPano && pano == centerPano) {
  24602. //pano为中心 或者 currentPano 所以放大一点
  24603. pano.footIcon.oriScale = new THREE.Vector3(1.5, 1.5, 1.5);
  24604. if (isPanovisible) {
  24605. //currentPano特殊些:
  24606. _this10.changeIconLinkState(pano.footIcon, 'center');
  24607. }
  24608. } else {
  24609. pano.footIcon.oriScale = new THREE.Vector3(1, 1, 1);
  24610. pano.footIcon.actionIcon.visible = true;
  24611. }
  24612. } else {
  24613. var neighbourUUIDs = _this10.panoVTemp && _this10.panoVTemp[pano.id] ? _this10.panoVTemp[pano.id].neighbourUUIDs : pano.neighbourUUIDs;
  24614. var linkToActivePano = neighbourUUIDs.filter(function (id) {
  24615. return centerPano && id == centerPano.id;
  24616. });
  24617. pano.footIcon.oriScale = new THREE.Vector3(1, 1, 1);
  24618. if (linkToActivePano.length > 0) {
  24619. if (isPanovisible) {
  24620. _this10.changeFloorIconState(pano.footIcon);
  24621. }
  24622. _this10.changeIconLinkState(pano.footIcon, 'otherFloorLink');
  24623. } else {
  24624. pano.footIcon.visible = false;
  24625. }
  24626. }
  24627. });
  24628. }
  24629. }, {
  24630. key: "checkHasNeighbor",
  24631. value: function checkHasNeighbor(pano, state) {
  24632. //检查当前状态pano点是否有可通行点
  24633. var neighbours = this.panoVTemp && this.panoVTemp[pano.id] ? this.panoVTemp[pano.id].neighbourPanos : pano.neighbourPanos;
  24634. if (state != 'beforeCreateLine' && pano == this.activePano) {
  24635. //是中心点的话。state == "beforeCreateLine"代表是showFootIcon时, 这时候线还没创建,无法用线判断中心点有几个相邻点,直接用neighbourPanos
  24636. for (var i in this.panoVLines) {
  24637. if (this.panoVLines[i].visible) {
  24638. return true; //有一条线即可
  24639. }
  24640. }
  24641. return;
  24642. }
  24643. for (var i in neighbours) {
  24644. if (i == pano.id || isNaN(parseInt(i))) continue;
  24645. if (neighbours[i]) {
  24646. 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;
  24647. return true;
  24648. }
  24649. }
  24650. return false;
  24651. }
  24652. }, {
  24653. key: "getCurNeighbors",
  24654. value: function getCurNeighbors(pano) {
  24655. //检查当前状态pano点是否有可通行点
  24656. var neighbours = this.panoVTemp && this.panoVTemp[pano.id] ? this.panoVTemp[pano.id].neighbourPanos : pano.neighbourPanos;
  24657. var neighbourIds = [];
  24658. for (var i in neighbours) {
  24659. if (i == pano.id || isNaN(parseInt(i))) continue;
  24660. if (neighbours[i]) {
  24661. 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);
  24662. }
  24663. }
  24664. return neighbourIds;
  24665. }
  24666. }, {
  24667. key: "ifAllPanoNoNeighbor",
  24668. value: function ifAllPanoNoNeighbor() {
  24669. //检查是否全是孤立点
  24670. for (var i in panoIndexes) {
  24671. if (!panoIndexes[i].isAligned()) continue;
  24672. if (this.checkHasNeighbor(panoIndexes[i])) {
  24673. return false;
  24674. }
  24675. }
  24676. this.noPanoHasNeighbor = true;
  24677. return true; //是全部没有neighbour
  24678. }
  24679. }, {
  24680. key: "changeIconLinkState",
  24681. value: function changeIconLinkState(footIcon, state) {
  24682. if (!footIcon) return;
  24683. var color;
  24684. footIcon.otherFloorLink = false;
  24685. if (state == 'linked') {
  24686. color = Colors.newBlue;
  24687. footIcon.actionIcon.material.map = this.actionLinkTex1;
  24688. }
  24689. if (state == 'otherFloorLink') {
  24690. color = Colors.yellow;
  24691. footIcon.actionIcon.visible = false;
  24692. footIcon.material.uniforms.opacity.value = 0.5;
  24693. footIcon.label.sprite.material.opacity = 0.5;
  24694. footIcon.visible = true; //xzw add
  24695. footIcon.otherFloorLink = true;
  24696. }
  24697. if (state == 'center') {
  24698. color = Colors.yellow;
  24699. footIcon.actionIcon.visible = false;
  24700. }
  24701. if (state == false) {
  24702. color = '#fff';
  24703. footIcon.actionIcon.material.map = this.actionLinkTex0;
  24704. } // footIcon.status = state
  24705. try {
  24706. footIcon.material.uniforms.color.value.set(color);
  24707. footIcon.label.sprite.material.color.set(color);
  24708. } catch (e) {
  24709. console.log(e);
  24710. }
  24711. }
  24712. }, {
  24713. key: "checkLinkStatus",
  24714. value: function checkLinkStatus() {
  24715. this.checkFloorLinkStatus();
  24716. var visibleLines = Object.values(this.panoVLines).filter(function (line) {
  24717. return line.visible;
  24718. });
  24719. var visibleIcon = this.footIcons.filter(function (icon) {
  24720. return icon.visible;
  24721. }); //是连接还是不连接
  24722. if (visibleIcon.length == visibleLines.length + 1) {
  24723. // 全部连接
  24724. return 'walkManager.linkAll';
  24725. } else if (visibleLines.length == 0) {
  24726. // 没有连接
  24727. return 'walkManager.linkNone';
  24728. } else {
  24729. // 部分连接
  24730. return 'walkManager.linkSome';
  24731. }
  24732. }
  24733. }, {
  24734. key: "changeIconVisiState",
  24735. value: function changeIconVisiState(footIcon, state) {
  24736. if (!footIcon) return; // 初始点位永远可见
  24737. if (footIcon.pano == this.player.$app.core.get('Scene').firstView.pano) state = true; //是可见点还是不可见点
  24738. if (state) {
  24739. footIcon.status = 'visible';
  24740. footIcon.material.uniforms.map.value = footIcon.pano.hasVideo ? this.footTex1_v : this.footTex1; // 眼睛变亮
  24741. if (!this.activePano) footIcon.actionIcon.material.map = this.actionVisiTex1;
  24742. footIcon.otherFloorLink || (footIcon.material.uniforms.opacity.value = 1, footIcon.label.sprite.material.opacity = 1);
  24743. this.changeFloorIconState(footIcon);
  24744. } else {
  24745. //不可见
  24746. footIcon.status = 'invisible';
  24747. var footIconMap = footIcon.material.uniforms.map;
  24748. footIconMap.value = footIcon.pano.hasVideo ? this.footTex2_v : this.footTex2; // 眼睛变暗
  24749. if (!this.activePano) footIcon.actionIcon.material.map = this.actionVisiTex0;
  24750. if (!this.activePano || this.activePano.id != footIcon.name) {
  24751. //非中心点时
  24752. footIcon.material.uniforms.opacity.value = 0.5;
  24753. footIcon.label.sprite.material.opacity = 0.5;
  24754. } else {
  24755. //变为中心点时
  24756. footIcon.material.uniforms.opacity.value = 1;
  24757. footIcon.label.sprite.material.opacity = 1; // toast: `该点位已隐藏,点击可显示。`
  24758. this.player.$app.gui.toast({
  24759. event: 'DialogList3D.WalkManger.activeHidePoint',
  24760. content: DialogList3D.WalkManger.activeHidePoint
  24761. });
  24762. }
  24763. }
  24764. }
  24765. }, {
  24766. key: "changeFloorIconState",
  24767. value: function changeFloorIconState(footIcon) {
  24768. var _this11 = this;
  24769. if (!footIcon) return; //是否为楼层连接点
  24770. var pano = panoIndexes[footIcon.name];
  24771. var neighbourUUIDs = this.panoVTemp && this.panoVTemp[pano.id] ? this.panoVTemp[pano.id].neighbourUUIDs : pano.neighbourUUIDs;
  24772. var linkToOtherFloor = neighbourUUIDs.filter(function (id) {
  24773. return panoIndexes[id].floorIndex != pano.floorIndex && (!_this11.activePano || !_this11.panoVLines[id] || _this11.panoVLines[id].visible);
  24774. }).map(function (id) {
  24775. return panoIndexes[id].floor;
  24776. });
  24777. if (linkToOtherFloor.length) {
  24778. // 因为负楼层的问题,不能使用floorIndex
  24779. if (this.getFloorOrder(linkToOtherFloor[0]) > this.getFloorOrder(pano.floor)) {
  24780. //(linkToOtherFloor[0].center.y > pano.floor.center.y) {
  24781. // 上楼点
  24782. footIcon.status = 'floor';
  24783. footIcon.material.uniforms.map.value = this.footTex5;
  24784. } else if (this.getFloorOrder(linkToOtherFloor[0]) < this.getFloorOrder(pano.floor)) {
  24785. // 下楼点
  24786. footIcon.status = 'floor';
  24787. footIcon.material.uniforms.map.value = this.footTex6;
  24788. }
  24789. return true;
  24790. } else {
  24791. // 不是楼层连接点
  24792. return false;
  24793. }
  24794. } // 获取离指定pano最近的上一层或下一层的pano(dir: "up"|"down")
  24795. }, {
  24796. key: "getClosestOtherFloorPano",
  24797. value: function getClosestOtherFloorPano(pano, dir) {
  24798. return this.player.model.panos.closestPanoTowardPoint({
  24799. point: pano.position,
  24800. getAll: true
  24801. }).map(function (p) {
  24802. return p.pano;
  24803. }).filter(function (p) {
  24804. return dir == 'up' ? p.floorIndex > pano.floorIndex : p.floorIndex < pano.floorIndex;
  24805. })[0];
  24806. } //xzw改 2023.6.7和ui一致,根据floorplan.json 中的id来定楼顺序-------
  24807. }, {
  24808. key: "checkFloorLinkStatus",
  24809. value: function checkFloorLinkStatus() {
  24810. var _this12 = this;
  24811. var linkFloorStatus = 'walkManager.unlinkFloor';
  24812. var neighbours = this.panoVTemp[this.activePano.id] && this.panoVTemp[this.activePano.id].neighbourUUIDs || panoIndexes[this.activePano.id].neighbourUUIDs;
  24813. var otherFloorPano = neighbours.map(function (pId) {
  24814. return panoIndexes[pId];
  24815. }).filter(function (pano) {
  24816. return pano.floorIndex != _this12.activePano.floorIndex && (!_this12.activePano || !_this12.panoVLines[pano.id] || _this12.panoVLines[pano.id].visible);
  24817. })[0]; // 目前只检测单对单连接
  24818. if (otherFloorPano && this.getFloorOrder(otherFloorPano.floor) > this.getFloorOrder(this.activePano.floor)) linkFloorStatus = 'walkManager.linkUpperFloor';
  24819. if (otherFloorPano && this.getFloorOrder(otherFloorPano.floor) < this.getFloorOrder(this.activePano.floor)) linkFloorStatus = 'walkManager.linkLowerFloor'; //暂时不考虑两种都存在的情况
  24820. this.player.$app.WalkManager.emit(linkFloorStatus);
  24821. }
  24822. }, {
  24823. key: "getFloorOrder",
  24824. value: function getFloorOrder(floor) {
  24825. var floorsData = this.player.$app.store.getValue('flooruser').floors;
  24826. var curInfo = floorsData.find(function (e) {
  24827. return e.subgroup == floor.floorIndex;
  24828. });
  24829. return curInfo.id;
  24830. }
  24831. }, {
  24832. key: "getFloor",
  24833. value: function getFloor(floorIndex, type) {
  24834. //获取上一层或下一层
  24835. var floors = this.player.model.floors;
  24836. floors.index[floorIndex];
  24837. var floorsData = this.player.$app.store.getValue('flooruser').floors;
  24838. var curInfo = floorsData.find(function (e) {
  24839. return e.subgroup == floorIndex;
  24840. });
  24841. var id = type == 'upper' ? curInfo.id + 1 : curInfo.id - 1;
  24842. var upperInfo = floorsData.find(function (e) {
  24843. return e.id == id;
  24844. }); //id代表楼层
  24845. console.log('getFloor', type, floorIndex, upperInfo.subgroup);
  24846. return upperInfo.subgroup; //subgroup就是floorIndex
  24847. } //--------------------------------------------
  24848. /* getUpperFloor(floorIndex) {
  24849. let floors = this.player.model.floors
  24850. let currentFloor = floors.index[floorIndex]
  24851. let upperFloor = {
  24852. index: floorIndex,
  24853. height: 9999,
  24854. }
  24855. floors.list.forEach(floor => {
  24856. if (
  24857. floor.center.y > currentFloor.center.y && // 上面的楼层
  24858. Math.abs(floor.center.y - currentFloor.center.y) < Math.abs(upperFloor.height - currentFloor.center.y) // 最近
  24859. ) {
  24860. upperFloor.index = floor.floorIndex
  24861. upperFloor.height = floor.center.y
  24862. }
  24863. })
  24864. return upperFloor.index
  24865. }
  24866. getLowerFloor(floorIndex) {
  24867. let floors = this.player.model.floors
  24868. let currentFloor = floors.index[floorIndex]
  24869. let upperFloor = {
  24870. index: floorIndex,
  24871. height: 9999,
  24872. }
  24873. floors.list.forEach(floor => {
  24874. if (
  24875. floor.center.y < currentFloor.center.y && // 下面的楼层
  24876. Math.abs(floor.center.y - currentFloor.center.y) < Math.abs(upperFloor.height - currentFloor.center.y) // 最近
  24877. ) {
  24878. upperFloor.index = floor.floorIndex
  24879. upperFloor.height = floor.center.y
  24880. }
  24881. })
  24882. return upperFloor.index
  24883. }
  24884. checkFloorLinkStatus() {
  24885. let linkFloorStatus = 'walkManager.unlinkFloor'
  24886. let neighbours = (this.panoVTemp[this.activePano.id] && this.panoVTemp[this.activePano.id].neighbourUUIDs) || panoIndexes[this.activePano.id].neighbourUUIDs
  24887. let othe rFloorPano = neighbours
  24888. .map(pId => panoIndexes[pId])
  24889. .filter(pano => pano.floorIndex != this.activePano.floorIndex && (!this.activePano || !this.panoVLines[pano.id] || this.panoVLines[pano.id].visible))[0] // 目前只检测单对单连接
  24890. if (otherFloorPano && otherFloorPano.floor.center.y > this.activePano.floor.center.y) linkFloorStatus = 'walkManager.linkUpperFloor'
  24891. if (otherFloorPano && otherFloorPano.floor.center.y < this.activePano.floor.center.y) linkFloorStatus = 'walkManager.linkLowerFloor'
  24892. this.player.$app.WalkManager.emit(linkFloorStatus)
  24893. }
  24894. */
  24895. }, {
  24896. key: "recoverAllState2",
  24897. value: function recoverAllState2() {
  24898. //为了热点可视恢复成pano全部可见
  24899. for (var i = 0; i < this.footIcons.length; i++) {
  24900. this.footIcons[i].material.uniforms.opacity.value = 1;
  24901. this.footIcons[i].label.sprite.material.opacity = 1;
  24902. this.footIcons[i].material.uniforms.map.value = this.footIcons[i].pano.hasVideo ? this.footTex1_v : this.footTex1;
  24903. }
  24904. }
  24905. }, {
  24906. key: "hideFootIcons",
  24907. value: function hideFootIcons() {
  24908. if (!this.footIcons) return;
  24909. for (var i = 0; i < this.footIcons.length; i++) {
  24910. this.footIcons[i].visible = false;
  24911. this.footIcons[i].actionIcon.visible = true;
  24912. }
  24913. }
  24914. }, {
  24915. key: "updateFootIconSize",
  24916. value: function updateFootIconSize() {
  24917. if (!this.footIcons) return;
  24918. var player = this.player;
  24919. var s = math$2.getScaleForConstantSize({
  24920. width2d: 240,
  24921. position: new THREE.Vector3(),
  24922. player
  24923. }); //无论任何设备大小,呈现的icon大小一致
  24924. s = THREE.MathUtils.clamp(s, 0.6, 2.5); // 最大值不可太大,否则场景缩小后容易重叠
  24925. this.footIcons.forEach(function (f) {
  24926. f.visible && f.scale.copy(f.oriScale).multiplyScalar(s); // 使footIcons随相机逆旋转,保证其角度不变
  24927. f.quaternion.copy(player.quaternion);
  24928. });
  24929. }
  24930. }, {
  24931. key: "resetTagVisiByModel",
  24932. value: function resetTagVisiByModel() {
  24933. //自动计算所有热点的可视 当模型修改后所有的热点可视都会重新自动计算(用户的设置将被覆盖)
  24934. var visiTags = [];
  24935. for (var i in objects.tagManager.tags) {
  24936. var tag = objects.tagManager.tags[i];
  24937. if (tag.state == 'videoPanoFlag') continue;
  24938. var visiblePanos = tag.getVisiblePanos();
  24939. visiTags.push({
  24940. sid: tag.sid,
  24941. value: visiblePanos
  24942. });
  24943. }
  24944. return visiTags;
  24945. }
  24946. }, {
  24947. key: "afterResetTagVisibles",
  24948. value: function afterResetTagVisibles(visiTags) {
  24949. visiTags.forEach(function (info) {
  24950. objects.tagManager.tags[info.sid].setVisiblePanos(info.value);
  24951. });
  24952. if (objects.player.mode == 'panorama') objects.tagManager.updateVisible('panorama');
  24953. }
  24954. }, {
  24955. key: "resetVisiblesByModel",
  24956. value: function resetVisiblesByModel() {
  24957. //自动计算所有热点和漫游点的可视
  24958. this.resetTagVisiByModel();
  24959. }
  24960. }, {
  24961. key: "gotoFloor",
  24962. value: function gotoFloor(index) {
  24963. var _this13 = this;
  24964. if (this.player.model.currentFloor.floorIndex != index) return;
  24965. var floor = this.player.model.floors.index[index]; // 记录跳转楼层前的activePano,用于跳回时再激活
  24966. // 跳转其他floor后没有新activepano,则在跳转回该floor时激活lastFloorActivePano
  24967. // 跳转其他floor后有新activepano,则lastFloorActivePano赋值为null
  24968. if (this.activePano) this.lastFloorActivePano = this.activePano;
  24969. if (this.setTagVisible) {
  24970. //this.pauseSetTagVisible('unsaved', floor)
  24971. if (this.tagVsetting) {
  24972. this.hideFootIcons();
  24973. this.showFootIcons();
  24974. for (var id in this.tagsVLines) {
  24975. if (panoIndexes[id].floor.floorIndex == this.player.model.currentFloor.floorIndex && this.tagsVLines[id].visible) {
  24976. this.tagsVLines[id].material.opacity = 1;
  24977. this.changeIconLinkState(panoIndexes[id].footIcon, 'linked');
  24978. } else {
  24979. this.tagsVLines[id].material.opacity = 0.4;
  24980. }
  24981. }
  24982. }
  24983. } else if (this.setPanoVisible) {
  24984. this.pauseSetPanoVisible('unsaved', floor);
  24985. setTimeout(function () {
  24986. if (_this13.lastFloorActivePano && _this13.lastFloorActivePano.floorIndex == index) {
  24987. _this13.SetOnePanoVisible(_this13.lastFloorActivePano);
  24988. _this13.player.$app.WalkManager.emit('walkManager.active', _this13.checkLinkStatus());
  24989. } else {
  24990. _this13.player.$app.WalkManager.emit('walkManager.deactive');
  24991. }
  24992. }, 1);
  24993. } //var size = this.getFitBoundSize(floor)
  24994. this.focusFloor(floor);
  24995. }
  24996. }, {
  24997. key: "focusFloor",
  24998. value: function focusFloor(floor) {
  24999. floor = floor || this.player.model.currentFloor;
  25000. var bound = floor.boundingBox.clone();
  25001. if (this.setTagVisible) {
  25002. this.player.$app.TagManager.tags.forEach(function (tag) {
  25003. if (tag.floorIndex == floor.floorIndex) {
  25004. bound.expandByPoint(tag.position);
  25005. }
  25006. });
  25007. }
  25008. var center = bound.getCenter(new THREE.Vector3());
  25009. var size = bound.getSize(new THREE.Vector3());
  25010. this.player.focusPoint({
  25011. modelSize: size,
  25012. aim: center
  25013. });
  25014. }
  25015. /* getFitBoundSize(floor, size_) {
  25016. if (!size_) {
  25017. size_ = floor.size
  25018. }
  25019. var MinWidth = (this.player.domElement.clientWidth + this.player.domElement.clientHeight) / 160 //size的x和z不小于MinWidth是为了防止当bound很小时放太大 根据屏幕大小,如果屏幕小会被缩小所以放大些
  25020. var w = size_.x
  25021. var h = size_.y
  25022. var size = new THREE.Vector3(
  25023. w < MinWidth ? (MinWidth + floor.size.x) / 2 : Math.min(w + floor.size.x * 0.3, floor.size.x),
  25024. 1,
  25025. h < MinWidth ? (MinWidth + floor.size.z) / 2 : Math.min(h + floor.size.z * 0.3, floor.size.z)
  25026. )
  25027. return size
  25028. } */
  25029. }]);
  25030. return Link;
  25031. }();
  25032. var FootIcon = /*#__PURE__*/function (_THREE$Mesh) {
  25033. _inherits(FootIcon, _THREE$Mesh);
  25034. var _super = _createSuper$1m(FootIcon);
  25035. function FootIcon(geo, pano) {
  25036. var _this14;
  25037. _classCallCheck(this, FootIcon);
  25038. _this14 = _super.call(this);
  25039. _this14.geometry = geo;
  25040. _this14.material = new THREE.RawShaderMaterial({
  25041. vertexShader: shaders.waypoint.vertexShader,
  25042. fragmentShader: shaders.waypoint.fragmentShader,
  25043. uniforms: THREE.UniformsUtils.clone(shaders.waypoint.uniforms),
  25044. // side: THREE.DoubleSide,
  25045. transparent: !0,
  25046. depthWrite: !1,
  25047. depthTest: false,
  25048. name: 'footIcon'
  25049. });
  25050. _this14.material.uniforms.color.value.set('#ffffff');
  25051. _this14.renderOrder = RenderOrder.footIcon;
  25052. _this14.type = 'FootIcon';
  25053. _this14.name = pano.id;
  25054. _this14.pano = pano;
  25055. _this14.status = '';
  25056. _this14.position.copy(pano.floorPosition.clone());
  25057. _this14.position.y /= 100; //使之集体小于action的高度
  25058. _this14.lookAt(_this14.position.clone().add(new THREE.Vector3(0, 1, 0)));
  25059. return _this14;
  25060. }
  25061. return FootIcon;
  25062. }(THREE.Mesh);
  25063. /**
  25064. * 勾图标
  25065. */
  25066. var ActionIcon = /*#__PURE__*/function (_THREE$Mesh2) {
  25067. _inherits(ActionIcon, _THREE$Mesh2);
  25068. var _super2 = _createSuper$1m(ActionIcon);
  25069. function ActionIcon(footIcon, geo, pano) {
  25070. var _this15;
  25071. _classCallCheck(this, ActionIcon);
  25072. _this15 = _super2.call(this);
  25073. _this15.geometry = geo;
  25074. _this15.material = new THREE.MeshBasicMaterial({
  25075. //MeshPhongMaterial
  25076. // side: THREE.DoubleSide,
  25077. transparent: !0,
  25078. depthTest: false,
  25079. name: 'footIcon'
  25080. });
  25081. _this15.footIcon = footIcon;
  25082. _this15.renderOrder = RenderOrder.footIcon + 1;
  25083. _this15.type = 'ActionIcon';
  25084. _this15.name = pano.id;
  25085. _this15.pano = pano;
  25086. _this15.position.set(0.2, 0.2, 1); //z是高度,抬高是为了点击时优先于footIcon被选中. 为了遮住所有高低不等的footicon,z需要设置高一些
  25087. return _this15;
  25088. }
  25089. return ActionIcon;
  25090. }(THREE.Mesh);
  25091. 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); }; }
  25092. 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; } }
  25093. var DollLabel = /*#__PURE__*/function (_THREE$EventDispatche) {
  25094. _inherits(DollLabel, _THREE$EventDispatche);
  25095. var _super = _createSuper$1l(DollLabel);
  25096. function DollLabel(player, o) {
  25097. var _this;
  25098. _classCallCheck(this, DollLabel);
  25099. _this = _super.call(this);
  25100. _this.player = player;
  25101. _this.position = o.pos;
  25102. _this.sid = o.sid;
  25103. _this.text = o.text || '';
  25104. _this.toPano = o.toPano;
  25105. _this.clickFun = o.clickFun;
  25106. _this.noLine = o.noLine;
  25107. _this.driftDir = o.driftDir;
  25108. _this.floorIndex = o.floorIndex;
  25109. _this.elem = document.createElement('div');
  25110. _this.elem.className = 'room-label';
  25111. _this.elem.style.display = 'none';
  25112. _this.elem.innerHTML = "<a><p><span>".concat(_this.text, "</span></p></a>");
  25113. o.container ? o.container.append(_this.elem) : document.querySelector('.widgets-doll-labels').append(_this.elem);
  25114. _this.player.dollLabels.push(_assertThisInitialized(_this));
  25115. _this.elem.addEventListener('click', _this.clickFuc.bind(_assertThisInitialized(_this)));
  25116. _this.enable = true;
  25117. _this.type = 'doll';
  25118. _this.pos2d = new THREE.Vector3();
  25119. if (_this.noLine) _this.elem.className += ' noLine'; //去掉线的话
  25120. _this.visible = true; //2023.6新增 用于控制多原因隐藏
  25121. player.on('beginShowMonitor', function () {
  25122. common$1.updateVisible(_assertThisInitialized(_this), 'showMonitor', false);
  25123. });
  25124. player.on('leavedShowMonitor', function () {
  25125. common$1.updateVisible(_assertThisInitialized(_this), 'showMonitor', true);
  25126. });
  25127. return _this;
  25128. }
  25129. _createClass(DollLabel, [{
  25130. key: "changeText",
  25131. value: function changeText(t) {
  25132. this.elem.querySelector('span').innerHTML = this.text = t;
  25133. }
  25134. }, {
  25135. key: "update",
  25136. value: function update() {
  25137. //enable只和是否有cad图相关
  25138. 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) // ))
  25139. ) {
  25140. this.elem.style.display = 'none';
  25141. return;
  25142. }
  25143. var p = convertTool.getPos2d(this.position, this.player);
  25144. if (!p.trueSide) {
  25145. this.elem.style.display = 'none';
  25146. return;
  25147. } //判断label是否被模型遮挡,遮挡则消失
  25148. if (convertTool.ifShelter(this.position, this.player, {
  25149. x: p.vector.x,
  25150. y: p.vector.y
  25151. }, null, this.player.model.allFloorsVisible ? null : this.floorIndex)) {
  25152. this.elem.style.display = 'none';
  25153. return;
  25154. }
  25155. this.elem.style.display = ''; //先显示,driftDir才能计算位置
  25156. if (this.driftDir) {
  25157. //针对入户门标识。 label位置相对position向外偏移一段(driftDir为箭头方向),保证label的外沿相对position距离spaceDis个像素,这样看上去就会贴近箭头且距离稳定。
  25158. var driftPoint = convertTool.getPos2d(this.position.clone().add(this.driftDir), this.player); //先将label置于position的位置,然后求从箭头开始到position的这条射线在label的rect中的二维交点(向外的那个交点)
  25159. var rect = this.elem.children[0].getBoundingClientRect();
  25160. var crossPos2d = math$2.getCrossPointAtRect(driftPoint.pos, p.pos, rect.width, rect.height, p.pos.x - rect.width / 2, p.pos.y - rect.height / 2);
  25161. var driftVec = crossPos2d.sub(p.pos.clone()); //得到二维偏移方向
  25162. var dis = this.position.distanceTo(this.player.camera.position);
  25163. var spaceDis = 100 / dis; //边距(距离position) 为了防止离远时看起来似乎较远,除以一下相机距离
  25164. //将label的二维位置向外偏移 长度为label的中心到label边缘(crossPos2d)的距离 外加一小段spaceDis
  25165. var result = p.pos.clone().add(driftVec.multiplyScalar((spaceDis + driftVec.length()) / driftVec.length()));
  25166. this.elem.style.left = result.x + 'px';
  25167. this.elem.style.top = result.y + 'px';
  25168. } else {
  25169. this.elem.style.left = p.pos.x + 'px';
  25170. this.elem.style.top = p.pos.y + 'px';
  25171. }
  25172. this.pos2d = p.vector;
  25173. }
  25174. }, {
  25175. key: "clickFuc",
  25176. value: function clickFuc() {
  25177. if (this.toPano) this.player.flyToPano({
  25178. pano: this.toPano
  25179. });else if (this.clickFun) this.clickFun();
  25180. }
  25181. }, {
  25182. key: "remove",
  25183. value: function remove() {
  25184. var parentElem = this.elem.parentElement; // document.querySelector('.widgets-doll-labels')
  25185. parentElem && parentElem.removeChild(this.elem);
  25186. var a = this.player.dollLabels.indexOf(this);
  25187. if (a > -1) this.player.dollLabels.splice(a, 1);
  25188. }
  25189. }]);
  25190. return DollLabel;
  25191. }(THREE.EventDispatcher);
  25192. 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); }; }
  25193. 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; } }
  25194. var arrowHeight = 0.4;
  25195. var arrowLength = 1.6;
  25196. var arrowSpace = 1.8;
  25197. var _scale$1 = 0.2;
  25198. var oriVec = new THREE.Vector3(0, 0, -1); //箭头初始朝向
  25199. var matDefault = new THREE.MeshStandardMaterial({
  25200. //默认材质
  25201. transparent: true,
  25202. color: new THREE.Color(1, 1, 1),
  25203. opacity: 0.45,
  25204. metalness: 1,
  25205. //太低没有光照效果, 需要比emissive高一丢丢
  25206. emissive: new THREE.Color(0.85, 0.85, 0.85)
  25207. });
  25208. var matHighLight = matDefault.clone(); //高亮材质
  25209. matHighLight.opacity = 0.9;
  25210. var arrowGeo; //入户门的箭头动画
  25211. var EntryArrow = /*#__PURE__*/function (_THREE$Object3D) {
  25212. _inherits(EntryArrow, _THREE$Object3D);
  25213. var _super = _createSuper$1k(EntryArrow);
  25214. function EntryArrow(player, entryInfo) {
  25215. var _this;
  25216. _classCallCheck(this, EntryArrow);
  25217. _this = _super.call(this);
  25218. _this.player = player;
  25219. var count = 4;
  25220. var arrow = _this.createArrow();
  25221. _this.add(arrow);
  25222. arrow.oriPosition = arrow.position.clone();
  25223. for (var i = 1; i < count; i++) {
  25224. var arrow_ = arrow.clone();
  25225. arrow_.position.setZ(i * arrowSpace);
  25226. arrow_.oriPosition = arrow_.position.clone();
  25227. _this.add(arrow_);
  25228. }
  25229. _this.name = 'entryArrow';
  25230. player.model.add(_assertThisInitialized(_this));
  25231. _this.scale.set(_scale$1, _scale$1, _scale$1); //this.scale.set(0.25,0.25,0.18)
  25232. _this.setPosition(entryInfo);
  25233. _this.currentHighLight = 0; //当前高亮的index
  25234. _this.traverse(function (e) {
  25235. e.renderOrder = RenderOrder.entryArrow;
  25236. });
  25237. console.log('create entryArrow');
  25238. return _this;
  25239. }
  25240. _createClass(EntryArrow, [{
  25241. key: "createArrow",
  25242. value: function createArrow() {
  25243. if (!arrowGeo) {
  25244. var points = [{
  25245. x: 0,
  25246. y: 0
  25247. }, {
  25248. x: 1,
  25249. y: arrowLength / 2
  25250. }, {
  25251. x: 1,
  25252. y: arrowLength
  25253. }, {
  25254. x: 0,
  25255. y: arrowLength / 2
  25256. }, {
  25257. x: -1,
  25258. y: arrowLength
  25259. }, {
  25260. x: -1,
  25261. y: arrowLength / 2
  25262. }];
  25263. var arrowShape = new THREE.Shape(); //先画一个二维的箭头顶视图
  25264. arrowShape.moveTo(points[0].x, points[0].y);
  25265. for (var i = 1, len = points.length; i < len; i++) {
  25266. arrowShape.lineTo(points[i].x, points[i].y);
  25267. }
  25268. arrowShape.lineTo(points[0].x, points[0].y);
  25269. arrowGeo = new THREE.ExtrudeBufferGeometry(arrowShape, {
  25270. depth: arrowHeight,
  25271. bevelEnabled: false
  25272. }); //挤出成模型
  25273. }
  25274. var arrow = new THREE.Mesh(arrowGeo, matDefault);
  25275. arrow.rotation.x = Math.PI / 2; //水平放置
  25276. return arrow;
  25277. }
  25278. }, {
  25279. key: "setPosition",
  25280. value: function setPosition(entryInfo) {
  25281. //设置入户门方位
  25282. //if(!metadata.cadInfo || (typeof metadata.cadInfo == "string" ? metadata.cadInfo.includes('"bound"') : metadata.cadInfo.bound))return;//代表是新版,cad图里的文字直接被planLabel取代,因此不用该函数
  25283. var left = new THREE.Vector3(entryInfo.points2d[0].x, entryInfo.bottom + arrowHeight * _scale$1, -entryInfo.points2d[0].y);
  25284. var right = new THREE.Vector3(entryInfo.points2d[1].x, entryInfo.bottom + arrowHeight * _scale$1, -entryInfo.points2d[1].y);
  25285. var entryPos = left.clone().add(right).multiplyScalar(0.5); //箭头就设定在门底部中央
  25286. var doorTangent = left.clone().sub(right).normalize();
  25287. var leftMat4 = new THREE.Matrix4();
  25288. leftMat4.set(0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 1);
  25289. doorTangent.applyMatrix4(leftMat4);
  25290. var dir = entryInfo.openSide == 'LEFT' ? doorTangent.multiplyScalar(-1) : doorTangent;
  25291. if (entryInfo.enter == 'reverse') {
  25292. //翻转
  25293. entryPos.add(dir.clone().multiplyScalar(left.distanceTo(right)));
  25294. dir.multiplyScalar(-1);
  25295. }
  25296. this.enterDir = dir;
  25297. this.position.copy(entryPos);
  25298. var qua = math$2.getQuaBetween2Vector(oriVec, dir, new THREE.Vector3(0, 1, 0));
  25299. this.quaternion.copy(qua);
  25300. this.addLabel(entryPos, dir, entryInfo.floorIndex);
  25301. this.entryPos = entryPos;
  25302. }
  25303. }, {
  25304. key: "addLabel",
  25305. value: function addLabel(entryPos, dir, floorIndex) {
  25306. //创建入户门标识
  25307. var closetPano = this.player.model.panos.closestPanoTowardPoint({
  25308. point: entryPos
  25309. });
  25310. if (!closetPano) {
  25311. console.error('what!!! no closetPano');
  25312. } //pos为箭头末端位置, driftDir偏移反方向
  25313. var arrowWholeLen = (arrowSpace * 3 + arrowLength) * _scale$1; //总长度
  25314. this.dollLabelOriPos = entryPos.clone().sub(dir.clone().multiplyScalar(arrowWholeLen)); // TODO text 多语言
  25315. var dollLabel = new DollLabel(this.player, {
  25316. sid: 'entry',
  25317. pos: this.dollLabelOriPos,
  25318. driftDir: dir,
  25319. noLine: true,
  25320. text: config$6.i18n('model.enter'),
  25321. toPano: closetPano,
  25322. floorIndex
  25323. });
  25324. this.player.defaultRoomLabels.push(dollLabel);
  25325. this.dollLabel = dollLabel;
  25326. }
  25327. }, {
  25328. key: "moveCloseToWall",
  25329. value: function moveCloseToWall(shift) {
  25330. //移动到户型图墙壁边缘 和cadFloorPlane有关
  25331. this.children.forEach(function (mesh) {
  25332. mesh.position.z = mesh.oriPosition.z + shift;
  25333. });
  25334. this.dollLabel.position = this.dollLabelOriPos.clone().sub(this.enterDir.clone().multiplyScalar(shift * _scale$1));
  25335. }
  25336. }, {
  25337. key: "reSetHeight",
  25338. value: function reSetHeight(y) {
  25339. this.position.setY(y);
  25340. this.dollLabel.position.y = y;
  25341. this.dollLabelOriPos.y = y;
  25342. } //----暂时是private------
  25343. }, {
  25344. key: "animate",
  25345. value: function animate() {
  25346. var _this2 = this;
  25347. this.children.forEach(function (mesh, index) {
  25348. if (index == _this2.currentHighLight) {
  25349. mesh.material = matHighLight;
  25350. } else {
  25351. mesh.material = matDefault;
  25352. }
  25353. });
  25354. this.currentHighLight = (this.currentHighLight - 1 + this.children.length) % this.children.length;
  25355. this.stopAnimation(); //防止重复启动animate
  25356. this.animation = setTimeout(this.animate.bind(this), 200);
  25357. }
  25358. }, {
  25359. key: "stopAnimation",
  25360. value: function stopAnimation() {
  25361. clearTimeout(this.animation);
  25362. this.animation = null;
  25363. } //-----------------------
  25364. }, {
  25365. key: "dispose",
  25366. value: function dispose() {
  25367. this.parent.remove(this);
  25368. this.stopAnimation();
  25369. }
  25370. }, {
  25371. key: "show",
  25372. value: function show() {
  25373. this.visible = true;
  25374. this.animate();
  25375. }
  25376. }, {
  25377. key: "hide",
  25378. value: function hide() {
  25379. this.visible = false;
  25380. this.stopAnimation();
  25381. }
  25382. }], [{
  25383. key: "switchDepthTest",
  25384. value: function switchDepthTest(state) {
  25385. matDefault.depthTest = state;
  25386. matHighLight.depthTest = state;
  25387. }
  25388. }]);
  25389. return EntryArrow;
  25390. }(THREE.Object3D);
  25391. var axis = {
  25392. forward: new THREE.Vector3(0, 0, -1),
  25393. back: new THREE.Vector3(0, 0, 1),
  25394. left: new THREE.Vector3(-1, 0, 0),
  25395. right: new THREE.Vector3(1, 0, 0)
  25396. };
  25397. var DoorLabel = /*#__PURE__*/function () {
  25398. function DoorLabel(player, o) {
  25399. _classCallCheck(this, DoorLabel);
  25400. this.player = player;
  25401. this.position = o.pos; //大约在门的位置
  25402. this.text = o.text || '';
  25403. this.aim = o.aim; //tagging的位置
  25404. this.toPano = o.toPano;
  25405. this.door = o.door;
  25406. this.visiblePanos = o.visiblePanos;
  25407. this.sameRoomPanos = o.sameRoomPanos;
  25408. this.doorDir = o.doorDir;
  25409. this.floorIndex = o.floorIndex;
  25410. this.enable = o.enable == void 0 ? true : o.enable;
  25411. this.elem = document.createElement('div');
  25412. this.elem.className = 'door show-arrow';
  25413. this.elem.style.display = 'none';
  25414. this.elem.innerHTML = "<a>".concat(this.text, "</a>");
  25415. o.container ? o.container.append(this.elem) : document.querySelector('.widgets-doors').append(this.elem);
  25416. this.player.doorLabels.push(this);
  25417. this.elem.addEventListener('pointerup', this.clickFuc.bind(this));
  25418. this.type = 'door';
  25419. this.pos2d = new THREE.Vector3();
  25420. this.getDirection(); //初始化朝向
  25421. this.updateVisible();
  25422. }
  25423. _createClass(DoorLabel, [{
  25424. key: "updateVisible",
  25425. value: function updateVisible(toPano) {
  25426. if (toPano) {
  25427. //飞之前,判断目的地是否是该房间内的,若不是,就直接隐藏;否则等到飞到之后再判断
  25428. if (this.sameRoomPanos.includes(toPano)) ; else {
  25429. this.enable = false;
  25430. }
  25431. } else {
  25432. if (this.visiblePanos.includes(this.player.currentPano)) {
  25433. this.enable = true;
  25434. } else {
  25435. this.enable = false;
  25436. }
  25437. }
  25438. }
  25439. }, {
  25440. key: "update",
  25441. value: function update() {
  25442. 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) // ||
  25443. // store.getters.page == 'cad' ||
  25444. // store.getters.page == 'data'
  25445. // ))
  25446. ) {
  25447. this.elem.style.display = 'none';
  25448. return;
  25449. }
  25450. var p = convertTool.getPos2d(this.position, this.player);
  25451. if (!p.trueSide) {
  25452. this.elem.style.display = 'none';
  25453. return;
  25454. }
  25455. /* if(convertTool.ifShelter(this.position, {x:p.vector.x, y: p.vector.y} )){
  25456. this.elem.css('display','none'); return;
  25457. } */
  25458. this.elem.style.left = p.pos.x + 'px';
  25459. this.elem.style.top = p.pos.y + 'px';
  25460. if (settings$3.vrEnabled) {
  25461. this.elem.style.transform = 'rotate(' + window.screenFaceOrient + 'deg)';
  25462. } else {
  25463. this.elem.style.transform = '';
  25464. }
  25465. this.elem.style.display = '';
  25466. this.pos2d = p.vector;
  25467. }
  25468. }, {
  25469. key: "getDirection",
  25470. value: function getDirection() {
  25471. //初始化doorLabel箭头朝向。决定了每个label的className (箭头朝向门内,不朝向tagging,因为tagging的位置会在房间任意地方,导致可能箭头指向门外)
  25472. var toward = DoorLabel.getToward(this.doorDir);
  25473. this.elem.className += ' ' + toward;
  25474. }
  25475. }, {
  25476. key: "clickFuc",
  25477. value: function clickFuc(e) {
  25478. if (this.toPano) {
  25479. //看向tagging
  25480. e.stopPropagation();
  25481. this.player.flyToPano({
  25482. pano: this.toPano,
  25483. lookAtPoint: this.aim.clone().setY(this.toPano.position.y),
  25484. duration: 1800
  25485. });
  25486. } else {
  25487. console.error('doorlabel没有toPano');
  25488. }
  25489. }
  25490. }, {
  25491. key: "remove",
  25492. value: function remove() {
  25493. var parentElem = this.elem.parentElement;
  25494. parentElem.removeChild(this.elem);
  25495. var a = this.player.doorLabels.indexOf(this);
  25496. if (a > -1) this.player.doorLabels.splice(a, 1);
  25497. }
  25498. }], [{
  25499. key: "getToward",
  25500. value: function getToward(dir) {
  25501. //传入方向后,归类四种朝向
  25502. for (var u in axis) {
  25503. var a = axis[u].clone().dot(dir.setY(0).normalize());
  25504. var angle = Math.acos(a);
  25505. if (angle < Math.PI / 4) {
  25506. return u;
  25507. }
  25508. }
  25509. console.warn('没有找到朝向..');
  25510. }
  25511. }, {
  25512. key: "updateCameraDir",
  25513. value: function updateCameraDir(player) {
  25514. if (player.mode != 'panorama' || player.doorLabels.length == 0) return;
  25515. var dir = player.getDirection();
  25516. var toward = DoorLabel.getToward(dir);
  25517. document.querySelector('.widgets-doors').setAttribute('data-camera-toward', toward);
  25518. }
  25519. }]);
  25520. return DoorLabel;
  25521. }();
  25522. var css$2 = "#compass {\r\n display: none;\r\n position: absolute;\r\n width: 90px;\r\n height: 90px;\r\n pointer-events: none;\r\n}\r\n\r\n#compass .north {\r\n color: #02a0e9;\r\n top: 0;\r\n}\r\n#compass .south {\r\n color: #ff1414;\r\n bottom: 0;\r\n}\r\n\r\n#compass .dirText {\r\n text-align: center;\r\n font-size: 10px;\r\n position: absolute;\r\n line-height: 25px;\r\n\r\n color: rgb(255, 255, 255);\r\n top: 50%;\r\n left: 50%;\r\n width: 45%;\r\n height: 0px;\r\n transform-origin: left center;\r\n}\r\n\r\n#compass #dirTextX {\r\n color: rgb(255, 0, 0);\r\n}\r\n\r\n#compass #dirTextY {\r\n color: rgb(0, 255, 0);\r\n}\r\n\r\n#compass #dirTextZ {\r\n color: rgb(0, 0, 255);\r\n}\r\n\r\n#compass .dirText span {\r\n display: block;\r\n position: absolute;\r\n right: 5px;\r\n top: 0;\r\n width: 20px;\r\n height: 20px;\r\n line-height: 20px;\r\n margin-top: -10px;\r\n}\r\n\r\n#compass .center {\r\n width: 50px;\r\n height: 50px;\r\n background-size: contain;\r\n background-position: center;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\r\n position: absolute;\r\n}\r\n#compass .center canvas{\r\n position: relative;\r\n left: 0;\r\n top: 0;\r\n width: 100%;\r\n height: 100%;\r\n display: block;\r\n background-color: transparent;\r\n}\r\n\r\n.widgets-doll-labels a, .widgets-plan-labels a, .widgets-doors a {\r\n color: #fff;\r\n font-size: 14px;\r\n line-height: normal;\r\n font-family: OpenSans,sans-serif;\r\n user-select: none;\r\n}\r\n\r\n.widgets-doll-labels .room-label {\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n -webkit-transform: translateZ(0);\r\n transform: translateZ(0);\r\n -webkit-animation: room-label 0.3s ease 0.1s;\r\n animation: room-label 0.3s ease 0.1s;\r\n -webkit-animation-fill-mode: both;\r\n animation-fill-mode: both;\r\n cursor: pointer;\r\n}\r\n\r\n.widgets-doll-labels .room-label:not(.noLine):after {\r\n content: \"\";\r\n display: block;\r\n position: absolute;\r\n width: 4px;\r\n height: 68px;\r\n background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAABQCAYAAADYxx/bAAAASElEQVQYlY2QwQoAIAhDR///x6Z2CCaGSpfHNoegcHdfAGwBCKVUMdAMK7IKm2Wh2oSOdkaUhVbG3u++x7aqPbX9lWVEdn9/AGvVUp4wTpLmAAAAAElFTkSuQmCC\");\r\n background-size: contain;\r\n background-repeat: no-repeat;\r\n bottom: 0;\r\n left: 50%;\r\n -webkit-transform: translate(-50%);\r\n transform: translate(-50%);\r\n}\r\n.widgets-doll-labels .room-label a {\r\n display: block;\r\n position: absolute;\r\n line-height: 22px;\r\n top: -66px;\r\n transform: translate(-50%, -100%);\r\n text-align: center;\r\n white-space: nowrap;\r\n font-size: 12px;\r\n font-style: normal;\r\n pointer-events: auto;\r\n \r\n background-repeat: no-repeat;\r\n background-size: 100% 100%;\r\n background: rgba(210, 210, 210, 0.7);\r\n border: 1px solid rgba(255, 255, 255, 0.4);\r\n border-radius: 3px; \r\n text-shadow: 0px 1px 3px rgb(0,0, 0, 0.5);\r\n}\r\n .widgets-doll-labels .room-label a::before {\r\n content: \"\";\r\n position: absolute;\r\n left: -1px;\r\n top: -1px;\r\n width: 10px;\r\n height: 10px;\r\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjZweCIgaGVpZ2h0PSI2cHgiIHZpZXdCb3g9IjAgMCA2IDYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+DQogICAgPHRpdGxlPm1hcF9jb3JuZXIgIDwvdGl0bGU+DQogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4NCiAgICAgICAgPGcgaWQ9IuWxleekuueVjOmdoi3kuInnu7QiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01Ni4wMDAwMDAsIC0yNzAuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj4NCiAgICAgICAgICAgIDxnIGlkPSLnvJbnu4QtMTUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMxLjAwMDAwMCwgMjcwLjAwMDAwMCkiPg0KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgtKy3lvaLnirbnu5PlkIgt6JKZ54mIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNS4wMDAwMDAsIDAuMDAwMDAwKSI+DQogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LDYgTDUsNiBMNSwyLjcwNSBMMy4zMDEsMSBMMCwxIEwwLDAgTDMuNzE1MjI2NDEsMCBMNiwyLjI5MzQ0Nzk1IEw2LDYgWiIgaWQ9Im1hcF9jb3JuZXItLSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMy4wMDAwMDAsIDMuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0zLjAwMDAwMCwgLTMuMDAwMDAwKSAiPjwvcGF0aD4NCiAgICAgICAgICAgICAgICA8L2c+DQogICAgICAgICAgICA8L2c+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4=);\r\n background-repeat: no-repeat;\r\n background-position: top left;\r\n }\r\n .widgets-doll-labels .room-label a::after {\r\n content: \"\";\r\n position: absolute;\r\n left: -1px;\r\n bottom: -1px;\r\n width: 10px;\r\n height: 10px;\r\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjZweCIgaGVpZ2h0PSI2cHgiIHZpZXdCb3g9IjAgMCA2IDYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+DQogICAgPHRpdGxlPm1hcF9jb3JuZXIgIDwvdGl0bGU+DQogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4NCiAgICAgICAgPGcgaWQ9IuWxleekuueVjOmdoi3kuInnu7QiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01Ni4wMDAwMDAsIC0yNzAuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj4NCiAgICAgICAgICAgIDxnIGlkPSLnvJbnu4QtMTUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMxLjAwMDAwMCwgMjcwLjAwMDAwMCkiPg0KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgtKy3lvaLnirbnu5PlkIgt6JKZ54mIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNS4wMDAwMDAsIDAuMDAwMDAwKSI+DQogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LDYgTDUsNiBMNSwyLjcwNSBMMy4zMDEsMSBMMCwxIEwwLDAgTDMuNzE1MjI2NDEsMCBMNiwyLjI5MzQ0Nzk1IEw2LDYgWiIgaWQ9Im1hcF9jb3JuZXItLSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMy4wMDAwMDAsIDMuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0zLjAwMDAwMCwgLTMuMDAwMDAwKSAiPjwvcGF0aD4NCiAgICAgICAgICAgICAgICA8L2c+DQogICAgICAgICAgICA8L2c+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4=);\r\n background-repeat: no-repeat;\r\n background-position: top left;\r\n transform: rotate(270deg);\r\n }\r\n .widgets-doll-labels .room-label a > p {\r\n margin: 0;\r\n padding: 2px 10px;\r\n height: 100%;\r\n line-height: 1.5;\r\n }\r\n .widgets-doll-labels .room-label a > p::before {\r\n content: \"\";\r\n position: absolute;\r\n right: -1px;\r\n top: -1px;\r\n width: 10px;\r\n height: 10px;\r\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjZweCIgaGVpZ2h0PSI2cHgiIHZpZXdCb3g9IjAgMCA2IDYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+DQogICAgPHRpdGxlPm1hcF9jb3JuZXIgIDwvdGl0bGU+DQogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4NCiAgICAgICAgPGcgaWQ9IuWxleekuueVjOmdoi3kuInnu7QiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01Ni4wMDAwMDAsIC0yNzAuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj4NCiAgICAgICAgICAgIDxnIGlkPSLnvJbnu4QtMTUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMxLjAwMDAwMCwgMjcwLjAwMDAwMCkiPg0KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgtKy3lvaLnirbnu5PlkIgt6JKZ54mIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNS4wMDAwMDAsIDAuMDAwMDAwKSI+DQogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LDYgTDUsNiBMNSwyLjcwNSBMMy4zMDEsMSBMMCwxIEwwLDAgTDMuNzE1MjI2NDEsMCBMNiwyLjI5MzQ0Nzk1IEw2LDYgWiIgaWQ9Im1hcF9jb3JuZXItLSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMy4wMDAwMDAsIDMuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0zLjAwMDAwMCwgLTMuMDAwMDAwKSAiPjwvcGF0aD4NCiAgICAgICAgICAgICAgICA8L2c+DQogICAgICAgICAgICA8L2c+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4=);\r\n background-repeat: no-repeat;\r\n background-position: top left;\r\n transform: rotate(90deg);\r\n }\r\n .widgets-doll-labels .room-label a > p::after {\r\n content: \"\";\r\n position: absolute;\r\n right: -1px;\r\n bottom: -1px;\r\n width: 10px;\r\n height: 10px;\r\n background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxzdmcgd2lkdGg9IjZweCIgaGVpZ2h0PSI2cHgiIHZpZXdCb3g9IjAgMCA2IDYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+DQogICAgPHRpdGxlPm1hcF9jb3JuZXIgIDwvdGl0bGU+DQogICAgPGcgaWQ9Iumhtemdoi0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4NCiAgICAgICAgPGcgaWQ9IuWxleekuueVjOmdoi3kuInnu7QiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01Ni4wMDAwMDAsIC0yNzAuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj4NCiAgICAgICAgICAgIDxnIGlkPSLnvJbnu4QtMTUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMxLjAwMDAwMCwgMjcwLjAwMDAwMCkiPg0KICAgICAgICAgICAgICAgIDxnIGlkPSLlvaLnirbnu5PlkIgtKy3lvaLnirbnu5PlkIgt6JKZ54mIIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNS4wMDAwMDAsIDAuMDAwMDAwKSI+DQogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LDYgTDUsNiBMNSwyLjcwNSBMMy4zMDEsMSBMMCwxIEwwLDAgTDMuNzE1MjI2NDEsMCBMNiwyLjI5MzQ0Nzk1IEw2LDYgWiIgaWQ9Im1hcF9jb3JuZXItLSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMy4wMDAwMDAsIDMuMDAwMDAwKSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0zLjAwMDAwMCwgLTMuMDAwMDAwKSAiPjwvcGF0aD4NCiAgICAgICAgICAgICAgICA8L2c+DQogICAgICAgICAgICA8L2c+DQogICAgICAgIDwvZz4NCiAgICA8L2c+DQo8L3N2Zz4=);\r\n background-repeat: no-repeat;\r\n background-position: top left;\r\n transform: rotate(180deg);\r\n }\r\n\r\n.widgets-doll-labels .room-label.noLine a {\r\n top: 16px;\r\n}\r\n\r\n.widgets-doll-labels .room-label a span {\r\n white-space: nowrap;\r\n user-select: none;\r\n}\r\n\r\n.widgets-doll-labels .room-label.with-entrance:after {\r\n display: none;\r\n}\r\n\r\n.widgets-doll-labels .room-label.with-entrance a {\r\n top: 50%;\r\n width: 38.5px;\r\n height: 15.75px;\r\n background-size: 38.5px 15.75px;\r\n -webkit-transform: translate(-50%, -50%);\r\n transform: translate(-50%, -50%);\r\n}\r\n\r\n.widgets-doll-labels .room-label.with-entrance a span {\r\n margin-left: -0.875px;\r\n margin-top: -0.875px;\r\n}\r\n\r\n.widgets-plan-labels .room-label {\r\n position: absolute;\r\n -webkit-animation: room-label 0.3s ease 0.1s;\r\n animation: room-label 0.3s ease 0.1s;\r\n -webkit-animation-fill-mode: both;\r\n animation-fill-mode: both;\r\n}\r\n\r\n.widgets-plan-labels .room-label a {\r\n display: block;\r\n position: absolute;\r\n line-height: 24px;\r\n -webkit-transform: translate(-50%);\r\n transform: translate(-50%, -50%);\r\n text-align: center;\r\n white-space: nowrap;\r\n font-size: 14px;\r\n font-style: normal;\r\n}\r\n\r\n.widgets-doors {\r\n position: absolute;\r\n pointer-events: none;\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n right: 0;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=right] .door.show-arrow.right a:before,\r\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.right a:before {\r\n margin-right: 3.5px;\r\n -webkit-transform: rotate(180deg);\r\n transform: rotate(180deg);\r\n}\r\n\r\n.widgets-doors[data-camera-toward=right] .door.show-arrow.right a:before,\r\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.forward a:before,\r\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.left a:after,\r\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.right a:before {\r\n content: \"\";\r\n position: relative;\r\n display: inline-block;\r\n width: 10.5px;\r\n height: 10.5px;\r\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4NCiAgPGcgaWQ9ImltZ19hcnJvdyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcyMSAtNTkzKSI+DQogICAgPHBhdGggaWQ9Iui3r+W+hF8xNDQ1IiBkYXRhLW5hbWU9Iui3r+W+hCAxNDQ1IiBkPSJNNTI1LjU4LDUxMC43NzNsLTQuNzM4LTQuNTg4YS42MjIuNjIyLDAsMCwwLS40MzQtLjE3M0g1MTcuN2EuNjI1LjYyNSwwLDAsMSwuNDM1LjE3M2w0LjczOCw0LjU4OGEuMzcuMzcsMCwwLDEsMCwuNTRsLTQuNzM5LDQuNTMyYS42MjEuNjIxLDAsMCwxLS40MzIuMTY3aDIuNzExYS42MjEuNjIxLDAsMCwwLC40MzEtLjE2N2w0LjczOS00LjUzMkEuMzcuMzcsMCwwLDAsNTI1LjU4LDUxMC43NzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDkuMzAzIDg2Ljk4OSkiIGZpbGw9IiNmZmYiLz4NCiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+DQogIDwvZz4NCjwvc3ZnPg0K) no-repeat 50%;\r\n background-size: 100% 100%;\r\n vertical-align: middle;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"forward\"] .door.show-arrow.left a:after {\r\n margin-left: 4px;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"forward\"] .door.show-arrow.back a:after,\r\n.widgets-doors[data-camera-toward=\"right\"] .door.show-arrow.left a:after {\r\n content: \"\";\r\n display: inline-block;\r\n vertical-align: middle;\r\n width: 10.5px;\r\n height: 10.5px;\r\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4NCiAgPGcgaWQ9ImltZ19hcnJvdyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcyMSAtNTkzKSI+DQogICAgPHBhdGggaWQ9Iui3r+W+hF8xNDQ1IiBkYXRhLW5hbWU9Iui3r+W+hCAxNDQ1IiBkPSJNNTI1LjU4LDUxMC43NzNsLTQuNzM4LTQuNTg4YS42MjIuNjIyLDAsMCwwLS40MzQtLjE3M0g1MTcuN2EuNjI1LjYyNSwwLDAsMSwuNDM1LjE3M2w0LjczOCw0LjU4OGEuMzcuMzcsMCwwLDEsMCwuNTRsLTQuNzM5LDQuNTMyYS42MjEuNjIxLDAsMCwxLS40MzIuMTY3aDIuNzExYS42MjEuNjIxLDAsMCwwLC40MzEtLjE2N2w0LjczOS00LjUzMkEuMzcuMzcsMCwwLDAsNTI1LjU4LDUxMC43NzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDkuMzAzIDg2Ljk4OSkiIGZpbGw9IiNmZmYiLz4NCiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+DQogIDwvZz4NCjwvc3ZnPg0K) no-repeat 50%;\r\n background-size: 100% 100%;\r\n margin-left: 4px;\r\n -webkit-transform: rotate(-90deg);\r\n transform: rotate(-90deg);\r\n}\r\n\r\n.widgets-doors[data-camera-toward=forward] .door.show-arrow.forward a:before ,\r\n.widgets-doors[data-camera-toward=right] .door.show-arrow.back a:before {\r\n margin-right: 3.5px;\r\n -webkit-transform: rotate(180deg);\r\n transform: rotate(180deg);\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"right\"] .door.show-arrow.back a:before,\r\n.widgets-doors[data-camera-toward=\"right\"] .door.show-arrow.forward a:after {\r\n content: \"\";\r\n position: relative;\r\n display: inline-block;\r\n width: 10.5px;\r\n height: 10.5px;\r\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4NCiAgPGcgaWQ9ImltZ19hcnJvdyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcyMSAtNTkzKSI+DQogICAgPHBhdGggaWQ9Iui3r+W+hF8xNDQ1IiBkYXRhLW5hbWU9Iui3r+W+hCAxNDQ1IiBkPSJNNTI1LjU4LDUxMC43NzNsLTQuNzM4LTQuNTg4YS42MjIuNjIyLDAsMCwwLS40MzQtLjE3M0g1MTcuN2EuNjI1LjYyNSwwLDAsMSwuNDM1LjE3M2w0LjczOCw0LjU4OGEuMzcuMzcsMCwwLDEsMCwuNTRsLTQuNzM5LDQuNTMyYS42MjEuNjIxLDAsMCwxLS40MzIuMTY3aDIuNzExYS42MjEuNjIxLDAsMCwwLC40MzEtLjE2N2w0LjczOS00LjUzMkEuMzcuMzcsMCwwLDAsNTI1LjU4LDUxMC43NzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDkuMzAzIDg2Ljk4OSkiIGZpbGw9IiNmZmYiLz4NCiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+DQogIDwvZz4NCjwvc3ZnPg0K) no-repeat 50%;\r\n background-size: 100% 100%;\r\n vertical-align: middle;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"right\"] .door.show-arrow.forward a:after {\r\n margin-left: 4px;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"left\"] .door.show-arrow.right a:after {\r\n -webkit-transform: rotate(-90deg);\r\n transform: rotate(-90deg);\r\n}\r\n\r\n.widgets-doors[data-camera-toward=back] .door.show-arrow.back a:after,\r\n.widgets-doors[data-camera-toward=left] .door.show-arrow.left a:after,\r\n.widgets-doors[data-camera-toward=left] .door.show-arrow.back a:after,\r\n.widgets-doors[data-camera-toward=left] .door.show-arrow.right a:after {\r\n content: \"\";\r\n display: inline-block;\r\n vertical-align: middle;\r\n width: 10.5px;\r\n height: 10.5px;\r\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4NCiAgPGcgaWQ9ImltZ19hcnJvdyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcyMSAtNTkzKSI+DQogICAgPHBhdGggaWQ9Iui3r+W+hF8xNDQ1IiBkYXRhLW5hbWU9Iui3r+W+hCAxNDQ1IiBkPSJNNTI1LjU4LDUxMC43NzNsLTQuNzM4LTQuNTg4YS42MjIuNjIyLDAsMCwwLS40MzQtLjE3M0g1MTcuN2EuNjI1LjYyNSwwLDAsMSwuNDM1LjE3M2w0LjczOCw0LjU4OGEuMzcuMzcsMCwwLDEsMCwuNTRsLTQuNzM5LDQuNTMyYS42MjEuNjIxLDAsMCwxLS40MzIuMTY3aDIuNzExYS42MjEuNjIxLDAsMCwwLC40MzEtLjE2N2w0LjczOS00LjUzMkEuMzcuMzcsMCwwLDAsNTI1LjU4LDUxMC43NzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDkuMzAzIDg2Ljk4OSkiIGZpbGw9IiNmZmYiLz4NCiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+DQogIDwvZz4NCjwvc3ZnPg0K) no-repeat 50%;\r\n background-size: 100% 100%;\r\n margin-left: 4px;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"left\"] .door.show-arrow.back a:after {\r\n position: relative;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"left\"] .door.show-arrow.forward a:before {\r\n position: relative;\r\n margin-right: 3.5px;\r\n -webkit-transform: rotate(180deg);\r\n transform: rotate(180deg);\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.forward a:after,\r\n.widgets-doors[data-camera-toward=\"left\"] .door.show-arrow.forward a:before {\r\n content: \"\";\r\n display: inline-block;\r\n width: 10.5px;\r\n height: 10.5px;\r\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4NCiAgPGcgaWQ9ImltZ19hcnJvdyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcyMSAtNTkzKSI+DQogICAgPHBhdGggaWQ9Iui3r+W+hF8xNDQ1IiBkYXRhLW5hbWU9Iui3r+W+hCAxNDQ1IiBkPSJNNTI1LjU4LDUxMC43NzNsLTQuNzM4LTQuNTg4YS42MjIuNjIyLDAsMCwwLS40MzQtLjE3M0g1MTcuN2EuNjI1LjYyNSwwLDAsMSwuNDM1LjE3M2w0LjczOCw0LjU4OGEuMzcuMzcsMCwwLDEsMCwuNTRsLTQuNzM5LDQuNTMyYS42MjEuNjIxLDAsMCwxLS40MzIuMTY3aDIuNzExYS42MjEuNjIxLDAsMCwwLC40MzEtLjE2N2w0LjczOS00LjUzMkEuMzcuMzcsMCwwLDAsNTI1LjU4LDUxMC43NzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDkuMzAzIDg2Ljk4OSkiIGZpbGw9IiNmZmYiLz4NCiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+DQogIDwvZz4NCjwvc3ZnPg0K) no-repeat 50%;\r\n background-size: 100% 100%;\r\n vertical-align: middle;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.forward a:after {\r\n margin-left: 4px;\r\n -webkit-transform: rotate(-90deg);\r\n transform: rotate(-90deg);\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.right a:after {\r\n margin-left: 4px;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.left a:before,\r\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.right a:after {\r\n content: \"\";\r\n position: relative;\r\n display: inline-block;\r\n width: 10.5px;\r\n height: 10.5px;\r\n background: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNCIgaGVpZ2h0PSIxMCIgdmlld0JveD0iMCAwIDE0IDEwIj4NCiAgPGcgaWQ9ImltZ19hcnJvdyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTcyMSAtNTkzKSI+DQogICAgPHBhdGggaWQ9Iui3r+W+hF8xNDQ1IiBkYXRhLW5hbWU9Iui3r+W+hCAxNDQ1IiBkPSJNNTI1LjU4LDUxMC43NzNsLTQuNzM4LTQuNTg4YS42MjIuNjIyLDAsMCwwLS40MzQtLjE3M0g1MTcuN2EuNjI1LjYyNSwwLDAsMSwuNDM1LjE3M2w0LjczOCw0LjU4OGEuMzcuMzcsMCwwLDEsMCwuNTRsLTQuNzM5LDQuNTMyYS42MjEuNjIxLDAsMCwxLS40MzIuMTY3aDIuNzExYS42MjEuNjIxLDAsMCwwLC40MzEtLjE2N2w0LjczOS00LjUzMkEuMzcuMzcsMCwwLDAsNTI1LjU4LDUxMC43NzNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMDkuMzAzIDg2Ljk4OSkiIGZpbGw9IiNmZmYiLz4NCiAgICA8cGF0aCBpZD0i6Lev5b6EXzE0NDYiIGRhdGEtbmFtZT0i6Lev5b6EIDE0NDYiIGQ9Ik01MjUuNTgsNTEwLjc3M2wtNC43MzgtNC41ODhhLjYyMi42MjIsMCwwLDAtLjQzNC0uMTczSDUxNy43YS42MjUuNjI1LDAsMCwxLC40MzUuMTczbDQuNzM4LDQuNTg4YS4zNy4zNywwLDAsMSwwLC41NGwtNC43MzksNC41MzJhLjYyMS42MjEsMCwwLDEtLjQzMi4xNjdoMi43MTFhLjYyMS42MjEsMCwwLDAsLjQzMS0uMTY3bDQuNzM5LTQuNTMyQS4zNy4zNywwLDAsMCw1MjUuNTgsNTEwLjc3M1oiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMy4zMDMgODYuOTg5KSIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iMC41Ii8+DQogIDwvZz4NCjwvc3ZnPg0K) no-repeat 50%;\r\n background-size: 100% 100%;\r\n vertical-align: middle;\r\n}\r\n\r\n.widgets-doors[data-camera-toward=\"back\"] .door.show-arrow.left a:before {\r\n margin-right: 3.5px;\r\n -webkit-transform: rotate(180deg);\r\n transform: rotate(180deg);\r\n}\r\n\r\n.widgets-doors .door {\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n /* display: none; */\r\n -webkit-animation: viewport-door-label 0.3s ease 1s;\r\n animation: viewport-door-label 0.3s ease 1s;\r\n -webkit-animation-fill-mode: both;\r\n animation-fill-mode: both;\r\n -webkit-transform: translateZ(0);\r\n transform: translateZ(0);\r\n cursor: pointer;\r\n}\r\n\r\n.widgets-doors .door a {\r\n display: block;\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n -webkit-transform: translate(-50%, -50%);\r\n transform: translate(-50%, -50%);\r\n border-radius: 1.75px;\r\n background: rgba(0, 0, 0, 0.5);\r\n line-height: 14px;\r\n padding: 8px 8px;\r\n border-radius: 4px;\r\n white-space: nowrap;\r\n font-size: 14px;\r\n font-style: normal;\r\n pointer-events: auto;\r\n -webkit-transition: background 0.3s ease, color 0.3s ease, -webkit-transform 1s ease;\r\n transition: background 0.3s ease, color 0.3s ease, -webkit-transform 1s ease;\r\n transition: transform 1s ease, background 0.3s ease, color 0.3s ease;\r\n transition: transform 1s ease, background 0.3s ease, color 0.3s ease, -webkit-transform 1s ease;\r\n}\r\n\r\n.widgets-doors .door a:after {\r\n -webkit-transition: opacity 0.3s ease;\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.widgets-doors .door a:active {\r\n background: rgba(0, 0, 0, 0.5);\r\n color: hsla(0, 0%, 100%, 0.5);\r\n}\r\n\r\n.widgets-doors .door a:active:after {\r\n opacity: 0.5;\r\n}\r\n\r\n\r\n.polygonMark-label {\r\n position: absolute;\r\n max-width: 340px;\r\n max-height: 125px;\r\n min-width: 45px;\r\n\r\n -webkit-animation: mark-label 0.3s ease 0.1s;\r\n animation: mark-label 0.3s ease 0.1s;\r\n -webkit-animation-fill-mode: both;\r\n animation-fill-mode: both;\r\n}\r\n.polygonMark-label .line{\r\n width: 100%;\r\n height: 0px;\r\n background-color: rgba(255, 255, 255, 0.75);\r\n box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.5);\r\n border: 1px solid rgba(255, 255, 255, 0.75);\r\n\r\n}\r\n.polygonMark-label .point{\r\n position: relative;\r\n top: -4px;\r\n left: -8px;\r\n opacity: 1;\r\n\r\n width: 8px;\r\n height: 8px;\r\n background-color: #ffffff; \r\n box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.5);\r\n border-radius: 100%;\r\n}\r\n.polygonMark-label .name {\r\n margin: 0;\r\n padding: 0;\r\n max-width: 320px;\r\n max-height: 63px;\r\n min-width: auto;\r\n\r\n margin-left: 20px;\r\n padding-bottom: 2.5px;\r\n word-break:normal;\r\n word-break: break-all;\r\n\r\n font-family: Microsoft YaHei;\r\n font-weight: bold;\r\n font-size: 16px;\r\n color: #FFFFFF;\r\n line-height: 19px;\r\n text-shadow: 0px 0px 4px rgba(0,0,0,0.8);\r\n text-align: left;\r\n font-style: normal;\r\n}\r\n.polygonMark-label .type{\r\n margin: 0;\r\n padding: 0;\r\n max-width: 320px;\r\n max-height: 63px;\r\n min-width: auto;\r\n\r\n margin-left: 20px;\r\n padding-top: 2.5px;\r\n word-break:normal;\r\n word-break: break-all;\r\n\r\n\r\n font-family: Microsoft YaHei;\r\n font-weight: 400;\r\n font-size: 14px;\r\n color: #FFFFFF;\r\n line-height: 16px;\r\n text-shadow: 0px 0px 4px rgba(0,0,0,0.8);\r\n text-align: left;\r\n font-style: normal;\r\n\r\n}\r\n\r\n@-webkit-keyframes mark-label {\r\n 0% {\r\n opacity: 0;\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n@keyframes mark-label {\r\n 0% {\r\n opacity: 0;\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n }\r\n}\r\n\r\n\r\n@-webkit-keyframes room-label {\r\n 0% {\r\n opacity: 0;\r\n margin-top: 8.75px;\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n margin-top: 0;\r\n }\r\n}\r\n\r\n@keyframes room-label {\r\n 0% {\r\n opacity: 0;\r\n margin-top: 8.75px;\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n margin-top: 0;\r\n }\r\n}\r\n\r\n@-webkit-keyframes door-label {\r\n 0% {\r\n opacity: 0;\r\n margin-top: 8.75px;\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n margin-top: 0;\r\n }\r\n}\r\n\r\n@keyframes door-label {\r\n 0% {\r\n opacity: 0;\r\n margin-top: 8.75px;\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n margin-top: 0;\r\n }\r\n}";
  25523. n$4(css$2,{});
  25524. 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); }; }
  25525. 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; } }
  25526. /*#__PURE__*/(function (_THREE$EventDispatche) {
  25527. _inherits(PlanLabel, _THREE$EventDispatche);
  25528. var _super = _createSuper$1j(PlanLabel);
  25529. function PlanLabel(player, o) {
  25530. var _this;
  25531. _classCallCheck(this, PlanLabel);
  25532. _this = _super.call(this);
  25533. console.log(PlanLabel);
  25534. _this.player = player;
  25535. _this.position = o.pos;
  25536. _this.sid = o.sid;
  25537. _this.text = o.text || '';
  25538. _this.toPano = o.toPano;
  25539. _this.enable = o.enable == void 0 ? true : o.enable;
  25540. _this.elem = document.createElement('div');
  25541. _this.elem.className = 'room-label';
  25542. _this.elem.style.display = 'none';
  25543. _this.elem.innerHTML = "<a>".concat(_this.text, "</a>");
  25544. o.container ? o.container.append(_this.elem) : document.querySelector('.widgets-plan-labels').append(_this.elem);
  25545. player.planLabels.push(_assertThisInitialized(_this));
  25546. _this.type = 'plan';
  25547. _this.floorIndex = o.floorIndex;
  25548. return _this;
  25549. }
  25550. _createClass(PlanLabel, [{
  25551. key: "changeText",
  25552. value: function changeText(t) {
  25553. this.elem.querySelector('a').innerHTML = this.text = t;
  25554. }
  25555. }, {
  25556. key: "update",
  25557. value: function update() {
  25558. //enable只和是否有cad图相关
  25559. 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) // ||
  25560. // store.getters.page == 'cad' ||
  25561. // store.getters.page == 'data'
  25562. // ))
  25563. ) {
  25564. this.elem.style.display = 'none';
  25565. return;
  25566. }
  25567. var p = convertTool.getPos2d(this.position, this.player);
  25568. if (!p.trueSide) {
  25569. this.elem.style.display = 'none';
  25570. return;
  25571. } //使之随着模型缩放,就像贴图一样。缺陷1:当不显示户型图时,ImgRatio为null;缺陷2:当模型很大时,每个房间看起来很小,可能字会超出边缘。
  25572. // var s = ( document.getElementsByClassName('player')[0].clientWidth * (this.player.model.cadFloorPlane.ImgRatio || 1 / 50) )
  25573. var s = this.player.domElement.clientWidth * (1 / 50) / Math.abs(this.player.cameraControls.activeControl.camera.left); //乘上app.model.floorplanCadImg.ImgRatio是为了让字相对于图片的像素不变。(否则就是根据模型尺寸) 防止图片覆盖的模型范围大的字也跟着被缩小。
  25574. s = THREE.MathUtils.clamp(s, 0.4, 3); //限定范围,主要是防止字太大,也可去除
  25575. this.elem.style.left = p.pos.x + 'px';
  25576. this.elem.style.top = p.pos.y + 'px';
  25577. this.elem.style.transform = 'scale(' + s + ')';
  25578. this.elem.style.display = '';
  25579. }
  25580. }, {
  25581. key: "remove",
  25582. value: function remove() {
  25583. var parentElem = this.elem.parentElement;
  25584. parentElem.removeChild(this.elem);
  25585. var a = this.player.planLabels.indexOf(this);
  25586. if (a > -1) this.player.planLabels.splice(a, 1);
  25587. }
  25588. }]);
  25589. return PlanLabel;
  25590. })(THREE.EventDispatcher);
  25591. /*
  25592. 判断遮挡方式:当户型和模型相差较大时的问题(尽力使户型贴准模型)
  25593. 1 用模型: 会有被遮挡然后看不见的情况,尤其是从斜侧面看,门容易被其他墙挡住。因为此外还有门没打洞的情况,加上该功能基于户型,所以不使用此方案。
  25594. 2 用数据: 会有看上去被墙遮挡但却还看得见的情况。
  25595. */
  25596. var LabelManager = /*#__PURE__*/function () {
  25597. function LabelManager(player) {
  25598. _classCallCheck(this, LabelManager);
  25599. this.player = player;
  25600. var dollElem = document.createElement('div');
  25601. dollElem.className = 'widgets-doll-labels';
  25602. player.domElement.append(dollElem);
  25603. var planElem = document.createElement('div');
  25604. planElem.className = 'widgets-plan-labels';
  25605. player.domElement.append(planElem);
  25606. var doorElem = document.createElement('div');
  25607. doorElem.className = 'widgets-doors';
  25608. player.domElement.append(doorElem); // let isAllFloor = false // 因为单楼层和全部楼层都会触发floor.changed, 以此来做区分
  25609. // this.player.model.on('floor.changed', (toFloor, mode) => {
  25610. // if (!isAllFloor) {
  25611. // this.gotoFloor(toFloor.floorIndex)
  25612. // } else {
  25613. // isAllFloor = false
  25614. // }
  25615. // })
  25616. // this.player.model.on('allfloors.toggled', (floors, currentFloor) => {
  25617. // if (floors) {
  25618. // this.gotoFloor()
  25619. // isAllFloor = true
  25620. // }
  25621. // })
  25622. if (this.player.$app.store.getValue('flooruser')) {
  25623. this.init();
  25624. }
  25625. this.player.$app.store.on('flooruser', this.init.bind(this));
  25626. }
  25627. _createClass(LabelManager, [{
  25628. key: "init",
  25629. value: function init() {
  25630. var _this = this;
  25631. //开户门箭头
  25632. // if (this.initedLabel) return
  25633. var floorJson = this.player.$app.store.getValue('flooruser'); // floorJson = common.compatiblev2(floorJson)
  25634. // 导入平面图后传入的就是空数据,且需要清空原先数据,所以不能这样判断
  25635. // var voidValue = true //可能还没得到数据,都是空的
  25636. // for (let i = 0; i < floorJson.floors.length; i++) {
  25637. // for (let j in floorJson.floors[i]) {
  25638. // if (floorJson.floors[i][j] instanceof Array && floorJson.floors[i][j].length > 0) {
  25639. // voidValue = false
  25640. // break
  25641. // }
  25642. // }
  25643. // }
  25644. // if (voidValue) return //空的
  25645. // // console.error(floorJson)
  25646. common$1.timeMeasuring.addTimeMark('initLabels', 'start');
  25647. this.player.defaultRoomLabels.forEach(function (label) {
  25648. return label.remove();
  25649. });
  25650. this.player.defaultRoomLabels = [];
  25651. floorJson.floors.forEach(function (floorData0, index) {
  25652. // 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的
  25653. index = _this.player.model.floors.list.length > 1 ? floorData0.subgroup != void 0 ? floorData0.subgroup : floorData0.id : index; //旧版单层model的id和json不对应,使用model的
  25654. var floor = _this.player.model.floors.index[index];
  25655. if (!floor) {
  25656. logger$1.warn("floor[".concat(index, "] is empty"));
  25657. return;
  25658. }
  25659. floor.entryArrow = [];
  25660. var bottom = floor.boundingBox.min.y; // 变换floorJson里的所有坐标
  25661. var floorData = JSON.parse(JSON.stringify(floorData0));
  25662. var modelCenter = JSON.parse(JSON.stringify(_this.player.model.center));
  25663. 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)
  25664. floorData.symbols && Object.keys(floorData.symbols).forEach(function (key) {
  25665. var symbol = floorData.symbols[key];
  25666. symbol.endPoint = getPointForRevRotate(symbol.endPoint, floorJson.angle, modelCenter);
  25667. symbol.startPoint = getPointForRevRotate(symbol.startPoint, floorJson.angle, modelCenter);
  25668. symbol.points2d = (symbol.points2d || []).map(function (point) {
  25669. return getPointForRevRotate(point, floorJson.angle, modelCenter);
  25670. });
  25671. });
  25672. floorData.tags && Object.keys(floorData.tags).forEach(function (key) {
  25673. var tag = floorData.tags[key];
  25674. tag.center = getPointForRevRotate(tag.center, floorJson.angle, modelCenter);
  25675. tag.points2d = tag.points2d.map(function (point) {
  25676. return getPointForRevRotate(point, floorJson.angle, modelCenter);
  25677. });
  25678. });
  25679. floorData.rooms && Object.keys(floorData.rooms).forEach(function (key) {
  25680. var room = floorData.rooms[key];
  25681. room.center = getPointForRevRotate(room.center, floorJson.angle, modelCenter);
  25682. });
  25683. floorData.points && Object.keys(floorData.points).forEach(function (key) {
  25684. var point = floorData.points[key];
  25685. var pointpos = getPointForRevRotate({
  25686. x: point.x,
  25687. y: point.y
  25688. }, floorJson.angle, modelCenter);
  25689. point.x = pointpos.x;
  25690. point.y = pointpos.y;
  25691. });
  25692. if (floorData.symbols) {
  25693. var entry;
  25694. var symbolKeys = Object.keys(floorData.symbols);
  25695. for (var i = 0; i < symbolKeys.length; i++) {
  25696. if (floorData.symbols[symbolKeys[i]].enter) {
  25697. entry = JSON.parse(JSON.stringify(floorData.symbols[symbolKeys[i]]));
  25698. entry.bottom = bottom + 0.1; //根据模型
  25699. entry.floorIndex = index; // entry.endPoint = getPointForRevRotate(entry.endPoint, floorJson.angle, this.player.model.center)
  25700. // entry.startPoint = getPointForRevRotate(entry.startPoint, floorJson.angle, this.player.model.center)
  25701. // entry.points2d = entry.points2d.map(point => getPointForRevRotate(point, floorJson.angle, this.player.model.center))
  25702. floor.entryArrow.push(new EntryArrow(_this.player, entry));
  25703. if (_this.player.model.currentFloor.floorIndex == index) _this.updateEntryVisi(true, index);else _this.updateEntryVisi(false, index);
  25704. }
  25705. }
  25706. _this.moveEntryArrow(index);
  25707. } //添加label 房间名
  25708. floorData.tags = floorData.tags || {};
  25709. _this.hasPlaneLabels = floorData.tags.length > 0;
  25710. var labelHeight = floor.center.y; //.panoHeightAve
  25711. Object.keys(floorData.tags).forEach(function (index_) {
  25712. var info = floorData.tags[index_];
  25713. var des = info.des && parseFloat(String(info.des).replace(',', '')).toFixed(2);
  25714. var title = info.title;
  25715. var area = des + info.unit + '<sup>2</sup>';
  25716. var content = info.des ? '约' + area : '';
  25717. if (!title && !content) return;
  25718. var text = title && content ? title + '<br>' + area // 如果name是空或只有空格,视若showArea == false; trim:去除字符串的头尾空格
  25719. : title ? title : content; // y方向有差异
  25720. 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)
  25721. var center = info.center;
  25722. var pos = new THREE.Vector3(center.x, -999 * rayDir.y, -center.y); // 检测当前pos在模型底部的映射坐标,确认标签高度
  25723. var ray = new THREE.Raycaster(pos, rayDir, 0.001, 9999);
  25724. var rayInfo = ray.intersectObject(floor.children[0]);
  25725. if (rayInfo[0]) {
  25726. pos = rayInfo[0].point;
  25727. pos.y += 0.5;
  25728. } else {
  25729. pos.y = labelHeight;
  25730. }
  25731. var closetPano = _this.player.model.panos.closestPanoTowardPoint({
  25732. point: pos,
  25733. floor
  25734. });
  25735. if (!closetPano) {
  25736. console.error('what!!! no closetPano');
  25737. }
  25738. var dollLabel = new DollLabel(_this.player, {
  25739. sid: index_,
  25740. pos: pos.clone(),
  25741. text: text,
  25742. toPano: closetPano,
  25743. floorIndex: index
  25744. });
  25745. _this.player.defaultRoomLabels.push(dollLabel); // var planLabel = new PlanLabel(this.player, { sid: 'pl_' + index_, pos: pos.clone(), text: text, floorIndex: index })
  25746. // this.player.defaultRoomLabels.push(planLabel)
  25747. _this.player.defaultRoomLabels.forEach(function (label) {
  25748. label.update();
  25749. });
  25750. });
  25751. _this.initDoorLabels(index, JSON.parse(JSON.stringify(floorData)));
  25752. });
  25753. this.initedLabel = true; //-------initedLabel之后------
  25754. this.setPlanLabelVisi();
  25755. common$1.timeMeasuring.addTimeMark('initLabels', 'end', true);
  25756. }
  25757. }, {
  25758. key: "initDoorLabels",
  25759. value: function initDoorLabels(floorIndex, floorJson) {
  25760. var _this2 = this;
  25761. var doors = [];
  25762. if (!floorJson.rooms || !floorJson.rooms[0] || !floorJson.rooms[0].wallPointIDs) {
  25763. console.log('没有room or 数据不标准 得不到doorlabels');
  25764. return;
  25765. }
  25766. var floor = this.player.model.floors.index[floorIndex];
  25767. var bottom = floor.boundingBox.min.y;
  25768. Object.keys(floorJson.tags).forEach(function (tagKey) {
  25769. var tag = floorJson.tags[tagKey];
  25770. tag.__panos = []; //for taggingTables
  25771. if (!tag.title) delete floorJson.tags[tagKey];
  25772. });
  25773. var doorJson = {};
  25774. Object.keys(floorJson.symbols).forEach(function (symKey) {
  25775. var symbol = floorJson.symbols[symKey];
  25776. if (symbol.geoType == 'SingleDoor' || symbol.geoType == 'SlideDoor' || symbol.geoType == 'DoubleDoor') doorJson[symKey] = symbol;
  25777. });
  25778. floorJson.rooms.forEach(function (room, index) {
  25779. room.name = '';
  25780. room.doors = Object.values(doorJson).filter(function (door) {
  25781. return room.wallIds.indexOf(door.parent) > -1;
  25782. }) || [];
  25783. room.taggings = [];
  25784. room.panos = [];
  25785. });
  25786. Object.keys(doorJson).forEach(function (doorKey) {
  25787. var door = doorJson[doorKey];
  25788. door.doorLabels = [];
  25789. doors.push(door);
  25790. door.center = {
  25791. x: (door.points2d[0].x + door.points2d[1].x) / 2,
  25792. y: (door.points2d[0].y + door.points2d[1].y) / 2
  25793. }; //中心位置
  25794. //正常一个门对应两个atRooms,但数据却可能多个,冗余的都是没有tagging的room,但没有tagging不代表是冗余的房间
  25795. door.atRooms = [];
  25796. floorJson.rooms.forEach(function (room) {
  25797. var door_ = room.doors.find(function (door_) {
  25798. return door_.vectorId == door.vectorId;
  25799. });
  25800. if (door_) {
  25801. //room.doors.push(door)
  25802. door.atRooms.push(room);
  25803. }
  25804. });
  25805. }); //保险起见,统一删除rooms里没对应上的门
  25806. floorJson.rooms.forEach(function (room) {
  25807. room.doors = room.doors.filter(function (door) {
  25808. return door.atRooms;
  25809. });
  25810. }); //找完了所有门和房间的对应关系
  25811. floor.panos.forEach(function (pano) {
  25812. pano._atRoom = null;
  25813. }); //查找房间中的tagging和pano
  25814. floorJson.rooms.forEach(function (room) {
  25815. room.points = room.wallPointIDs.map(function (pointId) {
  25816. return floorJson.points[pointId];
  25817. });
  25818. if (room.closetParent == void 0) {
  25819. //只从非内环找起,内环在searchTagRoom找
  25820. floor.panos.forEach(function (pano) {
  25821. if (pano._atRoom || !pano.isAligned()) return;
  25822. _this2.searchAtRoom(floorJson, room, pano, {
  25823. x: pano.position.x,
  25824. y: -pano.position.z
  25825. }, function (atRoom) {
  25826. pano._atRoom = atRoom;
  25827. atRoom.panos.push(pano);
  25828. });
  25829. });
  25830. Object.keys(floorJson.tags).forEach(function (tagKey) {
  25831. var tagging = floorJson.tags[tagKey];
  25832. if (tagging._atRoom) return;
  25833. _this2.searchAtRoom(floorJson, room, tagging, {
  25834. x: tagging.center.x,
  25835. y: tagging.center.y
  25836. }, function (atRoom) {
  25837. tagging._atRoom = atRoom;
  25838. atRoom.taggings.push(tagging);
  25839. atRoom.name += tagging.title + ' '; //将tagging收集到name中
  25840. });
  25841. });
  25842. }
  25843. room.taggings.length && room.panos.forEach(function (pano) {
  25844. //可能有pano不属于任何一个房间或tagging、也可能有tagging没有一个pano
  25845. var score = common$1.sortByScore(room.taggings, [], [function (tagging) {
  25846. //取距离最近的tagging作为pano的tagging
  25847. var panoPos = new THREE.Vector2(pano.position.x, pano.position.z);
  25848. var labelPos = new THREE.Vector2(tagging.center.x, -tagging.center.y);
  25849. return -panoPos.distanceTo(labelPos);
  25850. }]);
  25851. if (score && score.length) {
  25852. var noShelter = score.slice(0, 3).find(function (e) {
  25853. //当前点位看向tagging的视线不能被墙挡住
  25854. var tagging = e.item;
  25855. var panoPos = new THREE.Vector2(pano.position.x, pano.position.z);
  25856. var labelPos = new THREE.Vector2(tagging.center.x, -tagging.center.y);
  25857. return !_this2.isShelter(floorJson, labelPos, panoPos);
  25858. });
  25859. var tagging = (noShelter || score[0]).item;
  25860. tagging.__panos.push(pano);
  25861. }
  25862. });
  25863. });
  25864. Object.keys(floorJson.tags).forEach(function (tagKey) {
  25865. var tagging = floorJson.tags[tagKey];
  25866. var panos = tagging.__panos.filter(function (pano) {
  25867. return pano.neighbourUUIDs.length > 0;
  25868. }); //排除孤立的pano (是否要排除在当前楼层无其他连接的pano,这样的话最好漫游可行中也更改相关设置,及checkHasNeighbor
  25869. if (!panos.length) return;
  25870. tagging.clickToPano = common$1.sortByScore(panos, [], [function (pano) {
  25871. var panoPos = new THREE.Vector2(pano.position.x, pano.position.z);
  25872. var labelPos = new THREE.Vector2(tagging.center.x, -tagging.center.y);
  25873. return -panoPos.distanceTo(labelPos);
  25874. }])[0].item;
  25875. });
  25876. floor.taggingTables = Object.values(floorJson.tags).filter(function (tagging) {
  25877. return tagging.clickToPano;
  25878. }); //去掉没有pano的
  25879. //---------------end---------------------------------
  25880. var log = "floor".concat(floorIndex, "(").concat(floorJson.name || 'no name', ") \u5171\u6709").concat(floorJson.rooms.length, "\u4E2A\u623F\u95F4\uFF0C\u5206\u522B\u662F ");
  25881. floorJson.rooms.forEach(function (room) {
  25882. log += "\n\u623F\u95F4".concat(room.roomId, " : ").concat(room.name, " ");
  25883. }); //如果从0开始 说明没有外墙
  25884. //建立doorLabel
  25885. floorJson.rooms.forEach(function (room) {
  25886. if (room.taggings.length == 0) return;
  25887. var isClockWise = math$2.getArea(room.points) > 0; //是否顺时针
  25888. room.doors.forEach(function (door) {
  25889. //if (door.atRooms.length < 2) return //忽略atRooms只有一个的门,因为它在墙边上,不通两个房间,比如入户门//2023.7.20发现有时候外围区域没闭合就算不了房间,这样客厅就看不到其他房间了,所以单向门还是要加上
  25890. //获取门朝向(朝房间内的那个法线)
  25891. var points = [];
  25892. if (room.closetChilds) {
  25893. //可能在子环
  25894. var atRoom = door.atRooms.find(function (e) {
  25895. return door.startPoint && door.endPoint;
  25896. });
  25897. isClockWise = math$2.getArea(atRoom.points) > 0; //是否顺时针
  25898. atRoom != room && (isClockWise = !isClockWise); //如果在子环上,判断方向相反
  25899. points = atRoom.points;
  25900. } else {
  25901. points = room.points;
  25902. } //var normal = math.getNormal({ points: [door.startPoint, door.endPoint] })
  25903. var atWall = floorJson.walls[door.parent];
  25904. var point1 = floorJson.points[atWall.start]; //this.searchItemById(atWall.start, Object.values(floorJson.points))
  25905. var point2 = floorJson.points[atWall.end]; //this.searchItemById(atWall.end, Object.values(floorJson.points))
  25906. var pointOrder = _this2.order(point1, point2, points); //p1是否在p2前
  25907. var normal = math$2.getNormal({
  25908. points: [point1, point2]
  25909. });
  25910. var doorDir = new THREE.Vector3(normal.x, 0, -normal.y); //门朝向为:垂直于线条、朝房间内
  25911. if (pointOrder == isClockWise) doorDir.negate();
  25912. var roomOutside = false;
  25913. var panos = room.panos.filter(function (pano) {
  25914. return pano.neighbourUUIDs.length > 0;
  25915. }); //排除孤立的pano
  25916. if (panos.length == 0) {
  25917. //如果该房间没有,选择门外侧一点,范围不可过大
  25918. roomOutside = true;
  25919. panos = floor.panos.filter(function (pano) {
  25920. if (pano.neighbourUUIDs.length == 0) return;
  25921. var pos1 = new THREE.Vector2(door.center.x, -door.center.y);
  25922. var pos2 = new THREE.Vector2(pano.position.x, pano.position.z);
  25923. if (pos1.distanceTo(pos2) > 5) return;
  25924. var panoDir = pano.position.clone().sub(new THREE.Vector3(door.center.x, 0, -door.center.y));
  25925. if (doorDir.angleTo(panoDir) < Math.PI / 2) return true; //在门外这一侧,否则可能到隔壁房间
  25926. });
  25927. }
  25928. var toPano = common$1.sortByScore(panos, [], [function (pano) {
  25929. var score0 = 0;
  25930. if (roomOutside) {
  25931. //在房间外
  25932. var panoDir = pano.position.clone().sub(new THREE.Vector3(door.center.x, 0, -door.center.y));
  25933. score0 = -doorDir.angleTo(panoDir) * 2; //尽量垂直于门
  25934. }
  25935. var pos1 = new THREE.Vector2(door.center.x, -door.center.y);
  25936. var pos2 = new THREE.Vector2(pano.position.x, pano.position.z);
  25937. return -pos1.distanceTo(pos2) + score0;
  25938. }]); //寻找离该门最近的pano
  25939. toPano = toPano.length ? toPano[0].item : null;
  25940. var forTag = common$1.sortByScore(room.taggings, [], [function (tagging) {
  25941. var pos1 = toPano ? new THREE.Vector2(toPano.position.x, toPano.position.z) : new THREE.Vector2(door.center.x, door.center.y);
  25942. var pos2 = new THREE.Vector2(tagging.center.x, -tagging.center.y);
  25943. return -pos1.distanceTo(pos2);
  25944. }])[0].item; //如果当前房间有多个tagging,寻找离toPano最近的tagging, 或离该门最近的tagging,作为该门的标签
  25945. var labelPos = new THREE.Vector3(door.center.x, bottom + 0.3, -door.center.y);
  25946. var anotherRoom = door.atRooms.find(function (r) {
  25947. return r != room && r.name;
  25948. }); //先排除没有tagging的,因为可能是冗余room
  25949. if (!anotherRoom) anotherRoom = door.atRooms.find(function (r) {
  25950. return r != room;
  25951. }); //如果没找到,说明对面的房间就是没有tagging
  25952. var minDis1 = 1.5,
  25953. minDis2 = 4,
  25954. maxDis = 15,
  25955. minAngle = Math.PI / 6; //"前方"的判定角度
  25956. var visiPanos1 = anotherRoom ? anotherRoom.panos : _this2.player.model.panos.list.filter(function (e) {
  25957. return !e._atRoom;
  25958. });
  25959. var visiPanos = visiPanos1.filter(function (pano) {
  25960. var distance = pano.position.clone().setY(0).distanceTo(labelPos.clone().setY(0));
  25961. if (distance < minDis1 || distance > maxDis) return; //必要条件
  25962. if (distance > minDis2) return !_this2.isShelter(floorJson, labelPos, pano.position, door.parent); //充分条件
  25963. //门没有打洞的话就会被挡住 没有pano了
  25964. //如果在此pano前方有别的pano,也可见
  25965. var frontPano = visiPanos1.find(function (anotherPano) {
  25966. return Panorama.filters.isInFanAngle(labelPos, pano.position.clone().sub(labelPos).setY(0), minAngle)(anotherPano.position);
  25967. });
  25968. if (frontPano) return !_this2.isShelter(floorJson, labelPos, pano.position, door.parent); //convertTool.ifIntersectChunks(labelPos, pano.position);
  25969. });
  25970. if (visiPanos.length) {
  25971. var doorLabel = new DoorLabel(_this2.player, {
  25972. doorDir,
  25973. text: forTag.title,
  25974. pos: labelPos,
  25975. visiblePanos: visiPanos,
  25976. sameRoomPanos: visiPanos1,
  25977. toPano,
  25978. aim: new THREE.Vector3(forTag.center.x, 0, -forTag.center.y),
  25979. floorIndex
  25980. });
  25981. doorLabel.door = door;
  25982. doorLabel.forRoom = room;
  25983. doorLabel.forTag = forTag;
  25984. door.doorLabels.push(doorLabel);
  25985. _this2.player.defaultRoomLabels.push(doorLabel);
  25986. } else {
  25987. console.log("\u56E0\u65E0visiblePanos\u53D6\u6D88\u521B\u5EFAdoorlabel\u7684\u95E8\uFF1A ".concat(anotherRoom ? anotherRoom.name : '(未闭合区域) ', "\u901A\u5F80 ").concat(forTag.title, " "));
  25988. }
  25989. });
  25990. }); //doors = doors.filter(door => door.atRooms.length > 1)
  25991. log += "\n\u95E8\u5171\u6709".concat(doors.length, "\u6247\uFF1A \n"); //其中仍包括一些无效门,连通的是冗余房间
  25992. doors.forEach(function (door, index) {
  25993. log += "\u95E8".concat(door.vectorId, "\u5728 ");
  25994. door.atRooms.forEach(function (room) {
  25995. log += "\u623F\u95F4".concat(room.roomId, "(").concat(room.name, ")\u3001 ");
  25996. });
  25997. log += "\u7684\u8FB9\u4E0A \n";
  25998. }); //门一定要真的放在当前线上(因为门可以游走,所以很难判断是否真的是当前的线)
  25999. console.log("%c".concat(log), 'color:#13f');
  26000. this.player.doorLabels.forEach(function (label) {
  26001. label.update();
  26002. });
  26003. this.player.updateLabelZIndex(['doorLabels']);
  26004. DoorLabel.updateCameraDir(this.player);
  26005. }
  26006. }, {
  26007. key: "setPlanLabelVisi",
  26008. value: function setPlanLabelVisi(show, floorIndex) {
  26009. var metadata = this.player.$app.store.getValue('metadata') || {};
  26010. if (metadata.floorPlanAngle != void 0) return; //代表是新版,cad图里的文字直接被planLabel取代,因此不用该函数
  26011. if (!this.initedLabel) return;
  26012. if (show == void 0) {
  26013. show = this.player.model.floorplanCadImg.getVisible();
  26014. }
  26015. var planLabels = this.player.planLabels;
  26016. if (floorIndex != void 0) {
  26017. planLabels = planLabels.filter(function (label) {
  26018. return label.floorIndex == floorIndex;
  26019. });
  26020. }
  26021. planLabels.forEach(function (label) {
  26022. label.enable = show;
  26023. label.update();
  26024. }); //dontShow完全和cad是否该显示有关 而labelEnable则还要额外考虑其他
  26025. }
  26026. }, {
  26027. key: "setDoorLabelVisi",
  26028. value: function setDoorLabelVisi(show, floorIndex) {
  26029. var metadata = this.player.$app.store.getValue('metadata') || {};
  26030. if (metadata.floorPlanAngle != void 0) return;
  26031. if (!this.initedLabel) return;
  26032. var doorLabels = this.player.doorLabels;
  26033. if (floorIndex != void 0) {
  26034. doorLabels = doorLabels.filter(function (label) {
  26035. return label.floorIndex == floorIndex;
  26036. });
  26037. }
  26038. doorLabels.forEach(function (label) {
  26039. label.enable = show;
  26040. label.update();
  26041. });
  26042. }
  26043. }, {
  26044. key: "setDollLabelVisi",
  26045. value: function setDollLabelVisi(show, floorIndex) {
  26046. var metadata = this.player.$app.store.getValue('metadata') || {};
  26047. if (metadata.floorPlanAngle != void 0) return;
  26048. if (!this.initedLabel) return;
  26049. var dollLabels = this.player.dollLabels;
  26050. if (floorIndex != void 0) {
  26051. dollLabels = dollLabels.filter(function (label) {
  26052. return label.floorIndex == floorIndex;
  26053. });
  26054. }
  26055. dollLabels.forEach(function (label) {
  26056. label.enable = show;
  26057. label.update();
  26058. });
  26059. }
  26060. }, {
  26061. key: "updateEntryVisi",
  26062. value: function updateEntryVisi(show, floorIndex) {
  26063. var _this3 = this;
  26064. // 更改楼层的entryArrow显示
  26065. // “平面图”和“漫游可行”不显示entryArrow
  26066. var visi = !(this.player.model.floorplanCadImg && this.player.model.floorplanCadImg.isEdit) && !(this.player.linkEditor && this.player.linkEditor.setPanoVisible); // console.log('updateEntryVisi', show)
  26067. var floors = this.player.model.floors;
  26068. if (floorIndex != void 0) {
  26069. floors = floors.filter(function (floor) {
  26070. return floor.floorIndex == floorIndex;
  26071. });
  26072. }
  26073. floors.forEach(function (floor) {
  26074. if (!floor.entryArrow.length) return;
  26075. if (visi) {
  26076. if (show == false) visi = false;
  26077. /*if (show == true)*/
  26078. else {
  26079. //需要额外判断一下
  26080. var mode = _this3.player.modeTran.split('-')[1];
  26081. if (mode == 'floorplan') visi = true; //visi = floor.plane && floor.plane.visible
  26082. 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
  26083. }
  26084. }
  26085. floor.entryArrow.forEach(function (arrow) {
  26086. return visi ? arrow.show() : arrow.hide();
  26087. });
  26088. });
  26089. }
  26090. }, {
  26091. key: "moveEntryArrow",
  26092. value: function moveEntryArrow(index) {
  26093. var floor = this.player.model.floors.index[index];
  26094. if (floor.entryArrow.length && floor.cadImgRatio) {
  26095. var wallDepth = 24; // 墙壁厚度恒定24px (2880*1620图时测得)
  26096. var shiftY = wallDepth * this.player.model.floors.index[index].cadImgRatio; //得到墙壁真实厚度 按理说应该除以2的,但是不除以2却刚好
  26097. floor.entryArrow.forEach(function (arrow) {
  26098. return arrow.moveCloseToWall(shiftY);
  26099. });
  26100. }
  26101. } //广度搜索
  26102. }, {
  26103. key: "searchAtRoom",
  26104. value: function searchAtRoom(floorJson, room, object, pos, callback) {
  26105. var _this4 = this;
  26106. var inside = math$2.isPointInArea(room.points, pos);
  26107. if (inside) {
  26108. if (room.closetChilds) {
  26109. var finded = room.closetChilds.find(function (roomId) {
  26110. return _this4.searchAtRoom(floorJson, floorJson.rooms.find(function (e) {
  26111. return e.roomId == roomId;
  26112. }), object, pos, callback);
  26113. });
  26114. if (!finded) {
  26115. callback(room);
  26116. }
  26117. } else {
  26118. callback(room);
  26119. }
  26120. return true;
  26121. }
  26122. }
  26123. }, {
  26124. key: "order",
  26125. value: function order(p1, p2, points) {
  26126. //wall的p1 p2在ground中是否p1在前一个
  26127. /* var p1 = points.find(point => point.vectorId == p1ID)
  26128. var p2 = points.find(point => point.vectorId == p2ID) */
  26129. var index1 = points.indexOf(p1);
  26130. var index2 = points.indexOf(p2);
  26131. return (index2 - index1 + points.length) % points.length === 1;
  26132. }
  26133. }, {
  26134. key: "isShelter",
  26135. value: function isShelter(floorJson, labelPos, panoPos, atWall, analyseDoor) {
  26136. //performance.mark('isShelter-start')
  26137. if (!floorJson.walls) return;
  26138. var line1 = [new THREE.Vector2(labelPos.x, -labelPos.z), new THREE.Vector2(panoPos.x, -panoPos.z)];
  26139. var isIntersect = Object.values(floorJson.walls).find(function (wall) {
  26140. if (atWall != void 0 && wall.vectorId != void 0 && wall.vectorId === atWall) return;
  26141. var point1 = floorJson.points[wall.start]; //this.searchItemById(wall.start, Object.values(floorJson.points))
  26142. var point2 = floorJson.points[wall.end]; //this.searchItemById(wall.end, Object.values(floorJson.points))
  26143. var line2 = [point1, point2];
  26144. var intersect = math$2.isLineIntersect(line1, line2);
  26145. if (intersect && analyseDoor && floorJson.symbols) {
  26146. //是否穿过门
  26147. var atDoor = Object.values(floorJson.symbols).find(function (object) {
  26148. if (object.geoType.includes('Door') && object.parent == wall.vectorId) {
  26149. //门在这墙上
  26150. var line2 = [object.startPoint, object.endPoint];
  26151. return math$2.isLineIntersect(line1, line2);
  26152. }
  26153. });
  26154. atDoor && (intersect = false);
  26155. }
  26156. return intersect;
  26157. });
  26158. /* performance.mark('isShelter-end')
  26159. let measure = performance.measure('isShelter', "isShelter-start", "isShelter-end");
  26160. console.log('isShelter', measure.duration.toFixed(3))
  26161. */
  26162. return isIntersect;
  26163. }
  26164. /* searchItemById(id, arr) {
  26165. for (let i = 0, len = arr.length; i < len; i++) {
  26166. if (arr[i].vectorId == id) {
  26167. return arr[i]
  26168. }
  26169. }
  26170. } */
  26171. /* sortByScore = function(list, request, rank) {
  26172. var i = common.filterAll(list, request)
  26173. return 0 === i.length
  26174. ? null
  26175. : (i = i
  26176. .map(function(e) {
  26177. return {
  26178. item: e,
  26179. score: rank.reduce(function(t, i) {
  26180. return t + i(e)
  26181. }, 0)
  26182. }
  26183. })
  26184. .sort(function(e, t) {
  26185. return t.score - e.score
  26186. }))
  26187. } */
  26188. }, {
  26189. key: "show",
  26190. value: function show(floorIndex) {
  26191. this.updateEntryVisi(true, floorIndex);
  26192. this.setPlanLabelVisi(true, floorIndex);
  26193. this.setDoorLabelVisi(true, floorIndex);
  26194. this.setDollLabelVisi(true, floorIndex);
  26195. }
  26196. }, {
  26197. key: "hide",
  26198. value: function hide(floorIndex) {
  26199. this.updateEntryVisi(false, floorIndex);
  26200. this.setPlanLabelVisi(false, floorIndex);
  26201. this.setDoorLabelVisi(false, floorIndex);
  26202. this.setDollLabelVisi(false, floorIndex);
  26203. }
  26204. }, {
  26205. key: "reset",
  26206. value: function reset() {
  26207. this.player.defaultRoomLabels.forEach(function (label) {
  26208. return label.remove();
  26209. });
  26210. this.player.model.floors.forEach(function (floor) {
  26211. floor.entryArrow.forEach(function (arrow) {
  26212. return arrow.dispose();
  26213. });
  26214. });
  26215. }
  26216. }, {
  26217. key: "gotoFloor",
  26218. value: function gotoFloor(index) {
  26219. this.hide();
  26220. this.show(index);
  26221. }
  26222. }]);
  26223. return LabelManager;
  26224. }();
  26225. function getPointForRevRotate(vec2, angle, modelCenter) {
  26226. // let modelCenter = new THREE.Vector3(0, 0, 0)
  26227. var point = new THREE.Vector2(vec2.x, vec2.y);
  26228. if (Math.abs(angle) < 0.01 || Math.abs(angle - 2 * Math.PI) < 0.01) {
  26229. return point;
  26230. } else {
  26231. var x = (point.x - modelCenter.x) * Math.cos(angle) - (point.y - modelCenter.z) * Math.sin(angle) + modelCenter.x;
  26232. var y = (point.y - modelCenter.z) * Math.cos(angle) + (point.x - modelCenter.x) * Math.sin(angle) + modelCenter.z;
  26233. point.x = x;
  26234. point.y = y;
  26235. return point;
  26236. }
  26237. }
  26238. var ModelSide = {
  26239. side: null //空为自动,有值锁定side
  26240. };
  26241. ModelSide.setSide = function (side) {
  26242. if (side === THREE.FrontSide || side === THREE.BackSide || side === THREE.DoubleSide) {
  26243. this.side = side;
  26244. } else {
  26245. this.side = null;
  26246. }
  26247. };
  26248. var ModelSideManager = function ModelSideManager(player) {
  26249. var _this = this;
  26250. _classCallCheck(this, ModelSideManager);
  26251. this.tempAuto = function () {
  26252. _this.recoverSide = ModelSide.side;
  26253. ModelSide.setSide(null);
  26254. _this.updateSide();
  26255. };
  26256. this.recover = function () {
  26257. ModelSide.setSide(_this.recoverSide);
  26258. _this.recoverSide = null;
  26259. _this.updateSide();
  26260. };
  26261. this.updateSide = function () {
  26262. if (_this.player.mode === Viewmode$1.FLOORPLAN) {
  26263. _this.player.model.setMode('floorplan');
  26264. } else if (_this.player.mode === Viewmode$1.DOLLHOUSE) {
  26265. _this.player.model.setMode('dollhouse');
  26266. }
  26267. };
  26268. this.player = player;
  26269. this.recoveSide = null;
  26270. };
  26271. var initDir = new THREE.Vector3(0, 0, -1); //指南针模型的北方向
  26272. /**
  26273. * 指南针
  26274. * 相关css在 ./label/static/label.css
  26275. */
  26276. var Compass = /*#__PURE__*/function () {
  26277. function Compass(player) {
  26278. _classCallCheck(this, Compass);
  26279. this.angle = 0;
  26280. this.quar = new THREE.Quaternion();
  26281. this.player = player;
  26282. this.config = player.$app.config;
  26283. this.init();
  26284. this.show = false;
  26285. this.force = false;
  26286. this.switch('direction');
  26287. }
  26288. _createClass(Compass, [{
  26289. key: "switch",
  26290. value: function _switch(type) {
  26291. this.type = type;
  26292. if (type == 'direction') {
  26293. this.dirTextNDiv.style.display = 'block';
  26294. this.dirTextXDiv.style.display = 'none';
  26295. this.dirTextYDiv.style.display = 'none';
  26296. this.dirTextZDiv.style.display = 'none';
  26297. this.lines.visible = false;
  26298. this.cones.visible = true;
  26299. }
  26300. if (type == 'axis') {
  26301. this.dirTextNDiv.style.display = 'none';
  26302. this.dirTextXDiv.style.display = 'block';
  26303. this.dirTextYDiv.style.display = 'block';
  26304. this.dirTextZDiv.style.display = 'block';
  26305. this.lines.visible = true;
  26306. this.cones.visible = false;
  26307. }
  26308. this.autoJudgeDisplay();
  26309. }
  26310. }, {
  26311. key: "init",
  26312. value: function init() {
  26313. var _this = this;
  26314. var width = 50,
  26315. height = 50;
  26316. this.dom = document.createElement('div');
  26317. this.dom.id = 'compass';
  26318. 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 ";
  26319. this.player.domElement.append(this.dom);
  26320. this.dirTextNDiv = this.dom.querySelector('.north');
  26321. this.dirTextXDiv = this.dom.querySelector('#dirTextX');
  26322. this.dirTextYDiv = this.dom.querySelector('#dirTextY');
  26323. this.dirTextZDiv = this.dom.querySelector('#dirTextZ');
  26324. this.centerDiv = this.dom.querySelector('.center');
  26325. if (this.config.view) {
  26326. this.dom.style.right = this.config.mobile ? '1%' : '28px';
  26327. this.dom.style.top = this.config.mobile ? '10%' : '100px';
  26328. } else {
  26329. this.dom.style.right = this.config.mobile ? '1%' : '277px';
  26330. this.dom.style.top = this.config.mobile ? '10%' : '60px';
  26331. }
  26332. this.centerDiv.style.width = width + 'px';
  26333. this.centerDiv.style.height = height + 'px';
  26334. if (this.config.mobile) {
  26335. var _this$player$getSize = this.player.getSize(),
  26336. clientWidth = _this$player$getSize.clientWidth,
  26337. clientHeight = _this$player$getSize.clientHeight;
  26338. var minWidth = Math.min(clientWidth, clientHeight);
  26339. if (minWidth < 450) {
  26340. var initScale = Math.round(minWidth / 450 * 1000) / 1000;
  26341. this.dom.transform = " scale(".concat(initScale, ")");
  26342. }
  26343. }
  26344. try {
  26345. ;
  26346. this.renderer = new THREE.WebGLRenderer({
  26347. antialias: this.config.antialias,
  26348. alpha: true
  26349. }), this.renderer.autoClear = !0, this.renderer.setPixelRatio(window.devicePixelRatio ? window.devicePixelRatio : 1), this.renderer.domElement.setAttribute('name', 'compass');
  26350. this.renderer.setClearAlpha(0.0);
  26351. this.renderer.setSize(width, height, false, window.devicePixelRatio ? window.devicePixelRatio : 1);
  26352. } catch (e) {
  26353. throw new RendererCreationException('Unable to create a WebGL rendering context');
  26354. }
  26355. this.centerDiv.appendChild(this.renderer.domElement);
  26356. this.camera = new THREE.PerspectiveCamera();
  26357. this.camera.fov = 70;
  26358. this.scene = new THREE.Scene(), this.scene.add(this.camera);
  26359. this.createCompass();
  26360. /* this.player.on('scene/LoadHouseFloor', () => {
  26361. this.setNorth()
  26362. })
  26363. this.player.on('changeDir', () => {
  26364. this.setNorth()
  26365. }) //点击旋转户型图按钮 */
  26366. this.player.$app.store.on('flooruser', function (data) {
  26367. //在cad页面 点击保存后,更新cad和指南针的旋转
  26368. //this.angle = (data.compass - THREE.MathUtils.radToDeg(data.angle) + 360) % 360 || 0
  26369. set();
  26370. }); //用户设置的权重高于地理注册
  26371. var set = function set() {
  26372. var floorUserData = _this.player.$app.store.getValue('flooruser');
  26373. if (floorUserData.compass != void 0) {
  26374. // 但从界面上看不出是用户设置为0还是没设置过,除非没设置过时降重置按钮去除
  26375. _this.angle = (floorUserData.compass - THREE.MathUtils.radToDeg(floorUserData.angle) + 360) % 360 || 0;
  26376. } else {
  26377. var metadata = _this.player.$app.store.getValue('metadata'); //await this.$app.resource.metadata()
  26378. if (metadata.orientation != void 0) {
  26379. _this.angle = THREE.MathUtils.radToDeg(metadata.orientation); //地理注册的
  26380. } else {
  26381. _this.angle = 0;
  26382. }
  26383. }
  26384. };
  26385. set();
  26386. /*
  26387. 如果点击了恢复默认按钮, 即恢复成未设置,则floorUserData.compass=null,代表直接读取默认值(metadata.orientation || 0)
  26388. 注:当编辑页旋转cad后,指南针ui不会跟着旋转,所以就不是默认值了。需要再点击恢复默认。
  26389. 相关文件:floorplanService.js initCompass
  26390. xui.js setProps showProps
  26391. Toolbox.Content.vue 搜索 compassRate.value 每次回到cad界面后指南针朝向
  26392. */
  26393. }
  26394. /* setNorth() {
  26395. //设置北方向,这决定了自身的朝向。
  26396. const floors = this.player.$app.store.getValue('flooruser').floors
  26397. if (!floors || !floors.length) {
  26398. return
  26399. }
  26400. const floor = floors[0]
  26401. const metadata = this.player.$app.store.getValue('metadata') || {}
  26402. this.angle = ((floor && floor.dire) || 0) + THREE.MathUtils.radToDeg(parseFloat(metadata.floorPlanAngle || 0)) //基础朝向
  26403. this.cones.rotation.y = Math.PI / 2 - THREE.MathUtils.degToRad(this.angle)
  26404. console.log('dir:' + floor.dire + ', floorPlanAngle:' + metadata.floorPlanAngle)
  26405. this.update()
  26406. this.player.model.floorLogos.setDir(this.angle)
  26407. } */
  26408. }, {
  26409. key: "createCompass",
  26410. value: function createCompass() {
  26411. //ConeBufferGeometry(radius : Float, height : Float, radialSegments : Integer, heightSegments : Integer, openEnded : Boolean, thetaStart : Float, thetaLength : Float)
  26412. var height = 2;
  26413. var geometry1 = new THREE.ConeBufferGeometry(0.7, height, 4, true);
  26414. var geometry2 = new THREE.ConeBufferGeometry(0.7, height, 4, true);
  26415. var material = new THREE.MeshBasicMaterial({
  26416. vertexColors: true
  26417. }); //指南针由两个四棱锥拼成,为了渐变颜色,采用指定vertexColor的方式。
  26418. var setColor = function setColor(geometry, color1, color2) {
  26419. var colors = [];
  26420. for (var i = 0, n = geometry.attributes.position.count; i < n; ++i) {
  26421. colors.push(1, 1, 1);
  26422. }
  26423. var set = function set(index, color) {
  26424. //设置第index个点的颜色
  26425. colors[index * 3 + 0] = color[0];
  26426. colors[index * 3 + 1] = color[1];
  26427. colors[index * 3 + 2] = color[2];
  26428. };
  26429. var mid = [(color1[0] + color2[0]) / 2, (color1[1] + color2[1]) / 2, (color1[2] + color2[2]) / 2];
  26430. set(1, color1);
  26431. set(5, color1);
  26432. set(6, color1);
  26433. set(2, mid);
  26434. set(3, mid);
  26435. set(7, mid);
  26436. set(4, color2);
  26437. set(8, color2);
  26438. set(9, color2);
  26439. geometry.setAttribute('color', new THREE.BufferAttribute(new Float32Array(colors), 3));
  26440. };
  26441. var blue1 = [1 / 255, 238 / 255, 245 / 255]; //逐渐变深
  26442. var blue2 = [20 / 255, 146 / 255, 170 / 255];
  26443. var blue3 = [40 / 255, 60 / 255, 103 / 255];
  26444. setColor(geometry1, blue1, blue2);
  26445. setColor(geometry2, blue2, blue3);
  26446. /* 朝箭头方向看点构成如下 虽然geometry.attributes.position.count = 19 只有1-9设置的颜色是有效的 另外为什么7决定了上下两边的颜色呢…… 5、9可将其分成上下两个颜色
  26447. 6
  26448. /|\
  26449. / | \
  26450. 7 /_2|1_\ 5
  26451. \ 3|4 / 9
  26452. \ | /
  26453. \|/
  26454. 8
  26455. */
  26456. var cone = new THREE.Mesh(geometry1, material);
  26457. cone.position.setY(height / 2);
  26458. geometry1.computeVertexNormals(); //computeFaceNormals
  26459. geometry2.computeVertexNormals();
  26460. var cones = new THREE.Object3D();
  26461. cones.add(cone);
  26462. var cone2 = new THREE.Mesh(geometry2, material);
  26463. cone2.rotation.x = Math.PI;
  26464. cone2.position.setY(-height / 2);
  26465. cones.add(cone2);
  26466. cones.rotation.z = Math.PI / 2;
  26467. cones.rotation.y = Math.PI / 2; //转向initDir的方向
  26468. cones.scale.set(0.7, 0.7, 0.7);
  26469. this.scene.add(cones);
  26470. this.cones = cones;
  26471. var lines = new THREE.Object3D();
  26472. var lineX = new THREE.Line(new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 0, 10)]), new THREE.LineBasicMaterial({
  26473. color: 0x0000ff
  26474. }));
  26475. lines.add(lineX);
  26476. var lineY = new THREE.Line(new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 10, 0)]), new THREE.LineBasicMaterial({
  26477. color: 0x00ff00
  26478. }));
  26479. lines.add(lineY);
  26480. var lineZ = new THREE.Line(new THREE.BufferGeometry().setFromPoints([new THREE.Vector3(0, 0, 0), new THREE.Vector3(10, 0, 0)]), new THREE.LineBasicMaterial({
  26481. color: 0xff0000
  26482. }));
  26483. lines.add(lineZ);
  26484. this.lines = lines;
  26485. this.scene.add(lines);
  26486. }
  26487. }, {
  26488. key: "update",
  26489. value: function update(quaternion) {
  26490. if (!this.show) return;
  26491. if (!quaternion) quaternion = this.player.camera.quaternion.clone();
  26492. this.cones.rotation.y = Math.PI / 2 - this.angle / 180 * Math.PI; // 指南针基础方向
  26493. this.updateCamera(quaternion);
  26494. this.updateLabel(quaternion);
  26495. this.render();
  26496. }
  26497. }, {
  26498. key: "updateLabel",
  26499. value: function updateLabel(quaternion) {
  26500. //更新北标签
  26501. var dir = this.player.getDirection();
  26502. var oriDir = initDir.clone(); //指南针最初始时的北方向
  26503. var extraQua;
  26504. if (this.player.mode == 'transitioning') {
  26505. //当transitioning时,相机的quaternion不是用control的lookAt算出来,而是直接由一个quaternion过渡到另一个,这样相机将会是歪的,投影面也就不会是原先的水平面。
  26506. var tempCamera = new THREE.Camera(); //借用camera的lookAt算出如果正视同样的target, quaternion会是什么值。 将它乘以当前相机quaternion,得到的就是相机歪的旋转值。
  26507. tempCamera.position.copy(this.camera.position);
  26508. tempCamera.lookAt(tempCamera.position.clone().add(dir));
  26509. var q = tempCamera.quaternion.invert();
  26510. extraQua = q.premultiply(quaternion); //歪掉的额外旋转值
  26511. } //北标签的方向为指南针轮盘方向,也就是要将camera的方向投影到水平面上。 但是如果相机歪了,看到的世界都会歪一定角度,投影面也要歪一定角度。
  26512. var up = new THREE.Vector3(0, 1, 0); //投影水平面的法线,也是相机的摆正的up方向
  26513. extraQua && up.applyQuaternion(extraQua);
  26514. dir.projectOnPlane(up); //将方向投影到水平面上; 如果相机不是正视(extraQua不为0001),就要将水平面也转动
  26515. oriDir.projectOnPlane(up); //为什么initDir投影了和没有投影angle结果一样
  26516. var angle = dir.angleTo(oriDir);
  26517. if (dir.cross(oriDir).y > 0) angle = -angle;
  26518. var deg = this.angle - 90 + THREE.MathUtils.radToDeg(angle); //因为css写的样式初始是指向右方,和initDir差了90°,所以减去。
  26519. if (this.type == 'axis') {
  26520. this.dirTextXDiv.style.transform = 'rotate(' + (deg + 90 - this.angle) + 'deg)';
  26521. this.dirTextXDiv.querySelector('span').style.transform = 'rotate(' + -(deg + 90 - this.angle) + 'deg)';
  26522. this.dirTextYDiv.style.transform = 'rotate(' + -90 + 'deg)';
  26523. this.dirTextYDiv.querySelector('span').style.transform = 'rotate(' + 90 + 'deg)';
  26524. this.dirTextZDiv.style.transform = 'rotate(' + (deg + 90 + 90 - this.angle) + 'deg)';
  26525. this.dirTextZDiv.querySelector('span').style.transform = 'rotate(' + -(deg + 90 + 90 - this.angle) + 'deg)';
  26526. } else {
  26527. this.dirTextNDiv.style.transform = 'rotate(' + deg + 'deg)';
  26528. this.dirTextNDiv.querySelector('span').style.transform = 'rotate(' + -deg + 'deg)';
  26529. }
  26530. }
  26531. }, {
  26532. key: "updateCamera",
  26533. value: function updateCamera(quaternion) {
  26534. //更新canvas中的指南针表现,也就是更新相机,和场景中的相机朝向一致。
  26535. var radius = 5; //相机距离
  26536. this.camera.quaternion.copy(quaternion);
  26537. var dir = this.player.getDirection(); //相机朝向
  26538. this.camera.position.copy(dir.multiplyScalar(radius).negate()); //相机绕着指南针中心(000)转动
  26539. }
  26540. }, {
  26541. key: "render",
  26542. value: function render() {
  26543. this.renderer.render(this.scene, this.camera);
  26544. }
  26545. }, {
  26546. key: "setDisplay",
  26547. value: function setDisplay(state, force) {
  26548. if (this.force && force == void 0) {
  26549. return;
  26550. }
  26551. if (force != void 0) {
  26552. this.force = force;
  26553. }
  26554. this.show = !!state;
  26555. if (this.show) {
  26556. this.update(); // this.dom.fadeIn(100)
  26557. this.dom.style.display = 'block';
  26558. } else {
  26559. // this.dom.fadeOut(100)
  26560. this.dom.style.display = 'none';
  26561. }
  26562. }
  26563. }, {
  26564. key: "autoJudgeDisplay",
  26565. value: function autoJudgeDisplay() {
  26566. // if(this.player.modeTran.split("-")[1] != "panorama" && store.getters.page != 'cad' && store.getters.page != 'data') {
  26567. if (this.player.modeTran.split('-')[1] != 'panorama' || this.type == 'axis') {
  26568. this.setDisplay(true);
  26569. } else {
  26570. this.setDisplay(false);
  26571. }
  26572. }
  26573. }, {
  26574. key: "setDomLeft",
  26575. value: function setDomLeft() {
  26576. this.dom.css({
  26577. right: 'none',
  26578. left: this.config.mobile ? '1%' : '2%'
  26579. });
  26580. }
  26581. }]);
  26582. return Compass;
  26583. }();
  26584. 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); }; }
  26585. 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; } }
  26586. var player$l, sceneRenderer$4, app;
  26587. var planeGeo1, planeGeo2, balloonMap, balloonMap2, defaultCircleMap, defaultExitMap, camera, scene, mesh, isEdit;
  26588. var viewLinkEdit = {};
  26589. var fishEyeRadius = 10; //使用鱼眼尽量提高清晰度。即渲染出相机在接近球边缘的地方看向球心的画面,球上是全景图。
  26590. /*
  26591. 将全景图渲染成某个漫游视角的贴图 renderTarget的作用是直接将渲染结果作为贴图
  26592. */
  26593. var render = function render(renderTarget, unDealTex, enterQuaternion) {
  26594. mesh.material.uniforms.tDiffuse.value = unDealTex;
  26595. var rot90 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI / 2);
  26596. camera.quaternion.copy(new THREE.Quaternion().multiplyQuaternions(rot90, enterQuaternion)); //改 为球目全景照片而改
  26597. var target = new THREE.Vector3(0, 0, -fishEyeRadius * 0.8).applyQuaternion(camera.quaternion);
  26598. camera.position.copy(target.clone().negate());
  26599. var V = sceneRenderer$4.renderer.autoClear;
  26600. sceneRenderer$4.renderer.autoClear = !1; // sceneRenderer.renderer.render(scene, camera, renderTarget, !1)
  26601. sceneRenderer$4.renderer.setRenderTarget(renderTarget); // sceneRenderer.renderer.clear()
  26602. sceneRenderer$4.renderer.render(scene, camera);
  26603. sceneRenderer$4.renderer.setRenderTarget(null);
  26604. sceneRenderer$4.renderer.autoClear = V;
  26605. };
  26606. var dealURL = function dealURL(url) {
  26607. console.log(url);
  26608. if (url &&
  26609. /* url.slice(0, 5) != 'blob:' && url.slice(0, 4) != 'http') || */
  26610. !url.includes('/')) {
  26611. var src = app.resource.getUserResourceURL(url);
  26612. return src;
  26613. } else return url;
  26614. };
  26615. var ViewLinkManager = /*#__PURE__*/function (_THREE$EventDispatche) {
  26616. _inherits(ViewLinkManager, _THREE$EventDispatche);
  26617. var _super = _createSuper$1i(ViewLinkManager);
  26618. function ViewLinkManager(app_, player_) {
  26619. var _this;
  26620. _classCallCheck(this, ViewLinkManager);
  26621. _this = _super.call(this);
  26622. app = app_;
  26623. isEdit = !app.config.view;
  26624. player$l = player_;
  26625. sceneRenderer$4 = app.core.get('SceneRenderer');
  26626. _this.loaded = false;
  26627. _this.enabled = true;
  26628. _this.views = {};
  26629. _this.ViewLinkCircles = new THREE.Object3D();
  26630. _this.ViewLinkCircles.name = 'ViewLinkCircles';
  26631. _this.ViewLinkBalloons = new THREE.Object3D();
  26632. _this.ViewLinkBalloons.name = 'ViewLinkBalloons';
  26633. _this.ViewLinkExits = new THREE.Object3D();
  26634. _this.ViewLinkExits.name = 'ViewLinkExits';
  26635. _this.ViewTitles = new THREE.Object3D();
  26636. _this.ViewTitles.name = 'ViewTitles';
  26637. var group = new THREE.Object3D();
  26638. group.name = 'linkViewRoot';
  26639. group.add(_this.ViewLinkCircles);
  26640. group.add(_this.ViewLinkBalloons);
  26641. group.add(_this.ViewLinkExits);
  26642. group.add(_this.ViewTitles);
  26643. _this.group = group;
  26644. _this.addEventListener('getViewLinkEdit', function (e) {
  26645. viewLinkEdit = e.v;
  26646. });
  26647. app.Scene.on('loadeddata', function () {
  26648. //if(app.config.isRouteSnap)return
  26649. var data = app.store.getValue('links');
  26650. if (!data) {
  26651. _this.init();
  26652. return;
  26653. }
  26654. if (!player$l.model.builded) {
  26655. //floor需要
  26656. return player$l.model.addEventListener('builded', _this.init.bind(_assertThisInitialized(_this), data));
  26657. }
  26658. _this.init(data);
  26659. });
  26660. return _this;
  26661. }
  26662. _createClass(ViewLinkManager, [{
  26663. key: "init",
  26664. value: function init(data) {
  26665. var _this2 = this;
  26666. ViewLink.init();
  26667. this.createViews(data);
  26668. player$l.model.add(this.group);
  26669. this.inited = true; //if(isEdit)viewLinkEdit.init();
  26670. if (player$l.currentPano && player$l.currentPano.hasVideo) {
  26671. //初始画面是有视频点的地方,延迟出现。因为circle容易闪烁,可能是被视频遮盖。
  26672. /* this.ViewLinkCircles.visible = false
  26673. this.ViewLinkBalloons.visible = false
  26674. this.ViewLinkExits.visible = false
  26675. setTimeout(() => {
  26676. if (this.enabled) {
  26677. this.ViewLinkCircles.visible = true
  26678. this.ViewLinkBalloons.visible = true
  26679. this.ViewLinkExits.visible = true
  26680. }
  26681. }, 1000) */
  26682. common$1.updateVisible(this.group, 'delay', false);
  26683. setTimeout(function () {
  26684. common$1.updateVisible(_this2.group, 'delay', true);
  26685. });
  26686. }
  26687. var intersectMesh,
  26688. viewMeshes = [];
  26689. player$l.on('collectIntersectMesh', function (meshes, e) {
  26690. //推送要intersect的mesh
  26691. if (!_this2.inited || !_this2.group.visible
  26692. /* || (isEdit && store.getters.page == 'videos') */
  26693. ) return;
  26694. var detectChunk = true;
  26695. if (player$l.isOutsideMode()) {
  26696. if (viewLinkEdit.markView) {
  26697. viewMeshes = [viewLinkEdit.markView.balloon.mesh];
  26698. } else {
  26699. viewMeshes = _this2.ViewLinkBalloons.children;
  26700. }
  26701. } else if (player$l.is360View(player$l.mode, player$l.currentPano)) {
  26702. if (viewLinkEdit.settingEntry) viewMeshes = []; //设置进入画面
  26703. else if (viewLinkEdit.settingVisibles) {
  26704. viewMeshes = _this2.ViewLinkCircles.children;
  26705. } else {
  26706. viewMeshes = _this2.ViewLinkExits.children.concat(_this2.ViewLinkCircles.children);
  26707. }
  26708. detectChunk = false;
  26709. } else {
  26710. if (viewLinkEdit.markView) {
  26711. //可以拖拽
  26712. viewMeshes = [viewLinkEdit.markView.circle.mesh];
  26713. detectChunk = false;
  26714. } else {
  26715. viewMeshes = _this2.ViewLinkCircles.children;
  26716. }
  26717. }
  26718. if (detectChunk) {
  26719. meshes.push.apply(meshes, _toConsumableArray(viewMeshes));
  26720. } else {
  26721. //非detectChunk状态下intersect到的话,直接dealwithIntersect, 将不会执行下面judgeIntersect的
  26722. var intersect = convertTool.getMouseIntersect(player$l.camera, viewMeshes, player$l.mouse);
  26723. if (intersect && viewMeshes.includes(intersect.object)) {
  26724. intersectMesh = intersect;
  26725. _this2.dealwithIntersect(intersect);
  26726. e.consume();
  26727. }
  26728. }
  26729. });
  26730. player$l.on('judgeIntersect', function (intersect, e) {
  26731. //判断是否intersect了overlay
  26732. if (e.getConsumed()) return;
  26733. if (intersect && viewMeshes.includes(intersect.object)) {
  26734. intersectMesh = intersect;
  26735. e.consume();
  26736. } else {
  26737. intersectMesh = null;
  26738. }
  26739. _this2.dealwithIntersect(intersectMesh);
  26740. });
  26741. player$l.on('click', function (e) {
  26742. //判断是否intersect了overlay
  26743. if (e.getConsumed()) return;
  26744. if (_this2.dealWithClick()) {
  26745. e.consume();
  26746. }
  26747. });
  26748. player$l.on('update', function (e) {
  26749. if (e.hasChanged.cameraChanged) {
  26750. _this2.update();
  26751. }
  26752. });
  26753. player$l.on('mode.changing', function (fromMode, toMode, pano, dur) {
  26754. //转换前
  26755. if (fromMode == 'panorama') {
  26756. setTimeout(function () {
  26757. for (var i in _this2.views) {
  26758. _this2.views[i].balloon.showOrHide(true, dur / 2, 'auto');
  26759. _this2.views[i].circle.setVisible(false);
  26760. }
  26761. viewLinkEdit.markView && viewLinkEdit.markView.circle.setVisible(true);
  26762. }, dur || 500);
  26763. } else if (fromMode == 'floorplan') {
  26764. for (var i in _this2.views) {
  26765. _this2.views[i].balloon.mesh.material.depthTest = true; //防止其他楼层遮挡
  26766. }
  26767. }
  26768. if (toMode == 'floorplan') {
  26769. setTimeout(function () {
  26770. for (var _i in _this2.views) {
  26771. _this2.views[_i].balloon.mesh.material.depthTest = false; //防止其他楼层遮挡
  26772. }
  26773. }, dur);
  26774. }
  26775. if (toMode == 'panorama') {
  26776. for (var _i2 in _this2.views) {
  26777. _this2.views[_i2].balloon.showOrHide(false);
  26778. _this2.views[_i2].circle.setVisible(true);
  26779. }
  26780. viewLinkEdit.cancelPos && viewLinkEdit.cancelPos();
  26781. }
  26782. }); //let floorsVisi = {}
  26783. player$l.model.on('floor.changed', function (currentFloor, toMode, oldFloor) {
  26784. if (player$l.mode == 'panorama' && toMode != 'panorama') return; //使用mode.changing
  26785. var isAll = player$l.model.allFloorsVisible;
  26786. player$l.model.floors.forEach(function (floor) {
  26787. if (floor == currentFloor || isAll) {
  26788. //floorsVisi[floor.floorIndex] = true
  26789. if (toMode == 'floorplan' || toMode == 'dollhouse') {
  26790. floor.views.forEach(function (view) {
  26791. view.balloon.showOrHide(true, 500);
  26792. });
  26793. }
  26794. } else {
  26795. floor.views.forEach(function (view) {
  26796. viewLinkEdit.markView != view && view.balloon.showOrHide(false, 500);
  26797. });
  26798. }
  26799. });
  26800. });
  26801. if (player$l.$app.config.view) {
  26802. //展示页面。 不要遮住漫游点视频
  26803. player$l.on(PlayerEvents.FlyingEnded, function (_ref) {
  26804. var currentPano = _ref.currentPano;
  26805. var panoVideoFilter;
  26806. if (player$l.mode == 'panorama') {
  26807. panoVideoFilter = currentPano.getVideoFilter();
  26808. }
  26809. _this2.ViewLinkCircles.children.forEach(function (e) {
  26810. if (currentPano == _this2.views[e.name.split('circle_')[1]].nearestPano) {
  26811. return common$1.updateVisible(e, 'coveredPanoVideo', true); //如果是其最近点就不隐藏。否则点击列表跳转过来后又找不到图标
  26812. }
  26813. if (panoVideoFilter && panoVideoFilter(e.position)) {
  26814. common$1.updateVisible(e, 'coveredPanoVideo', false);
  26815. } else {
  26816. common$1.updateVisible(e, 'coveredPanoVideo', true);
  26817. }
  26818. });
  26819. });
  26820. }
  26821. if (!app.store.getValue('metadata').controls.showLinkTitle) {
  26822. this.changeTitlesShow(false);
  26823. }
  26824. }
  26825. }, {
  26826. key: "createViews",
  26827. value: function createViews(data) {
  26828. if (!data) return; // 无
  26829. var views = common$1.CloneJson(data.tags || data);
  26830. views.forEach(function (item) {
  26831. if (this.views[item.sid]) {
  26832. console.log('有重复的view sid' + item.sid);
  26833. return;
  26834. }
  26835. if (item.panoId !== undefined) {
  26836. var linkPano = player$l.model.panos.index[item.panoId];
  26837. if (!linkPano) return;
  26838. var balloonPos = linkPano.marker.position.clone();
  26839. balloonPos.y += 1;
  26840. var circlePos = linkPano.position.clone();
  26841. var circleQua = linkPano.quaternion.clone();
  26842. !item.balloon && (item.balloon = {
  26843. pos: balloonPos.toArray()
  26844. });
  26845. !item.circle && (item.circle = {
  26846. pos: circlePos.toArray(),
  26847. qua: circleQua.toArray(),
  26848. scale: 100
  26849. });
  26850. !item.enterQuaternion && (item.enterQuaternion = [0, 0, 0, 1]);
  26851. !item.exitDirection && (item.exitDirection = [0, 0, 2.4]);
  26852. if (item.nearestPano === undefined) {
  26853. if (linkPano.neighbourUUIDs && linkPano.neighbourUUIDs.length >= 1) {
  26854. item.nearestPano = linkPano.neighbourUUIDs[0];
  26855. } else {
  26856. item.nearestPano = '0';
  26857. }
  26858. }
  26859. }
  26860. var view = new ViewLink(item);
  26861. if (item.panoId !== undefined) view.bindPanoId = item.panoId + '';
  26862. this.addView(view);
  26863. }.bind(this));
  26864. if (player$l.getToMode() != 'panorama') {
  26865. for (var i in this.views) {
  26866. this.views[i].balloon.showOrHide(true, 0);
  26867. }
  26868. }
  26869. this.dispatchEvent({
  26870. type: 'loaded'
  26871. });
  26872. this.loaded = true;
  26873. }
  26874. /*
  26875. 判断鼠标移动到哪个view mesh上
  26876. */
  26877. /* getIntersectView() {
  26878. var viewMeshes
  26879. if (!this.inited || !this.enabled || (isEdit && store.getters.page == 'videos')) return
  26880. var detectChunk = true,
  26881. meshes
  26882. if (player.isOutsideMode()) {
  26883. viewMeshes = this.ViewLinkBalloons.children
  26884. } else if (player.is360View(player.mode, player.currentPano)) {
  26885. if (viewLinkEdit.settingEntry) viewMeshes = []
  26886. else if (viewLinkEdit.settingVisibles) {
  26887. viewMeshes = this.ViewLinkCircles.children
  26888. } else {
  26889. viewMeshes = this.ViewLinkExits.children.concat(this.ViewLinkCircles.children)
  26890. }
  26891. detectChunk = false
  26892. } else {
  26893. if (viewLinkEdit.markView) {
  26894. //可以拖拽
  26895. viewMeshes = [viewLinkEdit.markView.circle.mesh]
  26896. detectChunk = false
  26897. } else {
  26898. viewMeshes = this.ViewLinkCircles.children
  26899. }
  26900. }
  26901. if (detectChunk) {
  26902. meshes = this.model.floors.reduce(function (e, t) {
  26903. return t.hidden ? e : e.concat(t.collider.children)
  26904. }, viewMeshes)
  26905. } else meshes = viewMeshes
  26906. var origin = new THREE.Vector3(player.mouse.x, player.mouse.y, -1).unproject(player.camera)
  26907. player.raycaster.set(origin, player.getMouseDirection(player.mouse))
  26908. var results = player.raycaster.intersectObjects(meshes)
  26909. if (results && results.length && viewMeshes.includes(results[0].object)) {
  26910. return results[0]
  26911. }
  26912. } */
  26913. /*
  26914. 根据上面那个函数得到的mesh来判断是哪个view被pick到了,并且记下来,且触发setSelect、 更改鼠标cursor
  26915. */
  26916. }, {
  26917. key: "dealwithIntersect",
  26918. value: function dealwithIntersect(intersect) {
  26919. if (!this.group.visible) return;
  26920. var mesh = intersect && intersect.object;
  26921. if (this.hoverCircle && this.hoverCircle.mesh != mesh && (!viewLinkEdit.markView || viewLinkEdit.markView.circle != this.hoverCircle)) {
  26922. this.dispatchEvent({
  26923. type: 'changeIntersect',
  26924. hovered: null
  26925. });
  26926. this.hoverCircle.setSelect(false);
  26927. }
  26928. if (this.hoverBalloon && this.hoverBalloon.mesh != mesh && (!viewLinkEdit.markView || viewLinkEdit.markView.balloon != this.hoverBalloon)) {
  26929. this.dispatchEvent({
  26930. type: 'changeIntersect',
  26931. hovered: null
  26932. });
  26933. this.hoverBalloon.setSelect(false);
  26934. }
  26935. if (this.hoverExit && this.hoverExit.mesh != mesh
  26936. /* && (!viewLinkEdit.markView || viewLinkEdit.markView.exitDoor != this.hoverExit) */
  26937. ) {
  26938. //bus.emit('link/tag/active', null)
  26939. this.hoverExit.setSelect(false);
  26940. }
  26941. this.clickEnable = false;
  26942. this.hoverBalloon = null;
  26943. this.hoverCircle = null;
  26944. this.hoverExit = null;
  26945. if (!intersect) {
  26946. //$('#player').css('cursor', '')
  26947. CursorDeal.remove('hoverView');
  26948. CursorDeal.remove('dragView');
  26949. return true;
  26950. }
  26951. var view;
  26952. if (mesh.name.includes('balloon')) {
  26953. view = this.views[mesh.name.split('balloon_')[1]];
  26954. view.balloon.setSelect(true);
  26955. this.hoverBalloon = view.balloon;
  26956. this.dispatchEvent({
  26957. type: 'changeIntersect',
  26958. hovered: view.sid
  26959. });
  26960. } else if (mesh.name.includes('exit')) {
  26961. view = this.views[mesh.name.split('circle_exitDoor')[1]];
  26962. view.exitDoor.setSelect(true);
  26963. this.hoverExit = view.exitDoor;
  26964. } else {
  26965. view = this.views[mesh.name.split('circle_')[1]];
  26966. if (!view) {
  26967. return console.error('找不到view?', mesh.name);
  26968. }
  26969. this.hoverCircle = view.circle;
  26970. view.circle.setSelect(true);
  26971. this.dispatchEvent({
  26972. type: 'changeIntersect',
  26973. hovered: view.sid
  26974. });
  26975. }
  26976. if (viewLinkEdit.markView == view && (player$l.currentPano != view.pano || viewLinkEdit.settingExit || viewLinkEdit.settingVisibles)) {
  26977. CursorDeal.add('dragView');
  26978. } else {
  26979. CursorDeal.add('hoverView');
  26980. this.clickEnable = true;
  26981. }
  26982. /* if (viewLinkEdit.markView) {
  26983. if (viewLinkEdit.markView == view || viewLinkEdit.settingVisibles) {
  26984. CursorDeal.add('dragView')
  26985. }
  26986. } else {
  26987. CursorDeal.add('hoverView')
  26988. } */
  26989. }
  26990. /*
  26991. and如果点击了鼠标,就触发相应的点击的事件
  26992. */
  26993. }, {
  26994. key: "dealWithClick",
  26995. value: function dealWithClick() {
  26996. if (this.clickEnable) {
  26997. var hovered = this.hoverCircle || this.hoverBalloon || this.hoverExit;
  26998. var view = this.views[hovered.sid];
  26999. if (hovered == this.hoverExit) {
  27000. /* if(viewLinkEdit.settingExit){
  27001. }else */
  27002. view.backToPanorama();
  27003. return true;
  27004. } else {
  27005. if (view.linkType == 'url') {
  27006. /* if (browser.urlHasValue('scene-link')) { //??
  27007. bus.emit('link/tag/click', view.url)
  27008. } else { */
  27009. var url = view.url;
  27010. if (app.config.link && typeof app.config.link === 'object') {
  27011. if (typeof app.config.link.onAction === 'function') {
  27012. url = app.config.link.onAction(url);
  27013. }
  27014. if (url) {
  27015. if (browser$1.urlHasValue('sign')) {
  27016. if (url.indexOf('#') != -1) {
  27017. url = url.split('#')[0];
  27018. }
  27019. url += "&sign=".concat(browser$1.valueFromUrl('sign'));
  27020. }
  27021. if (app.config.link.target == 'blank') {
  27022. window.open(url);
  27023. } else {
  27024. window.location.href = url;
  27025. }
  27026. }
  27027. } else if (url) {
  27028. if (browser$1.urlHasValue('sign')) {
  27029. if (url.indexOf('#') != -1) {
  27030. url = url.split('#')[0];
  27031. }
  27032. url += "&sign=".concat(browser$1.valueFromUrl('sign'));
  27033. }
  27034. window.location.href = url;
  27035. } //}
  27036. } else if (view.linkType == 'pano' && view.pano) {
  27037. view.enter360Pano();
  27038. }
  27039. return true;
  27040. }
  27041. }
  27042. }
  27043. }, {
  27044. key: "addView",
  27045. value: function addView(view) {
  27046. this.views[view.sid] = view;
  27047. this.ViewLinkCircles.add(view.circle.mesh);
  27048. this.ViewLinkBalloons.add(view.balloon.mesh);
  27049. view.exitDoor && this.ViewLinkExits.add(view.exitDoor.mesh);
  27050. this.ViewTitles.add(view.titleLabel);
  27051. }
  27052. }, {
  27053. key: "removeView",
  27054. value: function removeView(view) {
  27055. this.ViewLinkCircles.remove(view.circle.mesh);
  27056. this.ViewLinkBalloons.remove(view.balloon.mesh);
  27057. this.ViewLinkExits.remove(view.exitDoor.mesh);
  27058. delete this.views[view.sid];
  27059. }
  27060. }, {
  27061. key: "update",
  27062. value: function update(camera) {
  27063. for (var r in this.views) {
  27064. this.views[r].update();
  27065. }
  27066. }
  27067. }, {
  27068. key: "showAllViews",
  27069. value: function showAllViews() {
  27070. var cause = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'hideAll';
  27071. //if (this.enabled) return
  27072. //直接更改parent的visible
  27073. /* this.ViewLinkCircles.visible = true
  27074. this.ViewLinkBalloons.visible = true
  27075. this.ViewLinkExits.visible = true
  27076. this.changeTitlesShow(true, 'showAll') */
  27077. common$1.updateVisible(this.group, cause, true); //this.enabled = true
  27078. }
  27079. }, {
  27080. key: "hideAllViews",
  27081. value: function hideAllViews() {
  27082. var cause = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'hideAll';
  27083. var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  27084. //if (!this.enabled) return
  27085. if (player$l.is360View(player$l.mode, player$l.currentPano)) ; else if (player$l.enteringView) {
  27086. /* player.waitFlytoItemFuc = ()=>{
  27087. player.currentPano.view.backToPanorama()
  27088. } */
  27089. player$l.once(PlayerEvents.FlyingEnded, function () {
  27090. player$l.currentPano.view.backToPanorama();
  27091. });
  27092. } //直接更改parent的visible
  27093. /* this.ViewLinkCircles.visible = false
  27094. this.ViewLinkBalloons.visible = false
  27095. this.ViewLinkExits.visible = false
  27096. this.changeTitlesShow(false, 'showAll') */
  27097. common$1.updateVisible(this.group, cause, false, level);
  27098. this.dealwithIntersect(null); //清除所有hover
  27099. //this.enabled = false
  27100. }
  27101. }, {
  27102. key: "changeTitlesShow",
  27103. value: function changeTitlesShow(state) {
  27104. var cause = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'onShow';
  27105. common$1.updateVisible(this.ViewTitles, cause, !!state);
  27106. if (state) {
  27107. this.ViewTitles.children.forEach(function (e) {
  27108. return e.updatePos();
  27109. });
  27110. }
  27111. }
  27112. }, {
  27113. key: "setViewsVisible",
  27114. value: function setViewsVisible(type, visi) {
  27115. //根据类型显示隐藏
  27116. //if (!this.enabled) return
  27117. for (var i in this.views) {
  27118. if (this.views[i].linkType == type) {
  27119. this.views[i].setVisible(visi);
  27120. }
  27121. }
  27122. }
  27123. /*
  27124. 主要是在编辑状态下,focus on某个view,让用户知道自己正在编辑的view在画布中是哪个mesh。
  27125. 如果是漫游模式就飞向其入口、 如果是ouside模式,就让相机移近气球,以气球为target。
  27126. */
  27127. }, {
  27128. key: "focusOn",
  27129. value: function focusOn(view) {
  27130. var _this3 = this;
  27131. if (player$l.flying) {
  27132. return player$l.once(PlayerEvents.FlyingEnded, function () {
  27133. _this3.focusOn(view);
  27134. });
  27135. }
  27136. if (player$l.mode == 'panorama') {
  27137. player$l.flyToPano({
  27138. pano: view.nearestPano,
  27139. lookAtPoint: view.circle.mesh.position,
  27140. checkAlone: true
  27141. });
  27142. } else player$l.focusPoint({
  27143. aim: view.balloon.mesh.position
  27144. });
  27145. }
  27146. }, {
  27147. key: "updateCirclesWhenFade",
  27148. value: function updateCirclesWhenFade(state, o) {
  27149. if (state == 'enter') {
  27150. for (var i in this.views) {
  27151. //更新此view中的其他view的circle的表现
  27152. if (i in o.pano.view.visibleViews) {
  27153. var info = {};
  27154. info.viewDir = new THREE.Vector3().fromArray(o.pano.view.visibleViews[i]);
  27155. this.views[i].circle.updatePos('at360View', info);
  27156. this.views[i].circle.setVisible(true);
  27157. } else {
  27158. this.views[i].circle.setVisible(false);
  27159. }
  27160. }
  27161. } else {
  27162. for (var _i3 in this.views) {
  27163. if (this.views[_i3].circle.at360View) {
  27164. this.views[_i3].circle.updatePos('normal');
  27165. }
  27166. o.flyOut || this.views[_i3].circle.setVisible(true);
  27167. }
  27168. o.flyOut && viewLinkEdit.markView && viewLinkEdit.markView.circle.setVisible(true);
  27169. }
  27170. }
  27171. }, {
  27172. key: "exitView",
  27173. value: function exitView() {
  27174. var deferred = new Deferred$1();
  27175. if (player$l.is360View(player$l.mode, player$l.currentPano)) {
  27176. player$l.currentPano.view.backToPanorama();
  27177. player$l.once(PlayerEvents.FlyingEnded, function () {
  27178. deferred.resolve();
  27179. });
  27180. } else {
  27181. deferred.resolve();
  27182. }
  27183. return deferred.promise();
  27184. }
  27185. }]);
  27186. return ViewLinkManager;
  27187. }(THREE.EventDispatcher); //-----------------------------------------------------------------
  27188. //全景 or 超链接
  27189. var ViewLink = /*#__PURE__*/function (_THREE$EventDispatche2) {
  27190. _inherits(ViewLink, _THREE$EventDispatche2);
  27191. var _super2 = _createSuper$1i(ViewLink);
  27192. function ViewLink(data) {
  27193. var _this4;
  27194. _classCallCheck(this, ViewLink);
  27195. _this4 = _super2.call(this); //console.log(data)
  27196. _this4.sid = data.sid;
  27197. _this4.pano = null; //对应的pano
  27198. _this4.balloon = new ViewLinkBalloon(data, _assertThisInitialized(_this4));
  27199. _this4.circle = new ViewLinkCircle(data, _assertThisInitialized(_this4)); //this.quaternion = data.quaternion ? new THREE.Quaternion().fromArray(data.quaternion) : new THREE.Quaternion; //全景图的旋转
  27200. _this4.linkType = data.type; //'url' or 'pano'
  27201. _this4.enterQuaternion = data.enterQuaternion ? new THREE.Quaternion().fromArray(data.enterQuaternion) : new THREE.Quaternion(); //进入时的朝向
  27202. _this4.exitDirection = data.exitDirection ? new THREE.Vector3().fromArray(data.exitDirection) : new THREE.Vector3(0, 0, settings$3.view360.circleDisToCenter); //出口的位置
  27203. _this4.url = data.url;
  27204. if (isEdit || _this4.linkType == 'pano') _this4.exitDoor = new ViewLinkCircle(Object.assign({}, data, {
  27205. circleType: 'exitDoor',
  27206. exitDirection: _this4.exitDirection
  27207. }), _assertThisInitialized(_this4));
  27208. {
  27209. _this4.titleLabel = new viewTitle(data.title, _assertThisInitialized(_this4));
  27210. _this4.addEventListener('updatePose', function (e) {
  27211. if (e.target.circleType == 'exitDoor') return;
  27212. _this4.titleLabel.updatePos();
  27213. });
  27214. _this4.circle.addEventListener('move', function () {
  27215. _this4.titleLabel.bindTo == 'circle' && _this4.titleLabel.updatePos();
  27216. });
  27217. } //处理图片缓存 version有bug,所以用scene.json里的 且scene.json和getinfo里的version还不太同步,getinfo要发布后才改变
  27218. //data.version = app.store.get('metadata').version
  27219. if (data.thumb) {
  27220. _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}`
  27221. data.thumb = app.resource.getUserImagesURL("panorama/".concat(_this4.imgSid, "/low/").concat(data.thumb));
  27222. _this4.resolution = data.resolution; // '2k' or '4k'
  27223. }
  27224. _this4.nearestPano = data.nearestPano !== undefined && player$l.model.panos.index[data.nearestPano];
  27225. if (_this4.nearestPano) {
  27226. _this4.floor = _this4.nearestPano.floor;
  27227. _this4.floor.addView(_assertThisInitialized(_this4));
  27228. }
  27229. _this4.setPano(data);
  27230. _this4.visibleViews = data.visibleViews || {};
  27231. _this4._data = data;
  27232. return _this4;
  27233. }
  27234. _createClass(ViewLink, [{
  27235. key: "update",
  27236. value: function update(force) {
  27237. //this.mesh.quaternion.copy(camera.quaternion);
  27238. this.balloon.update(force);
  27239. this.circle.update(force);
  27240. this.exitDoor && this.exitDoor.update(force);
  27241. }
  27242. }, {
  27243. key: "dispose",
  27244. value: function dispose() {
  27245. var _this5 = this;
  27246. this.balloon.dispose();
  27247. this.circle.dispose();
  27248. this.exitDoor.dispose();
  27249. this.deleteOldPano();
  27250. this.titleLabel.dispose();
  27251. if (player$l.currentPano == this.pano) this.backToPanorama();else if (this.entering) {
  27252. player$l.once(PlayerEvents.FlyingEnded, function () {
  27253. _this5.backToPanorama();
  27254. }); //player.waitFlytoItemFuc = ()=>{this.backToPanorama()}
  27255. }
  27256. this.floor && this.floor.removeView(this);
  27257. }
  27258. /*
  27259. 删除旧的pano在tile贴图上留下的残留
  27260. (可能还有bug)
  27261. */
  27262. }, {
  27263. key: "deleteOldPano",
  27264. value: function deleteOldPano() {
  27265. var _this6 = this;
  27266. if (!this.pano) return;
  27267. this.pano.floor.removePano(this.pano);
  27268. this.pano.exit();
  27269. delete this.pano.panoRenderer.activeRenderTargetDescriptors[this.sid];
  27270. delete this.pano.panoRenderer.panoDescriptors[this.sid];
  27271. if (this.pano.tiled) {
  27272. delete this.pano.panoRenderer.tileTrees[this.sid];
  27273. delete this.pano.panoRenderer.tileDirectory[this.sid];
  27274. delete this.pano.tileDownloader.downloadDescriptors[this.sid];
  27275. this.pano.tileDownloader.priorityQueue = this.pano.tileDownloader.priorityQueue.filter(function (item) {
  27276. return item.pano != _this6.pano;
  27277. });
  27278. this.pano.tileDownloader.activeDownloads = this.pano.tileDownloader.activeDownloads.filter(function (item) {
  27279. return item.pano != _this6.pano;
  27280. });
  27281. } //cleanupActiveDownloads
  27282. var M = this.pano.panoRenderer.M;
  27283. for (var i = 0; i < M.length; i++) {
  27284. if (M[i].pano == this.pano) {
  27285. M.splice(i, 1);
  27286. break;
  27287. }
  27288. }
  27289. var u = player$l.model.panos.list.indexOf(this.pano);
  27290. player$l.model.panos.list.splice(u, 1);
  27291. }
  27292. /*
  27293. 绑定对应pano, 以及全景图
  27294. */
  27295. }, {
  27296. key: "setPano",
  27297. value: function setPano() {
  27298. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  27299. if (this.linkType == 'pano') {
  27300. if (o.thumb || o.thumbPanoTex) {
  27301. //o.thumb是上传贴图后的src, o.thumbPanoTex是点击取消时恢复的;相同点是都换图了,要重新创建pano
  27302. var rebuild = !!this.pano;
  27303. if (this.pano) {
  27304. this.deleteOldPano();
  27305. }
  27306. var pano = new Panorama(player$l.$app, this.sid, {
  27307. panoType: '360view',
  27308. position: new THREE.Vector3(),
  27309. quaternion: new THREE.Quaternion(),
  27310. //this.enterQuaternion,
  27311. //quaternion: new THREE.Quaternion().setFromEuler(new THREE.Euler(0.04,0.04,0.04)),
  27312. puck: new THREE.Vector3(0, -1.6, 0),
  27313. seeMarkers: [],
  27314. subgroup: this.nearestPano.floor.floorIndex,
  27315. tiled: !o.mapSrc
  27316. });
  27317. pano.mapSrc = o.mapSrc; //编辑时临时的整张贴图src
  27318. pano.attachToPanoRenderer(player$l.$app.core.get('PanoRenderer'));
  27319. pano.qualityManager = player$l.$app.core.get('QualityManager');
  27320. if (pano.tiled) {
  27321. pano.tileDownloader = player$l.$app.core.get('TileDownloader');
  27322. }
  27323. pano.build1();
  27324. pano.view = this;
  27325. player$l.model.panos.add(pano); //加载tiles需要
  27326. this.panoImgVersion = o.version; //防止缓存的后缀
  27327. /* if(rebuild){
  27328. if(player.model.projectedPano0 == this.pano)player.model.projectedPano0 = pano;
  27329. if(player.model.projectedPano1 == this.pano)player.model.projectedPano1 = pano;
  27330. } */
  27331. if (rebuild && player$l.currentPano == this.pano) {
  27332. //重新加载贴图
  27333. var retryCallback = function retryCallback() {
  27334. if (!player$l.checkAndWaitForPanoLoad(pano, 'high', 'low', player$l.basePanoSize, retryCallback)) {
  27335. player$l.model.setProjectedPanos(pano, pano);
  27336. pano.enter();
  27337. }
  27338. };
  27339. player$l.currentPano = pano;
  27340. retryCallback();
  27341. }
  27342. this.pano = pano;
  27343. if (o.thumbPanoTex) {
  27344. this.thumbPanoTex = o.thumbPanoTex;
  27345. } else {
  27346. this.thumbPanoTex = this.renderToGetMap(o.thumb);
  27347. }
  27348. this.circle.setMapIn(this.thumbPanoTex);
  27349. this.balloon.setMapIn(this.thumbPanoTex);
  27350. }
  27351. if (this.thumbPanoTex) {
  27352. //没传图时changeMap仍为0
  27353. this.circle.mesh.material.uniforms.changeMap.value = 1;
  27354. this.balloon.mesh.material.uniforms.changeMap.value = 1;
  27355. }
  27356. } else {
  27357. this.circle.mesh.material.uniforms.changeMap.value = 0;
  27358. this.balloon.mesh.material.uniforms.changeMap.value = 0;
  27359. }
  27360. } //将全景图渲染成某个漫游视角的贴图
  27361. }, {
  27362. key: "renderToGetMap",
  27363. value: function renderToGetMap(src) {
  27364. var _this7 = this;
  27365. var renderTarget = new THREE.WebGLRenderTarget(256, 256, {
  27366. stencilBuffer: !1
  27367. });
  27368. /* if(!isEdit){ //咋写
  27369. src = config.getPublicResource(src)
  27370. src = src.replace("results","pan")
  27371. src = src.replace("scene/","")
  27372. } */
  27373. var maxWidth = browser$1.maybeQilin() ? 512 : 1024;
  27374. var tex = texture.load(src, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  27375. return regenerator.wrap(function _callee$(_context) {
  27376. while (1) {
  27377. switch (_context.prev = _context.next) {
  27378. case 0:
  27379. _context.next = 2;
  27380. return common$1.compressImg(tex.image, maxWidth);
  27381. case 2:
  27382. tex.image = _context.sent;
  27383. isEdit && (_this7.unDealTex = tex);
  27384. render(renderTarget, tex, _this7.enterQuaternion);
  27385. case 5:
  27386. case "end":
  27387. return _context.stop();
  27388. }
  27389. }
  27390. }, _callee);
  27391. })));
  27392. tex.flipY = false;
  27393. tex.minFilter = THREE.LinearFilter;
  27394. this.renderTarget = renderTarget;
  27395. return renderTarget.texture;
  27396. }
  27397. }, {
  27398. key: "mapChangeRot",
  27399. value: function mapChangeRot() {
  27400. //修改初始视角后重新渲染贴图
  27401. render(this.renderTarget, this.unDealTex, this.enterQuaternion);
  27402. }
  27403. /* updateMap(fov){
  27404. camera.fov = fov;
  27405. camera.updateProjectionMatrix()
  27406. var V = sceneRenderer.renderer.autoClear;
  27407. sceneRenderer.renderer.autoClear = !1
  27408. sceneRenderer.renderer.render(scene, camera, this.renderTarget, !1)
  27409. sceneRenderer.renderer.autoClear = V
  27410. //renderTarget.texture.needsUpdate = true;
  27411. } */
  27412. }, {
  27413. key: "enter360Pano",
  27414. value: function enter360Pano(fun) {
  27415. //进入全景
  27416. /* if (player.isOutsideMode()) {
  27417. player.flyToNewMode({ mode: 'panorama', pano: this.pano, callback: fun })
  27418. } else {
  27419. if (player.cameraControls.activeControl) {
  27420. player.cameraControls.activeControl.insideLookLimitUp = 89.9
  27421. player.cameraControls.activeControl.insideLookLimitDown = -89.9
  27422. player.cameraControls.activeControl.limitAngleIsBound = false
  27423. }
  27424. player.flyToPano({ pano: this.pano }, () => {
  27425. if (typeof fun === 'function') {
  27426. fun()
  27427. }
  27428. player.model.floorLogos.changefloorLogoOpa({//隐藏
  27429. dur: 0,
  27430. index: 0,
  27431. opa: 0,
  27432. })
  27433. })
  27434. } */
  27435. player$l.flyToPano({
  27436. pano: this.pano
  27437. }, function () {
  27438. if (typeof fun === 'function') {
  27439. fun();
  27440. }
  27441. });
  27442. }
  27443. }, {
  27444. key: "backToPanorama",
  27445. value: function backToPanorama() {
  27446. /* if (player.cameraControls.activeControl) {
  27447. player.cameraControls.activeControl.insideLookLimitUp = null
  27448. player.cameraControls.activeControl.insideLookLimitDown = null
  27449. player.cameraControls.activeControl.limitAngleIsBound = true
  27450. } */
  27451. //出来到漫游点
  27452. if (this.bindPanoId !== undefined && (player$l.lastPano && this.bindPanoId === player$l.lastPano.id || this.bindPanoId === this.nearestPano.id)) {
  27453. player$l.flyToPano({
  27454. pano: player$l.lastPano || this.nearestPano
  27455. });
  27456. } else {
  27457. player$l.flyToPano({
  27458. pano: player$l.lastPano || this.nearestPano,
  27459. lookAtPoint: this.circle.mesh.position
  27460. });
  27461. }
  27462. }
  27463. }, {
  27464. key: "setVisible",
  27465. value: function setVisible(v) {
  27466. if (!v == this.disabled) return;
  27467. if (v) {
  27468. this.balloon.disabled = false;
  27469. this.balloon.showOrHide(true, 0, 'auto');
  27470. } else {
  27471. this.balloon.showOrHide(false, 0);
  27472. this.balloon.disabled = true;
  27473. if (player$l.currentPano == this.pano || player$l.enteringView == this) {
  27474. //注:enteringView时其实不会退出,所以这句其实需要改为callback后,以后再改
  27475. this.backToPanorama();
  27476. }
  27477. }
  27478. this.disabled = !v;
  27479. this.circle.disabled = !v;
  27480. this.circle.setVisible();
  27481. }
  27482. }, {
  27483. key: "setSelect",
  27484. value: function setSelect(state) {
  27485. if (this.selected == state) return;
  27486. this.selected = !!state;
  27487. this.circle.setSelect(state);
  27488. this.balloon.setSelect(state);
  27489. }
  27490. }]);
  27491. return ViewLink;
  27492. }(THREE.EventDispatcher);
  27493. ViewLink.init = function () {
  27494. if (ViewLink.inited) return;
  27495. planeGeo1 = new THREE.PlaneBufferGeometry(0.4, 0.4);
  27496. planeGeo2 = new THREE.PlaneBufferGeometry(1.5, 1.5);
  27497. balloonMap = texture.load(texture.getImageURL('images/img_pamove.png')
  27498. /* ,null,null,{antialias:true} */
  27499. );
  27500. balloonMap2 = texture.load(texture.getImageURL('images/img_pamove_normal.png')); //分区
  27501. defaultCircleMap = texture.load(texture.getImageURL('images/img_panorama_dot.png'));
  27502. defaultExitMap = texture.load(texture.getImageURL('images/img_exit_dot.png'));
  27503. balloonMap2.minFilter = THREE.LinearMipmapNearestFilter; //1007 //可能缩小锯齿更弱一些
  27504. balloonMap2.needsUpdate = true;
  27505. /* defaultCircleMap.anisotropy = 4
  27506. defaultCircleMap.needsUpdate = true */
  27507. //用于渲染出贴图的一些工具:
  27508. camera = new THREE.PerspectiveCamera();
  27509. camera.fov = 80;
  27510. camera.aspect = 1;
  27511. camera.updateProjectionMatrix();
  27512. scene = new THREE.Scene();
  27513. scene.add(camera);
  27514. mesh = new THREE.Mesh(new THREE.SphereBufferGeometry(fishEyeRadius, 25, 25), new THREE.RawShaderMaterial({
  27515. //new THREE.BoxBufferGeometry(1,1)
  27516. uniforms: THREE.UniformsUtils.clone(sphereRenderToCube.uniforms),
  27517. vertexShader: sphereRenderToCube.vertexShader,
  27518. fragmentShader: sphereRenderToCube.fragmentShader,
  27519. depthWrite: !1,
  27520. depthTest: !1,
  27521. side: THREE.DoubleSide
  27522. }));
  27523. scene.add(mesh);
  27524. ViewLink.inited = true;
  27525. };
  27526. /*
  27527. 整体 360view 本质是全景pano 和 入口出口等mesh集合
  27528. 默认对应的pano的位置都是Vector3(0,0,0)
  27529. exitDoor: 全景图内exit图标
  27530. enterQuaternion: 进入全景图时的初始角度
  27531. exitDirection: 全景图内exit图标的方向。
  27532. linkType: 全景或者超链接
  27533. nearestPano: 最近的pano, 退出全景后到达的pano。 (因为是在编辑时确定的,所以干脆保存下来。)
  27534. visibleViews:在该全景图中可以看到的 别的全景的circle集合, 每个全景包含了它在该全景内的位置信息
  27535. */
  27536. //----------------------------------------
  27537. var ViewLinkBase = /*#__PURE__*/function (_THREE$EventDispatche3) {
  27538. _inherits(ViewLinkBase, _THREE$EventDispatche3);
  27539. var _super3 = _createSuper$1i(ViewLinkBase);
  27540. function ViewLinkBase(data, view) {
  27541. var _this8;
  27542. _classCallCheck(this, ViewLinkBase);
  27543. _this8 = _super3.call(this);
  27544. _this8.view = view;
  27545. _this8.sid = data.sid; //this.state = 'sprite'
  27546. return _this8;
  27547. }
  27548. _createClass(ViewLinkBase, [{
  27549. key: "update",
  27550. value: function update(force) {
  27551. var changed = false;
  27552. if (this.state == 'sprite' && this.mesh.visible && (force || (this.mesh.material.uniforms.opacity ? this.mesh.material.uniforms.opacity.value > 0 : true))) {
  27553. this.mesh.quaternion.copy(player$l.camera.quaternion);
  27554. changed = true;
  27555. }
  27556. if (this.strictScale) {
  27557. //通过限定二维大小,防止看起来过小。
  27558. var s = math$2.getScaleForConstantSize({
  27559. player: player$l,
  27560. maxSize: 100,
  27561. minSize: 40,
  27562. nearBound: 2,
  27563. farBound: 80,
  27564. position: this.mesh.position
  27565. });
  27566. this.mesh.scale.set(s, s, s);
  27567. changed = true;
  27568. }
  27569. changed && this.view.dispatchEvent({
  27570. type: 'updatePose'
  27571. });
  27572. }
  27573. }, {
  27574. key: "setStrictScale",
  27575. value: function setStrictScale(state) {
  27576. //设定是否限定二维大小
  27577. this.strictScale = state;
  27578. if (state) this.update();else this.mesh.scale.set(1, 1, 1);
  27579. this.view.dispatchEvent({
  27580. type: 'updatePose'
  27581. });
  27582. }
  27583. }, {
  27584. key: "setMapIn",
  27585. value: function setMapIn(map) {
  27586. this.mesh.material.uniforms.mapIn.value = map;
  27587. }
  27588. }, {
  27589. key: "dispose",
  27590. value: function dispose() {}
  27591. }]);
  27592. return ViewLinkBase;
  27593. }(THREE.EventDispatcher);
  27594. /*
  27595. 在漫游模式下看到的圆圈部分: 分为入口和出口
  27596. 入口分为两种状态:1 普通状态 2 在别的全景内时
  27597. 出口和在别的全景内的入口都是billboardSprite状态 即其quaternion同相机quaternion,在画面上看就是标准的圆。只是大小会在屏幕边缘更大些。
  27598. */
  27599. var ViewLinkCircle = /*#__PURE__*/function (_ViewLinkBase) {
  27600. _inherits(ViewLinkCircle, _ViewLinkBase);
  27601. var _super4 = _createSuper$1i(ViewLinkCircle);
  27602. //飞入后
  27603. function ViewLinkCircle(data, view) {
  27604. var _this9;
  27605. _classCallCheck(this, ViewLinkCircle);
  27606. _this9 = _super4.call(this, data, view);
  27607. _this9.circleType = data.circleType;
  27608. _this9.position = new THREE.Vector3(); //记录在普通状态下的位置
  27609. _this9.quaternion = new THREE.Quaternion(); //记录在普通状态下的旋转
  27610. _this9.build(data);
  27611. return _this9;
  27612. }
  27613. _createClass(ViewLinkCircle, [{
  27614. key: "build",
  27615. value: function build(data) {
  27616. var uniforms = THREE.UniformsUtils.clone(linkSpotInside.uniforms);
  27617. var mesh = new THREE.Mesh(planeGeo1, new THREE.RawShaderMaterial({
  27618. uniforms: uniforms,
  27619. vertexShader: linkSpotInside.vertexShader,
  27620. fragmentShader: linkSpotInside.fragmentShader,
  27621. transparent: true,
  27622. side: THREE.DoubleSide
  27623. }));
  27624. mesh.renderOrder = RenderOrder.view;
  27625. mesh.name = 'circle_' + (this.circleType ? this.circleType : '') + this.sid;
  27626. this.mesh = mesh;
  27627. this.setMapOut(data);
  27628. if (this.circleType == 'exitDoor') {
  27629. this.mesh.visible = false;
  27630. this.mesh.material.depthTest = false;
  27631. data.exitDirection && this.mesh.position.copy(data.exitDirection);
  27632. this.state = 'sprite';
  27633. } else {
  27634. if (data.circle) {
  27635. data.circle.pos && this.position.fromArray(data.circle.pos);
  27636. data.circle.qua && this.quaternion.fromArray(data.circle.qua);
  27637. var s = data.circle.scale / 100;
  27638. data.circle.scale && this.mesh.scale.set(s, s, s);
  27639. this.state = '3D';
  27640. this.updatePos();
  27641. }
  27642. if (player$l.isOutsideMode()) this.setVisible(false);
  27643. }
  27644. }
  27645. /*
  27646. circle在全景之内需要转换位置
  27647. */
  27648. }, {
  27649. key: "updatePos",
  27650. value: function updatePos(type, o) {
  27651. if (type == 'at360View') {
  27652. //在别的view内显示时
  27653. //var dir = this.position.clone().sub(o.viewPos).normalize()
  27654. new THREE.Vector3();
  27655. var dir = o.viewDir.clone().normalize();
  27656. this.mesh.position.copy(dir.multiplyScalar(settings$3.view360.circleDisToCenter)); //this.mesh.lookAt(center)
  27657. this.at360View = true;
  27658. this.state = 'sprite'; //console.log("changeTosprite :"+this.sid)
  27659. } else {
  27660. if (o) {
  27661. o.position && this.position.copy(o.position);
  27662. o.quaternion && this.quaternion.copy(o.quaternion);
  27663. }
  27664. this.mesh.position.copy(this.position);
  27665. this.mesh.quaternion.copy(this.quaternion);
  27666. this.at360View = false;
  27667. this.state = '3D'; //console.log("changeTo3D :"+this.sid)
  27668. this.judgeDepthTest();
  27669. this.dispatchEvent({
  27670. type: 'move'
  27671. });
  27672. }
  27673. }
  27674. }, {
  27675. key: "state",
  27676. get: function get() {
  27677. return this._state;
  27678. },
  27679. set: function set(v) {
  27680. this._state = v; //console.log('state', v, this.name)
  27681. this.mesh && this.update();
  27682. }
  27683. }, {
  27684. key: "judgeDepthTest",
  27685. value: function judgeDepthTest() {
  27686. this.mesh.material.depthTest = !(this.state == 'sprite' || this.selected);
  27687. }
  27688. }, {
  27689. key: "update",
  27690. value: function update() {
  27691. _get(_getPrototypeOf(ViewLinkCircle.prototype), "update", this).call(this);
  27692. this.judgeDepthTest();
  27693. }
  27694. /*
  27695. 选中后材质渐变
  27696. */
  27697. }, {
  27698. key: "setSelect",
  27699. value: function setSelect(state) {
  27700. if (state == this.selected) return;
  27701. this.selected = state;
  27702. var fadeTime = 500;
  27703. this.judgeDepthTest();
  27704. transitions$1.cancelById('circlePro');
  27705. transitions$1.start(lerp.uniform(this.mesh, 'progress', state ? 1 : 0), fadeTime, function () {}, 0, easing[settings$3.transition.blendEasing], 'circlePro'
  27706. /* , settings.freeze.FlyToPano */
  27707. );
  27708. }
  27709. /*
  27710. 使用用户设置的贴图或者默认
  27711. */
  27712. }, {
  27713. key: "setMapOut",
  27714. value: function setMapOut(data) {
  27715. var map;
  27716. if (this.circleType == 'exitDoor') {
  27717. if (!data) map = defaultExitMap;else if (data instanceof THREE.Texture) map = data;else if (typeof data == 'string') {
  27718. map = texture.load(data);
  27719. } else {
  27720. /* if (data.style && data.style.exit.url) map = texture.load(dealURL(data.style.exit.url))
  27721. else map = defaultExitMap //name:out, exit-style-${name}.jpg */
  27722. if (data.style) {
  27723. var url;
  27724. if (data.style.exit.name && data.style.exit.name != 'custom') {
  27725. url = app.resource.getAppURL("images/link/exit-style-".concat(data.style.exit.name, ".png")); //console.log('circle 使用默认图片', data.style.exit.name, url)
  27726. } else {
  27727. if (data.style.exit.url) url = dealURL(data.style.exit.url);
  27728. }
  27729. map = texture.load(url);
  27730. } else map = defaultExitMap;
  27731. }
  27732. } else {
  27733. if (!data) map = defaultCircleMap;else if (data instanceof THREE.Texture) map = data;else if (typeof data == 'string') {
  27734. map = texture.load(dealURL(data));
  27735. } else {
  27736. if (data.style) {
  27737. var _url;
  27738. if (data.style.enter.name && data.style.enter.name != 'custom') {
  27739. _url = app.resource.getAppURL("images/link/enter-style-".concat(data.style.enter.name, ".png")); //console.log('circle 使用默认图片', data.style.enter.name, url)
  27740. } else {
  27741. if (data.style.enter.url) _url = dealURL(data.style.enter.url);
  27742. }
  27743. map = texture.load(_url);
  27744. } else map = defaultCircleMap;
  27745. }
  27746. }
  27747. this.mesh.material.uniforms.mapOut.value = map;
  27748. }
  27749. }, {
  27750. key: "setVisible",
  27751. value: function setVisible(v) {
  27752. if (v == void 0) {
  27753. //使用历史值
  27754. v = this._visible;
  27755. }
  27756. common$1.updateVisible(this.mesh, 'setVisible', !this.disabled && v); //this.mesh.visible = !this.disabled && v
  27757. this._visible = v;
  27758. }
  27759. }]);
  27760. return ViewLinkCircle;
  27761. }(ViewLinkBase);
  27762. /*
  27763. 在空中的气球部分
  27764. */
  27765. var ViewLinkBalloon = /*#__PURE__*/function (_ViewLinkBase2) {
  27766. _inherits(ViewLinkBalloon, _ViewLinkBase2);
  27767. var _super5 = _createSuper$1i(ViewLinkBalloon);
  27768. //飞出后
  27769. function ViewLinkBalloon(data, view) {
  27770. var _this10;
  27771. _classCallCheck(this, ViewLinkBalloon);
  27772. _this10 = _super5.call(this, data, view);
  27773. _this10.state = 'sprite';
  27774. _this10.build(data);
  27775. return _this10;
  27776. }
  27777. _createClass(ViewLinkBalloon, [{
  27778. key: "build",
  27779. value: function build(data) {
  27780. var uniforms = THREE.UniformsUtils.clone(linkSpot.uniforms);
  27781. uniforms.mapOut.value = balloonMap;
  27782. uniforms.mapOut2.value = balloonMap2;
  27783. uniforms.opacity.value = 0;
  27784. var mesh = new THREE.Mesh(planeGeo2, new THREE.RawShaderMaterial({
  27785. uniforms: uniforms,
  27786. vertexShader: linkSpot.vertexShader,
  27787. fragmentShader: linkSpot.fragmentShader,
  27788. transparent: true,
  27789. side: THREE.DoubleSide,
  27790. depthTest: false //飞出后再变为true
  27791. }));
  27792. mesh.renderOrder = RenderOrder.view;
  27793. mesh.name = 'balloon_' + this.sid;
  27794. this.mesh = mesh;
  27795. if (data.balloon) {
  27796. data.balloon.pos && this.mesh.position.fromArray(data.balloon.pos);
  27797. }
  27798. this.mesh.visible = false; //因为一开始在panorama模式
  27799. }
  27800. /*
  27801. 从外飞到漫游模式时气球会渐渐消失,反之渐渐出现
  27802. */
  27803. }, {
  27804. key: "showOrHide",
  27805. value: function showOrHide(state, fadeTime, type) {
  27806. var _this11 = this;
  27807. //console.log('showOrHide ', state , this.sid, type)
  27808. if (this.disabled) return;
  27809. if (type == 'auto') {
  27810. //自动判断是否可见 飞出后,在别的楼层不可见
  27811. state = player$l.getToMode() != 'panorama' && (player$l.model.allFloorsVisible || !this.view.floor || this.view.floor == player$l.model.currentFloor);
  27812. }
  27813. var fadeTime = fadeTime != void 0 ? fadeTime : 500;
  27814. var opa = state ? 1 : 0;
  27815. transitions$1.cancelById('balloonOpa_' + this.sid);
  27816. if (this.mesh.material.uniforms.opacity.value == opa) return;
  27817. state && (this.mesh.visible = true);
  27818. this.update(true);
  27819. transitions$1.start(lerp.uniform(this.mesh, 'opacity', opa), fadeTime, function (e) {
  27820. _this11.mesh.material.depthTest = player$l.modeTran.split('-')[1] != 'floorplan';
  27821. _this11.mesh.visible = !!state; //消失时防止遮住其他mesh 如circle
  27822. _this11.view.titleLabel.switchBind(state ? 'balloon' : 'circle');
  27823. }, 0, easing[settings$3.transition.blendEasing], null, 'balloonOpa_' + this.sid);
  27824. }
  27825. /*
  27826. hover and click
  27827. */
  27828. }, {
  27829. key: "setSelect",
  27830. value: function setSelect(state) {
  27831. //this.mesh.material.uniforms.isActive.value = state ? 1 : 0
  27832. if (state == this.selected) return;
  27833. this.selected = state;
  27834. var fadeTime = 300;
  27835. transitions$1.cancelById('balloonPro');
  27836. transitions$1.start(lerp.uniform(this.mesh, 'activeProgress', state ? 1 : 0), fadeTime, function () {}, 0, easing[settings$3.transition.blendEasing], 'balloonPro'
  27837. /* , settings.freeze.FlyToPano */
  27838. );
  27839. }
  27840. }]);
  27841. return ViewLinkBalloon;
  27842. }(ViewLinkBase);
  27843. var viewTitle = /*#__PURE__*/function (_TextSprite) {
  27844. _inherits(viewTitle, _TextSprite);
  27845. var _super6 = _createSuper$1i(viewTitle);
  27846. function viewTitle(text, view) {
  27847. var _this12;
  27848. _classCallCheck(this, viewTitle);
  27849. _this12 = _super6.call(this, {
  27850. text,
  27851. backgroundColor: {
  27852. r: 255,
  27853. g: 255,
  27854. b: 255,
  27855. a: 0
  27856. },
  27857. textColor: {
  27858. r: 255,
  27859. g: 255,
  27860. b: 255,
  27861. a: 1
  27862. },
  27863. textshadowColor: '#888',
  27864. borderRadius: 2,
  27865. fontsize: 34,
  27866. renderOrder: 5,
  27867. margin: {
  27868. x: 12,
  27869. y: 10
  27870. },
  27871. player: player$l,
  27872. fixOrient: true,
  27873. sizeInfo: {
  27874. scale: 0.4,
  27875. nearBound: 3
  27876. }
  27877. });
  27878. _this12.sprite.material.depthTest = _this12.sprite.material.depthWrite = true;
  27879. _this12.sprite.material.side = THREE.DoubleSide;
  27880. _this12.view = view;
  27881. _this12.visible = false;
  27882. setTimeout(function () {
  27883. _this12.visible = true;
  27884. _this12.switchBind(view.balloon.mesh.visible ? 'balloon' : 'circle');
  27885. }, 1);
  27886. /* const s = 0.3
  27887. this.scale.set(s, s, s) */
  27888. return _this12;
  27889. }
  27890. _createClass(viewTitle, [{
  27891. key: "switchBind",
  27892. value: function switchBind(bindTo) {
  27893. //console.error('bindTo', bindTo)
  27894. this.bindTo = bindTo;
  27895. if (bindTo == 'circle') {
  27896. this.fixOrient = true;
  27897. this.quaternion.copy(this.view.circle.mesh.quaternion);
  27898. } else {
  27899. this.fixOrient = false;
  27900. this.view.balloon;
  27901. }
  27902. this.updatePos();
  27903. }
  27904. }, {
  27905. key: "updatePos",
  27906. value: function updatePos() {
  27907. if (!this.realVisible()) return;
  27908. var mesh,
  27909. margin,
  27910. localPos = new THREE.Vector3(0, -1, 0);
  27911. if (this.bindTo == 'circle') {
  27912. mesh = this.view.circle.mesh;
  27913. margin = 0.08;
  27914. this.quaternion.copy(this.view.circle.mesh.quaternion);
  27915. } else {
  27916. mesh = this.view.balloon.mesh;
  27917. mesh.scale.x * 0.8, margin = 0.2;
  27918. }
  27919. mesh.updateMatrix();
  27920. localPos.multiplyScalar(margin + Math.abs(mesh.geometry.attributes.position.array[0]));
  27921. localPos.applyMatrix4(mesh.matrix); //this.scale.set(s, s, s)
  27922. this.position.copy(localPos);
  27923. this.updatePose(); //scale
  27924. //console.log('updatepos')
  27925. }
  27926. }]);
  27927. return viewTitle;
  27928. }(TextSprite);
  27929. 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); }; }
  27930. 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; } }
  27931. /**
  27932. * 马赛克效果
  27933. * 注:原本的马赛克效果产品经理不太满意,因此现在的马赛克其实是高斯模糊
  27934. */
  27935. var filterName = browser$1.maybeQilin() && browser$1.detectFirefox() ? 'NearestFilter' : 'LinearFilter'; //麒麟firefox用LinearFilter报错黑屏。 但用NearestFilter会不够平滑。xzw2024.12.12
  27936. //警告信息: Minification or magnification filtering is not NEAREST or NEAREST_MIPMAP_NEAREST, and the texture's format is not "texture-filterable"
  27937. var Paint$1 = /*#__PURE__*/function (_Emiter) {
  27938. _inherits(Paint, _Emiter);
  27939. var _super = _createSuper$1h(Paint);
  27940. function Paint(app, player) {
  27941. var _this;
  27942. _classCallCheck(this, Paint);
  27943. _this = _super.call(this);
  27944. _this.app = app;
  27945. _this.player = player; // app.core.get('Player')
  27946. _this.sceneRenderer = app.core.get('SceneRenderer');
  27947. _this.sceneNum = app.config.num;
  27948. _this.painting = false; // 进入/结束涂抹
  27949. _this.pause = false; // 是否暂停涂抹
  27950. _this.mousePosition = new THREE.Vector4();
  27951. _this.currentPaintUrl = null; // 当前马赛克图片路径
  27952. var metadata = app.store.getValue('metadata');
  27953. if (!metadata) {
  27954. app.store.on('metadata', function (data) {
  27955. _this.paintData = data.mosaicList; // 涂抹贴图的大小
  27956. _this.width = 1024 * (data.sceneFrom == 'pro' ? 2 : 4); // window.innerWidth;
  27957. _this.height = 1024 * (data.sceneFrom == 'pro' ? 1 : 2); // window.innerHeight
  27958. });
  27959. } else {
  27960. _this.paintData = metadata.mosaicList;
  27961. _this.width = 1024 * (metadata.sceneFrom == 'pro' ? 2 : 4);
  27962. _this.height = 1024 * (metadata.sceneFrom == 'pro' ? 1 : 2);
  27963. }
  27964. return _this;
  27965. }
  27966. _createClass(Paint, [{
  27967. key: "init",
  27968. value: function init() {
  27969. var _this2 = this;
  27970. // 准备离屏渲染的render和shader
  27971. var resolution = new THREE.Vector3(this.width, this.height, window.devicePixelRatio);
  27972. this.bufferRenderer = new BufferRenderer(this.sceneRenderer.renderer, {
  27973. width: this.width,
  27974. height: this.height
  27975. });
  27976. this.bufferShader = new BufferShader({
  27977. iResolution: {
  27978. value: resolution
  27979. },
  27980. iMouse: {
  27981. value: this.mousePosition
  27982. },
  27983. iChannel0: {
  27984. value: null
  27985. },
  27986. // 马赛克
  27987. iChannel1: {
  27988. value: null
  27989. },
  27990. // 全景图
  27991. iBrushType: {
  27992. value: 1
  27993. },
  27994. iBrushSize: {
  27995. value: 5
  27996. },
  27997. iAngle: {
  27998. value: 0
  27999. },
  28000. iPitch: {
  28001. value: 0
  28002. },
  28003. iIsBrush: {
  28004. value: 0
  28005. }
  28006. }); // 同时更新skybox和chunk的相关uniforms,因为还要在model.js里渲染笔刷
  28007. Object.assign(this.player.model.skybox.material.uniforms, this.bufferShader.uniforms);
  28008. this.player.model.chunks.forEach(function (chunk) {
  28009. return Object.assign(chunk.materialInside.uniforms, _this2.bufferShader.uniforms);
  28010. });
  28011. } // 开始涂抹
  28012. }, {
  28013. key: "start",
  28014. value: function start(isPause) {
  28015. var _this3 = this;
  28016. this.player.reticule.visible = false;
  28017. this.player.cameraControls.activeControl.enabled = false;
  28018. this.mousePosition.setZ(0); // z用于标识是否mousedown
  28019. // 计算相机角度--------------------------------
  28020. var lookAt = this.player.camera.getWorldDirection(new THREE.Vector3()); // 上下转角
  28021. var projectVec = lookAt.clone().projectOnPlane(new THREE.Vector3(0, 1, 0));
  28022. var pitch = lookAt.angleTo(projectVec) * Math.sign(-lookAt.y); // 左右转角
  28023. var lookAtXZ = lookAt.clone().setY(0);
  28024. var skyRota = new THREE.Euler().setFromQuaternion(this.player.currentPano.quaternion); //this.player.currentPano.skyboxMesh.rotation
  28025. var skyDir = new THREE.Vector3(1, 0, 0).applyEuler(skyRota).setY(0);
  28026. var skyDirCross = new THREE.Vector3(0, 0, 1).applyEuler(skyRota).setY(0);
  28027. var angle = lookAtXZ.angleTo(skyDir) * Math.sign(lookAtXZ.dot(skyDirCross));
  28028. this.bufferShader.uniforms['iAngle'].value = angle;
  28029. this.bufferShader.uniforms['iPitch'].value = pitch; // -------------------------------------------
  28030. if (isPause) {
  28031. // 恢复暂停
  28032. this.showBrush(true);
  28033. this.pause = false;
  28034. } else {
  28035. // 将已有马赛克数据放入到离屏渲染
  28036. var startPaint = function startPaint(texture) {
  28037. // 不重置readBuffer的话,保存一次后将不再能涂抹
  28038. _this3.bufferRenderer.readBuffer = new THREE.WebGLRenderTarget(_this3.width, _this3.height, _this3.bufferRenderer.bufferOptions);
  28039. texture && (_this3.bufferRenderer.readBuffer.texture = texture);
  28040. _this3.bufferRenderer.writeBuffer = new THREE.WebGLRenderTarget(_this3.width, _this3.height, _this3.bufferRenderer.bufferOptions); // 将全景图马赛克设置为离屏渲染texture,使涂抹实时更新
  28041. _this3.setPaintTexture('paint0Map', _this3.bufferRenderer.readBuffer.texture);
  28042. _this3.setPaintTexture('paint1Map', _this3.bufferRenderer.readBuffer.texture);
  28043. _this3.painting = true;
  28044. if (_this3.pause) _this3.cancel(true);
  28045. };
  28046. if (this.currentPaintUrl) {
  28047. // 这里必须load一个新texture,否则会形成readbuffer和texture的反馈环
  28048. new THREE.TextureLoader().load(this.currentPaintUrl, function (texture) {
  28049. texture.minFilter = THREE[filterName];
  28050. texture.magFilter = THREE[filterName];
  28051. texture.type = THREE.FloatType; // 和readbuffer一致
  28052. texture.needsUpdate = true;
  28053. startPaint(texture);
  28054. });
  28055. } else {
  28056. startPaint();
  28057. }
  28058. this.player.locked = true;
  28059. this.hasEdit = false; // 标明start后有没有涂抹过
  28060. this.defineHasPaint(true); // 设置hasPaint为true,否则涂抹相关shader将被ifelse判断跳过
  28061. // 加载一张全景图作为涂抹的底图(高斯模糊必须用pan/high/,马赛克用pan/low/就可以)
  28062. texture.load(this.app.resource.getViewImagesURL("pan/high/".concat(this.player.currentPano.id, ".jpg")), function (panoTexture) {
  28063. _this3.bufferShader.uniforms['iChannel1'].value = panoTexture; // 给离屏shader设置底图
  28064. _this3.showBrush(true); // 显示笔刷
  28065. _this3.emit('start');
  28066. });
  28067. }
  28068. } // 停止涂抹
  28069. }, {
  28070. key: "cancel",
  28071. value: function cancel(isPause) {
  28072. this.player.reticule.visible = true;
  28073. this.player.cameraControls.activeControl.enabled = true;
  28074. this.showBrush(false); // 隐藏笔刷
  28075. if (isPause) {
  28076. // 暂停,只停下来转视角
  28077. this.pause = true;
  28078. } else {
  28079. this.painting = false;
  28080. this.hasEdit = false;
  28081. this.player.locked = false;
  28082. this.setPaintImage(this.currentPaintUrl, this.currentPaintUrl); // 更新马赛克图片到全景图,替换离屏渲染texture
  28083. this.bufferRenderer.readBuffer.dispose();
  28084. this.bufferRenderer.writeBuffer.dispose();
  28085. }
  28086. } // 保存涂抹数据
  28087. }, {
  28088. key: "save",
  28089. value: function save() {
  28090. var self = this;
  28091. var panoId = this.player.currentPano.id;
  28092. return {
  28093. panoId: panoId,
  28094. data: this.bufferRenderer.save(),
  28095. // base64
  28096. func: function func() {
  28097. // 把base64当做链接存起来,就不用等后端返回png路径了
  28098. self.currentPaintUrl = self.bufferRenderer.base64; // 更新panoPaint
  28099. if (!self.paintData) self.paintData = [];
  28100. var panoPaint = self.paintData.find(function (data) {
  28101. return data.panoId == panoId;
  28102. });
  28103. if (panoPaint) {
  28104. panoPaint.data = self.bufferRenderer.base64;
  28105. } else {
  28106. self.paintData.push({
  28107. panoId: panoId,
  28108. data: self.bufferRenderer.base64
  28109. });
  28110. }
  28111. }
  28112. };
  28113. }
  28114. }, {
  28115. key: "update",
  28116. value: function update() {
  28117. // 涂抹实时更新
  28118. if (this.painting && !this.pause) {
  28119. this.bufferShader.uniforms['iChannel0'].value = this.bufferRenderer.readBuffer.texture; // 每次渲染出马赛克都更新到bufferShader保存下来
  28120. this.bufferRenderer.render(this.bufferShader.scene, this.bufferShader.camera); // 渲染bufferShader场景,得到新马赛克
  28121. }
  28122. }
  28123. /**
  28124. * 笔刷
  28125. */
  28126. // 笔刷显隐
  28127. }, {
  28128. key: "showBrush",
  28129. value: function showBrush(show) {
  28130. this.sceneRenderer.renderer.domElement.style.cursor = show ? 'none' : 'default'; // 如果显示笔刷的话,就要隐藏鼠标
  28131. this.player.model.skybox && (this.player.model.skybox.material.uniforms['iShowBrush'].value = show ? 1 : 0);
  28132. this.player.model.chunks.forEach(function (chunk) {
  28133. return chunk.materialInside.uniforms['iShowBrush'].value = show ? 1 : 0;
  28134. });
  28135. } // 笔刷切换
  28136. }, {
  28137. key: "changeBrush",
  28138. value: function changeBrush(type) {
  28139. if (parseInt(type) == -1) {
  28140. this.cancel(true); // 暂停涂抹
  28141. } else {
  28142. this.pause && this.start(true); // 从暂停恢复
  28143. this.bufferShader.uniforms['iBrushType'].value = parseInt(type);
  28144. }
  28145. } // 调整笔刷大小
  28146. }, {
  28147. key: "setBrushSize",
  28148. value: function setBrushSize(size) {
  28149. this.bufferShader.uniforms['iBrushSize'].value = parseFloat(size);
  28150. }
  28151. /**
  28152. * 涂抹贴图更新
  28153. */
  28154. // 外部调用,用于pano跳转
  28155. }, {
  28156. key: "updatePanoPaint",
  28157. value: function updatePanoPaint(pano0Id, pano1Id) {
  28158. if (!this.paintData) return;
  28159. var pano0Paint = this.paintData.find(function (data) {
  28160. return data.panoId == pano0Id;
  28161. });
  28162. var path0 = pano0Paint && (pano0Paint.data || this.app.resource.getUserResourceURL(pano0Paint.fileName));
  28163. var pano1Paint = this.paintData.find(function (data) {
  28164. return data.panoId == pano1Id;
  28165. });
  28166. var path1 = pano1Paint && (pano1Paint.data || this.app.resource.getUserResourceURL(pano1Paint.fileName));
  28167. this.currentPaintUrl = pano1Id != null ? path1 : path0;
  28168. this.setPaintImage(path0, path1);
  28169. } // 用于非涂抹时更新贴图
  28170. }, {
  28171. key: "setPaintImage",
  28172. value: function setPaintImage(path0, path1) {
  28173. var _this4 = this;
  28174. this.defineHasPaint(!!path1 || !!path0); // 考虑到过渡效果,pano1和pano0都要判断
  28175. path0 ? texture.loadWithoutUpdate(path0, function (t) {
  28176. return _this4.setPaintTexture('paint0Map', t);
  28177. }, function () {} // 给个空函数catch error
  28178. ) : this.setPaintTexture('paint0Map', null);
  28179. path1 ? texture.loadWithoutUpdate(path1, function (t) {
  28180. return _this4.setPaintTexture('paint1Map', t);
  28181. }, function () {}) : this.setPaintTexture('paint1Map', null);
  28182. } // 设置涂抹贴图 mapName: 'paint0Map' | 'paint1Map'
  28183. }, {
  28184. key: "setPaintTexture",
  28185. value: function setPaintTexture(mapName, texture) {
  28186. if (texture) {
  28187. texture.minFilter = THREE[filterName];
  28188. texture.magFilter = THREE[filterName];
  28189. }
  28190. this.app.core.get('QuickstartManager').skybox.material.uniforms[mapName].value = texture;
  28191. this.player.model.skybox && (this.player.model.skybox.material.uniforms[mapName].value = texture);
  28192. this.player.model.chunks.forEach(function (chunk) {
  28193. return chunk.materialInside.uniforms[mapName].value = texture;
  28194. });
  28195. this.player.model.highMapCube && this.player.model.highMapCube.tiles.forEach(function (tile) {
  28196. tile.material.uniforms[mapName].value = texture;
  28197. });
  28198. } // 设置HasPaint,为true时才运行马赛克相关shader,减少显存占用
  28199. }, {
  28200. key: "defineHasPaint",
  28201. value: function defineHasPaint(isDefine) {
  28202. var materials = [];
  28203. materials.push(this.app.core.get('QuickstartManager').skybox.material);
  28204. this.player.model.skybox && materials.push(this.player.model.skybox.material);
  28205. this.player.model.chunks.forEach(function (chunk) {
  28206. return materials.push(chunk.materialInside);
  28207. });
  28208. this.player.model.highMapCube && materials.push.apply(materials, _toConsumableArray(this.player.model.highMapCube.tiles.map(function (e) {
  28209. return e.material;
  28210. })));
  28211. if (isDefine) {
  28212. materials.forEach(function (mat) {
  28213. return mat.defines['HasPaint'] = true, mat.needsUpdate = true;
  28214. });
  28215. } else {
  28216. materials.forEach(function (mat) {
  28217. return delete mat.defines['HasPaint'], mat.needsUpdate = true;
  28218. });
  28219. }
  28220. }
  28221. /**
  28222. * 涂抹鼠标事件处理
  28223. */
  28224. }, {
  28225. key: "dealPointerDown",
  28226. value: function dealPointerDown() {
  28227. if (this.player.locked) {
  28228. this.hasEdit = true;
  28229. this.mousePosition.setZ(1);
  28230. } else {
  28231. // 保证start完再mousedown,防止底图还未加载好
  28232. this.once('start', this.dealPointerDown.bind(this));
  28233. }
  28234. }
  28235. }, {
  28236. key: "dealPointerMove",
  28237. value: function dealPointerMove(mouse) {
  28238. // 适应zoom和校准
  28239. var width = this.sceneRenderer.renderer.domElement.clientWidth,
  28240. height = this.sceneRenderer.renderer.domElement.clientHeight;
  28241. mouse.x = (mouse.x - width / 2) / (this.player.zoomLevel + (this.player.zoomLevel - 1) * 0.2) + width / 2;
  28242. mouse.y = (mouse.y - height / 2) / (this.player.zoomLevel + (this.player.zoomLevel - 1) * 0.2) + height / 2;
  28243. this.mousePosition.setX(mouse.x / width * this.width);
  28244. this.mousePosition.setY((1 - mouse.y / height) * this.height);
  28245. }
  28246. }, {
  28247. key: "dealPointerUp",
  28248. value: function dealPointerUp() {
  28249. this.mousePosition.setZ(0);
  28250. }
  28251. }]);
  28252. return Paint;
  28253. }(tinyEmitter); // 离屏渲染场景
  28254. var BufferShader = function BufferShader() {
  28255. var uniforms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  28256. _classCallCheck(this, BufferShader);
  28257. this.uniforms = uniforms; // 涂抹材质
  28258. this.material = new THREE.RawShaderMaterial({
  28259. fragmentShader: shaders['model'].fragmentBufferShader,
  28260. vertexShader: shaders['model'].vertexShader,
  28261. uniforms: uniforms,
  28262. side: THREE.DoubleSide
  28263. });
  28264. this.scene = new THREE.Scene();
  28265. this.scene.add(new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), this.material)); // 涂抹Plane
  28266. this.camera = new THREE.PerspectiveCamera(90, 1, 0.01, 1000); // Camera
  28267. this.camera.position.set(0, 0, 1);
  28268. }; // 离屏渲染renderer
  28269. var BufferRenderer = /*#__PURE__*/function () {
  28270. function BufferRenderer(renderer, size) {
  28271. _classCallCheck(this, BufferRenderer);
  28272. this.renderer = renderer;
  28273. this.width = size.width;
  28274. this.height = size.height;
  28275. this.bufferOptions = {
  28276. minFilter: THREE[filterName],
  28277. magFilter: THREE[filterName],
  28278. format: THREE.RGBAFormat,
  28279. type: THREE.FloatType,
  28280. stencilBuffer: false
  28281. }; // 在start()的时候初始化
  28282. this.readBuffer = null; // 一般用于从该buffer读取先前的渲染结果:this.readBuffer.texture
  28283. this.writeBuffer = null; // 一般用于将渲染结果写入该buffer:render()
  28284. }
  28285. _createClass(BufferRenderer, [{
  28286. key: "render",
  28287. value: function render(scene, camera) {
  28288. var toScreen = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  28289. if (toScreen) {
  28290. this.renderer.render(scene, camera);
  28291. } else {
  28292. // 离屏渲染
  28293. var V = this.renderer.autoClear;
  28294. this.renderer.autoClear = !1; // 暂时关闭autoClear
  28295. this.renderer.setRenderTarget(this.writeBuffer);
  28296. this.renderer.render(scene, camera); // 将BufferShader场景的渲染结果存储到writeBuffer里
  28297. this.renderer.setRenderTarget(null);
  28298. this.renderer.autoClear = V;
  28299. } // 每次render都要交换readBuffer/writeBuffer的值
  28300. var _ref = [this.writeBuffer, this.readBuffer];
  28301. this.readBuffer = _ref[0];
  28302. this.writeBuffer = _ref[1];
  28303. } // 将涂抹数据保存为base64,之后发给后端转成png格式并存入数据库
  28304. }, {
  28305. key: "save",
  28306. value: function save() {
  28307. var bufferArray = new Float32Array(this.width * this.height * 4); // 宽像素 * 高像素 * rgba四个值
  28308. // 把readBuffer里的涂抹贴图按像素存入bufferArray
  28309. this.renderer.readRenderTargetPixels(this.readBuffer, 0, 0, this.width, this.height, bufferArray);
  28310. this.outputCanvas = document.createElement('canvas');
  28311. this.outputCanvas.width = this.width;
  28312. this.outputCanvas.height = this.height;
  28313. var ctx = this.outputCanvas.getContext('2d');
  28314. var rowBytes = this.width * 4;
  28315. for (var row = 0; row < this.height; row++) {
  28316. var srow = this.height - 1 - row;
  28317. var imageData = ctx.createImageData(this.width, 1);
  28318. var start = srow * this.width * 4;
  28319. for (var i = 0; i < rowBytes; i++) {
  28320. imageData.data[i] = bufferArray[start + i] * 255;
  28321. } // 把bufferArray画到outputCanvas上
  28322. ctx.putImageData(imageData, 0, row);
  28323. } // outputCanvas转存为base64
  28324. this.base64 = this.outputCanvas.toDataURL('image/png'); // let img = document.createElement("img")
  28325. // img.src = this.base64
  28326. // document.querySelector("body").appendChild(img)
  28327. // console.error(this.base64)
  28328. return this.base64;
  28329. }
  28330. }]);
  28331. return BufferRenderer;
  28332. }();
  28333. 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); }; }
  28334. 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; } }
  28335. /**
  28336. * 空间模型
  28337. */
  28338. var GLTFDecoration = /*#__PURE__*/function (_THREE$Group) {
  28339. _inherits(GLTFDecoration, _THREE$Group);
  28340. var _super = _createSuper$1g(GLTFDecoration);
  28341. function GLTFDecoration(manager, info) {
  28342. var _this;
  28343. _classCallCheck(this, GLTFDecoration);
  28344. _this = _super.call(this);
  28345. _this.manager = manager;
  28346. _this.version = 0;
  28347. _this.axisAngle = {
  28348. x: 0,
  28349. y: 0,
  28350. z: 0
  28351. };
  28352. if (!info) {
  28353. // 新增
  28354. _this.sid = common$1.getRandomSid();
  28355. _this.panoId = _this.manager.player.currentPano.id;
  28356. _this.isNew = true;
  28357. _this.position.setY(1000);
  28358. var BoxMaterial = new THREE.MeshBasicMaterial({
  28359. color: Colors.mainColor,
  28360. opacity: 0.4,
  28361. transparent: !0,
  28362. polygonOffset: true,
  28363. //是否开启多边形偏移
  28364. polygonOffsetFactor: -0.9,
  28365. //多边形偏移因子
  28366. polygonOffsetUnits: -4.0 //多边形偏移单位
  28367. });
  28368. var BoxGeometry = new THREE.BoxGeometry(0.5, 0.5, 0.5);
  28369. BoxGeometry.translate(0, 0.25, 0);
  28370. var box = new THREE.Mesh(BoxGeometry, BoxMaterial);
  28371. _this.add(box);
  28372. } else {
  28373. // 数据库数据
  28374. _this.setFromInfo(info);
  28375. _this.updateInfo(true);
  28376. }
  28377. return _this;
  28378. }
  28379. /**
  28380. * 加载模型
  28381. * @param {*} url 模型名称
  28382. */
  28383. _createClass(GLTFDecoration, [{
  28384. key: "load",
  28385. value: function load(url) {
  28386. this.children.forEach(function (mesh) {
  28387. mesh.geometry.dispose();
  28388. mesh.material.dispose();
  28389. });
  28390. this.children = [];
  28391. if (url) {
  28392. this.url = url;
  28393. 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}`,
  28394. function (gltf) {
  28395. var _this2 = this;
  28396. var meshes = [];
  28397. gltf.scene.traverse(function (obj) {
  28398. return obj.type == 'Mesh' && meshes.push(obj);
  28399. });
  28400. meshes.forEach(function (mesh) {
  28401. // mesh.material.color.setRGB(3, 3, 3)
  28402. _this2.add(mesh);
  28403. mesh.renderOrder = RenderOrder.overlay; //xzw add
  28404. mesh.material.transparent = true; //xzw add 否则会被marker遮住
  28405. });
  28406. this.version++;
  28407. this.dispatchEvent({
  28408. type: 'loaded'
  28409. });
  28410. }.bind(this));
  28411. }
  28412. } // 删除模型
  28413. }, {
  28414. key: "remove",
  28415. value: function remove() {
  28416. this.removeFromParent();
  28417. this.children.forEach(function (mesh) {
  28418. mesh.geometry.dispose();
  28419. mesh.material.dispose();
  28420. });
  28421. } // 通过info初始化或回退
  28422. }, {
  28423. key: "setFromInfo",
  28424. value: function setFromInfo(info) {
  28425. this.sid = info.sid;
  28426. this.panoId = info.panoId;
  28427. this.url != info.url && this.load(info.url);
  28428. this.zipName = info.zipName;
  28429. this.visible = info.visible;
  28430. this.setTransformFromInfo(info);
  28431. }
  28432. }, {
  28433. key: "setTransformFromInfo",
  28434. value: function setTransformFromInfo(info) {
  28435. var position = info.position,
  28436. rotation = info.rotation,
  28437. scale = info.scale,
  28438. quaternion = info.quaternion;
  28439. this.position.set(parseFloat(position.x), parseFloat(position.y), parseFloat(position.z));
  28440. if (quaternion) {
  28441. this.setRotationFromQuaternion(new THREE.Quaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w));
  28442. } else {
  28443. // this.rotation.set(THREE.MathUtils.degToRad(rotation.x), THREE.MathUtils.degToRad(rotation.y), THREE.MathUtils.degToRad(rotation.z))
  28444. this.setAxisAngle('x', THREE.MathUtils.degToRad(rotation.x));
  28445. this.setAxisAngle('y', THREE.MathUtils.degToRad(rotation.y));
  28446. this.setAxisAngle('z', THREE.MathUtils.degToRad(rotation.z));
  28447. }
  28448. this.scale.set(parseFloat(scale.x), parseFloat(scale.y), parseFloat(scale.z));
  28449. }
  28450. /**
  28451. * 旋转
  28452. * @param {'x' | 'y' | 'z'} axisName 旋转轴
  28453. * @param {*} angle 旋转角
  28454. */
  28455. }, {
  28456. key: "setAxisAngle",
  28457. value: function setAxisAngle(axisName, angle) {
  28458. var axis = axisName == 'x' ? Vectors$1.RIGHT : axisName == 'y' ? axis = Vectors$1.UP : Vectors$1.BACK;
  28459. this.rotateOnAxis(axis, angle - this.axisAngle[axisName]);
  28460. this.axisAngle[axisName] = angle;
  28461. }
  28462. /**
  28463. * 返回空间模型数据
  28464. * @param {*} isSave 是否保存当前数据
  28465. * @returns
  28466. */
  28467. }, {
  28468. key: "updateInfo",
  28469. value: function updateInfo(isSave) {
  28470. var info = {
  28471. sid: this.sid,
  28472. panoId: this.panoId,
  28473. url: this.url,
  28474. zipName: this.zipName,
  28475. position: {
  28476. x: parseFloat(this.position.x.toFixed(2)),
  28477. y: parseFloat(this.position.y.toFixed(2)),
  28478. z: parseFloat(this.position.z.toFixed(2))
  28479. },
  28480. rotation: {
  28481. x: parseInt(THREE.MathUtils.radToDeg(this.axisAngle.x)),
  28482. y: parseInt(THREE.MathUtils.radToDeg(this.axisAngle.y)),
  28483. z: parseInt(THREE.MathUtils.radToDeg(this.axisAngle.z))
  28484. },
  28485. scale: {
  28486. x: parseFloat(this.scale.x.toFixed(1)),
  28487. y: parseFloat(this.scale.y.toFixed(1)),
  28488. z: parseFloat(this.scale.z.toFixed(1))
  28489. },
  28490. visible: this.visible
  28491. };
  28492. if (isSave) this.info = info;
  28493. return info;
  28494. }
  28495. }]);
  28496. return GLTFDecoration;
  28497. }(THREE.Group);
  28498. var GLTFAddManager = /*#__PURE__*/function () {
  28499. function GLTFAddManager(player) {
  28500. _classCallCheck(this, GLTFAddManager);
  28501. this.player = player;
  28502. this.editing = false;
  28503. this.adding = null; // 添加后确认位置前的状态
  28504. this.selecting = null; // 选中出现轴向时的状态
  28505. this.group = new THREE.Group();
  28506. this.group.name = 'GLTFDecorations';
  28507. player.model.add(this.group);
  28508. this.bindEvents();
  28509. }
  28510. _createClass(GLTFAddManager, [{
  28511. key: "show",
  28512. value: function show(floorIndex, keepHidden) {
  28513. var _this = this;
  28514. this.group.children.forEach(function (gltf) {
  28515. if (gltf === _this.adding || gltf === _this.selecting) return; // 忽略编辑中模型的显隐计算
  28516. if (keepHidden && !gltf.info.visible) return;
  28517. if (floorIndex == 'all' || _this.player.model.panos.get(gltf.panoId).floorIndex == floorIndex) gltf.visible = true;
  28518. });
  28519. }
  28520. }, {
  28521. key: "hide",
  28522. value: function hide(floorIndex) {
  28523. var _this2 = this;
  28524. this.group.children.forEach(function (gltf) {
  28525. if (gltf === _this2.adding || gltf === _this2.selecting) return;
  28526. if (floorIndex == 'all' || _this2.player.model.panos.get(gltf.panoId).floorIndex == floorIndex) gltf.visible = false;
  28527. });
  28528. }
  28529. /**
  28530. * 事件
  28531. */
  28532. }, {
  28533. key: "bindEvents",
  28534. value: function bindEvents() {
  28535. var _this3 = this;
  28536. this.player.on('pointerUp', this.onMouseUp.bind(this));
  28537. this.player.on('pointerMove', this.onMouseMove.bind(this));
  28538. var axisAngleTemp;
  28539. this.player.model.transformControls.addEventListener('mouseDown', function () {
  28540. if (_this3.selecting) {
  28541. axisAngleTemp = JSON.parse(JSON.stringify(_this3.selecting.axisAngle));
  28542. }
  28543. });
  28544. this.player.model.transformControls.addEventListener('mousing', function (e) {
  28545. if (_this3.selecting) {
  28546. // 移动模型轴向
  28547. if (e.mode == 'rotate') {
  28548. var axis = e.axis.toLowerCase();
  28549. var angle = axisAngleTemp[axis] + e.angle;
  28550. _this3.selecting.axisAngle[axis] = ((angle + Math.PI) % (Math.PI * 2) - Math.PI * 2) % (Math.PI * 2) + Math.PI; // 限制在-179到180
  28551. }
  28552. _this3.player.$app.Scene.Decoration.emit('Decoration.GLTF.select', _this3.selecting.updateInfo());
  28553. }
  28554. });
  28555. this.player.model.transformControls.addEventListener('mouseUp', function () {
  28556. if (_this3.selecting) ;
  28557. });
  28558. }
  28559. }, {
  28560. key: "onMouseUp",
  28561. value: function onMouseUp(e) {
  28562. if (this.player.EditOverlay.isAdding || this.player.EditOverlay.editPlane) return;
  28563. if (this.selecting || !this.editing) return;
  28564. if (this.adding) {
  28565. e.consume(); // 确认位置
  28566. this.adding.updateInfo(true);
  28567. this.select(this.adding);
  28568. this.adding = null;
  28569. } else if (this.player.mouseCouldBeClickToMove) {
  28570. var intersect = this.player.getMouseIntersect(null, this.group.children.filter(function (d) {
  28571. return d.visible;
  28572. }));
  28573. if (intersect) {
  28574. // 点击选中
  28575. e.consume();
  28576. var decoration = intersect.object.parent;
  28577. this.select(decoration);
  28578. this.player.flyToPano({
  28579. pano: this.player.model.panos.get(decoration.panoId),
  28580. lookAtPoint: decoration.position,
  28581. checkAlone: true
  28582. });
  28583. }
  28584. }
  28585. }
  28586. }, {
  28587. key: "onMouseMove",
  28588. value: function onMouseMove() {
  28589. if (this.adding) {
  28590. var intersect = this.player.getMouseIntersect(null, this.player.model.colliders);
  28591. if (intersect) {
  28592. this.adding.position.copy(intersect.point);
  28593. }
  28594. }
  28595. }
  28596. /**
  28597. * 选中
  28598. */
  28599. }, {
  28600. key: "select",
  28601. value: function select(decoration) {
  28602. this.selecting = decoration;
  28603. this.player.model.transformControls.switchEditState('decoration');
  28604. this.player.model.transformControls.attach(decoration);
  28605. this.player.$app.Scene.Decoration.emit('Decoration.GLTF.select', decoration.updateInfo());
  28606. this.player.compass.switch('axis');
  28607. }
  28608. }, {
  28609. key: "unselect",
  28610. value: function unselect() {
  28611. this.selecting = null;
  28612. this.player.model.transformControls.detach();
  28613. this.player.compass.switch('direction');
  28614. }
  28615. /**
  28616. * 增删
  28617. */
  28618. }, {
  28619. key: "add",
  28620. value: function add(info) {
  28621. var decoration = new GLTFDecoration(this, info);
  28622. this.group.add(decoration);
  28623. if (!info) this.adding = decoration;
  28624. return decoration;
  28625. }
  28626. }, {
  28627. key: "delete",
  28628. value: function _delete(decoration) {
  28629. if (decoration == this.selecting) this.unselect();
  28630. decoration.remove();
  28631. }
  28632. /**
  28633. * 保存
  28634. */
  28635. }, {
  28636. key: "save",
  28637. value: function save(func) {
  28638. // let data = this.group.children.map(decoration => decoration.updateInfo())
  28639. var data = this.selecting.updateInfo(); // let data = {}
  28640. // this.group.children.forEach((decoration, index) => {
  28641. // data[index] = decoration.updateInfo()
  28642. // })
  28643. return {
  28644. // data: JSON.stringify(data),
  28645. data,
  28646. successCallBack: function () {
  28647. try {
  28648. this.selecting.isNew = false;
  28649. this.selecting.updateInfo(true);
  28650. this.unselect(); // this.group.children.forEach(decoration => {
  28651. // decoration.isNew = false
  28652. // decoration.updateInfo(true)
  28653. // })
  28654. func && func();
  28655. } catch (e) {
  28656. console.error(e);
  28657. }
  28658. }.bind(this)
  28659. };
  28660. }
  28661. }]);
  28662. return GLTFAddManager;
  28663. }();
  28664. 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); }; }
  28665. 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; } }
  28666. var ViewerBase = /*#__PURE__*/function (_THREE$EventDispatche) {
  28667. _inherits(ViewerBase, _THREE$EventDispatche);
  28668. var _super = _createSuper$1f(ViewerBase);
  28669. function ViewerBase(domElement) {
  28670. var _this;
  28671. var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  28672. _classCallCheck(this, ViewerBase);
  28673. _this = _super.call(this);
  28674. _this.name = args.name;
  28675. _this.domElement = domElement;
  28676. _this.oldResolution = new THREE.Vector2();
  28677. _this.oldResolution2 = new THREE.Vector2();
  28678. _this.screenSizeInfo = {
  28679. W: 0,
  28680. H: 0,
  28681. pixelRatio: 1,
  28682. windowWidth: 0,
  28683. windowHeight: 0
  28684. };
  28685. _this.initContext(args);
  28686. _this.addEventListener('content_changed', function () {
  28687. //画面改变,需要渲染
  28688. _this.needRender = true; //console.log('needRender')
  28689. });
  28690. return _this;
  28691. }
  28692. _createClass(ViewerBase, [{
  28693. key: "initContext",
  28694. value: function initContext(args) {
  28695. var _this2 = this;
  28696. //console.log(`initializing three.js ${THREE.REVISION}`);
  28697. this.domElement.clientWidth;
  28698. this.domElement.clientHeight;
  28699. ({
  28700. alpha: true,
  28701. //支持透明
  28702. depth: true,
  28703. stencil: false,
  28704. antialias: !!args.antialias,
  28705. preserveDrawingBuffer: args.preserveDrawingBuffer || false,
  28706. powerPreference: 'high-performance'
  28707. });
  28708. var canvas = document.createElement('canvas'); //Potree.settings.renderAllViewports = browser.maybeQilin() && this.renderer.capabilities.maxCubemapSize <= 2048 && //麒麟chromium若获取过webgl2只渲染一个viewport的话其他的会变黑
  28709. /*
  28710. let webglVer = (args.webgl1 || Potree.browser.urlHasValue('webgl1') || !Potree.Features.webgl2RealSupport() ) ? 'webgl' : 'webgl2'
  28711. let context = canvas.getContext(webglVer, contextAttributes );
  28712. */
  28713. this.renderer = new THREE.WebGLRenderer({
  28714. premultipliedAlpha: false,
  28715. canvas: canvas //context: context,
  28716. });
  28717. this.renderer.sortObjects = true; //原先false 打开了renderOrder才奏效
  28718. //this.renderer.setSize(width, height);
  28719. this.renderer.autoClear = args.autoClear || false; //args.clearColor = args.clearColor || '#aa0033'
  28720. args.clearColor && this.renderer.setClearColor(args.clearColor);
  28721. this.domElement.appendChild(this.renderer.domElement);
  28722. this.renderer.domElement.style.position = 'absolute';
  28723. this.renderer.domElement.addEventListener('mousedown', function () {
  28724. _this2.renderer.domElement.focus();
  28725. });
  28726. /* {
  28727. let oldRender = this.renderer.render
  28728. this.renderer.render = function(scene, camera){
  28729. Potree.currentRender = {renderer: this, scene, camera }
  28730. oldRender.apply(this, arguments)
  28731. }
  28732. } */
  28733. //this.renderer.domElement.focus();
  28734. // NOTE: If extension errors occur, pass the string into this.renderer.extensions.get(x) before enabling
  28735. // enable frag_depth extension for the interpolation shader, if available
  28736. var gl = this.renderer.getContext();
  28737. gl.getExtension('EXT_frag_depth');
  28738. gl.getExtension('WEBGL_depth_texture');
  28739. gl.getExtension('WEBGL_color_buffer_float'); // Enable explicitly for more portability, EXT_color_buffer_float is the proper name in WebGL 2
  28740. if (gl.createVertexArray == null) {
  28741. var extVAO = gl.getExtension('OES_vertex_array_object');
  28742. if (!extVAO) {
  28743. throw new Error('OES_vertex_array_object extension not supported');
  28744. }
  28745. gl.createVertexArray = extVAO.createVertexArrayOES.bind(extVAO);
  28746. gl.bindVertexArray = extVAO.bindVertexArrayOES.bind(extVAO);
  28747. }
  28748. }
  28749. }, {
  28750. key: "updateScreenSize",
  28751. value: function updateScreenSize() {
  28752. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  28753. //有可能需要让viewport来判断,当窗口大小不变但viewport大小变时
  28754. if (this.screenshoting && !o.forceUpdateSize) return; //截图时不允许因窗口改变大小而updateScreenSize
  28755. var render = false,
  28756. ratio,
  28757. w,
  28758. h; //记录应当render的大小
  28759. if (o.width != void 0 && o.height != void 0) {
  28760. w = o.width;
  28761. h = o.height;
  28762. render = true;
  28763. ratio = 1;
  28764. } else {
  28765. w = this.domElement.clientWidth;
  28766. h = this.domElement.clientHeight;
  28767. if (w !== this.screenSizeInfo.W || h !== this.screenSizeInfo.H || o.forceUpdateSize || this.screenSizeInfo.pixelRatio != window.devicePixelRatio) {
  28768. this.screenSizeInfo.W = w;
  28769. this.screenSizeInfo.H = h;
  28770. render = true;
  28771. this.screenSizeInfo.pixelRatio = window.devicePixelRatio; //如果player放在小窗口了,也要监测devicePixelRatio,因为缩放时client宽高不会改变
  28772. //config.isMobile ? (ratio = Math.min(window.devicePixelRatio, 2)) : (ratio = window.devicePixelRatio)
  28773. ratio = window.devicePixelRatio;
  28774. }
  28775. }
  28776. if (render) {
  28777. this.setSize_(w, h, ratio, o.forTarget);
  28778. }
  28779. }
  28780. }, {
  28781. key: "setSize_",
  28782. value: function setSize_(width, height, devicePixelRatio, onlyForTarget) {
  28783. var _this3 = this;
  28784. //console.log('setSize', width)
  28785. if (!onlyForTarget) {
  28786. //onlyForTarget表示不更改当前renderer,只是为了rendertarget才要改变viewport
  28787. this.renderer.setPixelRatio(devicePixelRatio);
  28788. this.renderer.setSize(width, height); // resize之后会自动clear(似乎因为setScissor ),所以一定要立刻绘制,所以setSize要在cameraChanged、update之前
  28789. } //this.composer && this.composer.setSize(width, height);
  28790. if (this.viewports) {
  28791. this.viewports.forEach(function (view, i) {
  28792. //if(!view.active)return
  28793. var width_ = width * view.width;
  28794. var height_ = height * view.height;
  28795. view.setResolution(Math.ceil(width_), Math.ceil(height_), width, height);
  28796. if (height_ == 0) return; //avoid NAN
  28797. var aspect = width_ / height_; //camera的参数精确些,不用视口的归整的resolution像素值,否则hasChange无法为true, 导致canvasResize了但map没update从而闪烁
  28798. view.camera.aspect = aspect;
  28799. if (view.camera.type == 'OrthographicCamera') ;
  28800. view.camera.updateProjectionMatrix();
  28801. });
  28802. }
  28803. if (!onlyForTarget) {
  28804. //因为onlyForTarget不传递devicePixelRatio所以不发送了
  28805. this.dispatchEvent('viewerResize');
  28806. this.viewports.forEach(function (e) {
  28807. _this3.ifEmitResize({
  28808. viewport: e,
  28809. deviceRatio: devicePixelRatio
  28810. });
  28811. });
  28812. }
  28813. }
  28814. }, {
  28815. key: "ifEmitResize",
  28816. value: function ifEmitResize(e) {
  28817. //切换viewport渲染时, 若这些viewport大小不同就发送一次, 通知一些材质更新resolution。
  28818. //console.log('ifEmitResize',e.viewport.name,e.viewport.resolution2 )
  28819. if (!e.viewport.resolution.equals(this.oldResolution) || !e.viewport.resolution2.equals(this.oldResolution2)) {
  28820. this.dispatchEvent(Object.assign(e, {
  28821. type: 'resize'
  28822. }));
  28823. this.oldResolution.copy(e.viewport.resolution);
  28824. this.oldResolution2.copy(e.viewport.resolution2);
  28825. }
  28826. }
  28827. }, {
  28828. key: "cameraChanged",
  28829. value: function cameraChanged() {
  28830. //判断相机是否改变
  28831. var changed = false;
  28832. /* if(this.needRender){
  28833. this.needRender = false
  28834. return true
  28835. } */
  28836. for (var i = 0, j = this.viewports.length; i < j; i++) {
  28837. var viewport = this.viewports[i];
  28838. var changeInfo = viewport.cameraChanged();
  28839. if (changeInfo.changed) {
  28840. changed = true; //if(!this.changeTime ||this.changeTime<100){
  28841. this.dispatchEvent({
  28842. type: 'camera_changed',
  28843. camera: viewport.camera,
  28844. viewport,
  28845. changeInfo
  28846. }); //this.changeTime = (this.changeTime || 0) +1
  28847. //}
  28848. viewport.needRender = true; //直接写这咯
  28849. if (changeInfo.resolutionChanged) {
  28850. this.ifEmitResize({
  28851. viewport
  28852. }); //for map
  28853. }
  28854. }
  28855. }
  28856. return changed;
  28857. }
  28858. }, {
  28859. key: "makeScreenshot",
  28860. value: function makeScreenshot(size, viewports, compressRatio) {
  28861. //暂时不要指定viewports渲染,但也可以
  28862. var width = size.width,
  28863. height = size.height;
  28864. /* let oldBudget = Potree.pointBudget;
  28865. Potree.pointBudget = Math.max(10 * 1000 * 1000, 2 * oldBudget);
  28866. let result = Potree.updatePointClouds(this.scene.pointclouds, camera, size );
  28867. Potree.pointBudget = oldBudget;
  28868. this.dispatchEvent({ //resize everything such as lines targets
  28869. type: 'resize',
  28870. resolution: new THREE.Vector2(width,height),
  28871. });*/
  28872. var target = new THREE.WebGLRenderTarget(width, height, {
  28873. format: THREE.RGBAFormat
  28874. });
  28875. this.setSize_(width, height, 1, true);
  28876. this.render({
  28877. target,
  28878. //camera ,
  28879. viewports: viewports || this.viewports,
  28880. screenshot: true,
  28881. width,
  28882. height,
  28883. resize: true //需要resize
  28884. });
  28885. var dataUrl = Potree.Utils.renderTargetToDataUrl(target, width, height, this.renderer, compressRatio);
  28886. /* let pixelCount = width * height;
  28887. let buffer = new Uint8Array(4 * pixelCount);
  28888. this.renderer.readRenderTargetPixels(target, 0, 0, width, height, buffer);
  28889. let dataUrl = Potree.Utils.pixelsArrayToDataUrl(buffer, width, height, compressRatio) */
  28890. target.dispose(); //resize back
  28891. //this.updateScreenSize({forceUpdateSize:true})
  28892. return {
  28893. width,
  28894. height,
  28895. dataUrl
  28896. };
  28897. }
  28898. }, {
  28899. key: "dispose",
  28900. value: function dispose() {
  28901. var scene = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.scene;
  28902. scene.clear();
  28903. this.renderer.dispose();
  28904. this.renderer.forceContextLoss();
  28905. var gl = this.renderer.getContext();
  28906. gl.getExtension('WEBGL_lose_context') && gl.getExtension('WEBGL_lose_context').loseContext();
  28907. this.domElement.removeChild(this.renderer.domElement);
  28908. this.dispatchEvent('dispose');
  28909. }
  28910. }, {
  28911. key: "emit",
  28912. value: function emit() {}
  28913. }]);
  28914. return ViewerBase;
  28915. }(THREE.EventDispatcher);
  28916. 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); }; }
  28917. 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; } }
  28918. var texLoader$1 = new THREE.TextureLoader();
  28919. texLoader$1.crossOrigin = 'anonymous';
  28920. var rot90 = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(-90));
  28921. var createErrorMaterial = function createErrorMaterial() {
  28922. var t = new THREE.MeshBasicMaterial({
  28923. transparent: !0,
  28924. depthWrite: !1,
  28925. depthTest: !0,
  28926. opacity: 1,
  28927. side: THREE.DoubleSide
  28928. });
  28929. return t.color = new THREE.Color(3355443), t;
  28930. };
  28931. var tempVector = new THREE.Vector3(),
  28932. //sharedata
  28933. errorMaterial = createErrorMaterial(),
  28934. uv00 = new THREE.Vector2(0, 0),
  28935. uv01 = new THREE.Vector2(0, 1),
  28936. uv10 = new THREE.Vector2(1, 0),
  28937. uv11 = new THREE.Vector2(1, 1),
  28938. face1UV = [uv00, uv10, uv11],
  28939. face2UV = [uv11, uv01, uv00],
  28940. face1,
  28941. face2;
  28942. function initGlobal() {
  28943. face1 = new THREE.Shim.Face3(0, 1, 2), face2 = new THREE.Shim.Face3(2, 3, 0);
  28944. }
  28945. var HALF_WORLD_SIZE = 21e6; //略大于半个周长(mapSizeM/2)
  28946. var getSid = function () {
  28947. var sid = 0;
  28948. return function () {
  28949. return sid++;
  28950. };
  28951. }(); //高德坐标拾取工具 : https://lbs.amap.com/tools/picker
  28952. var MapLayer = /*#__PURE__*/function (_THREE$EventDispatche) {
  28953. _inherits(MapLayer, _THREE$EventDispatche);
  28954. var _super = _createSuper$1e(MapLayer);
  28955. // 包括了 MapLayerBase SceneLayer
  28956. function MapLayer(viewer_, viewport) {
  28957. var _this;
  28958. _classCallCheck(this, MapLayer);
  28959. _this = _super.call(this);
  28960. initGlobal();
  28961. _this.sceneGroup = new THREE.Object3D();
  28962. _this.sceneGroup.name = 'MapLayer';
  28963. _this.waitQueue = []; //等待加载的
  28964. _this.loadingInProgress = 0;
  28965. _this.maps = [];
  28966. _this.frustum = new THREE.Frustum();
  28967. _this.frustumMatrix = new THREE.Matrix4();
  28968. _this.tileColor = new THREE.Color(16777215);
  28969. _this.viewport = viewport;
  28970. _this.changeViewer(viewer_);
  28971. _this.sceneGroup.addEventListener('isVisible', function () {
  28972. _this.viewer.mapChanged = true;
  28973. });
  28974. return _this;
  28975. }
  28976. _createClass(MapLayer, [{
  28977. key: "addStreetMap",
  28978. value: function addStreetMap() {
  28979. //添加地图
  28980. var map = new TiledMapOpenStreetMap(this, this.tileColor);
  28981. this.addMap(map);
  28982. }
  28983. }, {
  28984. key: "addMapEntity",
  28985. value: function addMapEntity(data, orientationUser) {
  28986. if (!data) {
  28987. return;
  28988. }
  28989. var floorplan = new TiledMapFromEntity(this, this.tileColor, data);
  28990. orientationUser && (floorplan.orientationUser = orientationUser);
  28991. if (floorplan) {
  28992. this.addMap(floorplan);
  28993. floorplan.updateProjection();
  28994. floorplan.updateObjectGroup();
  28995. var visible = true;
  28996. if (visible) {
  28997. this.needUpdate = true;
  28998. } else {
  28999. floorplan.setEnable(false);
  29000. }
  29001. this.dispatchEvent({
  29002. type: 'floorplanLoaded',
  29003. floorplan
  29004. });
  29005. }
  29006. return floorplan;
  29007. }
  29008. }, {
  29009. key: "getFloorplan",
  29010. value: function getFloorplan(datasetId) {
  29011. return this.maps.find(function (e) {
  29012. return e.name == 'floorplan' + '_' + datasetId;
  29013. });
  29014. }
  29015. }, {
  29016. key: "addMap",
  29017. value: function addMap(t) {
  29018. this.maps.push(t); //this.view.invalidateScene()
  29019. this.needUpdate = true;
  29020. this.viewer.mapChanged = true;
  29021. }
  29022. }, {
  29023. key: "removeMap",
  29024. value: function removeMap(t) {
  29025. var e = this.maps.indexOf(t);
  29026. if (e >= 0) {
  29027. t.removeFromSceneGroup(this.sceneGroup);
  29028. this.maps.splice(e, 1);
  29029. }
  29030. /* this.view.invalidateScene() */
  29031. this.needUpdate = true;
  29032. this.viewer.mapChanged = true;
  29033. }
  29034. }, {
  29035. key: "changeViewer",
  29036. value: function changeViewer(viewer_) {
  29037. //add
  29038. this.viewer = viewer_;
  29039. }
  29040. }, {
  29041. key: "initProjection",
  29042. value: function initProjection() {
  29043. this.maps.forEach(function (map) {
  29044. map.updateProjection();
  29045. map.updateObjectGroup();
  29046. });
  29047. }
  29048. }, {
  29049. key: "visibilityChanged",
  29050. value: function visibilityChanged() {
  29051. if (!this.visible) for (var t = 0, e = this.maps; t < e.length; t++) {
  29052. e[t].removeFromSceneGroup(this.sceneGroup);
  29053. }
  29054. }
  29055. }, {
  29056. key: "update",
  29057. value: function update() {
  29058. this.needUpdate = false;
  29059. if (this.disabled || !this.maps.find(function (e) {
  29060. return !e.disabled;
  29061. }) || !this.maps.find(function (e) {
  29062. return e.objectGroup.visible;
  29063. })) return; //add
  29064. this.viewer.mapChanged = true;
  29065. var e, n, i, r;
  29066. this.updateTimer = void 0, e = this.viewport.camera;
  29067. n = e.projectionMatrix.clone();
  29068. var expandRatio = 1.3;
  29069. n.elements[0] /= expandRatio;
  29070. n.elements[5] /= expandRatio; // 为了缓存吗,使边界处也提前加载,扩大显示区域
  29071. this.frustumMatrix.multiplyMatrices(n, e.matrixWorldInverse), this.frustum.setFromProjectionMatrix(this.frustumMatrix), this.frustum.planes[4].setComponents(0, 0, 0, 0), this.frustum.planes[5].setComponents(0, 0, 0, 0), i = !0; //console.log('-------------update-----------')
  29072. for (r = 0; r < this.maps.length; r++) {
  29073. var map = this.maps[r];
  29074. i = map.update(this.frustum, this.sceneGroup) && i;
  29075. }
  29076. return [2, i];
  29077. }
  29078. }, {
  29079. key: "updateProjection",
  29080. value: function updateProjection() {
  29081. for (var t = 0, e = this.maps; t < e.length; t++) {
  29082. var n = e[t];
  29083. n.clearProjection(), n.updateObjectGroup();
  29084. }
  29085. }
  29086. }]);
  29087. return MapLayer;
  29088. }(THREE.EventDispatcher);
  29089. var TiledMapBase = /*#__PURE__*/function (_THREE$EventDispatche2) {
  29090. _inherits(TiledMapBase, _THREE$EventDispatche2);
  29091. var _super2 = _createSuper$1e(TiledMapBase);
  29092. function TiledMapBase(name, mapLayer, tileColor, projection) {
  29093. var _this2;
  29094. _classCallCheck(this, TiledMapBase);
  29095. _this2 = _super2.call(this);
  29096. _this2.name = name;
  29097. _this2.mapLayer = mapLayer, _this2.tileColor = tileColor, _this2.bias = 0;
  29098. _this2.zIndex = -1;
  29099. _this2.objectGroup = new THREE.Object3D();
  29100. _this2.objectGroup.name = name;
  29101. _this2.objectGroupAdded = !1, _this2.baseTile = new MapTile(_assertThisInitialized(_this2), _this2.objectGroup, _this2.tileColor, null, '0'), _this2.isTileVisibleBox = new THREE.Box3(), _this2.isTileVisibleVec = new THREE.Vector3();
  29102. _this2.projection = projection;
  29103. _this2._zoomLevel = 0; //1-20
  29104. _this2.objectGroup.addEventListener('isVisible', function () {
  29105. _this2.mapLayer.viewer.mapChanged = true;
  29106. });
  29107. _this2.computeCount = 0;
  29108. _this2.maxLoading = 3;
  29109. _this2.loadFailCount = 0;
  29110. _this2.loadingInProgress = 0;
  29111. return _this2;
  29112. }
  29113. _createClass(TiledMapBase, [{
  29114. key: "zoomLevel",
  29115. get: function get() {
  29116. return this._zoomLevel;
  29117. },
  29118. set: function set(zoomLevel) {
  29119. if (this._zoomLevel != zoomLevel) {
  29120. this._zoomLevel = zoomLevel;
  29121. this.dispatchEvent({
  29122. type: 'zoomLevelChange',
  29123. zoomLevel
  29124. }); //if(this.name == 'map')console.log(zoomLevel,viewer.mapViewer.camera.zoom)
  29125. }
  29126. }
  29127. }, {
  29128. key: "updateObjectGroup",
  29129. value: function updateObjectGroup() {
  29130. this.position && this.objectGroup.position.copy(this.position).setZ(0), this.quaternion && this.objectGroup.quaternion.copy(this.quaternion), this.objectGroup.updateMatrixWorld(!0);
  29131. }
  29132. }, {
  29133. key: "updateProjection",
  29134. value: function updateProjection() {
  29135. if (!this.transformMapToLocal) {
  29136. this.transformMapToLocal = proj4(this.projection, 'LOCAL_MAP');
  29137. }
  29138. }
  29139. }, {
  29140. key: "clearProjection",
  29141. value: function clearProjection() {
  29142. this.transformMapToLocal = void 0;
  29143. this.projection !== 'LOCAL_MAP' && this.baseTile.remove();
  29144. }
  29145. }, {
  29146. key: "setEnable",
  29147. value: function setEnable(enable) {
  29148. //add
  29149. if (!this.disabled == enable) return;
  29150. this.disabled = !enable;
  29151. common$1.updateVisible(this.objectGroup, 'setEnable', enable);
  29152. if (!enable) {
  29153. this.baseTile.remove();
  29154. } else {
  29155. this.mapLayer.needUpdate = true;
  29156. }
  29157. }
  29158. }, {
  29159. key: "update",
  29160. value: function update(frustum, sceneGroup) {
  29161. this.computeCount = 0;
  29162. var unavailable = this.disabled || !this.objectGroup.visible; //地图即使不显示也要获得zoomlevel
  29163. if (this.name != 'map' && unavailable) return;
  29164. this.updateProjection();
  29165. if (!this.transformMapToLocal) return;
  29166. if (!this.isTileVisible(new THREE.Vector3(0, 0, 0), this.mapSizeM, frustum)) return this.removeFromSceneGroup(sceneGroup), !0;
  29167. var viewport = this.mapLayer.viewport;
  29168. var i = new THREE.Vector3(-0.5 * this.mapSizeM, 0, 0);
  29169. i.applyMatrix4(this.objectGroup.matrixWorld), i.project(viewport.camera);
  29170. var o = new THREE.Vector3(0.5 * this.mapSizeM, 0, 0);
  29171. o.applyMatrix4(this.objectGroup.matrixWorld), o.project(viewport.camera);
  29172. var rx = viewport.resolution.x,
  29173. ry = viewport.resolution.y;
  29174. if (rx <= 0 || ry <= 0 || isNaN(i.x) || isNaN(i.y) || isNaN(o.z)) return !1;
  29175. i.sub(o), i.x *= rx / 2, i.y *= ry / 2;
  29176. var scale = 1;
  29177. /* if(this.name == 'map'){
  29178. //add 高纬度的因倾斜而造成tile较小,所以放大些,否则会造成显示的tile过多而卡
  29179. let lonlat = viewer.transform.lonlatToLocal.inverse(viewport.camera.position.clone())
  29180. let cos = Math.cos(THREE.Math.degToRad(lonlat.y)); //越小就在纬度上越高,tile表现越小
  29181. //为什么lonlat.y会超出90?
  29182. cos = THREE.Math.clamp(cos, 0,1)
  29183. let lonShift = Math.abs(viewer.mapViewer.camera.position.x / this.mapSizeM * 16 ) //越大就在经度离中心越远,tile表现越大 。
  29184. lonShift = THREE.Math.clamp(lonShift, 0, Math.PI)
  29185. lonShift = (1 - Math.sin( 1/2 * lonShift + Math.PI/2 )) * Math.PI // 0-Math.PI sin增速向上
  29186. scale = 0.5 * cos * (1+lonShift) + 0.5 * Math.pow(cos, lonShift)
  29187. }else{
  29188. scale = 1
  29189. } */
  29190. var c = this.tileSizePx / i.length() / scale,
  29191. //多除以一个scale缩放因子,scale越大level越小
  29192. level = Math.ceil(-math$2.getBaseLog(2, c) - this.bias);
  29193. if (this.style == 'dark-standard') {
  29194. //该模式贴图比较小放大点
  29195. level -= 1;
  29196. }
  29197. level = Math.max(level, 0);
  29198. level = Math.min(level, void 0 === this.maxDepth ? 1 / 0 : this.maxDepth);
  29199. this.zoomLevel = level; //add
  29200. /* if(isNaN(this.zoomLevel )){
  29201. console.log(level, cos , scale , lonlat )
  29202. } */
  29203. if (!unavailable) {
  29204. this.addToSceneGroup(sceneGroup);
  29205. return this.baseTile.update(this, frustum, level, this.mapSizeM, 0, 0, '');
  29206. }
  29207. }
  29208. }, {
  29209. key: "isTileVisible",
  29210. value: function isTileVisible(tileCenter, tileSize, frustum, viewport, name) {
  29211. if (tileSize > HALF_WORLD_SIZE) return !0; //root must visible
  29212. var halfSize = 0.5 * tileSize; //在地图上的size和local的差不多是吗
  29213. var vertices = []; //简单版:
  29214. this.transformMapToLocal.forward(tileCenter); //e转化为local
  29215. this.isTileVisibleBox.makeEmpty();
  29216. this.isTileVisibleVec.set(tileCenter.x - halfSize, tileCenter.y - halfSize, tileCenter.z).applyMatrix4(this.objectGroup.matrixWorld);
  29217. vertices.push(this.isTileVisibleVec.clone());
  29218. this.isTileVisibleBox.expandByPoint(this.isTileVisibleVec);
  29219. this.isTileVisibleVec.set(tileCenter.x - halfSize, tileCenter.y + halfSize, tileCenter.z).applyMatrix4(this.objectGroup.matrixWorld);
  29220. vertices.push(this.isTileVisibleVec.clone());
  29221. this.isTileVisibleBox.expandByPoint(this.isTileVisibleVec);
  29222. this.isTileVisibleVec.set(tileCenter.x + halfSize, tileCenter.y - halfSize, tileCenter.z).applyMatrix4(this.objectGroup.matrixWorld);
  29223. vertices.push(this.isTileVisibleVec.clone());
  29224. this.isTileVisibleBox.expandByPoint(this.isTileVisibleVec);
  29225. this.isTileVisibleVec.set(tileCenter.x + halfSize, tileCenter.y + halfSize, tileCenter.z).applyMatrix4(this.objectGroup.matrixWorld);
  29226. vertices.push(this.isTileVisibleVec.clone());
  29227. this.isTileVisibleBox.expandByPoint(this.isTileVisibleVec);
  29228. /* this.isTileVisibleBox.min = math.convertVisionVector(this.isTileVisibleBox.min)
  29229. this.isTileVisibleBox.max = math.convertVisionVector(this.isTileVisibleBox.max) */
  29230. var visi = frustum.intersectsBox(this.isTileVisibleBox); //console.log(this.isTileVisibleBox.min.toArray(), this.isTileVisibleBox.max.toArray(),this.objectGroup.matrixWorld.elements, visi )
  29231. return visi;
  29232. }
  29233. }, {
  29234. key: "addToSceneGroup",
  29235. value: function addToSceneGroup(t) {
  29236. this.objectGroupAdded || (t.add(this.objectGroup), this.objectGroupAdded = !0, this.objectGroup.updateMatrixWorld(!0)); //add
  29237. }
  29238. }, {
  29239. key: "removeFromSceneGroup",
  29240. value: function removeFromSceneGroup(t) {
  29241. this.baseTile.remove(), this.objectGroupAdded && (t.remove(this.objectGroup), this.objectGroupAdded = !1);
  29242. }
  29243. }]);
  29244. return TiledMapBase;
  29245. }(THREE.EventDispatcher);
  29246. var loadDone = function loadDone(tile, success) {
  29247. tile.map.mapLayer.loadingInProgress--;
  29248. tile.map.loadingInProgress--; //console.log('loaddone', tile.name, 'loadingInProgress',tile.map.mapLayer.loadingInProgress, Date.now())
  29249. tile.loading = false;
  29250. var next = tile.map.mapLayer.waitQueue[0];
  29251. if (next) {
  29252. addLoadTile(next);
  29253. } else {
  29254. if (tile.map.mapLayer.loadingInProgress == 0) {
  29255. //注意这时候不一定就加载完了,300ms后可能还会有新的tile加载
  29256. //console.log('loadDone All ?', Date.now())
  29257. tile.map.mapLayer.dispatchEvent('loadDone');
  29258. }
  29259. }
  29260. tile.mesh && (tile.mesh.material.needsUpdate = true);
  29261. };
  29262. function addLoadTile(tile) {
  29263. /* if(tile.texURL && tile.texURL.includes('testdata') ){
  29264. console.error('addLoadTile', tile.texURL.split('map_tiles/')[1] )
  29265. } */
  29266. if (tile.map.loadingInProgress < tile.map.maxLoading) {
  29267. if (!tile.mesh) return; //有时候会遇到这种情况, 为什么没有被cancelLoad呢?
  29268. tile.map.mapLayer.loadingInProgress++;
  29269. tile.map.loadingInProgress++;
  29270. tile.map.mapLayer.dispatchEvent('startLoad'); //console.log('addLoad', 'loadingInProgress',tile.map.mapLayer.loadingInProgress, Date.now())
  29271. //tile.texURL && tile.texURL.includes('testdata') && console.log('startloadTile ', tile.texURL.split('map_tiles/')[1] )
  29272. tile.loading = true;
  29273. var index = tile.map.mapLayer.waitQueue.indexOf(tile);
  29274. index > -1 && tile.map.mapLayer.waitQueue.splice(index, 1);
  29275. var tex = tile.mesh.material.map = texLoader$1.load(tile.texURL, function (tex) {
  29276. //如果一直加载不了会影响其他的加载,如google地图没有vpn会使全景图一直加载不了
  29277. if (tile.mesh) {
  29278. //如果还要显示的话
  29279. tile.textureLoaded = true;
  29280. tile.mesh.material.opacity = 1;
  29281. tile.map.mapLayer.viewer.mapChanged = true;
  29282. tile.map.mapLayer.needUpdate = true; //表示还要继续update(以removeChildren)
  29283. if (tile.map instanceof TiledMapOpenStreetMap) {
  29284. tile.map.maxLoading = browser$1.isMobile() ? 5 : 10;
  29285. }
  29286. } else {
  29287. //tile.texURL && tile.texURL.includes('testdata') && console.log('loadDone and dispose', tile.texURL.split('map_tiles/')[1] )
  29288. tex.dispose();
  29289. }
  29290. loadDone(tile);
  29291. }, void 0, function () {
  29292. //error
  29293. tile.textureLoaded = !0;
  29294. if (tile.mesh) {
  29295. tile.mesh.material.dispose();
  29296. tile.mesh.material = errorMaterial;
  29297. tile.map.mapLayer.viewer.mapChanged = true;
  29298. }
  29299. loadDone(tile);
  29300. tile.map.loadFailCount++;
  29301. if (tile.map instanceof TiledMapOpenStreetMap && config$6.mapCompany == 'google' && tile.map.loadFailCount > 3) {
  29302. //极有可能没有vpn为了防止影响到其他资源加载,减少加载的个数
  29303. tile.map.maxLoading = 2;
  29304. }
  29305. });
  29306. tex.anisotropy = 0;
  29307. tex.generateMipmaps = !1;
  29308. tex.minFilter = THREE.LinearFilter;
  29309. tex.magFilter = THREE.LinearFilter;
  29310. } else {
  29311. tile.map.mapLayer.waitQueue.includes(tile) || tile.map.mapLayer.waitQueue.push(tile);
  29312. }
  29313. }
  29314. function cancelLoad(tile, log) {
  29315. //如果等待加载,但还没开始加载,取消加载
  29316. if (!tile.loading) {
  29317. var index = tile.map.mapLayer.waitQueue.indexOf(tile);
  29318. index > -1 && tile.map.mapLayer.waitQueue.splice(index, 1); //index > -1 && tile.texURL && tile.texURL.includes('testdata') && console.log('cancelLoad', tile.texURL.split('map_tiles/')[1]/* , (log && waitQueue.indexOf(tile)>-1) ? log:'' , tile.loading */ )
  29319. }
  29320. }
  29321. var MapTile = /*#__PURE__*/function () {
  29322. function MapTile(map, e, n, parent, name) {
  29323. _classCallCheck(this, MapTile);
  29324. this.map = map;
  29325. this.name = name;
  29326. this.parent = parent;
  29327. this.objectGroup = e, this.tileColor = n, this.meshAdded = !1, this.textureLoaded = !1, this.children = [];
  29328. this.id = getSid();
  29329. }
  29330. _createClass(MapTile, [{
  29331. key: "update",
  29332. value: function update(entity, frustum, level, tileSize, centerX, centerY, treeStr, viewport) {
  29333. var canTraverse = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : true;
  29334. if (!this.doesNotContainTilesToBeDisplayed(entity)) {
  29335. var canTraverse_ = this.map.mapLayer.is3d ? canTraverse : level > 0;
  29336. return canTraverse_ ? this.updateSubTiles(entity, frustum, level, tileSize, centerX, centerY, treeStr, viewport) : this.updateTileLeaf(entity, tileSize, centerX, centerY);
  29337. }
  29338. }
  29339. }, {
  29340. key: "doesNotContainTilesToBeDisplayed",
  29341. value: function doesNotContainTilesToBeDisplayed(entity) {
  29342. return entity.tilePresenceMap && entity.tilePresenceMap.empty;
  29343. }
  29344. }, {
  29345. key: "updateTileLeaf",
  29346. value: function updateTileLeaf(entity, tileSize, centerX, centerY) {
  29347. //真正显示mesh的是这一层,最高level
  29348. //if(this.map.name.includes('floorplan'))console.log('updateTileLeaf',this.name)
  29349. if (!this.mesh) {
  29350. this.createTileObject(entity, tileSize, centerX, centerY);
  29351. }
  29352. if (!this.meshAdded) {
  29353. this.objectGroup.add(this.mesh);
  29354. this.meshAdded = !0;
  29355. }
  29356. if (this.textureLoaded) {
  29357. //贴图加载完就不需要子集了
  29358. this.removeChildren();
  29359. } else {
  29360. this.cancelChildren(); //add 停止加载子集
  29361. }
  29362. return this.textureLoaded;
  29363. }
  29364. }, {
  29365. key: "updateSubTiles",
  29366. value: function updateSubTiles(entity, frustum, level, tileSize, centerX, centerY, treeStr) {
  29367. //console.log('updateSubTiles',this.name) //名字越长代表level越高
  29368. var shiftX = [-0.25 * tileSize, 0.25 * tileSize, -0.25 * tileSize, 0.25 * tileSize],
  29369. shiftY = [0.25 * tileSize, 0.25 * tileSize, -0.25 * tileSize, -0.25 * tileSize];
  29370. for (var childrenLoaded = !0, p = 0; p < 4; ++p) {
  29371. var childTreeStr = treeStr + p.toString(10); //一级(512):0 1 2 3分别为左上、右上、左下、右下。二级(1024)就是把一级的每一块分裂,如00 01 02 03分别是0的左上、右上、左下、右下……
  29372. if (!entity.tilePresenceMap || entity.tilePresenceMap[childTreeStr]) {
  29373. //去掉判断,直接显示
  29374. var childCenterX = centerX + shiftX[p],
  29375. childCenterY = centerY + shiftY[p];
  29376. tempVector.set(childCenterX, childCenterY, 0);
  29377. this.map.computeCount++; //console.log(this.map.computeCount, this.name, 'level:',level)
  29378. if (entity.isTileVisible(tempVector, 0.5 * tileSize, frustum)) {
  29379. this.children[p] || (this.children[p] = new MapTile(this.map, this.objectGroup, this.tileColor, this, this.name + p)); //childrenLoaded = childrenLoaded && this.children[p].update(entity, n, level - 1, .5 * o, f, m, h) //这句会使若有一个tile还在加载,就阻断了。原版是这么写的。但是为了加快加载速度,改成下面两行。感觉直接全部updateTile也没太卡,不知道很大的场景会不会卡,单帧updateTile次数超过100次的话(应该不会吧,地图大小会限制住个数) -- 2023.12
  29380. var childLoaded = this.children[p].update(entity, frustum, level - 1, 0.5 * tileSize, childCenterX, childCenterY, childTreeStr);
  29381. childrenLoaded = childrenLoaded && childLoaded;
  29382. } else {
  29383. if (this.children[p]) {
  29384. this.children[p].remove();
  29385. delete this.children[p];
  29386. }
  29387. }
  29388. }
  29389. }
  29390. return childrenLoaded && this.removeObject3D(), childrenLoaded; //子项加载完,母项mesh可以去除。(最后母项的母项以及前面的都会被删除,只留最后的叶子结点)
  29391. }
  29392. /*
  29393. 一层层往后加载。加入第一次加载到第4层(因为level精细度是第4层),给第4层可见tile加上mesh。
  29394. 然后下一次加载到第5层,那么第4层的mesh就要被清空(当它所属的第5层子集都加载完后)
  29395. */
  29396. }, {
  29397. key: "createTileObject",
  29398. value: function createTileObject(entity, tileSize, centerXatMap, centerYatMap) {
  29399. this.mesh = this.createMesh(entity.transformMapToLocal, tileSize, centerXatMap, centerYatMap);
  29400. this.mesh.name = this.name; //add
  29401. this.textureLoaded = !1;
  29402. var c = entity.mapSizeM / tileSize,
  29403. z = math$2.getBaseLog(2, c),
  29404. //以2为底c的对数
  29405. x = centerXatMap / tileSize + 0.5 * (c - 1),
  29406. y = -centerYatMap / tileSize + 0.5 * (c - 1),
  29407. p = entity.getTileUrl(Math.round(x), Math.round(y), Math.round(z)); //common.setObjectLayers(this.mesh, 'map' )
  29408. this.mesh.renderOrder = -(1e6 - z - 100 * (entity.zIndex || 0));
  29409. this.texURL = p;
  29410. /* let area = math.getArea(this.mesh.geometry.vertices.slice(0,3));
  29411. if(area >0){
  29412. this.mesh.visible = false
  29413. console.log('area>0',this.mesh.name)
  29414. } */
  29415. addLoadTile(this);
  29416. }
  29417. }, {
  29418. key: "createMesh",
  29419. value: function createMesh(transform, tileSize, centerXatMap, centerYatMap) {
  29420. var a = new THREE.Shim.Geometry();
  29421. var vertices = [[centerXatMap - tileSize / 2, centerYatMap - tileSize / 2], [centerXatMap + tileSize / 2, centerYatMap - tileSize / 2], [centerXatMap + tileSize / 2, centerYatMap + tileSize / 2], [centerXatMap - tileSize / 2, centerYatMap + tileSize / 2]];
  29422. vertices.forEach(function (vertice) {
  29423. a.vertices.push(new THREE.Vector3().fromArray([].concat(_toConsumableArray(transform.forward(vertice)), [0])));
  29424. });
  29425. a.faces.push(face1), a.faces.push(face2), a.faceVertexUvs[0].push(face1UV), a.faceVertexUvs[0].push(face2UV);
  29426. var b = new THREE.BufferGeometry().fromGeometry(a);
  29427. return new THREE.Mesh(b, this.createMaterial());
  29428. }
  29429. }, {
  29430. key: "createMaterial",
  29431. value: function createMaterial() {
  29432. var t = new THREE.MeshBasicMaterial({
  29433. transparent: !0,
  29434. depthWrite: !1,
  29435. depthTest: !0,
  29436. opacity: 0,
  29437. side: THREE.DoubleSide
  29438. });
  29439. if (window.ifTest) {
  29440. var colorHue = Math.random();
  29441. t.color = new THREE.Color().setHSL(colorHue, 0.6, 0.92);
  29442. } else {
  29443. t.color = this.tileColor ? this.tileColor : new THREE.Color(16777215);
  29444. }
  29445. return t;
  29446. }
  29447. }, {
  29448. key: "traverse",
  29449. value: function traverse(f) {
  29450. //add
  29451. return THREE.Mesh.prototype.traverse.call(this, f);
  29452. }
  29453. }, {
  29454. key: "remove",
  29455. value: function remove() {
  29456. this.removeObject3D(), this.removeChildren();
  29457. }
  29458. }, {
  29459. key: "removeObject3D",
  29460. value: function removeObject3D() {
  29461. !!this.mesh;
  29462. if (this.mesh) {
  29463. this.objectGroup.remove(this.mesh);
  29464. if (this.textureLoaded) {
  29465. var t = this.mesh.material.map;
  29466. t && t.dispose();
  29467. } else {
  29468. cancelLoad(this);
  29469. }
  29470. this.mesh.material.dispose(); //o.disposeMeshMaterial(this.mesh),
  29471. this.mesh.geometry.dispose();
  29472. this.mesh = void 0;
  29473. }
  29474. this.meshAdded = !1, this.textureLoaded = !1; //this.texURL && this.texURL.includes('testdata') && console.log('removeObject3D', this.id, 'hasMesh',hasMesh, this.texURL.split('map_tiles/')[1] )
  29475. }
  29476. }, {
  29477. key: "removeChildren",
  29478. value: function removeChildren() {
  29479. for (var t = 0, e = this.children; t < e.length; t++) {
  29480. var n = e[t];
  29481. n && (n.removeObject3D(), n.removeChildren());
  29482. }
  29483. this.children.length = 0;
  29484. }
  29485. }, {
  29486. key: "cancelChildren",
  29487. value: function cancelChildren() {
  29488. //子集全部停止加载
  29489. for (var t = 0, e = this.children; t < e.length; t++) {
  29490. var n = e[t];
  29491. n && (cancelLoad(n), n.cancelChildren());
  29492. }
  29493. }
  29494. }]);
  29495. return MapTile;
  29496. }();
  29497. var TiledMapOpenStreetMap = /*#__PURE__*/function (_TiledMapBase) {
  29498. _inherits(TiledMapOpenStreetMap, _TiledMapBase);
  29499. var _super3 = _createSuper$1e(TiledMapOpenStreetMap);
  29500. function TiledMapOpenStreetMap(mapLayer, tileColor) {
  29501. var _this3;
  29502. _classCallCheck(this, TiledMapOpenStreetMap);
  29503. //Potree.settings.mapCompany = 'google'
  29504. _this3 = _super3.call(this, 'map', mapLayer, tileColor
  29505. /* , projection */
  29506. ); //EPSG projection
  29507. //this.baseUrl = "https://wprd03.is.autonavi.com/appmaptile?style=7&x=${x}&y=${y}&z=${z}",
  29508. //this.baseUrl = "https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x=${x}&y=${y}&z=${z}" //最高只到18 level
  29509. _this3.switchStyle();
  29510. _this3.tileSizePx = 256;
  29511. _this3.mapSizeM = 40075017; //总占据多少米(地球赤道周长) 和三维空间的不一样 - -, 空间上的是直径,地图上的是半个圆周
  29512. _this3.bias = 0.5;
  29513. if (config$6.mapCompany == 'google') {
  29514. _this3.attribution = '© PopSmart, © 谷歌地图';
  29515. _this3.projection = 'EPSG:900913'; //"EPSG:4326"//4550
  29516. } else {
  29517. _this3.attribution = '© PopSmart, © 高德地图';
  29518. _this3.projection = 'EPSG:3857';
  29519. }
  29520. return _this3;
  29521. }
  29522. _createClass(TiledMapOpenStreetMap, [{
  29523. key: "getTileUrl",
  29524. value: function getTileUrl(x, y, z) {
  29525. return this.baseUrl.replace(/\${x}/, x.toString(10)).replace(/\${y}/, y.toString(10)).replace(/\${z}/, z.toString(10));
  29526. }
  29527. }, {
  29528. key: "switchStyle",
  29529. value: function switchStyle() {
  29530. var style = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'standard';
  29531. //if(Potree.settings.mapCompany == 'google')return
  29532. if (style == this.style) return;
  29533. if (config$6.mapCompany == 'google') {
  29534. var _ref = {
  29535. zh: ['zh-CN', 'cn'],
  29536. en: ['en-US'],
  29537. //范围大所以不指定地理位置 。
  29538. ja: ['ja-JP', 'JP'],
  29539. kr: ['ko-KR', 'KR']
  29540. }[Potree.settings.language] || [],
  29541. _ref2 = _slicedToArray(_ref, 2),
  29542. lang = _ref2[0],
  29543. glPos = _ref2[1];
  29544. this.baseUrl = 'https://mt2.google.com/vt/lyrs=' + (style == 'satellite' ? 'y' : 'm') + '@159000000' + (lang ? '&hl=' + lang : '') + (glPos ? '&gl=' + glPos : '') + '&x=${x}&y=${y}&z=${z}&s=mt1';
  29545. this.maxDepth = 22;
  29546. /* 1)lyrs= 表示的是图层类型,即瓦片类型,具体含义如下:
  29547. m:路线图
  29548. t:地形图
  29549. p:带标签的地形图
  29550. s:卫星图
  29551. y:带标签的卫星图
  29552. h:标签层(路名、地名等)
  29553. 2)& gl=CN 指定地理区域
  29554. 谷歌地图针对中国有两套坐标,一套做了偏移,一套没有。经测试在url加入gl=cn地图会有偏移。
  29555. Tips:如果谷歌地图和RTK测量的WGS84坐标有偏差,可以尝试在url里去掉& gl=cn。(摘自网上)
  29556. 通义千问:如果不指定gl参数,Google将使用默认值或基于其他因素(如IP地址)来推断用户的地理区域。这通常不会导致地图数据的不准确性,但可能会影响本地化信息的显示。地图上的标签(如街道名称、城市名称等)可能不会以最合适的语言显示。地址格式和拼写可能不符合当地标准
  29557. 5)&hl=
  29558. 设置地图注记文字语言类型,缺省默认为中文。
  29559. hl=nl 中英双语
  29560. hl=zh-CN 中文
  29561. */
  29562. } else {
  29563. //baseUrl = "https://webst01.is.autonavi.com/appmaptile?lang=zh_cn&style=6&yrs=m&x=${x}&y=${y}&z=${z}" //卫星 maxDepth = 18
  29564. //搜索高德地图瓦片url
  29565. if (config$6.isJiangMen) {
  29566. if (style == 'satellite') {
  29567. //卫星
  29568. this.maxDepth = 18;
  29569. this.baseUrl = 'http://a.map.jms.gd/tile/weixing/${z}/${x}/${y}.png';
  29570. } else {
  29571. this.maxDepth = 18;
  29572. this.baseUrl = 'http://a.map.jms.gd/tile/gd_xiangtu/${z}/${x}/${y}.png';
  29573. }
  29574. } else {
  29575. if (style == 'satellite') {
  29576. //卫星
  29577. this.maxDepth = 18;
  29578. this.baseUrl = 'https://webst01.is.autonavi.com/appmaptile?lang=zh_cn&style=6&yrs=m&x=${x}&y=${y}&z=${z}';
  29579. } else if (style == 'dark-standard') {
  29580. this.maxDepth = 18;
  29581. this.baseUrl = 'https://wprd01.is.autonavi.com/appmaptile?lang=zh_cn&style=8&yrs=m&x=${x}&y=${y}&z=${z}'; //路网 加上scl=2后去掉名字
  29582. } else {
  29583. this.maxDepth = 19;
  29584. this.baseUrl = 'https://wprd04.is.autonavi.com/appmaptile?lang=zh_cn&style=7&yrs=m&x=${x}&y=${y}&z=${z}'; //
  29585. }
  29586. } //详解 https://www.cnblogs.com/lucio110/p/17310054.html
  29587. }
  29588. this.style = style;
  29589. this.setEnable(false);
  29590. this.setEnable(true);
  29591. this.mapLayer.viewer.dispatchEvent('content_changed');
  29592. }
  29593. }]);
  29594. return TiledMapOpenStreetMap;
  29595. }(TiledMapBase);
  29596. var TiledMapFromEntity = /*#__PURE__*/function (_TiledMapBase2) {
  29597. _inherits(TiledMapFromEntity, _TiledMapBase2);
  29598. var _super4 = _createSuper$1e(TiledMapFromEntity);
  29599. function TiledMapFromEntity(mapLayer, tileColor, data) {
  29600. var _this4;
  29601. _classCallCheck(this, TiledMapFromEntity);
  29602. _this4 = _super4.call(this, 'floorplan', mapLayer, tileColor, 'LOCAL'
  29603. /* "EPSG:3857" */
  29604. /* "WGS84" */
  29605. ); //直接就是本地坐标,没有projec
  29606. var entity = _this4.tiledMapEntity = _this4.fillFromData(data);
  29607. var time = entity.updateTime || entity.createTime;
  29608. _this4.tileSizePx = entity.tileSizePx, _this4.mapSizeM = entity.mapSizeM, _this4.maxDepth = entity.maxDepth;
  29609. _this4.postStamp = time ? time.replace(/[^0-9]/gi, '') : new Date().getTime() //this.projection = n.crsLocal,
  29610. ;
  29611. _this4.zIndex = 0, _this4.tilePresenceMap = _this4.decodeBitStream(_this4.tiledMapEntity.quadtree); //包含tile分裂信息,如果写错了会造成tile显示不全
  29612. _this4.maxLoading = 5;
  29613. _this4.bias = 0.5; //越大加载层级越低,越模糊
  29614. if (window.devicePixelRatio >= 2 && window.innerHeight * window.innerWidth < 768 * 1024) {
  29615. //手机还是加载高清点(反正也不需要截图等待),但平板太大了,要铺满屏幕可能慢,所以稍微模糊点?(反正可以继续放大去看)
  29616. _this4.bias = 0; //level更高些
  29617. }
  29618. return _this4;
  29619. }
  29620. _createClass(TiledMapFromEntity, [{
  29621. key: "fillFromData",
  29622. value: function fillFromData(e) {
  29623. var data = {};
  29624. data.id = e.id;
  29625. data.globalLocation = new THREE.Vector3().fromArray(e.location); //测试场景 SG-hx-HBfpp585IXE通过,无rtk orient 0.02
  29626. var ori = e.orientation;
  29627. data.orientation = new THREE.Quaternion().fromArray([ori[1], ori[2], ori[3], ori[0]]).multiply(rot90); //数据集校准后这个好像不会变的
  29628. //指南针也有个旋转orientation,那个万一在数据集校准那改了就是四元数,还得改下?
  29629. data.filePath = config$6.resourceLaser + e.file_path; //`https://laser-oss.4dkankan.com${e.file_path}`
  29630. data.fileName = '$DEPTH/$X/$Y.png';
  29631. data.type = e.type, data.mapSizeM = e.map_size_m, data.tileSizePx = e.tile_size_px, data.maxDepth = e.max_depth, data.quadtree = e.quadtree, data.floorId = e.floor_id, data.bundleId = e.bundle_id; //this.computeLocalCoordinates()
  29632. return data;
  29633. }
  29634. }, {
  29635. key: "computeLocalCoordinates",
  29636. value: function computeLocalCoordinates() {
  29637. if (proj4.defs('LOCAL_MAP')) {
  29638. var lonlat = this.tiledMapEntity.globalLocation;
  29639. lonlat = this.mapLayer.transform.lonlatToLocal.forward(lonlat);
  29640. this.tiledMapEntity.location = new THREE.Vector3().copy(lonlat);
  29641. }
  29642. }
  29643. }, {
  29644. key: "updateProjection",
  29645. value: function updateProjection() {
  29646. _get(_getPrototypeOf(TiledMapFromEntity.prototype), "updateProjection", this).call(this);
  29647. if (!this.position) {
  29648. this.computeLocalCoordinates();
  29649. }
  29650. }
  29651. }, {
  29652. key: "position",
  29653. get: function get() {
  29654. return this.tiledMapEntity.location;
  29655. }
  29656. }, {
  29657. key: "quaternion",
  29658. get: function get() {
  29659. if (!this.orientationUser || typeof this.orientationUser == 'number') return this.tiledMapEntity.orientation;else return this.orientationUser.clone();
  29660. }
  29661. }, {
  29662. key: "getTileUrl",
  29663. value: function getTileUrl(x, y, z) {
  29664. var i = (this.tiledMapEntity.filePath + '/' + this.tiledMapEntity.fileName).replace(/\$DEPTH/g, z.toString(10)).replace(/\$X/g, x.toString(10)).replace(/\$Y/g, y.toString(10));
  29665. return i += '?t=' + this.postStamp;
  29666. }
  29667. }, {
  29668. key: "decodeBitStream",
  29669. value: function decodeBitStream(t) {
  29670. if (!t) return {
  29671. empty: !0
  29672. };
  29673. for (var e = {}, n = [e], i = 0; i < t.length; i++) {
  29674. var r = n.shift(),
  29675. o = parseInt(t.substr(i, 1), 16);
  29676. if (1 & o) {
  29677. var a = {};
  29678. r[0] = a, n.push(a);
  29679. }
  29680. 2 & o && (a = {}, r[1] = a, n.push(a)), 4 & o && (a = {}, r[2] = a, n.push(a)), 8 & o && (a = {}, r[3] = a, n.push(a));
  29681. }
  29682. var s = {
  29683. empty: !0
  29684. };
  29685. return this.computeHashes(s, e, ''), s;
  29686. }
  29687. }, {
  29688. key: "computeHashes",
  29689. value: function computeHashes(t, e, n) {
  29690. for (var i = 0; i < 4; i++) {
  29691. e[i] && (t[n + i.toString(10)] = !0, t.empty = !1, this.computeHashes(t, e[i], n + i.toString(10)));
  29692. }
  29693. }
  29694. }]);
  29695. return TiledMapFromEntity;
  29696. }(TiledMapBase);
  29697. /*
  29698. note:
  29699. 目前缩小了能看出形态是一个地球。相机在高空朝下观测,地球平放着。
  29700. 所以越靠近赤道和地球朝上的那面所在的中央经度(也就是local 0,0,0所对应的初始经度),tile越接近正方形。
  29701. 所以在两极地区要怎么显示?
  29702. 注册地理坐标时需要滚动地球吗?(修改初始经度、重定义NAVVIS:TMERC, 就需要更新所有三维世界中的物体位置)
  29703. 切换中心点:
  29704. var locationLonLat = viewer.transform.lonlatToLocal.inverse(viewer.mapViewer.camera.position.clone())
  29705. proj4.defs("LOCAL_MAP", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat.x.toPrecision(15) + " +lat_0=" + locationLonLat.y.toPrecision(15));
  29706. viewer.mapViewer.mapLayer.maps[0].transformMapToLocal = null
  29707. 地理注册部分地图上的1和2标记有两层意思。当地图全屏展示时,标记的是当前右侧经纬度的位置;当地图为小窗时,标记的是对应场景里三维位置。(所以感觉最好换一个ui?)且在2023.2.1之前才改好,之前都是后者。
  29708. 为什么边缘总是有奇怪的mesh,是因为有顶点到背面了吗
  29709. https://lbs.amap.com/tools/picker 高德坐标拾取器(手机登录),但和这里展示的不一样, 要用AMapWith84.aMapToWgs84({x: ,y: })转成84。 (qq or 手机登录) 所以potree本地和有AMapWith84函数的laser地图展现不一样
  29710. https://www.google.com/maps/@77.7730021,-34.4952712,4z google取点
  29711. 打印所有mapTile的名字,字符串最长的代表有显示的mesh。
  29712. viewer.mapViewer.mapLayer.maps[0].baseTile.traverse(function(e){console.log(e.name)})
  29713. 能查看有几个显示的mesh
  29714. viewer.mapViewer.mapLayer.maps[0].objectGroup.children
  29715. 图片地址中 tiles/4/3/9.png 第一个数字越高代表level越高,放得越大 . (tile.name.length也能反映出
  29716. viewer.mapViewer.mapLayer.maps[1].objectGroup.children.map(e=>e.name.length-1)
  29717. 目前看的几个场景floorplan原图是1米=33.03个像素 图宽度= 512*2^(max_depth-1) , map_size_m 代表整个地图是多少米
  29718. 由于floorplan宽度有限制,最大32768所以不一定是33.03px, scale = resolution.width/(bound.x_max-bound.x_min), 参数见算法那边的json
  29719. 经纬度精度小数点后5位为米级别,6位为分米,7位是厘米
  29720. */
  29721. 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); }; }
  29722. 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; } }
  29723. var FloorplanCamera = /*#__PURE__*/function (_THREE$OrthographicCa) {
  29724. _inherits(FloorplanCamera, _THREE$OrthographicCa);
  29725. var _super = _createSuper$1d(FloorplanCamera);
  29726. function FloorplanCamera(dom) {
  29727. var _this;
  29728. _classCallCheck(this, FloorplanCamera);
  29729. _this = _super.call(this);
  29730. var aspect = window.innerWidth / window.innerHeight;
  29731. _this = _super.call(this, -constants$4.orthoBase, constants$4.orthoBase, constants$4.orthoBase / aspect, -constants$4.orthoBase / aspect, constants$4.orthoNear, constants$4.orthoFar);
  29732. _this.controls = null;
  29733. _this.updateAspect(aspect);
  29734. return _this;
  29735. } //xzw 修改
  29736. _createClass(FloorplanCamera, [{
  29737. key: "updateAspect",
  29738. value: function updateAspect(aspect) {
  29739. if (isNaN(aspect)) aspect = 1;
  29740. this.aspect = aspect; // this.top = constants.orthoBase / aspect
  29741. // this.bottom = -constants.orthoBase / aspect
  29742. // this.updateProjectionMatrix()
  29743. }
  29744. }]);
  29745. return FloorplanCamera;
  29746. }(THREE.OrthographicCamera);
  29747. var ControlActions = {
  29748. NONE: -1,
  29749. ROTATE: 0,
  29750. DOLLY: 1,
  29751. PAN: 2,
  29752. ROTATE_DOLLY: 3,
  29753. PAN_DOLLY: 4
  29754. };
  29755. 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); }; }
  29756. 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; } }
  29757. /** 注:
  29758. * 1.球坐标:更方便计算球面位置 https://en.wikipedia.org/wiki/Spherical_coordinate_system
  29759. * 2.轨道视角OrbitView: 常见的相机视图,相机绕一点(通常为3D模型中心)做球面运动,视点锁定球心 。参见THREE.OrbitControls https://threejs.org/examples/?q=controls#misc_controls_orbit
  29760. * 3.刚体对象:刚体是图形应用物理引擎中重要的物理模型对象,只考虑平移,旋转的物理量。更多参见 Unity Rigibody类 https://docs.unity3d.com/Manual/class-Rigidbody.html
  29761. */
  29762. /**
  29763. * 功能:漫游场景之外视角控制,主要是实现了常见的轨道视角(OrbitView),即拖拽旋转(Rotate),平移(Pan),放大缩小(Zoom),PanoramaControls和FloorplanControls的父类,两个子类的视角是基于轨道视角进行不同的限制实现的
  29764. * 原理:实现轨道视角(通过球坐标计算相机位置,使相机绕一点做球面运动,相机视角保持锁定球心)
  29765. * 注: Rotate 行为是改变相机位于球坐标的位置,引发的旋转,因为视角是锁定球心的
  29766. * Zoom 行为是改变球半径,使相机距不同位置得到不同视图大小,达到缩放
  29767. * Pan 行为是改变球心位置,使轨道偏移达到视图平移效果
  29768. */
  29769. var OutsideControls = /*#__PURE__*/function (_EventEmitter) {
  29770. _inherits(OutsideControls, _EventEmitter);
  29771. var _super = _createSuper$1c(OutsideControls);
  29772. function OutsideControls(camera, dom, player) {
  29773. var _this;
  29774. _classCallCheck(this, OutsideControls);
  29775. _this = _super.call(this);
  29776. _this.setAutoPanPosition = function (e, t) {
  29777. var i = new THREE.Vector3(),
  29778. n = new THREE.Vector3();
  29779. return function (e, t) {
  29780. i.copy(this.camera.position), void 0 === e && null === e || i.setX(e), void 0 === t && null === t || i.setZ(t);
  29781. var r = this.camera.position.distanceTo(this.target),
  29782. settings = Vector3.FORWARD.clone().applyQuaternion(this.camera.quaternion);
  29783. 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();
  29784. };
  29785. }();
  29786. _this.camera = camera;
  29787. _this.camera.controls = _assertThisInitialized(_this);
  29788. _this.player = player;
  29789. _this.enabled = !1;
  29790. _this.target = new THREE.Vector3(); //相机视点,轨道视角下也始终是相机轨道所处球坐标的球心
  29791. //Zoom
  29792. _this.targetBounds = new THREE.Box3(); //包围盒,通过碰撞检测用于限定相机的远近范围
  29793. _this.zoomSpeed =
  29794. /* config.isEdit ? 2.3 : */
  29795. 1; //视角缩放的速率
  29796. _this.minDistance = 0; //最小距离,相机离球心的最小距离
  29797. _this.maxDistance = 1 / 0; //最大距离,相机离球心的最大距离
  29798. _this.scale = 1; //缩放比率,zoom操作下的相机轨道半径与正常轨道半径的比率
  29799. _this.dollyStart = new THREE.Vector2(); //推拉镜头操作下记录前一帧的交互点
  29800. _this.dollyEnd = new THREE.Vector2(); //推拉镜头操作下记录当前帧的交互点
  29801. _this.dollyDelta = new THREE.Vector2(); //推拉镜头操作下相机当前帧的瞬时位移
  29802. //Rotate
  29803. _this.noRotateUpDown = !1; //禁用竖直方向的旋转,此处即为禁止相机纬度上的移动,用于俯视视角FloorplanControls
  29804. _this.rotateSpeed = 1; //相机绕球心旋转速率
  29805. _this.keyboardZoomSpeed = 0; //键盘控制下的视角缩放速率
  29806. _this.keyPanSpeed = 7; //键盘控制下的平移速率
  29807. _this.autoRotate = !1; //自动旋转
  29808. _this.autoRotateSpeed = 2; //自动旋转速率
  29809. _this.minPolarAngle = THREE.MathUtils.degToRad(25); //最小纬度,用于限时相机的视角
  29810. _this.maxPolarAngle = THREE.MathUtils.degToRad(65); //最大纬度,用于限时相机的视角
  29811. _this.rotationAcceleration = new THREE.Vector2(); //旋转角加速度
  29812. _this.rotationSpeed = new THREE.Vector2(); //旋转角速度
  29813. _this.rotateStart = new THREE.Vector2(); //旋转操作下记录上次交互事件产生的交互点坐标
  29814. _this.rotateEnd = new THREE.Vector2(); //旋转操作下记录本次交互事件产生的交互点坐标
  29815. _this.rotateDelta = new THREE.Vector2(); //旋转操作下最近两次交互事件之间的瞬时角位移
  29816. _this.phiDelta = 0; //每帧瞬时水平角位移,由rotateDelta.x累加得到
  29817. _this.thetaDelta = 0; //每帧瞬时竖直角位移,由rotateDelta.y累加得到
  29818. _this.rotateCenter = new THREE.Vector2();
  29819. _this.rotateStartVec = new THREE.Vector2();
  29820. _this.rotateEndVec = new THREE.Vector2(); //Pan
  29821. _this.autoPan = !1; //自动平移
  29822. _this.autoPanPosition = new THREE.Vector3(); //自动平移的球心位置
  29823. _this.panAcceleration = new THREE.Vector2(); //平移加速度
  29824. _this.panSpeed = new THREE.Vector2(); //平移速度
  29825. _this.panStart = new THREE.Vector2(); //平移操作下上次交互事件产生的交互点坐标
  29826. _this.panEnd = new THREE.Vector2(); //平移操作下本次交互事件产生的交互点坐标
  29827. _this.panDelta = new THREE.Vector2(); //平移操作下最近两次交互事件之间的瞬时位移
  29828. _this.panOffset = new THREE.Vector3(); //panLeft(), panUp() 用到的瞬时位移
  29829. _this.panVector = new THREE.Vector3(); //每帧平移的总偏移量(交互产生的偏移量),由panDelta累加得到
  29830. _this.offset = new THREE.Vector3(); //每帧最终的有效偏移量(panVector 经过 clamp 操作限制范围后的偏移)
  29831. //注:交互事件瞬时位移(delta)与 帧瞬时位移(offset),产生的原因是事件交互的频率与帧更新的频率不同,eg:mousemove 约8ms < deltaTime 16.6ms
  29832. _this.lastPosition = new THREE.Vector3(); //记录当前帧相机位置
  29833. _this.state = ControlActions.NONE; //当前控制器的模式,决定了mouseAction
  29834. //鼠标行为 在子类中定义
  29835. _this.mouseActions = {};
  29836. _this.touchActions = {};
  29837. _this.lastMoveTime = 0;
  29838. _this.pointersLimit = 2;
  29839. _this.pointers = [];
  29840. _this.angle = 1e-6;
  29841. return _this;
  29842. }
  29843. /**
  29844. * 设定tagetBound
  29845. * @param {THREE.Box3} bound
  29846. */
  29847. _createClass(OutsideControls, [{
  29848. key: "setBounds",
  29849. value: function setBounds(bound) {
  29850. this.targetBounds = bound;
  29851. }
  29852. /**
  29853. * 判断控制器空闲状态
  29854. */
  29855. }, {
  29856. key: "isEngaged",
  29857. value: function isEngaged() {
  29858. return this.state !== ControlActions.NONE;
  29859. }
  29860. /**
  29861. * 水平旋转,通过改变相机球坐标的经度
  29862. * @param {number} angle 旋转的角度(degree)
  29863. */
  29864. }, {
  29865. key: "rotateLeft",
  29866. value: function rotateLeft(angle) {
  29867. void 0 === angle && (angle = this.getAutoRotationAngle());
  29868. this.thetaDelta -= angle; //计算每帧瞬时角位移,与鼠标移动方向相反
  29869. }
  29870. /**
  29871. * 竖直旋转,通过改变相机球坐标的纬度
  29872. * @param {number} angle 旋转的角度(degree)
  29873. */
  29874. }, {
  29875. key: "rotateUp",
  29876. value: function rotateUp(angle) {
  29877. if (!this.noRotateUpDown) {
  29878. void 0 === angle && (angle = this.getAutoRotationAngle());
  29879. this.phiDelta -= angle;
  29880. }
  29881. }
  29882. /**
  29883. * 水平平移,通过改变相机轨道的球心使轨道平移
  29884. */
  29885. }, {
  29886. key: "panLeft",
  29887. value: function panLeft(e) {
  29888. if (isNaN(e)) e = 0; //防止floorplan模式屏幕宽度为0过后黑屏
  29889. var t = this.camera.matrix.elements; //从相机矩阵提取计算相机方向向量于XZ平面的投影
  29890. this.panOffset.set(t[0], 0, t[2]).normalize(), this.panOffset.multiplyScalar(-e), this.panVector.add(this.panOffset);
  29891. }
  29892. }, {
  29893. key: "panUp",
  29894. value: function panUp(e) {
  29895. if (isNaN(e)) e = 0; //防止floorplan模式屏幕宽度为0过后黑屏
  29896. var t = this.camera.matrix.elements;
  29897. this.panOffset.set(t[4], 0, t[6]).normalize(), this.panOffset.multiplyScalar(-e), this.panVector.add(this.panOffset);
  29898. }
  29899. }, {
  29900. key: "stopAutoPanning",
  29901. value: function stopAutoPanning() {
  29902. var e = this.autoPan;
  29903. this.autoPan = !1, this.emit(this.targetClamped ? ControlEvents.AutoPanClamped : e ? ControlEvents.AutoPanInterrupt : ControlEvents.AutoPanComplete);
  29904. }
  29905. /**
  29906. * 俯视视角下的缩小
  29907. */
  29908. }, {
  29909. key: "dollyIn",
  29910. value: function dollyIn(e) {
  29911. void 0 === e && (e = this.getZoomScale()), this.scale /= e;
  29912. }
  29913. /**
  29914. * 俯视视角下的放大
  29915. */
  29916. }, {
  29917. key: "dollyOut",
  29918. value: function dollyOut(e) {
  29919. void 0 === e && (e = this.getZoomScale()); //e<1时是放大 反之缩小
  29920. this.scale *= e;
  29921. }
  29922. /**
  29923. * 更新Pan操作,主要是用刚体运动规则计算每一帧的瞬时球心坐标
  29924. */
  29925. }, {
  29926. key: "updatePan",
  29927. value: function updatePan(e) {
  29928. this.panSpeed.multiplyScalar(1 - settings$3.panFriction).addScaledVector(this.panAcceleration, settings$3.panAccelerationOutside * e); //计算球心移动的瞬时速度
  29929. this.pan(-this.panSpeed.x, this.panSpeed.y); //球心移动的瞬时坐标
  29930. //自动Pan到一个设定的位置
  29931. if (this.autoPan) {
  29932. var offset = new THREE.Vector3().copy(this.autoPanPosition).sub(this.camera.position); //根据当前位置算出偏移矢量
  29933. offset.setY(0).clampLength(0, 50 * e); //位移忽略Y轴
  29934. this.target.add(offset); //得到新的球心target
  29935. this.camera.position.add(offset); //相应地相机的平移量与球心一致,于是相机移到新的球面轨道
  29936. if (this.autoPanPosition.x === this.camera.position.x && this.autoPanPosition.z === this.camera.position.z) {
  29937. //如果相机位置与要Pan的位置一致,没必要进行自动Pan
  29938. this.autoPan = !1;
  29939. this.stopAutoPanning();
  29940. }
  29941. }
  29942. }
  29943. /**
  29944. * 主循环更新,更新轨道视角OrbitView 的 Roatate, Pan, Zoom 行为参数,根本上是计算球坐标下相机的球面轨道坐标,球心位置,运动规律符合刚体运动的物理法则
  29945. * 注:刚体是图形应用物理引擎中重要的物理模型对象,借助牛顿第二定律进行计算。更多参见 Unity Rigibody类 https://docs.unity3d.com/Manual/class-Rigidbody.html
  29946. */
  29947. }, {
  29948. key: "update",
  29949. value: function update(e, type) {
  29950. if (this.updateForCad && !this.screenshot) {
  29951. return;
  29952. }
  29953. e || (e = 1 / 60); // e 即是 帧间隔时间deltaTime 用于稳定物理运动而不受帧率影响,更多请见 https://blog.csdn.net/ChinarCSDN/article/details/82914420 或 搜索Unity Time类
  29954. var friction = Math.min(1, settings$3.rotationFriction * e * 60); //add 如果deltaTime > 1/ 60 (比较卡),就增加rotationFriction, 以防止转动过久
  29955. this.rotationSpeed.multiplyScalar(1 - friction).addScaledVector(this.rotationAcceleration, settings$3.rotationAccelerationOutside * e); //计算瞬时角速度
  29956. this.rotateLeft(-this.rotationSpeed.x); //根据角速度进行角位移
  29957. this.noRotateUpDown || this.rotateUp(this.rotationSpeed.y);
  29958. this.updatePan(e); //计算 球心坐标(target)到 相机坐标(cameraPosition)的向量(offset),包含方向和距离信息
  29959. var cameraPosition = this.camera.position;
  29960. this.offset.copy(cameraPosition).sub(this.target); //Rotate
  29961. var lon = Math.atan2(this.offset.x, this.offset.z),
  29962. //根据offset与z轴夹角算出经度lon,
  29963. lat = Math.atan2(Math.sqrt(this.offset.x * this.offset.x + this.offset.z * this.offset.z), this.offset.y); //与y轴夹角算出纬度lat
  29964. this.autoRotate && this.rotateLeft(this.getAutoRotationAngle()); //计算自动旋转的每帧角位移thetaDelta
  29965. lon += this.thetaDelta; //原本角位移与每帧角位移累加
  29966. lat += this.phiDelta; //原本角位移与每帧角位移累加
  29967. lat = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, lat)); //纬度限制在预定义的范围内,进而限制轨道相机的俯仰角
  29968. lat = Math.max(this.angle, Math.min(Math.PI - this.angle, lat));
  29969. this.lon = lon, this.lat = lat; //xzw add for cad compass
  29970. //Zoom
  29971. var radius = this.updateZoom(); //获取Zoom操作后的球半径
  29972. radius = Math.max(this.minDistance, Math.min(this.maxDistance, radius)); //半径限制在自定义范围内
  29973. //Pan 更新球轨道球心位置
  29974. this.target.add(this.panVector); //球心位置加上Pan操作后球心的偏移向量panVector
  29975. this.targetBounds.clampPoint(this.target, this.target); //最终球心坐标限制在自定义BoudingBox的立方体范围内。
  29976. //新的半径求新的offset(球心->相机),用于得到新轨道下相机的位置。
  29977. //注:相机位置为什么不直接加上panVector? 因为此情况下相机偏移不等于panVector
  29978. //1.Zoom改变球半径
  29979. //2.Pan操作被限制在自定义范围,球心偏移可能小于panVector
  29980. this.offset.x = radius * Math.sin(lat) * Math.sin(lon);
  29981. this.offset.y = radius * Math.cos(lat);
  29982. this.offset.z = radius * Math.sin(lat) * Math.cos(lon); //根据新的offset与球心得到相机新的轨道坐标 //Position
  29983. cameraPosition.copy(this.target).add(this.offset); //轨道视角下相机视点锁定球心 //Rotation
  29984. this.camera.lookAt(this.target); //重置 防止干扰其他地方的引用
  29985. this.thetaDelta = 0;
  29986. this.phiDelta = 0;
  29987. this.scale = 1;
  29988. this.panVector.set(0, 0, 0); //记录当前帧相机的位置
  29989. if (this.lastPosition.distanceTo(this.camera.position) > 0) {
  29990. this.lastPosition.copy(this.camera.position);
  29991. }
  29992. }
  29993. /**
  29994. * 角速度 角度转弧度
  29995. */
  29996. }, {
  29997. key: "getAutoRotationAngle",
  29998. value: function getAutoRotationAngle() {
  29999. return 2 * Math.PI / 60 / 60 * this.autoRotateSpeed;
  30000. }
  30001. }, {
  30002. key: "getZoomScale",
  30003. value: function getZoomScale() {
  30004. return Math.pow(0.95, this.zoomSpeed);
  30005. }
  30006. /**
  30007. * 鼠标点击行为
  30008. */
  30009. }, {
  30010. key: "onMouseDown",
  30011. value: function onMouseDown(mouseEvent) {
  30012. if (this.enabled) {
  30013. mouseEvent.preventDefault(); // this.player.model._3dTilesRuntime.pauseTilesetUpdate(true)
  30014. // this.player.model._3dTilesRuntime.clearLoadingTiles()
  30015. this.stopAutoPanning();
  30016. this.mouseDown = !0;
  30017. this.state = this.mouseActions[mouseEvent.button];
  30018. switch (this.state) {
  30019. case ControlActions.ROTATE:
  30020. this.rotateStart.set(mouseEvent.clientX, mouseEvent.clientY); //this.rotateStart.set(mouseEvent.clientX, this.noRotateUpDown ? 0 : mouseEvent.clientY);
  30021. this.rotationSpeed.set(0, 0);
  30022. if (this.noRotateUpDown) {
  30023. //floorplan
  30024. this.rotateCenter = convertTool.getPos2d(this.target, this.player).pos;
  30025. this.rotateStartVec.subVectors(this.rotateStart, this.rotateCenter);
  30026. }
  30027. break;
  30028. case ControlActions.DOLLY:
  30029. this.dollyStart.set(mouseEvent.clientX, mouseEvent.clientY);
  30030. break;
  30031. case ControlActions.PAN:
  30032. this.panStart.set(mouseEvent.clientX, mouseEvent.clientY);
  30033. }
  30034. this.emit(ControlEvents.InputStart, 'mouse');
  30035. }
  30036. } //控制模型
  30037. }, {
  30038. key: "onMouseMove",
  30039. value: function onMouseMove(mouseEvent) {
  30040. if (this.enabled && this.mouseDown && 0 !== mouseEvent.buttons) {
  30041. mouseEvent.preventDefault();
  30042. switch (this.state) {
  30043. case ControlActions.ROTATE:
  30044. this.rotateEnd.set(mouseEvent.clientX, mouseEvent.clientY);
  30045. if (this.noRotateUpDown) {
  30046. //floorplan
  30047. this.rotateEndVec.subVectors(this.rotateEnd, this.rotateCenter);
  30048. var angle = math$2.getVec2Angle(this.rotateStartVec, this.rotateEndVec);
  30049. var rotateEndVec_ = new THREE.Vector3(this.rotateEndVec.x, this.rotateEndVec.y, 0);
  30050. var rotateStartVec_ = new THREE.Vector3(this.rotateStartVec.x, this.rotateStartVec.y, 0);
  30051. if (rotateEndVec_.clone().cross(rotateStartVec_).z < 0) {
  30052. angle *= -1;
  30053. }
  30054. this.rotateLeft(angle);
  30055. this.rotateStartVec.copy(this.rotateEndVec);
  30056. } else {
  30057. //dollhouse
  30058. this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart);
  30059. this.rotateLeft(2 * Math.PI * this.rotateDelta.x / this.player.domElement.clientWidth * this.rotateSpeed);
  30060. this.rotateUp(2 * Math.PI * this.rotateDelta.y / this.player.domElement.clientHeight * this.rotateSpeed);
  30061. this.rotateStart.copy(this.rotateEnd);
  30062. }
  30063. break;
  30064. case ControlActions.DOLLY:
  30065. this.dollyEnd.set(mouseEvent.clientX, mouseEvent.clientY), this.dollyDelta.subVectors(this.dollyEnd, this.dollyStart);
  30066. var t = this.dollyDelta.y > 0 ? this.dollyIn : this.dollyOut;
  30067. t.call(this), this.dollyStart.copy(this.dollyEnd);
  30068. break;
  30069. case ControlActions.PAN:
  30070. this.panEnd.set(mouseEvent.clientX, mouseEvent.clientY);
  30071. this.panDelta.subVectors(this.panEnd, this.panStart);
  30072. this.pan(this.panDelta.x, this.panDelta.y);
  30073. this.panStart.copy(this.panEnd);
  30074. }
  30075. this.emit(ControlEvents.Move, 'mouse');
  30076. this.lastMoveTime = mouseEvent.timeStamp;
  30077. this.update(); //同步
  30078. var info = {};
  30079. info.quaternion = {
  30080. _w: this.camera.quaternion._w,
  30081. _x: this.camera.quaternion._x,
  30082. _y: this.camera.quaternion._y,
  30083. _z: this.camera.quaternion._z
  30084. };
  30085. info.position = {
  30086. x: this.camera.position.x,
  30087. y: this.camera.position.y,
  30088. z: this.camera.position.z
  30089. };
  30090. info.target = {
  30091. x: this.target.x,
  30092. y: this.target.y,
  30093. z: this.target.z
  30094. };
  30095. this.player.emit(PlayerEvents.MoveModel, {
  30096. info: info,
  30097. mode: this.player.mode,
  30098. type: 'moveModel'
  30099. });
  30100. }
  30101. }
  30102. }, {
  30103. key: "onMouseUp",
  30104. value: function onMouseUp(mouseEvent) {
  30105. if (this.enabled) {
  30106. this.mouseDown = !1;
  30107. this.state = ControlActions.NONE;
  30108. if ('mouseover' !== mouseEvent.type) {
  30109. if (mouseEvent.timeStamp > this.lastMoveTime + 100) {
  30110. this.rotationSpeed.set(0, 0);
  30111. this.rotationAcceleration.set(0, 0);
  30112. } else {
  30113. this.rotationAcceleration.set(-this.rotateDelta.x, this.rotateDelta.y);
  30114. }
  30115. this.update();
  30116. this.rotationAcceleration.set(0, 0);
  30117. this.rotateDelta.set(0, 0);
  30118. }
  30119. }
  30120. }
  30121. }, {
  30122. key: "onMouseOver",
  30123. value: function onMouseOver(mouseEvent) {
  30124. 0 !== mouseEvent.which && 0 !== mouseEvent.buttons || this.onMouseUp(mouseEvent);
  30125. }
  30126. }, {
  30127. key: "onMouseWheel",
  30128. value: function onMouseWheel(wheelEvent) {
  30129. if (this.enabled && settings$3.useWheel) {
  30130. this.emit(ControlEvents.Move, 'wheel');
  30131. var t = wheelEvent.wheelDelta || -wheelEvent.detail;
  30132. var func = this.dollyIn;
  30133. if (t > 0) {
  30134. func = this.dollyOut;
  30135. }
  30136. func.call(this);
  30137. this.update(); //同步
  30138. var info = {}; //俯视图情况
  30139. if (this.player.mode === Viewmode$1.FLOORPLAN) {
  30140. info.scale = this.absoluteScale;
  30141. this.player.emit(PlayerEvents.MoveModel, {
  30142. info: info,
  30143. mode: Viewmode$1.FLOORPLAN,
  30144. type: 'moveModel'
  30145. });
  30146. } //dollhouse情况
  30147. else if (this.player.mode === Viewmode$1.DOLLHOUSE) {
  30148. info.quaternion = this.camera.quaternion;
  30149. info.position = this.camera.position;
  30150. info.target = this.target;
  30151. this.player.emit(PlayerEvents.MoveModel, {
  30152. info: info,
  30153. mode: Viewmode$1.DOLLHOUSE,
  30154. type: 'moveModel'
  30155. });
  30156. }
  30157. }
  30158. }
  30159. }, {
  30160. key: "onKeyDown",
  30161. value: function onKeyDown(keyboardEvent) {
  30162. if (this.enabled) {
  30163. if (keyboardEvent.metaKey || keyboardEvent.ctrlKey) ; else {
  30164. keyboardEvent.preventDefault();
  30165. this.handleKeyDown(keyboardEvent.which);
  30166. }
  30167. }
  30168. }
  30169. }, {
  30170. key: "navRotationAcc",
  30171. value: function navRotationAcc(e, t) {
  30172. 'y' === e ? this.noRotateUpDown ? this.keyboardZoomSpeed = t : this.rotationAcceleration.y = t : this.rotationAcceleration.x = t;
  30173. }
  30174. }, {
  30175. key: "navPanAcc",
  30176. value: function navPanAcc(e, t) {
  30177. this.stopAutoPanning(), this.panAcceleration[e] = t;
  30178. }
  30179. }, {
  30180. key: "handleKeyDown",
  30181. value: function handleKeyDown(keyValue) {
  30182. var t = !0;
  30183. switch (keyValue) {
  30184. case Keys.UPARROW:
  30185. case Keys.I:
  30186. this.navRotationAcc('y', 1);
  30187. break;
  30188. case Keys.DOWNARROW:
  30189. case Keys.K:
  30190. this.navRotationAcc('y', -1);
  30191. break;
  30192. case Keys.LEFTARROW:
  30193. case Keys.J:
  30194. this.navRotationAcc('x', -1);
  30195. break;
  30196. case Keys.RIGHTARROW:
  30197. case Keys.L:
  30198. this.navRotationAcc('x', 1);
  30199. break;
  30200. case Keys.W:
  30201. this.navPanAcc('y', 1);
  30202. break;
  30203. case Keys.S:
  30204. this.navPanAcc('y', -1);
  30205. break;
  30206. case Keys.A:
  30207. this.navPanAcc('x', -1);
  30208. break;
  30209. case Keys.D:
  30210. this.navPanAcc('x', 1);
  30211. break;
  30212. default:
  30213. t = !1;
  30214. }
  30215. t && this.emit(ControlEvents.Move, 'key');
  30216. }
  30217. }, {
  30218. key: "onKeyUp",
  30219. value: function onKeyUp(keyboardEvent) {
  30220. if (this.enabled) {
  30221. keyboardEvent.preventDefault();
  30222. keyboardEvent.stopPropagation();
  30223. this.handleKeyUp(keyboardEvent.which);
  30224. }
  30225. }
  30226. }, {
  30227. key: "handleKeyUp",
  30228. value: function handleKeyUp(keyValue) {
  30229. switch (keyValue) {
  30230. case Keys.I:
  30231. case Keys.K:
  30232. case Keys.UPARROW:
  30233. case Keys.DOWNARROW:
  30234. this.keyboardZoomSpeed = 0, this.rotationAcceleration.y = 0;
  30235. break;
  30236. case Keys.J:
  30237. case Keys.L:
  30238. case Keys.LEFTARROW:
  30239. case Keys.RIGHTARROW:
  30240. this.rotationAcceleration.x = 0;
  30241. break;
  30242. case Keys.S:
  30243. case Keys.W:
  30244. this.panAcceleration.y = 0;
  30245. break;
  30246. case Keys.A:
  30247. case Keys.D:
  30248. this.panAcceleration.x = 0;
  30249. }
  30250. }
  30251. }, {
  30252. key: "onTouchStart",
  30253. value: function onTouchStart(pointerEvent) {
  30254. console.log(this.enabled, this.state === ControlActions.NONE);
  30255. if (this.enabled || this.state === ControlActions.NONE) {
  30256. //pointerEvent.preventDefault()//xzw注释for mapViewer 按钮点不了
  30257. pointerEvent.stopPropagation();
  30258. this.stopAutoPanning();
  30259. var dolly = function () {
  30260. if (2 === pointerEvent.touches.length) {
  30261. var t = pointerEvent.touches[0].pageX - pointerEvent.touches[1].pageX,
  30262. i = pointerEvent.touches[0].pageY - pointerEvent.touches[1].pageY;
  30263. this.dollyStart.set(t, i);
  30264. }
  30265. }.bind(this),
  30266. pan = function () {
  30267. this.panStart.set(common$1.average(pointerEvent.touches, 'pageX'), common$1.average(pointerEvent.touches, 'pageY'));
  30268. }.bind(this),
  30269. rotate = function () {
  30270. if (this.noRotateUpDown) {
  30271. //floorplan
  30272. if (!pointerEvent.touches[1]) {
  30273. console.error('!pointerEvent.touches[0]11');
  30274. }
  30275. var touch0 = new THREE.Vector2(pointerEvent.touches[0].pageX, pointerEvent.touches[0].pageY);
  30276. var touch1 = new THREE.Vector2(pointerEvent.touches[1].pageX, pointerEvent.touches[1].pageY);
  30277. this.rotateStartVec.subVectors(touch0, touch1);
  30278. this.rotateStart = touch0; //上次的touch0
  30279. this.rotateCenter = convertTool.getPos2d(this.target, this.player).pos; //target在二维上的位置, 是旋转和缩放的中心
  30280. } else {
  30281. //dollhouse
  30282. this.rotateStart.set(common$1.average(pointerEvent.touches, 'pageX'), common$1.average(pointerEvent.touches, 'pageY'));
  30283. }
  30284. }.bind(this);
  30285. this.state = this.touchActions[pointerEvent.touches.length];
  30286. switch (this.state) {
  30287. case ControlActions.PAN_DOLLY:
  30288. //switch语句原理是跳转到caseX位置执行剩下的语句,直到最后或者遇见break为止
  30289. dolly();
  30290. case ControlActions.PAN:
  30291. pan();
  30292. break;
  30293. case ControlActions.ROTATE_DOLLY:
  30294. dolly();
  30295. case ControlActions.ROTATE:
  30296. rotate();
  30297. //floorplan 单指会执行 2 双指34
  30298. //dollhouse 单指会执行 4 双指1
  30299. }
  30300. this.rotationSpeed.set(0, 0);
  30301. this.emit(ControlEvents.InputStart, 'touch');
  30302. }
  30303. }
  30304. }, {
  30305. key: "onTouchMove",
  30306. value: function onTouchMove(pointerEvent) {
  30307. if (!pointerEvent.changedTouches) return; //#43188 测试发现有时候pointEvent会卡住,暂时只处理touchEvent对象
  30308. if (this.enabled && this.state !== ControlActions.NONE) {
  30309. var stateNow = this.touchActions[pointerEvent.touches.length];
  30310. if (stateNow != this.state) {
  30311. //iphoneX 在touchmove到别的ui时的时touches个数会与touchstart时不一样
  30312. return; //console.error('state更改')
  30313. }
  30314. pointerEvent.preventDefault();
  30315. pointerEvent.stopPropagation(); //console.log('onTouchMove',pointerEvent.touches)
  30316. //缩放直接修改相机projectionMatrix (currentScale), 平移和旋转则修改相机modelMatrix
  30317. var scale = function () {
  30318. //根据双指距离直接缩放(假定手指所在的三维位置在缩放后应该不变,所以缩放比率为手指在屏幕上的距离变化)
  30319. var t = pointerEvent.touches[0].pageX - pointerEvent.touches[1].pageX,
  30320. i = pointerEvent.touches[0].pageY - pointerEvent.touches[1].pageY;
  30321. this.dollyEnd.set(t, i);
  30322. var scale = this.dollyEnd.length() / this.dollyStart.length();
  30323. if (scale > 1) {
  30324. //放大
  30325. //this.dollyOut(1/scale);
  30326. this.dollyIn(scale); //console.log("放大"+scale)
  30327. } else {
  30328. //this.dollyIn(scale);
  30329. this.dollyOut(1 / scale); //console.log("缩小"+scale)
  30330. } //dollyLen > 0 ? this.dollyOut(1 + dollyLen / 500) : this.dollyIn(1 - dollyLen / 500),
  30331. this.dollyStart.copy(this.dollyEnd);
  30332. return scale;
  30333. }.bind(this),
  30334. pan = function () {
  30335. // 平移
  30336. if (pointerEvent.touches.length == 0) return; //手机从按钮处滑动到canvas时会有这种情况
  30337. this.panEnd.set(common$1.average(pointerEvent.touches, 'pageX'), common$1.average(pointerEvent.touches, 'pageY'));
  30338. this.panDelta.subVectors(this.panEnd, this.panStart);
  30339. window.logEnable && console.log('delta', Array.from(pointerEvent.touches).map(function (e) {
  30340. return [e.pageX.toFixed(1), e.pageY.toFixed(1)];
  30341. }), pointerEvent.touches instanceof Array, pointerEvent.currentTarget.className + pointerEvent.currentTarget.nodeName);
  30342. this.pan(this.panDelta.x, this.panDelta.y);
  30343. this.panStart.copy(this.panEnd);
  30344. this.rotateDelta.set(0, 0);
  30345. }.bind(this),
  30346. panTwoPointers = function (scale, angle) {
  30347. // 双指平移。 平移向量为 上次的touch0到旋转中心的向量 加上 旋转中心到绕中心旋转后的新的touch0的向量的scale分之一。 (先把相机平移到上次的touch0然后旋转后退到合适的位置,将位移量的逆和上述几个向量作比较得出)
  30348. //获取touch0在按照scale, angle的方式改变后的位置到实际手指移动到的新的位置的位移量
  30349. var touch0 = new THREE.Vector2(pointerEvent.touches[0].pageX, pointerEvent.touches[0].pageY);
  30350. var rotResult = touch0.clone().rotateAround(this.rotateCenter, angle);
  30351. var Op0 = rotResult.clone().sub(this.rotateCenter).multiplyScalar(1 / scale);
  30352. var Op1 = this.rotateCenter.clone().sub(this.rotateStart);
  30353. this.panDelta.addVectors(Op0, Op1);
  30354. this.pan(this.panDelta.x, this.panDelta.y);
  30355. this.rotateStart = touch0;
  30356. }.bind(this),
  30357. rot = function () {
  30358. if (this.noRotateUpDown) {
  30359. //floorplan
  30360. var touch0 = new THREE.Vector2(pointerEvent.touches[0].pageX, pointerEvent.touches[0].pageY);
  30361. var touch1 = new THREE.Vector2(pointerEvent.touches[1].pageX, pointerEvent.touches[1].pageY);
  30362. this.rotateEndVec.subVectors(touch0, touch1); //当前双指角度
  30363. var angle = math$2.getVec2Angle(this.rotateStartVec, this.rotateEndVec); //和上次的双指角度求夹角,即为旋转角度
  30364. var rotateEndVec_ = new THREE.Vector3(this.rotateEndVec.x, this.rotateEndVec.y, 0);
  30365. var rotateStartVec_ = new THREE.Vector3(this.rotateStartVec.x, this.rotateStartVec.y, 0);
  30366. if (rotateEndVec_.clone().cross(rotateStartVec_).z < 0) {
  30367. angle *= -1;
  30368. }
  30369. this.rotateLeft(angle);
  30370. this.rotateStartVec.copy(this.rotateEndVec);
  30371. return angle;
  30372. } else {
  30373. //dollhouse还是之前的方式:单指旋转,根据滑动距离来旋转
  30374. this.rotateEnd.set(common$1.average(pointerEvent.touches, 'pageX'), common$1.average(pointerEvent.touches, 'pageY'));
  30375. this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart);
  30376. this.rotateLeft(2 * Math.PI * this.rotateDelta.x / this.player.domElement.clientWidth * this.rotateSpeed);
  30377. this.rotateUp(2 * Math.PI * this.rotateDelta.y / this.player.domElement.clientHeight * this.rotateSpeed);
  30378. this.rotateStart.copy(this.rotateEnd);
  30379. }
  30380. }.bind(this);
  30381. /* rotOrScale = function() {
  30382. console.log('rotOrScale')
  30383. if (2 === pointerEvent.touches.length) {
  30384. var i = window.devicePixelRatio || 1
  30385. , r = pointerEvent.touches[1].pageX - pointerEvent.touches[0].pageX
  30386. , s = pointerEvent.touches[1].pageY - pointerEvent.touches[0].pageY
  30387. , l = Math.sqrt(r * r + s * s)
  30388. , h = Math.abs(this.dollyStart.length() - l);
  30389. //修改为可以同时缩放平移旋转
  30390. if (h > settings.input.touchMoveThreshold * i)
  30391. this.state = ControlActions.DOLLY,
  30392. scale();
  30393. else {
  30394. var u = common.average(pointerEvent.touches, "pageX")
  30395. , d = common.average(pointerEvent.touches, "pageY")
  30396. , p = this.rotateDelta.set(u, d).sub(this.rotateStart).length();
  30397. if(p > settings.input.touchMoveThreshold)
  30398. {
  30399. this.state = ControlActions.ROTATE;
  30400. this.rotateStart.set(u, d);
  30401. rot();
  30402. }
  30403. }
  30404. }
  30405. }.bind(this); */
  30406. switch (this.state //floorplan会执行23,dollhouse会执行125
  30407. ) {
  30408. case ControlActions.PAN_DOLLY:
  30409. scale();
  30410. case ControlActions.PAN:
  30411. pan();
  30412. break;
  30413. case ControlActions.ROTATE_DOLLY:
  30414. //floorplan双指改为可以缩放、旋转、 平移
  30415. //rotOrScale();
  30416. var s = scale();
  30417. var angle = rot();
  30418. panTwoPointers(s, angle);
  30419. break;
  30420. case ControlActions.DOLLY:
  30421. scale();
  30422. break;
  30423. case ControlActions.ROTATE:
  30424. rot();
  30425. break;
  30426. default:
  30427. this.state = ControlActions.NONE;
  30428. } //floorplan 单指会执行 2 双指3
  30429. //dollhouse 单指会执行 5 双指12
  30430. this.lastMoveTime = pointerEvent.timeStamp;
  30431. this.emit(ControlEvents.Move, 'touch'); //同步
  30432. var info = {
  30433. scale: this.absoluteScale
  30434. };
  30435. info.quaternion = {
  30436. _w: this.camera.quaternion._w,
  30437. _x: this.camera.quaternion._x,
  30438. _y: this.camera.quaternion._y,
  30439. _z: this.camera.quaternion._z
  30440. };
  30441. info.position = {
  30442. x: this.camera.position.x,
  30443. y: this.camera.position.y,
  30444. z: this.camera.position.z
  30445. };
  30446. info.target = {
  30447. x: this.target.x,
  30448. y: this.target.y,
  30449. z: this.target.z
  30450. };
  30451. this.player.emit(PlayerEvents.MoveModel, {
  30452. info: info,
  30453. mode: this.player.mode,
  30454. type: 'moveModel'
  30455. });
  30456. }
  30457. }
  30458. }, {
  30459. key: "onTouchEnd",
  30460. value: function onTouchEnd(pointerEvent) {
  30461. if (this.enabled) {
  30462. if (this.state === ControlActions.ROTATE) {
  30463. if (pointerEvent.timeStamp > this.lastMoveTime + 100) {
  30464. this.rotationSpeed.set(0, 0);
  30465. this.rotationAcceleration.set(0, 0);
  30466. } else {
  30467. this.rotationAcceleration.set(-this.rotateDelta.x, this.rotateDelta.y);
  30468. }
  30469. }
  30470. this.state = ControlActions.NONE;
  30471. this.update();
  30472. this.rotationAcceleration.set(0, 0);
  30473. this.rotateDelta.set(0, 0);
  30474. }
  30475. }
  30476. }, {
  30477. key: "onPointerDown",
  30478. value: function onPointerDown(pointerEvent) {
  30479. if (this.enabled) {
  30480. if ('touch' === pointerEvent.pointerType) {
  30481. if (this.pointers.length < this.pointersLimit && !this.pointers.find(function (pointer) {
  30482. return pointer.id == pointerEvent.pointerId;
  30483. })) {
  30484. this.pointers.push({
  30485. id: pointerEvent.pointerId,
  30486. pageX: pointerEvent.pageX,
  30487. pageY: pointerEvent.pageY
  30488. });
  30489. }
  30490. pointerEvent.touches = this.pointers;
  30491. this.onTouchStart(pointerEvent);
  30492. }
  30493. this.emit(ControlEvents.InputStart, 'pointer');
  30494. }
  30495. }
  30496. }, {
  30497. key: "onPointerMove",
  30498. value: function onPointerMove(pointerEvent) {
  30499. if (this.enabled && 'touch' === pointerEvent.pointerType) {
  30500. this.pointers.forEach(function (t) {
  30501. if (pointerEvent.pointerId === t.id) {
  30502. t.pageX = pointerEvent.pageX;
  30503. t.pageY = pointerEvent.pageY;
  30504. t.pressed = pointerEvent.pressed;
  30505. }
  30506. });
  30507. pointerEvent.touches = this.pointers; //转化为onTouchMove的touches
  30508. //console.log('onPointerMove',pointerEvent.touches)
  30509. this.onTouchMove(pointerEvent);
  30510. }
  30511. }
  30512. }, {
  30513. key: "onPointerUp",
  30514. value: function onPointerUp(pointerEvent) {
  30515. if (this.enabled && 'touch' === pointerEvent.pointerType) {
  30516. /* this.pointers.forEach(function(t, i) {
  30517. pointerEvent.pointerId === t.id && this.pointers.splice(i, 1)//这样肯定bug
  30518. }
  30519. .bind(this)); */
  30520. this.pointers = this.pointers.filter(function (pointer) {
  30521. return pointer.id != pointerEvent.pointerId;
  30522. });
  30523. pointerEvent.touches = this.pointers;
  30524. this.onTouchEnd(pointerEvent);
  30525. }
  30526. }
  30527. }, {
  30528. key: "reset",
  30529. value: function reset() {
  30530. 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);
  30531. }
  30532. }, {
  30533. key: "toJSON",
  30534. value: function toJSON() {
  30535. var cameraSpatialInfo = {
  30536. camera_position: {
  30537. x: math$2.toPrecision(this.camera.position.x, 4),
  30538. y: math$2.toPrecision(this.camera.position.y, 4),
  30539. z: math$2.toPrecision(this.camera.position.z, 4)
  30540. },
  30541. camera_quaternion: {
  30542. x: math$2.toPrecision(this.camera.quaternion.x, 4),
  30543. y: math$2.toPrecision(this.camera.quaternion.y, 4),
  30544. z: math$2.toPrecision(this.camera.quaternion.z, 4),
  30545. w: math$2.toPrecision(this.camera.quaternion.w, 4)
  30546. }
  30547. };
  30548. return cameraSpatialInfo;
  30549. }
  30550. }]);
  30551. return OutsideControls;
  30552. }(EventEmitter);
  30553. var MouseButton = {
  30554. LEFT: 0,
  30555. MIDDLE: 1,
  30556. RIGHT: 2
  30557. };
  30558. 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); }; }
  30559. 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; } }
  30560. var FloorplanControls = /*#__PURE__*/function (_OutsideControls) {
  30561. _inherits(FloorplanControls, _OutsideControls);
  30562. var _super = _createSuper$1b(FloorplanControls);
  30563. function FloorplanControls(camera, dom, player) {
  30564. var _this;
  30565. _classCallCheck(this, FloorplanControls);
  30566. _this = _super.call(this, camera, dom, player);
  30567. _this.minDistance = 5; //最小球半径
  30568. _this.maxDistance = 100; //最大球半径
  30569. _this.noRotateUpDown = !0; //是否禁止竖直方向的旋转,即禁用纬度上的角位移
  30570. _this.minPolarAngle = 0; //最小纬度 (0度在北极往下看,180度在南极往上看) 对应lat
  30571. _this.maxPolarAngle = 0; //最大纬度
  30572. _this.zoomNearLimit = 0.01;
  30573. _this.zoomFarLimit = 10;
  30574. _this.absoluteScale = 1; //当前控制器下的默认缩放
  30575. _this.currentScale = 1; //鼠标所交互的界面元素
  30576. _this.dom = dom;
  30577. _this.$app = player.$app;
  30578. _this.player = player;
  30579. _this.plane = null;
  30580. _this.cadSize = null;
  30581. _this.floorTexture = null; //鼠标、触点行为
  30582. _this.mouseActions[MouseButton.LEFT] = ControlActions.PAN;
  30583. _this.mouseActions[MouseButton.MIDDLE] = ControlActions.DOLLY;
  30584. _this.mouseActions[MouseButton.RIGHT] = ControlActions.ROTATE;
  30585. _this.touchActions[1] = ControlActions.PAN;
  30586. _this.touchActions[2] = ControlActions.ROTATE_DOLLY;
  30587. return _this;
  30588. }
  30589. /**
  30590. * 屏幕大小变化后,相应的也要调整
  30591. */
  30592. /* updateFloorCad() {
  30593. if (this.plane != null && this.plane != 'nofile')
  30594. {
  30595. var planeWidth = this.plane.geometry.parameters.width;
  30596. var planeHeight = this.plane.geometry.parameters.height;
  30597. var modelWidth = this.player.model.boundingBox.max.x - this.player.model.boundingBox.min.x;
  30598. var modelHeight = this.player.model.boundingBox.max.z - this.player.model.boundingBox.min.z;
  30599. var width = this.camera.right - this.camera.left;
  30600. var height = this.camera.top - this.camera.bottom;
  30601. let scale = app.player.domElement.clientWidth / (this.camera.right - this.camera.left);
  30602. this.plane.scale.x = (modelWidth + (this.cadSize.left + this.cadSize.right) / scale) / planeWidth;
  30603. this.plane.scale.z = (modelHeight + (this.cadSize.left + this.cadSize.right) / scale) / planeHeight;
  30604. }
  30605. } */
  30606. /**
  30607. * 相机通过缩放Zoom,使模型适当充满视口。
  30608. * 1.得到模型平面(XZ)尺寸
  30609. * 2.分别计算视口宽高比 大于1,小于1 两种情况下模型所占最大的视口尺寸
  30610. * 3.以模型所占最大视口尺寸为基准,调整绝对缩放比
  30611. * @param {Vector3} modelSize
  30612. */
  30613. _createClass(FloorplanControls, [{
  30614. key: "zoomToContain",
  30615. value: function zoomToContain(modelSize, ratio, padding) {
  30616. var absoluteScale = this.getDefaultAbsoluteScale(modelSize, ratio, padding); //改
  30617. this.absoluteScale = absoluteScale;
  30618. this.currentScale = this.absoluteScale;
  30619. }
  30620. /**
  30621. *
  30622. * @param {Vector3} modelSize
  30623. */
  30624. }, {
  30625. key: "getDefaultAbsoluteScale",
  30626. value: function getDefaultAbsoluteScale(modelSize, ratio, angle) {
  30627. var padding = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {
  30628. x: 400,
  30629. y: 200
  30630. };
  30631. //const metadata = app.store.getters['scene/metadata'] || {}
  30632. var absoluteScale;
  30633. /* if(metadata.floorPlanAngle || config.floorPlanNoRotate ){//指定了角度的话,就和browser.aspectRatio()无关,总使用纵向
  30634. var angle = 0;
  30635. if(metadata.floorPlanAngle ){//规定了cadImage旋转值的话
  30636. angle = parseFloat(metadata.floorPlanAngle)
  30637. }
  30638. else if ( config.floorPlanNoRotate )//为了让cadImage的字是正的,所以当有labels的时候恒定这个方向
  30639. {
  30640. angle = 0;
  30641. }
  30642. modelSize = modelSize.clone().applyEuler(new THREE.Euler(0, angle, 0))
  30643. var n = Math.max(Math.abs(modelSize.x), Math.abs(modelSize.z) * this.camera.aspect) //视口宽高比 >= 1 情况下,模型所占最大视口尺寸
  30644. var screenSize = Math.min($("#player").width(), $("#player").height())
  30645. var maxSize = 800;//模型最大占据像素
  30646. ratio = ratio != void 0 ? ratio : Math.max(screenSize * 1.2 / maxSize, 1.2) ;
  30647. absoluteScale = n / 2 / settings.orthoBase * ratio; //根据模型所占最大视口尺寸调整缩放
  30648. }else{ */
  30649. /* xst
  30650. var maxModelSize = Math.max(modelSize.x, modelSize.z),
  30651. minModelSize = Math.min(modelSize.x, modelSize.z),
  30652. n = Math.max(maxModelSize, minModelSize * this.camera.aspect), //视口宽高比 >= 1 情况下,模型所占最大视口尺寸
  30653. r = Math.max(minModelSize, maxModelSize * this.camera.aspect) //视口宽高比 < 1 情况下,模型所占最大视口尺寸
  30654. absoluteScale = ((browser.aspectRatio() < 1 ? r : n) / 2 / settings.orthoBase) * (ratio != void 0 ? ratio : 1.2) //根据模型所占最大视口尺寸调整缩放
  30655. */
  30656. //}
  30657. //xst
  30658. if (angle == null || typeof angle == 'undefined') {
  30659. angle = this.$app.store.getValue('metadata').floorPlanAngle;
  30660. if (typeof angle == 'undefined') {
  30661. angle = 0;
  30662. }
  30663. angle = parseFloat(angle);
  30664. }
  30665. modelSize = modelSize.clone().applyEuler(new THREE.Euler(0, angle, 0));
  30666. var n = Math.max(Math.abs(modelSize.x), Math.abs(modelSize.z) * this.camera.aspect); //视口宽高比 >= 1 情况下,模型所占最大视口尺寸
  30667. var _this$player$domEleme = this.player.domElement,
  30668. clientWidth = _this$player$domEleme.clientWidth,
  30669. clientHeight = _this$player$domEleme.clientHeight;
  30670. var screenSize = Math.min(clientWidth - padding.x, clientHeight - padding.y);
  30671. var maxSize = 800; //模型最大占据像素
  30672. var maxRatio = this.player.linkEditor && (this.player.linkEditor.setTagVisible || this.player.linkEditor.setPanoVisible) ? 1.2 : 2;
  30673. ratio = ratio != void 0 ? ratio : Math.max(screenSize * maxRatio / maxSize, maxRatio);
  30674. absoluteScale = n / 2 / settings$3.orthoBase * ratio; //根据模型所占最大视口尺寸调整缩放
  30675. return absoluteScale;
  30676. }
  30677. /**
  30678. * 相机通过旋转Rotate,使模型尺寸长宽比匹配相机视野宽高比
  30679. * @param {Vector3} modelSize
  30680. * @param {Vector3} direction
  30681. */
  30682. }, {
  30683. key: "rotateToView",
  30684. value: function rotateToView(modelSize, direction) {
  30685. var i = 0,
  30686. n = browser$1.aspectRatio() < 1,
  30687. //是否模型尺寸显“细长”
  30688. r = modelSize.x < modelSize.z; //是否视口为“窄屏”
  30689. var metadata = this.$app.store.getValue('metadata');
  30690. if (metadata.floorPlanAngle !== void 0) {
  30691. //规定了cadImage旋转值的话
  30692. i = 2 * Math.PI - 1 * parseFloat(metadata.floorPlanAngle); //i = parseFloat(metadata.floorPlanAngle)
  30693. } else if (n === r
  30694. /* || config.floorPlanNoRotate */
  30695. ) {
  30696. //为了让cadImage的字是正的,所以当有labels的时候恒定这个方向
  30697. i = 0;
  30698. } else {
  30699. i = Math.PI / 2;
  30700. } //i = Math.PI / 2
  30701. this.rotateLeft(i);
  30702. this.update(0);
  30703. }
  30704. /**
  30705. * 平移操作,相对相机的本地坐标
  30706. * @param {Number} panSpeedX
  30707. * @param {Number} panSpeedY
  30708. */
  30709. }, {
  30710. key: "pan",
  30711. value: function pan(panSpeedX, panSpeedY) {
  30712. this.camera.updateMatrix();
  30713. this.panLeft(panSpeedX * (this.camera.right - this.camera.left) / this.player.domElement.clientWidth); //括号内是移动模型的距离,单位米
  30714. this.panUp(-panSpeedY * (this.camera.top - this.camera.bottom) / this.player.domElement.clientHeight);
  30715. }
  30716. /**
  30717. * 缩放操作,与透视相机不同,此模式下采用正交相机,通过改变相机轨道半径从而改变相机距离无意义,缩放是通过调整相机投影视口大小的方式
  30718. */
  30719. }, {
  30720. key: "updateZoom",
  30721. value: function updateZoom() {
  30722. //计算缩放比
  30723. this.absoluteScale *= this.scale - 0.03 * this.keyboardZoomSpeed; //滚轮缩放
  30724. this.absoluteScale = Math.max(this.zoomNearLimit, Math.min(this.absoluteScale, this.zoomFarLimit)); //if(this.farestScale) this.absoluteScale = Math.min(this.farestScale, this.absoluteScale);//add for cadImg
  30725. this.currentScale = 0.8 * this.currentScale + 0.2 * this.absoluteScale; //----许钟文------------------------------------
  30726. //默认根据屏幕宽度变化大小。当截取俯视图时,保留截取时绝对大小,无论截取什么比例,房子都不会被缩放。
  30727. //而后导览时,无论什么比例下飞到这个导览点,房子都是这个大小。
  30728. //本意是如果想设置在某窗口比例下的房子大小时,比如手机大小,当截取成功后缩略图和满屏时房子都不会变化大小。
  30729. //在满屏时截取,缩小宽度后点击房子也不会变小。缺点:当窗口很窄时,房子会略大。
  30730. var s = this.snapshotTopAspect ? this.camera.aspect / this.snapshotTopAspect : 1; //通过相机视口参数来调整相机投影视口大小
  30731. this.camera.left = -settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
  30732. this.camera.right = settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
  30733. this.camera.top = settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
  30734. this.camera.bottom = -settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
  30735. this.camera.updateProjectionMatrix();
  30736. return this.offset.length();
  30737. } //===========================================
  30738. /*
  30739. * 通过传参直接控制camera,不通过update里那些参数。 用于cad控制模型
  30740. */
  30741. }, {
  30742. key: "updateDirect",
  30743. value: function updateDirect(info) {
  30744. //相机视口大小,如left为最左侧看到的三维边界坐标到视口中心的距离
  30745. // var height = info.width / this.camera.aspect
  30746. // this.camera.left = -info.width / 2
  30747. // this.camera.right = info.width / 2
  30748. // this.camera.top = height / 2
  30749. // this.camera.bottom = -height / 2
  30750. // this.camera.updateProjectionMatrix()
  30751. if (!info.floorPlanAngle) {
  30752. info.floorPlanAngle = 0;
  30753. } //console.log('updateDirect' + JSON.stringify(info))
  30754. this.camera.left = -info.width / 2;
  30755. this.camera.right = info.width / 2;
  30756. this.camera.top = info.height / 2;
  30757. this.camera.bottom = -info.height / 2;
  30758. this.camera.updateProjectionMatrix(); //相机中心,若相机有旋转,需要把相机位置也旋转下:
  30759. this.camera.rotation.set(-Math.PI / 2, 0, info.floorPlanAngle);
  30760. var center = new THREE.Vector2(info.center.x, -info.center.y); //旋转中心 (和CAD那边一致就行)
  30761. var pos = new THREE.Vector2().copy(center).rotateAround(new THREE.Vector2(info.defaultCenter.x, -info.defaultCenter.y), -info.floorPlanAngle);
  30762. this.camera.position.setX(pos.x);
  30763. this.camera.position.setZ(pos.y); //let model = this.$app.core.get('Player').model
  30764. //if(info.floorPlanAngle!=0){
  30765. // this.absoluteScale = this.getDefaultAbsoluteScale(model.size, null,info.floorPlanAngle) //改
  30766. // this.currentScale = this.absoluteScale
  30767. // var s = this.snapshotTopAspect ? this.camera.aspect / this.snapshotTopAspect : 1
  30768. // //通过相机视口参数来调整相机投影视口大小
  30769. // this.camera.left = -settings.orthoBase * this.currentScale * s //* this.camera.aspect;
  30770. // this.camera.right = settings.orthoBase * this.currentScale * s //* this.camera.aspect;
  30771. // this.camera.top = (settings.orthoBase * this.currentScale * s) / this.camera.aspect
  30772. // this.camera.bottom = (-settings.orthoBase * this.currentScale * s) / this.camera.aspect
  30773. //}
  30774. this.updateForCad = true;
  30775. }
  30776. }, {
  30777. key: "updateForRotateCad",
  30778. value: function updateForRotateCad(info) {
  30779. if (!info.floorPlanAngle) {
  30780. info.floorPlanAngle = 0;
  30781. } //console.log('updateForRotateCad' + JSON.stringify(info))
  30782. //相机中心,若相机有旋转,需要把相机位置也旋转下:
  30783. this.camera.rotation.set(-Math.PI / 2, 0, info.floorPlanAngle);
  30784. var center = new THREE.Vector2(info.center.x, -info.center.y); //旋转中心 (和CAD那边一致就行)
  30785. //var pos = new THREE.Vector2().copy(center).rotateAround(center, -info.floorPlanAngle)
  30786. var pos = new THREE.Vector2().copy(center).rotateAround(new THREE.Vector2(info.defaultCenter.x, -info.defaultCenter.y), -info.floorPlanAngle);
  30787. this.camera.position.setX(pos.x);
  30788. this.camera.position.setZ(pos.y);
  30789. var model = this.$app.core.get('Player').model;
  30790. this.absoluteScale = this.getDefaultAbsoluteScale(model.size, null, info.floorPlanAngle); //改
  30791. this.currentScale = this.absoluteScale;
  30792. var s = this.snapshotTopAspect ? this.camera.aspect / this.snapshotTopAspect : 1; //通过相机视口参数来调整相机投影视口大小
  30793. this.camera.left = -settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
  30794. this.camera.right = settings$3.orthoBase * this.currentScale * s; //* this.camera.aspect;
  30795. this.camera.top = settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
  30796. this.camera.bottom = -settings$3.orthoBase * this.currentScale * s / this.camera.aspect;
  30797. this.camera.updateProjectionMatrix();
  30798. this.updateForCad = true;
  30799. }
  30800. /*
  30801. * 恢复使用update, 并使俯视图看起来和cad时一样。
  30802. */
  30803. }, {
  30804. key: "recoverToUpdate",
  30805. value: function recoverToUpdate() {
  30806. this.updateForCad = false; //旋转(target、thetaDelta)
  30807. //通过计算target恢复到旋转角度为0的状态(得到的dir都是一样的)
  30808. /* var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(this.camera.quaternion)
  30809. this.target = this.camera.position.clone().add(dir) */
  30810. this.target.copy(this.camera.position); //通过rotateLeft来旋转,保持刚才的角度:
  30811. var metadata = this.$app.store.getValue('metadata');
  30812. var floorPlanAngle = parseFloat(metadata.floorPlanAngle || 0);
  30813. this.thetaDelta = floorPlanAngle; //console.log("recoverToUpdate "+floorPlanAngle)
  30814. //缩放
  30815. this.absoluteScale = this.currentScale = this.camera.right / settings$3.orthoBase;
  30816. this.update(1); //立即应用thetaDelta
  30817. } //===========================================
  30818. }, {
  30819. key: "toJSON",
  30820. value: function toJSON() {
  30821. var e = new THREE.Quaternion(),
  30822. t = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(90)),
  30823. i = new THREE.Quaternion();
  30824. var func = function func() {
  30825. var n = OutsideControls.prototype.toJSON.call(this);
  30826. e.copy(n.camera_quaternion);
  30827. i.copy(t);
  30828. i.multiply(e);
  30829. n.camera_quaternion.x = math.toPrecision(i.x, 4);
  30830. n.camera_quaternion.y = math.toPrecision(i.y, 4);
  30831. n.camera_quaternion.z = math.toPrecision(i.z, 4);
  30832. n.camera_quaternion.w = math.toPrecision(i.w, 4);
  30833. n.ortho_zoom = math.toPrecision(this.currentScale * this.camera.aspect, 4);
  30834. return n;
  30835. };
  30836. return func;
  30837. }
  30838. }, {
  30839. key: "setZoomBounds",
  30840. value: function setZoomBounds(bound) {
  30841. //根据模型大小修改zoom的边界. 和模型大小成正比
  30842. //settings.zoomNearLimit, Math.min(this.absoluteScale, settings.zoomFarLimit)
  30843. var size = bound.getSize(new THREE.Vector3());
  30844. var max = Math.max(size.x, size.z) / 2 / settings$3.orthoBase; //top最大值可能是
  30845. max = Math.max(0.1, max); //avoid 0
  30846. this.zoomFarLimit = parseInt(max * 10);
  30847. this.zoomNearLimit = this.zoomFarLimit / 100;
  30848. settings$3.floorplan.cameraHeight = THREE.MathUtils.clamp(Math.ceil(2.4 * size.length()), 5, 5000); //小模型如果高度太高,dollhouse和floorplan互转时动态过大
  30849. this.maxDistance = Math.max(settings$3.floorplan.cameraHeight + 1, this.maxDistance);
  30850. }
  30851. }]);
  30852. return FloorplanControls;
  30853. }(OutsideControls);
  30854. 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); }; }
  30855. 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; } }
  30856. //import Common from '../utils/Common.js'
  30857. var Viewport = /*#__PURE__*/function (_THREE$EventDispatche) {
  30858. _inherits(Viewport, _THREE$EventDispatche);
  30859. var _super = _createSuper$1a(Viewport);
  30860. function Viewport(
  30861. /* view, */
  30862. camera) {
  30863. var _this;
  30864. var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  30865. _classCallCheck(this, Viewport);
  30866. //目前不支持换camera
  30867. _this = _super.call(this);
  30868. _this.left = prop.left;
  30869. _this.bottom = prop.bottom;
  30870. _this.width = prop.width;
  30871. _this.height = prop.height;
  30872. _this.name = prop.name;
  30873. _this.camera = camera;
  30874. _this.active = true;
  30875. _this.resolution = new THREE.Vector2();
  30876. _this.resolution2 = new THREE.Vector2();
  30877. _this.offset = new THREE.Vector2(); //viewportOffset 范围从0-整个画布的像素
  30878. _this.extraEnableLayers = prop.extraEnableLayers || []; //额外可展示的层
  30879. _this.cameraLayers = prop.cameraLayers;
  30880. _this.pixelRatio = prop.pixelRatio; //如果规定pixelRatio的话要传,这样就覆盖devicePicelRatio, 如magnifier
  30881. return _this;
  30882. }
  30883. /* clone(){
  30884. return Common.CloneClassObject(this)
  30885. }
  30886. */
  30887. _createClass(Viewport, [{
  30888. key: "cameraChanged",
  30889. value: function cameraChanged() {
  30890. var _this2 = this;
  30891. var copy = function copy() {
  30892. _this2.previousState = {
  30893. projectionMatrix: _this2.camera.projectionMatrix.clone(),
  30894. //worldMatrix在this.control时归零了所以不用了吧,用position和qua也一样
  30895. position: _this2.camera.position.clone(),
  30896. quaternion: _this2.camera.quaternion.clone(),
  30897. active: _this2.active,
  30898. resolution: _this2.resolution.clone(),
  30899. resolution2: _this2.resolution2.clone() //有时clientWidth没变但是ratio缩放了
  30900. };
  30901. };
  30902. var projectionChanged = true,
  30903. positionChanged = true,
  30904. quaternionChanged = true,
  30905. activeChanged = true,
  30906. resolutionChanged = true;
  30907. var getChanged = function getChanged() {
  30908. return {
  30909. projectionChanged,
  30910. positionChanged,
  30911. quaternionChanged,
  30912. activeChanged,
  30913. resolutionChanged,
  30914. changed: projectionChanged || positionChanged || quaternionChanged || activeChanged || resolutionChanged
  30915. };
  30916. };
  30917. if (this.previousState) {
  30918. projectionChanged = !this.camera.projectionMatrix.equals(this.previousState.projectionMatrix);
  30919. positionChanged = !this.camera.position.equals(this.previousState.position);
  30920. quaternionChanged = !this.camera.quaternion.equals(this.previousState.quaternion);
  30921. activeChanged = this.active != this.previousState.active;
  30922. resolutionChanged = !this.resolution.equals(this.previousState.resolution) || !this.resolution2.equals(this.previousState.resolution2);
  30923. }
  30924. copy();
  30925. return getChanged();
  30926. }
  30927. }, {
  30928. key: "setResolution",
  30929. value: function setResolution(w, h) {
  30930. this.resolution.set(w, h); //是client的width height
  30931. this.resolution2.copy(this.resolution).multiplyScalar(this.pixelRatio || window.devicePixelRatio); //this.offset.set(wholeW,wholeH).multiply(new THREE.Vector2(this.left,this.bottom))//.multiplyScalar(window.devicePixelRatio)
  30932. this.dispatchEvent({
  30933. type: 'resize'
  30934. });
  30935. }
  30936. }]);
  30937. return Viewport;
  30938. }(THREE.EventDispatcher);
  30939. function _createForOfIteratorHelper$a(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$a(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; } } }; }
  30940. function _unsupportedIterableToArray$a(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$a(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$a(o, minLen); }
  30941. function _arrayLikeToArray$a(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; }
  30942. 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); }; }
  30943. 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; } }
  30944. var clickMaxDragDis = 3,
  30945. clickMaxPressTime = 200,
  30946. doubleClickTime = 300; //双击间隔时间
  30947. var Buttons = {
  30948. NONE: 0,
  30949. LEFT: 1,
  30950. RIGHT: 2,
  30951. MIDDLE: 4
  30952. };
  30953. var mouseToRay = function mouseToRay(pointer, camera) {
  30954. var vector = new THREE.Vector3(pointer.x, pointer.y, 1);
  30955. var origin = new THREE.Vector3(pointer.x, pointer.y, -1); //不能用camera.position,在orbitCamera时不准
  30956. vector.unproject(camera);
  30957. origin.unproject(camera);
  30958. var direction = new THREE.Vector3().subVectors(vector, origin).normalize();
  30959. var ray = new THREE.Ray(origin, direction);
  30960. return ray;
  30961. };
  30962. function ascSort(a, b) {
  30963. return a.distance - b.distance;
  30964. }
  30965. function _intersectObject(object, raycaster, intersects, recursive, ignoreUnvisible) {
  30966. if (ignoreUnvisible && !object.visible) return; //add
  30967. if (object.layers.test(raycaster.layers)) {
  30968. object.raycast(raycaster, intersects);
  30969. }
  30970. if (recursive === true) {
  30971. var children = object.children;
  30972. for (var i = 0, l = children.length; i < l; i++) {
  30973. _intersectObject(children[i], raycaster, intersects, true, ignoreUnvisible);
  30974. }
  30975. }
  30976. }
  30977. var Raycaster = /*#__PURE__*/function (_THREE$Raycaster) {
  30978. _inherits(Raycaster, _THREE$Raycaster);
  30979. var _super = _createSuper$19(Raycaster);
  30980. function Raycaster() {
  30981. _classCallCheck(this, Raycaster);
  30982. return _super.call(this);
  30983. }
  30984. _createClass(Raycaster, [{
  30985. key: "intersectObject",
  30986. value: function intersectObject(object, recursive, optionalTarget, ignoreUnvisible) {
  30987. //add ignoreUnvisible
  30988. var intersects = optionalTarget || [];
  30989. _intersectObject(object, this, intersects, recursive, ignoreUnvisible);
  30990. intersects.sort(ascSort);
  30991. return intersects;
  30992. }
  30993. }, {
  30994. key: "intersectObjects",
  30995. value: function intersectObjects(objects, recursive, optionalTarget, ignoreUnvisible) {
  30996. //add ignoreUnvisible 跳过不可见
  30997. var intersects = optionalTarget || [];
  30998. if (Array.isArray(objects) === false) {
  30999. console.warn('THREE.Raycaster.intersectObjects: objects is not an Array.');
  31000. return intersects;
  31001. }
  31002. for (var i = 0, l = objects.length; i < l; i++) {
  31003. _intersectObject(objects[i], this, intersects, recursive, ignoreUnvisible);
  31004. }
  31005. intersects.sort(ascSort);
  31006. return intersects;
  31007. }
  31008. }]);
  31009. return Raycaster;
  31010. }(THREE.Raycaster);
  31011. var player$k;
  31012. var InputHandler = /*#__PURE__*/function (_THREE$EventDispatche) {
  31013. _inherits(InputHandler, _THREE$EventDispatche);
  31014. var _super2 = _createSuper$19(InputHandler);
  31015. function InputHandler(viewer, scene, player_) {
  31016. var _this;
  31017. _classCallCheck(this, InputHandler);
  31018. _this = _super2.call(this);
  31019. _this.viewer = viewer;
  31020. _this.renderer = viewer.renderer;
  31021. _this.domElement = _this.renderer.domElement;
  31022. _this.enabled = true;
  31023. player$k = player_;
  31024. _this.scene = scene;
  31025. _this.interactiveScenes = [];
  31026. _this.interactiveObjects = new Set();
  31027. _this.inputListeners = [];
  31028. _this.blacklist = new Set();
  31029. _this.drag = null;
  31030. _this.mouse = new THREE.Vector2(0, 0); //add:
  31031. _this.pointer = new THREE.Vector2(0, 0); //交互点的屏幕坐标,有别于DOM坐标,在此存放NDC坐标。(NDC,三维常用坐标系,二维坐标,整个屏幕映射范围(-1,1),屏幕中心为原点,+Y朝上,+X朝右)
  31032. _this.mouseDownMouse = new THREE.Vector2(0, 0);
  31033. _this.selection = [];
  31034. _this.hoveredElements = [];
  31035. _this.pressedKeys = {};
  31036. _this.wheelDelta = 0;
  31037. _this.speed = 1;
  31038. _this.logMessages = false;
  31039. if (_this.domElement.tabIndex === -1) {
  31040. _this.domElement.tabIndex = 2222;
  31041. }
  31042. _this.lastPointerUpTime = 0;
  31043. _this.touches = [];
  31044. _this.interactHistory = {
  31045. move: 0
  31046. }; //add
  31047. _this.hoverViewport = viewer.viewports[0];
  31048. document.addEventListener('mouseup', function (event) {
  31049. event.preventDefault();
  31050. }, {
  31051. passive: false
  31052. });
  31053. _this.domElement.addEventListener('contextmenu', function (event) {
  31054. event.preventDefault();
  31055. }, false);
  31056. _this.domElement.addEventListener('click', _this.onMouseClick.bind(_assertThisInitialized(_this)), false);
  31057. _this.domElement.addEventListener('mousedown', _this.onMouseDown.bind(_assertThisInitialized(_this)), {
  31058. passive: false,
  31059. useCapture: false
  31060. });
  31061. window.addEventListener('mouseup', _this.onMouseUp.bind(_assertThisInitialized(_this)), {
  31062. passive: false,
  31063. useCapture: false
  31064. });
  31065. /* if(Potree.isIframeChild){//子页面的话在父页面也要加侦听(应该不会有多层吧?否则要一直加到最外层)
  31066. //window.parent.addEventListener('mouseup', this.onMouseUp.bind(this), false); //可能跨域
  31067. //window.parent.postMessage('listenMouseup', '*');
  31068. window.addEventListener('mouseout', this.onMouseUp.bind(this), false); //cancel drag
  31069. } */
  31070. _this.domElement.addEventListener('mouseout', function () {
  31071. _this.containsMouse = false;
  31072. }, false);
  31073. _this.domElement.addEventListener('mousemove', _this.onMouseMove.bind(_assertThisInitialized(_this)), {
  31074. passive: false,
  31075. useCapture: false
  31076. });
  31077. _this.domElement.addEventListener('mousewheel', _this.onMouseWheel.bind(_assertThisInitialized(_this)), false);
  31078. _this.domElement.addEventListener('DOMMouseScroll', _this.onMouseWheel.bind(_assertThisInitialized(_this)), false); // Firefox
  31079. window.addEventListener('keydown', _this.onKeyDown.bind(_assertThisInitialized(_this))); //原先是this.domElement,这样的话一开始要点击屏幕后才能监听到
  31080. window.addEventListener('keyup', _this.onKeyUp.bind(_assertThisInitialized(_this)));
  31081. window.addEventListener('blur', _this.onKeyUp.bind(_assertThisInitialized(_this))); //add
  31082. _this.domElement.addEventListener('touchstart', _this.onTouchStart.bind(_assertThisInitialized(_this)));
  31083. _this.domElement.addEventListener('touchend', _this.onTouchEnd.bind(_assertThisInitialized(_this)));
  31084. _this.domElement.addEventListener('touchmove', _this.onTouchMove.bind(_assertThisInitialized(_this)));
  31085. player$k.on('update', function () {
  31086. _this.interactHistory = {}; //清空
  31087. });
  31088. return _this;
  31089. } //统一跟第一个触碰的viewport相同
  31090. _createClass(InputHandler, [{
  31091. key: "updateTouchesInfo",
  31092. value: function updateTouchesInfo(e) {
  31093. var _this2 = this;
  31094. var viewport, camera;
  31095. var oldTouches = this.touches;
  31096. var changedTouches = Array.from(e.changedTouches);
  31097. var touches = Array.from(e.touches);
  31098. this.touches = touches.map(function (touch) {
  31099. var touch_ = oldTouches.find(function (a) {
  31100. return a.touch.identifier == touch.identifier;
  31101. });
  31102. var pointer = touch_ && touch_.pointer; //复制原先的值
  31103. return {
  31104. touch,
  31105. pointer
  31106. };
  31107. });
  31108. if (e.touches.length > 0) {
  31109. var newTouches = touches.filter(function (e) {
  31110. return !oldTouches.some(function (a) {
  31111. return a.touch.identifier == e.identifier;
  31112. }) && !changedTouches.some(function (a) {
  31113. return a.identifier == e.identifier;
  31114. });
  31115. }); //从按钮处划过时e.touches中会出现this.touches和changedTouches中都没有的identifier
  31116. if (newTouches.length > 0) {
  31117. console.warn('has new', newTouches.map(function (e) {
  31118. return e.identifier;
  31119. }));
  31120. }
  31121. newTouches.concat(changedTouches).forEach(function (touch) {
  31122. //修改changedTouches的
  31123. var touch_ = _this2.touches.find(function (a) {
  31124. return a.touch.identifier == touch.identifier;
  31125. });
  31126. if (touch_) {
  31127. var a = _this2.getPointerInViewport(touch.pageX, touch.pageY, _this2.dragViewport || viewport, new THREE.Vector2());
  31128. touch_.pointer = a.pointer.clone();
  31129. viewport = a.viewport;
  31130. camera = a.camera;
  31131. }
  31132. }); //使用当前touches的平均
  31133. if (e.touches.length > 1) {
  31134. var pageX = Common.average(e.touches, 'pageX');
  31135. var pageY = Common.average(e.touches, 'pageY');
  31136. var a = this.getPointerInViewport(pageX, pageY, viewport, new THREE.Vector2());
  31137. this.pointer.copy(a.pointer); //console.log('updateTouchesInfo', this.pointer.clone())
  31138. } else {
  31139. this.pointer = this.touches[0].pointer.clone(); //更新,使用当前touches中的第一个
  31140. }
  31141. return {
  31142. viewport,
  31143. camera
  31144. };
  31145. }
  31146. }
  31147. }, {
  31148. key: "onTouchStart",
  31149. value: function onTouchStart(e) {
  31150. if (this.logMessages) console.log(this.constructor.name + ': onTouchStart');
  31151. e.preventDefault();
  31152. this.dealPointerDown(e, true);
  31153. this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, true), {
  31154. type: 'global_' + e.type,
  31155. changedTouches: e.changedTouches
  31156. }));
  31157. }
  31158. }, {
  31159. key: "onTouchMove",
  31160. value: function onTouchMove(e) {
  31161. if (this.logMessages) console.log(this.constructor.name + ': onTouchMove');
  31162. e.preventDefault();
  31163. this.dealPointerMove(e, true);
  31164. this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, true), {
  31165. type: 'global_' + e.type,
  31166. changedTouches: e.changedTouches
  31167. }));
  31168. }
  31169. }, {
  31170. key: "onTouchEnd",
  31171. value: function onTouchEnd(e) {
  31172. if (this.logMessages) console.log(this.constructor.name + ': onTouchEnd');
  31173. e.preventDefault(); //console.log('onTouchEnd')
  31174. this.updateTouchesInfo(e);
  31175. this.dealPointerUp(e, true);
  31176. this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, true), {
  31177. type: 'global_' + e.type
  31178. })); //console.log('touchend length '+e.touches.length, this.touches.length)
  31179. }
  31180. }, {
  31181. key: "onKeyDown",
  31182. value: function onKeyDown(e) {
  31183. if (this.logMessages) console.log(this.constructor.name + ': onKeyDown');
  31184. if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') return; //正在输入文字 或e.srcElement
  31185. if (!this.containsMouse) return; //在别的ui上无效
  31186. this.dispatchEvent({
  31187. type: 'keydown',
  31188. keyCode: e.keyCode,
  31189. event: e
  31190. });
  31191. this.pressedKeys[e.keyCode] = true; // e.preventDefault();
  31192. }
  31193. }, {
  31194. key: "onKeyUp",
  31195. value: function onKeyUp(e) {
  31196. if (this.logMessages) console.log(this.constructor.name + ': onKeyUp');
  31197. if (e.keyCode != void 0) {
  31198. delete this.pressedKeys[e.keyCode];
  31199. } else {
  31200. this.pressedKeys = {};
  31201. }
  31202. e.preventDefault();
  31203. }
  31204. }, {
  31205. key: "onDoubleClick",
  31206. value: function onDoubleClick(e) {
  31207. if (this.logMessages) console.log(this.constructor.name + ': onDoubleClick');
  31208. var consumed = false;
  31209. var _iterator = _createForOfIteratorHelper$a(this.hoveredElements),
  31210. _step;
  31211. try {
  31212. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  31213. var hovered = _step.value;
  31214. if (hovered._listeners && hovered._listeners['dblclick']) {
  31215. hovered.object.dispatchEvent({
  31216. type: 'dblclick',
  31217. mouse: this.mouse,
  31218. object: hovered.object
  31219. });
  31220. consumed = true;
  31221. break;
  31222. }
  31223. }
  31224. } catch (err) {
  31225. _iterator.e(err);
  31226. } finally {
  31227. _iterator.f();
  31228. }
  31229. if (!consumed) {
  31230. /* for (let inputListener of this.getSortedListeners()) {
  31231. inputListener. */
  31232. this.viewer.dispatchEvent({
  31233. type: 'global_dblclick',
  31234. mouse: this.mouse,
  31235. object: null
  31236. }); //}
  31237. }
  31238. this.needSingleClick = false; //add
  31239. e.preventDefault();
  31240. }
  31241. }, {
  31242. key: "onMouseClick",
  31243. value: function onMouseClick(e) {
  31244. if (this.logMessages) console.log(this.constructor.name + ': onMouseClick');
  31245. e.preventDefault();
  31246. }
  31247. }, {
  31248. key: "dealPointerDown",
  31249. value: function dealPointerDown(e, isTouch) {
  31250. e.preventDefault(); //重新获取一下pointer, 因点击了浏览器的按钮展开列表时 move回来不会触发onmousemove,所以pointer是旧的
  31251. if (isTouch) {
  31252. var _this$updateTouchesIn = this.updateTouchesInfo(e);
  31253. _this$updateTouchesIn.camera;
  31254. var viewport = _this$updateTouchesIn.viewport;
  31255. if (this.drag) {
  31256. //因为触屏在按下前缺少pointermove所以要更新下
  31257. this.drag.end = this.pointer.clone();
  31258. }
  31259. } else {
  31260. var _this$getPointerInVie = this.getPointerInViewport(e.clientX, e.clientY);
  31261. _this$getPointerInVie.camera;
  31262. var viewport = _this$getPointerInVie.viewport;
  31263. }
  31264. this.dragViewport = this.hoverViewport = viewport;
  31265. /* if(isTouch || !this.dragViewport.view.isFlying() && Potree.settings.intersectWhenHover && Potree.settings.editType != 'pano' ){//漫游点编辑如果拖拽前getIntersect旋转会延迟
  31266. //isTouch必须更新 否则是旧的
  31267. this.hoveredElements = this.getHoveredElements();
  31268. let dontIntersect = false
  31269. this.intersect = this.getIntersect({viewport, dontIntersect, clientX:e.clientX, clientY:e.clientY}) //更新intersect,避免在没有mousemove但flyToPano后intersect未更新。
  31270. //this.intersect = this.getWholeIntersect()
  31271. } */
  31272. if (!viewport) return; //why add this?
  31273. if (!this.drag) {
  31274. var target = (isTouch || e.button == THREE.MOUSE.LEFT) && this.hoveredElements.find(function (el //只有左键能拖拽
  31275. ) {
  31276. return el.object._listeners && el.object._listeners['drag'] && el.object._listeners['drag'].length > 0;
  31277. });
  31278. if (target) {
  31279. this.startDragging(target.object, {
  31280. location: target.point
  31281. });
  31282. } else {
  31283. this.startDragging(null);
  31284. }
  31285. }
  31286. this.drag.intersectStart = this.intersect;
  31287. if (!isTouch || e.touches.length == 1) {
  31288. var consumed = false;
  31289. var consume = function consume() {
  31290. return consumed = true;
  31291. }; //if (this.hoveredElements.length === 0) {
  31292. this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
  31293. type: 'global_mousedown'
  31294. }));
  31295. var _iterator2 = _createForOfIteratorHelper$a(this.hoveredElements),
  31296. _step2;
  31297. try {
  31298. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  31299. var hovered = _step2.value;
  31300. var object = hovered.object;
  31301. object.dispatchEvent({
  31302. type: 'mousedown',
  31303. viewer: this.viewer,
  31304. consume: consume
  31305. });
  31306. if (consumed) {
  31307. break;
  31308. }
  31309. }
  31310. } catch (err) {
  31311. _iterator2.e(err);
  31312. } finally {
  31313. _iterator2.f();
  31314. }
  31315. }
  31316. this.mouseDownMouse = this.mouse.clone();
  31317. this.pointerDownTime = Date.now();
  31318. }
  31319. }, {
  31320. key: "onMouseDown",
  31321. value: function onMouseDown(e) {
  31322. if (this.logMessages) console.log(this.constructor.name + ': onMouseDown');
  31323. this.dealPointerDown(e);
  31324. }
  31325. }, {
  31326. key: "getEventDesc",
  31327. value: function getEventDesc(e, isTouch) {
  31328. //搜集dispatchEvent要给的一般数据
  31329. var o = {
  31330. viewer: this.viewer,
  31331. mouse: this.mouse,
  31332. pointer: this.pointer,
  31333. drag: this.drag,
  31334. isTouch,
  31335. dragViewport: this.dragViewport,
  31336. hoverViewport: this.hoverViewport,
  31337. // button: isTouch ? 0 : e.button,
  31338. //intersectPoint:this.intersectPoint,
  31339. hoveredElement: this.hoveredElements[0],
  31340. intersect: this.intersect //this.getWholeIntersect() , //可能包含mesh上的,针对融合页面
  31341. };
  31342. if (e) {
  31343. o.isAtDomElement = e.target == this.domElement;
  31344. }
  31345. if (isTouch) {
  31346. o.touches = this.touches;
  31347. } else if (e) {
  31348. o.button = e.button;
  31349. o.buttons = e.buttons;
  31350. }
  31351. return o;
  31352. }
  31353. }, {
  31354. key: "dealPointerUp",
  31355. value: function dealPointerUp(e, isTouch) {
  31356. var _this3 = this;
  31357. if (!this.drag) {
  31358. // 在canvas外mousedown
  31359. return;
  31360. }
  31361. this.drag.end.copy(this.pointer);
  31362. if (isTouch && e.touches.length >= 1) {
  31363. return;
  31364. }
  31365. var now = Date.now();
  31366. if (this.logMessages) console.log(this.constructor.name + ': onMouseUp');
  31367. e.preventDefault();
  31368. var pressDistance = this.mouseDownMouse.distanceTo(this.mouse);
  31369. var pressTime = now - this.pointerDownTime;
  31370. this.drag.pointerDelta.length() == 0; //this.getNormalizedDrag().length() === 0;
  31371. var consumed = false;
  31372. var consume = function consume() {
  31373. return consumed = true;
  31374. };
  31375. this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
  31376. type: 'global_mouseup',
  31377. pressDistance,
  31378. consume
  31379. }));
  31380. if (this.hoveredElements.length > 0) {
  31381. var hovered = this.hoveredElements.map(function (e) {
  31382. return e.object;
  31383. }).find(function (e) {
  31384. return e._listeners && e._listeners['mouseup'];
  31385. });
  31386. if (hovered) {
  31387. hovered.dispatchEvent({
  31388. type: 'mouseup',
  31389. viewer: this.viewer,
  31390. consume: consume
  31391. });
  31392. }
  31393. }
  31394. if (this.drag) {
  31395. //拖拽结束
  31396. if (this.drag.object
  31397. /* && e.button == THREE.MOUSE.LEFT */
  31398. ) {
  31399. //add LEFT
  31400. if (this.logMessages) console.log("".concat(this.constructor.name, ": drop ").concat(this.drag.object.name));
  31401. this.drag.object.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
  31402. type: 'drop',
  31403. pressDistance
  31404. }));
  31405. } else {
  31406. this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
  31407. type: 'global_drop',
  31408. pressDistance
  31409. }));
  31410. } // check for a click
  31411. if (pressDistance < clickMaxDragDis && pressTime < clickMaxPressTime && !e.unableClick) {
  31412. var clickElement;
  31413. if (this.hoveredElements) {
  31414. clickElement = this.hoveredElements.find(function (e) {
  31415. return e.object._listeners['click'];
  31416. });
  31417. if (clickElement) {
  31418. var canceled;
  31419. var cancel = function cancel() {
  31420. return canceled = true;
  31421. }; //console.log('clickElement',clickElement)
  31422. if (this.logMessages) console.log("".concat(this.constructor.name, ": click ").concat(clickElement.name));
  31423. clickElement.object.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
  31424. type: 'click',
  31425. pressDistance,
  31426. cancel,
  31427. consume
  31428. }));
  31429. if (canceled) {
  31430. //比如只需要右键的话,可以忽视左键的点击
  31431. clickElement = null;
  31432. }
  31433. }
  31434. }
  31435. var selectable;
  31436. if (
  31437. /* !consumed && */
  31438. !this.fixSelection) {
  31439. if (e.button === THREE.MOUSE.LEFT) {
  31440. //if (noMovement) {
  31441. selectable = this.hoveredElements.find(function (el) {
  31442. return el.object._listeners && el.object._listeners['select'];
  31443. });
  31444. if (selectable) {
  31445. selectable = selectable.object;
  31446. if (this.isSelected(selectable)) {
  31447. this.deselectAll();
  31448. } else {
  31449. this.deselectAll();
  31450. this.toggleSelection(selectable);
  31451. }
  31452. consumed = true; //add
  31453. } else {
  31454. if (this.selection.length > 0) consumed = true; //add 取消选择后,阻断后续
  31455. this.deselectAll();
  31456. } //}
  31457. } else if (e.button === THREE.MOUSE.RIGHT
  31458. /* && noMovement */
  31459. ) {
  31460. this.deselectAll();
  31461. }
  31462. }
  31463. var desc = this.getEventDesc(e, isTouch);
  31464. if (!consumed) {
  31465. this.viewer.dispatchEvent(Object.assign(desc, {
  31466. type: 'global_click',
  31467. pressDistance,
  31468. clickElement: clickElement
  31469. /* || selectable */
  31470. ,
  31471. consume
  31472. }));
  31473. } //增加 单击:
  31474. this.needSingleClick = true;
  31475. consumed || setTimeout(function () {
  31476. if (_this3.needSingleClick) {
  31477. _this3.viewer.dispatchEvent(Object.assign(desc, {
  31478. type: 'global_single_click',
  31479. pressDistance,
  31480. clickElement
  31481. }));
  31482. }
  31483. }, doubleClickTime + 1); //自行执行双击:
  31484. if (!consumed && now - this.lastClickTime < doubleClickTime) {
  31485. this.onDoubleClick(e);
  31486. }
  31487. consumed || (this.lastClickTime = now);
  31488. }
  31489. this.drag = null;
  31490. }
  31491. this.dragViewport = null;
  31492. }
  31493. }, {
  31494. key: "onMouseUp",
  31495. value: function onMouseUp(e) {
  31496. this.dealPointerUp(e);
  31497. }
  31498. }, {
  31499. key: "deselectAll",
  31500. value: function deselectAll() {}
  31501. }, {
  31502. key: "isSelected",
  31503. value: function isSelected() {}
  31504. }, {
  31505. key: "getPointerInViewport",
  31506. value: function getPointerInViewport(clientX, clientY, viewForceAt, pointer) {
  31507. var _this4 = this;
  31508. var rect = this.domElement.getBoundingClientRect();
  31509. var x = clientX - rect.left;
  31510. var y = clientY - rect.top;
  31511. var camera;
  31512. var viewport;
  31513. pointer = pointer || this.pointer; //if(this.viewer.viewports || viewForceAt){
  31514. var getDimension = function getDimension(view) {
  31515. var left = Math.ceil(_this4.domElement.clientWidth * view.left),
  31516. bottom = Math.ceil(_this4.domElement.clientHeight * view.bottom),
  31517. width = Math.ceil(_this4.domElement.clientWidth * view.width),
  31518. height = Math.ceil(_this4.domElement.clientHeight * view.height),
  31519. top = _this4.domElement.clientHeight - bottom - height;
  31520. return {
  31521. left,
  31522. bottom,
  31523. width,
  31524. height,
  31525. top
  31526. };
  31527. };
  31528. var getView = function getView(view, left, bottom, width, height, top) {
  31529. _this4.mouse.set(x - left, y - top);
  31530. math$2.convertScreenPositionToNDC(_this4.mouse.x, _this4.mouse.y, pointer, _this4.viewer.domElement); //console.log('更新pointer2',this.pointer.toArray())
  31531. camera = view.camera;
  31532. viewport = view;
  31533. };
  31534. if (viewForceAt) {
  31535. var _getDimension = getDimension(viewForceAt),
  31536. _left = _getDimension.left,
  31537. _bottom = _getDimension.bottom,
  31538. _width = _getDimension.width,
  31539. _height = _getDimension.height,
  31540. _top = _getDimension.top;
  31541. getView(viewForceAt, _left, _bottom, _width, _height, _top);
  31542. } else {
  31543. var length = this.viewer.viewports.length; //var getif = false
  31544. for (var i = 0; i < length; i++) {
  31545. var view = this.viewer.viewports[i];
  31546. if (!view.active) continue;
  31547. var _getDimension2 = getDimension(view),
  31548. left = _getDimension2.left,
  31549. bottom = _getDimension2.bottom,
  31550. width = _getDimension2.width,
  31551. height = _getDimension2.height,
  31552. top = _getDimension2.top;
  31553. if (x >= left && x <= left + width && y >= top && y <= top + height) {
  31554. getView(view, left, bottom, width, height, top); //getif = true
  31555. break;
  31556. }
  31557. }
  31558. }
  31559. return {
  31560. camera,
  31561. viewport,
  31562. pointer
  31563. };
  31564. }
  31565. }, {
  31566. key: "ifBlockedByIntersect",
  31567. value: function ifBlockedByIntersect() {
  31568. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  31569. point = _ref.point,
  31570. _ref$margin = _ref.margin,
  31571. margin = _ref$margin === void 0 ? 0 : _ref$margin,
  31572. cameraPos = _ref.cameraPos,
  31573. pickWindowSize = _ref.pickWindowSize,
  31574. pano = _ref.pano,
  31575. useDepthTex = _ref.useDepthTex,
  31576. viewport = _ref.viewport;
  31577. //某点是否被遮挡(不允许camera修改位置, 因为depthTex不好置换)
  31578. viewport = viewport || this.hoverViewport || viewer.mainViewport;
  31579. var intersect = this.getIntersect({
  31580. viewport,
  31581. onlyGetIntersect: true,
  31582. pickWindowSize,
  31583. useDepthTex,
  31584. point,
  31585. cameraPos,
  31586. pano
  31587. });
  31588. var cameraPos_ = !cameraPos && pano ? pano.position : cameraPos || viewport.view.position;
  31589. if (intersect && intersect.distance + margin <= point.distanceTo(cameraPos_)) {
  31590. return intersect; //被遮挡
  31591. } //点云模式,对没加载出的点云不准确。 尤其是需要修改相机位置时,因临时修改并不能使点云加载。
  31592. }
  31593. }, {
  31594. key: "onMouseMove",
  31595. value: function onMouseMove(e) {
  31596. return this.dealPointerMove(e);
  31597. }
  31598. }, {
  31599. key: "dealPointerMove",
  31600. value: function dealPointerMove(e, isTouch) {
  31601. if (this.interactHistory.move) return; //一帧只触发一次
  31602. this.interactHistory.move = 1;
  31603. if (isTouch) {
  31604. var _this$updateTouchesIn2 = this.updateTouchesInfo(e);
  31605. _this$updateTouchesIn2.camera;
  31606. var viewport = _this$updateTouchesIn2.viewport;
  31607. } else {
  31608. var _this$getPointerInVie2 = this.getPointerInViewport(e.clientX, e.clientY, this.dragViewport);
  31609. _this$getPointerInVie2.camera;
  31610. var viewport = _this$getPointerInVie2.viewport;
  31611. }
  31612. this.hoverViewport = viewport;
  31613. if (!viewport) return; //刚变化viewport时会找不到
  31614. var isFlying = player$k.flying; //this.viewer.viewports.some(e=>e.view.isFlying()) || viewer.scene.cameraAnimations.some(c=>c.onUpdate)
  31615. var intersect;
  31616. if (e.onlyGetIntersect) {
  31617. return intersect;
  31618. }
  31619. e.preventDefault();
  31620. if (this.drag) {
  31621. //有拖拽(不一定拖拽了物体, 也不一定按下了鼠标)
  31622. this.drag.mouse = isTouch ? 1 : e.buttons; //add:
  31623. this.drag.pointerDelta.subVectors(this.pointer, this.drag.end);
  31624. this.drag.end.copy(this.pointer);
  31625. var dragConsumed = false;
  31626. if (this.drag.object && (e.buttons == Buttons.NONE || !this.drag.notPressMouse)) {
  31627. //如果是本不需要按鼠标的拖拽,但按下了鼠标,就不执行这段(改为拖拽场景,如添加测量时突然拖拽画面)
  31628. if (this.logMessages) console.log(this.constructor.name + ': drag: ' + this.drag.object.name);
  31629. var refused;
  31630. this.drag.object.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
  31631. type: 'drag',
  31632. //拖拽物体
  31633. refuse: function refuse() {
  31634. refused = true;
  31635. }
  31636. }));
  31637. if (!refused) dragConsumed = true; //viewer.dispatchEvent('content_changed')
  31638. }
  31639. if (!dragConsumed) {
  31640. if (this.logMessages) console.log(this.constructor.name + ': drag: ');
  31641. this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
  31642. type: 'global_drag' //拖拽画面
  31643. //consume: () => {dragConsumed = true;}
  31644. }));
  31645. }
  31646. }
  31647. if (!isTouch || e.touches.length == 1) {
  31648. if ((!this.drag || this.drag.notPressMouse) && !isFlying) {
  31649. var _curr$_listeners;
  31650. /* let blacklist = this.drag && this.drag */
  31651. var hoveredElements = this.getHoveredElements();
  31652. if (hoveredElements.length > 0) {
  31653. var names = hoveredElements.map(function (h) {
  31654. return h.object.name;
  31655. }).join(', ');
  31656. if (this.logMessages) console.log("".concat(this.constructor.name, ": onMouseMove; hovered: '").concat(names, "'"));
  31657. }
  31658. var cur = hoveredElements.find(function (a) {
  31659. return a.object;
  31660. });
  31661. var curr = cur && cur.object; //hoveredElements.map(a => a.object).find(a => true);//只取第一个
  31662. var prev = this.lastMouseoverElement; //this.hoveredElements.map(a => a.object).find(a => true);
  31663. if (curr !== prev) {
  31664. if (curr) {
  31665. if (this.logMessages) console.log("".concat(this.constructor.name, ": mouseover: ").concat(curr.name));
  31666. curr.dispatchEvent({
  31667. type: 'mouseover',
  31668. object: curr,
  31669. hoveredElement: cur
  31670. });
  31671. }
  31672. if (prev) {
  31673. if (this.logMessages) console.log("".concat(this.constructor.name, ": mouseleave: ").concat(prev.name));
  31674. prev.dispatchEvent({
  31675. type: 'mouseleave',
  31676. object: prev
  31677. });
  31678. }
  31679. this.lastMouseoverElement = curr; //viewer.dispatchEvent('content_changed')
  31680. }
  31681. if (curr !== null && curr !== void 0 && (_curr$_listeners = curr._listeners) !== null && _curr$_listeners !== void 0 && _curr$_listeners.mousemove) {
  31682. if (curr) {
  31683. //xzw改为只取第一个
  31684. curr.dispatchEvent(Object.assign(this.getEventDesc(e), {
  31685. type: 'mousemove',
  31686. hoveredElement: cur
  31687. }));
  31688. }
  31689. }
  31690. this.hoveredElements = hoveredElements;
  31691. } //this.intersect = this.getWholeIntersect()
  31692. this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
  31693. type: 'global_mousemove'
  31694. }));
  31695. this.containsMouse = true;
  31696. }
  31697. }
  31698. }, {
  31699. key: "onMouseWheel",
  31700. value: function onMouseWheel(e) {
  31701. var _this5 = this;
  31702. if (!this.enabled) return;
  31703. if (this.logMessages) console.log(this.constructor.name + ': onMouseWheel');
  31704. e.preventDefault();
  31705. var delta = 0;
  31706. if (e.wheelDelta !== undefined) {
  31707. // WebKit / Opera / Explorer 9
  31708. delta = e.wheelDelta;
  31709. } else if (e.detail !== undefined) {
  31710. // Firefox
  31711. delta = -e.detail;
  31712. }
  31713. var ndelta = Math.sign(delta); // this.wheelDelta += Math.sign(delta);
  31714. if (!this.hoverViewport) {
  31715. //调试手机版时会无
  31716. var _this$getPointerInVie3 = this.getPointerInViewport(e.clientX, e.clientY),
  31717. viewport = _this$getPointerInVie3.viewport;
  31718. this.hoverViewport = viewport;
  31719. }
  31720. if (this.hoveredElement) {
  31721. this.hoveredElement.object.dispatchEvent(Object.assign(this.getEventDesc(e, isTouch), {
  31722. type: 'mousewheel',
  31723. delta: ndelta,
  31724. object: this.hoveredElement.object
  31725. }));
  31726. } else {
  31727. this.viewer.dispatchEvent(Object.assign(this.getEventDesc(e), {
  31728. type: 'global_mousewheel',
  31729. delta: ndelta
  31730. }));
  31731. }
  31732. setTimeout(function () {
  31733. _this5.dealPointerMove(e); //add 在更新完view后重新获取intersect 和 drag
  31734. }, 1); //只延迟1会崩溃吗
  31735. }
  31736. }, {
  31737. key: "startDragging",
  31738. value: function startDragging(object) {
  31739. var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  31740. var name = object ? object.name : 'no name';
  31741. if (this.logMessages) console.log("".concat(this.constructor.name, ": startDragging: '").concat(name, "'"));
  31742. this.drag = {
  31743. start: this.pointer.clone(),
  31744. end: this.pointer.clone(),
  31745. pointerDelta: new THREE.Vector2(0, 0),
  31746. object: object,
  31747. hoverViewport: this.hoverViewport,
  31748. //会变化
  31749. dragViewport: this.hoverViewport //不变
  31750. };
  31751. if (args) {
  31752. for (var _i = 0, _Object$keys = Object.keys(args); _i < _Object$keys.length; _i++) {
  31753. var key = _Object$keys[_i];
  31754. this.drag[key] = args[key];
  31755. }
  31756. }
  31757. if (object) {
  31758. object.dispatchEvent(Object.assign(this.getEventDesc(), {
  31759. type: 'startDragging'
  31760. }));
  31761. }
  31762. }
  31763. }, {
  31764. key: "registerInteractiveObject",
  31765. value: function registerInteractiveObject(object) {
  31766. this.interactiveObjects.add(object);
  31767. }
  31768. }, {
  31769. key: "removeInteractiveObject",
  31770. value: function removeInteractiveObject(object) {
  31771. this.interactiveObjects.delete(object);
  31772. }
  31773. }, {
  31774. key: "registerInteractiveScene",
  31775. value: function registerInteractiveScene(scene) {
  31776. var index = this.interactiveScenes.indexOf(scene);
  31777. if (index === -1) {
  31778. this.interactiveScenes.push(scene);
  31779. }
  31780. }
  31781. }, {
  31782. key: "unregisterInteractiveScene",
  31783. value: function unregisterInteractiveScene(scene) {
  31784. var index = this.interactiveScenes.indexOf(scene);
  31785. if (index > -1) {
  31786. this.interactiveScenes.splice(index, 1);
  31787. }
  31788. }
  31789. }, {
  31790. key: "getHoveredElement",
  31791. value: function getHoveredElement() {
  31792. var hoveredElements = this.getHoveredElements();
  31793. if (hoveredElements.length > 0) {
  31794. return hoveredElements[0];
  31795. } else {
  31796. return null;
  31797. }
  31798. }
  31799. }, {
  31800. key: "getHoveredElements",
  31801. value: function getHoveredElements(interactables, dontCheckDis, raycaster) {
  31802. var _this6 = this;
  31803. if (!interactables) {
  31804. (function () {
  31805. var scenes = _this6.hoverViewport.interactiveScenes || _this6.interactiveScenes.concat(_this6.scene);
  31806. var interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect'];
  31807. interactables = [];
  31808. var _iterator3 = _createForOfIteratorHelper$a(scenes),
  31809. _step3;
  31810. try {
  31811. for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
  31812. var scene = _step3.value;
  31813. scene.traverseVisible(function (node) {
  31814. //检测加了侦听的object
  31815. if (node._listeners && node.visible && !_this6.blacklist.has(node)) {
  31816. var hasInteractableListener = interactableListeners.filter(function (e) {
  31817. return node._listeners[e] !== undefined;
  31818. }).length > 0;
  31819. if (hasInteractableListener) {
  31820. interactables.push(node);
  31821. }
  31822. }
  31823. });
  31824. }
  31825. } catch (err) {
  31826. _iterator3.e(err);
  31827. } finally {
  31828. _iterator3.f();
  31829. }
  31830. })();
  31831. } else interactables = interactables.filter(function (e) {
  31832. return e.visible;
  31833. });
  31834. var camera = this.hoverViewport.camera;
  31835. if (!raycaster) {
  31836. var ray = mouseToRay(this.pointer, camera);
  31837. raycaster = new Raycaster();
  31838. raycaster.ray.set(ray.origin, ray.direction);
  31839. raycaster.camera = camera; //add
  31840. }
  31841. if (camera.type == 'OrthographicCamera') {
  31842. //使无论多远,threshold区域都是一样宽的
  31843. raycaster.params.Line.threshold = 20 / camera.zoom;
  31844. } else {
  31845. raycaster.params.Line.threshold = 0.04; //相对长度
  31846. }
  31847. raycaster.params.Line2 = {
  31848. threshold: browser$1.isMobile() ? 100 : 20
  31849. }; //拓宽的lineWidth
  31850. //raycaster.layers.enableAll()//add
  31851. var layers = ['DEFAULT']; //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)
  31852. //if(Potree.settings.mergeType2 && Potree.settings.modelSkybox && Potree.settings.displayMode == 'showPanos' && !viewer.images360.currentPano.pointcloud.hasDepthTex) layers.push('skybox')//model变成skybox了
  31853. common$1.setCameraLayers(raycaster, layers, this.hoverViewport && this.hoverViewport.extraEnableLayers); //this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()
  31854. //viewer.dispatchEvent( {type:'raycaster', viewport: this.hoverViewport, raycaster, viewer:this.viewer, interactables })//add
  31855. var intersections = raycaster.intersectObjects(interactables, true, null, true); //原本是false 检测不到children
  31856. intersections.slice();
  31857. if (this.intersect && this.intersect.distance != void 0 && !dontCheckDis) {
  31858. //add
  31859. intersections = intersections.filter(function (e) {
  31860. var _material$defines;
  31861. if (_this6.intersect.hoveredElement && _this6.intersect.hoveredElement.oriObject == e.object) return true;
  31862. var material = e.object.material;
  31863. return e.object.pickDontCheckDis || (((_material$defines = material.defines) === null || _material$defines === void 0 ? void 0 : _material$defines.FadeFar) == void 0 || e.distance < material.uniforms.fadeFar.value * 1.2) && ((material.depthTest == false || material.depthWrite == false) && !material.realUseDepth || (material.useDepth ? e.distance <= _this6.intersect.distance + material.uniforms.clipDistance.value : e.distance <= _this6.intersect.distance)); //maxClipFactor是否需要考虑?
  31864. });
  31865. }
  31866. intersections = intersections.map(function (e) {
  31867. //add 转化为interactables
  31868. var object = e.object;
  31869. do {
  31870. if (interactables.includes(object)) {
  31871. e.oriObject = e.object;
  31872. e.object = object;
  31873. break;
  31874. }
  31875. object = object.parent;
  31876. } while (object);
  31877. return e;
  31878. }); //add for测量线,在检测到sphere时优先选中sphere而非线
  31879. //intersections = intersections.sort(function(a,b){return b.object.renderOrder-a.object.renderOrder}) // 降序
  31880. intersections = intersections.sort(function (a, b) {
  31881. var order2 = b.object.pickOrder || 0;
  31882. var order1 = a.object.pickOrder || 0;
  31883. return order2 - order1;
  31884. }); // 降序
  31885. //console.log('getHoveredElement ', intersections)
  31886. return intersections;
  31887. }
  31888. }, {
  31889. key: "update",
  31890. value: function update(delta) {}
  31891. }, {
  31892. key: "getMouseDirection",
  31893. value: function getMouseDirection(pointer) {
  31894. //add
  31895. pointer = pointer || this.pointer;
  31896. var camera = this.hoverViewport.camera;
  31897. var t = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(camera),
  31898. i = new THREE.Vector3(pointer.x, pointer.y, 1).unproject(camera);
  31899. return {
  31900. origin: t,
  31901. direction: i.clone().sub(t).normalize()
  31902. };
  31903. }
  31904. }]);
  31905. return InputHandler;
  31906. }(THREE.EventDispatcher);
  31907. /**
  31908. * @author alteredq / http://alteredqualia.com/
  31909. */
  31910. var Pass = function Pass() {
  31911. // if set to true, the pass is processed by the composer
  31912. this.enabled = true; // if set to true, the pass indicates to swap read and write buffer after rendering
  31913. this.needsSwap = true; // if set to true, the pass clears its buffer before rendering
  31914. this.clear = false; // if set to true, the result of the pass is rendered to screen
  31915. this.renderToScreen = false;
  31916. };
  31917. Object.assign(Pass.prototype, {
  31918. setSize: function setSize(width, height) {},
  31919. render: function render(renderer, writeBuffer, readBuffer, delta, maskActive) {
  31920. console.error('THREE.Pass: .render() must be implemented in derived pass.');
  31921. }
  31922. });
  31923. var ShaderPass = function ShaderPass(shader, textureID) {
  31924. Pass.call(this);
  31925. this.textureID = textureID !== undefined ? textureID : 'tDiffuse';
  31926. if (shader instanceof THREE.ShaderMaterial) {
  31927. this.uniforms = shader.uniforms;
  31928. this.material = shader;
  31929. } else if (shader) {
  31930. this.uniforms = THREE.UniformsUtils.clone(shader.uniforms);
  31931. this.material = new THREE.ShaderMaterial({
  31932. defines: Object.assign({}, shader.defines),
  31933. uniforms: this.uniforms,
  31934. vertexShader: shader.vertexShader,
  31935. fragmentShader: shader.fragmentShader,
  31936. transparent: true //add
  31937. });
  31938. }
  31939. this.camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);
  31940. this.scene = new THREE.Scene();
  31941. this.quad = new THREE.Mesh(new THREE.PlaneBufferGeometry(2, 2), null);
  31942. this.quad.frustumCulled = false; // Avoid getting clipped
  31943. this.scene.add(this.quad);
  31944. };
  31945. ShaderPass.prototype = Object.assign(Object.create(Pass.prototype), {
  31946. constructor: ShaderPass,
  31947. render: function render(scene, camera, viewports, renderer, writeBuffer, readBuffer, delta, maskActive) {
  31948. var oldTarget = renderer.getRenderTarget();
  31949. /* if(this.readTarget){ //add
  31950. readBuffer = oldTarget
  31951. } */
  31952. if (this.uniforms[this.textureID]) {
  31953. this.uniforms[this.textureID].value = readBuffer.texture;
  31954. }
  31955. this.quad.material = this.material;
  31956. if (this.renderToScreen) {
  31957. renderer.render(this.scene, this.camera);
  31958. } else {
  31959. renderer.setRenderTarget(writeBuffer);
  31960. if (this.clear) renderer.clear();
  31961. renderer.render(this.scene, this.camera);
  31962. renderer.setRenderTarget(oldTarget);
  31963. }
  31964. }
  31965. });
  31966. /**
  31967. * Created by Wandergis on 2015/7/8.
  31968. * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
  31969. */
  31970. var coordtransform = createCommonjsModule(function (module) {
  31971. //UMD魔法代码
  31972. // if the module has no dependencies, the above pattern can be simplified to
  31973. (function (root, factory) {
  31974. if (module.exports) {
  31975. // Node. Does not work with strict CommonJS, but
  31976. // only CommonJS-like environments that support module.exports,
  31977. // like Node.
  31978. module.exports = factory();
  31979. } else {
  31980. // Browser globals (root is window)
  31981. root.coordtransform = factory();
  31982. }
  31983. })(commonjsGlobal, function () {
  31984. //定义一些常量
  31985. var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
  31986. var PI = 3.1415926535897932384626;
  31987. var a = 6378245.0;
  31988. var ee = 0.00669342162296594323;
  31989. /**
  31990. * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
  31991. * 即 百度 转 谷歌、高德
  31992. * @param bd_lon
  31993. * @param bd_lat
  31994. * @returns {*[]}
  31995. */
  31996. var bd09togcj02 = function bd09togcj02(bd_lon, bd_lat) {
  31997. var bd_lon = +bd_lon;
  31998. var bd_lat = +bd_lat;
  31999. var x = bd_lon - 0.0065;
  32000. var y = bd_lat - 0.006;
  32001. var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);
  32002. var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);
  32003. var gg_lng = z * Math.cos(theta);
  32004. var gg_lat = z * Math.sin(theta);
  32005. return [gg_lng, gg_lat];
  32006. };
  32007. /**
  32008. * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
  32009. * 即谷歌、高德 转 百度
  32010. * @param lng
  32011. * @param lat
  32012. * @returns {*[]}
  32013. */
  32014. var gcj02tobd09 = function gcj02tobd09(lng, lat) {
  32015. var lat = +lat;
  32016. var lng = +lng;
  32017. var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
  32018. var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
  32019. var bd_lng = z * Math.cos(theta) + 0.0065;
  32020. var bd_lat = z * Math.sin(theta) + 0.006;
  32021. return [bd_lng, bd_lat];
  32022. };
  32023. /**
  32024. * WGS84转GCj02
  32025. * @param lng
  32026. * @param lat
  32027. * @returns {*[]}
  32028. */
  32029. var wgs84togcj02 = function wgs84togcj02(lng, lat) {
  32030. var lat = +lat;
  32031. var lng = +lng;
  32032. if (out_of_china(lng, lat)) {
  32033. return [lng, lat];
  32034. } else {
  32035. var dlat = transformlat(lng - 105.0, lat - 35.0);
  32036. var dlng = transformlng(lng - 105.0, lat - 35.0);
  32037. var radlat = lat / 180.0 * PI;
  32038. var magic = Math.sin(radlat);
  32039. magic = 1 - ee * magic * magic;
  32040. var sqrtmagic = Math.sqrt(magic);
  32041. dlat = dlat * 180.0 / (a * (1 - ee) / (magic * sqrtmagic) * PI);
  32042. dlng = dlng * 180.0 / (a / sqrtmagic * Math.cos(radlat) * PI);
  32043. var mglat = lat + dlat;
  32044. var mglng = lng + dlng;
  32045. return [mglng, mglat];
  32046. }
  32047. };
  32048. /**
  32049. * GCJ02 转换为 WGS84
  32050. * @param lng
  32051. * @param lat
  32052. * @returns {*[]}
  32053. */
  32054. var gcj02towgs84 = function gcj02towgs84(lng, lat) {
  32055. var lat = +lat;
  32056. var lng = +lng;
  32057. if (out_of_china(lng, lat)) {
  32058. return [lng, lat];
  32059. } else {
  32060. var dlat = transformlat(lng - 105.0, lat - 35.0);
  32061. var dlng = transformlng(lng - 105.0, lat - 35.0);
  32062. var radlat = lat / 180.0 * PI;
  32063. var magic = Math.sin(radlat);
  32064. magic = 1 - ee * magic * magic;
  32065. var sqrtmagic = Math.sqrt(magic);
  32066. dlat = dlat * 180.0 / (a * (1 - ee) / (magic * sqrtmagic) * PI);
  32067. dlng = dlng * 180.0 / (a / sqrtmagic * Math.cos(radlat) * PI);
  32068. var mglat = lat + dlat;
  32069. var mglng = lng + dlng;
  32070. return [lng * 2 - mglng, lat * 2 - mglat];
  32071. }
  32072. };
  32073. var transformlat = function transformlat(lng, lat) {
  32074. var lat = +lat;
  32075. var lng = +lng;
  32076. var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
  32077. ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
  32078. ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
  32079. ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
  32080. return ret;
  32081. };
  32082. var transformlng = function transformlng(lng, lat) {
  32083. var lat = +lat;
  32084. var lng = +lng;
  32085. var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
  32086. ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
  32087. ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
  32088. ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
  32089. return ret;
  32090. };
  32091. /**
  32092. * 判断是否在国内,不在国内则不做偏移
  32093. * @param lng
  32094. * @param lat
  32095. * @returns {boolean}
  32096. */
  32097. var out_of_china = function out_of_china(lng, lat) {
  32098. var lat = +lat;
  32099. var lng = +lng; // 纬度3.86~53.55,经度73.66~135.05
  32100. return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
  32101. };
  32102. return {
  32103. bd09togcj02: bd09togcj02,
  32104. gcj02tobd09: gcj02tobd09,
  32105. wgs84togcj02: wgs84togcj02,
  32106. gcj02towgs84: gcj02towgs84
  32107. };
  32108. });
  32109. });
  32110. 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); }; }
  32111. 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; } }
  32112. var mapHeight = 10;
  32113. var panosHeight = 11;
  32114. var cursorHeight = 20; //比地图高就行
  32115. var cameraHeight = 100;
  32116. new THREE.TextureLoader();
  32117. var planeGeo$3 = new THREE.PlaneBufferGeometry(1, 1);
  32118. var markerSize = 1;
  32119. var mapBG = '#F5F5F5';
  32120. var initCameraFeildWidth = 50;
  32121. var panoMarkerMats;
  32122. var player$j, transform; // 84坐标转高德 (国外地区用84,所以地理注册时填的是84,我这需要转成高德)
  32123. var wgs84ToAMap = function wgs84ToAMap(pos) {
  32124. var latlng = coordtransform.wgs84togcj02(pos.x, pos.y);
  32125. return {
  32126. x: latlng[0],
  32127. y: latlng[1]
  32128. };
  32129. }; // 高德坐标转84
  32130. var aMapToWgs84 = function aMapToWgs84(pos) {
  32131. var latlng = coordtransform.gcj02towgs84(pos.x, pos.y);
  32132. return {
  32133. x: latlng[0],
  32134. y: latlng[1]
  32135. };
  32136. };
  32137. var AMapWith84 = {
  32138. aMapToWgs84,
  32139. wgs84ToAMap
  32140. }; //地图的camera依然是y朝上,scene旋转90度。地图要做到laser中y朝上,x朝右的效果,就要z朝下(地图平面的),x朝右,相机方向固定。
  32141. var tranSceneToMap,
  32142. orientation = 0;
  32143. var MapViewer = /*#__PURE__*/function (_ViewerBase) {
  32144. _inherits(MapViewer, _ViewerBase);
  32145. var _super = _createSuper$18(MapViewer);
  32146. function MapViewer(dom, _player) {
  32147. var _this;
  32148. _classCallCheck(this, MapViewer);
  32149. if (!dom) {
  32150. dom = document.createElement('div');
  32151. document.getElementsByTagName('body')[0].appendChild(dom);
  32152. dom.style.width = '300px';
  32153. dom.style.height = '200px';
  32154. dom.style.position = 'fixed';
  32155. dom.style.right = 0, dom.style.top = 0;
  32156. dom.style['z-index'] = 10000;
  32157. dom.style.background = '#fff';
  32158. }
  32159. _this = _super.call(this, dom, {
  32160. clearColor: '#F5F5F5',
  32161. name: 'mapViewer',
  32162. antialias: true
  32163. });
  32164. player$j = _player;
  32165. _this.$app = player$j.$app; //因context的preserveDrawingBuffer为false之后,canvas渲染多个viewport时会自动clear,所以若不渲染就会是空的。所以没有变化时就直接拷贝buffer好了。
  32166. /* this.copyPass = new ShaderPass(THREE.CopyShader)
  32167. this.copyBuffer = new THREE.WebGLRenderTarget(100, 100, {
  32168. minFilter: THREE.LinearFilter,
  32169. magFilter: THREE.LinearFilter,
  32170. format: THREE.RGBAFormat,
  32171. stencilBuffer: false,
  32172. }) */
  32173. var metadata = player$j.$app.store.getValue('metadata');
  32174. var entityData = metadata.tiledMap && metadata.tiledMap[0];
  32175. if (entityData) {
  32176. _this.visible = true;
  32177. player$j.$app.core.get('SceneRenderer').addComponent(_assertThisInitialized(_this));
  32178. _this.initScene();
  32179. _this.needRender_ = false;
  32180. _this.mapLayer = new MapLayer(_assertThisInitialized(_this), _this.viewports[0]);
  32181. _this.scene.rotation.x = -Math.PI / 2; //场景里的内容改为z朝上
  32182. _this.scene.add(_this.mapLayer.sceneGroup);
  32183. _this.mapLayer.sceneGroup.position.setZ(mapHeight);
  32184. _this.scene.updateMatrixWorld();
  32185. _this.mapRatio = 0.5;
  32186. _this.splitDir = 'leftRight';
  32187. _this.renderMeasure = false;
  32188. _this.initProjection(entityData); //viewer.scene.addEventListener("360_images_added", this.addPanos.bind(this))
  32189. _this.addPanos();
  32190. _this.addEventListener('global_click', function (e) {
  32191. if (!e.isTouch && e.button != THREE.MOUSE.LEFT) return;
  32192. _this.updateClosestPano(e.pointer);
  32193. });
  32194. _this.addEventListener('add', function (e) {
  32195. //添加其他mesh
  32196. _this.scene.add(e.object);
  32197. common$1.setObjectLayers(e.object, 'DEFAULT');
  32198. });
  32199. /* viewer.addEventListener('allLoaded',()=>{
  32200. this.setViewLimit('standard')
  32201. }) */
  32202. player$j.on('update', function (e) {
  32203. e.lastFrameChanged && _this.updateCursor();
  32204. });
  32205. player$j.on('startTransition', function (e) {
  32206. //console.log(e)
  32207. _this.moveTo(e.pano.position, e.duration, e.easeFun, e.progress);
  32208. });
  32209. setTimeout(function () {
  32210. _this.mapLayer.needUpdate = true;
  32211. }, 1); //this.loadEntity()
  32212. } else {
  32213. //产品说没数据时可能没准备好,给个提示
  32214. var src = texture.getImageURL('images/map_no_location.png');
  32215. _this.renderer.domElement.style['background-image'] = "url(".concat(src, ")");
  32216. _this.renderer.domElement.style['background-position'] = "center";
  32217. if (config$6.view) {
  32218. _this.renderer.domElement.style['background-size'] = "72%";
  32219. }
  32220. setTimeout(function () {
  32221. var btn = _this.domElement.querySelector('.minimap-scale-btn');
  32222. btn && (btn.style.display = 'none');
  32223. btn = _this.domElement.querySelector('.tile-btn');
  32224. btn && (btn.style.display = 'none');
  32225. }, 1);
  32226. console.log('产品说没数据时可能没准备好,给个提示, no tiledMap');
  32227. }
  32228. return _this;
  32229. } // lerp.vector(this.controls.target, endPos)
  32230. _createClass(MapViewer, [{
  32231. key: "moveTo",
  32232. value: function moveTo(endPos, duration, easeFun) {
  32233. var _this2 = this;
  32234. transitions$1.cancelById('mapCamMove');
  32235. var startPos = this.camera.position.clone(); //player.currentPano.position
  32236. transitions$1.start(function (progress, delta) {
  32237. //progress = startProgress + progress * (1 - startProgress)//如果用类似player里的progress,startPos必须是上个点位,开始移动会先瞬移到该点位。目前不用这个progress好像也没问题
  32238. _this2.controls.target.copy(startPos);
  32239. lerp.vector(_this2.controls.target, endPos)(progress);
  32240. _this2.camera.position.addVectors(_this2.controls.target, _this2.controls.offset);
  32241. }, duration, null, 0, easeFun, 'mapCamMove', 'mapCamMove');
  32242. }
  32243. }, {
  32244. key: "needRender",
  32245. get: function get() {
  32246. return this.needRender_;
  32247. },
  32248. set: function set(n) {
  32249. this.needRender_ = n; //n && (this.viewports[0].needRender = true) //使attachedToViewer时在renderDefault中可渲染
  32250. }
  32251. }, {
  32252. key: "mapChanged",
  32253. get: function get() {
  32254. return this.mapChanged_;
  32255. },
  32256. set: function set(c) {
  32257. //镜头移动、地图内容改变都会为true
  32258. this.mapChanged_ = c;
  32259. c && (this.needRender = true);
  32260. }
  32261. }, {
  32262. key: "waitLoadDone",
  32263. value: function waitLoadDone(callback) {
  32264. var _this3 = this;
  32265. //确保加载完后执行
  32266. var timer; //等待一段时间看有没有新加载的tile,如果超过这个时间没有就不等了,算加载结束
  32267. var pauseCountDown = function pauseCountDown() {
  32268. //重新等待加载结束,中断倒计时
  32269. clearTimeout(timer); //console.log('pauseCountDown')
  32270. };
  32271. var freshCountDown = function freshCountDown() {
  32272. //刷新倒计时
  32273. //console.log('freshCountDown')
  32274. clearTimeout(timer);
  32275. timer = setTimeout(function () {
  32276. _this3.mapLayer.removeEventListener('loadDone', freshCountDown);
  32277. _this3.mapLayer.removeEventListener('startLoad', pauseCountDown);
  32278. callback();
  32279. }, document.hidden ? 5000 : 500);
  32280. };
  32281. this.mapLayer.addEventListener('loadDone', freshCountDown);
  32282. this.mapLayer.addEventListener('startLoad', pauseCountDown);
  32283. if (this.mapLayer.loadingInProgress == 0) {
  32284. freshCountDown();
  32285. }
  32286. }
  32287. }, {
  32288. key: "initScene",
  32289. value: function initScene() {
  32290. this.domElement.clientWidth;
  32291. this.domElement.clientHeight; //let aspect = width / height
  32292. this.camera = new FloorplanCamera(); //new THREE.OrthographicCamera(-width/2,width/2,height/2,-height/2/* -w/2, w/2, w/2/aspect, -w/2/aspect */, 0.01, 10000);
  32293. //this.camera.zoom = width / w //zoom越大视野越小
  32294. this.camera.position.set(0, cameraHeight, 0);
  32295. this.camera.up.set(0, 1, 0);
  32296. this.camera.updateProjectionMatrix();
  32297. this.camera.updateMatrixWorld();
  32298. var viewport = new Viewport(this.camera, {
  32299. left: 0,
  32300. bottom: 0,
  32301. width: 1,
  32302. height: 1,
  32303. name: 'mapViewport'
  32304. });
  32305. /* viewport.addEventListener('resize', () => {
  32306. this.copyBuffer.setSize(viewport.resolution2.x, viewport.resolution2.y)
  32307. }) */
  32308. this.viewports = [viewport];
  32309. var far = 1000;
  32310. var moveBound = new THREE.Box3(new THREE.Vector3(-far, -far, -far), new THREE.Vector3(far, far, far));
  32311. this.controls = new FloorplanControls(this.camera, this.domElement, this);
  32312. this.controls.mouseActions[2] = ControlActions.PAN;
  32313. this.controls.touchActions[2] = ControlActions.PAN_DOLLY; //原ROTATE_DOLLY ,试试改了可以不,不能就DOLLY
  32314. this.controls.setBounds(moveBound); //setZoomBounds要写吗
  32315. this.controls.zoomToContain(new THREE.Vector3(40, 40, 40), 1);
  32316. this.controls.update(0);
  32317. this.controls.enabled = true;
  32318. this.controls.zoomSpeed = 5;
  32319. this.ctlBindEvents(); //和激光有点不同,这改变平面图canvas大小时,地图也跟着缩放,因为 camera 机制不同,不会根据canvas宽高改变left等边界,也就保持内容大小和canvas大小相对一致。
  32320. this.scene = new THREE.Scene();
  32321. var cursor = new THREE.Mesh(planeGeo$3, new THREE.MeshBasicMaterial({
  32322. transparent: true,
  32323. opacity: 0.9,
  32324. depthTest: false,
  32325. //防止透明冲突
  32326. map: common$1.loadTextureFromCache(texture.getImageURL('images/pic_location128.png'))
  32327. }));
  32328. cursor.position.set(0, 0, cursorHeight);
  32329. cursor.name = 'cursor';
  32330. this.cursor = cursor;
  32331. this.scene.add(cursor); //common.setObjectLayers(this.cursor, 'DEFAULT' )
  32332. this.inputHandler = new InputHandler(this, this.scene, player$j);
  32333. this.inputHandler.name = 'mapInputHandler'; //this.inputHandler.addInputListener(this.controls);
  32334. this.inputHandler.registerInteractiveScene(this.scene); //interactiveScenes
  32335. this.viewports[0].interactiveScenes = this.inputHandler.interactiveScenes; //供viewer的inputHandler使用
  32336. }
  32337. }, {
  32338. key: "ctlBindEvents",
  32339. value: function ctlBindEvents() {
  32340. var dom = this.domElement;
  32341. dom.addEventListener('mousemove', this.controls.onMouseMove.bind(this.controls));
  32342. dom.addEventListener('mousedown', this.controls.onMouseDown.bind(this.controls));
  32343. dom.addEventListener('mouseup', this.controls.onMouseUp.bind(this.controls));
  32344. dom.addEventListener('mousewheel', this.controls.onMouseWheel.bind(this.controls), {
  32345. passive: false
  32346. });
  32347. dom.addEventListener('DOMMouseScroll', this.controls.onMouseWheel.bind(this.controls), {
  32348. passive: false
  32349. });
  32350. dom.addEventListener('touchstart', this.controls.onTouchStart.bind(this.controls), {
  32351. passive: false
  32352. });
  32353. dom.addEventListener('touchmove', this.controls.onTouchMove.bind(this.controls), {
  32354. passive: false
  32355. });
  32356. dom.addEventListener('touchend', this.controls.onTouchEnd.bind(this.controls));
  32357. dom.addEventListener('contextmenu', function (e) {
  32358. e.preventDefault();
  32359. });
  32360. dom.addEventListener('pointerdown', this.controls.onPointerDown.bind(this.controls));
  32361. dom.addEventListener('pointermove', this.controls.onPointerMove.bind(this.controls));
  32362. dom.addEventListener('pointerup', this.controls.onPointerUp.bind(this.controls));
  32363. /*dom.addEventListener('mouseover', this.controls.onMouseOver.bind(this.controls))
  32364. dom.addEventListener('pointerout', this.controls.onPointerCancel.bind(this.controls))
  32365. dom.addEventListener('pointercancel', this.controls.onPointerCancel.bind(this.controls))
  32366. document.addEventListener('keydown', this.controls.onKeyDown.bind(this.controls))
  32367. document.addEventListener('keyup', this.controls.onKeyUp.bind(this.controls)) */
  32368. }
  32369. }, {
  32370. key: "updateCursor",
  32371. value: function updateCursor() {
  32372. if (!player$j.camera) return;
  32373. var scale = math$2.getScaleForConstantSize({
  32374. //规定下最小最大像素
  32375. minSize: 80,
  32376. maxSize: 200,
  32377. nearBound: initCameraFeildWidth * 0.01,
  32378. farBound: initCameraFeildWidth * 0.3,
  32379. position: this.cursor.getWorldPosition(new THREE.Vector3()),
  32380. resolution: this.viewports[0].resolution,
  32381. //2
  32382. dom: this.domElement,
  32383. camera: this.camera
  32384. });
  32385. this.cursor.scale.set(scale, scale, scale); //当地图缩放时
  32386. this.cursor.position.copy(tranSceneToMap.vec(player$j.camera.position)).setZ(cursorHeight); //当场景镜头旋转移动时
  32387. //let yaw = math.getYawByDir(player.getDirection())
  32388. this.cursor.rotation.z = player$j.yaw - Math.PI / 2 + orientation; //万一在数据集校准里倾斜模型怎么办?
  32389. this.needRender = true;
  32390. }
  32391. }, {
  32392. key: "addPanos",
  32393. value: function addPanos(e) {
  32394. var _this4 = this;
  32395. var panosGroup = new THREE.Object3D();
  32396. panosGroup.name = 'markers';
  32397. panoMarkerMats = {
  32398. default: new THREE.MeshBasicMaterial({
  32399. transparent: true,
  32400. opacity: 0.5,
  32401. map: common$1.loadTextureFromCache(texture.getImageURL('images/map_marker.png')) //texLoader.load(Potree.resourcePath+'/textures/map_marker.png' ),
  32402. }),
  32403. selected: new THREE.MeshBasicMaterial({
  32404. transparent: true,
  32405. opacity: 1,
  32406. map: common$1.loadTextureFromCache(texture.getImageURL('images/map_marker.png'))
  32407. })
  32408. };
  32409. player$j.model.panos.list.forEach(function (pano) {
  32410. if (!pano.isAligned()) return;
  32411. pano.mapMarker = new THREE.Mesh(planeGeo$3, panoMarkerMats.default);
  32412. pano.posOnMap = tranSceneToMap.vec(pano.position).setZ(0);
  32413. pano.mapMarker.position.copy(pano.posOnMap);
  32414. pano.mapMarker.scale.set(markerSize, markerSize, markerSize);
  32415. pano.mapMarker.name = 'mapMarker';
  32416. panosGroup.add(pano.mapMarker);
  32417. var mouseover = function mouseover(e) {
  32418. if (!e.byMap) {
  32419. pano.mapMarker.material = panoMarkerMats.selected; //if(!e.byMainView) pano.dispatchEvent({type: "hoverOn", byMap:true})
  32420. _this4.needRender = true;
  32421. }
  32422. };
  32423. var mouseleave = function mouseleave(e) {
  32424. if (!e.byMap) {
  32425. pano.mapMarker.material = panoMarkerMats.default; //if(!e.byMainView) pano.dispatchEvent({type: "hoverOff", byMap:true})
  32426. _this4.needRender = true;
  32427. }
  32428. };
  32429. pano.mapMarker.addEventListener('mouseover', mouseover);
  32430. pano.mapMarker.addEventListener('mouseleave', mouseleave);
  32431. /* let onclick = (e)=>{
  32432. player.flyToPano(pano)
  32433. }
  32434. pano.mapMarker.addEventListener('click', onclick); */
  32435. });
  32436. this.scene.add(panosGroup);
  32437. panosGroup.position.z = panosHeight;
  32438. this.panosGroup = panosGroup; // common.setObjectLayers(panosGroup, 'PANOMARKERS' )
  32439. /* e.images.on('markersDisplayChange', (show)=>{
  32440. panosGroup.visible = show
  32441. this.needRender = true
  32442. }) */
  32443. //可视和marker一致,尤其针对多楼层
  32444. player$j.on('flying.ended', function () {
  32445. if (player$j.mode != 'panorama') return; //多层楼也只有一张平面图,飞出后怎么展示marker? 不好判断我先不处理
  32446. setTimeout(function (e) {
  32447. player$j.model.panos.list.forEach(function (pano) {
  32448. if (pano.isAligned()) pano.mapMarker.visible = pano.marker.visible;
  32449. });
  32450. _this4.needRender = true;
  32451. }, 100); //等marker透明度渐变到>0才可见
  32452. }); //-------
  32453. //this.fitPanosToViewport()
  32454. //this.initFitView()
  32455. }
  32456. }, {
  32457. key: "updateClosestPano",
  32458. value: function updateClosestPano(pointer) {
  32459. if (player$j.flying) return;
  32460. var intersect = new THREE.Vector3(pointer.x, pointer.y, -1).unproject(this.camera).setY(0);
  32461. intersect = math$2.invertVisionVector(intersect); //z up
  32462. var minDis = 400; //距离鼠标不能太远
  32463. var disMap = new Map();
  32464. var filterFuncs = [Panorama.filters.isPanoAligned(), //只走显示的点,否则会走到别的层
  32465. function (pano) {
  32466. var d =
  32467. /* pano.position.clone().setY(0) */
  32468. pano.posOnMap.distanceToSquared(intersect);
  32469. if (d < minDis) {
  32470. disMap.set(pano, d);
  32471. return true;
  32472. }
  32473. }];
  32474. var pano = player$j.model.panos.find(filterFuncs, [function (pano1, pano2) {
  32475. return disMap.get(pano1) - disMap.get(pano2);
  32476. }]);
  32477. if (pano && pano != player$j.currentPano) {
  32478. player$j.flyToPano(pano);
  32479. }
  32480. }
  32481. }, {
  32482. key: "update",
  32483. value: function update(delta, force) {
  32484. if (!this.visible || !tranSceneToMap) return;
  32485. this.updateScreenSize();
  32486. this.controls.update(delta);
  32487. var changed = this.cameraChanged();
  32488. if (this.started && (force || changed || this.mapLayer.needUpdate)) this.mapLayer.update();
  32489. if (changed || force) {
  32490. this.mapChanged = true;
  32491. this.needRender = true;
  32492. this.updateCursor(); //更改大小
  32493. }
  32494. this.render();
  32495. }
  32496. }, {
  32497. key: "clear",
  32498. value: function clear(params) {
  32499. if (this.transparentBG) {
  32500. this.renderer.setClearColor(0x000000, 0);
  32501. } else {
  32502. this.renderer.setClearColor(mapBG, 1);
  32503. }
  32504. (params.renderer || this.renderer).clear();
  32505. }
  32506. }, {
  32507. key: "render",
  32508. value: function render() {
  32509. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  32510. if (!this.visible && !this.attachedToViewer || !this.needRender && !params.force) {
  32511. //注意:mapViewer.needRender的权重高于它的viewport的needRender,也就是说,当attachedToViewer时,viewer即使needRender, mapViewer也不一定会渲染。
  32512. return;
  32513. }
  32514. var renderer = params.renderer || this.renderer;
  32515. this.clear(params);
  32516. renderer.render(this.scene, this.camera);
  32517. this.needRender = false;
  32518. return true;
  32519. } //拆成两次渲染,一个地图一个其他物体,且地图渲染后保存在buffer中,只有当地图变化后才重渲染。
  32520. }, {
  32521. key: "render1",
  32522. value: function render1() {
  32523. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  32524. if (!this.visible && !this.attachedToViewer || !this.needRender && !params.force) {
  32525. //注意:mapViewer.needRender的权重高于它的viewport的needRender,也就是说,当attachedToViewer时,viewer即使needRender, mapViewer也不一定会渲染。
  32526. return;
  32527. } //viewer.addTimeMark('mapRender','start')
  32528. var renderer = params.renderer || this.renderer;
  32529. if (this.mapChanged) {
  32530. //渲染地图背景
  32531. renderer.setRenderTarget(this.copyBuffer);
  32532. params.clear ? params.clear(params) : this.clear(params);
  32533. common$1.setCameraLayers(this.camera, ['DEFAULT']);
  32534. renderer.render(this.scene, this.camera);
  32535. params.renderBG && params.renderBG(this.viewports[0]);
  32536. this.mapChanged = false;
  32537. renderer.setRenderTarget(params.target || null);
  32538. }
  32539. params.clear ? params.clear(params) : this.clear(params);
  32540. this.copyPass.render(null, null, null, renderer, params.target || null, this.copyBuffer); //拷贝地图背景
  32541. renderer.clearDepth(); //防止地图遮挡其他物体
  32542. /*
  32543. //绘制其他物体
  32544. let layers = ['mapObjects' , 'bothMapAndScene', 'light' ]
  32545. Potree.settings.showObjectsOnMap && layers.push('model')
  32546. common.setCameraLayers(this.camera, layers) */
  32547. //viewer.dispatchEvent({type: "render.begin", viewer: this, viewport:this.viewports[0], params });
  32548. renderer.render(this.scene, this.camera);
  32549. /* if(!this.attachedToViewer && this.renderMeasure){//在未attach到主页面时也要渲染测量线
  32550. viewer.dispatchEvent({type: "render.pass.perspective_overlay", camera:this.camera, viewport:this.viewports[0], renderer});
  32551. } */
  32552. renderer.setRenderTarget(null);
  32553. this.needRender = false; //viewer.addTimeMark('mapRender','end')
  32554. return true;
  32555. }
  32556. }, {
  32557. key: "initProjection",
  32558. value: function initProjection(entityData) {
  32559. var _entity;
  32560. var metadata = player$j.$app.store.getValue('metadata'); //if (metadata.orientation != void 0) {
  32561. var entity;
  32562. if (entityData) {
  32563. this.setLonlat(entityData.location[0], entityData.location[1]
  32564. /* 113.595007951539, 22.367294366944193 */
  32565. );
  32566. entity = this.mapLayer.addMapEntity(entityData
  32567. /* , orientationUser */
  32568. ); //没经纬度还显示地图吗?
  32569. if (metadata.orientation != void 0) {
  32570. //有控制点 rtk的话经纬度才准确,才显示地图,同laser
  32571. this.mapLayer.addStreetMap();
  32572. }
  32573. this.started = true;
  32574. this.mapLayer.initProjection(); //万一在数据集校准里倾斜模型怎么办?
  32575. var dir = new THREE.Vector3(0, 1, 0).applyQuaternion(entity.quaternion.normalize()); //z up
  32576. orientation = math$2.getYawByDir(math$2.convertVisionVector(dir)) - Math.PI / 2; //to y up
  32577. } //SG-t-Jt3tIWYQNdp 113.59570167962725, 22.36665852470534
  32578. /* let orientation = 0.02//-0.38548921292333205 //SG-t-1HLWAvLm651#/
  32579. let rotMatrix = new THREE.Matrix4().makeRotationZ(orientation) */
  32580. var rotQua = (_entity = entity) === null || _entity === void 0 ? void 0 : _entity.quaternion;
  32581. if (!rotQua) {
  32582. orientation = player$j.compass.angle; //???可??
  32583. rotQua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), orientation);
  32584. }
  32585. tranSceneToMap = {
  32586. //和laser不同的是,laser的模型和平面图完全对应,都旋转了;在这我不敢旋转模型,只能修改物体投射在map上的位置和朝向,使对应。(检验是否无误:飞到2d模式对比场景和map,cursor向上时要一致(地图保持上北))
  32587. vec(pos) {
  32588. var p = math$2.invertVisionVector(pos);
  32589. p.applyQuaternion(rotQua); //.applyMatrix4(rotMatrix)
  32590. return p;
  32591. }
  32592. };
  32593. return true;
  32594. }
  32595. }, {
  32596. key: "loadEntity",
  32597. value: function loadEntity() {
  32598. //test
  32599. /* let data = {
  32600. "id": "1846806671879966720",
  32601. "file_path": "/testdata/SG-t-Jt3tIWYQNdp/data/bundle_SG-t-Jt3tIWYQNdp/building/map_tiles",
  32602. "floor_id": 11,
  32603. "map_size_m": 62.0,
  32604. "max_depth": 3,
  32605. "quadtree": "fcd33ce8f5abf1",
  32606. "location": [ 113.59570167962725, 22.36665852470534, 0.0 ],
  32607. "orientation": [ 0.7061519987398275, 0.0, 0.0, 0.7080602761599796 ],
  32608. "tile_size_px": 256,
  32609. "sceneCode": "SG-t-Jt3tIWYQNdp",
  32610. "display": 1,
  32611. "status": 0,
  32612. "createTime": "2024-10-17 14:53:17"
  32613. }
  32614. let orientationUser = new THREE.Quaternion().copy({
  32615. "x": 0,
  32616. "y": 0,
  32617. "z": 0.001349355904174845,
  32618. "w": 0.9999990896189075
  32619. })//laser 的 */
  32620. var data = {
  32621. id: '1905220000788647936',
  32622. file_path: '/testdata/SG-t-1HLWAvLm651/data/bundle_SG-t-1HLWAvLm651/building/map_tiles',
  32623. floor_id: 11,
  32624. map_size_m: 124.0,
  32625. max_depth: 4,
  32626. quadtree: 'f8435e56f5118fcfa1bf23f34',
  32627. location: [113.595007951539, 22.367294366944193, 6.949324108125],
  32628. orientation: [0.829461419705237, 0.0, 0.0, 0.5585640099581897],
  32629. tile_size_px: 256,
  32630. sceneCode: 'SG-t-1HLWAvLm651',
  32631. display: 1,
  32632. status: 0,
  32633. createTime: '2025-03-27 19:27:00'
  32634. };
  32635. var orientationUser = new THREE.Quaternion().copy({
  32636. x: 0,
  32637. y: 0,
  32638. z: -0.19155339543800784,
  32639. w: 0.9814821937743803
  32640. });
  32641. this.mapLayer.addMapEntity(data, orientationUser);
  32642. } //对应激光场景 http://192.168.0.125:1804/mega/index.html?m=SG-hx-HBfpp585IXE 测试场景
  32643. }, {
  32644. key: "setLonlat",
  32645. value: function setLonlat(lon, lat) {
  32646. var locationLonLat = [lon, lat];
  32647. if (AMapWith84 && config$6.mapCompany != 'google') {
  32648. //需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差. navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
  32649. locationLonLat = AMapWith84.wgs84ToAMap({
  32650. x: lon,
  32651. y: lat
  32652. });
  32653. locationLonLat = [locationLonLat.x, locationLonLat.y];
  32654. } //Map.js用的:
  32655. proj4.defs('EPSG:3857', '+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs');
  32656. proj4.defs('LOCAL', '+proj=tmerc +ellps=WGS84 +lon_0=' + locationLonLat[0].toPrecision(15) + ' +lat_0=' + locationLonLat[1].toPrecision(15)); //高德坐标系
  32657. proj4.defs('LOCAL_MAP', '+proj=tmerc +ellps=WGS84 +lon_0=' + locationLonLat[0].toPrecision(15) + ' +lat_0=' + locationLonLat[1].toPrecision(15)); //地图和本地一样
  32658. proj4.defs('WGS84', '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs');
  32659. transform = {
  32660. lonlatToLocal: proj4('WGS84', 'LOCAL')
  32661. };
  32662. this.mapLayer.transform = transform;
  32663. console.log("setLonlat ".concat(lon, ", ").concat(lat)); //see https://uat-laser.4dkankan.com/uat/index.html?m=SS-t-uMizHDioNE#/
  32664. if (AMapWith84 && config$6.mapCompany != 'google') {
  32665. //需要转换, 因本地高德用的lonlat和数据里的84不一样. (google地图在国内也用的高德,国外84)
  32666. var change = function change(transform) {
  32667. var forward = transform.forward;
  32668. var inverse = transform.inverse;
  32669. transform.forward = function (e, not84) {
  32670. var needTran = e.x == void 0;
  32671. if (needTran) var a1 = {
  32672. x: e[0],
  32673. y: e[1]
  32674. };else var a1 = e;
  32675. var a = not84 ? a1 : AMapWith84.wgs84ToAMap(a1);
  32676. if (needTran) {
  32677. a = [a.x, a.y];
  32678. e[2] != void 0 && (a[2] = e[2]);
  32679. } else {
  32680. e.z != void 0 && (a.z = e.z);
  32681. }
  32682. return forward(a);
  32683. };
  32684. transform.inverse = function (e, not84) {
  32685. var needTran = e.x == void 0;
  32686. var a = inverse(e);
  32687. needTran && (a = {
  32688. x: a[0],
  32689. y: a[1]
  32690. });
  32691. a = not84 ? a : AMapWith84.aMapToWgs84(a);
  32692. if (needTran) {
  32693. a = [a.x, a.y];
  32694. e[2] != void 0 && (a[2] = e[2]);
  32695. } else {
  32696. e.z != void 0 && (a.z = e.z);
  32697. }
  32698. return a;
  32699. };
  32700. };
  32701. for (var f in transform) {
  32702. change(transform[f]);
  32703. } //注意:把几万米转成经纬度再转回来差值会很大
  32704. }
  32705. }
  32706. }, {
  32707. key: "show",
  32708. value: function show() {
  32709. if (this.visible) return;
  32710. this.renderer.domElement.style.display = '';
  32711. this.domElement.style.display = '';
  32712. this.visible = true;
  32713. this.update(1, true);
  32714. }
  32715. }, {
  32716. key: "hide",
  32717. value: function hide() {
  32718. this.renderer.domElement.style.display = 'none';
  32719. this.visible = false;
  32720. }
  32721. }, {
  32722. key: "switchStyle",
  32723. value: function switchStyle(style) {
  32724. console.log('style', style);
  32725. this.mapLayer.maps.find(function (e) {
  32726. return e.name == 'map';
  32727. }).switchStyle(style);
  32728. }
  32729. }, {
  32730. key: "moveTo1",
  32731. value: function moveTo1(endPosition, boundSize) {
  32732. var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  32733. var margin = arguments.length > 3 ? arguments[3] : undefined;
  32734. var easeName = arguments.length > 4 ? arguments[4] : undefined;
  32735. var callback = arguments.length > 5 ? arguments[5] : undefined;
  32736. //前两个参数有xy即可
  32737. var z = Math.max(Potree.config.map.cameraHeight, (endPosition.z || 0) + ((boundSize === null || boundSize === void 0 ? void 0 : boundSize.z) || 0) / 2 + 1);
  32738. endPosition = new THREE.Vector3(endPosition.x, endPosition.y, z);
  32739. this.view.moveOrthoCamera(this.viewports[0], {
  32740. endPosition,
  32741. boundSize,
  32742. margin,
  32743. callback
  32744. }, duration, easeName);
  32745. /* let endZoom, startZoom = this.camera.zoom
  32746. //修改相机为bound中心,这样能看到全部(宽度范围内)
  32747. this.view.setView({ position:endPosition, duration,
  32748. callback:()=>{//done
  32749. },
  32750. onUpdate:(progress)=>{
  32751. if(boundSize){
  32752. let aspect = boundSize.x / boundSize.y
  32753. let w, h;
  32754. if(this.camera.aspect > aspect){//视野更宽则用bound的纵向来决定
  32755. h = boundSize.y
  32756. //w = h * this.camera.aspect
  32757. endZoom = this.viewports[0].resolution.y / h
  32758. }else{
  32759. w = boundSize.x;
  32760. //h = w / this.camera.aspect
  32761. endZoom = this.viewports[0].resolution.x / w
  32762. }
  32763. //onUpdate时更新endzoom是因为画布大小可能更改
  32764. this.camera.zoom = endZoom * progress + startZoom * (1 - progress)
  32765. this.camera.updateProjectionMatrix()
  32766. }
  32767. },
  32768. Easing:easeName
  32769. }) */
  32770. /* fitPanosToViewport(){//使所有漫游点占满viewport
  32771. //var w = viewer.bound.boundSize.x;
  32772. var boundSize = viewer.images360.bound.size.clone().multiplyScalar(1.1);
  32773. boundSize.max(new THREE.Vector3(4,4,4))
  32774. let endPosition = viewer.images360.bound.center.clone()
  32775. this.moveTo(endPosition, boundSize, 0)
  32776. }
  32777. initFitView(){
  32778. let dis = 5 , px = 70 //地图上px像素长度代表的距离为dis //px是手动缩放到5m后发现是这个长度
  32779. let zoom = px / dis;
  32780. this.camera.zoom = zoom
  32781. this.moveTo(viewer.images360.position )
  32782. this.camera.updateProjectionMatrix()
  32783. }
  32784. fitToDatasets(datasets){
  32785. let bound = new THREE.Box3;
  32786. datasets.forEach(e=>bound.union(e.bound))
  32787. let center = bound.getCenter(new THREE.Vector3)
  32788. let size = bound.getSize(new THREE.Vector3)
  32789. this.moveTo(center, size, 200 ) //给duration是为了顺应视口大小改变,缓冲
  32790. }*/
  32791. }
  32792. }]);
  32793. return MapViewer;
  32794. }(ViewerBase);
  32795. var FEET_TO_INCHES_FACTOR = 12;
  32796. var EIGHTHS_SYMBOLS = ['', '⅛', '¼', '⅜', '½', '⅝', '¾', '⅞']; //eighths 八分之……
  32797. var UnitOfMeasurement = /*#__PURE__*/function () {
  32798. //转化单位工具
  32799. function UnitOfMeasurement(t, e, n, i) {
  32800. _classCallCheck(this, UnitOfMeasurement);
  32801. this.name = t, this.symbol = e, this.base = n, this.factor = i;
  32802. }
  32803. _createClass(UnitOfMeasurement, [{
  32804. key: "toBase",
  32805. value: function toBase(t) {
  32806. //换算到base
  32807. return t * this.factor;
  32808. }
  32809. }, {
  32810. key: "fromBase",
  32811. value: function fromBase(t) {
  32812. //换算到当前
  32813. return t / this.factor;
  32814. }
  32815. }]);
  32816. return UnitOfMeasurement;
  32817. }();
  32818. /* var o = function t(e) {
  32819. this.gettext = e,
  32820. t.METRIC = this.gettext("metric", void 0, "measurement system"),
  32821. t.IMPERIAL = this.gettext("imperial", void 0, "measurement system")
  32822. };
  32823. e.UoMSystem = o;
  32824. let UoMSystem = {
  32825. } */
  32826. /* var MeasurementDomain = {
  32827. DISTANCE : "DISTANCE",
  32828. t.AREA = "AREA",
  32829. t.VOLUME = "VOLUME",
  32830. t.DATA = "DATA",
  32831. t
  32832. }
  32833. */
  32834. var UnitsOfMeasurement = {
  32835. MILLIMETER: ['Millimeter', 'mm'],
  32836. CENTIMETER: ['Centimeter', 'cm'],
  32837. METER: ['Meter', 'm'],
  32838. KILOMETER: ['Kilometer', 'km'],
  32839. INCH: ['Inch', 'in'],
  32840. FOOT: ['Foot', 'ft'],
  32841. MILE: ['Mile', 'mi'],
  32842. SQUAREMETER: ['SquareMeter', 'm²'],
  32843. SQUAREFOOT: ['SquareFoot', 'ft²'],
  32844. CUBICMETER: ['CubicMeter', 'm³'],
  32845. CUBICFOOT: ['CubicFoot', 'ft³'],
  32846. BYTE: ['Byte', 'B'],
  32847. KILOBYTE: ['Kilobyte', 'kB'],
  32848. MEGABYTE: ['Megabyte', 'MB'],
  32849. GIGABYTE: ['Gigabyte', 'GB'],
  32850. TERABYTE: ['Terabyte', 'TB'],
  32851. PETABYTE: ['Petabyte', 'PB'],
  32852. init: function init() {
  32853. var e,
  32854. n,
  32855. i,
  32856. a,
  32857. s,
  32858. c,
  32859. l,
  32860. u,
  32861. d,
  32862. p,
  32863. h,
  32864. f = new UnitOfMeasurement(UnitsOfMeasurement.METER[0], UnitsOfMeasurement.METER[1], void 0, 1),
  32865. g = new UnitOfMeasurement(UnitsOfMeasurement.SQUAREMETER[0], UnitsOfMeasurement.SQUAREMETER[1], void 0, 1),
  32866. m = new UnitOfMeasurement(UnitsOfMeasurement.CUBICMETER[0], UnitsOfMeasurement.CUBICMETER[1], void 0, 1),
  32867. v = new UnitOfMeasurement(UnitsOfMeasurement.BYTE[0], UnitsOfMeasurement.BYTE[1], void 0, 1);
  32868. UnitsOfMeasurement.DISTANCE = ((e = {})['metric'] = ((n = {})[UnitsOfMeasurement.MILLIMETER[0]] = new UnitOfMeasurement(UnitsOfMeasurement.MILLIMETER[0], UnitsOfMeasurement.MILLIMETER[1], f, 0.001), n[UnitsOfMeasurement.CENTIMETER[0]] = new UnitOfMeasurement(UnitsOfMeasurement.CENTIMETER[0], UnitsOfMeasurement.CENTIMETER[1], f, 0.01), n[UnitsOfMeasurement.METER[0]] = f, n[UnitsOfMeasurement.KILOMETER[0]] = new UnitOfMeasurement(UnitsOfMeasurement.KILOMETER[0], UnitsOfMeasurement.KILOMETER[1], f, 1e3), n), e['imperial'] = ((i = {})[UnitsOfMeasurement.INCH[0]] = new UnitOfMeasurement(UnitsOfMeasurement.INCH[0], UnitsOfMeasurement.INCH[1], f, 0.0254), i[UnitsOfMeasurement.FOOT[0]] = new UnitOfMeasurement(UnitsOfMeasurement.FOOT[0], UnitsOfMeasurement.FOOT[1], f, 0.3048), i[UnitsOfMeasurement.MILE[0]] = new UnitOfMeasurement(UnitsOfMeasurement.MILE[0], UnitsOfMeasurement.MILE[1], f, 1609.344), i), e);
  32869. UnitsOfMeasurement.AREA = ((a = {})['metric'] = ((s = {})[UnitsOfMeasurement.SQUAREMETER[0]] = g, s), a['imperial'] = ((c = {})[UnitsOfMeasurement.SQUAREFOOT[0]] = new UnitOfMeasurement(UnitsOfMeasurement.SQUAREFOOT[0], UnitsOfMeasurement.SQUAREFOOT[1], g, 0.092903), c), a);
  32870. UnitsOfMeasurement.VOLUME = ((l = {})['metric'] = ((u = {})[UnitsOfMeasurement.CUBICMETER[0]] = m, u), l['imperial'] = ((d = {})[UnitsOfMeasurement.CUBICFOOT[0]] = new UnitOfMeasurement(UnitsOfMeasurement.CUBICFOOT[0], UnitsOfMeasurement.CUBICFOOT[1], m, 0.0283168), d), l); //数据大小
  32871. var y = ((p = {})[UnitsOfMeasurement.BYTE[0]] = v, p[UnitsOfMeasurement.KILOBYTE[0]] = new UnitOfMeasurement(UnitsOfMeasurement.KILOBYTE[0], UnitsOfMeasurement.KILOBYTE[1], v, 1e3), p[UnitsOfMeasurement.MEGABYTE[0]] = new UnitOfMeasurement(UnitsOfMeasurement.MEGABYTE[0], UnitsOfMeasurement.MEGABYTE[1], v, 1e6), p[UnitsOfMeasurement.GIGABYTE[0]] = new UnitOfMeasurement(UnitsOfMeasurement.GIGABYTE[0], UnitsOfMeasurement.GIGABYTE[1], v, 1e9), p[UnitsOfMeasurement.TERABYTE[0]] = new UnitOfMeasurement(UnitsOfMeasurement.TERABYTE[0], UnitsOfMeasurement.TERABYTE[1], v, 1e12), p[UnitsOfMeasurement.PETABYTE[0]] = new UnitOfMeasurement(UnitsOfMeasurement.PETABYTE[0], UnitsOfMeasurement.PETABYTE[1], v, 1e15), p);
  32872. UnitsOfMeasurement.DATA = ((h = {})['metric'] = y, h['imperial'] = y, h);
  32873. },
  32874. getUnitsOfMeasurementByDomain: function getUnitsOfMeasurementByDomain(e) {
  32875. return this[e.toUpperCase()];
  32876. /* switch (e.toUpperCase()) {
  32877. case a.DISTANCE:
  32878. return t.DISTANCE;
  32879. case a.AREA:
  32880. return t.AREA;
  32881. case a.VOLUME:
  32882. return t.VOLUME;
  32883. case a.DATA:
  32884. return t.DATA;
  32885. default:
  32886. console.error(e + " measurement domain is not supported.")
  32887. } */
  32888. },
  32889. getUnitsOfMeasurementByDomainAndSystem: function getUnitsOfMeasurementByDomainAndSystem(domain, system) {
  32890. var r = this.getUnitsOfMeasurementByDomain(domain);
  32891. if (r.hasOwnProperty(system.toLowerCase())) return r[system.toLowerCase()];
  32892. console.error(n + ' measurement system is not supported.');
  32893. },
  32894. getDefaultUnitByDomainAndSystem: function getDefaultUnitByDomainAndSystem(e, n) {
  32895. switch (e.toUpperCase()) {
  32896. case 'DISTANCE':
  32897. switch (n.toLowerCase()) {
  32898. case 'metric':
  32899. return this.DISTANCE['metric'][this.METER[0]];
  32900. case 'imperial':
  32901. return this.DISTANCE['imperial'][this.FOOT[0]];
  32902. default:
  32903. console.error(n + ' measurement system is not supported.');
  32904. }
  32905. case 'AREA':
  32906. switch (n.toLowerCase()) {
  32907. case 'metric':
  32908. return this.AREA['metric'][this.SQUAREMETER[0]];
  32909. case 'imperial':
  32910. return this.AREA['imperial'][this.SQUAREFOOT[0]];
  32911. default:
  32912. console.error(n + ' measurement system is not supported.');
  32913. }
  32914. case 'VOLUME':
  32915. switch (n.toLowerCase()) {
  32916. case 'metric':
  32917. return this.VOLUME['metric'][this.CUBICMETER[0]];
  32918. case 'imperial':
  32919. return this.VOLUME['imperial'][this.CUBICFOOT[0]];
  32920. default:
  32921. console.error(n + ' measurement system is not supported.');
  32922. }
  32923. case 'DATA':
  32924. switch (n.toLowerCase()) {
  32925. case 'metric':
  32926. return this.DATA['metric'][this.BYTE[0]];
  32927. case 'imperial':
  32928. return this.DATA['imperial'][this.BYTE[0]];
  32929. default:
  32930. console.error(n + ' measurement system is not supported.');
  32931. }
  32932. default:
  32933. console.error(e + ' measurement domain is not supported.');
  32934. }
  32935. }
  32936. };
  32937. var UnitService = function UnitService() {
  32938. _classCallCheck(this, UnitService);
  32939. //this.LanguageService = e,
  32940. //this.localStorageService = n,
  32941. //this.gettext = i,
  32942. //this.unitChanged = new r.Signal,
  32943. this.LOCAL_STORAGE_KEY = 'iv_unit_key'; //?
  32944. UnitsOfMeasurement.init();
  32945. this.unitSystems = ['metric', 'imperial']; //[o.UoMSystem.METRIC, o.UoMSystem.IMPERIAL],
  32946. this.defaultSystem = 'metric'; //'imperial'
  32947. //var a = this.LanguageService.getBrowserLocaleString().toLowerCase();
  32948. //this.defaultSystem = t.isLocaleImperial(a) ? o.UoMSystem.IMPERIAL : o.UoMSystem.METRIC,
  32949. //this.initUnit()
  32950. }
  32951. /* initUnit() {
  32952. var t = this.localStorageService.get(this.LOCAL_STORAGE_KEY);
  32953. if (t)
  32954. for (var e = 0, n = this.unitSystems; e < n.length; e++) {
  32955. var i = n[e];
  32956. if (i === t)
  32957. return void this.setUnit(i, !0)
  32958. }
  32959. this.setUnit(this.defaultSystem, !1)
  32960. }
  32961. setUnit(t, e) {
  32962. this.currentSystem !== t && (this.currentSystem = t,
  32963. this.unitChanged.emit()),
  32964. e && this.localStorageService.set(this.LOCAL_STORAGE_KEY, t)
  32965. } */
  32966. /*isLocaleImperial(e) {
  32967. return t.IMPERIAL_LOCALES.indexOf(e.toLowerCase()) >= 0
  32968. }
  32969. ,
  32970. t.IMPERIAL_LOCALES = ["en_us"],
  32971. t.ɵfac(e) {
  32972. return new (e || t)(c.ɵɵinject(l.LanguageService),
  32973. c.ɵɵinject("localStorageService"),c.ɵɵinject("gettext"))
  32974. }
  32975. ,
  32976. t.ɵprov = c.ɵɵdefineInjectable({
  32977. token: t,
  32978. factory: t.ɵfac,
  32979. providedIn: "root"
  32980. }), */
  32981. ;
  32982. var UoMService = /*#__PURE__*/function () {
  32983. function UoMService() {
  32984. _classCallCheck(this, UoMService);
  32985. this.UnitService = new UnitService();
  32986. /* UnitService */
  32987. }
  32988. _createClass(UoMService, [{
  32989. key: "scopedConvert",
  32990. value: function scopedConvert(t, n) {
  32991. var precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
  32992. var r = arguments.length > 3 ? arguments[3] : undefined;
  32993. var minFactor = arguments.length > 4 ? arguments[4] : undefined;
  32994. return this.convert(t, n, precision, r, minFactor);
  32995. }
  32996. }, {
  32997. key: "convert",
  32998. value: function convert(number, domain) {
  32999. var precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
  33000. var system = arguments.length > 3 ? arguments[3] : undefined;
  33001. var ifEighths = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : !1;
  33002. var o
  33003. /* minFactor, ifRestrict */
  33004. = arguments.length > 5 ? arguments[5] : undefined;
  33005. var _o$system = o[system],
  33006. minFactor = _o$system.minFactor,
  33007. restrictUnit = _o$system.restrictUnit; //if (!number) return "";
  33008. var s = this.getMostRelevantMeasurement(domain, system || this.UnitService.currentSystem, number, minFactor, restrictUnit);
  33009. return this.getFormattedMeasurementString(s[0], s[1], precision, ifEighths);
  33010. }
  33011. }, {
  33012. key: "convertBack",
  33013. value: function convertBack(number, domain) {
  33014. var precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
  33015. var fromSystem = arguments.length > 3 ? arguments[3] : undefined;
  33016. var minFactor = arguments.length > 4 ? arguments[4] : undefined;
  33017. //从英制转到'metric'
  33018. if (!number) return '';
  33019. var d = UnitsOfMeasurement.getDefaultUnitByDomainAndSystem(domain, 'metric');
  33020. var s = this.getMostRelevantMeasurement2(domain, fromSystem, number, minFactor);
  33021. return this.getFormattedMeasurementString(s[0], d, precision);
  33022. /* 栗子:
  33023. viewer.unitConvert.convertBack(1, 'area', 5, 'imperial')
  33024. '0.09290 m²'
  33025. viewer.unitConvert.convertBack(1, 'Distance', 2, 'imperial')
  33026. '0.03 m'
  33027. */
  33028. }
  33029. }, {
  33030. key: "getFormattedMeasurementString",
  33031. value: function getFormattedMeasurementString(number, unit, precision, ifEighths) {
  33032. var result;
  33033. if (ifEighths && unit.name === UnitsOfMeasurement.FOOT[0]) {
  33034. result = this.formatImperialDistance(number * FEET_TO_INCHES_FACTOR);
  33035. } else if (ifEighths && unit.name === UnitsOfMeasurement.INCH[0]) {
  33036. result = this.formatImperialDistance(number);
  33037. } else {
  33038. result = number.toLocaleString(void 0, {
  33039. minimumFractionDigits: precision,
  33040. maximumFractionDigits: precision
  33041. }) + ' ' + unit.symbol;
  33042. }
  33043. return result;
  33044. }
  33045. }, {
  33046. key: "formatImperialDistance",
  33047. value: function formatImperialDistance(e) {
  33048. var n = Math.round(8 * e),
  33049. i = Math.floor(n / 8),
  33050. r = Math.floor(i / FEET_TO_INCHES_FACTOR),
  33051. o = i - r * FEET_TO_INCHES_FACTOR,
  33052. a = EIGHTHS_SYMBOLS[Math.abs(n % 8)],
  33053. s = 0 === o && '' !== a ? '' : o;
  33054. '' !== s && '' !== a && (a = ' ' + a);
  33055. return 0 !== r ? r + "' " + s + a + '"' : '' + s + a + '"';
  33056. }
  33057. }, {
  33058. key: "getMostRelevantMeasurement",
  33059. value: function getMostRelevantMeasurement(domain, system, number) {
  33060. var minFactor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  33061. var restrictUnit = arguments.length > 4 ? arguments[4] : undefined;
  33062. /* var a = r.values(UnitsOfMeasurement.getUnitsOfMeasurementByDomainAndSystem(domain, system))
  33063. , s = r.filter(a, function(t) {
  33064. return t.factor >= i
  33065. })
  33066. , c = r.reduce(s, function(t, e) {
  33067. return e.fromBase(number) < t.fromBase(number) && e.fromBase(number) >= 1 ? e : t
  33068. }); */
  33069. var a = [];
  33070. var u = UnitsOfMeasurement.getUnitsOfMeasurementByDomainAndSystem(domain, system);
  33071. for (var i in u) {
  33072. a.push(u[i]);
  33073. }
  33074. var s = a;
  33075. if (s.length > 1) {
  33076. if (restrictUnit) {
  33077. //是否只用这一单位,如只用mm。如果不是,就会寻找最大的接近的单位,如设置最小为mmminFactor=0.001),则1.2米时是'1.2m'、0.2米时是'20cm'、0.002米时是'2mm'
  33078. s = a.filter(function (m) {
  33079. return m.name == restrictUnit;
  33080. });
  33081. } else {
  33082. s = a.filter(function (m) {
  33083. return m.factor >= minFactor;
  33084. });
  33085. }
  33086. }
  33087. var c = s.reduce(function (prev, currentValue) {
  33088. //reduce最终值是最后一次return的值 ( 没看懂这句话作用)
  33089. return currentValue.fromBase(number) < prev.fromBase(number) && currentValue.fromBase(number) >= 1 ? currentValue : prev;
  33090. });
  33091. return c ? [c.fromBase(number), c] : void 0;
  33092. }
  33093. }, {
  33094. key: "getMostRelevantMeasurement2",
  33095. value: function getMostRelevantMeasurement2(domain, system, number) {
  33096. var minFactor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  33097. //add
  33098. var a = [];
  33099. var u = UnitsOfMeasurement.getUnitsOfMeasurementByDomainAndSystem(domain, system);
  33100. for (var i in u) {
  33101. a.push(u[i]);
  33102. }
  33103. var s = a.filter(function (m) {
  33104. return m.factor >= minFactor;
  33105. });
  33106. var c = s.reduce(function (prev, currentValue) {
  33107. //reduce最终值是最后一次return的值 ( 没看懂这句话作用)
  33108. return currentValue.toBase(number) < prev.toBase(number) && currentValue.toBase(number) >= 1 ? currentValue : prev;
  33109. });
  33110. return c ? [c.toBase(number), c] : void 0;
  33111. }
  33112. /* ɵfac(e){
  33113. return new (e || t)(c.ɵɵinject(l.UnitService))
  33114. }
  33115. ɵprov = c.ɵɵdefineInjectable({
  33116. token: t,
  33117. factory: t.ɵfac,
  33118. providedIn: "root"
  33119. }) */
  33120. }]);
  33121. return UoMService;
  33122. }();
  33123. 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); }; }
  33124. 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; } }
  33125. var log = function log() {
  33126. };
  33127. var lastPointerupTime = 0;
  33128. /* const _camereChangeLazyTime = 80 */
  33129. defineComponent('Player', function () {
  33130. return /*#__PURE__*/function (_EventEmitter) {
  33131. _inherits(Player, _EventEmitter);
  33132. var _super = _createSuper$17(Player);
  33133. function Player() {
  33134. var _this;
  33135. _classCallCheck(this, Player);
  33136. _this = _super.call(this);
  33137. _this.setupCustomProperties = function (e) {
  33138. var t = e || Viewmode$1.PANORAMA;
  33139. Object.defineProperty(this, 'mode', {
  33140. get: function get() {
  33141. return t;
  33142. },
  33143. set: function set(e) {
  33144. var i = t;
  33145. t = e, this.onModeUpdated(i, t);
  33146. }
  33147. });
  33148. };
  33149. _this.isOutsideMode = function (mode) {
  33150. mode = mode || this.mode;
  33151. return mode === Viewmode$1.DOLLHOUSE || mode === Viewmode$1.FLOORPLAN;
  33152. };
  33153. _this.is360View = function (e, t) {
  33154. return e === Viewmode$1.PANORAMA && t && t.panoType == '360view';
  33155. };
  33156. _this.setScene = function () {
  33157. var scene = this.$app.core.get('SceneRenderer').scene;
  33158. this.sceneIntersectionPlane = scene.plane;
  33159. this.path.setScene(scene);
  33160. this.moveReticuleToScene(scene);
  33161. };
  33162. _this.moveReticuleToScene = function (e) {
  33163. this.reticule.parent && this.reticule.parent.remove(this.reticule), e.add(this.reticule);
  33164. };
  33165. _this.updateModel = function () {
  33166. var _this2 = this;
  33167. // function updateCamera(centerY) {
  33168. // var camera = this.cameraControls.cameras[Viewmode.DOLLHOUSE]
  33169. // , control = this.cameraControls.controls[Viewmode.DOLLHOUSE]
  33170. // , positionY = camera.position.y + (centerY - control.target.y)
  33171. // , duration = settings.showFloorDuration + settings.showFloorDelay;
  33172. // transitions.start(lerp.property(control.target, "y", centerY), duration, null, settings.flydown.movementDelay, easing[settings.flydown.movementEasing], null, settings.freeze.FlyToViewFloor);
  33173. // transitions.start(lerp.property(camera.position, "y", positionY), duration, null, settings.flydown.movementDelay, easing[settings.flydown.movementEasing], null, settings.freeze.FlyToViewFloor);
  33174. // }
  33175. this.model = this.modelManager.getActiveModel();
  33176. this.model.player = this; // this.model.on("floor.changed", function(newFloor, t, oldFloor) {
  33177. // this.mode === Viewmode.DOLLHOUSE && newFloor !== oldFloor && updateCamera.call(this, newFloor.center.y)
  33178. // }
  33179. // .bind(this));
  33180. // this.model.on("allfloors.toggled", function(flag, floor) {
  33181. // if (this.mode === Viewmode.DOLLHOUSE) {
  33182. // var centerY = flag ? this.model.center.y : centerY = floor.center.y;
  33183. // updateCamera.call(this, centerY)
  33184. // }
  33185. // }
  33186. // .bind(this));
  33187. this.paintEditor.init();
  33188. this.on(PlayerEvents.PanoChosen, function (pano0, pano1, flag) {
  33189. _this2.model.setProjectedPanos(pano0, pano1, flag);
  33190. _this2.paintEditor && _this2.paintEditor.updatePanoPaint(pano0.id, pano1.id);
  33191. _this2.$app.FilterManager && _this2.$app.FilterManager.updatePanoFilters(pano0, pano1);
  33192. });
  33193. this.on(PlayerEvents.FlyingStarted, this.model.resetHighMap.bind(this.model));
  33194. };
  33195. _this.updateModelDependentData = function () {
  33196. this.cameraControls.setModelForControls(this.model);
  33197. this.getPanoMarkersFromModel(this.model);
  33198. };
  33199. _this.getPanoMarkersFromModel = function (e) {
  33200. this.panoMarkers = e.panos.list.reduce(function (e, t) {
  33201. return t.marker ? e.concat(t.marker) : e;
  33202. }, []);
  33203. };
  33204. _this.handleControlMove = function (e) {
  33205. this.emit(PlayerEvents.Move, e);
  33206. if (this.mode === Viewmode$1.PANORAMA) {
  33207. this.emit(PlayerEvents.Rotate, {
  33208. quaternion: this.cameraControls.activeControl.camera.quaternion,
  33209. mode: Viewmode$1.PANORAMA,
  33210. currentPanoId: this.nextPano ? this.nextPano.id : this.currentPano ? this.currentPano.id : null,
  33211. type: 'rotate'
  33212. });
  33213. }
  33214. };
  33215. _this.handleControlInputStart = function (e) {
  33216. this.emit(PlayerEvents.InputStart, e);
  33217. };
  33218. _this.onModeUpdated = function (fromMode, toMode) {
  33219. this.cameraControls.activateControls(toMode);
  33220. this.emit(PlayerEvents.ModeChanged, fromMode, toMode); //add:
  33221. //beforechangeMode
  33222. if (toMode == 'transitioning') {
  33223. fromMode = this.modeTran.split('-')[0]; //按钮active改变
  33224. //this.store.commit('SetPlayerOptions',{mode:toMode == "panorama" ? "pano" : toMode == "dollhouse" ? "3d" : "2d",modeCanSwitch:false})
  33225. if (fromMode == Viewmode$1.PANORAMA) {
  33226. this.flyingToTag = this.flyRotate = this.flyingWithRot = false; //有出现过如果还没校准好热点就飞出的话会是true
  33227. /* this.model.chunks.forEach(chunk=>{//4.6.0 xzw 改写
  33228. common.updateVisible(chunk,'atPano',true) //恢复漫游点处隐藏的chunk
  33229. }) */
  33230. }
  33231. } else {
  33232. //afterChangeMode
  33233. toMode = this.modeTran.split('-')[1];
  33234. if (!(this.isOutsideMode(fromMode) && this.isOutsideMode(toMode))) this.model.fadePanoMarkers(null, 0);
  33235. if (toMode == Viewmode$1.PANORAMA) ;
  33236. }
  33237. };
  33238. _this.isWarping = function () {
  33239. //return this.path.warping
  33240. return false;
  33241. };
  33242. _this.isWaitingToWarp = function () {
  33243. //return this.path.waitingToWarp
  33244. return false;
  33245. };
  33246. _this.bindEvents = function (e) {
  33247. var _this3 = this;
  33248. 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)),
  33249. e.addEventListener('touchstart', this.onTouchStart.bind(this), {
  33250. passive: false
  33251. }), e.addEventListener('touchmove', this.onTouchMove.bind(this), {
  33252. passive: false
  33253. }), 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));
  33254. window.addEventListener('pointerup', function (e) {
  33255. //edit 拖拽到别的面板松开 mouseup没用
  33256. Date.now() - lastPointerupTime > 60 && _this3.onPointerUp(e);
  33257. lastPointerupTime = Date.now();
  33258. });
  33259. };
  33260. _this.onMouseDown = function (e) {
  33261. e.currentTarget !== document && e.currentTarget.focus(), this.handleInputStart.call(this, e.clientX, e.clientY, !1, false, e), this.updateIntersect(); //this.distanceToCamera(2)
  33262. };
  33263. _this.onMouseMove = function (e) {
  33264. (this.isTouchEvent = !1, this.containsMouse = !0), this.handleInputMove.call(this, e.clientX, e.clientY, !1, e);
  33265. };
  33266. _this.onMouseOver = function (e) {
  33267. this.containsMouse = !0, !this.mouseDown || 0 !== e.which && 0 !== e.buttons || (this.mouseDown = !1);
  33268. };
  33269. _this.onMouseOut = function (e) {
  33270. this.containsMouse = !1;
  33271. };
  33272. _this.onMouseUp = function (e) {
  33273. this.handleInputEnd.call(this, e.clientX, e.clientY, !1, e);
  33274. this.emit(PlayerEvents.EndRotation, {
  33275. rotationSpeed: this.cameraControls.activeControl ? this.cameraControls.activeControl.rotationSpeed : null,
  33276. type: 'endRotation'
  33277. });
  33278. };
  33279. _this.onTouchStart = function (e) {
  33280. if (e.currentTarget !== document && e.currentTarget.focus(), !this.mouseDown) {
  33281. this.couldBeLongTap = !0;
  33282. var t = common$1.average(e.changedTouches, 'clientX'),
  33283. i = common$1.average(e.changedTouches, 'clientY');
  33284. this.handleInputStart.call(this, t, i, !0, false, e), this.mouseDownTimer = setTimeout(function () {
  33285. this.updateIntersect(), this.handleInputEnd.call(this, t, i, !0, e);
  33286. }.bind(this), settings$3.input.longTapThreshold);
  33287. } //ios safari 球幕视频无法自动播放,必须静音才能播放,播放后关闭静音会导致视频暂停 #43676
  33288. //需要用户交互才能播放带声音的视频 the request is not allowed by the user agent or the platform in thre current context, possibly because the user denied permission
  33289. if (browser$1.detectIOS()) {
  33290. var panoVideoRenderer = this.$app.core.get('PanoVideoRenderer');
  33291. panoVideoRenderer.setMuted(false);
  33292. }
  33293. };
  33294. _this.onTouchMove = function (e) {
  33295. var t = common$1.average(e.changedTouches, 'clientX'),
  33296. i = common$1.average(e.changedTouches, 'clientY');
  33297. this.handleInputMove.call(this, t, i, !0, e);
  33298. };
  33299. _this.onTouchEnd = function (e) {
  33300. if (clearTimeout(this.mouseDownTimer), this.mouseDown) {
  33301. this.couldBeLongTap = !1, this.updateIntersect();
  33302. var t = common$1.average(e.changedTouches, 'clientX'),
  33303. i = common$1.average(e.changedTouches, 'clientY');
  33304. this.handleInputEnd.call(this, t, i, !0, e);
  33305. this.emit(PlayerEvents.EndRotation, {
  33306. rotationSpeed: this.cameraControls.activeControl ? this.cameraControls.activeControl.rotationSpeed : null,
  33307. type: 'endRotation'
  33308. });
  33309. }
  33310. };
  33311. _this.onPointerDown = function (e) {
  33312. e.currentTarget !== document && e.currentTarget.focus();
  33313. if (this.mouseDown || 'mouse' === e.pointerType) {
  33314. return this.onMouseDown(e);
  33315. } else {
  33316. this.couldBeLongTap = !0;
  33317. this.handleInputStart.call(this, e.clientX, e.clientY, !0, false, e);
  33318. return void (this.mouseDownTimer = setTimeout(function () {
  33319. this.updateIntersect(), this.handleInputEnd.call(this, e.clientX, e.clientY, !0, e);
  33320. }.bind(this), settings$3.input.longTapThreshold));
  33321. }
  33322. };
  33323. _this.onPointerMove = function (e) {
  33324. 'mouse' !== e.pointerType ? this.handleInputMove.call(this, e.clientX, e.clientY, !0, e) : this.onMouseMove(e);
  33325. };
  33326. _this.onPointerUp = function (e) {
  33327. if (this.mouseDown && 'mouse' !== e.pointerType) {
  33328. if (this.mouseDownTimer) {
  33329. clearTimeout(this.mouseDownTimer);
  33330. }
  33331. this.couldBeLongTap = !1;
  33332. this.updateIntersect();
  33333. void this.handleInputEnd.call(this, e.clientX, e.clientY, !0, e);
  33334. this.emit(PlayerEvents.EndRotation, {
  33335. rotationSpeed: this.cameraControls.activeControl ? this.cameraControls.activeControl.rotationSpeed : null,
  33336. type: 'endRotation'
  33337. });
  33338. } else {
  33339. this.onMouseUp(e);
  33340. }
  33341. };
  33342. _this.onPointerOut = function (e) {
  33343. this.mouseDown = !1;
  33344. };
  33345. _this.onPointerCancel = function (e) {
  33346. this.mouseDown = !1;
  33347. };
  33348. _this.onKeyDown = function (e) {
  33349. if (!this.$app.config.useShortcutKeys) {
  33350. return;
  33351. }
  33352. var t = function () {
  33353. this.cameraControls.activeControl && this.cameraControls.activeControl.emit(ControlEvents.Move, 'key');
  33354. }.bind(this),
  33355. i = e.which;
  33356. switch (i) {
  33357. case Keys.F:
  33358. t(), this.changeFloor(-1);
  33359. break;
  33360. case Keys.R:
  33361. t(), this.changeFloor(1);
  33362. }
  33363. if (this.mode === Viewmode$1.PANORAMA) switch (i) {
  33364. case Keys.UPARROW:
  33365. case Keys.W:
  33366. this.flyLocalDirection(Vectors$1.FORWARD.clone());
  33367. break;
  33368. case Keys.DOWNARROW:
  33369. case Keys.S:
  33370. this.flyLocalDirection(Vectors$1.BACK.clone());
  33371. break;
  33372. case Keys.A:
  33373. this.flyLocalDirection(Vectors$1.LEFT.clone());
  33374. break;
  33375. case Keys.D:
  33376. this.flyLocalDirection(Vectors$1.RIGHT.clone());
  33377. }
  33378. if (this.started
  33379. /* && ( !viewEditLink.markView && !editSpot.setSpotPos && (!this.linkEditor || !this.linkEditor.setPanoVisible && !this.linkEditor.setTagVisible)) */
  33380. ) {
  33381. switch (i) {
  33382. case Keys.ONE:
  33383. //i.isInMode(_e.TRANSITIONING) || (t.changeMode(_e.PANORAMA));
  33384. this.insideMode();
  33385. break;
  33386. case Keys.TWO:
  33387. //this.model.outsideAllowed() && !this.isInMode(_e.FLOORPLAN, _e.TRANSITIONING) && (t.changeMode(_e.FLOORPLAN));
  33388. this.flyToNewMode({
  33389. mode: Viewmode$1.DOLLHOUSE
  33390. });
  33391. break;
  33392. case Keys.THREE:
  33393. //this.model.outsideAllowed() && !this.isInMode(_e.DOLLHOUSE, _e.TRANSITIONING) && (t.changeMode(_e.DOLLHOUSE));
  33394. this.flyToNewMode({
  33395. mode: Viewmode$1.FLOORPLAN
  33396. });
  33397. break;
  33398. }
  33399. }
  33400. };
  33401. _this.handleScrollPinchZoom = function () {
  33402. return function (e) {
  33403. var t = e,
  33404. i = this.zoomLevel;
  33405. this.zoomBy(t), this.currentPano && this.zoomStats.addZoomAction(i, this.zoomLevel, this.currentPano.id);
  33406. };
  33407. }();
  33408. _this.handleControlPinch = function (e) {
  33409. if (settings$3.zoom.enabled) {
  33410. this.handleScrollPinchZoom(1 - e);
  33411. } else if (this.$app.config.useShortcutKeys) {
  33412. this.flyLocalDirection(new THREE.Vector3(0, 0, e).normalize());
  33413. }
  33414. };
  33415. _this.emitZoom = function (e) {
  33416. //xzw add
  33417. //zoomLevel2是界面显示的放大倍数,按要求4k以下的最大都要是4,以上的是几k就是几
  33418. var tileClass = this.$app.core.get('QualityManager').tileClass;
  33419. var threshold = tileClass <= 2048 ? 2 : 3;
  33420. var zoomLevel2 = math$2.linearClamp(this.zoomLevel, [1, threshold, 4.5], [1, 4, 9
  33421. /* 6 */
  33422. ]); //console.log('zoom', this.zoomLevel, zoomLevel2 )
  33423. this.emit(PlayerEvents.Zoom, {
  33424. zoom: e,
  33425. type: 'zoom',
  33426. zoomLevel: this.zoomLevel,
  33427. zoomLevel2
  33428. }); //console.log('emitZoom', this.zoomLevel)
  33429. };
  33430. _this.handleControlScroll = function (e) {
  33431. if (settings$3.zoom.enabled) {
  33432. if (e > 0) {
  33433. e = 1 + this.scrollZoomSpeed;
  33434. } else {
  33435. e < 0 && (e = 1 - this.scrollZoomSpeed);
  33436. }
  33437. 0 !== e && this.handleScrollPinchZoom(e);
  33438. this.emitZoom(e);
  33439. } else if (this.$app.config.useShortcutKeys) {
  33440. this.flyLocalDirection(new THREE.Vector3(0, 0, -e).normalize());
  33441. }
  33442. };
  33443. _this.getEventDesc = function () {
  33444. var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  33445. return {
  33446. button: event.button,
  33447. buttons: event.buttons,
  33448. touches: event.touches,
  33449. intersect: this.intersect,
  33450. mouse: this.mouse,
  33451. isAtDomElement: event.target == this.domElement || event.target == this.$app.core.get('SceneRenderer').renderer.domElement
  33452. };
  33453. };
  33454. _this.handleInputStart = function (e, t, i, ignorePad, event) {
  33455. var mouse = {
  33456. x: e,
  33457. y: t
  33458. };
  33459. if (
  33460. /* !config.mobile && */
  33461. !ignorePad) {
  33462. mouse = math$2.handelPadding(e, t, this.domElement);
  33463. }
  33464. math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.mouse, this.domElement);
  33465. math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.mouseAtMouseDown, this.domElement);
  33466. this.mouseCouldBeClickToMove = !0;
  33467. this.mouseDown = !0;
  33468. this.updateIntersect(); //为了触屏版,在点击时立刻checkIntersect
  33469. //add---------------------------------
  33470. var consumed;
  33471. var consume = function consume() {
  33472. consumed = true;
  33473. };
  33474. var getConsumed = function getConsumed() {
  33475. return consumed;
  33476. }; //被使用
  33477. this.emit('pointerStart', Object.assign(this.getEventDesc(event), {
  33478. consume,
  33479. getConsumed
  33480. }));
  33481. if (consumed) {
  33482. return;
  33483. } // 有被事件作用到,且需要阻止后续进行
  33484. //------------------------------------
  33485. if ((event === null || event === void 0 ? void 0 : event.button) != THREE.MOUSE.LEFT) return;
  33486. if (this.EditPanoVideo && this.EditPanoVideo.editing) {
  33487. this.EditPanoVideo.dealPointerDown();
  33488. } else if (this.EditPanoMosaic && this.EditPanoMosaic.editing) {
  33489. this.EditPanoMosaic.dealPointerDown();
  33490. } else {
  33491. this.model.transformControls && this.model.transformControls.handleDragStart();
  33492. this.model.transformTool && this.model.transformTool.handleDragStart();
  33493. }
  33494. if (this.paintEditor && this.paintEditor.painting) {
  33495. this.paintEditor.dealPointerDown();
  33496. } // this.setQuaternionTransition(null)
  33497. this.aimQuaternion = null;
  33498. };
  33499. _this.handleInputMove = function (e, t, i, event) {
  33500. this.isTouchEvent = i;
  33501. var mouse = math$2.handelPadding(e, t, this.domElement);
  33502. math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.mouse, this.domElement); // 不能给0,三星手机在pointmove上非常敏感,需要一定容错才能触发click
  33503. if (this.mouseAtMouseDown.distanceTo(this.mouse) > 0.01
  33504. /*settings.input.moveToleranceNDC*/
  33505. ) {
  33506. this.mouseCouldBeClickToMove = !1;
  33507. this.couldBeLongTap = !1;
  33508. clearTimeout(this.mouseDownTimer);
  33509. this.model.transformControls && this.model.transformControls.handleDragging();
  33510. this.model.transformTool && this.model.transformTool.onPointerMove();
  33511. }
  33512. if (this.EditPanoMosaic && this.EditPanoMosaic.editing) {
  33513. this.EditPanoMosaic.dealPointerMove();
  33514. }
  33515. if (this.paintEditor && this.paintEditor.painting) {
  33516. this.paintEditor.dealPointerMove(mouse);
  33517. } //add---------------------------------
  33518. var consumed;
  33519. var consume = function consume() {
  33520. consumed = true;
  33521. };
  33522. var getConsumed = function getConsumed() {
  33523. return consumed;
  33524. }; //被使用
  33525. this.emit('pointerMove', Object.assign(this.getEventDesc(event), {
  33526. consume,
  33527. getConsumed
  33528. }));
  33529. if (consumed) {
  33530. return;
  33531. } // pointerDown 有被事件作用到,且需要阻止后续进行
  33532. //------------------------------------
  33533. this.mouseLastMoveTime = Date.now();
  33534. this.reticule.move(e, t, i);
  33535. };
  33536. _this.handleInputEnd = function (e, t, i, event) {
  33537. var _this4 = this;
  33538. if (this.isTouchEvent = i, this.mouseDown = !1, this.cameraControls.controls[Viewmode$1.PANORAMA].emit('interaction.direct'), !i && this.couldBeLongTap) return !0;
  33539. this.model.transformControls && this.model.transformControls.handleDragEnd();
  33540. this.model.transformTool && this.model.transformTool.handleDragEnd();
  33541. this.EditPanoVideo && this.EditPanoVideo.dealPointerUp();
  33542. this.EditPanoMosaic && this.EditPanoMosaic.dealPointerUp();
  33543. if (this.paintEditor && this.paintEditor.painting) {
  33544. this.paintEditor.dealPointerUp();
  33545. }
  33546. lastPointerupTime = Date.now(); //add---------------------------------
  33547. var pointerupConsumed; //参考了potree,和click分开。只有都consumed了才不flytopano
  33548. var consume = function consume() {
  33549. pointerupConsumed = true;
  33550. }; //被使用
  33551. var getConsumed = function getConsumed() {
  33552. return pointerupConsumed;
  33553. };
  33554. var eventObj = Object.assign(this.getEventDesc(event), {
  33555. consume,
  33556. getConsumed
  33557. });
  33558. this.emit('pointerUp', eventObj);
  33559. /* if (consumed) {
  33560. return
  33561. } // 有被事件作用到,且需要阻止后续进行 */
  33562. //------------------------------------
  33563. if (this.handleLongTap()) return !0;
  33564. if (this.mouseCouldBeClickToMove && eventObj.isAtDomElement) {
  33565. if (this.flying) {
  33566. //this.path.activeTransType === WarpStyle.WALK && this.emit(PlayerEvents.WarpInterruptedWithFlyTo, this.path.activeTransType);
  33567. return this.flyToPanoClosestToMouse(); //!0; 改for panoTask
  33568. } // if (this.checkMattertagClick())
  33569. // return !0;
  33570. if (this.chosenMeasureRuler) {
  33571. //取消“删除”显示
  33572. this.chosenMeasureRuler.showOptionLabel(false);
  33573. }
  33574. if (this.linkEditor && this.linkEditor.setPanoVisible) {
  33575. //正在设置漫游可行
  33576. var currentFloorIcons = [].concat(_toConsumableArray(this.linkEditor.actionIcons), _toConsumableArray(this.linkEditor.footIcons)).filter(function (icon) {
  33577. return icon.pano.floorIndex == _this4.model.currentFloor.floorIndex;
  33578. });
  33579. this.intersect = this.getMouseIntersect(null, currentFloorIcons
  33580. /* .concat(this.measureRulers.map(ruler => ruler.boldLine)) */
  33581. );
  33582. if (this.intersect && this.intersect.object.visible) {
  33583. var icon = this.intersect.object;
  33584. if (icon.type == 'ActionIcon' && !this.linkEditor.activePano && icon.footIcon.status == 'floor') {
  33585. // 设置楼层连接点隐藏需要做二次确认提示
  33586. var self = this;
  33587. this.$app.WalkManager.emit('walkManager.floorPointHide', function () {
  33588. self.linkEditor.dealPanoVisible(self.intersect.object.name, self.intersect.object);
  33589. });
  33590. } else {
  33591. this.linkEditor.dealPanoVisible(this.intersect.object.name, this.intersect.object);
  33592. }
  33593. }
  33594. return;
  33595. }
  33596. if (this.linkEditor && this.linkEditor.setTagVisible) {
  33597. //正在设置热点可视
  33598. this.linkEditor.tagVsetting && this.intersect && this.intersect.object.visible && this.linkEditor.dealTagVisible(this.linkEditor.tagVsetting, this.intersect.object.name);
  33599. return;
  33600. }
  33601. var measureIntersect = this.getMouseIntersect(null, this.model.measureRulers.children.filter(function (e) {
  33602. return e.realVisible();
  33603. }).map(function (ruler) {
  33604. return ruler.boldLine;
  33605. }));
  33606. if (measureIntersect && measureIntersect.object.parentRuler) {
  33607. //点击测距标尺 以删除
  33608. measureIntersect.object.parentRuler.showOptionLabel(true, measureIntersect.point);
  33609. return;
  33610. }
  33611. if (this.EditOverlay && this.EditOverlay.isAdding) {
  33612. this.intersect && this.EditOverlay.addOverlay({
  33613. intersect: this.intersect
  33614. });
  33615. return;
  33616. }
  33617. if (this.OverlayManager.hoveringPlane) {
  33618. this.OverlayManager.clickOverlay(this.OverlayManager.hoveringPlane);
  33619. return;
  33620. }
  33621. if (this.intersect && this.billboardManager && this.billboardManager.isAdding) {
  33622. return this.billboardManager.startInsertion({
  33623. intersect: this.intersect
  33624. });
  33625. } //add---------------------------------
  33626. var consumed;
  33627. var _consume = function _consume() {
  33628. consumed = true;
  33629. }; //被使用
  33630. var _getConsumed = function _getConsumed() {
  33631. return consumed;
  33632. };
  33633. this.emit('click', Object.assign(this.getEventDesc(event), {
  33634. consume: _consume,
  33635. getConsumed: _getConsumed,
  33636. raycaster: this.raycaster
  33637. }));
  33638. if (pointerupConsumed || consumed || event.button != THREE.MOUSE.LEFT) {
  33639. return;
  33640. } // 有被事件作用到,且需要阻止后续进行
  33641. //------------------------------------
  33642. if (this.currentPano && this.is360View(this.mode, this.currentPano)) return;
  33643. this.cameraControls.activeControl && this.cameraControls.activeControl.emit(ControlEvents.Move, this.isTouchEvent ? 'touch' : 'mouse');
  33644. this.history.invalidate();
  33645. if (this.intersect) {
  33646. return this.flyToPanoClosestToMouse();
  33647. }
  33648. if (this.mode === Viewmode$1.PANORAMA) {
  33649. var pano = this.closestPanoInDirection(this.getMouseDirection());
  33650. if (pano) {
  33651. return this.flyToPano({
  33652. pano: pano
  33653. });
  33654. } else {
  33655. return this.bump(this.getMouseDirection());
  33656. }
  33657. }
  33658. }
  33659. this.intersect && this.closestPano && this.closestPano.hoverOff(this.mode);
  33660. };
  33661. _this.handleLongTap = function () {
  33662. if (this.couldBeLongTap && (!this.isPanoHover || this.mode !== Viewmode$1.PANORAMA)) {
  33663. this.cameraControls.activeControl && this.cameraControls.activeControl.emit(ControlEvents.LongTap, 'touch');
  33664. return !0;
  33665. }
  33666. };
  33667. _this.start = function (initialPanoInfo) {
  33668. var _this5 = this;
  33669. var mode = initialPanoInfo.mode,
  33670. pano = initialPanoInfo.pano,
  33671. position = initialPanoInfo.position,
  33672. quaternion = initialPanoInfo.quaternion,
  33673. tag = initialPanoInfo.tag,
  33674. quickstart = initialPanoInfo.quickstart,
  33675. deferred = Deferred$1();
  33676. this.updateModelDependentData();
  33677. this.updateFromControls(); //this.findDefaultViews();
  33678. var is360 = this.is360View(mode, pano);
  33679. var done = function done(e) {
  33680. _this5.emit(PlayerEvents.Ready, is360, e, tag);
  33681. _this5.started = true;
  33682. };
  33683. if (!this.model.outsideAllowed() || is360 || quickstart) {
  33684. this.startInside(pano, position, quaternion, tag, deferred);
  33685. done();
  33686. } else {
  33687. this.startOutside(initialPanoInfo, deferred);
  33688. this.once(PlayerEvents.FlyingEnded, done); //add
  33689. }
  33690. this.compass = new Compass(this);
  33691. this.linkEditor = new Link(this);
  33692. this.labelManager = new LabelManager(this);
  33693. return deferred;
  33694. };
  33695. _this.startOutside = function (initialPanoInfo, deferred) {
  33696. var mode = initialPanoInfo.mode,
  33697. pano = initialPanoInfo.pano,
  33698. position = initialPanoInfo.position,
  33699. quaternion = initialPanoInfo.quaternion,
  33700. zoom = initialPanoInfo.zoom,
  33701. floorVisibility = initialPanoInfo.floorVisibility,
  33702. tag = initialPanoInfo.tag;
  33703. this.emit(PlayerEvents.StartOutside, settings$3[mode].transitionTime);
  33704. if (this.isOutsideMode(mode)) {
  33705. this.model.warpDestFloors(floorVisibility, !0);
  33706. transitions$1.cancelById(settings$3.freeze.FlyToViewFloor);
  33707. if (mode === Viewmode$1.FLOORPLAN) {
  33708. this.floorplanMode(position, quaternion, zoom);
  33709. } else {
  33710. this.dollhouseMode(position, quaternion);
  33711. }
  33712. deferred.resolve(!1);
  33713. } else {
  33714. this.startInsideWithFlyin(pano, position, quaternion, tag, deferred);
  33715. }
  33716. this.beforeChangeMode(null, mode);
  33717. };
  33718. _this.startInside = function (pano, position, quaternion, tag, deferred) {
  33719. var _quaternion;
  33720. deferred = deferred || Deferred$1();
  33721. this.currentPano = pano;
  33722. var o = pano && !pano.isAligned();
  33723. position = o ? pano.position : position || pano.position;
  33724. quaternion = quaternion || pano.quaternion;
  33725. this.initialQua = (_quaternion = quaternion) === null || _quaternion === void 0 ? void 0 : _quaternion.clone(); //minidoll需要
  33726. if (pano) {
  33727. //这里开始加载第一个点的全景图。如果未加载好,等加载好以后还会执行一遍此startInside函数。
  33728. var a = this.startInside.bind(this, pano, position, quaternion, tag, deferred);
  33729. if (this.checkAndWaitForPanoLoad(pano, 'high', 'low', this.basePanoSize, a)) return;
  33730. } //add:--------
  33731. this.modeTran = 'panorama-panorama'; //modeTran要比mode先设置,因mode修改会触发onModeUpdated,需要用到modeTran
  33732. this.beforeChangeMode(null, Viewmode$1.PANORAMA, this.currentPano, 0); //xzw add
  33733. this.afterChangeMode(null, Viewmode$1.PANORAMA);
  33734. pano.enter(); //------------
  33735. this.mode = Viewmode$1.PANORAMA;
  33736. pano.floor.enter(this.mode);
  33737. this.emit(PlayerEvents.PanoChosen, this.currentPano, this.currentPano);
  33738. this.switchCameraMode(this.mode, quaternion);
  33739. this.emit(PlayerEvents.StartInside, o); // 初始点位球幕视频静音播放
  33740. var panoVideoRenderer = this.$app.core.get('PanoVideoRenderer');
  33741. panoVideoRenderer.setMuted(true);
  33742. panoVideoRenderer.activatePanorama(this.currentPano);
  33743. deferred.resolve(!0);
  33744. return deferred;
  33745. };
  33746. _this.startInsideWithFlyin = function (initPano, initPosition, initQuaternion, tag, deferred) {
  33747. deferred = deferred || Deferred$1();
  33748. this.dollhouseMode();
  33749. if (!initPano) {
  33750. logger$1.warn('Player.startInsideWithFlyin() -> targetPano is invalid.');
  33751. deferred.resolve(!1);
  33752. return deferred;
  33753. }
  33754. initPosition = initPosition || initPano.position;
  33755. var quaternion = initQuaternion || this.cameraControls.activeControl.camera.quaternion,
  33756. position = initPano.position; //这个作用是加载完数据,模型第一次出现的位置
  33757. this.fitDollhouse(position, initPosition, quaternion);
  33758. setTimeout(function (t) {
  33759. this.cameraControls.activeControl && (this.cameraControls.activeControl.maxDistance = t);
  33760. var newMode = {
  33761. mode: Viewmode$1.PANORAMA,
  33762. pano: initPano,
  33763. quaternion: initQuaternion,
  33764. callback: function () {
  33765. this.emit(PlayerEvents.FlyinFinished);
  33766. deferred.resolve(!0);
  33767. }.bind(this)
  33768. };
  33769. this.flyToNewMode(newMode);
  33770. }.bind(this, this.cameraControls.activeControl.maxDistance), settings$3.startupFlyinDelay);
  33771. return deferred;
  33772. };
  33773. _this.checkAndWaitForPanoLoad = function () {
  33774. var loadingPanos = {},
  33775. LoadedTimePanos = {},
  33776. loadedCallback = {},
  33777. //add
  33778. maxTime = 5e3;
  33779. /* var withinTime = function () {//5秒之内还在加载的话,直接返回仍在加载状态,否则重新判断
  33780. for (var panoId in loadingPanos)
  33781. if (loadingPanos.hasOwnProperty(panoId) && loadingPanos[panoId]) {//还在加载
  33782. var differTime = performance.now() - LoadedTimePanos[panoId]
  33783. if (differTime < maxTime) return !0
  33784. }
  33785. return !1
  33786. } */
  33787. //xzw withinTime 改为只判断当前请求的点。原始代码的callback是针对任意pano的,所以遍历所有漫游点,只要有在加载的就返回,但已不满足需求。
  33788. var withinTime = function withinTime(pano) {
  33789. //5秒之内还在加载的话,直接返回仍在加载状态,否则重新判断
  33790. if (loadingPanos.hasOwnProperty(pano.id) && loadingPanos[pano.id]) {
  33791. //还在加载
  33792. var differTime = performance.now() - LoadedTimePanos[pano.id];
  33793. if (differTime < maxTime) return !0;
  33794. }
  33795. };
  33796. return function (pano, imgQuality1, imgQuality2, basePanoSize, successCallbackFunc1, successCallbackFunc2, progressCallback, iswait, isclear, p) {
  33797. if (withinTime(pano)) {
  33798. log('loadedCallback re add', pano.id);
  33799. loadedCallback[pano.id] = successCallbackFunc1; //add 更新 因为有可能之前请求的没加successCallbackFunc1
  33800. return !0; //距离上次请求时间很近
  33801. }
  33802. /*
  33803. withinTime的原因: 多次重复飞向一个点,withinTime()为true 。如修改热点位置时
  33804. */
  33805. var callback1 = function (panoId, param1, param2) {
  33806. common$1.delayOneFrame(function () {
  33807. loadingPanos[panoId] = !1; //console.log('loadedCallback consume:', pano.id)
  33808. loadedCallback[pano.id] && loadedCallback[pano.id](param1, param2);
  33809. loadedCallback[pano.id] = null;
  33810. }.bind(this));
  33811. }.bind(this, pano.id);
  33812. var callback2 = function (panoId, param) {
  33813. common$1.delayOneFrame(function () {
  33814. this.clearPanosTaskList(); // 加载tile失败后清掉task
  33815. loadingPanos[panoId] = !1;
  33816. successCallbackFunc2 && successCallbackFunc2(param);
  33817. }.bind(this));
  33818. }.bind(this, pano.id);
  33819. try {
  33820. ;
  33821. null !== iswait && void 0 !== iswait || (iswait = !0);
  33822. if (pano.tiled) {
  33823. loadingPanos[pano.id] = this.checkAndWaitForTiledPanoLoad(pano, basePanoSize, callback1, callback2, progressCallback, iswait, isclear, p);
  33824. } else {
  33825. loadingPanos[pano.id] = this.checkAndWaitForWholePanoLoad(pano, imgQuality1, imgQuality2, callback1, iswait);
  33826. }
  33827. if (loadingPanos[pano.id]) {
  33828. LoadedTimePanos[pano.id] = performance.now(); //console.log('loadedCallback add', pano.id)
  33829. loadedCallback[pano.id] = successCallbackFunc1; //add 如果加载好就执行最新的successCallbackFunc1
  33830. }
  33831. return loadingPanos[pano.id]; //false 代表加载好了
  33832. } catch (msg) {
  33833. loadingPanos[pano.id] = !1;
  33834. LoadedTimePanos[pano.id] = performance.now() - maxTime;
  33835. throw msg;
  33836. }
  33837. };
  33838. }();
  33839. _this.checkAndWaitForWholePanoLoad = function (pano, imgQuality1, imgQuality2, callbackFunc, iswait) {
  33840. if (!pano) {
  33841. throw new BasicException('Player.checkAndWaitForWholePanoLoad() -> Cannot load texture for null pano.');
  33842. }
  33843. if (iswait) {
  33844. this.model.waitForLoad(pano, function () {
  33845. return pano.isLoaded(imgQuality2);
  33846. });
  33847. }
  33848. if (!pano.isLoaded(imgQuality1)) {
  33849. pano.loadCube(imgQuality1).done(callbackFunc);
  33850. return true;
  33851. } else {
  33852. return false;
  33853. }
  33854. };
  33855. _this.checkAndWaitForTiledPanoLoad = function () {
  33856. var vectorForward = new THREE.Vector3();
  33857. return function (pano, basePanoSize, callback1, callback2, progressCallback, iswait, isclear, l) {
  33858. if (!pano) {
  33859. throw new BasicException('Player.checkAndWaitForTiledPanoLoad() -> Cannot load texture for null pano.');
  33860. }
  33861. vectorForward.copy(Vectors$1.FORWARD);
  33862. this.getDirection(vectorForward);
  33863. if (!pano.isLoaded(basePanoSize)) {
  33864. iswait && this.model.waitForLoad(pano, function () {
  33865. return pano.isLoaded(basePanoSize);
  33866. });
  33867. pano.loadTiledPano(basePanoSize, vectorForward, null, isclear, l
  33868. /* , undefined, quality */
  33869. ).done(function (e, t) {
  33870. callback1 && callback1(e, t);
  33871. }.bind(this)).fail(function (msg) {
  33872. callback2 && callback2(msg);
  33873. }.bind(this)).progress(function (e, t, i) {
  33874. progressCallback && progressCallback(e, t, i);
  33875. }.bind(this));
  33876. return !0;
  33877. }
  33878. };
  33879. }();
  33880. _this.switchCameraMode = function (mode, quaternion, target, position, currentScale) {
  33881. var o = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
  33882. var control = this.cameraControls.controls[mode],
  33883. camera = control.camera;
  33884. if (mode == Viewmode$1.PANORAMA) {
  33885. camera.position.copy(this.currentPano.position);
  33886. var direction;
  33887. if (quaternion) {
  33888. direction = Vectors$1.FORWARD.clone().applyQuaternion(quaternion);
  33889. } else {
  33890. direction = this.getDirection().setY(0).normalize();
  33891. }
  33892. control.lookAt(direction.add(camera.position));
  33893. } else {
  33894. if (target) {
  33895. control.target.copy(target);
  33896. }
  33897. if (position) {
  33898. camera.position.copy(position);
  33899. }
  33900. if (mode == Viewmode$1.DOLLHOUSE) {
  33901. //////////////////
  33902. if (!position && !target) {
  33903. if (o.dontFitScreen && this.mode === Viewmode$1.PANORAMA) {
  33904. //当前位置的抬升
  33905. position = this.position.clone();
  33906. if (this.mode === Viewmode$1.PANORAMA) {
  33907. position.add(new THREE.Vector3(0, 6, 0)).add(this.getDirection().multiplyScalar(-10));
  33908. } else {
  33909. position.add(Vectors$1.DOWN.clone().applyQuaternion(this.quaternion).multiplyScalar(6)).setY(6);
  33910. }
  33911. } else {
  33912. //fitScreen 居中 . by xzw
  33913. var vec;
  33914. if (this.mode === Viewmode$1.PANORAMA) {
  33915. control.target.copy(this.model.center).setY(this.model.boundingBox.min.y + 2);
  33916. vec = (quaternion ? new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion) : this.getDirection()).negate().setY(o.heightRatio || 1).normalize(); //获得朝向
  33917. } else {
  33918. control.target.copy(this.target.clone().setY(this.model.boundingBox.min.y + 2));
  33919. vec = Vectors$1.DOWN.clone().applyQuaternion(this.quaternion).setY(1).normalize();
  33920. }
  33921. var distance = control.suitableDistance;
  33922. vec.multiplyScalar(distance);
  33923. position = control.target.clone().add(vec);
  33924. }
  33925. camera.position.copy(position);
  33926. }
  33927. } else if (mode == Viewmode$1.FLOORPLAN) {
  33928. ////////////////////
  33929. if (!target) {
  33930. control.target.copy(this.model.center).setY(0);
  33931. }
  33932. if (!position) {
  33933. 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的高度一致,渐变才不突兀
  33934. y = Math.max(y, this.model.boundingBox.max.y + constants$4.orthoNear + constants$4.planeHeightShift + 1);
  33935. camera.position.copy(this.model.center).setY(y);
  33936. control.rotateToView(this.model.size, this.getDirection());
  33937. }
  33938. if (currentScale) {
  33939. control.currentScale = control.absoluteScale = currentScale;
  33940. } else if (o.fitBoundSize) {
  33941. control.zoomToContain(this.fitBoundSize);
  33942. } else {
  33943. control.zoomToContain(this.model.size);
  33944. }
  33945. }
  33946. }
  33947. control.update(0);
  33948. };
  33949. _this.update = function () {
  33950. var e = {},
  33951. maxDelayCount_ = 15,
  33952. //最大延迟帧数
  33953. waitUpdateCount = 2,
  33954. //先延迟两帧
  33955. needsDelayUpdate;
  33956. return function (i) {
  33957. this.updatePersistentZooming(i), this.updateFromControls(i); //this.getCurrentNodePanos(t);
  33958. this.lastFrameChanged = false;
  33959. if (this.hasChanged(e)) {
  33960. //相机、鼠标等是否有变化
  33961. this.lastFrameChanged = e.cameraChanged3 ? 'level3' : e.cameraChanged2 ? 'level2' : e.cameraChanged ? 'level1' : false;
  33962. this.lastChangeTime = Date.now();
  33963. (!this.mouseDown && this.containsMouse || e.vrHandlerMoved) && this.updateIntersect();
  33964. this.emit(PlayerEvents.ViewChanged, e);
  33965. if (e.cameraChanged) {
  33966. if (this.compass) this.compass.update(this.quaternion);
  33967. this.model.floorLogos.updateFloorlogo(this.camera && this.camera.quaternion, this);
  33968. if (this.linkEditor && (this.linkEditor.setTagVisible || this.linkEditor.setPanoVisible)) this.linkEditor.updateFootIconSize();
  33969. this.updateLabelZIndex(['dollLabels', 'doorLabels']); //更新"删除测量线"的标签所在位置
  33970. if (this.chosenMeasureRuler) {
  33971. this.chosenMeasureRuler.updateOptionPos();
  33972. }
  33973. this.yaw = math$2.getYawByDir(this.getDirection());
  33974. needsDelayUpdate = true;
  33975. } //----cameraChanged end
  33976. if (e.cameraChanged || e.floorChanged || e.allFlVisiChanged) {
  33977. this.dollLabels.concat(this.planLabels).concat(this.doorLabels).concat(this.model.measureRulers.children).concat(this.polygonmarkLabels).forEach(function (label) {
  33978. label.update();
  33979. });
  33980. }
  33981. } //----hasChanged end----------
  33982. if (needsDelayUpdate) {
  33983. //延时update,防止崩溃
  33984. if (waitUpdateCount-- == 0) {
  33985. //console.log('update1', waitUpdateCount)
  33986. DoorLabel.updateCameraDir(this);
  33987. this.setAnimateMakerPano();
  33988. waitUpdateCount = maxDelayCount_;
  33989. needsDelayUpdate = false;
  33990. } else if (waitUpdateCount % Math.round(maxDelayCount_ / 3) == 0) {
  33991. //更频繁点的更新(和上一个错开 )
  33992. //console.log('update2', waitUpdateCount )
  33993. if (this.model.supportsTiles) {
  33994. var upcomingPanos = this.panosTaskList.length > 1 ? this.panosTaskList.map(function (e) {
  33995. return e.pano;
  33996. }) : []; //add
  33997. this.updateTileDownloader(upcomingPanos); //提前加载好512图,否则持续漫游会延迟1ms而卡顿
  33998. this.updatePanoRenderer();
  33999. this.updateZoomPano();
  34000. }
  34001. }
  34002. }
  34003. if (this.paintEditor && this.paintEditor.painting) this.paintEditor.update();
  34004. this.reticule.update(); //this.path.update();
  34005. //this.spider.update();
  34006. this.cachedPanoCandidates && settings$3.navigation.panoScores && this.model.panos.showPanoScores(this.cachedPanoCandidates);
  34007. this.updateControlLocks();
  34008. this.emit('update', {
  34009. x: this.position.x,
  34010. y: this.position.z,
  34011. lon: this.cameraControls.controls.panorama.lon,
  34012. hasChanged: e,
  34013. mode: this.mode,
  34014. lastFrameChanged: this.lastFrameChanged
  34015. });
  34016. };
  34017. }();
  34018. _this.updateLabelZIndex = function (types) {
  34019. var _this6 = this;
  34020. //更新labels的z-index
  34021. types.forEach(function (type) {
  34022. if (type == 'dollLabels' && _this6.mode != 'dollhouse' || type == 'doorLabels' && _this6.mode != 'panorama') return;
  34023. var labels = _this6[type].sort(function (a, b) {
  34024. return b.pos2d.z - a.pos2d.z;
  34025. });
  34026. labels.forEach(function (label, index) {
  34027. label.elem.style.zIndex = index;
  34028. });
  34029. });
  34030. };
  34031. _this.updatePersistentZooming = function (e) {
  34032. if (1 === this.zooming) {
  34033. this.zoomBy(1 + this.zoomSpeed * e);
  34034. } else if (this.zooming === -1) {
  34035. this.zoomBy(1 - this.zoomSpeed * e);
  34036. }
  34037. };
  34038. _this.updateControlLocks = function () {
  34039. if (this.currentPano && this.model.supportsTiles) {
  34040. var ctl = this.cameraControls.controls[Viewmode$1.PANORAMA];
  34041. ctl.locked = ctl.lockedForce || settings$3.vrEnabled || !this.currentPano.highestFullTileRenderOpCompleted && this.currentPano.lockUntilRenderingComplete; //xzw add lockedForce
  34042. }
  34043. };
  34044. _this.updatePanoRenderer = function () {
  34045. var vectorForward = new THREE.Vector3();
  34046. return function (t) {
  34047. var i = this.nextPano || this.currentPano;
  34048. vectorForward.copy(Vectors$1.FORWARD);
  34049. this.getDirection(vectorForward);
  34050. if (this.$app.core.get('PanoRenderer').hasQueuedTiles() && i) {
  34051. this.$app.core.get('PanoRenderer').updateDirection(vectorForward);
  34052. }
  34053. };
  34054. }();
  34055. _this.updatePreRendering = function () {
  34056. var e = {};
  34057. return function (t) {
  34058. if (1 === settings$3.tiling.preRenderTourPanos && this.preRenderingEnabled) {
  34059. var i = this.nextPano || this.currentPano;
  34060. if (i && t && t.length > 1) {
  34061. var n = t.findIndex(function (e) {
  34062. if (e.id === i.id) return !0;
  34063. });
  34064. if (n >= 0 && n + 1 < t.length) {
  34065. var r = t[n + 1];
  34066. r.isLoaded(this.basePanoSize) || e[r.id] || (window.setTimeout(function (t) {
  34067. this.checkAndWaitForPanoLoad(t, 'high', 'low', this.basePanoSize, null, null, null, !1, !1, !1), window.setTimeout(function (t) {
  34068. e[t.id] = !1;
  34069. }.bind(this, t), settings$3.tiling.panoPreRenderRepeatDelay);
  34070. }.bind(this, r), settings$3.tiling.panoPreRenderDelay), e[r.id] = !0);
  34071. }
  34072. }
  34073. }
  34074. };
  34075. }();
  34076. _this.enablePreRendering = function () {
  34077. this.preRenderingEnabled = !0;
  34078. };
  34079. _this.updateTileDownloader = function () {
  34080. var e = new THREE.Vector3();
  34081. return function (upcomingPanos) {
  34082. var i = this.nextPano || this.currentPano;
  34083. if (i) {
  34084. var loopTime = common$1.timeMeasuring.collection['loop'].median;
  34085. this.lowTile = this.$app.config.mobile && 'level1';
  34086. if (this.lowTile) {
  34087. if (loopTime > 10 || this.model.texSizeBlock * loopTime > 500) {
  34088. //尽量不要使用,非常模糊
  34089. this.lowTile = 'level2'; //this.flying && console.log('lowTile level2')
  34090. }
  34091. }
  34092. e.copy(Vectors$1.FORWARD);
  34093. this.getDirection(e);
  34094. this.$app.core.get('TileDownloader').tilePrioritizer.updateCriteria(i, this.position, e, upcomingPanos.length > 0 ? upcomingPanos : null), this.$app.core.get('TileDownloader').processPriorityQueue = !0;
  34095. }
  34096. };
  34097. }();
  34098. _this.updateFromControls = function (e) {
  34099. null !== e && void 0 !== e || (e = 0);
  34100. var activeControl = this.cameraControls.activeControl;
  34101. if (activeControl) {
  34102. activeControl.update(e);
  34103. if (this.VR && this.VR.webxr.entered) ; else {
  34104. this.quaternion.copy(activeControl.camera.quaternion);
  34105. }
  34106. this.position.copy(activeControl.camera.position);
  34107. this.target.copy(activeControl.target);
  34108. activeControl.camera.updateProjectionMatrix();
  34109. this.camera.projectionMatrix.copy(activeControl.camera.projectionMatrix);
  34110. this.camera.projectionMatrixInverse.copy(activeControl.camera.projectionMatrixInverse);
  34111. this.emit('updateFromControls', this, e); //add
  34112. } //activeControl.camera是不更新matrixWorld的
  34113. this.camera.position.copy(this.position);
  34114. this.camera.quaternion.copy(this.quaternion);
  34115. this.camera.updateMatrix();
  34116. this.camera.updateMatrixWorld();
  34117. };
  34118. _this.updateIntersect = function () {
  34119. var _this7 = this;
  34120. //console.log('updateIntersect')
  34121. var e = this.flying,
  34122. t = this.isOutsideMode() && this.cameraControls.controls[this.mode].isEngaged(),
  34123. i = transitions$1.getById(settings$3.freeze.LookTransition);
  34124. !(e || t || this.isTouchEvent || i.length && i[0].running);
  34125. if (this.linkEditor && this.linkEditor.footIcons && (this.linkEditor.setPanoVisible || this.linkEditor.setTagVisible)) {
  34126. this.intersect = this.getMouseIntersect(null, this.linkEditor.footIcons.filter(function (e) {
  34127. return e.visible && !e.otherFloorLink;
  34128. }));
  34129. if (this.intersect) {
  34130. CursorDeal.add('hoverFootMarker');
  34131. } else {
  34132. CursorDeal.remove('hoverFootMarker');
  34133. }
  34134. return;
  34135. }
  34136. if (this.$app.Camera.monitor.control.cameras.find(function (e) {
  34137. return e.isWatching;
  34138. })) {
  34139. return; //观看监控中不能点击场景物体
  34140. }
  34141. {
  34142. //xzw
  34143. var consumed;
  34144. var consume = function consume() {
  34145. consumed = true;
  34146. }; //被使用
  34147. var getConsumed = function getConsumed() {
  34148. return consumed;
  34149. };
  34150. var meshes = [];
  34151. this.emit('collectIntersectMesh', meshes, {
  34152. consume,
  34153. getConsumed
  34154. }); //搜集要intersect的mesh
  34155. if (consumed) {
  34156. return; //有不加collider情况下获得了intersect且需要阻断的情况
  34157. }
  34158. var markers = this.panoMarkers.filter(function (e) {
  34159. return e.visible && Panorama.filters.isNeighbourPanoTo(_this7.currentPano)(e.pano);
  34160. });
  34161. var videoTags = this.model.panos.list.filter(function (pano) {
  34162. return pano.flagSpot && !pano.flagSpot.hidden;
  34163. }).map(function (pano) {
  34164. return pano.flagSpot.disc;
  34165. });
  34166. this.intersect = this.getMouseIntersect(null, markers.concat(videoTags));
  34167. if (!this.intersect) {
  34168. meshes.push.apply(meshes, _toConsumableArray(this.getColliders({
  34169. checkChunk: this.$app.TagManager.measuringTool.isAdding
  34170. })));
  34171. common$1.timeMeasuring.addTimeMark('getMouseIntersect', 'start');
  34172. this.allIntersects.length = 0;
  34173. this.intersect = this.getMouseIntersect(null, meshes, {
  34174. recursive: true,
  34175. allIntersects: this.allIntersects
  34176. }); //recursive为true写起来方便,否则textSprite检测不到sprite
  34177. common$1.timeMeasuring.addTimeMark('getMouseIntersect', 'end', true);
  34178. this.emit('judgeIntersect', this.intersect, {
  34179. consume,
  34180. getConsumed
  34181. });
  34182. if (consumed) return;
  34183. }
  34184. /* if (!this.is360View(this.mode, this.currentPano)) {
  34185. meshes = this.model.floors.reduce(function (e, t) {
  34186. return t.hidden ? e : e.concat(t.collider.children)
  34187. }, meshes)
  34188. if (this.mode == 'panorama') meshes.push(this.model.skybox)
  34189. } */
  34190. //this.intersect = this.getMouseIntersect(null, null)
  34191. }
  34192. this.intersect && this.updateClosestPano(this.intersect);
  34193. if (this.intersectLabel && this.intersect) {
  34194. var text = ['pos: ' + math$2.toPrecision(this.intersect.point.toArray(), 3), 'nor: ' + math$2.toPrecision(this.intersect.normal.toArray(), 2), 'dis: ' + math$2.toPrecision(this.intersect.distance, 2)];
  34195. this.intersectLabel.setText(text);
  34196. this.intersectLabel.setPos(this.intersect.point);
  34197. }
  34198. if (this.closestPano || this.closestPanoInDirection(this.getMouseDirection()) || this.reticule.alwaysShow) {
  34199. this.reticule.updatePosition(this.position, this.intersect);
  34200. if (settings$3.navigation.panoScores && !settings$3.navigation.mouseDirection) {
  34201. this.closestPanoInDirection(this.getDirection());
  34202. }
  34203. } else {
  34204. this.reticule.hide();
  34205. }
  34206. };
  34207. _this.getMouseDirection = function (e) {
  34208. var inXR = this.VR && this.VR.webxr.entered;
  34209. if (inXR) {
  34210. return this.VR.webxr.getHandlerDir();
  34211. }
  34212. e = e || this.mouse;
  34213. var t = new THREE.Vector3(e.x, e.y, -1).unproject(this.camera),
  34214. i = new THREE.Vector3(e.x, e.y, 1).unproject(this.camera);
  34215. return i.sub(t).normalize();
  34216. };
  34217. _this.getColliders = function () {
  34218. var msg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  34219. var colliders = [];
  34220. if (!this.is360View(this.mode, this.currentPano)) {
  34221. if (!this.$app.config.mobile || msg.checkChunk || this.mode != Viewmode$1.PANORAMA) {
  34222. //xzw:手机漫游时不intersect模型,因为有的模型很大,八千个mesh用时3ms。但可能导致问题:方向不准
  34223. colliders = this.model.floors.reduce(function (e, t) {
  34224. return t.hidden ? e : e.concat(t.collider.children);
  34225. }, [] //this.mode === Viewmode.PANORAMA ? this.panoMarkers : []
  34226. );
  34227. }
  34228. if (!msg.noSkybox && this.mode === Viewmode$1.PANORAMA) colliders.push(this.model.skybox);
  34229. }
  34230. return colliders;
  34231. };
  34232. _this.getMouseIntersect = function (mouse, colliders) {
  34233. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  34234. _ref$recursive = _ref.recursive,
  34235. recursive = _ref$recursive === void 0 ? false : _ref$recursive,
  34236. type = _ref.type,
  34237. allIntersects = _ref.allIntersects;
  34238. mouse = mouse || this.mouse.clone();
  34239. if (!colliders) {
  34240. colliders = this.getColliders();
  34241. } //performance.mark('intersect-start')
  34242. if (this.VR && this.VR.webxr.entered) {
  34243. this.VR.webxr.setRayCaster(this.raycaster);
  34244. } else {
  34245. var origin = new THREE.Vector3(mouse.x, mouse.y, -1).unproject(this.camera);
  34246. this.raycaster.set(origin, this.getMouseDirection(mouse));
  34247. }
  34248. this.raycaster.camera = this.camera;
  34249. var objects3d = this.raycaster.intersectObjects(colliders, recursive); //加了个true遍历子集
  34250. /* performance.mark('intersect-end')
  34251. let measure = performance.measure('intersect','intersect-start','intersect-end');
  34252. colliders.length> 0 && console.log('getMouseIntersect',measure.duration.toFixed(4))
  34253. */
  34254. objects3d = objects3d.sort(function (a, b) {
  34255. var _b$object$pickOrder, _a$object$pickOrder;
  34256. return ((_b$object$pickOrder = b.object.pickOrder) !== null && _b$object$pickOrder !== void 0 ? _b$object$pickOrder : 0) - ((_a$object$pickOrder = a.object.pickOrder) !== null && _a$object$pickOrder !== void 0 ? _a$object$pickOrder : 0);
  34257. }); // 降序
  34258. if (0 === objects3d.length) {
  34259. return null;
  34260. }
  34261. if (type == 'getAll') return objects3d; //console.log('object3d', objects3d.map(e=>e.object.name))
  34262. allIntersects === null || allIntersects === void 0 ? void 0 : allIntersects.push.apply(allIntersects, _toConsumableArray(objects3d));
  34263. var object3d = objects3d[0];
  34264. this.intersectAddNormal(object3d);
  34265. return object3d;
  34266. };
  34267. _this.updateClosestPano = function (intersect) {
  34268. var _this8 = this;
  34269. // 如果在fly过程中hover到marker时会使本该隐藏的marker显示出来
  34270. if (this.mode === Viewmode$1.TRANSITIONING) return;
  34271. var filterFuncs = [Panorama.filters.isPanoAligned()];
  34272. var pano;
  34273. if (!this.flying) {
  34274. //为了避免飞的过程中还能hover到原先currentPano的邻居点,飞的时候禁止onHover
  34275. if (intersect && (this.panoMarkers.includes(intersect.object) || //是marker . xzw add
  34276. this.model.panos.list.find(function (pano) {
  34277. return pano.flagSpot && pano.flagSpot.disc == intersect.object;
  34278. })) // 是videoTag
  34279. ) {
  34280. pano = intersect.object.pano; //console.log('pano = intersect.object.pano', pano.id)
  34281. }
  34282. if (!pano) {
  34283. if (this.mode === Viewmode$1.PANORAMA) {
  34284. if (!this.currentPano) {
  34285. return;
  34286. }
  34287. filterFuncs.push(Panorama.filters.not(this.currentPano));
  34288. filterFuncs.push(Panorama.filters.isNeighbourPanoTo(this.currentPano));
  34289. filterFuncs.push(Panorama.filters.inFloorDirection(this.currentPano.floorPosition, this.getDirection(), 0.25));
  34290. filterFuncs.push(Panorama.filters.isCloseEnoughTo(intersect.point, settings$3.panoFloorClickRadius)); //如果在地面下很远,由于先识别到地面,intersect就离floorPosition很远,识别不到。所以改为先单独识别marker。
  34291. intersect.normal && filterFuncs.push(Panorama.filters.isNotBehindNormal(intersect.point, intersect.normal));
  34292. } else {
  34293. // 避开孤立点,但初始点一定可进入
  34294. filterFuncs.push(function (pano) {
  34295. return _this8.linkEditor.checkHasNeighbor(pano) || pano == _this8.$app.core.get('Scene').firstView.pano;
  34296. });
  34297. filterFuncs.push(Panorama.filters.isOnVisibleFloor());
  34298. this.mode !== Viewmode$1.FLOORPLAN && filterFuncs.push(Panorama.filters.inDirection(this.position, this.getDirection(), 0.25));
  34299. }
  34300. pano = this.model.panos.find(filterFuncs, [Panorama.sortFunctions.floorDistanceToPoint(intersect.point)]);
  34301. }
  34302. }
  34303. if (pano !== this.closestPano) {
  34304. pano && (this.isPanoHover = !0); //触发事件,导致地面的marker变清晰
  34305. this.emit(PlayerEvents.ClosestPanoChanging, this.closestPano, pano, this.mode);
  34306. this.closestPano = pano;
  34307. } else {
  34308. this.isPanoHover = !1;
  34309. }
  34310. };
  34311. _this.dollhouseMode = function (position, quaternion) {
  34312. this.modeTran = 'dollhouse-panorama';
  34313. this.emit(PlayerEvents.ModeChanging, this.mode, Viewmode$1.DOLLHOUSE);
  34314. this.mode = Viewmode$1.DOLLHOUSE;
  34315. this.cameraControls.controls[Viewmode$1.DOLLHOUSE].reset();
  34316. var center = new THREE.Vector3(this.model.center.x, 0, this.model.center.z),
  34317. cameraPosition = new THREE.Vector3(15, 10, 15);
  34318. if (position && quaternion) {
  34319. var direction = Vectors$1.FORWARD.clone().applyQuaternion(quaternion),
  34320. position = this.model.center.clone().sub(position),
  34321. s = position.dot(direction);
  34322. if (s > 0) {
  34323. center = direction.clone().multiplyScalar(s).add(position); //cameraPosition.copy(position)
  34324. } else {
  34325. logger$1.warn("Tried to initiate dollhouse mode that wasn'quaternion looking at the model", position, quaternion);
  34326. }
  34327. }
  34328. this.cameraControls.controls[Viewmode$1.DOLLHOUSE].resetRanges(0, !0);
  34329. this.cameraControls.controls[Viewmode$1.DOLLHOUSE].target.copy(center);
  34330. this.cameraControls.cameras[Viewmode$1.DOLLHOUSE].position.copy(cameraPosition);
  34331. this.updateFromControls();
  34332. this.model.alpha = 1;
  34333. this.model.skybox.material.uniforms.opacity.value = 0;
  34334. };
  34335. _this.insideMode = function (pano, callback) {
  34336. var deferred = Deferred$1(),
  34337. callbackFunc = callback || null;
  34338. if (this.mode !== Viewmode$1.PANORAMA && this.mode !== Viewmode$1.TRANSITIONING) {
  34339. if (!pano) {
  34340. if (!this.currentPano || this.model.currentFloor && this.currentPano.floor != this.model.currentFloor) {
  34341. pano = this.getFloorPanoByScore(null, this.model.currentFloor); //到当前所在楼层
  34342. }
  34343. if (!pano) {
  34344. pano = this.currentPano;
  34345. }
  34346. }
  34347. this.flyToNewMode({
  34348. mode: Viewmode$1.PANORAMA,
  34349. pano: pano,
  34350. callback: callbackFunc
  34351. }).done(deferred.resolve.bind(deferred)).fail(deferred.reject.bind(deferred));
  34352. } else {
  34353. var msg = 'Cannot change mode during mode transition';
  34354. if (this.mode === Viewmode$1.PANORAMA) {
  34355. msg = 'Already in panorama mode';
  34356. }
  34357. deferred.reject(msg);
  34358. }
  34359. return deferred.promise();
  34360. };
  34361. _this.fitDollhouse = function (initPosition1, initPosition2, initQuaternion) {
  34362. var maxY = this.model.boundingBox.max.y;
  34363. var n = Vectors$1.FORWARD.clone().applyQuaternion(initQuaternion);
  34364. initQuaternion = n.clone().add(initPosition1);
  34365. this.cameraControls.activeControl.target.copy(initQuaternion);
  34366. this.cameraControls.activeControl.camera.position.set(0, maxY * 2.4, 0).add(initPosition1).add(n.multiplyScalar(-10));
  34367. /*
  34368. var n = Vectors.FORWARD.clone().applyQuaternion(initQuaternion)
  34369. this.cameraControls.activeControl.target.copy(n).add(initPosition1)
  34370. var o = Vectors.RIGHT.clone().applyQuaternion(initQuaternion),
  34371. a = Vectors.UP.clone(),
  34372. s = o.clone().applyAxisAngle(a, Math.PI / 2),
  34373. boundingBoxMax = this.model.boundingBox.max.clone(),
  34374. boundingBoxMin = this.model.boundingBox.min.clone(),
  34375. h = [
  34376. new THREE.Vector3(boundingBoxMax.x, 0, boundingBoxMax.z).sub(initPosition1),
  34377. new THREE.Vector3(boundingBoxMax.x, 0, boundingBoxMin.z).sub(initPosition1),
  34378. new THREE.Vector3(boundingBoxMin.x, 0, boundingBoxMax.z).sub(initPosition1),
  34379. new THREE.Vector3(boundingBoxMin.x, 0, boundingBoxMin.z).sub(initPosition1)
  34380. ],
  34381. u = 0,
  34382. p = 0,
  34383. g = 0
  34384. h.forEach(function(e, t, i) {
  34385. var n = Math.abs(e.dot(o)),
  34386. r = e.dot(s)
  34387. n > u && ((u = n), (p = r)), r > g && (g = r)
  34388. })
  34389. 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))),
  34390. v = s
  34391. .clone()
  34392. .multiplyScalar(p)
  34393. .add(initPosition2),
  34394. A = s
  34395. .clone()
  34396. .multiplyScalar(g)
  34397. .add(initPosition2)
  34398. ;(p = u / Math.tan((this.cameraControls.activeControl.camera.fov / 2) * this.cameraControls.activeControl.camera.aspect * (Math.PI / 180))),
  34399. (g = m / Math.tan((this.cameraControls.activeControl.camera.fov / 2) * (Math.PI / 180))),
  34400. (p = Math.max(p, 10)),
  34401. (g = Math.max(g, 10))
  34402. var y = n
  34403. .clone()
  34404. .multiplyScalar(-p)
  34405. .add(v)
  34406. .sub(initPosition2)
  34407. .length(),
  34408. C = n
  34409. .clone()
  34410. .multiplyScalar(-g)
  34411. .add(v)
  34412. .sub(initPosition2)
  34413. .length()
  34414. this.cameraControls.activeControl.maxDistance = settings.skyboxRadius - 1
  34415. if (y >= C) {
  34416. this.cameraControls.activeControl.camera.position
  34417. .set(0, 6, 0)
  34418. .add(v)
  34419. .add(n.multiplyScalar(1.1 * -p))
  34420. } else {
  34421. this.cameraControls.activeControl.camera.position
  34422. .set(0, 6, 0)
  34423. .add(A)
  34424. .add(n.multiplyScalar(1.1 * -g))
  34425. }
  34426. */
  34427. };
  34428. _this.floorplanMode = function (position, quaternion, zoom, ratio) {
  34429. this.mode = Viewmode$1.FLOORPLAN;
  34430. var control = this.cameraControls.controls[Viewmode$1.FLOORPLAN];
  34431. control.reset();
  34432. var cameraPosition = position ? position : this.model.center;
  34433. control.target.copy(cameraPosition).setY(0);
  34434. control.camera.position.copy(cameraPosition).setY(settings$3.floorplan.cameraHeight);
  34435. if (zoom) {
  34436. control.currentScale = zoom / (this.domElement.clientWidth / this.domElement.clientHeight);
  34437. control.absoluteScale = control.currentScale;
  34438. } else {
  34439. control.zoomToContain(this.model.size, ratio);
  34440. }
  34441. if (quaternion) {
  34442. var direction = Vectors$1.LEFT.clone().applyQuaternion(quaternion);
  34443. control.rotateLeft(-Math.atan2(direction.x, direction.z));
  34444. } else {
  34445. control.rotateToView(this.model.size, this.getDirection());
  34446. }
  34447. control.update(0);
  34448. };
  34449. _this.getAimToNextPano = function (pano, aim, aimQua) {
  34450. //flyToPano 获取quaternion
  34451. var hasVideo;
  34452. if (!aim && !aimQua) {
  34453. var askAim = {
  34454. importance: 0,
  34455. aim: null
  34456. }; //发送请求看看是否需要强制focus的点(比如热点添加时)
  34457. this.emit('ifFocusPoint', askAim);
  34458. if (askAim.aim) {
  34459. if (askAim.importance >= 3) {
  34460. //importance判断权重
  34461. aim = askAim.aim;
  34462. }
  34463. }
  34464. }
  34465. if (!aim) {
  34466. if (pano.panoVideo) {
  34467. hasVideo = true;
  34468. aim = pano.position.clone().add(pano.panoVideo.dir);
  34469. } else {
  34470. hasVideo = !aim && pano.hasVideo && this.$app.core.get('PanoVideoRenderer') && this.$app.core.get('PanoVideoRenderer').ifEnable();
  34471. if (hasVideo) {
  34472. // if(!objects.mainDesign || !objects.mainDesign.editing){
  34473. if (pano.videoInfo.dir) {
  34474. //同panoVideo 展示页
  34475. aim = pano.position.clone().add(pano.videoInfo.dir);
  34476. } else {
  34477. var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(this.model.supportsTiles ? 90 : 180));
  34478. aim = Vectors$1.FORWARD.clone().applyQuaternion(qua.multiply(pano.quaternion)).add(pano.position);
  34479. } // }
  34480. }
  34481. }
  34482. }
  34483. if (aim) aimQua = convertTool.getQuaByAim(aim, pano.position);else aimQua = aimQua;
  34484. return {
  34485. aimQua,
  34486. hasVideo
  34487. };
  34488. };
  34489. _this.flyToPano = function (toPano, callbackFunc) {
  34490. var _this9 = this;
  34491. /* toPano.callback = callbackFunc
  34492. return this.fastToPano(toPano ) */
  34493. //-----测试瞬间过渡
  34494. if (this.locked) {
  34495. return;
  34496. }
  34497. if (typeof toPano == 'number' || typeof toPano == 'string') toPano = {
  34498. pano: this.model.panos.index[toPano]
  34499. };else if (toPano instanceof Panorama) toPano = {
  34500. pano: toPano
  34501. };
  34502. var pano = toPano.pano,
  34503. aim = toPano.lookAtPoint,
  34504. //优先级比quaternion 高
  34505. aimQua = toPano.quaternion,
  34506. duration = toPano.duration,
  34507. aimDuration = toPano.aimDuration,
  34508. rotSpeed = toPano.rotSpeed;
  34509. //xzw
  34510. toPano.maxDistanceOverride;
  34511. toPano.skipWarpingCheck;
  34512. //constantMoveSpeed = toPano.constantMoveSpeed,
  34513. toPano.easeType;
  34514. var //如果为'constant'代表一直保持某个速度,一般是导览,直到最后一个点减速
  34515. newPano = null,
  34516. retryCallback = null,
  34517. zoomLevel = toPano.zoomLevel || (settings$3.zoom.zoomToDefaultWhenToPano ? 1 : this.zoomLevel),
  34518. //add
  34519. cancelLookFun = toPano.cancelLookFun,
  34520. checkAlone = toPano.checkAlone;
  34521. callbackFunc = callbackFunc || toPano.callback;
  34522. toPano.quaOri = this.quaternion.clone(); //记录一下
  34523. if (typeof pano == 'number') pano = toPano.pano = this.model.panos.index[pano];
  34524. if (this.EditPanoMosaic && this.EditPanoMosaic.editVideo && this.EditPanoMosaic.editVideo.pano != pano) {
  34525. return;
  34526. } // checkAlone 如果pano是孤立点,则根据aim跳转到最近的非孤立点
  34527. if (checkAlone && aim && pano.neighbourUUIDs.filter(function (id) {
  34528. return id != pano.id;
  34529. }).length == 0) {
  34530. var notAlonePano = this.model.panos.closestPanoTowardPoint({
  34531. point: aim,
  34532. require: [function (pano) {
  34533. return pano.neighbourUUIDs.filter(function (id) {
  34534. return id != pano.id;
  34535. }).length > 0;
  34536. }]
  34537. });
  34538. if (notAlonePano) {
  34539. pano = notAlonePano;
  34540. toPano.pano = pano;
  34541. }
  34542. }
  34543. if (!toPano.gotQua) {
  34544. var _this$getAimToNextPan = this.getAimToNextPano(pano, aim, aimQua),
  34545. aimQua = _this$getAimToNextPan.aimQua;
  34546. _this$getAimToNextPan.hasVideo;
  34547. toPano.quaternion = aimQua;
  34548. toPano.gotQua = true;
  34549. } //this.updateLastView();
  34550. //飞入
  34551. if (this.mode !== Viewmode$1.PANORAMA) {
  34552. return void this.flyToNewMode({
  34553. mode: Viewmode$1.PANORAMA,
  34554. pano: pano,
  34555. duration: duration,
  34556. quaternion: aimQua,
  34557. callback: callbackFunc
  34558. });
  34559. }
  34560. /*
  34561. toPano.callback = callbackFunc
  34562. return this.fastToPano(toPano ) //-----测试瞬间过渡
  34563. */
  34564. //console.log('this.flying',this.flying, this.panosTaskList.length)
  34565. var isFade360 = this.is360View(this.mode, pano) || this.is360View(this.mode, this.currentPano);
  34566. if (!this.judgePanoTask(toPano, isFade360)) {
  34567. //console.log('judgePanoTask return',this.panosTaskList )
  34568. callbackFunc && callbackFunc(false);
  34569. return;
  34570. } //处理panosTaskList
  34571. //this.$app.core.get('PanoVideoRenderer').activatePanorama(pano)
  34572. if (pano) {
  34573. newPano = common$1.deepExtend(toPano);
  34574. retryCallback = function () {
  34575. common$1.delayOneFrame(function () {
  34576. if (this.panosTaskList[0] != newPano) {
  34577. //非最新任务
  34578. //checkAndWaitForPanoLoad可能有点问题,isLoaded和callback不同步?导致add了没及时 consume
  34579. return log();
  34580. }
  34581. newPano.retry = true; //add
  34582. this.flyToPano(newPano, callbackFunc);
  34583. }.bind(this));
  34584. }.bind(this);
  34585. }
  34586. if (config$6.mobile) {
  34587. //手机端的终点出发时使用1024,直到到达终点(也就是高了要降, 低了不升)
  34588. this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  34589. size: 1024
  34590. });
  34591. if (this.lowTile == 'level2') {
  34592. if (!pano.tiledPanoRenderTarget) {
  34593. //非快速漫游时降当前的漫游点
  34594. this.$app.core.get('PanoRenderer').switchPanoQuality(this.currentPano, {
  34595. size: 1024
  34596. });
  34597. }
  34598. }
  34599. } else {
  34600. if (!pano.tiledPanoRenderTarget) this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  34601. size: 2048
  34602. }); //pc在非无缝过渡的出发时, 终点要使用2048. 无缝时还保留之前半路加载的1024
  34603. }
  34604. if (!pano || !this.checkAndWaitForPanoLoad(pano, 'high', 'low', this.basePanoSize, retryCallback)) {
  34605. // logger.time(`[fly to pano] ${pano && pano.id}`)
  34606. console.log("[flytopano]", pano && pano.id);
  34607. var callback = toPano.finalCallback = function (flyDone) {
  34608. //console.log('飞callback', this.currentPano.id )
  34609. this.nextPanoTask(toPano, flyDone); //继续执行panosTaskList的下一个pano
  34610. callbackFunc && callbackFunc(flyDone); //xzw 2022.7.8移动到最后。 万一callbackFunc中包含要飞向下一个,就需要先执行 nextPanoTask。但是万一又需要这个先怎么办
  34611. }.bind(this);
  34612. if (!this.currentPano) {
  34613. this.currentPano = pano;
  34614. } //this.adjustFlySpeed(this.currentPano, pano)
  34615. var _duration = duration;
  34616. if (typeof duration != 'number') {
  34617. _duration = this.computeDuration(toPano);
  34618. } // 加载3dtiles会拖长跳转时间,减去150ms比较合适 //无缝过渡不允许修改
  34619. //if (this.model._3dTilesRuntime) _duration = Math.max(_duration - 150, 1)
  34620. toPano.duration = _duration;
  34621. log('flytopano', toPano.pano.id, toPano, this.panosTaskList.map(function (e) {
  34622. return e.pano.id;
  34623. }));
  34624. /* if( this.panosTaskList[0] != toPano ){
  34625. console.error('?')
  34626. } */
  34627. if (this.zoomLevel !== zoomLevel) {
  34628. switch (settings$3.zoom.transitionStyle) {
  34629. case 1:
  34630. this.smoothZoomLevelTo(zoomLevel, _duration / 2);
  34631. break;
  34632. case 2:
  34633. newPano = common$1.deepExtend(toPano);
  34634. retryCallback = this.flyToPano.bind(this, newPano, callbackFunc);
  34635. return void this.smoothZoomLevelTo(zoomLevel, settings$3.zoom.restoreTime * (this.zoomLevel - zoomLevel), retryCallback);
  34636. }
  34637. }
  34638. if (aimQua
  34639. /* && !isFade360 */
  34640. ) {
  34641. var quaNow = toPano.quaOri.clone();
  34642. var M = new THREE.Vector3();
  34643. transitions$1.cancelById(settings$3.freeze.LookTransition); //_duration *= settings.transition.aimSlowFactor
  34644. if (pano === this.currentPano) {
  34645. var R = Vectors$1.FORWARD.clone().applyQuaternion(toPano.quaOri),
  34646. P = Vectors$1.FORWARD.clone().applyQuaternion(aimQua),
  34647. O = R.angleTo(P);
  34648. var callback2 = function callback2() {
  34649. callback(true);
  34650. _this9.emit('flytopano.rotateEnd', {});
  34651. };
  34652. this.flyRotate = true; //许钟文 add 在原地旋转,看向某一点
  34653. return void 0 != aimDuration || (aimDuration = 1 * Math.sqrt(O) / (rotSpeed ? rotSpeed : settings$3.tags.navigate.rotateSpeedFactor) * 1e3), void transitions$1.start(function (ee) {
  34654. if (this.mode != Viewmode$1.PANORAMA) {
  34655. //xzw
  34656. transitions$1.cancelById(settings$3.freeze.LookTransition);
  34657. callback2();
  34658. return;
  34659. }
  34660. quaNow.copy(toPano.quaOri);
  34661. lerp.quaternion(quaNow, aimQua)(ee);
  34662. M.copy(convertTool.getAimByQua(quaNow, this.cameraControls.activeControl.camera.position));
  34663. this.cameraControls.activeControl.lookAt(M);
  34664. }.bind(this), aimDuration, callback2, 0, easing[settings$3.transition.movementEasing], null, settings$3.freeze.LookTransition, cancelLookFun);
  34665. }
  34666. }
  34667. if (pano === this.currentPano || this.flying) {
  34668. log('flytopano return ', pano === this.currentPano, this.flying);
  34669. return void callback();
  34670. }
  34671. this.flying = !0;
  34672. this.position.clone();
  34673. var currentPano = this.currentPano;
  34674. this.nextPano = pano; // logger.debug('Flying to pano ', pano.position)
  34675. this.emit(PlayerEvents.PanoChosen, this.currentPano, pano); // this.emit(PlayerEvents.FlyingStarted, {
  34676. // targetPosition: pano.position,
  34677. // currentPosition: position,
  34678. // targetPano: pano,
  34679. // currentPano: currentPano,
  34680. // type: 'flyToPano',
  34681. // })
  34682. // currentPano必须加上,否则球幕视频挂起失效
  34683. this.emit(PlayerEvents.FlyingStarted, {
  34684. panoId: pano.id,
  34685. quaternion: aimQua,
  34686. lastPanoId: currentPano.id,
  34687. type: 'flyToPano',
  34688. duration: toPano.duration,
  34689. isTagFlying: toPano.isTagFlying // 飞向热点
  34690. });
  34691. this.model.currentFloor = pano.floor;
  34692. this.doorLabels.forEach(function (label) {
  34693. return label.updateVisible(pano);
  34694. });
  34695. this.model.fadePanoMarkers(0, 0, {
  34696. hideVideoFlag: true
  34697. }); //过渡时先隐藏, 因marker可能飘
  34698. if (isFade360) {
  34699. this.fade360View(this.cameraControls.activeControl.camera, {
  34700. pano: pano,
  34701. aim: aim,
  34702. aimQua: aimQua
  34703. }, function () {
  34704. _this9.afterFlyToPano(toPano);
  34705. });
  34706. return;
  34707. } //地标变化
  34708. this.model.floorLogos.changefloorLogoOpa({
  34709. index: 0,
  34710. opa: 0,
  34711. dur: _duration,
  34712. delay: 0.7
  34713. }); //this.model.floorLogoFade(0, _duration*0.5, 0.7);
  34714. this.model.floorLogos.secondLogo.position.copy(pano.floorPosition.clone().sub(this.model.position)); //this.model.floorLogos.adjustfloorLogoHeight();
  34715. common$1.updateVisible(this.model.floorLogos.secondLogo, 'flyToPano', true); //第二个地标只在过渡时显示
  34716. this.model.floorLogos.changefloorLogoOpa({
  34717. index: 1,
  34718. opa: 1,
  34719. dur: 250
  34720. }); //this.model.floorLogoShow(1,250);
  34721. //flyingWithRot边飞边旋转 (许钟文)
  34722. if (aimQua && !isFade360) {
  34723. this.flyingWithRot = true;
  34724. toPano.aimQua = aimQua;
  34725. }
  34726. toPano.chunkProgress = this.judgeHideWall(pano); //穿墙判断
  34727. //console.log('执行过渡:' + _duration)
  34728. this.startTransition(toPano); // // 虚拟人物导览对象
  34729. // const roleAnimation = this.$app.TourManager.roleAnimation
  34730. // //离toPano 3米距离
  34731. // if (roleAnimation && roleAnimation.model && this.$app.TourManager.playing && aimQua) {
  34732. // let newRolePosition = roleAnimation.getTarget2(toPano.pano.position.clone(), aimQua.clone(), 0, 3)
  34733. // const roleStartPosition = roleAnimation.model.position.clone()
  34734. // //人物到目的地的方向
  34735. // const direction = new THREE.Vector3().subVectors(newRolePosition, roleStartPosition)
  34736. // if (toPano.duration != 0) {
  34737. // //let speed = this.currentPano.position.distanceTo(toPano.pano.position) / toPano.duration
  34738. // let speed = roleStartPosition.distanceTo(newRolePosition) / toPano.duration
  34739. // roleAnimation.setModifyTimeScale(speed * 500)
  34740. // //console.log('speed:' + speed)
  34741. // }
  34742. // transitions.start(
  34743. // progress => {
  34744. // if (progress != 0 && progress != 1 && roleAnimation.getVisible()) {
  34745. // //累加并更新人物坐标
  34746. // let _newRolePosition = new THREE.Vector3().addVectors(roleStartPosition, new THREE.Vector3(direction.x * progress, 0, direction.z * progress))
  34747. // roleAnimation.setWalkingToTarget(_newRolePosition)
  34748. // roleAnimation.model.position.set(_newRolePosition.x, this.model.currentFloor.boundingBox.min.y, _newRolePosition.z)
  34749. // //console.log('RoleAnimation-setWalkingToTarget1:' + roleAnimation.model.rotation.y + '&&' + progress)
  34750. // }
  34751. // },
  34752. // toPano.duration,
  34753. // null,
  34754. // 0,
  34755. // null,
  34756. // null,
  34757. // 'roleWalk'
  34758. // )
  34759. // }
  34760. }
  34761. };
  34762. _this.startTransition = function (toPano) {
  34763. var _this10 = this;
  34764. //this.model.chunks.forEach(e => common.updateVisible(e, 'force', false))
  34765. if (!toPano.easeFun) toPano.easeFun = easing.linearTween;
  34766. var startProgress = toPano.progress || 0; // 同屏时过渡transitionsId必须做区分
  34767. var transitionsId = this.$app.resource.num + settings$3.freeze.FlyToPano;
  34768. transitions$1.cancelById(transitionsId);
  34769. var dis = this.currentPano.position.distanceTo(toPano.pano.position);
  34770. var loadNextProgress = THREE.MathUtils.clamp(1 - 2 / dis, 0, 0.9);
  34771. var quaNow = toPano.quaOri.clone();
  34772. var M = new THREE.Vector3();
  34773. this.emit('startTransition', toPano);
  34774. /* console.log(
  34775. 'startTransition ',
  34776. toPano.pano.id,
  34777. toPano.easeFun == easing.easeOutSine ? '减速' : '匀速',
  34778. (toPano.easeFun == easing.linearTween && toPano.flySpeed) ? '目标速度' + toPano.flySpeed.toFixed(5) : '',
  34779. 'dur', toPano.duration.toFixed(2),
  34780. 'pgs',toPano.progress.toFixed(3),
  34781. toPano.easeFun == easing.linearTween ? 'loadNextP '+ loadNextProgress.toFixed(2):''
  34782. ) */
  34783. transitions$1.start(function (progress_, delta) {
  34784. var item = transitions$1.getById(transitionsId)[0];
  34785. var progress = startProgress + progress_ * (1 - startProgress);
  34786. var currentSpeed;
  34787. if (progress_ != 1 && progress_ != 0) {
  34788. // 1的时候不准,往往偏小, 0的时候速度为0,也不记录
  34789. currentSpeed = toPano.currentSpeed = (progress - toPano.progress) * dis / delta; //记录下当前速度,当变为匀速时可以过渡到flySpeed
  34790. //console.log('currentSpeed',currentSpeed, progress_, progress)
  34791. } else {
  34792. currentSpeed = toPano.currentSpeed || 0;
  34793. } //console.log('progress',progress, delta)
  34794. toPano.progress = progress;
  34795. if (progress_ > 0 && progress_ < 1 && delta) {
  34796. var adjustSpeed = function adjustSpeed(ratio, cause) {
  34797. var maxChange = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.08;
  34798. //调速
  34799. var change = Math.abs(ratio - 1);
  34800. if (change > maxChange) {
  34801. if (ratio > 1) ratio = 1 + maxChange;else ratio = 1 - maxChange;
  34802. }
  34803. transitions$1.adjustSpeed(transitionsId, ratio); //改速
  34804. transitions$1.adjustSpeed(settings$3.freeze.LookTransition, ratio); //把旋转的也改速下
  34805. //console.log(cause, 'ratio', ratio.toFixed(4), 'speed', currentSpeed.toFixed(5), 'progress', progress.toFixed(4), 'dur',item.duration.toFixed(3))
  34806. };
  34807. if (toPano.easeFun == easing.linearTween && toPano.flySpeed) {
  34808. //调整速度向期望速度靠近(匀速时的flySpeed是期望速度)
  34809. if (currentSpeed > 0 && !math$2.closeTo(currentSpeed, toPano.flySpeed) && toPano.flySpeed) {
  34810. var ratio = toPano.flySpeed / currentSpeed;
  34811. var maxChange = toPano.easeType == 'constant' ? ratio - 1 : 0.01; //改变幅度小的话,有惰性,可以保持接近匀速但整体又能保持平均标准速度。 导览不限制最大变速
  34812. adjustSpeed(ratio, '渐变匀速', maxChange);
  34813. }
  34814. }
  34815. if (progress > loadNextProgress && toPano.flyCount == 1 && toPano.easeFun == easing.linearTween
  34816. /* && toPano.easeType != 'constant' */
  34817. && _this10.panosTaskList.length == 1) {
  34818. //匀速行走超过一半时,若还是最后一个,就减速(之后若又按下,还会变为匀速)
  34819. toPano.easeFun = easing.easeOutSine;
  34820. var restDis = (1 - progress) * dis;
  34821. toPano.duration = Math.PI / 2 * restDis / currentSpeed;
  34822. /* settings.transition.flySpeed */
  34823. // 这样能保证初始速度为flySpeed
  34824. toPano.duration = Math.max(toPano.duration, settings$3.transition.flyTime - item.duration * progress); //避免停止过于迅速
  34825. toPano.ignoreFirstFrame = false;
  34826. _this10.startTransition(toPano);
  34827. }
  34828. if (progress > 0.2 && _this10.panosTaskList.length > 1 && !_this10.panosTaskList[1].pano.tiledPanoRenderTarget) {
  34829. //无缝过渡中途 提前加载下一个, 防止停顿
  34830. _this10.$app.core.get('PanoRenderer').switchPanoQuality(_this10.panosTaskList[1].pano, {
  34831. useIdel: true,
  34832. size: _this10.lowTile == 'level2' ? 512 : 1024
  34833. }); //该质量将会一直持续到到达它
  34834. _this10.checkAndWaitForPanoLoad(_this10.panosTaskList[1].pano, 'low', 'low', _this10.basePanoSize, function () {}); //'low', 'low'
  34835. }
  34836. /* if(toPano.easeFun != easing.linearTween && progress > 0.1 && progress < 0.9 && currentSpeed > 0.001 && item.duration < settings.transition.flyTime){
  34837. let r = THREE.MathUtils.clamp(item.duration * 2.3 / settings.transition.flyTime, 0.9, 0.95)
  34838. adjustSpeed(r, '降速') //防止停止的最后一段因太短而迅速停止
  34839. } */
  34840. }
  34841. _this10.model.skybox.material.uniforms.progress.value = progress;
  34842. _this10.emit('updataProgress', progress); //别的模块借用一下透明度
  34843. if (toPano.chunkProgress) {
  34844. _this10.model.chunks.forEach(function (e) {
  34845. return e.materialInside.uniforms.progress.value = progress;
  34846. });
  34847. }
  34848. if (isNaN(progress)) {
  34849. console.error('progress isNaN', progress, progress_, startProgress, delta, toPano.duration, toPano);
  34850. transitions$1.cancelById(transitionsId);
  34851. }
  34852. var position = _this10.currentPano.position.clone();
  34853. var endPos = toPano.pano.position.clone();
  34854. lerp.vector(position, endPos)(progress);
  34855. _this10.cameraControls.cameras[Viewmode$1.PANORAMA].position.copy(position); //过渡的同时旋转镜头
  34856. if (toPano.aimQua) {
  34857. quaNow.copy(toPano.quaOri);
  34858. lerp.quaternion(quaNow, toPano.aimQua)(progress);
  34859. M.copy(convertTool.getAimByQua(quaNow, _this10.cameraControls.activeControl.camera.position));
  34860. _this10.cameraControls.activeControl.lookAt(M);
  34861. }
  34862. }, toPano.duration, this.afterFlyToPano.bind(this, toPano), 0, toPano.easeFun, 'chunkFly', transitionsId, function () {
  34863. //cancelById
  34864. _this10.afterFlyToPano(toPano, true);
  34865. }, toPano.ignoreFirstFrame);
  34866. toPano.flyCount++;
  34867. };
  34868. _this.nextPanoTask = function (lastToPano, dealTask) {
  34869. if (lastToPano == this.panosTaskList[0]) this.panosTaskList.splice(0, 1); //this.off('makeConstantSpeed', startTransition)
  34870. if (dealTask && this.panosTaskList.length) {
  34871. //继续处理下一个任务
  34872. var next = this.panosTaskList[0];
  34873. next.dealingTask = true; //log('准备执行下一个任务', this.panosTaskList[0].pano.id)
  34874. var dis = next.pano.position.distanceTo(lastToPano.pano.position);
  34875. var currentSpeed = lastToPano.currentSpeed;
  34876. var hopeDur = this.computeDuration(next);
  34877. currentSpeed = Math.max(0.002, currentSpeed);
  34878. next.duration = dis / currentSpeed; //初始速度,为了衔接。即将被使用
  34879. if (next.quaternion) {
  34880. next.duration = hopeDur; //next.duration = Math.max(hopeDur/3, next.duration) //防止过小,导致后期追不上标准速度,尤其是有转向时
  34881. }
  34882. next.flySpeed = dis / hopeDur; //期待速度, 是标准速度
  34883. //console.log('上一个的速度', currentSpeed, '期待速度', next.flySpeed)
  34884. this.flyToPano(next);
  34885. }
  34886. };
  34887. _this.judgePanoTask = function (toPano, isFade360) {
  34888. //处理panosTaskList
  34889. toPano.progress = toPano.progress || 0;
  34890. toPano.flyCount = 0;
  34891. var length = this.panosTaskList.length;
  34892. var last = this.panosTaskList[length - 1];
  34893. if (this.dontInterruptPanoTask) {
  34894. return !!toPano.dealingTask;
  34895. }
  34896. if (!toPano.retry && !toPano.dealingTask) {
  34897. var currentTask = this.panosTaskList[0];
  34898. /* if (currentTask && !currentTask.canConstantlyWalk) {
  34899. return console.log('当前执行的是非canConstantlyWalk,不允许加入')
  34900. } */
  34901. if (toPano.quaternion || isFade360) {
  34902. //遇到特殊的toPano,在这之后不能继续添加
  34903. toPano.canConstantlyWalk = false; //是否可以一直点击一直走。(是否允许添加下一个)
  34904. } // 如果上个点位tile加载有问题卡住,就直接清空panosTaskList
  34905. if (last && last.pano.tileError) {
  34906. this.clearPanosTaskList();
  34907. length = 0;
  34908. last = undefined;
  34909. }
  34910. if (length == 0 || last.canConstantlyWalk || toPano.pano == this.currentPano) {
  34911. if (length > 0) {
  34912. if (this.panosTaskList.some(function (e) {
  34913. var _e$lookAtPoint;
  34914. 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)));
  34915. })) {
  34916. //去除重复的
  34917. return;
  34918. }
  34919. /* let wholeDur = this.panosTaskList.reduce((w, c) => {
  34920. return w + c.duration
  34921. }, 0)
  34922. if (length > 4 || (wholeDur > 2500 && length > 1)) {
  34923. //console.log('过多',length, wholeDur)
  34924. return
  34925. } */
  34926. if (length > 1) return;
  34927. if (currentTask.flyCount == 0
  34928. /* && currentTask.easeType != 'constant' */
  34929. ) {
  34930. return;
  34931. }
  34932. }
  34933. this.panosTaskList.push(toPano); //只要通过都加入列表,包括 == currentPano的
  34934. length++;
  34935. log('panosTaskList加入', toPano.pano.id);
  34936. } else {
  34937. return log();
  34938. }
  34939. if (length > 1) {
  34940. //等待上一个任务完成
  34941. //log('增加任务', toPano.pano.id)
  34942. /* let {k, easeFun } = easing.getEaseOut( 2 / dis + 1)
  34943. toPano.easeFun = easeFun
  34944. toPano.duration = k * dis / settings.transition.flySpeed */
  34945. //当前任务如果不是匀速,要变成匀速, 且重新执行:
  34946. if (currentTask.easeFun != easing.linearTween) {
  34947. var dis = this.currentPano.position.distanceTo(currentTask.pano.position);
  34948. var restDis = (1 - currentTask.progress) * dis; //console.log('currentSpeed', currentTask.currentSpeed)
  34949. var currentSpeed = Math.max(currentTask.currentSpeed, 0.002); //避免起步过慢
  34950. var newDur = restDis / currentSpeed; //初始速度和原先一致, 为了衔接。
  34951. if (isNaN(newDur)) {
  34952. console.error('newDur isNaN', currentSpeed, currentTask.progress, currentTask);
  34953. }
  34954. currentTask.easeFun = easing.linearTween;
  34955. currentTask.flySpeed = dis / this.computeDuration(currentTask); //渐变加速到标准速度
  34956. currentTask.duration = newDur;
  34957. this.startTransition(currentTask);
  34958. }
  34959. return;
  34960. }
  34961. }
  34962. return true;
  34963. };
  34964. _this.judgeHideWall = function (pano) {
  34965. var chunkProgress = true;
  34966. /* if(objects.mainDesign && objects.mainDesign.editing){
  34967. chunkProgress = false; editModel = true;
  34968. } */
  34969. //var metadata = this.store.getters['scene/metadata'];
  34970. //if(metadata.sceneSource != 12){//123永远要显示模型
  34971. this.model.chunks.forEach(function (e) {
  34972. return common$1.updateVisible(e, 'isBlock', true);
  34973. }); //先显示
  34974. if (this.currentPano.noBlockPanos.includes(pano.id)) ; else {
  34975. //4.6.0 xzw
  34976. //console.log('judgeHideWall', pano.id)
  34977. //在算法部将有门的地方更改为不隐藏模型之前,先这么写: 判断走过的路中是否真的穿墙。
  34978. if (this.currentPano.blocks[pano.id]) {
  34979. this.hideWalls = this.currentPano.blocks[pano.id];
  34980. this.hideWalls.forEach(function (hideWall) {
  34981. common$1.updateVisible(hideWall, 'isBlock', false);
  34982. });
  34983. } else {
  34984. var safeDepth = 0.1; //向前后延伸一些,为了防止刚好墙壁在眼前
  34985. var A = this.currentPano.origin.clone();
  34986. var B = pano.origin.clone();
  34987. var AB_ = B.clone().sub(A).normalize().multiplyScalar(safeDepth);
  34988. var A_ = A.clone().sub(AB_); //延长A到A_ 延长长度为safeDepth
  34989. var B_ = B.clone().add(AB_); //延长B到B_ 延长长度为safeDepth
  34990. var intersects = convertTool.ifIntersectChunks(A_, B_, this.model, {
  34991. throughWidth: 0.08,
  34992. meshes: this.model.chunks
  34993. });
  34994. if (intersects) {
  34995. //throughWidth是为了防止刚好从缝隙中穿过,感觉和穿墙近似
  34996. this.hideWalls = intersects.map(function (intersect) {
  34997. intersect.object.visible = false;
  34998. return intersect.object;
  34999. });
  35000. {
  35001. //非编辑页面要记录下,下次不用判断
  35002. this.currentPano.blocks[pano.id] = this.hideWalls.slice(0);
  35003. }
  35004. } else {
  35005. {
  35006. //非编辑页面要记录下,下次不用判断
  35007. this.currentPano.noBlockPanos.push(pano.id);
  35008. }
  35009. }
  35010. }
  35011. }
  35012. return chunkProgress;
  35013. };
  35014. _this.afterFlyToPano = function (toPano, cancel) {
  35015. this.currentPano.isAligned() && (this.lastPano = this.currentPano); //add
  35016. if (this.currentPano !== toPano.pano) {
  35017. this.currentPano.exit();
  35018. toPano.pano.enter();
  35019. this.currentPano = toPano.pano;
  35020. this.nextPano = null;
  35021. this.path.placeCpm();
  35022. if (this.mode == Viewmode$1.PANORAMA) {
  35023. this.path.fadeOutCpm(settings$3.path.fadeOutTime);
  35024. this.paintEditor && this.paintEditor.updatePanoPaint(this.currentPano.id, this.currentPano.id);
  35025. }
  35026. }
  35027. if (!cancel) {
  35028. if (this.mode == Viewmode$1.PANORAMA) {
  35029. this.flying = !1;
  35030. this.emit(PlayerEvents.FlyingEnded, {
  35031. targetPosition: toPano.pano.position,
  35032. currentPosition: toPano.pano.position,
  35033. targetPano: toPano.pano,
  35034. currentPano: this.currentPano
  35035. });
  35036. this.model.floorLogos.firstLogo.position.copy(this.model.floorLogos.secondLogo.position); //this.model.floorLogos.adjustfloorLogoHeight()
  35037. this.model.floorLogos.changefloorLogoOpa({
  35038. index: 0,
  35039. opa: 1,
  35040. dur: 0
  35041. }); //this.model.floorLogos[0].material.uniforms.opacity.value = 1;
  35042. common$1.updateVisible(this.model.floorLogos.secondLogo, 'flyToPano', false);
  35043. this.model.chunks.forEach(function (chunk) {
  35044. chunk.materialInside.uniforms.progress.value = 1; //chunk.visible = true // 需要显示因穿墙而隐藏的模型
  35045. common$1.updateVisible(chunk, 'isBlock', true); //vr模式下似乎不能隐藏?settings.vrEnabled 因为改变chunks显示会让画面分离度改变,可能和眼睛看物体远近不同的夹角有关?????
  35046. });
  35047. this.panosTaskList.length == 1 && this.$app.core.get('PanoRenderer').switchPanoQuality(this.currentPano, {
  35048. size: 2048
  35049. }); //非无缝过渡时 升quality
  35050. }
  35051. this.model.fadePanoMarkers();
  35052. this.doorLabels.forEach(function (label) {
  35053. return label.updateVisible();
  35054. });
  35055. this.lastFlyPanoDoneTime = Date.now(); //logger.timeEnd(`[fly to pano] ${this.currentPano.id}`)
  35056. toPano.finalCallback && toPano.finalCallback(true);
  35057. }
  35058. };
  35059. _this.fastToPano = function () {
  35060. var _this11 = this;
  35061. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  35062. //瞬间过渡(支持同点过渡,支持角度)
  35063. if (this.flying || this.isWarping()) return;
  35064. var pano = o.pano || this.model.panos.index[o.panoId];
  35065. if (!pano) return console.error('fastToPano pano 无');
  35066. this.position.clone();
  35067. var oldPano = this.currentPano;
  35068. var duration = o.duration || 1500;
  35069. this.path.warpDestPano = pano;
  35070. var retry = function retry() {
  35071. _this11.waitingToWarp = !1, _this11.fastToPano(o);
  35072. };
  35073. if (config$6.mobile) {
  35074. //手机端的终点出发时使用1024,直到到达终点
  35075. this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  35076. size: 1024
  35077. });
  35078. } else {
  35079. if (!pano.tiledPanoRenderTarget) this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  35080. size: 2048
  35081. }); //pc在非无缝过渡的出发时, 终点要使用2048. 无缝时还保留之前半路加载的1024
  35082. }
  35083. if (this.checkAndWaitForPanoLoad(pano, 'high', 'low', this.basePanoSize, retry)) return void (this.waitingToWarp = !0);
  35084. this.emit('pano.chosen', oldPano, pano); // 用于暂停oldPano的球幕视频播放
  35085. this.emit(PlayerEvents.FlyingStarted, {
  35086. panoId: pano.id,
  35087. lastPanoId: oldPano.id,
  35088. type: 'flyToPano'
  35089. });
  35090. this.flying = true;
  35091. this.nextPano = pano; //提前加载高清图片
  35092. this.path.warpDestHeroLoc = {
  35093. panoId: o.panoId,
  35094. position: pano.position,
  35095. quaternion: o.quaternion || this.quaternion.clone()
  35096. }; //console.log('fastToPano', pano && pano.id )
  35097. logger$1.time("[fly to pano] ".concat(pano && pano.id));
  35098. this.path.warpTravel_BLACK(null, duration, 1, function () {
  35099. /* pano != this.currentPano && this.currentPano.exit()
  35100. pano.enter()
  35101. this.currentPano = pano
  35102. this.flying = false */
  35103. //this.emit("flying.ended", pano.position, oldPos, pano, oldPano)
  35104. o.finalCallback = o.callback;
  35105. _this11.afterFlyToPano(o);
  35106. });
  35107. };
  35108. _this.fade360View = function (currentCamera, o, fuc) {
  35109. var _this12 = this;
  35110. //这个其实可以用fastToPano
  35111. var transitionTime = o.transitionTime || 400;
  35112. if (o.pano && o.pano.view) {
  35113. if (!this.viewLinkManager.views[o.pano.view.sid]) {
  35114. fuc && fuc();
  35115. return;
  35116. } //已经删除
  35117. if (this.enteringView) {
  35118. console.log('重复进入360');
  35119. fuc && fuc();
  35120. return;
  35121. }
  35122. if (o.pano == this.currentPano && !o.flyIn) {
  35123. console.log('已经在此360漫游点');
  35124. fuc && fuc();
  35125. return;
  35126. }
  35127. o.pano.view.entering = true;
  35128. this.enteringView = o.pano.view; //从开始直到doAfterFlying这段时间标记player的状态是正在fade360View
  35129. } //热点直接利用updateVisible
  35130. //this.model.wallManager.updateRulersVisi(false);
  35131. this.domElement.style.opacity = 1; //init value
  35132. transitions$1.start(lerp.property(this.domElement.style, 'opacity', 0), transitionTime, function () {
  35133. !o.flyIn && config$6.mobile && _this12.$app.core.get('PanoRenderer').switchPanoQuality(_this12.currentPano, {
  35134. size: 1024
  35135. }); //降旧的。其实也可以直接exit,但shader里要确保用不到tex
  35136. o.pano && _this12.$app.core.get('PanoRenderer').switchPanoQuality(o.pano, {
  35137. size: 2048
  35138. });
  35139. _this12.model.skybox.material.uniforms.opacity.value = o.skyboxOpacity != void 0 ? o.skyboxOpacity : 1;
  35140. _this12.model.alpha = o.modelAlpha != void 0 ? o.modelAlpha : 0;
  35141. o.pano && (currentCamera.position.copy(o.pano.position), currentCamera.quaternion.copy(o.pano.quaternion));
  35142. var enterView = !!(o.pano && o.pano.view),
  35143. leaveView = !!(_this12.is360View(_this12.mode, _this12.currentPano) && !o.flyIn || o.flyOut); //console.log('fade360View : ', enterView, leaveView)
  35144. if (enterView) {
  35145. //进入360view
  35146. o.pano.view.exitDoor.mesh.visible = true; //console.log("exitDoor.mesh.show "+o.pano.view.sid)
  35147. //this.tagManager.hideShowTagsForBlackoutStyle(BlackoutStyle.END, transitionTime)
  35148. _this12.viewLinkManager.updateCirclesWhenFade('enter', o);
  35149. o.pano.view.balloon.showOrHide(false);
  35150. o.pano.view.entering = false;
  35151. var lookAtPoint = o.aim || new THREE.Vector3(0, 0, -1).applyQuaternion(o.pano.view.enterQuaternion || o.pano.quaternion).add(currentCamera.position);
  35152. _this12.cameraControls.controls.panorama.lookAt(lookAtPoint);
  35153. _this12.cameraControls.controls.panorama.update(0); //this.OverlayManager.setGroupVisible(false)
  35154. _this12.$app.TagManager.switchAllDisplay(false, 'enterView', {
  35155. links: true
  35156. });
  35157. _this12.viewLinkManager.changeTitlesShow(false, 'enterView360');
  35158. _this12.$app.Camera.monitor.changeTitlesShow(false, 'enterView360'); //去除角度限制
  35159. _this12.cameraControls.controls.panorama.insideLookLimitUp = 89.9;
  35160. _this12.cameraControls.controls.panorama.insideLookLimitDown = -89.9;
  35161. _this12.cameraControls.controls.panorama.limitAngleIsBound = false;
  35162. common$1.updateVisible(_this12.model.floorLogos.firstLogo, 'inView360', false); //隐藏
  35163. common$1.updateVisible(_this12.model.floorLogos.secondLogo, 'inView360', false); //隐藏
  35164. }
  35165. if (leaveView) {
  35166. //从360view出来
  35167. var view = _this12.currentPano.view;
  35168. view.exitDoor.mesh.visible = false; //console.log("exitDoor.mesh.fade "+this.currentPano.view.sid)
  35169. if (o.flyOut) {
  35170. if (o.toMode == 'dollhouse') {
  35171. //相机方向与着balloon到circle一致
  35172. var dir = new THREE.Vector3().subVectors(view.circle.mesh.position, view.balloon.mesh.position).setY(0).normalize();
  35173. _this12.cameraControls.controls.dollhouse.target.copy(view.circle.mesh.position);
  35174. _this12.cameraControls.cameras.dollhouse.position.copy(view.balloon.mesh.position).add(new THREE.Vector3(0, 4, 0)).add(dir.multiplyScalar(-10));
  35175. _this12.cameraControls.controls.dollhouse.update(0);
  35176. }
  35177. view.balloon.visible = false; //因为在beforeChangeMode里
  35178. setTimeout(function () {
  35179. view.balloon.visible = true;
  35180. }, 500); //延迟出现
  35181. }
  35182. if (!enterView) {
  35183. _this12.viewLinkManager.updateCirclesWhenFade('leave', o);
  35184. _this12.viewLinkManager.changeTitlesShow(true, 'enterView360');
  35185. _this12.$app.Camera.monitor.changeTitlesShow(true, 'enterView360'); //this.tagManager.hideShowTagsForBlackoutStyle(BlackoutStyle.FADEIN, transitionTime) //热点出现
  35186. _this12.$app.TagManager.switchAllDisplay(true, 'enterView', {
  35187. links: true
  35188. });
  35189. }
  35190. if (o.aim && !o.flyIn && !o.flyOut) {
  35191. //出来是漫游模式
  35192. _this12.cameraControls.controls.panorama.lookAt(o.aim);
  35193. _this12.cameraControls.controls.panorama.update(0);
  35194. } //this.OverlayManager.setGroupVisible(true)
  35195. _this12.cameraControls.controls.panorama.insideLookLimitUp = null;
  35196. _this12.cameraControls.controls.panorama.insideLookLimitDown = null;
  35197. _this12.cameraControls.controls.panorama.limitAngleIsBound = true;
  35198. common$1.updateVisible(_this12.model.floorLogos.firstLogo, 'inView360', true);
  35199. common$1.updateVisible(_this12.model.floorLogos.secondLogo, 'inView360', true);
  35200. }
  35201. if (o.pano) {
  35202. _this12.emit(PlayerEvents.PanoChosen, _this12.currentPano, o.pano); //触发 setProjectedPanos
  35203. _this12.model.chunks.concat([_this12.model.skybox]).forEach(function (mesh) {
  35204. mesh.material.uniforms.progress.value = 1;
  35205. }); //地标变化(在这里不需要显示)
  35206. _this12.model.floorLogos.changefloorLogoOpa({
  35207. index: 0,
  35208. opa: 0,
  35209. dur: 0,
  35210. delay: 0
  35211. }); //this.model.floorLogoFade(0, _duration*0.5, 0.7);
  35212. _this12.model.floorLogos.secondLogo.position.copy(o.pano.floorPosition.clone().sub(_this12.model.position));
  35213. enterView || common$1.updateVisible(_this12.model.floorLogos.secondLogo, 'flyToPano', true);
  35214. enterView || _this12.model.floorLogos.changefloorLogoOpa({
  35215. index: 1,
  35216. opa: 1,
  35217. dur: 250
  35218. });
  35219. }
  35220. transitions$1.start(lerp.property(_this12.domElement.style, 'opacity', 1), transitionTime, function () {
  35221. _this12.enteringView = null;
  35222. fuc && fuc(); //this.model.wallManager.updateRulersVisi();
  35223. _this12.reticule.hide(); //隐藏. 如果是离开 会自动updatePosition()后显示
  35224. if (enterView) {
  35225. _this12.emit('enteredView');
  35226. } else _this12.emit('leavedView');
  35227. }, 0, null
  35228. /* easing[settings.flydown.movementEasing] */
  35229. , null, 'fade360');
  35230. }, 0, null
  35231. /* easing[settings.flydown.movementEasing] */
  35232. , null, 'fade360');
  35233. };
  35234. _this.flyToPanoClosestToMouse = function () {
  35235. if (Date.now() - this.mouseLastMoveTime > 50) {
  35236. /* this.intersect = this.getMouseIntersect()
  35237. this.intersect && this.updateClosestPano(this.intersect) */
  35238. this.updateIntersect(); //这个才准确
  35239. }
  35240. if (this.closestPano) {
  35241. return this.flyToPano({
  35242. pano: this.closestPano,
  35243. checkAlone: true
  35244. });
  35245. }
  35246. var direction = this.getMouseDirection();
  35247. if (!this.flyDirection(direction)) {
  35248. this.flyToPano({
  35249. pano: this.currentPano
  35250. });
  35251. }
  35252. };
  35253. _this.flyLocalDirection = function (playerDirection) {
  35254. if (this.panosTaskList.length > 1 || this.panosTaskList.length == 1 && this.panosTaskList[0].progress < 0.3) {
  35255. //比0.5少一点,因0.5时会判断个数
  35256. //按键行走。在当前任务执行超过一定比率后才允许添加下一个任务
  35257. return;
  35258. }
  35259. var direction = this.getDirection(playerDirection),
  35260. playerDirectionZ = 1 === playerDirection.z ? 0.4 : 0.75,
  35261. playerDirectionX = 1 === Math.abs(playerDirection.x);
  35262. return this.flyDirection(direction, playerDirectionZ, playerDirectionX, true);
  35263. };
  35264. _this.flyDirection = function (direction, playerDirectionZ, playerDirectionX, byKey) {
  35265. if (this.locked) return;
  35266. var deferred = Deferred$1();
  35267. this.history.invalidate();
  35268. var panoSet = this.closestPanoInDirection(direction, playerDirectionZ, playerDirectionX);
  35269. if (panoSet) {
  35270. this.flyToPano({
  35271. pano: panoSet,
  35272. canConstantlyWalk: this.canConstantlyWalk,
  35273. // add
  35274. byKey
  35275. }, deferred.resolve.bind(deferred, !0));
  35276. } else if (this.panosTaskList.length == 0) {
  35277. this.bump(direction);
  35278. deferred.resolve(!1);
  35279. }
  35280. return deferred.promise();
  35281. };
  35282. _this.closestPanoInDirection = function (direction, playerDirectionZ, playerDirectionX) {
  35283. return this.rankedPanoInDirection(0, direction, playerDirectionZ, playerDirectionX);
  35284. };
  35285. _this.rankedPanoInDirection = function () {
  35286. var panoSet = {
  35287. pano: null,
  35288. candidates: []
  35289. };
  35290. return function (t, direction, PlayerDirectionZ, PlayerDirectionX) {
  35291. t || (t = 0);
  35292. PlayerDirectionZ = void 0 !== PlayerDirectionZ ? PlayerDirectionZ : 0.75;
  35293. var o = PlayerDirectionX ? 'angle' : 'direction'; //add 相对于即将达到的目标点 或当前点
  35294. var currentPano = this.panosTaskList.length ? this.panosTaskList[this.panosTaskList.length - 1].pano : this.currentPano;
  35295. var request = [//必要条件
  35296. Panorama.filters.not(currentPano), Panorama.filters.isPanoAligned(), Panorama.filters.isNeighbourPanoTo(currentPano), Panorama.filters.inPanoDirection(currentPano.position, direction, PlayerDirectionZ)];
  35297. var list = [//决胜项目
  35298. Panorama.scoreFunctions.distanceSquared(currentPano), Panorama.scoreFunctions[o](currentPano.position, direction)];
  35299. /* if (editSpot.setSpotPos){
  35300. if(editSpot.editType == "tag" || editSpot.editType == "measure"){
  35301. request.push(function(pano){
  35302. return pano.assistPano != editSpot.spotPosInfo.panoB && pano != editSpot.spotPosInfo.panoB;//不允许走回到和右侧相同的位置
  35303. })
  35304. }else if(editSpot.editType == "designWall"){
  35305. request.push(function(pano){
  35306. return pano != editSpot.spotPosInfo.panoB//不允许走回到和右侧相同的位置
  35307. })
  35308. }
  35309. } */
  35310. //performance.mark('rankedPano-start')
  35311. this.model.panos.findRankedByScore(t, request, list, panoSet);
  35312. /* performance.mark('rankedPano-end')
  35313. let measure = performance.measure('rankedPano','rankedPano-start','rankedPano-end');
  35314. console.log('rankedPano', measure.duration.toFixed(4)) */
  35315. this.cachedPanoCandidates = panoSet.candidates;
  35316. return panoSet.pano;
  35317. };
  35318. }();
  35319. _this.bump = function (direction) {
  35320. var _this13 = this;
  35321. if (this.mode === Viewmode$1.PANORAMA && !this.flying && !this.isWarping()) {
  35322. var t,
  35323. i,
  35324. n,
  35325. r = settings$3.transition,
  35326. o = (r.flytimeMaxDistanceThreshold * r.flytimeDistanceMultiplier + r.flyTime) / 10,
  35327. a = this.camera.getWorldDirection(new THREE.Vector3()).dot(direction),
  35328. s = Math.abs(a) > 0.5;
  35329. if (s) t = function () {
  35330. transitions$1.start(lerp.property(this.cameraControls.cameras[Viewmode$1.PANORAMA], 'zoom', a > 0 ? 1.04 : 0.96), o, i, 0, easing.easeInOutSine, 'bumpZStart');
  35331. }.bind(this), i = function () {
  35332. transitions$1.start(lerp.property(this.cameraControls.cameras[Viewmode$1.PANORAMA], 'zoom', 1), 3 * o, n, 0, easing.easeInOutSine, 'bumpZRelax');
  35333. }.bind(this);else {
  35334. var l = this.camera.position.clone(),
  35335. c = direction.clone();
  35336. this.raycaster.set(l, c);
  35337. var h = this.model.floors.reduce(function (e, t) {
  35338. return e.concat(t.collider.children);
  35339. }, []),
  35340. d = this.raycaster.intersectObjects(h),
  35341. p = d.length > 0 ? d[0].distance / 25 : 0.04,
  35342. g = l.clone().add(c.multiplyScalar(p));
  35343. t = function () {
  35344. transitions$1.start(lerp.vector(this.cameraControls.cameras[Viewmode$1.PANORAMA].position, g), o, i, 0, easing.easeInOutSine, 'bumpTStart');
  35345. }.bind(this), i = function () {
  35346. transitions$1.start(lerp.vector(this.cameraControls.cameras[Viewmode$1.PANORAMA].position, l), 5 * o, n, 0, easing.easeInOutSine, 'bumpTRelax');
  35347. }.bind(this);
  35348. }
  35349. n = function n() {
  35350. if (_this13.mode == 'panorama') {
  35351. //add
  35352. _this13.flying = !1;
  35353. _this13.emit(PlayerEvents.FlyingEnded, {
  35354. /* targetPosition: this.position, currentPosition: this.position, */
  35355. targetPano: _this13.currentPano,
  35356. currentPano: _this13.currentPano
  35357. }); //add
  35358. }
  35359. /* if (this.waitFlytoItemFuc) {
  35360. //手动加的函数
  35361. var cf = this.waitFlytoItemFuc;
  35362. this.waitFlytoItemFuc = null;//因为可能在执行afterCModeFuc时需要再添加afterCModeFuc所以要置空的话提前
  35363. cf();
  35364. }
  35365. //直接使用
  35366. player.once('flying.ended',()=>{ })
  35367. */
  35368. };
  35369. this.flying = !0, t();
  35370. }
  35371. };
  35372. _this.changeFloor = function (e) {
  35373. if (!this.is360View(this.mode, this.currentPano)) {
  35374. if (this.mode === Viewmode$1.PANORAMA) {
  35375. var t = this.history.reversePano(e);
  35376. if (t) {
  35377. this.flyToPano({
  35378. pano: t
  35379. });
  35380. } else {
  35381. var pano = this.getFloorPanoByScore(e);
  35382. if (pano) {
  35383. this.cachedPanoCandidates = e.candidates;
  35384. this.history.push(t, this.currentPano);
  35385. this.flyToPano({
  35386. pano
  35387. });
  35388. }
  35389. } // t && t.isAligned() ? this.flyToPano({
  35390. // pano: t
  35391. // }) : this.changeFloorByScore(e)
  35392. } else {
  35393. this.model.setFloor(this.model.nextFloor(e) || this.model.currentFloor);
  35394. }
  35395. }
  35396. };
  35397. _this.getFloorPanoByScore = function () {
  35398. var e = {
  35399. pano: null,
  35400. candidates: []
  35401. };
  35402. return function (t, floor) {
  35403. var i = floor || this.model.nextFloor(t);
  35404. return i ? (this.model.panos.lowestByScore([Panorama.filters.atFloor(i), Panorama.filters.isPanoAligned(), function (pano) {
  35405. return pano.hasNeighbor();
  35406. }], [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) :
  35407. /* void (e.pano
  35408. ? ((this.cachedPanoCandidates = e.candidates),
  35409. this.history.push(t, this.currentPano),
  35410. this.flyToPano({
  35411. pano: e.pano
  35412. }))
  35413. : logger.warn('No pano found on selected floor, not moving there.')))*/
  35414. void logger$1.debug('player.changeFloor(' + t + '): no such floor');
  35415. };
  35416. }();
  35417. _this.gotoFloor = function (e) {
  35418. var t = e - this.model.currentFloor.floorIndex;
  35419. this.changeFloor(t);
  35420. };
  35421. _this.getDirection = function (e) {
  35422. return e = e ? e : new THREE.Vector3().copy(Vectors$1.FORWARD), e.applyQuaternion(this.camera.quaternion);
  35423. };
  35424. _this.flyToNewMode = function (newModeInfo, deferred) {
  35425. var _this14 = this;
  35426. newModeInfo = newModeInfo || {};
  35427. var mode = newModeInfo.mode,
  35428. pano = newModeInfo.pano,
  35429. duration = newModeInfo.duration;
  35430. newModeInfo.warpDest;
  35431. var callback = newModeInfo.callback;
  35432. newModeInfo.force;
  35433. var quaternion = newModeInfo.quaternion,
  35434. target = newModeInfo.target,
  35435. //add
  35436. position = newModeInfo.position,
  35437. //add
  35438. currentScale = newModeInfo.currentScale,
  35439. //add
  35440. floor = newModeInfo.floor,
  35441. //add
  35442. fitBoundSize = newModeInfo.fitBoundSize;
  35443. deferred = deferred || Deferred$1();
  35444. if (this.isWarping()) {
  35445. logger$1.warn('Player.flyToNewMode() -> Cannot fly when warping');
  35446. callback && callback(!1);
  35447. return deferred.reject('Cannot change mode during tour transition');
  35448. }
  35449. if (this.mode === Viewmode$1.TRANSITIONING) {
  35450. callback && callback(!1);
  35451. return deferred.reject('Cannot change mode during mode transition');
  35452. }
  35453. if (mode === this.mode) {
  35454. //return callback && callback(!1), deferred.reject('Already in ' + mode + ' mode')
  35455. callback && callback(!1);
  35456. deferred.resolve();
  35457. return deferred;
  35458. } // 进入PANORAMA, 要在下载panotiles前先清掉正在加载的3dtiles
  35459. if (mode == Viewmode$1.PANORAMA && this.model._3dTilesRuntime) {
  35460. this.model._3dTilesRuntime.pauseTilesetUpdate(true);
  35461. this.model._3dTilesRuntime.clearLoadingTiles();
  35462. }
  35463. logger$1.debug('Switching mode to ' + mode);
  35464. var successCallbackFunc = function () {
  35465. common$1.delayOneFrame(function () {
  35466. this.flyToNewMode(newModeInfo, deferred);
  35467. }.bind(this));
  35468. }.bind(this);
  35469. if (pano && this.checkAndWaitForPanoLoad(pano, 'low', 'low', this.basePanoSize, successCallbackFunc)) {
  35470. //'low', 'low'
  35471. return deferred.promise();
  35472. }
  35473. if (!this.model.mesh3dTilesLoaded && !this.model.meshTexturesLoaded && this.isOutsideMode(mode)) {
  35474. logger$1.info('Waiting for model 3dTiles or damTextures to be loaded before going out to dollhouse');
  35475. this.model.waitForLoad(this.model, function () {
  35476. return false;
  35477. }.bind(this));
  35478. successCallbackFunc();
  35479. return deferred.promise();
  35480. }
  35481. this.history.invalidate(); //this.updateLastView();
  35482. var currentMode = this.mode;
  35483. var currentCamera = this.cameraControls.cameras[mode];
  35484. var switchingParams = common$1.deepExtend({}, settings$3[mode], settings$3[currentMode + '-' + mode]); //许钟文------------
  35485. this.modeTran = this.mode + '-' + mode; //------------------
  35486. var transitionTime = switchingParams.transitionTime;
  35487. if (void 0 !== duration) {
  35488. transitionTime = duration;
  35489. }
  35490. this.emit(PlayerEvents.ModeChanging, currentMode, mode, pano, transitionTime);
  35491. pano && (this.currentPano = pano);
  35492. transitions$1.cancelById(settings$3.freeze.LookTransition);
  35493. transitions$1.cancelById(this.$app.resource.num + settings$3.freeze.FlyToPano);
  35494. if (mode === Viewmode$1.PANORAMA) {
  35495. this.$app.core.get('PanoRenderer').switchPanoQuality(pano, {
  35496. size: 2048
  35497. });
  35498. this.emit(PlayerEvents.PanoChosen, pano, pano);
  35499. setTimeout(function () {
  35500. pano.floor.enter(mode);
  35501. }.bind(this), transitionTime / 2);
  35502. this.path.fadeOutCpm(settings$3.path.fadeOutTime); //当前站点logo消失
  35503. } else {
  35504. this.path.placeCpm(); //设置当前站点logo位置
  35505. this.path.fadeInCpm(settings$3.path.fadeInTime); //当前站点logo出现
  35506. //console.log('floor',floor)
  35507. if (floor != void 0) {
  35508. if (floor == 'all' && mode != Viewmode$1.FLOORPLAN) this.model.toggleAllFloors(!0); //默认floorplan没有all的可能
  35509. else if (typeof floor == 'number') {
  35510. floor = this.model.floors.list[floor];
  35511. floor.enter(mode);
  35512. }
  35513. } else if (mode === Viewmode$1.FLOORPLAN) {
  35514. this.model.currentFloor.enter(mode);
  35515. } else if (mode == Viewmode$1.DOLLHOUSE) {
  35516. this.model.toggleAllFloors(!0);
  35517. }
  35518. }
  35519. this.switchCameraMode(mode, quaternion, target, position, currentScale, {
  35520. fitBoundSize
  35521. });
  35522. var currentPosition = new THREE.Vector3().copy(this.position);
  35523. var currentPano = this.currentPano,
  35524. playerPosition = this.position.clone();
  35525. this.emit(PlayerEvents.FlyingStarted, {
  35526. mode: newModeInfo.mode,
  35527. duration: newModeInfo.duration,
  35528. target: newModeInfo.target,
  35529. position: newModeInfo.position,
  35530. quaternion: newModeInfo.quaternion ? new THREE.Quaternion().set(newModeInfo.quaternion._x, newModeInfo.quaternion._y, newModeInfo.quaternion._z, newModeInfo.quaternion._w) : null,
  35531. zoom: newModeInfo.zoom,
  35532. panoId: newModeInfo.pano ? newModeInfo.pano.id : null,
  35533. lastPanoId: currentPano && currentPano.id,
  35534. type: 'flyToNewMode'
  35535. });
  35536. this.flying = !0;
  35537. var startChange = function startChange() {
  35538. //360全景:
  35539. if (_this14.isOutsideMode(mode) && _this14.is360View(currentMode, currentPano)) {
  35540. //飞出
  35541. switchingParams.blackoutStyle = BlackoutStyle$1.FADEIN;
  35542. transitionTime = settings$3.show360Views.transitionTime;
  35543. switchingParams.transitionTime = transitionTime;
  35544. switchingParams.skyboxOpacity = 0;
  35545. switchingParams.modelAlpha = 1;
  35546. switchingParams.flyOut = true;
  35547. switchingParams.toMode = mode;
  35548. _this14.fade360View(currentCamera, switchingParams);
  35549. } else if (_this14.isOutsideMode(currentMode) && _this14.is360View(mode, pano)) {
  35550. //飞入
  35551. _this14.mode = mode;
  35552. switchingParams.pano = pano; //this.currentPano
  35553. switchingParams.blackoutStyle = BlackoutStyle$1.END;
  35554. transitionTime = settings$3.show360Views.transitionTime;
  35555. switchingParams.transitionTime = transitionTime;
  35556. switchingParams.flyIn = true;
  35557. _this14.fade360View(currentCamera, switchingParams, _this14.afterchangeMode);
  35558. } else {
  35559. //普通情况:
  35560. transitions$1.start(lerp.property(_this14.model, 'alpha', switchingParams.modelAlpha, null), transitionTime * switchingParams.modelAlphaLength, null, switchingParams.modelAlphaDelay, null, settings$3.freeze.FlyToNewMode);
  35561. transitions$1.start(lerp.vector(_this14.position, currentCamera.position, function (v, n) {
  35562. _this14.flyInOutProgress = n; //add
  35563. }), transitionTime, null, settings$3.flydown.movementDelay, easing[settings$3.flydown.movementEasing], null, settings$3.freeze.FlyToNewMode);
  35564. transitions$1.start(lerp.quaternion(_this14.quaternion, currentCamera.quaternion), transitionTime * switchingParams.rotationDuration, null, switchingParams.rotationDelay, easing[settings$3.flydown.rotationEasing], null, settings$3.freeze.FlyToNewMode);
  35565. transitions$1.start(lerp.matrix4(_this14.camera.projectionMatrix, currentCamera.projectionMatrix), transitionTime * switchingParams.cameraMatrixDuration, null, switchingParams.cameraMatrixDelay, switchingParams.cameraMatrixEase, null, settings$3.freeze.FlyToNewMode);
  35566. transitions$1.start(function (n) {
  35567. _this14.camera.projectionMatrixInverse.copy(_this14.camera.projectionMatrix).invert();
  35568. }, transitionTime * switchingParams.cameraMatrixDuration, null, switchingParams.cameraMatrixDelay, switchingParams.cameraMatrixEase, null, settings$3.freeze.FlyToNewMode);
  35569. transitions$1.start(lerp.uniform(_this14.model.skybox, 'opacity', switchingParams.skyboxOpacity), transitionTime * switchingParams.skyboxOpacityLength, null, switchingParams.skyboxOpacityDelay, null, settings$3.freeze.FlyToNewMode);
  35570. transitions$1.start(lerp.property(_this14.reticule.material.uniforms.opacity, 'value', 0), transitionTime, null, settings$3.freeze.FlyToNewMode);
  35571. }
  35572. transitions$1.setTimeout(function () {
  35573. this.flying = !1;
  35574. if (currentMode === Viewmode$1.PANORAMA && mode !== Viewmode$1.PANORAMA) {
  35575. this.currentPano.exit();
  35576. } else if (currentMode !== Viewmode$1.PANORAMA && mode === Viewmode$1.PANORAMA) {
  35577. this.currentPano !== currentPano && currentPano.exit();
  35578. this.currentPano.enter();
  35579. }
  35580. currentMode === Viewmode$1.DOLLHOUSE && this.cameraControls.controls[Viewmode$1.DOLLHOUSE].resetRanges();
  35581. this.mode = mode;
  35582. this.afterChangeMode(currentMode, mode); //this.emit(PlayerEvents.FlyingEnded, currentPosition, playerPosition, this.currentPano, currentPano)
  35583. this.emit(PlayerEvents.FlyingEnded, {
  35584. targetPosition: currentPosition,
  35585. currentPosition: playerPosition,
  35586. targetPano: this.currentPano,
  35587. currentPano: currentPano
  35588. });
  35589. callback && callback();
  35590. deferred.resolve();
  35591. }.bind(_this14), transitionTime, settings$3.freeze.FlyToNewMode);
  35592. _this14.mode = Viewmode$1.TRANSITIONING;
  35593. };
  35594. if (this.mode == 'panorama' && !(this.isOutsideMode(mode) && this.is360View(currentMode, currentPano))) {
  35595. this.$app.core.get('SceneRenderer').once(SceneRendererEvents.AfterRender, function () {
  35596. //console.log('等待时间', Date.now() - startTime)
  35597. startChange(); //300block 的需要近1秒才能飞出,最好加个提示 如KJ-t-ThxGwmC91Z0
  35598. });
  35599. } else {
  35600. startChange();
  35601. }
  35602. /* ----若要显示loading条换这块代码 一点点变换modelAlpha
  35603. let startIndex = 0, curCount, maxUpdateBlock = 100, len=this.model.chunks.length
  35604. let startTime = Date.now()
  35605. let update = {
  35606. update:()=>{
  35607. curCount = 0
  35608. for(let i=startIndex; i<len;i++){
  35609. let mat = this.model.chunks[i].materialInside
  35610. let image = mat.uniforms.map.value.image
  35611. let blockCount = image.width * image.height / (512*512);
  35612. if(!('useModelMap' in mat.defines)){
  35613. mat.defines.useModelMap = '';
  35614. mat.needsUpdate = true
  35615. }
  35616. startIndex++;
  35617. console.log(startIndex)
  35618. curCount = curCount + blockCount
  35619. if(curCount > maxUpdateBlock)return
  35620. }
  35621. console.log('cost', Date.now()-startTime)
  35622. this.$app.core.get('SceneRenderer').removeComponent(update)
  35623. startChange()
  35624. }
  35625. }
  35626. this.$app.core.get('SceneRenderer').addComponent(update)
  35627. */
  35628. this.beforeChangeMode(currentMode, mode, pano, transitionTime);
  35629. return deferred.promise();
  35630. };
  35631. _this.setSize = function (width, height) {
  35632. var aspect = width / height;
  35633. this.baseFov = cameraLight.clampVFOV(settings$3.insideFOV, settings$3.insideFOVMax, width, height);
  35634. var fov = cameraLight.getHFOVFromVFOV(settings$3.insideFOV, width, height);
  35635. if (fov > settings$3.insideFOVMax) {
  35636. this.baseFov = cameraLight.getVFOVFromHFOV(settings$3.insideFOVMax, width, height);
  35637. } else {
  35638. this.baseFov = settings$3.insideFOV;
  35639. }
  35640. for (var cameraType in this.cameraControls.cameras) {
  35641. var camera = this.cameraControls.cameras[cameraType];
  35642. camera.fov = camera.staticFov ? camera.staticFov : this.baseFov * (1 / this.zoomLevel); //许钟文 加camera.staticFov
  35643. camera.updateAspect(aspect);
  35644. }
  35645. this.emit('setSize', width, height);
  35646. };
  35647. _this.toJSON = function () {
  35648. var e = {};
  35649. if (this.cameraControls.activeControl) {
  35650. e = this.cameraControls.activeControl.toJSON();
  35651. e.camera_mode = Viewmode$1.toInt(this.mode);
  35652. if (this.isOutsideMode()) {
  35653. if (this.model.allFloorsVisible) {
  35654. e.floor_visibility = [];
  35655. } else {
  35656. e.floor_visibility = this.model.floors.list.map(function (e) {
  35657. return e.hidden ? 0 : 1;
  35658. });
  35659. }
  35660. } else if (Viewmode$1.PANORAMA) {
  35661. e.scan_id = this.currentPano.id;
  35662. } // this.isOutsideMode() ? this.model.allFloorsVisible ? e.floor_visibility = [] : e.floor_visibility = this.model.floors.list.map(function(e) {
  35663. // return e.hidden ? 0 : 1
  35664. // }) : Viewmode.PANORAMA && (e.scan_id = this.currentPano.id);
  35665. return e;
  35666. } else {
  35667. return e;
  35668. } // return this.cameraControls.activeControl ? (e = this.cameraControls.activeControl.toJSON(),
  35669. // e.camera_mode = Viewmode.toInt(this.mode),
  35670. // this.isOutsideMode() ? this.model.allFloorsVisible ? e.floor_visibility = [] : e.floor_visibility = this.model.floors.list.map(function(e) {
  35671. // return e.hidden ? 0 : 1
  35672. // }) : Viewmode.PANORAMA && (e.scan_id = this.currentPano.id),
  35673. // e) : e
  35674. };
  35675. _this.zoomBy = function (e) {
  35676. this.zoomTo(this.zoomLevel * e);
  35677. };
  35678. _this.zoomIn = function () {
  35679. this.zoomBy(1 + this.zoomSpeed);
  35680. };
  35681. _this.zoomOut = function () {
  35682. this.zoomBy(1 - this.zoomSpeed);
  35683. };
  35684. _this.zoomTo = function (zoomLevel, flag) {
  35685. if (flag || settings$3.zoom.enabled && this.mode === Viewmode$1.PANORAMA && this.zoomEnabled) {
  35686. zoomLevel < settings$3.zoom.min && (zoomLevel = settings$3.zoom.min);
  35687. zoomLevel > settings$3.zoom.max && (zoomLevel = settings$3.zoom.max);
  35688. if (zoomLevel > this.zoomLevel) {
  35689. this.emit(ZoomEvents.ZoomIn);
  35690. zoomLevel === settings$3.zoom.max && this.emit(ZoomEvents.ZoomMax);
  35691. } else if (zoomLevel < this.zoomLevel) {
  35692. this.emit(ZoomEvents.ZoomOut);
  35693. zoomLevel === settings$3.zoom.min && this.emit(ZoomEvents.ZoomMin);
  35694. }
  35695. if (this.cameraControls.activeControl) {
  35696. var camera = this.cameraControls.activeControl.camera;
  35697. this.zoomLevel = zoomLevel;
  35698. camera.fov = this.baseFov * (1 / this.zoomLevel);
  35699. camera.updateProjectionMatrix();
  35700. this.zoomFov = camera.fov;
  35701. this.emitZoom(); //this.emit('zoomTo', zoomLevel)
  35702. }
  35703. }
  35704. };
  35705. _this.zoomDefault = function () {
  35706. this.zoomTo(1, !0);
  35707. };
  35708. _this.smoothZoomToDefault = function (e, t) {
  35709. var i,
  35710. n = this.zoomLevel,
  35711. r = function (e) {
  35712. e > 1 && (e = 1), i = n * (1 - e) + e, this.zoomTo(i, !0);
  35713. }.bind(this),
  35714. o = function () {
  35715. this.zoomDefault(), t && window.setTimeout(t, 50);
  35716. }.bind(this);
  35717. transitions$1.start(r, e, o, null, 0, easing[settings$3.transition.blendEasing]);
  35718. };
  35719. _this.smoothZoomFovTo = function (fov, dur, callback) {
  35720. //add
  35721. var aimLevel = this.baseFov / fov;
  35722. this.smoothZoomLevelTo(aimLevel, dur, callback);
  35723. };
  35724. _this.smoothZoomLevelTo = function (level, dur, callback) {
  35725. //add
  35726. if (this.zoomLevel == level) return;
  35727. var oldLevel = this.zoomLevel;
  35728. var currentLevel;
  35729. var fun = function (e) {
  35730. e > 1 && (e = 1), currentLevel = oldLevel * (1 - e) + e * level, this.zoomTo(currentLevel, !0);
  35731. }.bind(this);
  35732. transitions$1.start(fun, dur, callback, null, 0, easing[settings$3.transition.blendEasing]);
  35733. };
  35734. _this.updateZoomPano = function () {
  35735. var _this15 = this;
  35736. var qualityManager = this.$app.core.get('QualityManager');
  35737. var panoRenderer = this.$app.core.get('PanoRenderer');
  35738. var currentPano = this.currentPano;
  35739. if (!panoRenderer.zoomPanoRenderingDisabled && this.mode === Viewmode$1.PANORAMA && currentPano.tiled) {
  35740. //xzw add tiled
  35741. if (currentPano) {
  35742. var threshold4k = 1.8;
  35743. var activationThreshold = qualityManager.navTileClass == '2k' && qualityManager.tileClass == '4k' ? threshold4k : settings$3.zoom.activationThreshold; //1.1
  35744. var t = settings$3.highestQualityTile || this.zoomLevel > activationThreshold,
  35745. i = this.flying && this.nextPano && this.nextPano !== this.currentPano,
  35746. n = !i && !this.isWarping(),
  35747. r = t && n;
  35748. this.$app.core.get('TileDownloader').tilePrioritizer.setZoomingActive(r);
  35749. panoRenderer.setZoomingActive(r, currentPano, !0);
  35750. var o = function (pano, zoomedFlag) {
  35751. panoRenderer.resetRenderStatus(pano.id, !1, !0, qualityManager.getMaxNavPanoSize());
  35752. panoRenderer.clearAllQueuedUploadsForPano(pano.id);
  35753. panoRenderer.renderPanoTiles(pano.id, null, !1, !1);
  35754. pano.setZoomed(zoomedFlag);
  35755. }.bind(this);
  35756. if (r && (!currentPano.zoomed || qualityManager.zoomLevelResolution && qualityManager.zoomLevelResolution != '4k')) {
  35757. currentPano.zoomed || o(currentPano, !0);
  35758. if (qualityManager.navTileClass == '1k' && qualityManager.tileClass != '1k' && this.zoomLevel < 2) {
  35759. panoRenderer.enableHighQuality(function () {
  35760. //开启2k
  35761. if (qualityManager.tileClass != '4k') o(currentPano, !0);
  35762. }.bind(this));
  35763. } else {
  35764. panoRenderer.enableUltraHighQualityMode(function () {
  35765. //开启4k getMaxZoomPanoSize
  35766. qualityManager.useUltraHighResolutionPanos && !settings$3.zoom.overridemax && (settings$3.zoom.max = settings$3.ultraHighQualityMaxZoom);
  35767. o(currentPano, !0);
  35768. }.bind(this));
  35769. }
  35770. } else {
  35771. !t && currentPano.zoomed && o(currentPano, !1);
  35772. }
  35773. if (r && qualityManager.navTileClass == '1k' && qualityManager.tileClass == '4k') {
  35774. //目前只有手机端navTileClass == '1k'
  35775. var change = function change(zoomedFlag) {
  35776. qualityManager.updateMaximums(); //更新maxZoomPanoSize
  35777. panoRenderer.setupZoomRenderTarget(); //更新renderTarget
  35778. //currentPano.setZoomed(t);//更新uniforms贴图
  35779. if (qualityManager.zoomLevelResolution == '4k') {
  35780. _this15.model.showHighMap();
  35781. } else {
  35782. _this15.model.hideHighMap();
  35783. }
  35784. };
  35785. qualityManager.zoomLevelResolution = this.zoomLevel >= threshold4k ? '4k' : this.zoomLevel > settings$3.zoom.activationThreshold ? '2k' : '1k';
  35786. if (this.oldZoomLevel < threshold4k && this.zoomLevel >= threshold4k) {
  35787. //1k/2k-4k
  35788. change();
  35789. o(currentPano, t);
  35790. } else if (this.oldZoomLevel <= settings$3.zoom.activationThreshold && this.zoomLevel > settings$3.zoom.activationThreshold) {
  35791. //1k-2k
  35792. change();
  35793. } else if (this.oldZoomLevel > threshold4k && this.zoomLevel <= threshold4k) {
  35794. //4k-2k/1k
  35795. change();
  35796. o(currentPano, t);
  35797. } else if (this.oldZoomLevel > settings$3.zoom.activationThreshold && this.zoomLevel <= settings$3.zoom.activationThreshold) {
  35798. //2k-1k
  35799. change();
  35800. }
  35801. this.oldZoomLevel = this.zoomLevel;
  35802. }
  35803. /* if (r && !currentPano.zoomed) {
  35804. o(currentPano, !0);
  35805. panoRenderer.enableUltraHighQualityMode(function() {//开启4k getMaxZoomPanoSize
  35806. qualityManager.useUltraHighResolutionPanos && !settings.zoom.overridemax && (settings.zoom.max = settings.ultraHighQualityMaxZoom);
  35807. o(currentPano, !0)
  35808. }.bind(this));
  35809. } else {
  35810. !t && currentPano.zoomed && o(currentPano, !1);
  35811. } */
  35812. }
  35813. }
  35814. };
  35815. _this.hasChanged = function (e) {
  35816. if (!this.previousState) {
  35817. this.previousState = {
  35818. allFloorsVisible: this.model.allFloorsVisible,
  35819. position: this.position.clone(),
  35820. quaternion: this.quaternion.clone(),
  35821. mouse: this.mouse.clone(),
  35822. //labelScaleFactor: this.getLabelScaleFactor(),
  35823. currentFloor: this.model.currentFloor,
  35824. projectionMatrix: this.camera.projectionMatrix.clone(),
  35825. worldMatrix: this.camera.matrixWorld.clone(),
  35826. mode: this.mode,
  35827. modelPosition: this.model.position.clone(),
  35828. modelCenter: this.model.center.clone(),
  35829. zoomLevel: this.zoomLevel
  35830. };
  35831. e.cameraChanged = true, (e.cameraChanged2 = true, e.cameraChanged3 = true);
  35832. return !0;
  35833. } //许钟文改 分成相机是否改变cameraChanged 和其他
  35834. 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);
  35835. e.vrHandlerMoved = this.VR && this.VR.webxr.entered && this.VR.webxr.handlerMoved(); //add
  35836. var t = a && this.mouse.equals(this.previousState.mouse) && !e.vrHandlerMoved && this.model.allFloorsVisible === this.previousState.allFloorsVisible
  35837. /* && this.getLabelScaleFactor() === this.previousState.labelScaleFactor */
  35838. && this.model.currentFloor === this.previousState.currentFloor && null === this.nextPano;
  35839. e.cameraChanged = !a || e.cameraProjectionChanged;
  35840. 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;
  35841. if (!t) {
  35842. //主要判断相机是否旋转
  35843. e.cameraChanged2 = e.cameraProjectionChanged || !MathLight.closeTo(this.quaternion, this.previousState.quaternion, 6) || !MathLight.closeTo(this.position, this.previousState.position, 5);
  35844. e.cameraChanged3 = e.cameraProjectionChanged || !MathLight.closeTo(this.quaternion, this.previousState.quaternion, 3) || !MathLight.closeTo(this.position, this.previousState.position, 3);
  35845. } else {
  35846. e.cameraChanged2 = false;
  35847. e.cameraChanged3 = false;
  35848. }
  35849. 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)
  35850. return !t;
  35851. };
  35852. _this.getToMode = function () {
  35853. return this.modeTran.split('-')[1];
  35854. };
  35855. _this.flyToMode = function (mode, f1, duration) {
  35856. var _this16 = this;
  35857. if (this.mode == mode) {
  35858. f1 && f1();
  35859. } else {
  35860. if (this.mode == 'transitioning') {
  35861. //先飞完然后再执行一遍
  35862. this.once(PlayerEvents.FlyingEnded, function () {
  35863. _this16.flyToMode(mode, f1, duration);
  35864. });
  35865. } else {
  35866. f1 && this.once(PlayerEvents.FlyingEnded, function () {
  35867. f1();
  35868. });
  35869. try {
  35870. //在场景刚开始加载 control还没建好时这句可能会报错所以用try。 不用callback而用 afterCModeFuc也是这个原因,因为会有别的函数可以飞入然后执行它
  35871. this.flyToNewMode({
  35872. mode: mode,
  35873. pano: mode == 'panorama' && this.currentPano,
  35874. duration: duration
  35875. });
  35876. } catch (e) {
  35877. console.log('flyToMode遇到问题?', e);
  35878. }
  35879. }
  35880. }
  35881. };
  35882. _this.vrModeChange = function () {
  35883. if (settings$3.vrEnabled) {
  35884. //关闭
  35885. settings$3.vrEnabled = false;
  35886. /* if (!window.VRScreenNotFull) {
  35887. browser.exitFullscreen()
  35888. } */
  35889. } else {
  35890. //开启:
  35891. settings$3.vrEnabled = true;
  35892. /* if (!window.VRScreenNotFull) {
  35893. browser.requestFullscreen(document.body)
  35894. } */
  35895. }
  35896. };
  35897. _this.focusPoint = function () {
  35898. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  35899. console.log('focusPoint');
  35900. if (this.mode == 'floorplan') {
  35901. var modelSize = o.modelSize || new THREE.Vector3(5, 5, 5); //可视范围
  35902. var control = this.cameraControls.controls.floorplan;
  35903. var absoluteScale = control.getDefaultAbsoluteScale(modelSize);
  35904. var currentScale = control.absoluteScale;
  35905. var currentTarget = control.target.clone();
  35906. var lowest = this.model.boundingBox.max.y + constants$4.orthoNear + constants$4.planeHeightShift + 1;
  35907. var aim = o.aim.clone().setY(lowest);
  35908. transitions$1.cancelById(settings$3.freeze.outsideFocus, true);
  35909. transitions$1.start(function (progress) {
  35910. control.absoluteScale = absoluteScale * progress + currentScale * (1 - progress);
  35911. control.target = aim.clone().multiplyScalar(progress).add(currentTarget.clone().multiplyScalar(1 - progress));
  35912. control.camera.position.copy(control.target.clone().add(control.offset)); //维持角度
  35913. }.bind(this), o.dur || 600, null
  35914. /* cancelFuc */
  35915. , 0, easing[settings$3.transition.blendEasing], 'outsideFocus', settings$3.freeze.outsideFocus, null
  35916. /* cancelFuc */
  35917. );
  35918. } else if (this.mode == 'dollhouse') {
  35919. var control = this.cameraControls.controls.dollhouse;
  35920. var radius = o.radius || 10;
  35921. var currentTarget = control.target.clone();
  35922. var dir = control.offset.clone().normalize();
  35923. var currentRadius = control.offset.length();
  35924. transitions$1.cancelById(settings$3.freeze.outsideFocus, true);
  35925. transitions$1.start(function (progress) {
  35926. control.target = o.aim.clone().multiplyScalar(progress).add(currentTarget.clone().multiplyScalar(1 - progress));
  35927. var radius_ = radius * progress + currentRadius * (1 - progress);
  35928. control.camera.position.copy(control.target.clone().add(dir.clone().multiplyScalar(radius_)));
  35929. }.bind(this), o.dur || 600, null
  35930. /* cancelFuc */
  35931. , 0, easing[settings$3.transition.blendEasing], 'outsideFocus', settings$3.freeze.outsideFocus, null
  35932. /* cancelFuc */
  35933. );
  35934. }
  35935. };
  35936. _this.getSnapAngleInfo = function () {
  35937. //得到截图的位置和视角
  35938. var info = {
  35939. metadata: {}
  35940. };
  35941. var q = this.camera.quaternion.clone();
  35942. switch (this.mode) {
  35943. case 'panorama':
  35944. info.metadata.scan_id = this.currentPano.id;
  35945. break;
  35946. case 'floorplan':
  35947. var _this$getSize = this.getSize(),
  35948. clientWidth = _this$getSize.clientWidth,
  35949. clientHeight = _this$getSize.clientHeight;
  35950. q = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(90));
  35951. q.multiply(this.camera.quaternion);
  35952. info.metadata.camera_mode = 1;
  35953. info.metadata.ortho_zoom = math$2.toPrecision(this.cameraControls.activeControl.currentScale / (clientWidth / clientHeight), 4);
  35954. break;
  35955. case 'dollhouse':
  35956. info.metadata.camera_mode = 2;
  35957. break;
  35958. }
  35959. info.metadata.camera_position = this.camera.position.clone();
  35960. info.metadata.camera_quaternion = q;
  35961. info.metadata.lon = this.cameraControls.activeControl.lon; //兼容旧版
  35962. info.metadata.lat = this.cameraControls.activeControl.lat;
  35963. info.sid = '4dkk' + new Date().getTime();
  35964. info.name = '';
  35965. info.mode = this.mode; //暂时需要用到
  35966. return info;
  35967. };
  35968. _this.model = new Model(_this.$app);
  35969. _this.currentPano = null;
  35970. _this.nextPano = null;
  35971. _this.camera = null;
  35972. _this.paused = !1;
  35973. _this.flying = !1;
  35974. _this.sceneIntersectionPlane = null;
  35975. _this.target = new THREE.Vector3();
  35976. _this.mouse = new THREE.Vector3(1.1, 1.1, 0.5);
  35977. _this.mouseAtMouseDown = new THREE.Vector2();
  35978. _this.mouseCouldBeClickToMove = !1;
  35979. _this.mouseLastMoveTime = Date.now();
  35980. _this.mouseDown = !1;
  35981. _this.mouseDownTimer = null;
  35982. _this.couldBeLongTap = !1;
  35983. _this.containsMouse = !1; //!0 //xzw改为false,否则触屏一直是true
  35984. _this.isTouchEvent = !1;
  35985. _this.isPanoHover = !1;
  35986. _this.reticule = new Reticule(_assertThisInitialized(_this));
  35987. _this.panoMarkers = []; //this.spider = new NSpider(this);
  35988. _this.quaternion = new THREE.Quaternion();
  35989. _this.position = new THREE.Vector3(15, 10, 15);
  35990. _this.previousState = null;
  35991. _this.lastInsideView = new View();
  35992. _this.last360View = new View();
  35993. _this.raycaster = new THREE.Raycaster();
  35994. _this.raycaster.params.Line.threshold = 0.01;
  35995. _this.raycaster.params.Line2 = {
  35996. threshold: browser$1.isMobile() ? 100 : 20
  35997. }; //拓宽的lineWidth
  35998. _this.allIntersects = [];
  35999. _this.intersect = null;
  36000. common$1.setCameraLayers(_this.raycaster, ['DEFAULT', 'Tag3d', 'PANOMARKERS', 'SKYBOX', 'MODEL']); //暂时加上DEFAULT //this.raycaster.layers.enable(RenderLayers.PANOMARKERS)
  36001. _this.lastChangeTime = Date.now();
  36002. _this.history = new History$1();
  36003. _this.cameraControls = null; //this.path = null,
  36004. _this.domElement = null;
  36005. _this.cachedPanoCandidates = null;
  36006. _this.basePanoSize = 0;
  36007. _this.standardPanoSize = 0;
  36008. _this.highPanoSize = 0;
  36009. _this.ultraHighPanoSize = 0;
  36010. _this.yaw = 0;
  36011. _this.zoomLevel = 1;
  36012. _this.zooming = 0;
  36013. _this.zoomSpeed = 0.5;
  36014. _this.scrollZoomSpeed = 0.06;
  36015. _this.zoomSpeedAdjust = 0.05;
  36016. _this.defaultZoomIncrement = 0.2;
  36017. _this.baseFov = settings$3.insideFOV;
  36018. _this.zoomFov = _this.baseFov;
  36019. _this.zoomEnabled = !0;
  36020. _this.cornerRulers = []; //标尺
  36021. _this.planLabels = []; //floorplan时的label
  36022. _this.dollLabels = []; //dollhouse时的label
  36023. _this.doorLabels = [];
  36024. _this.defaultRoomLabels = []; //非编辑墙时的
  36025. _this.polygonmarkLabels = []; //多边形标记模块label
  36026. _this.modeTran = '';
  36027. _this.preRenderingEnabled = !1;
  36028. _this.setupCustomProperties(Viewmode$1.PANORAMA);
  36029. _this.zoomStats = new ZoomStats();
  36030. _this.lastFrameChanged = 'level3'; //越高变动越大
  36031. _this.unitConvert = new UoMService();
  36032. /* this.afterCModeFuc = {
  36033. //Flytonewmode后需要执行的
  36034. unique: null, //唯一的,新的会替代旧的,适用于只允许选择其中一项执行的函数
  36035. multi: [], //可多个, 到时候都执行
  36036. } */
  36037. _this.cameraControls = _this.$app.core.get('CameraControls');
  36038. _this.modelManager = _this.$app.core.get('ModelManager'); //this.imagePanos = this.listImagePanos()
  36039. //是否开启(键盘上1,2,3分别对应飞入,飞出dollhouse,飞出floorplan)
  36040. _this.started = false; //xst
  36041. _this._locked = false;
  36042. _this._flying = false;
  36043. _this.clearPanosTaskList(); //持续行走的任务
  36044. _this.setPanoTaskEnable(true);
  36045. _this.viewLinkManager = new ViewLinkManager(_this.$app, _assertThisInitialized(_this));
  36046. _this.paintEditor = new Paint$1(_this.$app, _assertThisInitialized(_this));
  36047. _this.modelSideManager = new ModelSideManager(_assertThisInitialized(_this)); //this.createIntersectLabel()
  36048. _this.miniViewVisible = {};
  36049. /* this.$app.Scene.on('loaded', () => {
  36050. setTimeout(this.setMiniViewType.bind(this)) //等待dom在minMap中建完
  36051. }) */
  36052. _this.$app.Scene.on('miniDomCreated', _this.setMiniViewType.bind(_assertThisInitialized(_this)));
  36053. _this.on('mode.changed', function () {
  36054. _this.setMiniViewVisi(_this.mode == 'panorama', 'flyOut');
  36055. });
  36056. _this.on('vrStateChanged', function () {
  36057. var splitView = settings$3.vrEnabled && settings$3.vrSplitScreen;
  36058. _this.setMiniViewVisi(!splitView, 'vrSplitScreen');
  36059. });
  36060. return _this;
  36061. }
  36062. _createClass(Player, [{
  36063. key: "setMiniViewType",
  36064. value: function setMiniViewType() {
  36065. var _this17 = this;
  36066. var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.$app.store.getValue('metadata').controls.showMap;
  36067. var bySelect = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  36068. //xzw
  36069. console.warn('setMiniViewType', type, ['无', '平面图', '三维模型', '地图'][type]); //0:无, 1平面图 2三维模型 3地图
  36070. try {
  36071. if (bySelect) {
  36072. //是前端传过来的在编辑页面选择的类型,
  36073. this.miniViewTypeShould = type;
  36074. common$1.updateVisible(this.miniViewVisible, 'bySelect', type > 0);
  36075. if (!this.miniViewVisible.visible) {
  36076. type = 0;
  36077. console.warn('setMiniViewType final', type, ['无', '平面图', '三维模型', '地图'][type]);
  36078. }
  36079. }
  36080. this.miniViewType = type;
  36081. var dom = document.querySelector('div[xui_min_map]');
  36082. if (!dom) return;
  36083. if (type == 0) {
  36084. dom.style.display = 'none';
  36085. setTimeout(function () {
  36086. //fix: mode != 'panorama' 时 前端那边清屏恢复时会显示,这里延时隐藏下
  36087. if (_this17.miniViewType == 0
  36088. /* && player.mode != 'panorama' */
  36089. ) {
  36090. dom.style.display = 'none';
  36091. }
  36092. });
  36093. } else {
  36094. dom.style.display = ''; //先显示,用于初始化,不过之后可能又隐藏
  36095. }
  36096. this.emit('setMiniViewType', type);
  36097. this.$app.core.get('SceneRenderer').setMiniDollDisplay(type == 2);
  36098. if (type == 3) {
  36099. this.mapViewer || (this.mapViewer = new MapViewer(dom, this));
  36100. this.mapViewer.show();
  36101. } else {
  36102. var _this$mapViewer;
  36103. (_this$mapViewer = this.mapViewer) === null || _this$mapViewer === void 0 ? void 0 : _this$mapViewer.hide();
  36104. }
  36105. } catch (e) {
  36106. console.error(e);
  36107. }
  36108. }
  36109. }, {
  36110. key: "setMiniViewVisi",
  36111. value: function setMiniViewVisi(visible, reason) {
  36112. //设置迷你视角是否暂时隐藏
  36113. common$1.updateVisible(this.miniViewVisible, reason, visible);
  36114. this.setMiniViewType(this.miniViewVisible.visible ? this.miniViewTypeShould : 0, false); //这和原本选择的type只要有一个不显示就不显示
  36115. }
  36116. }, {
  36117. key: "init",
  36118. value: function init() {
  36119. this.domElement = this.$app.dom.querySelector('.player');
  36120. this.camera = this.$app.core.get('SceneRenderer').camera;
  36121. this.path = new ShowPath(this.director, this, this.cameraControls);
  36122. this.basePanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.BASE);
  36123. this.standardPanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.STANDARD);
  36124. this.highPanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.HIGH);
  36125. this.ultraHighPanoSize = this.$app.core.get('QualityManager').getPanoSize(PanoSizeClass.ULTRAHIGH);
  36126. this.$app.core.get('TileDownloader').processPriorityQueue = !1;
  36127. this.$app.core.get('TileDownloader').tilePrioritizer = new TilePrioritizer(this.$app.core.get('QualityManager'), this.basePanoSize, this.standardPanoSize, this.highPanoSize, this.ultraHighPanoSize);
  36128. this.bindEvents(this.domElement);
  36129. this.updateModel();
  36130. CursorDeal.init(this);
  36131. LineMaterial.init(this.$app);
  36132. this.model.createTranControl(this);
  36133. if (browser$1.urlHasValue('map')) {
  36134. this.mapViewer = new MapViewer(null, this);
  36135. }
  36136. }
  36137. }, {
  36138. key: "locked",
  36139. get: function get() {
  36140. return this._locked;
  36141. },
  36142. set: function set(value) {
  36143. // customer时marker隐藏
  36144. // let role = location.search
  36145. // .replace('?', '')
  36146. // .split('&')
  36147. // .find(arg => arg.split('=')[0] == 'role')
  36148. // role = role && role.split('=')[1]
  36149. // this.model.panos.forEach(item => {
  36150. // item.marker && (item.marker.visible = role == 'customer' ? false : !value)
  36151. // })
  36152. this._locked = value;
  36153. if (this._locked) {
  36154. this.model.fadePanoMarkers(0, 0, {
  36155. vrCustomer: true,
  36156. hideVideoFlag: true
  36157. });
  36158. } else if (!this.$app.VRScreenSYNC) {
  36159. this.model.fadePanoMarkers(1, 0, {
  36160. vrCustomer: true,
  36161. hideVideoFlag: false
  36162. });
  36163. }
  36164. if (value) {
  36165. this.clearPanosTaskList(); //清空
  36166. }
  36167. }
  36168. }, {
  36169. key: "flying",
  36170. get: function get() {
  36171. return this._flying;
  36172. },
  36173. set: function set(v) {
  36174. this._flying = v; //console.log('flying',v)
  36175. }
  36176. }, {
  36177. key: "getIntersectAtChunk",
  36178. value: function getIntersectAtChunk(intersect, when, needNormal) {
  36179. //有时候看起来没mesh但有,只是被裁剪了
  36180. if ((intersect === null || intersect === void 0 ? void 0 : intersect.object.name) == 'collider') return intersect; //add
  36181. if (when == 'drag') {
  36182. //拖拽时player没getIntersect这里获取下
  36183. var _chunkPick = this.getMouseIntersect(null, this.getColliders({
  36184. noSkybox: true,
  36185. checkChunk: true
  36186. }));
  36187. return _chunkPick;
  36188. }
  36189. var chunkPick = this.allIntersects.find(function (e) {
  36190. return e.object.name == 'collider';
  36191. }); //在chunk上的intersect
  36192. if (chunkPick && !chunkPick.normal) this.intersectAddNormal(chunkPick);
  36193. return chunkPick;
  36194. }
  36195. }, {
  36196. key: "intersectAddNormal",
  36197. value: function intersectAddNormal(object3d) {
  36198. if (object3d.face) {
  36199. object3d.normal = object3d.face.normal.applyQuaternion(object3d.object.quaternion);
  36200. var point = this.position.clone().sub(object3d.point);
  36201. if (point.dot(object3d.normal) < 0) {
  36202. //x,y,z全部反向
  36203. object3d.normal.negate();
  36204. }
  36205. if (this.currentPano) {
  36206. object3d.onFloor = object3d.point.y < this.position.y - 0.5 * this.currentPano.height;
  36207. } else {
  36208. object3d.onFloor = object3d.point.y < this.position.y - 0.5;
  36209. }
  36210. object3d.horizontal = object3d.normal.y > 0.8;
  36211. }
  36212. }
  36213. }, {
  36214. key: "setPanoTaskEnable",
  36215. value: //canConstantlyWalk 当加入一个可以持续性行走的任务时,当前未走完的任务变为匀速,任务中最后一个还是easeOut。时间重新计算。
  36216. //若当前任务是带转向的,不允许加入可以持续性行走的任务。否则转向要更改时间麻烦。
  36217. function setPanoTaskEnable(state) {
  36218. this.canConstantlyWalk = state;
  36219. state || this.clearPanosTaskList();
  36220. }
  36221. /*
  36222. let player = __sdk.core.get('Player')
  36223. player.addTourPanoTask({
  36224. panoList:[
  36225. {pano:player.model.panos.index[168], }, //quaternion:new THREE.Quaternion(), lookAtPoint:new THREE.Vector3()
  36226. ],
  36227. flySpeed: 0.003,
  36228. })
  36229. */
  36230. //导览连续匀速漫游
  36231. }, {
  36232. key: "setTourPanoTask",
  36233. value: function setTourPanoTask(_ref2, fastFirstPano) {
  36234. var _ref2$panoList = _ref2.panoList,
  36235. panoList = _ref2$panoList === void 0 ? [] : _ref2$panoList,
  36236. showPath = _ref2.showPath,
  36237. flySpeed = _ref2.flySpeed,
  36238. callback = _ref2.callback;
  36239. if (panoList.length == 0) return;
  36240. this.panosTaskList.length = 0;
  36241. this.addTourPanoTask({
  36242. panoList,
  36243. showPath,
  36244. flySpeed,
  36245. callback
  36246. }, fastFirstPano); //console.log('setTourPanoTask')
  36247. } //导览连续匀速漫游
  36248. }, {
  36249. key: "addTourPanoTask",
  36250. value: function addTourPanoTask(_ref3, fastFirstPano) {
  36251. var _this18 = this;
  36252. var _ref3$panoList = _ref3.panoList,
  36253. panoList = _ref3$panoList === void 0 ? [] : _ref3$panoList;
  36254. _ref3.showPath;
  36255. var _ref3$flySpeed = _ref3.flySpeed,
  36256. flySpeed = _ref3$flySpeed === void 0 ? settings$3.transition.flySpeed : _ref3$flySpeed,
  36257. callback = _ref3.callback;
  36258. //panoList存储的是下一个终点
  36259. this.dontInterruptPanoTask = true; //期间不允许打扰(飞向其他点),如果要立即停止再说
  36260. var panosTaskList = panoList.map(function (e, i) {
  36261. var toPano = Object.assign({
  36262. flySpeed,
  36263. easeType: 'constant',
  36264. gotQua: true
  36265. }, e, {
  36266. sid: Math.random(),
  36267. dealingTask: true,
  36268. callback: i == panoList.length - 1 ? function (flydone) {
  36269. //到最后一个点时要执行:
  36270. flydone = flydone || e.pano == _this18.currentPano;
  36271. if (flydone) {
  36272. _this18.dontInterruptPanoTask = false;
  36273. e.callback && e.callback();
  36274. callback && callback(); //console.log('playForFlyToPano最后的点:' + e.pano.id)
  36275. } //this.panosTaskList.length == 0 && this.pathMesh.setPanos([])
  36276. } : e.callback
  36277. });
  36278. var _this18$getAimToNextP = _this18.getAimToNextPano(e.pano, e.lookAtPoint, e.quaternion),
  36279. aimQua = _this18$getAimToNextP.aimQua;
  36280. _this18$getAimToNextP.hasVideo; //提前获取以计算时间
  36281. toPano.quaternion = aimQua;
  36282. return toPano;
  36283. }); //const len = this.panosTaskList.length
  36284. //还是需要执行回调的,所以得注释
  36285. //len > 0 && delete this.panosTaskList[len - 1].callback
  36286. console.log('addTourPanoTask', panosTaskList.map(function (e) {
  36287. return [e.pano.id
  36288. /* , e.flySpeed */
  36289. ];
  36290. }) + '');
  36291. if (fastFirstPano) {
  36292. //非匀速到第一个点
  36293. panosTaskList[0].easeType = null;
  36294. }
  36295. this.panosTaskList = this.panosTaskList.concat(panosTaskList); //showPath && this.pathMesh.setPanos([this.currentPano].concat(this.panosTaskList.map(e => e.pano)))
  36296. this.flying || this.flyToPano(this.panosTaskList[0]);
  36297. }
  36298. }, {
  36299. key: "stopTourPanoTask",
  36300. value: function stopTourPanoTask() {
  36301. var stopTime = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 400;
  36302. if (this.panosTaskList.length) {
  36303. var currentTask = this.panosTaskList[0];
  36304. if (currentTask.flyCount) {
  36305. //正在执行
  36306. //迅速停止:
  36307. var restDis = this.position.distanceTo(currentTask.pano.position);
  36308. if (restDis > 0) {
  36309. currentTask.flySpeed = Math.max(restDis / stopTime, currentTask.flySpeed || 0);
  36310. currentTask.aimQua = null; //停止旋转
  36311. currentTask.forceStop = true;
  36312. if (currentTask.easeFun != easing.linearTween) {
  36313. currentTask.easeFun = easing.linearTween;
  36314. var currentSpeed = Math.max(currentTask.currentSpeed || 0, 0.002); //避免起步过慢
  36315. currentTask.duration = restDis / currentSpeed; //初始速度和原先一致, 为了衔接。
  36316. this.startTransition(currentTask);
  36317. }
  36318. }
  36319. }
  36320. }
  36321. this.clearPanosTaskList();
  36322. this.dontInterruptPanoTask = false; //this.pathMesh.setPanos([])
  36323. }
  36324. }, {
  36325. key: "clearPanosTaskList",
  36326. value: function clearPanosTaskList() {
  36327. this.panosTaskList = [];
  36328. }
  36329. }, {
  36330. key: "computeDuration",
  36331. value: function computeDuration(toPano) {
  36332. var dis = this.currentPano.position.distanceTo(toPano.pano.position);
  36333. var dur;
  36334. if (toPano.flySpeed && toPano.easeType == 'constant') {
  36335. //导览不根据距离来调速度,但需要防止转弯速度过快
  36336. dur = dis / toPano.flySpeed;
  36337. } else {
  36338. var maxDistance = toPano.maxDistanceOverride || settings$3.transition.flytimeMaxDistanceThreshold;
  36339. dis = Math.min(dis, maxDistance);
  36340. dur = dis * settings$3.transition.flytimeDistanceMultiplier + settings$3.transition.flyTime;
  36341. }
  36342. if (toPano.quaternion) {
  36343. var rotSpeed = toPano.maxRotSpeed || settings$3.transition.maxRotSpeed;
  36344. if (toPano.flySpeed && toPano.easeType == 'constant') {
  36345. rotSpeed *= toPano.flySpeed / 0.002; //根据导览速度调整
  36346. }
  36347. var quaOri = this.cameraControls.activeControl.camera.quaternion.clone();
  36348. var vec1 = Vectors$1.FORWARD.clone().applyQuaternion(quaOri);
  36349. var vec2 = Vectors$1.FORWARD.clone().applyQuaternion(toPano.quaternion);
  36350. var angle = vec1.angleTo(vec2); //不能直接用quaterniion求angleTo,因为要排除绕着Vectors.FORWARD轴转的角度。
  36351. var time = Math.pow(angle, 0.3) / rotSpeed * 1e3; // for videoPano、导览、热点等
  36352. //console.log('最小旋转时间', time)
  36353. dur = Math.max(time, dur);
  36354. if (toPano.flySpeed && toPano.easeType == 'constant') {
  36355. toPano.flySpeed = dis / dur; //修改速度,以免过后一直变速
  36356. }
  36357. }
  36358. return dur;
  36359. }
  36360. /*
  36361. 飞向下一个pano
  36362. */
  36363. }, {
  36364. key: "getSize",
  36365. value: function getSize() {
  36366. var _this$$app$dom$queryS = this.$app.dom.querySelector('.player[name="main"]'),
  36367. clientWidth = _this$$app$dom$queryS.clientWidth,
  36368. clientHeight = _this$$app$dom$queryS.clientHeight;
  36369. return {
  36370. clientWidth,
  36371. clientHeight
  36372. };
  36373. }
  36374. }, {
  36375. key: "beforeChangeMode",
  36376. value: function beforeChangeMode(fromMode, toMode, toPano, dur) {
  36377. var _this19 = this;
  36378. if (fromMode == Viewmode$1.PANORAMA) {
  36379. this.labelManager && this.labelManager.updateEntryVisi(true, this.model.currentFloor.floorIndex);
  36380. this.chosenMeasureRuler && this.chosenMeasureRuler.showOptionLabel(false);
  36381. common$1.updateVisible(this.model.floorLogos.firstLogo, 'outside', false);
  36382. common$1.updateVisible(this.model.floorLogos.secondLogo, 'outside', false);
  36383. this.model.skybox.material.depthTest = false; //防止飞出后遮住别的mesh xzw add
  36384. this.model.skybox.material.transparent = true;
  36385. this.$app.TagManager.switchLabels({
  36386. type: 'aiList',
  36387. visible: false
  36388. }, null, 'onPanorama');
  36389. this.$app.core.get('PanoRenderer').disposeIdelTargets(); //提前把不需要的dispose防止崩溃
  36390. setTimeout(function () {
  36391. if (_this19.panosTaskList.length) {
  36392. //如果还在flyToPano
  36393. //还没到终点就飞出时的toPano、以及无缝过渡途中加载的下一个点 都要dispose
  36394. var transitionsId = _this19.$app.resource.num + settings$3.freeze.FlyToPano;
  36395. transitions$1.cancelById(transitionsId, true);
  36396. _this19.panosTaskList.forEach(function (e) {
  36397. e.pano.exit();
  36398. });
  36399. }
  36400. }, 1);
  36401. } else if (fromMode == Viewmode$1.FLOORPLAN) {
  36402. EntryArrow.switchDepthTest(true);
  36403. this.model.setModelDisplay(true, 'hideOnfloorplan'); //恢复模型
  36404. } else if (fromMode == Viewmode$1.DOLLHOUSE) ;
  36405. if (toMode == Viewmode$1.PANORAMA) {
  36406. this.model.floorLogos.firstLogo.position.copy(toPano.floorPosition.clone().sub(this.model.position)); //改
  36407. this.model.floorLogos.secondLogo.position.copy(this.model.floorLogos.firstLogo.position); //for floorIcon position
  36408. //this.model.floorLogos.adjustfloorLogoHeight();
  36409. this.compass && this.compass.autoJudgeDisplay();
  36410. this.labelManager && this.labelManager.updateEntryVisi(false, this.model.currentFloor.floorIndex);
  36411. } else if (toMode == Viewmode$1.FLOORPLAN) {
  36412. setTimeout(EntryArrow.switchDepthTest.bind(this, false), dur * 0.5);
  36413. this.labelManager && this.labelManager.setPlanLabelVisi(true, this.model.currentFloor.floorIndex);
  36414. this.$app.TagManager.switchLabels({
  36415. type: 'paths',
  36416. visible: false
  36417. }, null, 'onFloorplan');
  36418. this.$app.TagManager.switchLabels({
  36419. type: 'links',
  36420. visible: false
  36421. }, null, 'onFloorplan');
  36422. this.$app.TagManager.switchLabels({
  36423. type: 'traces-label',
  36424. visible: false
  36425. }, null, 'onFloorplan');
  36426. if (this.$app.store.getValue('flooruser').type == 'image') {
  36427. //从绘图导入的平面图不显示痕迹物证
  36428. this.$app.TagManager.switchLabels({
  36429. type: 'traces',
  36430. visible: false
  36431. }, null, 'onFloorplan');
  36432. this.$app.TagManager.switchLabels({
  36433. type: 'billboards',
  36434. visible: false
  36435. }, null, 'onFloorplan');
  36436. }
  36437. } else if (toMode == Viewmode$1.DOLLHOUSE) ;
  36438. this.$app.Camera.emit('mode.beforeChange', {
  36439. fromMode,
  36440. toMode,
  36441. floorIndex: this.model.currentFloor.floorIndex,
  36442. allVisible: this.model.allFloorsVisible
  36443. });
  36444. }
  36445. }, {
  36446. key: "afterChangeMode",
  36447. value: function afterChangeMode(fromMode, toMode, toPano, dur) {
  36448. if (fromMode == Viewmode$1.PANORAMA) {
  36449. this.compass && this.compass.autoJudgeDisplay();
  36450. this.$app.core.get('PanoRenderer').disposeIdelTargets();
  36451. } else if (fromMode == Viewmode$1.FLOORPLAN) {
  36452. this.labelManager && this.labelManager.setPlanLabelVisi(false, this.model.currentFloor.floorIndex);
  36453. this.$app.TagManager.switchLabels({
  36454. type: 'paths',
  36455. visible: true
  36456. }, null, 'onFloorplan');
  36457. this.$app.TagManager.switchLabels({
  36458. type: 'links',
  36459. visible: true
  36460. }, null, 'onFloorplan');
  36461. this.$app.TagManager.switchLabels({
  36462. type: 'traces-label',
  36463. visible: true
  36464. }, null, 'onFloorplan');
  36465. this.$app.TagManager.switchLabels({
  36466. type: 'traces',
  36467. visible: true
  36468. }, null, 'onFloorplan');
  36469. this.$app.TagManager.switchLabels({
  36470. type: 'billboards',
  36471. visible: true
  36472. }, null, 'onFloorplan');
  36473. } else if (fromMode == Viewmode$1.DOLLHOUSE) ;
  36474. if (toMode == Viewmode$1.PANORAMA) {
  36475. common$1.updateVisible(this.model.floorLogos.firstLogo, 'outside', true);
  36476. common$1.updateVisible(this.model.floorLogos.secondLogo, 'outside', true);
  36477. this.model.floorLogos.changefloorLogoOpa({
  36478. index: 0,
  36479. from: 0,
  36480. opa: 1,
  36481. dur: 150
  36482. }); //this.model.floorLogoShow(0,150);
  36483. this.doorLabels.forEach(function (label) {
  36484. return label.updateVisible();
  36485. });
  36486. this.model.skybox.material.depthTest = true; //防止飞出后遮住别的mesh的恢复 xzw add
  36487. this.model.skybox.material.transparent = false; //透明时vr模式某些角度圆圈看不见;
  36488. this.$app.TagManager.switchLabels({
  36489. type: 'aiList',
  36490. visible: true
  36491. }, null, 'onPanorama');
  36492. this.model.showLowestTile(true);
  36493. /* this.model.chunks.forEach(chunk=>{//4.6.0 xzw
  36494. common.updateVisible(chunk,'atPano',false) //在漫游点处隐藏chunk///无法隐藏模型,因为需要遮挡其他物体。虽然考虑过使用copyCubeMap渲染深度图,但没准这样也耗gpu。15个chunk的损耗1-2毫秒,当降4倍性能之后。
  36495. }) */
  36496. } else if (toMode == Viewmode$1.FLOORPLAN) {
  36497. var showModel = this.model.showOnFloorplan; //|| this.linkEditor?.setPanoVisible || this.linkEditor?.setTagVisible
  36498. this.model.setModelDisplay(showModel, 'hideOnfloorplan'); //其实floorplanCadImg也写了,因需和plane同时提前。但cad模块飞出需要写
  36499. this.model.chunkDisplay.visible && this.model.showLowestTile(false);
  36500. } else if (toMode == Viewmode$1.DOLLHOUSE) {
  36501. this.model.floors.forEach(function (floor) {
  36502. floor.entryArrow.forEach(function (arrow) {
  36503. return arrow.dollLabel.update();
  36504. }); //提前更新下,elem.getBoundingClientRect才有效
  36505. });
  36506. this.model.showLowestTile(false);
  36507. }
  36508. this.$app.Camera.emit('mode.afterChange', {
  36509. fromMode,
  36510. toMode,
  36511. floorIndex: this.model.currentFloor.floorIndex,
  36512. allVisible: this.model.allFloorsVisible
  36513. });
  36514. this.clearPanosTaskList(); //清空
  36515. }
  36516. /**
  36517. * 获取截图位置和视角
  36518. * @returns
  36519. */
  36520. }, {
  36521. key: "setAnimateMakerPano",
  36522. value: //xst,获得需要带动画marker的pano
  36523. function setAnimateMakerPano() {
  36524. var _this20 = this;
  36525. if (!this.currentPano) {
  36526. return;
  36527. }
  36528. var pano;
  36529. if (this.mode === Viewmode$1.PANORAMA && !this.flying && !this.enteringView && this.currentPano.isAligned()) {
  36530. var filterFuncs = [Panorama.filters.isPanoAligned()];
  36531. var direction = this.getDirection();
  36532. filterFuncs.push(Panorama.filters.not(this.currentPano));
  36533. filterFuncs.push(Panorama.filters.isNeighbourPanoTo(this.currentPano)); //filterFuncs.push(Panorama.filters.inFloorDirection_2d(this.currentPano.floorPosition, direction, 0.7))
  36534. filterFuncs.push(Panorama.filters.inFloorDirection(this.currentPano.position, direction, 0.707)); //45度范围内
  36535. filterFuncs.push(Panorama.filters.isClampDisSquaredTo(this.currentPano.floorPosition, 0.5, 16));
  36536. /* const pano = this.model.panos.find(filterFuncs, [
  36537. Panorama.sortFunctions.floorDistanceToPoint(this.currentPano.floorPosition),
  36538. ]) */
  36539. var sorts = common$1.sortByScore(this.model.panos.list, filterFuncs, [Panorama.scoreFunctions.distanceSquared(this.currentPano, -0.6), Panorama.scoreFunctions.directionFloor(this.currentPano.position, direction)]);
  36540. if (sorts.length > 1) {
  36541. //最后计算下保证 尽量选择在屏幕范围内的
  36542. var p = sorts.slice(0, 4).find(function (e) {
  36543. //最多只计算头几个,多了会卡
  36544. var r = convertTool.getPos2d(e.item.floorPosition, _this20);
  36545. return r.inSight;
  36546. });
  36547. if (p) {
  36548. pano = p.item;
  36549. }
  36550. }
  36551. if (!pano) {
  36552. pano = sorts[0] && sorts[0].item;
  36553. }
  36554. }
  36555. if (pano && pano.id != this.model.panos.animatePanoId) {
  36556. this.model.panos.animatePanoId != void 0 && this.model.panos.get(this.model.panos.animatePanoId).updateMakerStyle();
  36557. pano.updateMakerStyle('animate');
  36558. this.model.panos.animatePanoId = pano.id;
  36559. } else if (!pano && this.model.panos.animatePanoId != void 0) {
  36560. this.model.panos.get(this.model.panos.animatePanoId).updateMakerStyle();
  36561. this.model.panos.animatePanoId = null;
  36562. }
  36563. }
  36564. }, {
  36565. key: "createIntersectLabel",
  36566. value: function createIntersectLabel() {
  36567. this.intersectLabel = new TextSprite({
  36568. text: 'intersectLabel',
  36569. textColor: {
  36570. r: 255,
  36571. g: 255,
  36572. b: 255,
  36573. a: 1
  36574. },
  36575. backgroundColor: {
  36576. r: 0,
  36577. g: 0,
  36578. b: 0,
  36579. a: 0.1
  36580. },
  36581. borderColor: {
  36582. r: 255,
  36583. g: 255,
  36584. b: 255,
  36585. a: 1
  36586. },
  36587. //textBorderColor: { r: bgcolor.r * 255, g: bgcolor.g * 255, b: bgcolor.b * 250, a: a || 0.9 },
  36588. //textBorderThick: 2,
  36589. margin: {
  36590. x: 10,
  36591. y: 10
  36592. },
  36593. borderRadius: 10,
  36594. rectBorderThick: 2,
  36595. player: this,
  36596. sizeInfo: {
  36597. width2d: 180
  36598. },
  36599. fontsize: 25
  36600. });
  36601. this.intersectLabel.sprite.position.set(0, 2, 0);
  36602. this.model.add(this.intersectLabel);
  36603. }
  36604. }]);
  36605. return Player;
  36606. }(EventEmitter);
  36607. });
  36608. defineComponent('QualityManager', function () {
  36609. return /*#__PURE__*/function () {
  36610. function QualityManager(e, t, i) {
  36611. _classCallCheck(this, QualityManager);
  36612. this.maxNavPanoSize = -1;
  36613. this.maxZoomPanoSize = -1;
  36614. this.devicePixelDensity = e;
  36615. this.deviceScreenSize = t;
  36616. this.clientBandwidth = i;
  36617. this.panoSizeClassMap = {};
  36618. this.useHighResolutionPanos = !0;
  36619. this.useUltraHighResolutionPanos = !1;
  36620. this.modelHasUltraHighPanos = !1;
  36621. this.maxRenderTargetSize = 2048;
  36622. }
  36623. _createClass(QualityManager, [{
  36624. key: "init",
  36625. value: function init() {
  36626. var metadata = this.$app.store.getValue('metadata');
  36627. var resolution = metadata.sceneResolution || '2k';
  36628. if (resolution.indexOf('/') != -1) {
  36629. this.tileClass = resolution.split('/')[1];
  36630. } else {
  36631. this.tileClass = resolution;
  36632. }
  36633. this.navTileClass = '2k';
  36634. if (this.tileClass == '1k') {
  36635. this.navTileClass = '1k';
  36636. this.useHighResolutionPanos = false; // 只加载1k
  36637. }
  36638. if (browser$1.urlHasValue('1k')) {
  36639. this.navTileClass = '1k';
  36640. }
  36641. this.maxRenderTargetSize = config$6.mobile ? 2048 : this.tileClass == '6k' ? 6144 : 4096; //add
  36642. this.maxRenderTargetSize = Math.min(common$1.getMAXCUBETEXTURESIZE(), this.maxRenderTargetSize); //add 部分系统老浏览器只能2048
  36643. this.buildPanoSizeClassMap(this.devicePixelDensity, this.deviceScreenSize, this.clientBandwidth);
  36644. this.ultraHighSize = this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  36645. this.highSize = this.getPanoSize(PanoSizeClass.HIGH);
  36646. this.standardSize = this.getPanoSize(PanoSizeClass.STANDARD);
  36647. this.baseSize = this.getPanoSize(PanoSizeClass.BASE);
  36648. if (settings$3.tiling.maxZoomPanoQuality && this.ultraHighSize <= settings$3.tiling.maxZoomPanoQuality) {
  36649. settings$3.tiling.allowUltraHighResolution = !0;
  36650. }
  36651. this.highQualityThreshold = browser$1.valueFromHash('threshold2k', constants$4.windowHeightHighQualityThreshold);
  36652. this.updateMaximums();
  36653. this.$app.core.get('ModelManager').on(ModelManagerEvents.ActiveModelChanged, this.onModelChanged.bind(this));
  36654. this.limitQuality = true; //this.navTileClass = '1k'
  36655. }
  36656. }, {
  36657. key: "updateFromModel",
  36658. value: function updateFromModel(e) {
  36659. this.updateUltraHighResolutionSettings(e);
  36660. }
  36661. }, {
  36662. key: "updateHighResolutionSettings",
  36663. value: function updateHighResolutionSettings(e) {
  36664. showcase.modelDataPromisesTiles(e.data) ? this.useHighResolutionPanos = !0 : this.useHighResolutionPanos = !1, this.updateMaximums();
  36665. }
  36666. }, {
  36667. key: "updateUltraHighResolutionSettings",
  36668. value: function updateUltraHighResolutionSettings(e) {
  36669. if (settings$3.tiling.allowUltraHighResolution && this.modelHasUltraHighPanos) {
  36670. this.useUltraHighResolutionPanos = !0;
  36671. } else {
  36672. this.useUltraHighResolutionPanos = !1;
  36673. }
  36674. this.updateMaximums();
  36675. }
  36676. }, {
  36677. key: "enableUltraHighQualityMode",
  36678. value: function enableUltraHighQualityMode() {
  36679. this.modelHasUltraHighPanos = !0;
  36680. this.updateUltraHighResolutionSettings(null);
  36681. }
  36682. }, {
  36683. key: "ultraHighQualityModeEnabled",
  36684. value: function ultraHighQualityModeEnabled() {
  36685. return this.modelHasUltraHighPanos;
  36686. }
  36687. }, {
  36688. key: "onModelChanged",
  36689. value: function onModelChanged(e) {
  36690. this.updateFromModel(e.model), this.updateMaximums();
  36691. }
  36692. }, {
  36693. key: "updateMaximums",
  36694. value: function updateMaximums() {
  36695. this.maxNavPanoSize = settings$3.tiling.maxNavPanoQuality || this.detectMaxNavPanoSize();
  36696. this.maxZoomPanoSize = settings$3.tiling.maxZoomPanoQuality || this.detectMaxZoomPanoSize();
  36697. this.maxZoomPanoSize < this.maxNavPanoSize && (this.maxNavPanoSize = this.maxZoomPanoSize);
  36698. }
  36699. }, {
  36700. key: "buildPanoSizeClassMap",
  36701. value: function buildPanoSizeClassMap() {
  36702. this.panoSizeClassMap[PanoSizeClass.BASE] = 512;
  36703. this.panoSizeClassMap[PanoSizeClass.STANDARD] = 1024;
  36704. this.panoSizeClassMap[PanoSizeClass.HIGH] = 2048;
  36705. this.panoSizeClassMap[PanoSizeClass.ULTRAHIGH] = this.tileClass == '6k' ? 6144 : 4096;
  36706. }
  36707. }, {
  36708. key: "getPanoSize",
  36709. value: function getPanoSize(e) {
  36710. return this.panoSizeClassMap[e];
  36711. }
  36712. }, {
  36713. key: "getMaxPossiblePanoSize",
  36714. value: function getMaxPossiblePanoSize() {
  36715. return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  36716. }
  36717. }, {
  36718. key: "getMaxPanoSize",
  36719. value: function getMaxPanoSize() {
  36720. return this.maxZoomPanoSize;
  36721. }
  36722. }, {
  36723. key: "getMaxNavPanoSize",
  36724. value: function getMaxNavPanoSize() {
  36725. return this.maxNavPanoSize;
  36726. }
  36727. }, {
  36728. key: "getMaxZoomPanoSize",
  36729. value: function getMaxZoomPanoSize() {
  36730. return this.maxZoomPanoSize;
  36731. }
  36732. }, {
  36733. key: "detectMaxNavPanoSizeClass",
  36734. value: function detectMaxNavPanoSizeClass() {
  36735. /* return this.useHighResolutionPanos
  36736. ? browser.isMobile()
  36737. ? PanoSizeClass.STANDARD
  36738. : window.innerHeight < this.highQualityThreshold
  36739. ? PanoSizeClass.STANDARD
  36740. : PanoSizeClass.HIGH
  36741. : PanoSizeClass.STANDARD */
  36742. switch (this.navTileClass) {
  36743. case '1k':
  36744. return PanoSizeClass.STANDARD;
  36745. case '512':
  36746. return PanoSizeClass.BASE;
  36747. case '2k':
  36748. default:
  36749. return PanoSizeClass.HIGH;
  36750. }
  36751. }
  36752. }, {
  36753. key: "detectMaxNavPanoSize",
  36754. value: function detectMaxNavPanoSize() {
  36755. var e = this.detectMaxNavPanoSizeClass();
  36756. return this.getPanoSize(e);
  36757. }
  36758. }, {
  36759. key: "detectMaxZoomPanoSize",
  36760. value: function detectMaxZoomPanoSize() {
  36761. if (this.zoomLevelResolution) {
  36762. if (this.zoomLevelResolution == '4k' && this.useUltraHighResolutionPanos) {
  36763. return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  36764. } else if (this.zoomLevelResolution == '1k' || !this.useHighResolutionPanos) {
  36765. return this.getPanoSize(PanoSizeClass.STANDARD);
  36766. } else {
  36767. return this.getPanoSize(PanoSizeClass.HIGH);
  36768. }
  36769. } else {
  36770. if (this.useHighResolutionPanos) {
  36771. /* if (browser.isMobile()) {//手机版如果要2k的将这里去掉
  36772. if (settings.tiling.mobileHighQualityOverride) {
  36773. return this.getPanoSize(PanoSizeClass.HIGH);
  36774. } else {
  36775. return this.getPanoSize(PanoSizeClass.STANDARD);
  36776. }
  36777. } else */
  36778. if (this.useUltraHighResolutionPanos) {
  36779. return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
  36780. } else {
  36781. return this.getPanoSize(PanoSizeClass.HIGH);
  36782. }
  36783. } else {
  36784. return this.getPanoSize(PanoSizeClass.STANDARD);
  36785. }
  36786. }
  36787. }
  36788. }]);
  36789. return QualityManager;
  36790. }();
  36791. });
  36792. var panorama = {};
  36793. panorama.getCubemapUrls = function (e, t, i) {
  36794. var a = [0, 1, 2, 3, 4, 5];
  36795. return a.map(function (n, o) {
  36796. return e.get('pan/' + i + '/' + t + '_skybox' + r(n) + '.jpg');
  36797. }.bind(this));
  36798. };
  36799. panorama.mapFaceToCubemapFace = function (e) {
  36800. var s = {
  36801. 0: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
  36802. 1: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
  36803. 2: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X,
  36804. 3: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
  36805. 4: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
  36806. 5: GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
  36807. };
  36808. return s[e];
  36809. };
  36810. var TileDownloaderEvents = {
  36811. TileDownloadSuccess: 'tiledownloader.download.success',
  36812. TileDownloadFailure: 'tiledownloader.download.failure',
  36813. PanoDownloadComplete: 'tiledownloader.pano.download.complete'
  36814. };
  36815. 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); }; }
  36816. 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; } }
  36817. defineComponent('TileDownloader', function () {
  36818. var _class, _temp;
  36819. return _temp = _class = /*#__PURE__*/function (_EventEmitter) {
  36820. _inherits(TileDownloader, _EventEmitter);
  36821. var _super = _createSuper$16(TileDownloader);
  36822. function TileDownloader(_e) {
  36823. var _this;
  36824. _classCallCheck(this, TileDownloader);
  36825. _this = _super.call(this);
  36826. _this.forceQueueTilesForPano = function () {
  36827. var e = [],
  36828. t = [];
  36829. return function (i, n, r, o, a, s) {
  36830. e.length = 0;
  36831. for (var u = this.getTileDownloadDescriptors(i, n), d = 0; d < u.length; d++) {
  36832. var p = u[d];
  36833. p.status !== DownloadStatus.None && p.status !== DownloadStatus.Queued || e.push(p);
  36834. }
  36835. if (r && e.length > 0) {
  36836. TilePrioritizer.sortPanoTiles(e, i, r), t.length = 0, TileUtils.matchingTilesInDirection(i, n, r, o, a, t);
  36837. for (var f = 0, g = function g(e) {
  36838. return e.face === m.face && e.faceTileIndex === m.faceTileIndex;
  36839. }; f < e.length;) {
  36840. var m = e[f],
  36841. v = t.findIndex(g);
  36842. v < 0 ? e.splice(f, 1) : f++;
  36843. }
  36844. }
  36845. for (var A = 0; A < e.length; A++) {
  36846. this.forceQueue.push(e[A]);
  36847. }
  36848. this.setStatusForAllDescriptors(this.forceQueue, DownloadStatus.ForceQueued), this.clearFromQueue(this.priorityQueue, DownloadStatus.ForceQueued, !1), s && this.processQueueForDownloading(this.forceQueue, !0);
  36849. };
  36850. }();
  36851. _this.cleanupActiveDownloads = function () {
  36852. var e = [];
  36853. return function () {
  36854. e.length = 0;
  36855. for (var t = 0; t < this.activeDownloads.length; t++) {
  36856. var i = this.activeDownloads[t];
  36857. i.status !== DownloadStatus.Downloaded && i.status !== DownloadStatus.Failed && e.push(i);
  36858. }
  36859. this.activeDownloads.length = 0, this.activeDownloads.push.apply(this.activeDownloads, e);
  36860. };
  36861. }();
  36862. _this.getTileUrl = function () {
  36863. var e = {
  36864. 256: '256',
  36865. 512: '512',
  36866. 1024: '1k',
  36867. 2048: '2k',
  36868. 4096: '4k',
  36869. 6144: '6k'
  36870. },
  36871. t = {
  36872. face: -1,
  36873. faceTileIndex: -1,
  36874. tileX: -1,
  36875. tileY: -1
  36876. };
  36877. return function (pano, panoSize, tileSize, a, panoType) {
  36878. TileUtils.getTileLocation(panoSize, a, t);
  36879. var s = Math.floor(panoSize / tileSize),
  36880. l = s * s,
  36881. h = Math.floor(a / l),
  36882. d = '';
  36883. 1 === settings$3.tiling.customCompression && ('_' + settings$3.tiling['q' + e[panoSize]]); //8目
  36884. //else if (metadata.sceneScheme == 11) {
  36885. //阿里云oss的规则
  36886. //let tileClass = settings.tileClass
  36887. var metadata = this.$app.store.getValue('metadata');
  36888. var tileClass = metadata.sceneKind || 'tiles';
  36889. var resolution = metadata.sceneResolution || '2k';
  36890. if (resolution.indexOf('/') != -1) {
  36891. var temp = resolution.split('/');
  36892. tileClass = temp[0];
  36893. resolution = temp[1];
  36894. } // let tileClass = metadata.sceneKind
  36895. // let resolution = metadata.sceneResolution
  36896. // let temp = resolution.split('/')
  36897. // // 临时方案
  36898. // if (temp.length == 1) {
  36899. // tileClass = resolution
  36900. // } else {
  36901. // tileClass = temp[0]
  36902. // resolution = temp[1]
  36903. // }
  36904. // if (pano.panoType == '360view') {
  36905. // if (this.$app.config.deploy === 'local' || tileClass === 'face') {
  36906. // d = this.getTiles('tiles/' + i + '/' + e[panoSize] + '_face' + h + '_' + t.tileX + '_' + t.tileY + '.jpg')
  36907. // g = '?'
  36908. // } else {
  36909. // d = `tiles/${pano.view.resolution}/${pano.view.imgSid}`
  36910. // }
  36911. // } else {
  36912. // if (this.$app.config.deploy === 'local' || tileClass === 'face') {
  36913. // } else {
  36914. // d = tileClass + '/' + resolution + '/' + pano.id
  36915. // }
  36916. // }
  36917. if (this.$app.config.deploy === 'local' || tileClass === 'face') {
  36918. if (pano.panoType == '360view') {
  36919. d = 'tiles/' + pano.view.imgSid + '/' + e[panoSize] + '_face' + h + '_' + t.tileX + '_' + t.tileY + '.jpg';
  36920. } else {
  36921. d = 'tiles/' + pano.id + '/' + e[panoSize] + '_face' + h + '_' + t.tileX + '_' + t.tileY + '.jpg';
  36922. }
  36923. } else {
  36924. if (pano.panoType == '360view') {
  36925. d = "tiles/".concat(pano.view.resolution, "/").concat(pano.view.imgSid);
  36926. } else {
  36927. d = tileClass + '/' + resolution + '/' + pano.id;
  36928. }
  36929. d += '_skybox' + h + '.jpg?x-oss-process=';
  36930. if (e[panoSize] == '512') {
  36931. d += 'image/resize,h_512';
  36932. } else {
  36933. //移动端是1k,pc端是2k
  36934. if (e[panoSize] == '1k' || e[panoSize] == '2k') {
  36935. d += "image/resize,m_lfit,w_".concat(panoSize, "/crop,w_").concat(tileSize, ",h_").concat(tileSize, ",");
  36936. } else {
  36937. d += "image/crop,w_".concat(tileSize, ",h_").concat(tileSize, ",");
  36938. }
  36939. if (t.tileX == 0) {
  36940. d += 'x_0,';
  36941. } else {
  36942. d += 'x_' + tileSize * t.tileX
  36943. /* - 1 */
  36944. + ','; //2022.12.12去掉了 -1, 否则https://www.4dkankan.com/spg.html?m=KJ-2HnN97rU51&lang=zh点位18的 18_skybox0 和 18_skybox3对不上
  36945. }
  36946. if (t.tileY == 0) {
  36947. d += 'y_0';
  36948. } else {
  36949. d += 'y_' + tileSize * t.tileY;
  36950. /* - 1 */
  36951. }
  36952. }
  36953. /* 腾讯云适配 */
  36954. // d += '_skybox' + h + '.jpg?imageMogr2/'
  36955. // if (e[panoSize] == '512') {
  36956. // d += 'thumbnail/512x'
  36957. // } else {
  36958. // if (e[panoSize] == '1k' || e[panoSize] == '2k') {
  36959. // d += `crop/${panoSize}x${panoSize}/cut/512x512x${t.tileX == 0 ? 0 : 512 * t.tileX}x${t.tileY == 0 ? 0 : 512 * t.tileY}`
  36960. // } else {
  36961. // d += `cut/512x512x${t.tileX == 0 ? 0 : 512 * t.tileX}x${t.tileY == 0 ? 0 : 512 * t.tileY}`
  36962. // }
  36963. // }
  36964. }
  36965. if (pano.panoType == '360view') {
  36966. if (!this.$app.core.get('Player').viewLinkManager.views[pano.id]) return;
  36967. d = this.$app.resource.getUserImagesURL("panorama/".concat(pano.view.imgSid, "/").concat(d));
  36968. } else {
  36969. d = this.getTiles(d);
  36970. }
  36971. return d;
  36972. };
  36973. }();
  36974. _this.panos = null;
  36975. _this.retryMinimumTime = 1e4;
  36976. _this.urls = null;
  36977. _this.panoLoadCallbacks = {};
  36978. _this.downloadDescriptors = {};
  36979. _this.priorityQueue = [];
  36980. _this.forceQueue = [];
  36981. _this.activeDownloads = [];
  36982. _this.tilePrioritizer = null;
  36983. _this.refreshInterval = null;
  36984. _this.processPriorityQueue = !1;
  36985. _this.concurrentDownloads = _e.concurrentDownloads || 1;
  36986. _this.downloadTestResults = {};
  36987. _this.freeze = Object.freeze({
  36988. Testing: 1,
  36989. Success: 2,
  36990. Fail: 3
  36991. });
  36992. _this.$app = _e.$app;
  36993. _this.index = 0;
  36994. return _this;
  36995. }
  36996. _createClass(TileDownloader, [{
  36997. key: "init",
  36998. value: function init() {// Todo
  36999. }
  37000. }, {
  37001. key: "setUrls",
  37002. value: function setUrls(e) {
  37003. this.urls = e;
  37004. }
  37005. }, {
  37006. key: "setPanoData",
  37007. value: function setPanoData(e, t, i) {
  37008. //xzw 改。不直接使用model.panos,因为要去掉其中非tiled的pano
  37009. this.panos = e.clone();
  37010. this.panos.filter(function (e) {
  37011. return e.tiled;
  37012. });
  37013. this.imagePanos = t; //没什么用?heroLocation的
  37014. this.panoGroupId = i;
  37015. }
  37016. /*start() {
  37017. this.refreshUpdateInterval(0)
  37018. }
  37019. stop() {
  37020. window.cancel(this.refreshInterval)
  37021. }
  37022. */
  37023. }, {
  37024. key: "refreshUpdateInterval",
  37025. value: function refreshUpdateInterval(e) {
  37026. //还未加入sceneRenderer的component时使用
  37027. e || (e = 0), this.refreshInterval = window.setTimeout(function () {
  37028. var e = this.update();
  37029. e ? this.refreshUpdateInterval(TileDownloader.ACTIVE_REFRESH_DELAY) : this.refreshUpdateInterval(TileDownloader.IDLE_REFRESH_DELAY);
  37030. }.bind(this), e);
  37031. } //xzw 改
  37032. }, {
  37033. key: "start",
  37034. value: function start() {
  37035. this.started = true;
  37036. if (this.refreshEveryFrame) this.$app.core.get('SceneRenderer').addComponent(this, true);else this.refreshUpdateInterval(0);
  37037. }
  37038. }, {
  37039. key: "useComponent",
  37040. value: function useComponent() {
  37041. this.refreshEveryFrame = true;
  37042. window.clearTimeout(this.refreshInterval);
  37043. this.start();
  37044. }
  37045. }, {
  37046. key: "stop",
  37047. value: function stop() {
  37048. window.clearTimeout(this.refreshInterval);
  37049. this.$app.core.get('SceneRenderer').removeComponent(this);
  37050. }
  37051. }, {
  37052. key: "update",
  37053. value: function update() {
  37054. var _this2 = this;
  37055. var e = this.forceQueue.length > 0;
  37056. this.processQueueForDownloading(this.forceQueue);
  37057. if (this.processPriorityQueue) {
  37058. common$1.intervalTool.isWaiting('processPriorityQueue_' + this.$app.resource.num + this.index, function () {
  37059. //延时update,防止崩溃 , 未到时间就拦截(第一次直接执行)
  37060. _this2.queuePrioritizedTilesForPanos(_this2.panos); //这句比较耗时 降四倍时大概1-2毫秒
  37061. }, this.$app.config.mobile ? 120 : 66);
  37062. this.priorityQueue.length > 0 && (e = !0);
  37063. this.processQueueForDownloading(this.priorityQueue);
  37064. }
  37065. return e;
  37066. }
  37067. }, {
  37068. key: "clearForceQueue",
  37069. value: function clearForceQueue() {
  37070. this.clearQueue(this.forceQueue);
  37071. }
  37072. }, {
  37073. key: "queuePrioritizedTilesForPanos",
  37074. value: function queuePrioritizedTilesForPanos(e) {
  37075. if (this.tilePrioritizer) {
  37076. var player = this.$app.core.get('Player');
  37077. var maxLoadTileCount = player.lowTile == 'level2' ? 6 : player.lowTile == 'level1' ? 10 : 30;
  37078. this.clearQueue(this.priorityQueue);
  37079. this.tilePrioritizer.filterAndPrioritize(this.priorityQueue, e, this, maxLoadTileCount);
  37080. this.clearFromQueue(this.priorityQueue, DownloadStatus.None, !0);
  37081. this.setStatusOrRemoveForAllDescriptors(this.priorityQueue, DownloadStatus.Queued);
  37082. }
  37083. }
  37084. }, {
  37085. key: "clearQueue",
  37086. value: function clearQueue(e) {
  37087. this.setStatusForAllDescriptors(e, DownloadStatus.None), e.length = 0;
  37088. }
  37089. }, {
  37090. key: "clearFromQueue",
  37091. value: function clearFromQueue(e, t, i) {
  37092. for (var n = 0; n < e.length; n++) {
  37093. var r = e[n];
  37094. r && (t === r.status && !i || t !== r.status && i) && (e[n] = null);
  37095. }
  37096. }
  37097. }, {
  37098. key: "setStatusForAllDescriptors",
  37099. value: function setStatusForAllDescriptors(e, t) {
  37100. for (var i = 0; i < e.length; i++) {
  37101. var n = e[i];
  37102. n && (n.status = t);
  37103. }
  37104. }
  37105. }, {
  37106. key: "setStatusOrRemoveForAllDescriptors",
  37107. value: function setStatusOrRemoveForAllDescriptors(e, t) {
  37108. for (var i = 0; i < e.length; i++) {
  37109. var n = e[i];
  37110. n && (n.status !== t ? n.status = t : e[i] = null);
  37111. }
  37112. }
  37113. }, {
  37114. key: "getTileDownloadDescriptors",
  37115. value: function getTileDownloadDescriptors(e, t) {
  37116. var i = this.getAllTileDownloadDescriptorsForPano(e),
  37117. n = i[t];
  37118. return n || (n = this.buildDownloadDescriptorArray(t), i[t] = n, this.initTileDownloadDescriptors(n, e, t)), n;
  37119. }
  37120. }, {
  37121. key: "getAllTileDownloadDescriptorsForPano",
  37122. value: function getAllTileDownloadDescriptorsForPano(e) {
  37123. var t = this.downloadDescriptors[e.id];
  37124. return t || (t = {}, this.downloadDescriptors[e.id] = t), t;
  37125. }
  37126. }, {
  37127. key: "processQueueForDownloading",
  37128. value: function processQueueForDownloading(e, t) {
  37129. this.cleanupActiveDownloads();
  37130. /* let flying = this.$app.core.get('Player').flying
  37131. let isMobile = this.$app.config.mobile */
  37132. // xzw 改 4.6.0
  37133. if (e.length) {
  37134. //let concurrentDownloads = common.getBestCount('concurrentDownloads', 1, 6) //flying ? (isMobile ? 2 : 3) : 6
  37135. var concurrentDownloads = common$1.getBestCount({
  37136. name: 'concurrentDownloads',
  37137. minCount: 0,
  37138. maxCount: 6,
  37139. durBound1: 1,
  37140. durBound2: 12,
  37141. //8以下太小,模型大的场景加载慢
  37142. ifLog: false,
  37143. maxHistory: 4,
  37144. isMobile: this.$app.config.mobile
  37145. }); //最小值设置为0,否则4k放大快速过渡会崩溃,之前v3不会崩是因为用setTimeout加载慢
  37146. if (this.activeDownloads.length < concurrentDownloads || t) {
  37147. var i = t ? e.length : concurrentDownloads - this.activeDownloads.length;
  37148. for (var n = 0, r = 0; n < i && e.length > 0; r++) {
  37149. var o = e.shift();
  37150. o && (this.startDownload(o), n++);
  37151. }
  37152. }
  37153. }
  37154. }
  37155. }, {
  37156. key: "testDownload",
  37157. value: function testDownload(e, t, i) {
  37158. var n = this.downloadTestResults[e];
  37159. if (n) return void (n === this.freeze.Success ? i(!0) : n === this.freeze.Fail && i(!1));
  37160. this.downloadTestResults[e] = this.freeze.Testing;
  37161. var r = this.panos.list[0],
  37162. o = this.getTileUrl(r, e, t, 0),
  37163. a = function (t) {
  37164. this.downloadTestResults[e] = this.freeze.Success, i(!0);
  37165. }.bind(this),
  37166. s = function () {
  37167. this.downloadTestResults[e] = this.freeze.Fail, i(!1);
  37168. }.bind(this);
  37169. this.loadImage(o, 0, a, s);
  37170. }
  37171. }, {
  37172. key: "startDownload",
  37173. value: function startDownload(e) {
  37174. //开始下载啦
  37175. e.status = DownloadStatus.Downloading;
  37176. var t = this.getTileUrl(e.pano, e.panoSize, e.tileSize, e.tileIndex);
  37177. this.activeDownloads.push(e);
  37178. this.loadImage(t, TileDownloader.DOWNLOAD_RETRIES, this.downloadComplete.bind(this, e), this.downloadFailed.bind(this, e)); //console.log('startDownload', e.pano.id, e.panoSize, e.tileSize, e.tileIndex)
  37179. } // //xst,加载一个点的所有图片
  37180. // loadAllImgsForOnePano(pano,size){
  37181. // if(!size){
  37182. // size = 2048
  37183. // }
  37184. // //是否存在
  37185. // this.downloadDescriptor
  37186. // let queue = this.getTileDownloadDescriptors(pano, size)
  37187. // for(let i=0;i<queue.length;++i){
  37188. // this.forceQueue.push(queue[i]);
  37189. // }
  37190. // this.processQueueForDownloading(this.forceQueue, !0)
  37191. // //默认情况,显示2k图片
  37192. // //是否下载了
  37193. // const flag = isPanoDownloaded(pano,2048)
  37194. // if(!flag){
  37195. // //没有的话,开始下载
  37196. // e.status = DownloadStatus.Downloading
  37197. // var t = this.getTileUrl(e.pano.id, e.panoSize, e.tileSize, e.tileIndex, e.pano.alignmentType) //xzw add alignmentType
  37198. // this.activeDownloads.push(e)
  37199. // this.loadImage(t, TileDownloader.DOWNLOAD_RETRIES, this.downloadComplete.bind(this, e), this.downloadFailed.bind(this, e))
  37200. // }
  37201. // }
  37202. }, {
  37203. key: "downloadFailed",
  37204. value: function downloadFailed(e, t) {
  37205. e.pano.tileError = true;
  37206. console.warn(t);
  37207. this.emit(TileDownloaderEvents.TileDownloadFailure);
  37208. }
  37209. }, {
  37210. key: "downloadComplete",
  37211. value: function downloadComplete(e, t) {
  37212. if (e.panoGroupId === this.panoGroupId) {
  37213. var i = this.getPanoLoadCallbacks(e.pano, e.panoSize);
  37214. e.status = DownloadStatus.Downloaded, i && i.onProgress && i.onProgress(e.pano, e.panoSize);
  37215. var n = {
  37216. panoId: e.pano.id,
  37217. image: t,
  37218. tileSize: e.tileSize,
  37219. panoSize: e.panoSize,
  37220. tileIndex: e.tileIndex,
  37221. faceTileIndex: e.faceTileIndex,
  37222. totalTiles: e.totalTiles,
  37223. face: e.face,
  37224. tileX: e.tileX,
  37225. tileY: e.tileY,
  37226. direction: e.direction
  37227. };
  37228. e.image = t, this.emit(TileDownloaderEvents.TileDownloadSuccess, n), this.isPanoDownloaded(e.pano, e.panoSize) && (n = {
  37229. panoId: e.pano.id,
  37230. tileSize: e.tileSize,
  37231. panoSize: e.panoSize
  37232. }, this.emit(TileDownloaderEvents.PanoDownloadComplete, n), i && i.onLoad && i.onLoad(e.pano, e.panoSize)); //console.log('下载成功')
  37233. }
  37234. }
  37235. }, {
  37236. key: "isPanoDownloaded",
  37237. value: function isPanoDownloaded(e, t) {
  37238. var i = this.getTileDownloadDescriptors(e, t);
  37239. if (i.length <= 0) return !1;
  37240. for (var n = 0; n < i.length; n++) {
  37241. var r = i[n];
  37242. if (r.status !== DownloadStatus.Downloaded) return !1;
  37243. }
  37244. return !0;
  37245. }
  37246. }, {
  37247. key: "setPanoLoadCallbacks",
  37248. value: function setPanoLoadCallbacks(e, t, i, n, r) {
  37249. var o = e.id + ':' + this.$app.core.get('QualityManager').getPanoSize(t);
  37250. this.panoLoadCallbacks[o] = {
  37251. onLoad: i,
  37252. onFail: n,
  37253. onProgress: r
  37254. };
  37255. }
  37256. }, {
  37257. key: "getPanoLoadCallbacks",
  37258. value: function getPanoLoadCallbacks(e, t) {
  37259. var i = e.id + ':' + t;
  37260. return this.panoLoadCallbacks[i];
  37261. }
  37262. }, {
  37263. key: "buildDownloadDescriptorArray",
  37264. value: function buildDownloadDescriptorArray(e) {
  37265. for (var t = TileUtils.getTileCountForSize(e), i = [], n = 0; n < t; n++) {
  37266. var r = this.buildDownloadDescriptor();
  37267. i.push(r);
  37268. }
  37269. return i;
  37270. }
  37271. }, {
  37272. key: "buildDownloadDescriptor",
  37273. value: function buildDownloadDescriptor() {
  37274. var e = {
  37275. panoGroupId: null,
  37276. pano: null,
  37277. panoSize: -1,
  37278. tileSize: -1,
  37279. tileIndex: -1,
  37280. totalTiles: -1,
  37281. faceTileIndex: -1,
  37282. status: DownloadStatus.None,
  37283. url: null,
  37284. image: null,
  37285. direction: new THREE.Vector3(),
  37286. face: -1,
  37287. cubeFace: -1,
  37288. tileX: -1,
  37289. tileY: -1
  37290. };
  37291. return e;
  37292. }
  37293. }, {
  37294. key: "initTileDownloadDescriptors",
  37295. value: function initTileDownloadDescriptors(e, t, i) {
  37296. for (var n = 0; n < e.length; n++) {
  37297. var r = e[n];
  37298. this.initTileDownloadDescriptor(r, t, i, n);
  37299. }
  37300. }
  37301. }, {
  37302. key: "initTileDownloadDescriptor1",
  37303. value: function initTileDownloadDescriptor1(e, t, i, n) {
  37304. var r = i >= TileUtils.TILE_SIZE ? TileUtils.TILE_SIZE : i;
  37305. e.face = TileUtils.getFaceForTile(i, n);
  37306. e.cubeFace = panorama.mapFaceToCubemapFace(e.face);
  37307. e.panoGroupId = this.panoGroupId;
  37308. e.pano = t;
  37309. e.panoSize = i;
  37310. e.tileSize = r;
  37311. e.tileIndex = n;
  37312. e.totalTiles = TileUtils.getTileCountForSize(i);
  37313. e.status = DownloadStatus.None;
  37314. e.image = null;
  37315. TileUtils.getTileLocation(e.panoSize, e.tileIndex, e);
  37316. TileUtils.getTileVector(e.panoSize, e.tileSize, e.cubeFace, e.tileX, e.tileY, TileUtils.LocationOnTile.Center, 0, e.direction);
  37317. }
  37318. }, {
  37319. key: "initTileDownloadDescriptor",
  37320. value: function initTileDownloadDescriptor(desc, pano, size, index) {
  37321. var r = size >= TileUtils.TILE_SIZE ? TileUtils.TILE_SIZE : size;
  37322. desc.face = TileUtils.getFaceForTile(size, index); //根据顺序得到的face的index
  37323. desc.cubeFace = TileUtils.mapFaceToCubemapFace(desc.face); //为了贴图而转化的face index
  37324. desc.panoGroupId = this.panoGroupId; //就是场景号
  37325. desc.pano = pano;
  37326. desc.panoSize = size;
  37327. desc.tileSize = r; //瓦片图size 512
  37328. desc.tileIndex = index;
  37329. desc.status = DownloadStatus.None;
  37330. desc.image = null; //xzw
  37331. if (size == 6144) {
  37332. //desc.panoSize = 6144 //4096 * 1.5
  37333. desc.tileSize = 768; //512 * 1.5
  37334. }
  37335. desc.totalTiles = TileUtils.getTileCountForSize(size);
  37336. TileUtils.getTileLocation(desc.panoSize, desc.tileIndex, desc); //得到该tile在这个face中的具体位置(tileX等)
  37337. TileUtils.getTileVector(desc.panoSize, desc.tileSize, desc.cubeFace, desc.tileX, desc.tileY, TileUtils.LocationOnTile.Center, 0, desc.direction);
  37338. }
  37339. }, {
  37340. key: "loadImage",
  37341. value: function loadImage(e, t, i, n) {
  37342. http.getImage(e, t).then(function (e) {
  37343. i(e);
  37344. }).fail(n);
  37345. }
  37346. }, {
  37347. key: "getTiles",
  37348. value: function getTiles(d) {
  37349. return this.urls.get(d); //config.urls.tileImgPath+d;
  37350. }
  37351. }]);
  37352. return TileDownloader;
  37353. }(EventEmitter), _class.IDLE_REFRESH_DELAY = 500, _class.ACTIVE_REFRESH_DELAY = 16, _class.DOWNLOAD_RETRIES = 4, _temp;
  37354. });
  37355. function Node$1(e, t) {
  37356. this.tree = e, this.parent = t, this.children = [], this.id = ++u;
  37357. }
  37358. function o$2(e, t, i, r, a, s, l, h) {
  37359. if (e) {
  37360. l = l || TileTree.TraversalType.PreOrder;
  37361. var u = r * c$1 + i;
  37362. if (l === TileTree.TraversalType.PreOrder && (a && a(e, t, u, i, r), s && s.push(e)), e.children && 0 !== e.children.length) {
  37363. for (var d = r * c$1, p = i * c$1, f = 0; f < c$1; f++) {
  37364. for (var g = 0; g < c$1; g++) {
  37365. o$2(e.children[g * c$1 + f], t + 1, p + f, d + g, a, s, l);
  37366. }
  37367. }
  37368. l === TileTree.TraversalType.PostOrder && (a && a(e, t, u, i, r), s && s.push(e));
  37369. }
  37370. }
  37371. }
  37372. function Plant(seed) {
  37373. seed.root = Branch(seed, null, 0);
  37374. }
  37375. function Branch(seed, parent, level) {
  37376. if (level > seed.levels) return null;
  37377. var node = new Node$1(seed, parent);
  37378. seed.allNodes.push(node);
  37379. for (var o = 0; o < h; o++) {
  37380. node.children[o] = Branch(seed, node, level + 1);
  37381. }
  37382. return node;
  37383. }
  37384. function l$2(parent, t, level, n, r) {
  37385. if (!parent) return null;
  37386. if (0 === level) return parent;
  37387. if (!parent.children || 0 === parent.children.length) return null;
  37388. var o = Math.pow(c$1, level),
  37389. a = o / c$1,
  37390. s = n % a,
  37391. h = r % a,
  37392. u = Math.floor(r / a),
  37393. d = Math.floor(n / a),
  37394. p = u * c$1 + d,
  37395. f = parent.children[p];
  37396. return l$2(f, t + 1, level - 1, s, h);
  37397. }
  37398. /* cube每个面都有一个分层树 用于代表瓦片图的细分?
  37399. 树4096的分为三层,每层有4个子节点。(最后一层的四个子节点都是null)
  37400. */
  37401. var c$1 = 2,
  37402. h = c$1 * c$1; //4个子节点
  37403. var u = 0;
  37404. var TileTree = /*#__PURE__*/function () {
  37405. function TileTree(e, t) {
  37406. _classCallCheck(this, TileTree);
  37407. this.levels = t, this.tileSize = e, this.root = null, this.allNodes = [], Plant(this);
  37408. }
  37409. _createClass(TileTree, [{
  37410. key: "getSubNode",
  37411. value: function getSubNode(e, t, i) {
  37412. (!t || e < this.tileSize) && (t = 0), (!i || e < this.tileSize) && (i = 0), e < this.tileSize && (e = this.tileSize);
  37413. var level = TileTree.getLevelCountForSize(this.tileSize, e),
  37414. o = l$2(this.root, 0, level, t, i);
  37415. return o;
  37416. }
  37417. }, {
  37418. key: "breadthFirst",
  37419. value: function breadthFirst(e) {
  37420. //广度优先搜索
  37421. e = e || {};
  37422. var t = !!e.nullLevelEnd,
  37423. i = e.maxLevel,
  37424. n = e.minLevel,
  37425. r = e.callback,
  37426. o = e.saveVisited,
  37427. a = [],
  37428. s = {},
  37429. l = 0;
  37430. for (a.push(this.root), a.push(s); a.length > 0 && !(i && l > i);) {
  37431. var h = a.shift();
  37432. if (h === s) (!n || l >= n) && (r && t && r(null), o && t && o.push(null)), a.length > 0 && a.push(s), l++;else {
  37433. if (h.children) for (var u = 0; u < h.children.length; u++) {
  37434. var d = h.children[u];
  37435. d && a.push(h.children[u]);
  37436. }
  37437. var p = this.getFaceIndexFromNode(h);
  37438. (!n || l >= n) && (r && r(h, l, p), o && o.push(h));
  37439. }
  37440. }
  37441. }
  37442. }, {
  37443. key: "getFaceIndexFromNode",
  37444. value: function getFaceIndexFromNode(e) {
  37445. if (!e) return -1;
  37446. for (var t = 1, i = e, n = 0, r = 0;;) {
  37447. var o = i.parent;
  37448. if (!o) break;
  37449. for (var a = -1, s = 0; s < o.children.length; s++) {
  37450. o.children[s] === i && (a = s);
  37451. }
  37452. var l = a % c$1,
  37453. h = Math.floor(a / c$1);
  37454. n = l * t + n, r = h * t + r, t *= c$1, i = o;
  37455. }
  37456. return r * t + n;
  37457. }
  37458. }, {
  37459. key: "depthFirst",
  37460. value: function depthFirst(e, t, i) {
  37461. o$2(this.root, 0, 0, 0, e, t, i, this.tileSize);
  37462. }
  37463. }]);
  37464. return TileTree;
  37465. }();
  37466. TileTree.TraversalType = Object.freeze({
  37467. PreOrder: 0,
  37468. PostOrder: 1
  37469. });
  37470. TileTree.getLevelCountForSize = function (tileSize, size) {
  37471. //512->0 2024->1
  37472. var i = 0;
  37473. for (size < tileSize && (size = tileSize);;) {
  37474. if (size /= c$1, size < tileSize) break;
  37475. i++;
  37476. }
  37477. return i;
  37478. };
  37479. TileTree.getSizeForLevel = function (e, t) {
  37480. return Math.pow(c$1, t) * e;
  37481. };
  37482. /*
  37483. 旧:
  37484. window.TileTree = function (e, t) {
  37485. ;(this.levels = t), (this.tileSize = e), (this.root = null), (this.allNodes = []), a(this)
  37486. }
  37487. function r(e, t) {
  37488. ;(this.tree = e), (this.parent = t), (this.children = []), (this.id = ++u)
  37489. }
  37490. function o(e, t, i, r, a, s, l, h) {
  37491. if (e) {
  37492. l = l || TileTree.TraversalType.PreOrder
  37493. var u = r * c + i
  37494. if ((l === TileTree.TraversalType.PreOrder && (a && a(e, t, u, i, r), s && s.push(e)), e.children && 0 !== e.children.length)) {
  37495. for (var d = r * c, p = i * c, f = 0; f < c; f++) for (var g = 0; g < c; g++) o(e.children[g * c + f], t + 1, p + f, d + g, a, s, l, h)
  37496. l === TileTree.TraversalType.PostOrder && (a && a(e, t, u, i, r), s && s.push(e))
  37497. }
  37498. }
  37499. }
  37500. function a(e) {
  37501. e.root = s(e, null, 0)
  37502. }
  37503. function s(e, t, i) {
  37504. if (i > e.levels) return null
  37505. var n = new r(e, t)
  37506. e.allNodes.push(n)
  37507. for (var o = 0; o < h; o++) n.children[o] = s(e, n, i + 1)
  37508. return n
  37509. }
  37510. function l(e, t, i, n, r) {
  37511. if (!e) return null
  37512. if (0 === i) return e
  37513. if (!e.children || 0 === e.children.length) return null
  37514. var o = Math.pow(c, i),
  37515. a = o / c,
  37516. s = n % a,
  37517. h = r % a,
  37518. u = Math.floor(r / a),
  37519. d = Math.floor(n / a),
  37520. p = u * c + d,
  37521. f = e.children[p]
  37522. return l(f, t + 1, i - 1, s, h)
  37523. }
  37524. var c = 2,
  37525. h = c * c
  37526. TileTree.TraversalType = Object.freeze({
  37527. PreOrder: 0,
  37528. PostOrder: 1,
  37529. })
  37530. var u = 0
  37531. ;(TileTree.getLevelCountForSize = function (e, t) {
  37532. var i = 0
  37533. for (t < e && (t = e); ; ) {
  37534. if (((t /= c), t < e)) break
  37535. i++
  37536. }
  37537. return i
  37538. }),
  37539. (TileTree.getSizeForLevel = function (e, t) {
  37540. return Math.pow(c, t) * e
  37541. }),
  37542. (TileTree.prototype.getSubNode = function (e, t, i) {
  37543. ;(!t || e < this.tileSize) && (t = 0), (!i || e < this.tileSize) && (i = 0), e < this.tileSize && (e = this.tileSize)
  37544. var r = TileTree.getLevelCountForSize(this.tileSize, e),
  37545. o = l(this.root, 0, r, t, i)
  37546. return o
  37547. }),
  37548. (TileTree.prototype.breadthFirst = function (e) {
  37549. e = e || {}
  37550. var t = !!e.nullLevelEnd,
  37551. i = e.maxLevel,
  37552. n = e.minLevel,
  37553. r = e.callback,
  37554. o = e.saveVisited,
  37555. a = [],
  37556. s = {},
  37557. l = 0,
  37558. c = 0
  37559. for (a.push(this.root), a.push(s); a.length > 0 && !(i != void 0 && l > i); ) {
  37560. var h = a.shift()
  37561. if (h === s) (!n || l >= n) && (r && t && r(null), o && t && o.push(null)), a.length > 0 && a.push(s), l++, (c = 0)
  37562. else {
  37563. if (h.children)
  37564. for (var u = 0; u < h.children.length; u++) {
  37565. var d = h.children[u]
  37566. d && a.push(h.children[u])
  37567. }
  37568. var p = this.getFaceIndexFromNode(h)
  37569. ;(!n || l >= n) && (r && r(h, l, p), o && o.push(h)), c++
  37570. }
  37571. }
  37572. }),
  37573. (TileTree.prototype.getFaceIndexFromNode = function (e) {
  37574. if (!e) return -1
  37575. for (var t = 1, i = e, n = 0, r = 0; ; ) {
  37576. var o = i.parent
  37577. if (!o) break
  37578. for (var a = -1, s = 0; s < o.children.length; s++) o.children[s] === i && (a = s)
  37579. var l = a % c,
  37580. h = Math.floor(a / c)
  37581. ;(n = l * t + n), (r = h * t + r), (t *= c), (i = o)
  37582. }
  37583. return r * t + n
  37584. }),
  37585. (TileTree.prototype.depthFirst = function (e, t, i) {
  37586. o(this.root, 0, 0, 0, e, t, i, this.tileSize)
  37587. })
  37588. export default TileTree
  37589. */
  37590. 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); }; }
  37591. 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; } }
  37592. function createDescriptor() {
  37593. var e = {
  37594. renderTarget: null,
  37595. inUse: !1,
  37596. size: -1,
  37597. pano: null
  37598. };
  37599. return e;
  37600. }
  37601. /*
  37602. 测试崩溃时,最好每次都清除缓存,因为清除后不容易崩溃了
  37603. */
  37604. function getMaxCount($app) {
  37605. var isMobile = $app.config.mobile,
  37606. maxCount;
  37607. if (isMobile) {
  37608. //手机的gpu相比cpu可能弱的多,个数要降低
  37609. maxCount = common$1.getBestCount({
  37610. name: 'maxTileRender',
  37611. minCount: 0,
  37612. maxCount: 4,
  37613. durBound1: 1,
  37614. durBound2: 4,
  37615. ifLog: false,
  37616. maxHistory: 3
  37617. });
  37618. } else {
  37619. maxCount = common$1.getBestCount({
  37620. name: 'maxTileRender',
  37621. minCount: 0,
  37622. maxCount: 6,
  37623. durBound1: 1,
  37624. durBound2: 6,
  37625. ifLog: false,
  37626. maxHistory: 2
  37627. });
  37628. }
  37629. return maxCount;
  37630. }
  37631. function upload() {
  37632. if (!this.uploadIntervalCancelled) {
  37633. b$1 = !0;
  37634. /* let flying = this.$app.core.get('Player').flying
  37635. let isMobile = this.$app.config.mobile
  37636. let maxNonBaseUploadsPerFrame = (flying || isMobile) ? 1 : 2 //this.maxNonBaseUploadsPerFrame //原先2。这是每帧uploadTile非512的瓦片tex的数量。之前的2太卡了,降为1。(检测卡顿方法:在一个pano点旋转至所有2048的tile都加载完,然后之后到这个点看看卡不卡。因为该点tiles都下载完了所以会在飞过来时陆续都加载,所以容易卡)
  37637. let maxBaseUploadsPerFrame = flying ? (isMobile ? 1 : 3) : 6//this.maxBaseUploadsPerFrame //原先6. 但持续前进过程中会请求加载下一个漫游图,一次加6张会卡的。
  37638. this.updateUploadQueue(maxNonBaseUploadsPerFrame, maxBaseUploadsPerFrame)
  37639. let time = flying ? 20 : 15 //w // 飞行有时候会卡,增长间隔 */
  37640. var maxCount = getMaxCount(this.$app);
  37641. this.updateUploadQueue(2, 6, maxCount);
  37642. var time = 16;
  37643. this.peekNextFromUploadQueue() ? this.refreshUploadInterval(time) : this.uploadInterval = null; //定时下一次更新
  37644. /* this.updateUploadQueue(this.maxNonBaseUploadsPerFrame, this.maxBaseUploadsPerFrame),
  37645. this.peekNextFromUploadQueue() ? this.refreshUploadInterval(w) : (this.uploadInterval = null)
  37646. */
  37647. }
  37648. }
  37649. var b$1 = !1,
  37650. w$1 = settings$3.tiling.uploadIntervalDelay,
  37651. _ = settings$3.tiling.initialIntervalDelay,
  37652. T$1 = settings$3.tiling.maxNonBaseUploadsPerFrame,
  37653. x$2 = settings$3.tiling.maxBaseUploadsPerFrame,
  37654. S = {
  37655. Base: 0,
  37656. Remaining: 1
  37657. };
  37658. /* ,
  37659. M = []; */
  37660. defineComponent('PanoRenderer', function () {
  37661. return /*#__PURE__*/function (_EventEmitter) {
  37662. _inherits(PanoRenderer, _EventEmitter);
  37663. var _super = _createSuper$15(PanoRenderer);
  37664. function PanoRenderer(index) {
  37665. var _this;
  37666. _classCallCheck(this, PanoRenderer);
  37667. _this = _super.call(this);
  37668. _this.updateActivePanos = function () {
  37669. var e = [];
  37670. return function (t, i) {
  37671. e.length = 0;
  37672. for (var n = 0; n < this.activePanos.length; n++) {
  37673. t && e.length === i && e.push(t);
  37674. var r = this.activePanos[n],
  37675. o = this.getActiveRenderTargetDescriptor(r.id);
  37676. t && r.id === t.id || !this.isRenderTargetDescriptorValid(o) || e.push(r);
  37677. }
  37678. t && i >= e.length && e.push(t), this.activePanos.length = 0, this.activePanos.push.apply(this.activePanos, e);
  37679. };
  37680. }();
  37681. _this.renderPanoTiles = function () {
  37682. var e = [];
  37683. return function (panoId, i, n, r, quality) {
  37684. this.zoomRenderTarget && this.zoomRenderTarget.width === this.$app.core.get('QualityManager').getMaxZoomPanoSize() || this.zoomPanoRenderingDisabled || this.setupZoomRenderTarget(), i = i || this.direction || Vectors.FORWARD;
  37685. var o = this.getActiveRenderTargetDescriptor(panoId);
  37686. if (!this.isRenderTargetDescriptorValid(o)) console.error('PanoRenderer.renderPanoTiles() -> Cannot render to a pano that is not activated.');
  37687. for (var a = 0; a < TileUtils.FACES_PER_PANO; a++) {
  37688. var s = this.getTileTree(panoId, a);
  37689. e.length = 0;
  37690. s.breadthFirst({
  37691. //获取所有node, 从512到4096的共85个tiles
  37692. saveVisited: e,
  37693. maxLevel: quality ? quality == 512 ? 0 : quality == 1024 ? 1 : quality == 2048 ? 2 : 3 : 3
  37694. });
  37695. var dontDraw = this.$app.config.mobile && this.$app.core.get('Player').mode == 'panorama'; //从外面飞入时似乎不容易崩溃,直接加载吧否则等很久
  37696. for (var l = 0; l < e.length; l++) {
  37697. var c = e[l];
  37698. this.queueTileUpload(c.tile, !1, !dontDraw && (r || 0 === l && n)); //isMobile手机端不直接uploadTile base的6张贴图, 容易卡甚至崩溃
  37699. }
  37700. }
  37701. this.updateDirection(i);
  37702. };
  37703. }();
  37704. _this.getNextFromUploadQueue = function () {
  37705. //获取第一项并在列表中删除它
  37706. var e = function e(_e) {
  37707. var t = _e.shift();
  37708. return t.uploadQueued = !1, t;
  37709. };
  37710. return function () {
  37711. if (this.forceQueue.length > 0) return e(this.forceQueue);
  37712. var t = this.getTopUploadQueue();
  37713. return t && t.length > 0 ? e(t) : null;
  37714. };
  37715. }();
  37716. _this.refreshUploadInterval = function () {
  37717. var e = null;
  37718. return function (t) {
  37719. if (!this.uploadIntervalCancelled) {
  37720. e || (e = upload.bind(this));
  37721. null !== t && void 0 !== t || (t = w$1);
  37722. b$1 || (t = _);
  37723. this.uploadInterval = window.setTimeout(e, t);
  37724. this.uploadIntervalDelay = t;
  37725. }
  37726. };
  37727. }();
  37728. _this.update = function () {
  37729. this.uploadIntervalCancelled = true; //不使用setTimeout,而是在sceneRenderer每帧都update
  37730. this.$app.core.get('Player').lastFrameChanged;
  37731. var maxCount = getMaxCount(this.$app); //注:静止时看不出卡顿所以全速加载
  37732. this.updateUploadQueue(2, 6, maxCount);
  37733. };
  37734. _this.uploadTile = function () {
  37735. var collection = {},
  37736. overlayStyle = settings$3.tiling.overlayStyle;
  37737. var failHistory = {};
  37738. return function (info, n) {
  37739. var _this2 = this;
  37740. var sceneRenderer = this.index == 1 ? this.sceneRenderer2 : this.$app.core.get('SceneRenderer');
  37741. var id = info.panoId,
  37742. img = info.image,
  37743. tileSize = info.tileSize,
  37744. panoSize = info.panoSize,
  37745. tileIndex = info.tileIndex,
  37746. totalTiles = info.totalTiles,
  37747. tileX = info.tileX,
  37748. tileY = info.tileY,
  37749. p = !0,
  37750. g = !1,
  37751. ignore = false,
  37752. //add
  37753. LodDescripor = (this.getPanoDescriptor(id), this.getPanoLODDescriptor(id, panoSize)),
  37754. activeDescripor = this.getActiveRenderTargetDescriptor(id),
  37755. renderTarget = activeDescripor.renderTarget,
  37756. size = activeDescripor.size; //当前要渲染的面的分辨率,也就是MaxNavPanoSize
  37757. if (this.isPanoZoomed(id) && this.zoomRenderTarget) {
  37758. renderTarget = this.zoomRenderTarget;
  37759. size = this.zoomRenderTarget.width; //this.qualityManager.getMaxZoomPanoSize(); //放大后可能2048或4096
  37760. }
  37761. var done = function done() {
  37762. if (!LodDescripor.uploaded.includes(tileIndex)) {
  37763. //已经upload过(本来这时候直接返回,但发现缩放后这不会归零,导致清晰度不更新,所以还是redraw且emit吧)
  37764. //console.log('try to reupload and return',tileIndex)
  37765. LodDescripor.uploaded.push(tileIndex);
  37766. LodDescripor.uploadCount++;
  37767. }
  37768. _this2.emit(PanoRendererEvents.TileRenderSuccess, id, panoSize, tileIndex, totalTiles);
  37769. LodDescripor.uploadCount === totalTiles && _this2.emit(PanoRendererEvents.PanoRenderComplete, id, panoSize, totalTiles);
  37770. _this2.setUploaded(info, !0);
  37771. _this2.addCoverageForNode(info.node);
  37772. };
  37773. {
  37774. this.isRenderTargetDescriptorValid(activeDescripor) || (p = !1, g = !1);
  37775. if (!n) {
  37776. if (this.anyUploaded(info.node)) {
  37777. p = !1, g = !0;
  37778. ignore = true;
  37779. }
  37780. this.isTileUploaded(info) && (p = !1, g = !1, ignore = true);
  37781. }
  37782. }
  37783. if (p) {
  37784. /* if(failHistory[id+':'+ panoSize+ ':' +tileIndex]){
  37785. console.log('uploadTile retry',id, panoSize, tileIndex)
  37786. } */
  37787. // console.log('uploadTile 成功', id, panoSize, tileIndex)
  37788. var C = tileX * tileSize,
  37789. I = tileY * tileSize,
  37790. E = tileSize / panoSize * size,
  37791. // tile在renderTarget上渲染出的宽度
  37792. b = C / panoSize * size,
  37793. // tile在renderTarget上渲染的startX
  37794. w = I / panoSize * size; // tile在renderTarget上渲染的startY
  37795. if (panoSize > this.$app.core.get('QualityManager').maxRenderTargetSize) {
  37796. //4096 改
  37797. //var tex = sceneRenderer.initSizedTexture2D(tileSize, THREE.ClampToEdgeWrapping)
  37798. //var loaded = this.$app.core.get('Player').model.isHighMapLoaded(info.cubeFace, tileX, tileY)
  37799. this.$app.core.get('Player').model.getHighImage(img, info.cubeFace, tileX, tileY);
  37800. } else {
  37801. collection[tileSize] || (collection[tileSize] = sceneRenderer.initSizedTexture2D(tileSize, THREE.ClampToEdgeWrapping));
  37802. var tex = collection[tileSize];
  37803. sceneRenderer.uploadTexture2D(img, tex, 0, 0, tileSize, tileSize); //只替换tex对应的img,不新建
  37804. if (1 === overlayStyle || 2 === overlayStyle) {
  37805. var T = 1 === overlayStyle ? this.overlayTilesBasic : this.overlayTilesEnhanced;
  37806. sceneRenderer.renderToCubeMap(tex, renderTarget, tileSize, tileSize, 0, 0, tileSize, tileSize, b, w, E, E, info.cubeFace);
  37807. sceneRenderer.renderToCubeMap(T[panoSize], renderTarget, tileSize, tileSize, 0, 0, tileSize, tileSize, b, w, E, E, info.cubeFace, THREE.NormalBlending, !0, 0.5);
  37808. } else {
  37809. sceneRenderer.renderToCubeMap(tex, renderTarget, tileSize, tileSize, 0, 0, tileSize, tileSize, b, w, E, E, info.cubeFace);
  37810. }
  37811. }
  37812. done();
  37813. } else if (ignore) {
  37814. //console.log('finish because anyUploaded',id,panoSize,tileIndex)
  37815. done(); //改: 如果因为这部分更高清的贴图已加载所以才不绘制的话,直接完成
  37816. } else {
  37817. /* console.log('uploadTile 失败', id, panoSize, tileIndex)
  37818. if(panoSize == 512){
  37819. console.log("!!!!!!!!!!!!!")
  37820. } */
  37821. failHistory[id + ':' + panoSize + ':' + tileIndex] = true;
  37822. this.setUploaded(info, !1);
  37823. }
  37824. info.uploadAttempted || (LodDescripor.uploadAttempts++, this.emit(PanoRendererEvents.TileUploadAttempted, id, panoSize, tileIndex, totalTiles)), info.uploadAttempted = !0;
  37825. LodDescripor.uploadAttempts === totalTiles && this.emit(PanoRendererEvents.UploadAttemptedForAllTiles, id, panoSize, totalTiles);
  37826. return g;
  37827. };
  37828. }();
  37829. _this.tileDirectory = {};
  37830. _this.activeRenderTargetDescriptors = {};
  37831. _this.activePanos = [];
  37832. _this.panoLODDescriptors = {};
  37833. _this.panoDescriptors = {};
  37834. _this.tileTrees = {};
  37835. _this.forceQueue = [];
  37836. _this.uploadQueues = {};
  37837. _this.uploadInterval = null;
  37838. _this.uploadIntervalCancelled = !1;
  37839. _this.usingTileOverlay = !1;
  37840. _this.overlayTilesLoaded = !1;
  37841. _this.overlayTileBase = null;
  37842. _this.overlayTilesBasic = {};
  37843. _this.overlayTilesEnhanced = {};
  37844. _this.zoomRenderTarget = null; //用于缩放的rendertarget
  37845. _this.zoomPano = null;
  37846. _this.zoomingActive = !1;
  37847. _this.zoomPanoId = null;
  37848. _this.zoomPanoRenderingDisabled = !1;
  37849. _this.direction = new THREE.Vector3();
  37850. _this.initTime = -1;
  37851. _this.maxBaseUploadsPerFrame = x$2;
  37852. _this.maxNonBaseUploadsPerFrame = T$1;
  37853. _this.M = []; //move M to here 似乎列表里会有两个
  37854. _this.index = index || 0; //改
  37855. return _this;
  37856. }
  37857. _createClass(PanoRenderer, [{
  37858. key: "init",
  37859. value: function init(e, t, i) {
  37860. if (this.index == 1) {
  37861. this.sceneRenderer2 = e;
  37862. this.tileDownloader2 = t;
  37863. }
  37864. this.initTime = performance.now();
  37865. this.bindEvents();
  37866. }
  37867. }, {
  37868. key: "getActivePanoTextures",
  37869. value: function getActivePanoTextures(e) {
  37870. e = e || [];
  37871. for (var t = 0; t < M.length; t++) {
  37872. var i = M[t];
  37873. i.renderTarget && i.renderTarget.texture && e.push(i.renderTarget.texture);
  37874. }
  37875. }
  37876. }, {
  37877. key: "hasQueuedTiles",
  37878. value: function hasQueuedTiles() {
  37879. var e = this.peekNextFromUploadQueue();
  37880. return null !== e && void 0 !== e;
  37881. }
  37882. }, {
  37883. key: "getActiveRenderTargetDescriptor",
  37884. value: function getActiveRenderTargetDescriptor(e) {
  37885. return this.activeRenderTargetDescriptors[e];
  37886. }
  37887. }, {
  37888. key: "setActiveRenderTargetDescriptor",
  37889. value: function setActiveRenderTargetDescriptor(e, t) {
  37890. this.activeRenderTargetDescriptors[e] = t;
  37891. }
  37892. }, {
  37893. key: "bindEvents",
  37894. value: function bindEvents() {
  37895. this.index == 1 ? this.tileDownloader2.on(TileDownloaderEvents.TileDownloadSuccess, this.onTileDownloaded.bind(this)) : this.$app.core.get('TileDownloader').on(TileDownloaderEvents.TileDownloadSuccess, this.onTileDownloaded.bind(this));
  37896. }
  37897. }, {
  37898. key: "setupZoomRenderTarget",
  37899. value: function setupZoomRenderTarget() {
  37900. var QualityManager = this.$app.core.get('QualityManager');
  37901. if (QualityManager.maxRenderTargetSize == 2048 && QualityManager.getMaxNavPanoSize() == 2048) return; //不使用zoomTarget 直接用pano的tiledPanoRenderTarget,防崩溃
  37902. //if (QualityManager.getMaxZoomPanoSize() >= QualityManager.getMaxNavPanoSize() && (QualityManager.tileClass != '2k' || QualityManager.tileClass != '1k')) {
  37903. if (QualityManager.tileClass > QualityManager.navTileClass) {
  37904. //如果tileClass=='4k'即使还没加载出4k也先创建2k的Target
  37905. //部分手机2k时copyCubeMap会重载 , 所以如果没有超出当前分辨率,就不使用zoomRenderTarget。但在微信依旧会重载,只是优化了些,safari几乎不会。
  37906. var sceneRenderer = this.index == 1 ? this.sceneRenderer2 : this.$app.core.get('SceneRenderer');
  37907. if (this.zoomRenderTarget && this.zoomRenderTarget.width === QualityManager.getMaxZoomPanoSize()) return;
  37908. var e = this.zoomRenderTarget;
  37909. var size = QualityManager.getMaxZoomPanoSize();
  37910. if (size > QualityManager.maxRenderTargetSize) {
  37911. return;
  37912. }
  37913. this.zoomRenderTarget = this.initTiledPano(QualityManager.getMaxZoomPanoSize(), !1);
  37914. if (e) {
  37915. //将旧的zoomRenderTarget渲染到新zoomRenderTarget上
  37916. var t = e.width,
  37917. i = this.zoomRenderTarget.width;
  37918. sceneRenderer.copyCubeMap(e.texture, this.zoomRenderTarget, t, t, i, i);
  37919. e.texture.dispose();
  37920. e.texture.loaded = !1;
  37921. e.texture.version = 0;
  37922. sceneRenderer.deallocateCubeTexture(e.texture);
  37923. e.texture = null;
  37924. }
  37925. this.zoomPanoRenderingDisabled = !1;
  37926. } else this.zoomPanoRenderingDisabled = !0;
  37927. }
  37928. }, {
  37929. key: "enableHighQuality",
  37930. value: function enableHighQuality(e) {
  37931. //xzw add 如果最多只要2k图的话enableUltraHighQualityMode替换成这个
  37932. if (!this.$app.core.get('QualityManager').highQualityModeStarted) {
  37933. this.setupZoomRenderTarget();
  37934. e();
  37935. this.$app.core.get('QualityManager').highQualityModeStarted = true;
  37936. }
  37937. }
  37938. }, {
  37939. key: "enableUltraHighQualityMode",
  37940. value: function enableUltraHighQualityMode(e) {
  37941. var QualityManager = this.$app.core.get('QualityManager');
  37942. if (QualityManager.tileClass == '2k' || QualityManager.tileClass == '1k') return this.enableHighQuality(e); //xzw add
  37943. if (!QualityManager.ultraHighQualityModeEnabled()) {
  37944. var t = QualityManager.getPanoSize(PanoSizeClass.ULTRAHIGH);
  37945. this.$app.core.get('TileDownloader').testDownload(t, this.tileClass == '6k' ? TileUtils.TILE_SIZE * 1.5 : TileUtils.TILE_SIZE, //改
  37946. function (t) {
  37947. if (t) {
  37948. this.$app.core.get('QualityManager').enableUltraHighQualityMode();
  37949. this.setupZoomRenderTarget();
  37950. e();
  37951. }
  37952. }.bind(this));
  37953. }
  37954. }
  37955. }, {
  37956. key: "activateTiledPano",
  37957. value: function activateTiledPano(pano, size, i, dontReSetTree) {
  37958. i && this.clearAllQueuedUploads();
  37959. if (!dontReSetTree) {
  37960. //重新initTileTree会重新uploadTile
  37961. for (var n = 0; n < TileUtils.FACES_PER_PANO; n++) {
  37962. this.initTileTree(pano.id, n, this.$app.core.get('QualityManager').getMaxPossiblePanoSize());
  37963. } //得到this.tileTrees[pano.id],arr[6]
  37964. this.linkAllTilesAndNodes(pano);
  37965. }
  37966. var r = this.getActiveRenderTargetDescriptor(pano.id),
  37967. l = size;
  37968. l > this.$app.core.get('QualityManager').getMaxNavPanoSize() && (l = this.$app.core.get('QualityManager').getMaxNavPanoSize());
  37969. if (!r || l !== r.size) {
  37970. r && this.deactiveDescripor(r.renderTarget);
  37971. r = this.activeDescripor(l);
  37972. if (!r) {
  37973. //console.log('创建cubeRenderTarget', size)
  37974. //var ren = this.initTiledPano(l, !this.$app.config.mobile /* !1 */) //xzw 但是有发现某个win7 ram4G的电脑会因抗锯齿在封面加载多3秒以上的时间。
  37975. var ren = this.initTiledPano(l, false);
  37976. r = this.initDescriptor(ren.width);
  37977. r.renderTarget = ren;
  37978. }
  37979. r.pano = pano;
  37980. this.resetPanoDescriptor(pano.id);
  37981. if (!dontReSetTree) {
  37982. this.resetPanoLODDescriptors(pano.id);
  37983. this.resetRenderStatus(pano.id, !0, !0);
  37984. }
  37985. }
  37986. this.setActiveRenderTargetDescriptor(pano.id, r);
  37987. var h = i ? 0 : 1;
  37988. this.updateActivePanos(pano, h); //console.log(`index:${this.viewer.index} ${r.renderTarget.texture.id} ${pano.id}`)
  37989. return r.renderTarget;
  37990. }
  37991. }, {
  37992. key: "deactivateTiledPano",
  37993. value: function deactivateTiledPano(e) {
  37994. var t = this.getActiveRenderTargetDescriptor(e.id);
  37995. if (this.isRenderTargetDescriptorValid(t)) {
  37996. this.deactiveDescripor(t.renderTarget);
  37997. this.setActiveRenderTargetDescriptor(e.id, null);
  37998. }
  37999. var i = this.getUploadQueueForPano(e.id);
  38000. this.clearUploadQueue(i);
  38001. this.updateActivePanos();
  38002. }
  38003. }, {
  38004. key: "getActivePanoCount",
  38005. value: function getActivePanoCount() {
  38006. return this.activePanos.length;
  38007. }
  38008. }, {
  38009. key: "resetRenderStatus",
  38010. value: function resetRenderStatus(e, t, i, n) {
  38011. var r = null;
  38012. n && (r = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, n) + 1);
  38013. for (var o = function o(e, n, r, _o) {
  38014. i && (n.tile.zoomUploaded = !1), t && (n.tile.uploaded = !1);
  38015. }, a = 0; a < TileUtils.FACES_PER_PANO; a++) {
  38016. var s = this.getTileTree(e, a);
  38017. s.breadthFirst({
  38018. callback: o.bind(this, a),
  38019. minLevel: r
  38020. });
  38021. }
  38022. }
  38023. }, {
  38024. key: "copyBaseRenderStatusToZoomed",
  38025. value: function copyBaseRenderStatusToZoomed(e) {
  38026. for (var t = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, this.$app.core.get('QualityManager').getMaxNavPanoSize()), i = function i(e, t, _i, n) {
  38027. t.tile.zoomUploaded = t.tile.uploaded, t.zoomCovered = t.covered; //标记
  38028. }, n = 0; n < TileUtils.FACES_PER_PANO; n++) {
  38029. var r = this.getTileTree(e, n);
  38030. r.breadthFirst({
  38031. callback: i.bind(this, n),
  38032. maxLevel: t
  38033. });
  38034. }
  38035. }
  38036. }, {
  38037. key: "isRenderTargetDescriptorValid",
  38038. value: function isRenderTargetDescriptorValid(e) {
  38039. return e && e.renderTarget;
  38040. }
  38041. }, {
  38042. key: "isPanoActive",
  38043. value: function isPanoActive(e) {
  38044. var t = this.getActiveRenderTargetDescriptor(e);
  38045. return this.isRenderTargetDescriptorValid(t);
  38046. }
  38047. }, {
  38048. key: "isPanoZoomed",
  38049. value: function isPanoZoomed(e) {
  38050. return this.zoomingActive && this.zoomPanoId === e;
  38051. }
  38052. }, {
  38053. key: "initTileTree",
  38054. value: function initTileTree(e, t, i) {
  38055. var n = this.tileTrees[e];
  38056. n || (n = [], this.tileTrees[e] = n);
  38057. var r = n[t];
  38058. if (!r) {
  38059. var o = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, i);
  38060. r = new TileTree(TileUtils.TILE_SIZE, o), n[t] = r;
  38061. }
  38062. }
  38063. }, {
  38064. key: "getTileTree",
  38065. value: function getTileTree(e, t) {
  38066. var i = this.tileTrees[e];
  38067. if (!i) console.error('PanoRenderer.getTileTree() -> Tree array not yet initialized!');
  38068. var n = i[t];
  38069. if (!n) console.error('PanoRenderer.getTileTree() -> Tree not yet initialized!');
  38070. return n;
  38071. }
  38072. /*
  38073. * 创建tile的renderTarget, 包括pano.tiledPanoRenderTarget和zoomRenderTarget
  38074. * @param {number} size 当前的panoSize,每个面的分辨率
  38075. */
  38076. }, {
  38077. key: "initTiledPano",
  38078. value: function initTiledPano(size, antialias) {
  38079. //创建 RenderTargetCube
  38080. var renderTarget = new THREE.WebGLCubeRenderTarget(size, {
  38081. stencilBuffer: !1,
  38082. //xzw add antialias , 手机可false
  38083. generateMipmaps: antialias,
  38084. minFilter: antialias ? THREE.LinearMipMapLinearFilter : THREE.LinearFilter
  38085. }); //antialias: 如果抗锯齿的话,采用mipmap,会增加一倍的存储消耗。原版本都是不抗锯齿的。但是抗锯齿效果更柔和
  38086. //console.log('initTiledPano', size, antialias)
  38087. return renderTarget;
  38088. }
  38089. }, {
  38090. key: "getUploadQueueForPano",
  38091. value: function getUploadQueueForPano(e) {
  38092. var t = this.uploadQueues[e];
  38093. if (!t) t = [], this.uploadQueues[e] = t;
  38094. return t; //return t || ((t = []), (this.uploadQueues[e] = t)), t
  38095. }
  38096. }, {
  38097. key: "isTileUploaded",
  38098. value: function isTileUploaded(e) {
  38099. return this.isPanoZoomed(e.panoId) ? e.zoomUploaded : e.uploaded;
  38100. }
  38101. }, {
  38102. key: "setUploaded",
  38103. value: function setUploaded(e, t) {
  38104. this.isPanoZoomed(e.panoId) ? e.zoomUploaded = t : e.uploaded = t; //console.log('setUploaded', e.panoId,e.tileIndex, e.uploaded, t )
  38105. }
  38106. }, {
  38107. key: "queueTileUpload",
  38108. value: function queueTileUpload(e, t, i) {
  38109. var n = this.getActiveRenderTargetDescriptor(e.panoId);
  38110. if (this.isRenderTargetDescriptorValid(n) && e.downloaded && !this.isTileUploaded(e) && (!e.uploadQueued || i) && (!(e.panoSize > this.$app.core.get('QualityManager').getMaxNavPanoSize()) || this.zoomingActive)) {
  38111. var r = this.getUploadQueueForPano(e.panoId);
  38112. 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));
  38113. }
  38114. }
  38115. }, {
  38116. key: "shoulPushToFrontOfQueue",
  38117. value: function shoulPushToFrontOfQueue(e) {
  38118. return 0 === TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, e.panoSize);
  38119. }
  38120. }, {
  38121. key: "getTopUploadQueue",
  38122. value: function getTopUploadQueue() {
  38123. for (var e = null, t = null, i = S.Base; i <= S.Remaining; i++) {
  38124. for (var n = 0; n < this.activePanos.length; n++) {
  38125. e = this.activePanos[n];
  38126. t = this.getUploadQueueForPano(e.id);
  38127. if (t.length > 0) {
  38128. switch (i) {
  38129. case S.Base:
  38130. if (0 === t[0].level) return t;
  38131. break;
  38132. case S.Remaining:
  38133. return t;
  38134. }
  38135. }
  38136. }
  38137. }
  38138. return null;
  38139. }
  38140. }, {
  38141. key: "peekNextFromUploadQueue",
  38142. value: function peekNextFromUploadQueue() {
  38143. //获取第一项
  38144. if (this.forceQueue.length > 0) return this.forceQueue[0];
  38145. var e = this.getTopUploadQueue();
  38146. return e && e.length > 0 ? e[0] : null;
  38147. }
  38148. }, {
  38149. key: "clearAllQueuedUploads",
  38150. value: function clearAllQueuedUploads() {
  38151. this.clearAllUploadQueues(null, 0);
  38152. }
  38153. }, {
  38154. key: "clearAllQueuedUploadsForPano",
  38155. value: function clearAllQueuedUploadsForPano(e) {
  38156. this.clearAllUploadQueues(e, 0);
  38157. }
  38158. }, {
  38159. key: "clearAllUploadQueues",
  38160. value: function clearAllUploadQueues(e, t) {
  38161. if (e) this.clearUploadQueue(this.getUploadQueueForPano(e), t), this.clearUploadQueue(this.forceQueue, t, e);else {
  38162. for (var i = 0; i < this.activePanos.length; i++) {
  38163. var n = this.activePanos[i];
  38164. this.clearUploadQueue(this.getUploadQueueForPano(n.id), t);
  38165. }
  38166. this.clearUploadQueue(this.forceQueue, t);
  38167. }
  38168. }
  38169. /* clearUploadQueue(e, t, i) {
  38170. ;(void 0 !== t && null !== t) || (t = 0)
  38171. for (var n = 0; n < e.length; ) {
  38172. var r = e[n]
  38173. ;(!i || (i && i === r.tile.panoId)) && r.level >= t ? ((r.uploadQueued = !1), e.splice(n, 1)) : n++
  38174. }
  38175. } */
  38176. }, {
  38177. key: "clearUploadQueue",
  38178. value: function clearUploadQueue(e, t, i) {
  38179. void 0 !== t && null !== t || (t = 0);
  38180. for (var n = 0; n < e.length;) {
  38181. var r = e[n];
  38182. (!i || i && i === r.panoId) && r.level >= t ? (r.uploadQueued = !1, //(!i || i && i === r.tile.panoId) && r.level >= t ? (r.uploadQueued = !1, //上传下载页面刚上传后刷新会报错。原因未知。
  38183. e.splice(n, 1)) : n++;
  38184. }
  38185. }
  38186. }, {
  38187. key: "updateUploadQueue",
  38188. value: function updateUploadQueue(e, t, maxCount) {
  38189. for (var i = 0, n = 0, sum = 0;;) {
  38190. /* var r = this.peekNextFromUploadQueue()
  38191. if (!r) break
  38192. if ((n >= t || i >= e || sum >= maxCount) && !(r.level == 0 && sum == 0) ) break
  38193. */
  38194. if (n >= t || i >= e || sum >= maxCount) break;
  38195. var r = this.getNextFromUploadQueue(); //获取并从列表中删除, 和前面的r一样的
  38196. if (!r) break;
  38197. 0 !== r.level ? i++ : n++; //if(0 == r.level)console.log('0000000', sum, maxCount)
  38198. sum++;
  38199. if (!(r.panoSize > this.$app.core.get('QualityManager').getMaxNavPanoSize()) || this.zoomingActive) {
  38200. var o = this.getActiveRenderTargetDescriptor(r.panoId);
  38201. this.isRenderTargetDescriptorValid(o) && this.uploadTile(r, r.forceUpload);
  38202. }
  38203. }
  38204. }
  38205. /* updateUploadQueue(e, t) {
  38206. //e || (e = 1) //啊啊啊啊啊
  38207. for (var i = 0, n = 0; ; ) {
  38208. if (n >= t || i >= e) break
  38209. var r = this.getNextFromUploadQueue()
  38210. if (!r) break
  38211. 0 !== r.level ? i++ : n++
  38212. if (!(r.panoSize > this.$app.core.get('QualityManager').getMaxNavPanoSize()) || this.zoomingActive) {
  38213. var o = this.getActiveRenderTargetDescriptor(r.panoId)
  38214. this.isRenderTargetDescriptorValid(o) && this.uploadTile(r, r.forceUpload)
  38215. }
  38216. }
  38217. } */
  38218. }, {
  38219. key: "updateDirection",
  38220. value: function updateDirection(e) {
  38221. if (e = e || this.direction) {
  38222. this.direction = e;
  38223. for (var t = 0; t < this.activePanos.length; t++) {
  38224. var i = this.activePanos[t],
  38225. n = this.getUploadQueueForPano(i.id);
  38226. TilePrioritizer.sortPanoTiles(n, i, this.direction);
  38227. }
  38228. }
  38229. }
  38230. }, {
  38231. key: "linkTileAndNode",
  38232. value: function linkTileAndNode(e, t) {
  38233. t.tile = e, e.node = t;
  38234. }
  38235. }, {
  38236. key: "linkAllTilesAndNodes",
  38237. value: function linkAllTilesAndNodes(e) {
  38238. var t = function t(_t, i, n, r, o) {
  38239. var a = this.getTileDirectoryEntry(e.id, i, r, o);
  38240. this.linkTileAndNode(a, n);
  38241. };
  38242. for (var i = 0; i < TileUtils.FACES_PER_PANO; i++) {
  38243. var n = this.getTileTree(e.id, i);
  38244. n.breadthFirst({
  38245. callback: t.bind(this, n, i)
  38246. });
  38247. }
  38248. }
  38249. }, {
  38250. key: "anyUploaded",
  38251. value: function anyUploaded(e) {
  38252. if (!e) return !1;
  38253. if (e.tile && this.isTileUploaded(e.tile)) return !0;
  38254. if (e.children) for (var t = 0; t < e.children.length; t++) {
  38255. var i = e.children[t];
  38256. if (this.anyUploaded(i)) return !0;
  38257. }
  38258. return !1;
  38259. }
  38260. }, {
  38261. key: "setNodeCovered",
  38262. value: function setNodeCovered(e, t) {
  38263. this.isPanoZoomed(e.tile.panoId) ? e.zoomCovered = t : e.covered = t;
  38264. }
  38265. }, {
  38266. key: "isNodeCovered",
  38267. value: function isNodeCovered(e) {
  38268. return !!e && (this.isPanoZoomed(e.tile.panoId) ? e.zoomCovered : e.covered);
  38269. }
  38270. }, {
  38271. key: "addCoverageForNode",
  38272. value: function addCoverageForNode(e) {
  38273. if (this.setNodeCovered(e, !0), e.parent && e.covered) {
  38274. var t = e.parent;
  38275. this.nodeSubcovered(t) && this.addCoverageForNode(t, !0);
  38276. }
  38277. }
  38278. }, {
  38279. key: "calcFullCoverage",
  38280. value: function calcFullCoverage(e) {
  38281. var t = !1;
  38282. if (e.children) for (var i = 0; i < e.children.length; i++) {
  38283. var n = e.children[i];
  38284. t = t || this.calcFullCoverage(n);
  38285. }
  38286. e.covered = e.tile.uploaded || t;
  38287. }
  38288. }, {
  38289. key: "nodeSubcovered",
  38290. value: function nodeSubcovered(e) {
  38291. if (!e.children) return !1;
  38292. for (var t = 0; t < e.children.length; t++) {
  38293. if (!e.children[t] || !this.isNodeCovered(e.children[t])) return !1;
  38294. }
  38295. return !0;
  38296. }
  38297. }, {
  38298. key: "resetPanoDescriptor",
  38299. value: function resetPanoDescriptor(e) {
  38300. this.getPanoDescriptor(e);
  38301. }
  38302. }, {
  38303. key: "getPanoDescriptor",
  38304. value: function getPanoDescriptor(e) {
  38305. var t = this.panoDescriptors[e];
  38306. return t || (t = {}, this.panoDescriptors[e] = t), t;
  38307. }
  38308. }, {
  38309. key: "resetPanoLODDescriptors",
  38310. value: function resetPanoLODDescriptors(e) {
  38311. var t = this.getPanoLODDescriptors(e);
  38312. for (var i in t) {
  38313. if (t.hasOwnProperty(i)) {
  38314. var n = t[i];
  38315. n.uploadCount = 0, n.uploadAttempts = 0;
  38316. n.uploaded = [];
  38317. }
  38318. }
  38319. }
  38320. }, {
  38321. key: "getPanoLODDescriptor",
  38322. value: function getPanoLODDescriptor(e, t) {
  38323. var i = this.getPanoLODDescriptors(e),
  38324. n = i[t];
  38325. return n || (n = {
  38326. uploadCount: 0,
  38327. uploadAttempts: 0,
  38328. uploaded: [] //add
  38329. }, i[t] = n), n;
  38330. }
  38331. }, {
  38332. key: "getPanoLODDescriptors",
  38333. value: function getPanoLODDescriptors(e) {
  38334. var t = this.panoLODDescriptors[e];
  38335. return t || (t = {}, this.panoLODDescriptors[e] = t), t;
  38336. }
  38337. }, {
  38338. key: "onTileDownloaded",
  38339. value: function onTileDownloaded(e) {
  38340. var t = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, e.panoSize),
  38341. i = this.getTileDirectoryEntry(e.panoId, e.face, t, e.faceTileIndex);
  38342. i.downloaded = !0;
  38343. i.image = e.image;
  38344. i.panoSize = e.panoSize;
  38345. i.tileX = e.tileX;
  38346. i.tileY = e.tileY;
  38347. i.totalTiles = e.totalTiles;
  38348. i.tileIndex = e.tileIndex;
  38349. i.faceTileIndex = e.faceTileIndex;
  38350. i.face = e.face;
  38351. i.cubeFace = panorama.mapFaceToCubemapFace(e.face);
  38352. i.panoId = e.panoId;
  38353. i.tileSize = e.tileSize;
  38354. i.direction = new THREE.Vector3().copy(e.direction);
  38355. i.node = null;
  38356. i.level = TileTree.getLevelCountForSize(TileUtils.TILE_SIZE, i.panoSize);
  38357. if (this.isPanoActive(i.panoId)) {
  38358. var n = this.getTileTree(i.panoId, i.face);
  38359. var r = n.getSubNode(i.panoSize, i.tileX, i.tileY);
  38360. this.linkTileAndNode(i, r);
  38361. this.queueTileUpload(i, !0);
  38362. }
  38363. }
  38364. }, {
  38365. key: "getTileDirectoryEntry",
  38366. value: function getTileDirectoryEntry(panoId, t, i, n) {
  38367. var r = this.tileDirectory[panoId];
  38368. r || (r = {}, this.tileDirectory[panoId] = r);
  38369. var o = 16384 * t + 1024 * i + n,
  38370. //t:4096级别
  38371. a = r[o];
  38372. return a || (a = {
  38373. downloaded: !1,
  38374. uploaded: !1,
  38375. zoomUploaded: !1
  38376. }, r[o] = a), a._key = panoId + ':' + t + ':' + i + ':' + n, a._tileKey = o, a;
  38377. }
  38378. }, {
  38379. key: "setZoomingActive",
  38380. value: function setZoomingActive(active, pano, i) {
  38381. //设置当前正在zoom的pano
  38382. 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));
  38383. }
  38384. }, {
  38385. key: "updateZoomedPanoFromBase",
  38386. value: function updateZoomedPanoFromBase(pano) {
  38387. //因更换pano所以将pano的rendertarget渲染到panoRenderer的zoomRenderTarget上
  38388. if (!this.zoomPanoRenderingDisabled) {
  38389. var QualityManager = this.$app.core.get('QualityManager');
  38390. var sceneRenderer = this.index == 1 ? this.sceneRenderer2 : this.$app.core.get('SceneRenderer');
  38391. var t = this.getActiveRenderTargetDescriptor(pano.id);
  38392. if (t && t.renderTarget) {
  38393. if (this.zoomRenderTarget) {
  38394. var i = Math.min(QualityManager.maxRenderTargetSize, QualityManager.getMaxZoomPanoSize()),
  38395. //change
  38396. n = t.renderTarget,
  38397. r = t.size;
  38398. sceneRenderer.copyCubeMap(n.texture, this.zoomRenderTarget, r, r, i, i);
  38399. }
  38400. this.copyBaseRenderStatusToZoomed(pano.id);
  38401. }
  38402. }
  38403. } //xzw add 转换pano加载的tile的质量。 为了降低总的renderTarget的size, 尤其手机的2048cube个数只能存在一个
  38404. }, {
  38405. key: "switchPanoQuality",
  38406. value: function switchPanoQuality(pano, _ref) {
  38407. var useIdel = _ref.useIdel,
  38408. size = _ref.size;
  38409. if (useIdel) {
  38410. var rt;
  38411. if (size) rt = this.activeDescripor(size, true); //使用空闲的,优先使用此size的
  38412. if (!rt) rt = this.activeDescripor(null, true); //任何size都可以
  38413. if (rt) {
  38414. size = rt.size;
  38415. }
  38416. }
  38417. pano.updateTileQuality(size);
  38418. if (!pano.tiledPanoRenderTarget) return;
  38419. var oldSize = pano.tiledPanoRenderTarget.width;
  38420. if (size != oldSize) {
  38421. //console.log('switchPanoQuality', pano.id, oldSize, size)
  38422. this.deactiveDescripor(this.tiledPanoRenderTarget);
  38423. var newTarget = this.activateTiledPano(pano, size, false, true); //第三个参数决定是否clearAllQueuedUploads, clear的话会造成tiles加载不全
  38424. this.$app.core.get('SceneRenderer').copyCubeMap(pano.tiledPanoRenderTarget.texture, newTarget, oldSize, oldSize, size, size); //这一句后台耗时高
  38425. pano.tiledPanoRenderTarget = newTarget;
  38426. this.renderPanoTiles(pano.id, null, null, null, size
  38427. /* , dir, a */
  38428. );
  38429. pano.updateSkyboxForZoomLevel(); //材质更新
  38430. }
  38431. }
  38432. /* 注意 由于copyCubeMap耗时大,所以不能在无缝过渡中执行。 综合考虑下最佳组合:
  38433. pc:2048两个, 1024一个
  38434. mobile:2048一个, 1024两个 (lowTile为level2时多一个512)
  38435. 其中无缝过渡时在中途加载的首选1024(除非1024用完了),直到无缝过渡结束后才会提升。
  38436. */
  38437. }, {
  38438. key: "add",
  38439. value: function add(e) {
  38440. this.M.push(e);
  38441. }
  38442. }, {
  38443. key: "initDescriptor",
  38444. value: function initDescriptor(size) {
  38445. var t = createDescriptor();
  38446. t.inUse = !0;
  38447. t.size = size;
  38448. this.add(t);
  38449. return t;
  38450. }
  38451. }, {
  38452. key: "activeDescripor",
  38453. value: function activeDescripor(e, onlyCheck) {
  38454. for (var t = 0; t < this.M.length; t++) {
  38455. var i = this.M[t];
  38456. if (!i.inUse && (!e || i.size === e)) {
  38457. //xzw改
  38458. if (!onlyCheck) i.inUse = !0; //console.log('activeDescripor', onlyCheck, this.M.map(e=>e.inUse))
  38459. return i;
  38460. }
  38461. }
  38462. return null;
  38463. }
  38464. }, {
  38465. key: "deactiveDescripor",
  38466. value: function deactiveDescripor(e) {
  38467. for (var t = 0; t < this.M.length; t++) {
  38468. var i = this.M[t];
  38469. if (i.renderTarget === e) {
  38470. i.inUse = !1; //console.log('deactiveDescripor', this.M.map(e=>e.inUse))
  38471. return !0;
  38472. }
  38473. }
  38474. return !1;
  38475. } //xzw add: 飞出后dispose所有cubeRenderTarget,避免因模型贴图较多而造成的崩溃
  38476. }, {
  38477. key: "disposeIdelTargets",
  38478. value: function disposeIdelTargets() {
  38479. for (var t = 0; t < this.M.length; t++) {
  38480. var i = this.M[t];
  38481. if (!i.inUse) {
  38482. i.renderTarget.dispose();
  38483. }
  38484. } //console.log('disposeIdelTargets ', disposeCount, 'of', this.M.length)
  38485. }
  38486. }]);
  38487. return PanoRenderer;
  38488. }(EventEmitter);
  38489. });
  38490. var PanoVideoRendererEvents = {
  38491. ParamsUpdated: 'panorama.videorenderer.paramsupdated',
  38492. SuspendRender: 'panorama.videorenderer.suspendrender',
  38493. ResumeRender: 'panorama.videorenderer.resumerender',
  38494. TextureUpdate: 'panorama.videorenderer.textured',
  38495. CanPlayVideo: 'panorama.videorenderer.canplayvideo',
  38496. StartPlayVideo: 'panorama.videorenderer.startvideo'
  38497. };
  38498. 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); }; }
  38499. 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; } }
  38500. defineComponent('ModelManager', function () {
  38501. return /*#__PURE__*/function (_EventEmitter) {
  38502. _inherits(ModelManager, _EventEmitter);
  38503. var _super = _createSuper$14(ModelManager);
  38504. function ModelManager() {
  38505. var _this;
  38506. _classCallCheck(this, ModelManager);
  38507. _this = _super.call(this);
  38508. _this.modelMap = {};
  38509. _this.activeModel = null;
  38510. _this.modelCount = 0;
  38511. return _this;
  38512. }
  38513. _createClass(ModelManager, [{
  38514. key: "init",
  38515. value: function init() {
  38516. this.bindEvents();
  38517. }
  38518. }, {
  38519. key: "bindEvents",
  38520. value: function bindEvents() {
  38521. this.$app.core.get('PanoRenderer').on(PanoRendererEvents.TileRenderSuccess, this.onTileRendered.bind(this));
  38522. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.TextureUpdate, this.onVideoTextureUpdate.bind(this));
  38523. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.SuspendRender, this.onSuspendVideoRender.bind(this));
  38524. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.ResumeRender, this.onResumeVideoRender.bind(this));
  38525. }
  38526. }, {
  38527. key: "onTileRendered",
  38528. value: function onTileRendered(e, t, i, n) {}
  38529. }, {
  38530. key: "onVideoTextureUpdate",
  38531. value: function onVideoTextureUpdate(texture) {
  38532. this.activeModel && this.activeModel.updateVideoTexture(texture);
  38533. }
  38534. }, {
  38535. key: "onSuspendVideoRender",
  38536. value: function onSuspendVideoRender() {
  38537. this.activeModel && this.activeModel.suspendVideoRender();
  38538. }
  38539. }, {
  38540. key: "onResumeVideoRender",
  38541. value: function onResumeVideoRender() {
  38542. this.activeModel && this.activeModel.resumeVideoRender();
  38543. }
  38544. }, {
  38545. key: "addModel",
  38546. value: function addModel(model) {
  38547. this.modelMap[model.sid] = model;
  38548. 0 === this.modelCount && this.activateModel(model.sid);
  38549. this.modelCount++;
  38550. this.emit(ModelManagerEvents.ModelAdded);
  38551. }
  38552. }, {
  38553. key: "activateModel",
  38554. value: function activateModel(projectNum) {
  38555. var model = this.modelMap[projectNum];
  38556. if (!model) {
  38557. throw new BasicException('Tried to activate invalid model!');
  38558. }
  38559. var oldModel = this.activeModel;
  38560. this.activeModel = model, this.$app.core.get('TileDownloader').setPanoData(model.panos, []
  38561. /* model.listImagePanos() */
  38562. , model.sid), this.$app.core.get('TileDownloader').setUrls(model.urls), model.panos.forEach(function (e) {
  38563. 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');
  38564. }.bind(this)), this.emit(ModelManagerEvents.ActiveModelChanged, {
  38565. oldModel: oldModel,
  38566. model: model
  38567. });
  38568. }
  38569. }, {
  38570. key: "getActiveModel",
  38571. value: function getActiveModel() {
  38572. return this.activeModel;
  38573. }
  38574. }]);
  38575. return ModelManager;
  38576. }(EventEmitter);
  38577. });
  38578. 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); }; }
  38579. 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; } }
  38580. var PanoramaCamera = /*#__PURE__*/function (_THREE$PerspectiveCam) {
  38581. _inherits(PanoramaCamera, _THREE$PerspectiveCam);
  38582. var _super = _createSuper$13(PanoramaCamera);
  38583. function PanoramaCamera(dom) {
  38584. var _this;
  38585. _classCallCheck(this, PanoramaCamera);
  38586. _this = _super.call(this, cameraLight.clampVFOV(settings$3.insideFOV), window.innerWidth / window.innerHeight, settings$3.insideNear, settings$3.insideFar);
  38587. _this.controls = null;
  38588. return _this;
  38589. }
  38590. _createClass(PanoramaCamera, [{
  38591. key: "updateAspect",
  38592. value: function updateAspect(aspect) {
  38593. this.aspect = aspect;
  38594. this.updateProjectionMatrix();
  38595. }
  38596. }]);
  38597. return PanoramaCamera;
  38598. }(THREE.PerspectiveCamera);
  38599. 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); }; }
  38600. 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; } }
  38601. var DollhouseCamera = /*#__PURE__*/function (_THREE$PerspectiveCam) {
  38602. _inherits(DollhouseCamera, _THREE$PerspectiveCam);
  38603. var _super = _createSuper$12(DollhouseCamera);
  38604. function DollhouseCamera(dom) {
  38605. var _this;
  38606. _classCallCheck(this, DollhouseCamera);
  38607. _this = _super.call(this, cameraLight.clampVFOV(constants$4.dollhouseFOV), window.innerWidth / window.innerHeight, constants$4.dollhouseNear, constants$4.dollhouseFar);
  38608. _this.controls = null;
  38609. return _this;
  38610. }
  38611. _createClass(DollhouseCamera, [{
  38612. key: "updateAspect",
  38613. value: function updateAspect(aspect) {
  38614. if (isNaN(aspect)) aspect = 1; //xzw add
  38615. this.aspect = aspect;
  38616. this.controls.updateDistance(aspect);
  38617. this.updateProjectionMatrix();
  38618. }
  38619. /* updateFov() {
  38620. //add
  38621. if (this.aspect < this.suitModelAspect) {
  38622. //屏宽缩小时,不变hFov, 改变vHov
  38623. this.fov = cameraLight.getVFOVFromHFOV(this.suitModelAspectHFov, this.aspect, 1)
  38624. } else this.fov = constants.dollhouseFOV
  38625. } */
  38626. }]);
  38627. return DollhouseCamera;
  38628. }(THREE.PerspectiveCamera);
  38629. 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); }; }
  38630. 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; } }
  38631. var PanoramaControls = /*#__PURE__*/function (_EventEmitter) {
  38632. _inherits(PanoramaControls, _EventEmitter);
  38633. var _super = _createSuper$11(PanoramaControls);
  38634. function PanoramaControls(camera, dom, player) {
  38635. var _this;
  38636. _classCallCheck(this, PanoramaControls);
  38637. _this = _super.call(this);
  38638. _this.camera = camera; //被控制的相机
  38639. _this.camera.controls = _assertThisInitialized(_this);
  38640. _this.player = player;
  38641. _this.config = player.$app.config;
  38642. _this.dom = dom;
  38643. _this.target = new THREE.Vector3(0, 0, 0); //相机视点,鼠标交互主要影响的对象
  38644. _this.lookVector = new THREE.Vector3(); //相机方向,以单位向量表示
  38645. _this.lookSpeed = 0.05; //没发现下文用到???
  38646. _this.rotationAcc = new THREE.Vector2(); //旋转角加速度
  38647. _this.rotationSpeed = new THREE.Vector2(); //旋转角速度
  38648. _this.speed = 1; // 相机拖拽旋转速度
  38649. /**
  38650. * 球坐标系的相关参数lat,lon 与 phi,theta 两种表示形式
  38651. * 注:少了半径参数,因为是用于约束相机的方向,半径长短在此没有意义,单位1即可,体现在方向向量lookVector上
  38652. */
  38653. _this.lat = 0; //纬度,角度表示,直观
  38654. _this.lon = 0; //经度,角度表示,直观
  38655. _this.phi = 0; //phi,标准球坐标系的参数,弧度表示,用于进行直接计算
  38656. _this.theta = 0; //theta,标准球坐标系的参数,弧度表示,用于进行直接计算
  38657. _this.enabled = !1; //是否启用
  38658. _this.locked = !1; //是否锁定
  38659. /**
  38660. * 交互行为相关,有鼠标点击与触摸,点击或触摸的地方在此约定统称为交互点
  38661. */
  38662. _this.pointer = new THREE.Vector2(0, 0); //交互点的屏幕坐标,有别于DOM坐标,在此存放NDC坐标。(NDC,三维常用坐标系,二维坐标,整个屏幕映射范围(-1,1),屏幕中心为原点,+Y朝上,+X朝右)
  38663. _this.pointersLimit = 2; //触摸事件的触摸点的限制个数
  38664. _this.pointers = []; //存储交互点的坐标
  38665. _this.rotationDifference = new THREE.Vector2(); //记录帧之间的要进行的旋转量
  38666. _this.rotationHistory = []; //记录一次拖拽过程中每帧产生的rotationDifference,用于拖拽完成后计算平均值进而得到惯性角速度
  38667. _this.pointerDragOn = !1; //拖拽的标记,用于处理各种交互行为下的冲突问题
  38668. _this.pointerDragStart = new THREE.Vector2(0, 0); //拖拽开始位置,也作为两帧之间前一帧的坐标位置
  38669. _this.pinchDistance = 0; //触控下,“捏合”交互下,两触摸点的距离
  38670. _this.moveStart = new THREE.Vector2(); //交互点移动行为开始的最表
  38671. _this.moveTolerance = 0.01; //产生拖拽行为的鼠标移动最小阈值,用于解决点击,和其他行为的误触操作
  38672. _this.limitAngleIsBound = true; // 配置俯仰角
  38673. if (_this.config.camera && _this.config.camera.lookLimitUp != null && _this.config.camera.lookLimitDown != null) {
  38674. _this.limitAngleIsBound = false;
  38675. _this.insideLookLimitUp = _this.config.camera.lookLimitUp;
  38676. _this.insideLookLimitDown = _this.config.camera.lookLimitDown;
  38677. }
  38678. return _this;
  38679. }
  38680. /**
  38681. * 启用状态
  38682. */
  38683. _createClass(PanoramaControls, [{
  38684. key: "usable",
  38685. value: function usable() {
  38686. return this.enabled && !this.locked;
  38687. }
  38688. /**
  38689. * 根据新的方向向量计算所指向的球面坐标(lat,lon),用到了笛卡尔坐标系转球面坐标系的数学方法
  38690. * 注:THREE 的 Vector3 与 Spherical 两个数学类有互转的方法
  38691. * @param {THREE.Vector3} aim 目标点
  38692. */
  38693. }, {
  38694. key: "lookAt",
  38695. value: function lookAt(aim, dir) {
  38696. var t = dir || this.camera.position.clone().sub(aim); //aim所指相反点的笛卡尔坐标系
  38697. /**
  38698. * 以下全为笛卡尔坐标->球座标,不多赘述
  38699. */
  38700. var i = Math.atan(t.z / t.x);
  38701. i += t.x < 0 ? Math.PI : 0;
  38702. i += t.x > 0 && t.z < 0 ? 2 * Math.PI : 0;
  38703. this.lon = THREE.MathUtils.radToDeg(i) + 180;
  38704. var n = Math.sqrt(t.x * t.x + t.z * t.z),
  38705. o = Math.atan(t.y / n);
  38706. this.lat = -THREE.MathUtils.radToDeg(o);
  38707. }
  38708. /**
  38709. * 记录一次拖拽旋转开始时的一些状态
  38710. * @param {number} clientX 屏幕坐标
  38711. * @param {number} clientY 屏幕坐标
  38712. */
  38713. }, {
  38714. key: "startRotationFrom",
  38715. value: function startRotationFrom(clientX, clientY) {
  38716. //以屏幕中心为原点,得到pointer在屏幕的百分比
  38717. var mouse = math$2.handelPadding(clientX, clientY, this.dom);
  38718. math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.pointer, this.dom);
  38719. this.pointerDragOn = !0;
  38720. this.pointerDragStart.copy(this.pointer);
  38721. this.moveStart.copy(this.pointer);
  38722. this.rotationHistory = [];
  38723. this.rotationSpeed.set(0, 0);
  38724. }
  38725. }, {
  38726. key: "onMouseOver",
  38727. value: function onMouseOver(mouseEvent) {
  38728. !this.pointerDragOn || 0 !== mouseEvent.which && 0 !== mouseEvent.buttons || this.onMouseUp(mouseEvent);
  38729. }
  38730. }, {
  38731. key: "onTouchStart",
  38732. value: function onTouchStart(pointerEvent) {
  38733. if (this.usable()) {
  38734. pointerEvent.preventDefault();
  38735. pointerEvent.stopPropagation();
  38736. switch (pointerEvent.touches.length) {
  38737. case 1:
  38738. this.startRotationFrom(pointerEvent.touches[0].clientX, pointerEvent.touches[0].clientY);
  38739. break;
  38740. case 2:
  38741. var t = (pointerEvent.touches[0].clientX - pointerEvent.touches[1].clientX) / window.innerWidth,
  38742. i = (pointerEvent.touches[0].clientY - pointerEvent.touches[1].clientY) / window.innerHeight;
  38743. this.pinchDistance = Math.sqrt(t * t + i * i);
  38744. }
  38745. this.emit(ControlEvents.InputStart, 'touch');
  38746. }
  38747. }
  38748. }, {
  38749. key: "onPointerDown",
  38750. value: function onPointerDown(pointerEvent) {
  38751. if (this.usable() && 'touch' === pointerEvent.pointerType) {
  38752. if (this.pointers.length < this.pointersLimit) {
  38753. this.pointers.push({
  38754. id: pointerEvent.pointerId,
  38755. clientX: pointerEvent.clientX,
  38756. clientY: pointerEvent.clientY
  38757. });
  38758. }
  38759. pointerEvent.touches = this.pointers;
  38760. this.onTouchStart(pointerEvent);
  38761. this.emit(ControlEvents.InputStart, 'pointer');
  38762. }
  38763. }
  38764. }, {
  38765. key: "onMouseDown",
  38766. value: function onMouseDown(mouseEvent) {
  38767. if (this.usable()) {
  38768. mouseEvent.preventDefault();
  38769. mouseEvent.stopPropagation();
  38770. switch (mouseEvent.button) {
  38771. case MouseButton.LEFT:
  38772. this.startRotationFrom(mouseEvent.clientX, mouseEvent.clientY);
  38773. }
  38774. this.emit(ControlEvents.InputStart, 'mouse');
  38775. }
  38776. }
  38777. /**
  38778. * 根据两帧交互点坐标之间的差值,计算两帧角度差值(rotationDifference)用于旋转
  38779. * 1.将两次交互点坐标分别映射到3D空间
  38780. * 2.通过两坐标在XY平面上投影,分别计算与X轴夹角,再求差值作为竖直方向角度差值(rotationDifference.y)
  38781. * 3.通过两坐标在XZ平面上投影,分别计算与X轴夹角,再求差值作为水平方向角度差值(rotationDifference.x)
  38782. */
  38783. }, {
  38784. key: "updateRotation",
  38785. value: function updateRotation() {
  38786. if (this.usable() && this.pointerDragOn) {
  38787. this.camera.matrixWorld = new THREE.Matrix4(); //许钟文加 unproject前先把相机置于原点 (player的cameras里的panorama是不更新matrixworld的,只有player的camera才更新。 为了其他的camera加)
  38788. //两交互点在3D空间的坐标
  38789. var pointerDragStart3D = new THREE.Vector3(this.pointerDragStart.x, this.pointerDragStart.y, -1).unproject(this.camera),
  38790. pointer3D = new THREE.Vector3(this.pointer.x, this.pointer.y, -1).unproject(this.camera),
  38791. //两交互点分别到原点的长度
  38792. pointerDragStart3DLength = Math.sqrt(pointerDragStart3D.x * pointerDragStart3D.x + pointerDragStart3D.z * pointerDragStart3D.z),
  38793. pointer3DLength = Math.sqrt(pointer3D.x * pointer3D.x + pointer3D.z * pointer3D.z),
  38794. //通过Math.atan2计算在XY面上与X轴的夹角弧度。
  38795. //注:因为 z = -1,所以两者到原点的长度近似为x分量(数值的大小也不需要绝对对应)
  38796. anglePointerDragStart3DToX = Math.atan2(pointerDragStart3D.y, pointerDragStart3DLength),
  38797. //近似为 anglePointerDragStart3DToX = Math.atan2( pointerDragStart3D.y, pointerDragStart3D.x )
  38798. anglePointer3DToX = Math.atan2(pointer3D.y, pointer3DLength); //近似为 anglePointer3DToX = Math.atan2( pointer3D.y, pointer3D.x )
  38799. this.camera.updateMatrix();
  38800. this.camera.updateMatrixWorld(); //算出两者角度差,作为竖直方向角度差值(rotationDifference.y)
  38801. this.rotationDifference.y = THREE.MathUtils.radToDeg(anglePointerDragStart3DToX - anglePointer3DToX); //y分量清零,原向量等价于在XZ轴上的投影向量
  38802. pointerDragStart3D.y = 0;
  38803. pointer3D.y = 0; //归一化(/length),求两者夹角作为
  38804. //判断方向,最后记为水平方向角度差值(rotationDifference.x)
  38805. var anglePointerDragStart3DToPointer3D = Math.acos(pointerDragStart3D.dot(pointer3D) / pointerDragStart3D.length() / pointer3D.length()); // isNaN(s) || (this.rotationDifference.x = THREE.MathUtils.radToDeg(s),
  38806. // this.pointerDragStart.x < this.pointer.x && (this.rotationDifference.x *= -1)),
  38807. if (!isNaN(anglePointerDragStart3DToPointer3D)) {
  38808. this.rotationDifference.x = THREE.MathUtils.radToDeg(anglePointerDragStart3DToPointer3D);
  38809. if (this.pointerDragStart.x < this.pointer.x) {
  38810. this.rotationDifference.x *= -1;
  38811. }
  38812. }
  38813. this.rotationDifference.multiplyScalar(this.speed); //更新pointerDragStart记录当前帧坐标,用于下一帧求帧差值
  38814. this.pointerDragStart.copy(this.pointer); //console.log(pointerDragStart3DLength,pointer3DLength)
  38815. }
  38816. }
  38817. /**
  38818. * 处理鼠标移动事件
  38819. * 1.计算鼠标的NDC坐标
  38820. * 2.判断是否是拖拽来决定拖拽行为的执行
  38821. * 3.通过预定义的防误触偏差(moveTolerance),来防止一定的误触
  38822. */
  38823. }, {
  38824. key: "onMouseMove",
  38825. value: function onMouseMove(mouseEvent) {
  38826. if (this.usable()) {
  38827. var mouse = math$2.handelPadding(mouseEvent.clientX, mouseEvent.clientY, this.dom);
  38828. math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.pointer, this.dom);
  38829. if (this.pointerDragOn) {
  38830. if (Math.abs(this.pointer.x - this.moveStart.x) > this.moveTolerance || Math.abs(this.pointer.y - this.moveStart.y) > this.moveTolerance) {
  38831. this.emit(ControlEvents.Move, 'mouse');
  38832. }
  38833. }
  38834. }
  38835. }
  38836. /**
  38837. * 处理触摸移动事件
  38838. * 1.单点触控记录NDC坐标
  38839. * 2.双点触控记录两触摸点距离(映射到[0-1]范围)
  38840. */
  38841. }, {
  38842. key: "onTouchMove",
  38843. value: function onTouchMove(pointerEvent) {
  38844. if (this.usable()) {
  38845. this.emit(ControlEvents.Move, 'touch');
  38846. switch (pointerEvent.touches.length) {
  38847. case 1:
  38848. var mouse = math$2.handelPadding(pointerEvent.touches[0].clientX, pointerEvent.touches[0].clientY, this.dom);
  38849. math$2.convertScreenPositionToNDC(mouse.x, mouse.y, this.pointer, this.dom);
  38850. break;
  38851. case 2:
  38852. var offsetX = (pointerEvent.touches[0].clientX - pointerEvent.touches[1].clientX) / window.innerWidth,
  38853. offsetY = (pointerEvent.touches[0].clientY - pointerEvent.touches[1].clientY) / window.innerHeight,
  38854. n = this.pinchDistance - Math.sqrt(offsetX * offsetX + offsetY * offsetY);
  38855. if (Math.abs(n) > 0.01) {
  38856. this.emit(ControlEvents.InteractionDirect);
  38857. this.emit(ControlEvents.Pinch, n);
  38858. this.pinchDistance -= n;
  38859. }
  38860. }
  38861. }
  38862. }
  38863. }, {
  38864. key: "onPointerMove",
  38865. value: function onPointerMove(pointerEvent) {
  38866. if (this.usable() && 'touch' === pointerEvent.pointerType) {
  38867. this.pointers.forEach(function (t) {
  38868. if (pointerEvent.pointerId === t.id) {
  38869. t.clientX = pointerEvent.clientX;
  38870. t.clientY = pointerEvent.clientY;
  38871. }
  38872. });
  38873. pointerEvent.touches = this.pointers;
  38874. this.onTouchMove(pointerEvent);
  38875. }
  38876. }
  38877. /**
  38878. * 旋转终止后的行为
  38879. * 1.通过已记录的一组帧旋转量(rotationDifference)求平均值作为停止后惯性速度参考值。
  38880. * 2.通过设置的rotationAfterMoveMultiplier(惯性速度决定因子,用于手动指定影响惯性速度大小),来计算最后的的惯性速度
  38881. */
  38882. }, {
  38883. key: "endRotation",
  38884. value: function endRotation() {
  38885. this.pointerDragOn = !1;
  38886. var averageVector = common$1.averageVectors(this.rotationHistory);
  38887. if (this.player.$app.VRScreenSYNC) {
  38888. // 不使用惯性
  38889. //this.rotationSpeed.set(0,0)
  38890. this.rotationSpeed.set(averageVector.x * settings$3.rotationAfterMoveMultiplierX / 6, averageVector.y * settings$3.rotationAfterMoveMultiplierY / 6);
  38891. } else {
  38892. this.rotationSpeed.set(averageVector.x * settings$3.rotationAfterMoveMultiplierX, averageVector.y * settings$3.rotationAfterMoveMultiplierY);
  38893. }
  38894. }
  38895. /**
  38896. * 触摸结束触发endRotation行为
  38897. */
  38898. }, {
  38899. key: "onTouchEnd",
  38900. value: function onTouchEnd(pointerEvent) {
  38901. if (this.usable()) {
  38902. pointerEvent.preventDefault();
  38903. pointerEvent.stopPropagation();
  38904. this.endRotation();
  38905. }
  38906. }
  38907. /**
  38908. * 鼠标抬起触发endRotation行为
  38909. */
  38910. }, {
  38911. key: "onMouseUp",
  38912. value: function onMouseUp(mouseEvent) {
  38913. if (this.usable()) {
  38914. mouseEvent.preventDefault();
  38915. mouseEvent.stopPropagation();
  38916. this.endRotation();
  38917. }
  38918. }
  38919. }, {
  38920. key: "onPointerUp",
  38921. value: function onPointerUp(pointerEvent) {
  38922. if (this.usable() && 'touch' === pointerEvent.pointerType) {
  38923. this.pointers.forEach(function (t, i) {
  38924. pointerEvent.pointerId === t.id && this.pointers.splice(i, 1);
  38925. }.bind(this));
  38926. pointerEvent.touches = this.pointers;
  38927. this.onTouchEnd(pointerEvent);
  38928. }
  38929. }
  38930. /**
  38931. * 主循环更新,主要通过物理上的刚体旋转行为(角位移,角速度,角加速度,摩擦等)计算得到新的相机视点target,主要是每帧瞬时的状态
  38932. *
  38933. * updateRotation()计算每帧对应的旋转量 rotationDifference
  38934. *
  38935. * 角位移:rotationDifference与原本lon,lat (等价于phi,theta)累加,得到新的角位移
  38936. * 角速度:(rotationDifference数组的平均值 * 速度因子rotationAccelerationInside + 角加速度) - 摩擦rotationFriction。
  38937. *
  38938. * target坐标:新的角位移计算出新的球坐标,转换计算后的球坐标到笛卡尔坐标系
  38939. *
  38940. * @param { number } deltaTime 帧间隔时间。 注:关于帧间隔时间,是个有关物理计算的很重要的值,用于保持物理量与绝对时间的对应而不受帧率的的干扰,下文计算角速度用到。更多请见 https://blog.csdn.net/ChinarCSDN/article/details/82914420
  38941. */
  38942. }, {
  38943. key: "update",
  38944. value: function update(deltaTime) {
  38945. if (this.locked) return; //if(settings.vrEnabled) return;
  38946. // 求出新的rotationDifference
  38947. this.updateRotation(); //记录一组rotationDifference 用于求角速度 rotationSpeed。注:见 endRotation()
  38948. for (this.rotationHistory.push(this.rotationDifference.clone()); this.rotationHistory.length > settings$3.rotationAfterMoveHistoryCount;) {
  38949. this.rotationHistory.shift();
  38950. } //计算角位移(交互影响下的)
  38951. this.lon += this.rotationDifference.x;
  38952. this.lat += this.rotationDifference.y;
  38953. this.rotationDifference.set(0, 0); //计算角速度(实际上deltaTime增大时,角速度下降幅度也应增大)
  38954. var friction = Math.min(1, settings$3.rotationFriction * deltaTime * 60); //如果deltaTime > 1/ 60 (比较卡),就增加rotationFriction, 以防止转动过久
  38955. this.rotationSpeed.x = this.rotationSpeed.x * (1 - friction) + this.rotationAcc.x * settings$3.rotationAccelerationInside;
  38956. this.rotationSpeed.y = this.rotationSpeed.y * (1 - friction) + this.rotationAcc.y * settings$3.rotationAccelerationInside; //计算角位移(交互后,物理定律影响下的)
  38957. this.lon += this.rotationSpeed.x * deltaTime;
  38958. 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 );
  38959. //许钟文
  38960. if (this.limitDownAngel == null) {
  38961. //许钟文 在手机编辑墙壁时俯视角度可以增大
  38962. var insideLookLimitDown, insideLookLimitUp;
  38963. insideLookLimitDown = this.insideLookLimitDown != void 0 ? this.insideLookLimitDown : settings$3.insideLookLimitDown;
  38964. insideLookLimitUp = this.insideLookLimitUp != void 0 ? this.insideLookLimitUp : settings$3.insideLookLimitUp;
  38965. if (this.limitAngleIsBound) {
  38966. //根据fov调整insideLookLimitDown 以使得能看到的边界不变。此时insideLookLimitDown为边界而不是看的角度了
  38967. insideLookLimitDown = insideLookLimitDown - settings$3.insideFOV / 2 + this.camera.fov / 2;
  38968. insideLookLimitUp = insideLookLimitUp + settings$3.insideFOV / 2 - this.camera.fov / 2;
  38969. }
  38970. 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 );
  38971. } else {
  38972. this.lat = this.limitDownAngel; //固定垂直视角
  38973. } //转换为标准球坐标参数形式,并最终转换为笛卡尔坐标系下
  38974. this.phi = THREE.MathUtils.degToRad(90 - this.lat);
  38975. this.theta = THREE.MathUtils.degToRad(this.lon);
  38976. this.lookVector.x = Math.sin(this.phi) * Math.cos(this.theta);
  38977. this.lookVector.y = Math.cos(this.phi);
  38978. this.lookVector.z = Math.sin(this.phi) * Math.sin(this.theta); //求taget坐标: 当前相机位置 + 方向向量(对于此处旋转来说距离并无意义,方向向量的1即可)
  38979. this.target.copy(this.lookVector).add(this.camera.position); //THREE的API来更新相机旋转。注:lookAt是四阶矩阵比较常见的API,因此此PanoramaControls计算流程,不算与THREE耦合
  38980. this.camera.lookAt(this.target);
  38981. }
  38982. /**
  38983. * 滚轮行为: 触发自定义事件
  38984. */
  38985. }, {
  38986. key: "onMouseWheel",
  38987. value: function onMouseWheel(wheelEvent) {
  38988. if (this.usable()) {
  38989. var t = wheelEvent.wheelDelta || -wheelEvent.detail;
  38990. this.emit(ControlEvents.InteractionDirect);
  38991. this.emit(ControlEvents.Scroll, t);
  38992. }
  38993. }
  38994. /**
  38995. * 键盘按下:触发自定义事件
  38996. */
  38997. }, {
  38998. key: "onKeyDown",
  38999. value: function onKeyDown(keyboardEvent) {
  39000. if (!this.player.$app.config.useShortcutKeys) {
  39001. return;
  39002. }
  39003. if (this.usable()) {
  39004. if (keyboardEvent.metaKey || keyboardEvent.ctrlKey) ; else {
  39005. keyboardEvent.preventDefault();
  39006. this.handleKeyDown(keyboardEvent.which);
  39007. }
  39008. }
  39009. }
  39010. }, {
  39011. key: "handleKeyDown",
  39012. value: function handleKeyDown(keyValue) {
  39013. var t = function (e, t) {
  39014. this.rotationAcc[e] = t;
  39015. }.bind(this);
  39016. this.emit(ControlEvents.InteractionKey);
  39017. var i = !0;
  39018. switch (keyValue) {
  39019. case Keys.LEFTARROW:
  39020. case Keys.J:
  39021. t('x', -1);
  39022. break;
  39023. case Keys.RIGHTARROW:
  39024. case Keys.L:
  39025. t('x', 1);
  39026. break;
  39027. case Keys.I:
  39028. t('y', 1);
  39029. break;
  39030. case Keys.K:
  39031. t('y', -1);
  39032. break;
  39033. default:
  39034. i = !1;
  39035. }
  39036. i && this.emit(ControlEvents.Move, 'key');
  39037. }
  39038. }, {
  39039. key: "onKeyUp",
  39040. value: function onKeyUp(keyboardEvent) {
  39041. if (this.usable()) {
  39042. keyboardEvent.preventDefault();
  39043. keyboardEvent.stopPropagation();
  39044. this.handleKeyUp(keyboardEvent.which);
  39045. }
  39046. }
  39047. }, {
  39048. key: "handleKeyUp",
  39049. value: function handleKeyUp(keyValue) {
  39050. switch (keyValue) {
  39051. case Keys.LEFTARROW:
  39052. case Keys.J:
  39053. case Keys.RIGHTARROW:
  39054. case Keys.L:
  39055. this.rotationAcc.x = 0;
  39056. break;
  39057. case Keys.I:
  39058. case Keys.K:
  39059. this.rotationAcc.y = 0;
  39060. }
  39061. }
  39062. /**
  39063. * 给定角加速度,使开始旋转。 注:类似给定力推
  39064. */
  39065. }, {
  39066. key: "startRotating",
  39067. value: function startRotating(e, t) {
  39068. e && (this.rotationAcc.x = e);
  39069. t && (this.rotationAcc.y = t);
  39070. }
  39071. /**
  39072. * 通过物理定律来终止旋转
  39073. */
  39074. }, {
  39075. key: "stopRotating",
  39076. value: function stopRotating(e) {
  39077. e && (this.rotationSpeed.x = this.rotationSpeed.y = 0);
  39078. this.rotationAcc.set(0, 0);
  39079. }
  39080. }, {
  39081. key: "reset",
  39082. value: function reset() {
  39083. this.pointerDragOn = !1;
  39084. this.rotationAcc.set(0, 0);
  39085. this.rotationSpeed.set(0, 0);
  39086. this.pointers = [];
  39087. }
  39088. /**
  39089. * 序列化,用于保存状态。
  39090. */
  39091. }, {
  39092. key: "toJSON",
  39093. value: function toJSON() {
  39094. var cameraSpatialInfo = {
  39095. camera_position: {
  39096. x: math$2.toPrecision(this.camera.position.x, 4),
  39097. y: math$2.toPrecision(this.camera.position.y, 4),
  39098. z: math$2.toPrecision(this.camera.position.z, 4)
  39099. },
  39100. camera_quaternion: {
  39101. x: math$2.toPrecision(this.camera.quaternion.x, 4),
  39102. y: math$2.toPrecision(this.camera.quaternion.y, 4),
  39103. z: math$2.toPrecision(this.camera.quaternion.z, 4),
  39104. w: math$2.toPrecision(this.camera.quaternion.w, 4)
  39105. }
  39106. };
  39107. return cameraSpatialInfo;
  39108. }
  39109. /**
  39110. * 反序列化,用于读取状态
  39111. */
  39112. }, {
  39113. key: "setStateFromJSON",
  39114. value: function setStateFromJSON(cameraSpatialInfo) {
  39115. this.camera.position.copy(cameraSpatialInfo.camera_position);
  39116. this.camera.quaternion.copy(cameraSpatialInfo.camera_quaternion);
  39117. }
  39118. /**
  39119. * 3D图形变换的坐标系 https://blog.csdn.net/CALL_LKC/article/details/81411034
  39120. */
  39121. /**
  39122. * 许钟文 加 看向某个位置
  39123. * 逐渐看向某个位置 通过改变lon和lat
  39124. * @param {THREE.Vector3} aim
  39125. * @param {THREE.Vector3} cameraPos
  39126. * @param {JSON} option
  39127. */
  39128. }, {
  39129. key: "startLookAt",
  39130. value: function startLookAt(aim, cameraPos, option) {
  39131. var useLonLat = option && (option.lon != void 0 || option.lat != void 0);
  39132. if (!useLonLat) {
  39133. var e = cameraPos ? cameraPos.clone().sub(aim) : this.camera.position.clone().sub(aim),
  39134. o = Math.atan(e.z / e.x);
  39135. o += e.x < 0 ? Math.PI : 0, o += e.x > 0 && e.z < 0 ? 2 * Math.PI : 0;
  39136. var lon = THREE.MathUtils.radToDeg(o) + 180;
  39137. var n = Math.sqrt(e.x * e.x + e.z * e.z),
  39138. i = Math.atan(e.y / n);
  39139. var lat = -THREE.MathUtils.radToDeg(i);
  39140. var add = (lon - this.lon) % 360;
  39141. Math.abs(add) > 180 && (add > 0 ? add -= 360 : add += 360);
  39142. lon = this.lon + add;
  39143. var add = (lat - this.lat) % 360;
  39144. Math.abs(add) > 180 && (add > 0 ? add -= 360 : add += 360);
  39145. lat = this.lat + add;
  39146. }
  39147. var time = 1200,
  39148. speedFuc = easing['easeInOutQuad'];
  39149. if (option != void 0) {
  39150. if (option.soon) {
  39151. this.lon = lon;
  39152. this.lat = lat;
  39153. return;
  39154. }
  39155. if (option.speed) {
  39156. /* var a = Math.abs(lon - this.lon) * Math.PI /180;
  39157. var b = Math.abs(lat - this.lat) * Math.PI /180;
  39158. var c0 = Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.pow(Math.sin(b/2),2));
  39159. var c = Math.asin(c0) * 2; //得到旋转角度 cos(c/2)的方 = cos(a/2)的方 + cos(b/2)的方
  39160. time = c / option.speed; */
  39161. if (useLonLat) {
  39162. var c1 = option.lon ? Math.abs(option.lon - this.lon) : 0;
  39163. var c2 = option.lat ? Math.abs(option.lat - this.lat) : 0;
  39164. var c = c1 + c2;
  39165. } else var c = Math.abs(lon - this.lon) + Math.abs(lat - this.lat);
  39166. time = c / option.speed; //总角度除以速度
  39167. if (option.time) time = Math.min(option.time, time);
  39168. } else if (option.time) time = option.time;
  39169. option.fuc && setTimeout(option.fuc, time); //匀速:
  39170. option.constantSpeed && (speedFuc = null);
  39171. }
  39172. if (useLonLat) {
  39173. if (option.lon) transitions$1.start(lerp.property(this, 'lon', option.lon), time, null, 0, speedFuc);
  39174. if (option.lat) transitions$1.start(lerp.property(this, 'lat', option.lat), time, null, 0, speedFuc);
  39175. } else {
  39176. transitions$1.start(lerp.property(this, 'lon', lon), time, null, 0, speedFuc);
  39177. transitions$1.start(lerp.property(this, 'lat', lat), time, null, 0, speedFuc);
  39178. }
  39179. }
  39180. }]);
  39181. return PanoramaControls;
  39182. }(EventEmitter);
  39183. 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); }; }
  39184. 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; } }
  39185. /**
  39186. * 迷你模式相机控制器
  39187. * 主要是在轨道视角的基础上限制Pan操作的范围
  39188. */
  39189. var DollhouseControls = /*#__PURE__*/function (_OutsideControls) {
  39190. _inherits(DollhouseControls, _OutsideControls);
  39191. var _super = _createSuper$10(DollhouseControls);
  39192. function DollhouseControls(camera, dom, player) {
  39193. var _this;
  39194. _classCallCheck(this, DollhouseControls);
  39195. //OutsideControls.call(this, camera);
  39196. _this = _super.call(this, camera, dom, player);
  39197. _this.minPolarAngle = settings$3.dollhouseDefault.minPolarAngle; //最小纬度
  39198. _this.maxPolarAngle = settings$3.dollhouseDefault.maxPolarAngle; //最大纬度
  39199. _this.minDistance = settings$3.dollhouseDefault.minDistance; //最小球半径
  39200. _this.maxDistance = settings$3.dollhouseDefault.maxDistance; //最大球半径
  39201. _this.adjustedMinDistance = _this.minDistance;
  39202. _this.adjustedMaxDistance = _this.maxDistance; //鼠标所交互的界面元素
  39203. _this.dom = dom;
  39204. _this.mode = 'model'; // "security"
  39205. //鼠标、触点行为
  39206. _this.mouseActions[MouseButton.LEFT] = ControlActions.ROTATE;
  39207. _this.mouseActions[MouseButton.MIDDLE] = ControlActions.DOLLY;
  39208. _this.mouseActions[MouseButton.RIGHT] = ControlActions.PAN;
  39209. _this.touchActions[1] = ControlActions.ROTATE;
  39210. _this.touchActions[2] = ControlActions.PAN_DOLLY;
  39211. return _this;
  39212. }
  39213. /**
  39214. * 平移操作
  39215. */
  39216. _createClass(DollhouseControls, [{
  39217. key: "pan",
  39218. value: function pan(panSpeedX, panSpeedY) {
  39219. this.camera.updateMatrix();
  39220. var len = Math.max(this.camera.position.clone().sub(this.target).length(), this.mode == 'security' ? 1 : 0);
  39221. len *= Math.tan(this.camera.fov / 2 * Math.PI / 180);
  39222. this.panLeft(2 * panSpeedX * len / this.player.domElement.clientWidth);
  39223. this.panUp(-2 * panSpeedY * len / this.player.domElement.clientHeight);
  39224. }
  39225. /**
  39226. * 缩放,更改轨道半径
  39227. */
  39228. }, {
  39229. key: "updateZoom",
  39230. value: function updateZoom() {
  39231. var offsetLen = this.offset.length(); //当前轨道半径,见父类OutsideControls
  39232. return offsetLen * this.scale;
  39233. }
  39234. /**
  39235. * 设置Zoom的碰撞范围,使相机在合适的范围内缩放
  39236. * 理论上的合理范围:[模型边界半径, 世界最大范围] 与 自定义范围:[settings.dollhouseDefault.minDistance, settings.dollhouseDefault.maxDistance] 的交集
  39237. */
  39238. }, {
  39239. key: "setZoomBounds",
  39240. value: function setZoomBounds(boundingBox) {
  39241. boundingBox.min.distanceTo(boundingBox.max); //计算(模型)包围盒对角,得到模型的外边界范围
  39242. //this.suitableDistance = distance/2 / Math.tan(THREE.Math.degToRad(70/2))
  39243. var distanceHorizon = boundingBox.min.distanceTo(boundingBox.max.clone().setY(boundingBox.min.y)); //模型橫向最大距离
  39244. //var distanceVerti = (boundingBox.max.y - boundingBox.min.y) *1.1 //模型纵向最大距离 *1.1 是假定, 因为飞出后有一定俯视角度
  39245. var distanceVerti = (boundingBox.max.y - boundingBox.min.y) * 0.5 + distanceHorizon * 0.5; //模型纵向最大距离 + distanceHorizon: 飞出后有一定俯视角度
  39246. this.camera.suitModelAspect = distanceHorizon / distanceVerti; //模型比例。 用于和界面比例作比较
  39247. //this.camera.suitModelAspect = Math.min(this.camera.suitModelAspect, 1.7) //这个太大会导致fov太大,导致倾斜角度太大,然后距离很近,外侧被遮挡。 手动缩小后的损失是当屏幕宽度比大于该值时,横向不会占满,但是无大碍。
  39248. //假定飞出后当camera.aspect == camera.suitModelAspect时,刚好camera.vHov(也就是camera.fov)为默认值settings.dollhouseFOV,存储这时候的hFov(suitModelAspectHFov), 当界面宽度缩小时,模型的hFov不变,按比例变化vHov;当界面宽度放大时,fov则不变。 目的是防止模型缩得太小,自适应屏幕
  39249. this.distanceHorizon = distanceHorizon;
  39250. this.distanceVerti = distanceVerti;
  39251. this.updateDistance(this.camera.aspect);
  39252. /* var distance = boundingBox.min.distanceTo(boundingBox.max)
  39253. this.adjustedMinDistance = Math.max(Math.min(distance / 2, settings.dollhouseDefault.minDistance), 0)
  39254. this.adjustedMaxDistance = Math.min(Math.max(distance, settings.dollhouseDefault.maxDistance), settings.skyboxRadius)
  39255. this.minDistance = this.adjustedMinDistance
  39256. this.maxDistance = this.adjustedMaxDistance */
  39257. }
  39258. }, {
  39259. key: "updateDistance",
  39260. value: function updateDistance(aspect) {
  39261. var oldDistance = this.suitableDistance;
  39262. if (!this.player.model || isNaN(this.camera.suitModelAspect) || this.forbitSetRanges) return;
  39263. var boundingBox = this.player.model.boundingBox;
  39264. if (aspect <= this.camera.suitModelAspect) {
  39265. var HFov = cameraLight.getHFOVFromVFOV(this.camera.fov, aspect, 1);
  39266. this.suitableDistance = this.distanceHorizon / 2 / Math.tan(THREE.MathUtils.degToRad(HFov / 2)); //飞出时模型宽度占满屏宽时的距离
  39267. this.suitableDistance += Math.min(boundingBox.max.x - boundingBox.min.x, boundingBox.max.z - boundingBox.min.z) * 0.5; //console.log('w '+ this.suitableDistance)
  39268. } else {
  39269. this.suitableDistance = this.distanceVerti / 2 / Math.tan(THREE.MathUtils.degToRad(this.camera.fov / 2));
  39270. this.suitableDistance += Math.min(boundingBox.max.x - boundingBox.min.x, boundingBox.max.z - boundingBox.min.z) * 0.5; //console.log('h '+ this.suitableDistance)
  39271. }
  39272. this.adjustedMaxDistance = this.suitableDistance * 10; //1.2 //主要为了防止缩得太小
  39273. this.adjustedMinDistance = this.suitableDistance * 0.1; //设置为0会卡住
  39274. this.resetRanges();
  39275. if (this.enabled) {
  39276. this.scale = this.suitableDistance / oldDistance; //this.updateZoom()
  39277. }
  39278. }
  39279. /**
  39280. * 重置轨道半径,纬度的取值范围。有参按参数取值否则为全局自定义值
  39281. */
  39282. }, {
  39283. key: "resetRanges",
  39284. value: function resetRanges(e, t) {
  39285. if (this.forbitSetRanges) return;
  39286. if (e) {
  39287. this.minDistance = Math.min(e, this.minDistance);
  39288. this.maxDistance = Math.max(e, this.maxDistance);
  39289. } else {
  39290. this.minDistance = this.adjustedMinDistance;
  39291. this.maxDistance = this.adjustedMaxDistance;
  39292. }
  39293. if (t) {
  39294. this.minPolarAngle = THREE.MathUtils.degToRad(-15);
  39295. this.maxPolarAngle = THREE.MathUtils.degToRad(89.9);
  39296. } else {
  39297. this.minPolarAngle = settings$3.dollhouseDefault.minPolarAngle;
  39298. this.maxPolarAngle = settings$3.dollhouseDefault.maxPolarAngle;
  39299. }
  39300. }
  39301. }, {
  39302. key: "toJSON",
  39303. value: function toJSON() {
  39304. return OutsideControls.prototype.toJSON.call(this);
  39305. }
  39306. }]);
  39307. return DollhouseControls;
  39308. }(OutsideControls);
  39309. 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); }; }
  39310. 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; } }
  39311. defineComponent('CameraControls', function () {
  39312. return /*#__PURE__*/function (_EventEmitter) {
  39313. _inherits(CameraControls, _EventEmitter);
  39314. var _super = _createSuper$$(CameraControls);
  39315. function CameraControls() {
  39316. var _this;
  39317. _classCallCheck(this, CameraControls);
  39318. _this = _super.call(this);
  39319. _this.activeControl = null;
  39320. _this.controls = {};
  39321. _this.cameras = {};
  39322. return _this;
  39323. }
  39324. _createClass(CameraControls, [{
  39325. key: "init",
  39326. value: function init(dom, modes) {
  39327. this.setUpControls(dom, modes);
  39328. this.bindEvents(dom);
  39329. }
  39330. }, {
  39331. key: "activateControls",
  39332. value: function activateControls(mode) {
  39333. if (this.activeControl) {
  39334. this.activeControl.reset();
  39335. this.activeControl.enabled = !1;
  39336. }
  39337. this.controls[mode] && (this.controls[mode].enabled = !0);
  39338. this.activeControl = this.controls[mode];
  39339. }
  39340. }, {
  39341. key: "setUpControls",
  39342. value: function setUpControls(dom, modes) {
  39343. //许钟文改 支持control加在其他dom上
  39344. var cameras = {},
  39345. controls = {};
  39346. var modes = modes || [Viewmode$1.PANORAMA, Viewmode$1.DOLLHOUSE, Viewmode$1.FLOORPLAN],
  39347. cameraClasses = [PanoramaCamera, DollhouseCamera, FloorplanCamera],
  39348. controlClasses = [PanoramaControls, DollhouseControls, FloorplanControls];
  39349. modes.forEach(function (mode, index) {
  39350. cameras[mode] = new cameraClasses[index](dom);
  39351. controls[mode] = new controlClasses[index](cameras[mode], dom, this.$app.core.get('Player'));
  39352. controls[mode].on(ControlEvents.Move, this.emit.bind(this, ControlEvents.Move));
  39353. controls[mode].on(ControlEvents.InputStart, this.emit.bind(this, ControlEvents.InputStart));
  39354. controls[mode].on(ControlEvents.InteractionDirect, this.emit.bind(this, ControlEvents.InteractionDirect));
  39355. controls[mode].on(ControlEvents.InteractionKey, this.emit.bind(this, ControlEvents.InteractionKey));
  39356. controls[mode].on(ControlEvents.Pinch, this.emit.bind(this, ControlEvents.Pinch));
  39357. controls[mode].on(ControlEvents.Scroll, this.emit.bind(this, ControlEvents.Scroll));
  39358. }.bind(this));
  39359. this.controls = controls;
  39360. this.cameras = cameras;
  39361. }
  39362. }, {
  39363. key: "bindEvents",
  39364. value: function bindEvents(dom) {
  39365. var _this2 = this;
  39366. dom.addEventListener('mousemove', this.onMouseMove.bind(this));
  39367. dom.addEventListener('mousedown', this.onMouseDown.bind(this));
  39368. dom.addEventListener('mouseup', this.onMouseUp.bind(this));
  39369. dom.addEventListener('mouseover', this.onMouseOver.bind(this));
  39370. if (settings$3.useWheel) {
  39371. dom.addEventListener('mousewheel', this.onMouseWheel.bind(this), {
  39372. passive: false
  39373. });
  39374. dom.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), {
  39375. passive: false
  39376. });
  39377. }
  39378. dom.addEventListener('touchstart', this.onTouchStart.bind(this), {
  39379. passive: false
  39380. });
  39381. dom.addEventListener('touchmove', this.onTouchMove.bind(this), {
  39382. passive: false
  39383. });
  39384. dom.addEventListener('touchend', this.onTouchEnd.bind(this));
  39385. dom.addEventListener('contextmenu', function (e) {
  39386. e.preventDefault();
  39387. });
  39388. dom.addEventListener('pointerdown', this.onPointerDown.bind(this));
  39389. dom.addEventListener('pointermove', this.onPointerMove.bind(this));
  39390. dom.addEventListener('pointerup', this.onPointerUp.bind(this));
  39391. dom.addEventListener('pointerout', this.onPointerCancel.bind(this));
  39392. dom.addEventListener('pointercancel', this.onPointerCancel.bind(this));
  39393. document.addEventListener('keydown', this.onKeyDown.bind(this));
  39394. document.addEventListener('keyup', this.onKeyUp.bind(this));
  39395. this.$app.core.get('ModelManager').on(ModelManagerEvents.ActiveModelChanged, function (e) {
  39396. this.setModelForControls(e.model);
  39397. }.bind(this));
  39398. this.on('syncCadAnd3D', function (info) {
  39399. _this2.controls[Viewmode$1.FLOORPLAN].updateDirect(info);
  39400. }); // info = {width:..,height:...,center:...}
  39401. this.on('syncCadAnd3DForRotate', function (info) {
  39402. _this2.controls[Viewmode$1.FLOORPLAN].updateForRotateCad(info);
  39403. });
  39404. }
  39405. }, {
  39406. key: "setModelForControls",
  39407. value: function setModelForControls(model) {
  39408. //this.controls[Viewmode.DOLLHOUSE].setZoomBounds(model.boundingBox)
  39409. var boundingBox = model.boundingBox.clone().expandByScalar(settings$3.modelBoundsPadding);
  39410. [Viewmode$1.DOLLHOUSE, Viewmode$1.FLOORPLAN].forEach(function (mode) {
  39411. this.controls[mode].setZoomBounds(model.boundingBox);
  39412. this.controls[mode].setBounds(boundingBox);
  39413. }.bind(this));
  39414. }
  39415. }, {
  39416. key: "onMouseDown",
  39417. value: function onMouseDown(e) {
  39418. e.preventDefault();
  39419. this.activeControl && this.activeControl.onMouseDown(e);
  39420. }
  39421. }, {
  39422. key: "onMouseMove",
  39423. value: function onMouseMove(e) {
  39424. e.preventDefault();
  39425. this.activeControl && this.activeControl.onMouseMove(e);
  39426. }
  39427. }, {
  39428. key: "onMouseUp",
  39429. value: function onMouseUp(e) {
  39430. e.preventDefault();
  39431. this.activeControl && this.activeControl.onMouseUp(e);
  39432. }
  39433. }, {
  39434. key: "onMouseOver",
  39435. value: function onMouseOver(e) {
  39436. e.preventDefault();
  39437. this.activeControl && this.activeControl.onMouseOver(e);
  39438. }
  39439. }, {
  39440. key: "onMouseWheel",
  39441. value: function onMouseWheel(e) {
  39442. e.preventDefault();
  39443. this.activeControl && this.activeControl.onMouseWheel(e);
  39444. }
  39445. }, {
  39446. key: "onTouchStart",
  39447. value: function onTouchStart(e) {
  39448. e.preventDefault();
  39449. this.activeControl && this.activeControl.onTouchStart(e);
  39450. }
  39451. }, {
  39452. key: "onTouchMove",
  39453. value: function onTouchMove(e) {
  39454. var _this3 = this;
  39455. var func = function func() {
  39456. e.preventDefault();
  39457. _this3.activeControl && _this3.activeControl.onTouchMove(e);
  39458. };
  39459. if (this.$app.VRScreenSYNC) {
  39460. common$1.debounce(func, 1000 / 60, true)(); //会导致带看leader触屏缩放摇晃。
  39461. } else {
  39462. func();
  39463. }
  39464. }
  39465. }, {
  39466. key: "onTouchEnd",
  39467. value: function onTouchEnd(e) {
  39468. e.preventDefault();
  39469. this.activeControl && this.activeControl.onTouchEnd(e);
  39470. }
  39471. }, {
  39472. key: "onPointerDown",
  39473. value: function onPointerDown(e) {
  39474. e.preventDefault();
  39475. if (this.activeControl) switch (e.pointerType) {
  39476. case 'mouse':
  39477. this.activeControl.onMouseDown(e);
  39478. break;
  39479. default:
  39480. this.activeControl.onPointerDown(e);
  39481. }
  39482. }
  39483. }, {
  39484. key: "onPointerMove",
  39485. value: function onPointerMove(e) {
  39486. var _this4 = this;
  39487. var func = function func() {
  39488. e.preventDefault();
  39489. if (_this4.activeControl) switch (e.pointerType) {
  39490. case 'mouse':
  39491. _this4.activeControl.onMouseMove(e);
  39492. break;
  39493. default:
  39494. _this4.activeControl.onPointerMove(e);
  39495. }
  39496. };
  39497. if (this.$app.VRScreenSYNC) {
  39498. common$1.debounce(func, 1000 / 60, true)();
  39499. } else {
  39500. func();
  39501. }
  39502. }
  39503. }, {
  39504. key: "onPointerUp",
  39505. value: function onPointerUp(e) {
  39506. e.preventDefault();
  39507. if (this.activeControl) {
  39508. switch (e.pointerType) {
  39509. case 'mouse':
  39510. this.activeControl.onMouseUp(e);
  39511. break;
  39512. default:
  39513. this.activeControl.onPointerUp(e);
  39514. }
  39515. this.emit('pointerUp');
  39516. }
  39517. }
  39518. }, {
  39519. key: "onPointerCancel",
  39520. value: function onPointerCancel(e) {
  39521. e.preventDefault();
  39522. this.activeControl && 'mouse' !== e.pointerType && this.activeControl.onPointerUp(e);
  39523. }
  39524. }, {
  39525. key: "onKeyDown",
  39526. value: function onKeyDown(e) {
  39527. if (!this.$app.config.useShortcutKeys) {
  39528. return;
  39529. }
  39530. if (e.metaKey || e.ctrlKey) ; else {
  39531. e.preventDefault();
  39532. this.activeControl && this.activeControl.onKeyDown(e);
  39533. }
  39534. }
  39535. }, {
  39536. key: "onKeyUp",
  39537. value: function onKeyUp(e) {
  39538. e.preventDefault();
  39539. this.activeControl && this.activeControl.onKeyUp(e);
  39540. }
  39541. }]);
  39542. return CameraControls;
  39543. }(EventEmitter);
  39544. });
  39545. var PanoVideoEvents = {
  39546. CanPlay: 'panovideo.canplay',
  39547. StartPlay: 'panovideo.start',
  39548. Resume: 'panovideo.resume',
  39549. Pause: 'panovideo.pause',
  39550. Stop: 'panovideo.stop',
  39551. Switch: 'panovideo.switch'
  39552. };
  39553. function _createForOfIteratorHelper$9(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$9(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; } } }; }
  39554. function _unsupportedIterableToArray$9(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$9(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$9(o, minLen); }
  39555. function _arrayLikeToArray$9(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; }
  39556. 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); }; }
  39557. 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; } }
  39558. var H5VideoPlayer$1 = /*#__PURE__*/function (_EventEmitter) {
  39559. _inherits(H5VideoPlayer, _EventEmitter);
  39560. var _super = _createSuper$_(H5VideoPlayer);
  39561. function H5VideoPlayer(dom, videos) {
  39562. var _this;
  39563. _classCallCheck(this, H5VideoPlayer);
  39564. _this = _super.call(this); // this.listeneNum = 0
  39565. _this.domElement = dom;
  39566. _this.os = ''; //Android | Ios | PC
  39567. _this.environment = ''; //WeChat | WeChatMiniProgram | Other
  39568. // this.videos = new Map();
  39569. // this.textures = new Map();
  39570. _this._resource = new Map();
  39571. videos.forEach(function (value, key) {
  39572. var video = _this._createVideoElement(value.mp4.url, // config.appenv == 'shipin' &&
  39573. _this._resource.size == 0);
  39574. _this._resource.set(key, {
  39575. url: value.mp4.url,
  39576. video: video,
  39577. texture: _this._createTexture(video),
  39578. loaded: true
  39579. });
  39580. /* if(key == 350){
  39581. } */
  39582. });
  39583. _this.video = null; // this.texture = new THREE.VideoTexture(document.createElement('video'))
  39584. // this.texture.minFilter = THREE.LinearFilter
  39585. _this.isFirstPlay = true;
  39586. _this.isMuted = true;
  39587. _this.events = {
  39588. onDomElementTouchStart: function onDomElementTouchStart() {
  39589. //---ios
  39590. //console.log('onDomElementTouchStart')
  39591. if (_this.shouldPlay) {
  39592. _this.video.muted = _this.isMuted;
  39593. _this.video.play();
  39594. console.log('onDomElementTouchStart muted', _this.video.muted, 'paused', _this.video.paused);
  39595. _this.domElement.removeEventListener('touchstart', _this.events.onDomElementTouchStart, true);
  39596. }
  39597. },
  39598. onDomElementTouchEnd: function onDomElementTouchEnd() {
  39599. if (_this.shouldPlay) {
  39600. _this.video.muted = _this.isMuted;
  39601. _this.domElement.removeEventListener('touchend', _this.events.onDomElementTouchEnd, true);
  39602. }
  39603. },
  39604. onDomElementMouseDown: function onDomElementMouseDown() {
  39605. if (_this.shouldPlay) {
  39606. _this.video.muted = _this.isMuted;
  39607. _this.domElement.removeEventListener('mousedown', _this.events.onDomElementMouseDown, true);
  39608. }
  39609. }
  39610. };
  39611. return _this;
  39612. }
  39613. _createClass(H5VideoPlayer, [{
  39614. key: "_createTexture",
  39615. value: function _createTexture(videoElement) {
  39616. var texture = new THREE.VideoTexture(videoElement);
  39617. texture.minFilter = THREE.LinearFilter;
  39618. texture.uploaded = false;
  39619. return texture;
  39620. }
  39621. }, {
  39622. key: "_createVideoElement",
  39623. value: function _createVideoElement(src) {
  39624. var video; // if (config.appenv == 'shipin' && isInPage) {
  39625. // video = parent.document.querySelector('#video-' + config.projectNum)
  39626. // video._isPrepload = true
  39627. // } else
  39628. {
  39629. video = document.createElement('video');
  39630. video.setAttribute('crossOrigin', 'anonymous');
  39631. video.setAttribute('playsinline', 'true');
  39632. video.setAttribute('x5-playsinline', 'true');
  39633. video.setAttribute('webkit-playsinline', 'true');
  39634. video.setAttribute('x5-video-player-type', 'h5');
  39635. video.setAttribute('controls', 'true'); // video.preload = true //"none";
  39636. video.autoplay = false;
  39637. video.muted = this.isMuted;
  39638. video.loop = true;
  39639. video.src = src;
  39640. video.style.position = 'fixed';
  39641. video.style.left = '0';
  39642. video.style.top = '0';
  39643. video.style.width = browser$1.urlHasValue('debug') ? '300px' : '1px';
  39644. video.style.height = browser$1.urlHasValue('debug') ? '300px' : '1px';
  39645. video.style.display = 'block'; // 关于视频卡顿问题,经测试,通过设置zIndex=-1、opacity=0来隐藏video可规避
  39646. video.style.zIndex = browser$1.urlHasValue('debug') ? '1000' : '0';
  39647. video.style.opacity = browser$1.urlHasValue('debug') ? '1' : '0'; //this.domElement.appendChild(video)
  39648. }
  39649. /* if (!H5VideoPlayer.videoReady) {
  39650. H5VideoPlayer.videoReady = true
  39651. function iosInitAutoPlay() {
  39652. console.log('iosInitAutoPlay', video.src)
  39653. video.play()
  39654. setTimeout(()=>{
  39655. console.log('iosInitAutoPlay result', video.paused, __sdk.core.get('Player').model.skybox.material.defines.HasVideo)
  39656. video.pause()
  39657. },100)
  39658. window.listener.removeEventListener('touchstart', iosInitAutoPlay, true)
  39659. }
  39660. //避免重复监听
  39661. window.listener = window //window.document.body
  39662. window.listener.addEventListener('touchstart', iosInitAutoPlay, true)
  39663. } */
  39664. return video;
  39665. }
  39666. }, {
  39667. key: "_onCanPlay",
  39668. value: function _onCanPlay() {
  39669. this.emit(PanoVideoEvents.CanPlay);
  39670. }
  39671. }, {
  39672. key: "_onPlaying",
  39673. value: function _onPlaying() {
  39674. var _this2 = this;
  39675. //console.log('_onPlaying muted', this.video.muted)
  39676. this.emit(PanoVideoEvents.Switch, this.texture);
  39677. this.video.ontimeupdate = function (event) {
  39678. if (_this2.video.currentTime > 0.5) {
  39679. _this2.emit(PanoVideoEvents.Resume);
  39680. _this2.video.ontimeupdate = null;
  39681. _this2.isFirstPlay = false; //console.log('播放成功')
  39682. }
  39683. };
  39684. if (this.isFirstPlay) this.emit(PanoVideoEvents.StartPlay);
  39685. }
  39686. }, {
  39687. key: "_onPause",
  39688. value: function _onPause(event) {
  39689. if (this.video) {
  39690. this.video._isPaused = true;
  39691. }
  39692. this.emit(PanoVideoEvents.Pause);
  39693. }
  39694. }, {
  39695. key: "preload",
  39696. value: function preload(video) {
  39697. var _this3 = this;
  39698. if (video == this.video || video._isPrepload) return;
  39699. video.muted = true;
  39700. try {
  39701. top.WeixinJSBridge && top.WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
  39702. video.play();
  39703. }, false);
  39704. } catch (error) {
  39705. video.play();
  39706. }
  39707. video.onplaying = function () {
  39708. video.pause();
  39709. video._isPrepload = true;
  39710. if (_this3.video && !_this3.video._isPaused) {
  39711. _this3.video.play();
  39712. }
  39713. };
  39714. }
  39715. }, {
  39716. key: "preloadAll",
  39717. value: function preloadAll() {
  39718. if (this.video) {
  39719. this.video._isPaused = this.video.paused;
  39720. }
  39721. var _iterator = _createForOfIteratorHelper$9(this._resource.values()),
  39722. _step;
  39723. try {
  39724. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  39725. var item = _step.value;
  39726. this.preload(item.video);
  39727. }
  39728. } catch (err) {
  39729. _iterator.e(err);
  39730. } finally {
  39731. _iterator.f();
  39732. }
  39733. }
  39734. }, {
  39735. key: "preloadPano",
  39736. value: function preloadPano(pano) {
  39737. var item = this._resource.get(pano.id);
  39738. if (item) {
  39739. this.preload(item.video);
  39740. }
  39741. }
  39742. }, {
  39743. key: "startVideo",
  39744. value: function startVideo(panoId, tryIfFirstplay) {
  39745. var item = this._resource.get(panoId);
  39746. if (item) {
  39747. item.video.autoplay = true;
  39748. item.video.onplaying = this._onPlaying.bind(this);
  39749. item.video.onpause = this._onPause.bind(this);
  39750. item.video.oncanplay = this._onCanPlay.bind(this);
  39751. this.video = item.video;
  39752. this.texture = item.texture; // // debug
  39753. // this.video.addEventListener("playing", () => console.error('mp4_debug_playing'))
  39754. // this.video.addEventListener("pause", () => console.error('mp4_debug_pause'))
  39755. // this.video.addEventListener("canplay", () => console.error('mp4_debug_canplay'))
  39756. // this.video.onloadstart = () => console.error('mp4_debug_loadstart')
  39757. // this.video.onloadedmetadata = () => console.error('mp4_debug_loadedmetadata', this.video.readyState)
  39758. // this.video.onloadeddata = () => console.error('mp4_debug_loadeddata', this.video.readyState)
  39759. // this.video.onprogress = () => {
  39760. // console.error('mp4_debug_progress', this.video.readyState)
  39761. // }
  39762. // this.video.oncanplaythrough = () => console.error('mp4_debug_canplaythrough:视频源数据加载完成')
  39763. // this.video.onwaiting = () => console.error('mp4_debug_waiting')
  39764. // this.video.onerror = (e) => console.error('mp4_debug_error', e)
  39765. // this.video.onabort = () => console.error('mp4_debug_abort: 客户端主动终止下载')
  39766. // this.video.onemptied = () => console.error('mp4_debug_emptied: video元素变为未初始化状态')
  39767. // this.video.onstalled = () => {
  39768. // console.error('mp4_debug_stalled: 浏览器尝试获取媒体数据但数据不可用(网速异常)')
  39769. // }
  39770. // this.video.onseeking = () => console.error('mp4_debug_seeking: 浏览器正在请求数据(视频跳转中)')
  39771. // this.video.onseeked = () => console.error('mp4_debug_seeked')
  39772. // this.video.onsuspend = () => console.error('mp4_debug_suspend: 浏览器暂停获取媒体数据(延迟下载)')
  39773. // this.video.style.display = ""
  39774. /* if(tryIfFirstplay) {
  39775. this.isFirstPlay && this.play(this.video ) */
  39776. /* }else */
  39777. if (this.video.paused) {
  39778. this.play(this.video);
  39779. } else {
  39780. this._onPlaying();
  39781. }
  39782. }
  39783. } // 业务规定要自动播放而且带有声音,不符合Autoplay Policy (https://goo.gl/xX8pDD)。
  39784. // 微信平台可以绕过 Autoplay Policy,所以业务只考虑微信,但这里对普通H5也进行了处理
  39785. }, {
  39786. key: "play",
  39787. value: function play(videoElement) {
  39788. var _this4 = this;
  39789. this.shouldPlay = videoElement;
  39790. if (this.isFirstPlay || !videoElement._isCanplay) {
  39791. if (browser$1.detectWeixin()) {
  39792. //用微信平台的 WeixinJSBridge 越过 Autoplay Policy
  39793. try {
  39794. top.WeixinJSBridge && top.WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
  39795. if (_this4.shouldPlay == videoElement) {
  39796. console.log('play', videoElement.src.split('/').pop());
  39797. videoElement.play();
  39798. videoElement._isCanplay = true;
  39799. }
  39800. }, false);
  39801. } catch (error) {
  39802. videoElement.play();
  39803. videoElement._isCanplay = true;
  39804. }
  39805. } //符合Autoplay Policy的自动播放,处理方式为:先静音播放,再由用户触发打开声音
  39806. else {
  39807. videoElement.play();
  39808. videoElement._isCanplay = true; //经测试,正确的事件为,IOS-touchstart,Android -- touchend 否则setMuted后会异常暂停播放 (细节挖坑!)
  39809. //测试样本 IOS: safari chrome | Android: chrome
  39810. if (browser$1.detectAndroidMobile()) {
  39811. this.domElement.addEventListener('touchend', this.events.onDomElementTouchEnd, true);
  39812. } else if (browser$1.detectIOS()) {
  39813. this.domElement.addEventListener('touchstart', this.events.onDomElementTouchStart, true);
  39814. } else {
  39815. this.domElement.addEventListener('mousedown', this.events.onDomElementMouseDown, true);
  39816. }
  39817. }
  39818. } else {
  39819. videoElement.play();
  39820. } //console.log('try play', videoElement.paused, videoElement.src)
  39821. }
  39822. }, {
  39823. key: "pauseVideo",
  39824. value: function pauseVideo(panoId) {
  39825. var item = this._resource.get(panoId);
  39826. if (item) {
  39827. //console.error('pauseVideo', panoId)
  39828. item.video.pause();
  39829. item.video.muted = true;
  39830. item.video.onplaying = null;
  39831. if (this.shouldPlay == item.video) this.shouldPlay = false;
  39832. }
  39833. }
  39834. }, {
  39835. key: "pause",
  39836. value: function pause() {
  39837. if (this.video) {
  39838. //console.error('pause', this.video.src.split('/').pop())
  39839. this.video._isPaused = true;
  39840. this.video.pause();
  39841. this.shouldPlay = false;
  39842. }
  39843. }
  39844. }, {
  39845. key: "resume",
  39846. value: function resume() {
  39847. if (this.video) {
  39848. this.play(this.video);
  39849. this.video.onplaying = this._onPlaying.bind(this);
  39850. } else {
  39851. console.warn('PanoVideoRenderer: 没有可播放的视频');
  39852. }
  39853. }
  39854. }, {
  39855. key: "setMuted",
  39856. value: function setMuted(muted) {
  39857. //console.log('setMuted', muted )
  39858. var _iterator2 = _createForOfIteratorHelper$9(this._resource.values()),
  39859. _step2;
  39860. try {
  39861. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  39862. var item = _step2.value;
  39863. item.video.muted = muted;
  39864. } //this.video && (this.video.muted = muted)
  39865. } catch (err) {
  39866. _iterator2.e(err);
  39867. } finally {
  39868. _iterator2.f();
  39869. }
  39870. this.isMuted = muted;
  39871. }
  39872. }]);
  39873. return H5VideoPlayer;
  39874. }(EventEmitter);
  39875. H5VideoPlayer$1.videoReady = false;
  39876. 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; } } }; }
  39877. 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); }
  39878. 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; }
  39879. 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); }; }
  39880. 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; } }
  39881. var FlvVideoPlayer$1 = /*#__PURE__*/function (_EventEmitter) {
  39882. _inherits(FlvVideoPlayer, _EventEmitter);
  39883. var _super = _createSuper$Z(FlvVideoPlayer);
  39884. function FlvVideoPlayer(dom, videos) {
  39885. var _this;
  39886. _classCallCheck(this, FlvVideoPlayer);
  39887. _this = _super.call(this);
  39888. _this.domElement = dom;
  39889. _this.instances = new Map();
  39890. _this.instanceTextures = new Map();
  39891. videos.forEach(function (value, key) {
  39892. // if( config.appenv == "shipin" && this.instances.size>0){
  39893. // return
  39894. // }
  39895. _this.instances.set(key, _this._createVideo(value.flv.url));
  39896. var videoTexture = new THREE__namespace.VideoTexture(_this.instances.get(key).videoElement);
  39897. videoTexture.minFilter = THREE__namespace.LinearFilter;
  39898. _this.instanceTextures.set(key, videoTexture);
  39899. });
  39900. _this.video = null;
  39901. _this.texture = null;
  39902. _this.isFirstPlay = true;
  39903. _this.isMuted = true;
  39904. _this.events = {
  39905. onDomElementTouchStart: function onDomElementTouchStart() {
  39906. //---ios
  39907. //console.log('onDomElementTouchStart')
  39908. /* if (this.shouldPlay) {
  39909. this.video.muted = this.isMuted
  39910. this.video.play()
  39911. console.log('onDomElementTouchStart muted', this.video.muted, 'paused', this.video.paused)
  39912. this.domElement.removeEventListener('touchstart', this.events.onDomElementTouchStart, true)
  39913. }*/
  39914. _this.video.muted = _this.isMuted;
  39915. _this.domElement.removeEventListener('touchstart', _this.events.onDomElementTouchStart, true);
  39916. },
  39917. onDomElementTouchEnd: function onDomElementTouchEnd() {
  39918. //if (this.shouldPlay) {
  39919. _this.video.muted = _this.isMuted;
  39920. _this.domElement.removeEventListener('touchend', _this.events.onDomElementTouchEnd, true); //}
  39921. },
  39922. onDomElementMouseDown: function onDomElementMouseDown() {
  39923. //if (this.shouldPlay) {
  39924. _this.video.muted = _this.isMuted;
  39925. _this.domElement.removeEventListener('mousedown', _this.events.onDomElementMouseDown, true); //}
  39926. }
  39927. };
  39928. return _this;
  39929. }
  39930. _createClass(FlvVideoPlayer, [{
  39931. key: "_createVideo",
  39932. value: function _createVideo(url) {
  39933. var video = document.createElement('video');
  39934. video.setAttribute('crossOrigin', 'anonymous');
  39935. video.setAttribute('playsinline', 'true');
  39936. video.setAttribute('webkit-playsinline', 'true');
  39937. video.setAttribute('controls', 'true');
  39938. video.setAttribute('unfullscreen', 'true');
  39939. video.autoplay = false;
  39940. video.muted = true;
  39941. video.loop = true;
  39942. video.style.position = 'fixed';
  39943. video.style.left = '0';
  39944. video.style.top = '0';
  39945. video.style.width = browser$1.urlHasValue('debug') ? '200px' : '1px';
  39946. video.style.display = 'block'; // 关于视频卡顿问题,经测试,通过设置zIndex=-1、opacity=0来隐藏video可规避
  39947. video.style.zIndex = browser$1.urlHasValue('debug') ? '1000' : '0';
  39948. video.style.opacity = browser$1.urlHasValue('debug') ? '1' : '0'; //this.domElement.appendChild(video) //bug:1 安卓似乎会在 browser.requestFullscreen(document.body) 后全屏(点击vr时)时播放显示视频
  39949. //2 安卓微信在vr分屏走到球幕视频requestFullscreen会退出分屏,原因是视频+全屏 = 被微信强制竖屏
  39950. var player = flvjs.createPlayer({
  39951. type: 'flv',
  39952. url: url
  39953. }, {
  39954. lazyLoad: true,
  39955. lazyLoadMaxDuration: 5
  39956. });
  39957. player.videoElement = video;
  39958. player.attachMediaElement(video);
  39959. player.on(flvjs.Events.ERROR, this._onPlayerError.bind(this));
  39960. return player;
  39961. }
  39962. }, {
  39963. key: "_onPlayerError",
  39964. value: function _onPlayerError(error) {
  39965. console.warn('球幕视频资源加载错误:', error);
  39966. }
  39967. }, {
  39968. key: "_onPlaying",
  39969. value: function _onPlaying() {
  39970. var _this2 = this;
  39971. this.emit(PanoVideoEvents.Switch, this.texture);
  39972. this.video.ontimeupdate = function (event) {
  39973. if (_this2.video.currentTime > 0.2) {
  39974. _this2.emit(PanoVideoEvents.Resume);
  39975. if (_this2.isFirstPlay) _this2.emit(PanoVideoEvents.StartPlay);
  39976. _this2.isFirstPlay = false;
  39977. _this2.video.ontimeupdate = null;
  39978. }
  39979. };
  39980. }
  39981. }, {
  39982. key: "_onPause",
  39983. value: function _onPause() {
  39984. this.emit(PanoVideoEvents.Pause);
  39985. this.state = 0;
  39986. }
  39987. }, {
  39988. key: "preloadPano",
  39989. value: function preloadPano(pano) {
  39990. var instance = this.instances.get(pano.id);
  39991. if (instance && instance.buffered.length == 0) {
  39992. instance.load();
  39993. }
  39994. }
  39995. }, {
  39996. key: "startVideo",
  39997. value: function startVideo(panoId) {
  39998. var instance = this.instances.get(panoId);
  39999. if (instance) {
  40000. instance.buffered.length == 0 && instance.load();
  40001. this.video = instance.videoElement;
  40002. this.video.onplaying = this._onPlaying.bind(this);
  40003. this.video.onpause = this._onPause.bind(this); // 直接取提前准备好的VideoTexture
  40004. // 不能直接给this.texture.image赋值this.video,会在手机上无法播放;
  40005. // 也不能在这里new THREE.VideoTexture,有时会有一小段黑屏
  40006. this.texture = this.instanceTextures.get(panoId);
  40007. if (this.video.paused) {
  40008. this.play(this.video);
  40009. } else {
  40010. this._onPlaying();
  40011. }
  40012. }
  40013. }
  40014. }, {
  40015. key: "pauseVideo",
  40016. value: function pauseVideo(panoId) {
  40017. var instance = this.instances.get(panoId);
  40018. if (instance) {
  40019. instance.videoElement.pause();
  40020. instance.videoElement.onplaying = null;
  40021. }
  40022. } // 业务规定要自动播放而且带有声音,不符合Autoplay Policy (https://goo.gl/xX8pDD)。
  40023. // 微信平台可以绕过 Autoplay Policy,所以业务只考虑微信,但这里对普通H5也进行了处理
  40024. }, {
  40025. key: "play",
  40026. value: function play(videoElement) {
  40027. if (this.isFirstPlay) {
  40028. videoElement.play(); //经测试,正确的事件为,IOS-touchstart,Android -- touchend 否则setMuted后会异常暂停播放 (细节挖坑!)
  40029. //测试样本 IOS: safari chrome | Android: chrome
  40030. if (browser$1.detectAndroidMobile()) {
  40031. this.domElement.addEventListener('touchend', this.events.onDomElementTouchEnd, true);
  40032. } else if (browser$1.detectIOS()) {
  40033. this.domElement.addEventListener('touchstart', this.events.onDomElementTouchStart, true);
  40034. } else {
  40035. this.domElement.addEventListener('mousedown', this.events.onDomElementMouseDown, true);
  40036. }
  40037. } else {
  40038. videoElement.play();
  40039. }
  40040. }
  40041. }, {
  40042. key: "pause",
  40043. value: function pause() {
  40044. this.video && this.video.pause();
  40045. }
  40046. }, {
  40047. key: "resume",
  40048. value: function resume() {
  40049. if (this.video) {
  40050. this.play(this.video);
  40051. } else {
  40052. console.warn('FlvVideoPlayer: 没有可播放的视频');
  40053. }
  40054. }
  40055. }, {
  40056. key: "setMuted",
  40057. value: function setMuted(muted) {
  40058. var _iterator = _createForOfIteratorHelper$8(this.instances.values()),
  40059. _step;
  40060. try {
  40061. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  40062. var instance = _step.value;
  40063. instance.videoElement.muted = muted;
  40064. }
  40065. } catch (err) {
  40066. _iterator.e(err);
  40067. } finally {
  40068. _iterator.f();
  40069. }
  40070. this.isMuted = muted;
  40071. }
  40072. /* onDomElementTouchStart() {
  40073. this.setMuted(false)
  40074. this.domElement.removeEventListener('touchstart', this.onDomElementTouchStart)
  40075. }
  40076. onDomElementTouchEnd() {
  40077. this.setMuted(false)
  40078. this.domElement.removeEventListener('touchstart', this.onDomElementTouchEnd)
  40079. }
  40080. onDomElementMouseDown() {
  40081. this.setMuted(false)
  40082. this.domElement.removeEventListener('mousedown', this.onDomElementMouseDown)
  40083. } */
  40084. }]);
  40085. return FlvVideoPlayer;
  40086. }(EventEmitter);
  40087. var PanoVideoRendererState = {
  40088. Pause: 0,
  40089. Playing: 1
  40090. };
  40091. 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); }; }
  40092. 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; } }
  40093. defineComponent('PanoVideoRenderer', function () {
  40094. return /*#__PURE__*/function (_EventEmitter) {
  40095. _inherits(PanoVideoRenderer, _EventEmitter);
  40096. var _super = _createSuper$Y(PanoVideoRenderer);
  40097. function PanoVideoRenderer() {
  40098. var _this;
  40099. _classCallCheck(this, PanoVideoRenderer);
  40100. _this = _super.call(this);
  40101. window.panoVideoRenderer = _assertThisInitialized(_this);
  40102. _this.version = 1;
  40103. _this.videoPlayer = null;
  40104. _this.activePanorama = null;
  40105. _this.nearestPano = null;
  40106. _this.ready = false;
  40107. _this._state = PanoVideoRendererState.Pause;
  40108. _this.texture = null;
  40109. _this.isGuiding = false;
  40110. _this.isRecording = false;
  40111. _this.isSoundRecording = false;
  40112. _this.loadingAnimEnable = true;
  40113. _this.loadingTimeStamp = 0;
  40114. _this.loadingUITimer = 0;
  40115. _this.loadingUIAnimHandler = 0;
  40116. var uniforms = THREE.UniformsUtils.clone(shaders.videoLoading.uniforms);
  40117. uniforms['uColor'].value = new THREE.Vector4(0, 0.7843137254901961, 0.6862745098039216, 0.7);
  40118. _this.loadingUI = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.4, 0.4), new THREE.RawShaderMaterial({
  40119. uniforms: uniforms,
  40120. vertexShader: shaders.videoLoading.vertexShader,
  40121. fragmentShader: shaders.videoLoading.fragmentShader,
  40122. transparent: true
  40123. }));
  40124. _this.loadingUI.visible = false;
  40125. return _this;
  40126. }
  40127. _createClass(PanoVideoRenderer, [{
  40128. key: "init",
  40129. value: function init(videosInfo) {
  40130. var _this2 = this;
  40131. var player = this.$app.core.get('Player');
  40132. this.videosInfo = videosInfo;
  40133. if (!videosInfo) {
  40134. logger$1.warn('PanoVideoRenderer初始化失败,数据为空');
  40135. return;
  40136. }
  40137. this.version = videosInfo.version; // this.initVideoPlayer(this.$app.dom, videosInfo.videos)
  40138. player.on('guide/play/start', function (index) {
  40139. _this2.isGuiding = true;
  40140. _this2.setMuted(true);
  40141. });
  40142. player.on('guide/play/pause', function (index) {
  40143. _this2.isGuiding = false;
  40144. _this2.setMuted(false);
  40145. });
  40146. this.$app.core.get('Player').on('guide/play/stop', function (index) {
  40147. _this2.isGuiding = false;
  40148. _this2.setMuted(false);
  40149. });
  40150. this.ready = true;
  40151. if (browser$1.detectIE() || navigator.userAgent.match('JSN-AL00')) {
  40152. //之前的记录:JSN-AL00 荣耀8x Harmony OS2.0 微信8.0.28 无法显示球幕 2023.5.29又发现可以显示 场景:KK-t-Gw0q49v8k4W
  40153. this.ready = false;
  40154. console.warn('浏览器不支持球幕视频', navigator.userAgent);
  40155. }
  40156. this.$app.core.get('SceneRenderer').scene.add(this.loadingUI);
  40157. /* let updateVideoMarkerDisplay = ()=>{ //---如果要在这些界面上隐藏video图标的话
  40158. if(player.mode != 'floorplan') return //?
  40159. let showVideo = this.canShowMarker('floorplan')
  40160. console.log('updateVideoMarkerDisplay', showVideo)
  40161. player.model.panos.forEach((pano)=>{
  40162. let v = showVideo && (player.model.allFloorsVisible || !pano.floor.hidden)
  40163. if(pano.flagSpot) pano.marker.material.opacity = v ? 1 : 0
  40164. })
  40165. }
  40166. player.on('beginTagVisiSetting', updateVideoMarkerDisplay)
  40167. player.on('exitTagVisiSetting', updateVideoMarkerDisplay)
  40168. player.on('editViewStateChange', updateVideoMarkerDisplay)
  40169. player.on('beginEditOverlay', updateVideoMarkerDisplay)
  40170. player.on('endEditOverlay', updateVideoMarkerDisplay) */
  40171. var updateVideoMarkerDisplay = function updateVideoMarkerDisplay() {
  40172. //---如果要在这些界面上隐藏video图标的话
  40173. if (player.mode != 'floorplan') return; //?
  40174. var showVideo = _this2.canShowMarker('floorplan');
  40175. console.log('updateVideoMarkerDisplay', showVideo);
  40176. player.model.panos.forEach(function (pano) {
  40177. var v = showVideo && (player.model.allFloorsVisible || !pano.floor.hidden);
  40178. if (pano.flagSpot) pano.marker.material.opacity = v ? 1 : 0;
  40179. });
  40180. };
  40181. player.on('linkEditorSetVisible', function (s) {
  40182. updateVideoMarkerDisplay();
  40183. });
  40184. var recoverVideoMarkers = function recoverVideoMarkers() {
  40185. //---恢复video的marker显示
  40186. player.model.panos.forEach(function (pano) {
  40187. var v = player.model.allFloorsVisible || !pano.floor.hidden;
  40188. if (pano.flagSpot) pano.marker.material.opacity = v ? 1 : 0;
  40189. });
  40190. };
  40191. player.on('editViewStateChange', function (state) {
  40192. //退出view的编辑
  40193. if (state == false) recoverVideoMarkers();
  40194. });
  40195. }
  40196. }, {
  40197. key: "initVideoPlayer",
  40198. value: function initVideoPlayer(dom, videos) {
  40199. var _VersionControl$getEn = VersionControl.getEnvironment(),
  40200. os = _VersionControl$getEn.os,
  40201. environment = _VersionControl$getEn.environment;
  40202. /* // if (window.navigator.userAgent.indexOf('WindowsWechat') === -1 && window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  40203. // // 小米自带浏览器只能用FlvVideoPlayer
  40204. // this.videoPlayer = new FlvVideoPlayer(dom, videos)
  40205. // } else {
  40206. this.videoPlayer = new H5VideoPlayer(dom, videos)
  40207. // } */
  40208. //--------之前为什么注释呢?
  40209. //oppo k5 自带的浏览器flv和h5均无法播放, google edge浏览器可以
  40210. //来自v3:
  40211. if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  40212. // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
  40213. this.videoPlayer = new FlvVideoPlayer$1(dom, videos); //console.log('use FlvVideoPlayer')
  40214. } else {
  40215. //console.log('use H5VideoPlayer')
  40216. this.videoPlayer = new H5VideoPlayer$1(dom, videos);
  40217. }
  40218. this.videoPlayer.on(PanoVideoEvents.CanPlay, this.onVideoCanPlay.bind(this));
  40219. this.videoPlayer.on(PanoVideoEvents.StartPlay, this.onVideoStartPlay.bind(this));
  40220. this.videoPlayer.on(PanoVideoEvents.Switch, this.onVideoSwitch.bind(this));
  40221. this.videoPlayer.on(PanoVideoEvents.Resume, this.onVideoResume.bind(this));
  40222. this.videoPlayer.on(PanoVideoEvents.Pause, this.onVideoPause.bind(this));
  40223. this.videoPlayer.on(PanoVideoEvents.Stop, this.onVideoStop.bind(this));
  40224. }
  40225. }, {
  40226. key: "activatePanorama",
  40227. value: function activatePanorama(panorama, isFirstPlay) {
  40228. var _this3 = this;
  40229. //console.log('activatePanorama', panorama && panorama.id)
  40230. if (!panorama.hasVideo || !this.ready) {
  40231. //console.log("renderVideo skip", panorama)
  40232. return;
  40233. }
  40234. this.activePanorama = panorama;
  40235. this.started = true;
  40236. this.videoPlayer.startVideo(panorama.id, isFirstPlay);
  40237. this.loadingUITimer = setTimeout(function () {
  40238. _this3.showLoading(panorama);
  40239. window.clearTimeout(_this3.loadingUITimer);
  40240. }, 500);
  40241. }
  40242. }, {
  40243. key: "deactivePanorama",
  40244. value: function deactivePanorama(panorama) {
  40245. //console.log('deactivePanorama', panorama && panorama.id)
  40246. if (panorama != null && panorama.id != null) {
  40247. this.videoPlayer.pauseVideo(panorama.id);
  40248. }
  40249. this.activePanorama = null;
  40250. }
  40251. }, {
  40252. key: "preActivatePanorama",
  40253. value: function preActivatePanorama(panorama) {
  40254. this.videoPlayer.startVideo(panorama.id, true);
  40255. }
  40256. }, {
  40257. key: "getActivePanorama",
  40258. value: function getActivePanorama() {
  40259. return this.activePanorama;
  40260. }
  40261. }, {
  40262. key: "showLoading",
  40263. value: function showLoading(pano) {
  40264. if (!this.loadingAnimEnable) return;
  40265. var target = new THREE.Vector3().copy(pano.position);
  40266. var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(this.$app.core.get('Player').model.supportsTiles ? 90 : 180));
  40267. var direction = new THREE.Vector3(0, 0, -1).applyQuaternion(qua.multiply(pano.quaternion));
  40268. this.loadingUI.position.copy(target).add(direction);
  40269. this.loadingUI.lookAt(target); // this.loadingUI.visible = true
  40270. this.loadingTimeStamp = performance.now();
  40271. this.loadingAnimte(0);
  40272. }
  40273. }, {
  40274. key: "hideLoading",
  40275. value: function hideLoading() {
  40276. this.loadingUI.visible = false;
  40277. window.cancelAnimationFrame(this.loadingUIAnimHandler);
  40278. window.clearTimeout(this.loadingUITimer);
  40279. }
  40280. }, {
  40281. key: "loadingAnimte",
  40282. value: function loadingAnimte(elapsedTime) {
  40283. this.loadingUI.material.uniforms['uTime'].value = performance.now() - this.loadingTimeStamp;
  40284. this.loadingUIAnimHandler = window.requestAnimationFrame(this.loadingAnimte.bind(this));
  40285. }
  40286. }, {
  40287. key: "suspend",
  40288. value: function suspend() {
  40289. if (!this.ready) return false;
  40290. this.videoPlayer.pause();
  40291. this.emit(PanoVideoRendererEvents.SuspendRender);
  40292. }
  40293. }, {
  40294. key: "resume",
  40295. value: function resume() {
  40296. if (!this.ready) return false;
  40297. this.videoPlayer.resume();
  40298. }
  40299. }, {
  40300. key: "canPhonate",
  40301. value: function canPhonate() {
  40302. return this.isGuiding == false && this.isRecording == false && this.isSoundRecording == false;
  40303. }
  40304. }, {
  40305. key: "setMuted",
  40306. value: function setMuted(muted) {
  40307. if (this.videoPlayer) {
  40308. if (!this.canPhonate()) muted = true;
  40309. this.videoPlayer.setMuted(muted);
  40310. }
  40311. }
  40312. }, {
  40313. key: "getState",
  40314. value: function getState() {
  40315. return this._state;
  40316. }
  40317. }, {
  40318. key: "onVideoPanoramasEnter",
  40319. value: function onVideoPanoramasEnter(oldPanorama, newPanorama) {//this.activatePanorama(newPanorama)
  40320. //console.log('onPanoEnter')
  40321. }
  40322. }, {
  40323. key: "onVideoPanoramasExit",
  40324. value: function onVideoPanoramasExit(panorama) {//console.log('onPanoExit')
  40325. //this.deactivePanorama(panorama)
  40326. }
  40327. }, {
  40328. key: "onVideoCanPlay",
  40329. value: function onVideoCanPlay() {
  40330. //console.log('onVideoCanPlay')
  40331. this.emit(PanoVideoRendererEvents.CanPlayVideo);
  40332. }
  40333. }, {
  40334. key: "onVideoStartPlay",
  40335. value: function onVideoStartPlay() {
  40336. //console.log('onVideoStartPlay')
  40337. this.emit(PanoVideoRendererEvents.StartPlayVideo);
  40338. }
  40339. }, {
  40340. key: "onVideoSwitch",
  40341. value: function onVideoSwitch(texture) {
  40342. if (this.texture) this.texture.dispose(); //xzw add
  40343. this.texture = texture;
  40344. this.emit(PanoVideoRendererEvents.TextureUpdate, texture);
  40345. }
  40346. }, {
  40347. key: "onVideoResume",
  40348. value: function onVideoResume() {
  40349. this._state = PanoVideoRendererState.Playing;
  40350. this.emit(PanoVideoRendererEvents.ResumeRender);
  40351. this.hideLoading();
  40352. }
  40353. }, {
  40354. key: "onVideoPause",
  40355. value: function onVideoPause() {
  40356. this._state = PanoVideoRendererState.Pause;
  40357. this.emit(PanoVideoRendererEvents.SuspendRender);
  40358. }
  40359. }, {
  40360. key: "onVideoStop",
  40361. value: function onVideoStop() {
  40362. this._state = PanoVideoRendererState.Pause;
  40363. this.emit(PanoVideoRendererEvents.SuspendRender);
  40364. }
  40365. }, {
  40366. key: "ifEnable",
  40367. value: function ifEnable() {
  40368. //xzw add
  40369. return (
  40370. /* !objects.tagManager.editSpot.enterSplitView && */
  40371. this.ready
  40372. );
  40373. /* && (//其他写了好像没作用 就都播放吧
  40374. !config.isEdit || store.getters.page != 'screen' ) */
  40375. }
  40376. }, {
  40377. key: "canShowMarker",
  40378. value: function canShowMarker() {
  40379. var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'floorplan';
  40380. var player = this.$app.core.get('Player');
  40381. if (mode == 'floorplan') {
  40382. return !(this.$app.Plugins.EditCAD && this.$app.Plugins.EditCAD.display || player.linkEditor && (player.linkEditor.setPanoVisible || player.linkEditor.setTagVisible));
  40383. }
  40384. }
  40385. }]);
  40386. return PanoVideoRenderer;
  40387. }(EventEmitter);
  40388. }); // export default new PanoVideoRenderer()
  40389. /*
  40390. note:
  40391. 初始点位球幕视频静音播放
  40392. */
  40393. 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); }; }
  40394. 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; } }
  40395. defineComponent('DisplayController', function () {
  40396. return /*#__PURE__*/function (_EventEmitter) {
  40397. _inherits(DisplayController, _EventEmitter);
  40398. var _super = _createSuper$X(DisplayController);
  40399. function DisplayController(fadeInSpeed) {
  40400. var _this;
  40401. _classCallCheck(this, DisplayController);
  40402. _this = _super.call(this);
  40403. _this.fadeInSpeed = fadeInSpeed;
  40404. null !== _this.fadeInSpeed && void 0 !== _this.fadeInSpeed || (_this.fadeInSpeed = 0);
  40405. _this.panoVideoRenderer = null;
  40406. return _this;
  40407. }
  40408. _createClass(DisplayController, [{
  40409. key: "init",
  40410. value: function init() {
  40411. this.container = this.$app.core.get('Player').domElement;
  40412. this.panoVideoRenderer = this.$app.core.get('PanoVideoRenderer');
  40413. this.updateModel();
  40414. this.bindEvents();
  40415. }
  40416. }, {
  40417. key: "bindEvents",
  40418. value: function bindEvents() {
  40419. this.$app.core.get('Player').on(PlayerEvents.FlyingStarted, this.handlePlayerFlyingStarted.bind(this));
  40420. this.$app.core.get('Player').on(PlayerEvents.FlyingEnded, this.handlePlayerFlyingEnded.bind(this));
  40421. this.$app.core.get('Player').on(PlayerEvents.ModeChanging, this.handlePlayerModeChanging.bind(this));
  40422. this.$app.core.get('Player').on(PlayerEvents.ModeChanged, this.handlePlayerModeChanged.bind(this));
  40423. this.$app.core.get('Player').on(PlayerEvents.ClosestPanoChanging, this.handleClosestPanoChanging.bind(this));
  40424. this.$app.core.get('Player').on(PlayerEvents.StartInside, this.handleStartInside.bind(this)); //若初始画面在内
  40425. this.$app.core.get('Player').on(PlayerEvents.StartOutside, this.handleStartOutside.bind(this));
  40426. }
  40427. }, {
  40428. key: "updateModel",
  40429. value: function updateModel() {
  40430. this.model = this.$app.core.get('ModelManager').getActiveModel();
  40431. }
  40432. }, {
  40433. key: "handlePlayerFlyingStarted",
  40434. value: function handlePlayerFlyingStarted(panoInfo) {
  40435. var lastPano = this.model.panos.index[panoInfo.lastPanoId];
  40436. this.panoVideoRenderer.deactivePanorama(lastPano);
  40437. this.panoVideoRenderer.setMuted(true);
  40438. }
  40439. }, {
  40440. key: "handlePlayerFlyingEnded",
  40441. value: function handlePlayerFlyingEnded(_ref) {
  40442. var targetPano = _ref.targetPano;
  40443. if (targetPano && this.model.mode == Viewmode$1.PANORAMA) {
  40444. this.panoVideoRenderer.activatePanorama(targetPano);
  40445. }
  40446. this.panoVideoRenderer.setMuted(false);
  40447. }
  40448. }, {
  40449. key: "handlePlayerModeChanging",
  40450. value: function handlePlayerModeChanging(oldMode, newMode, pano) {
  40451. var activeModel = this.$app.core.get('ModelManager').getActiveModel();
  40452. var opacity; //if(this.$app.core.get('Player').is360View(newMode, pano) || this.$app.core.get('Director').tourIsPlaying)
  40453. if (this.$app.core.get('Player').is360View(newMode, pano)) {
  40454. opacity = 0;
  40455. } else {
  40456. opacity = settings$3[newMode].markerOpacity;
  40457. } //显示地面的白色圈圈
  40458. activeModel.fadePanoMarkers(opacity, 0, {
  40459. mode: newMode
  40460. }); //activeModel.setMode(newMode) //xzw改 没必要所以去掉,在handlePlayerModeChanged中写了。否则太乱了。
  40461. }
  40462. }, {
  40463. key: "handlePlayerModeChanged",
  40464. value: function handlePlayerModeChanged(e, mode) {
  40465. var activeModel = this.$app.core.get('ModelManager').getActiveModel();
  40466. var sid = mode === Viewmode$1.PANORAMA ? THREE.DoubleSide : THREE.FrontSide;
  40467. activeModel.setSide(sid);
  40468. activeModel.setMode(mode);
  40469. } //地面的marker变清晰
  40470. }, {
  40471. key: "handleClosestPanoChanging",
  40472. value: function handleClosestPanoChanging(closestPano, newClosestPano, mode) {
  40473. if (mode !== Viewmode$1.TRANSITIONING) {
  40474. closestPano && closestPano.hoverOff(mode);
  40475. newClosestPano && newClosestPano.hoverOn(mode);
  40476. }
  40477. } //add
  40478. }, {
  40479. key: "handleStartInside",
  40480. value: function handleStartInside(duration) {
  40481. var t = settings$3[this.$app.core.get('Player').mode],
  40482. i = duration ? 0 : t.transitionTime * t.skyboxOpacityLength;
  40483. this.fadeIn(this.fadeInSpeed);
  40484. this.model.alpha = 0;
  40485. this.model.skybox.material.uniforms.opacity.value = 1; //(this.model.skybox.originMat || this.model.skybox.material).uniforms.opacity.value = 1
  40486. this.model.fadePanoMarkers(null, null, {
  40487. player: this.$app.core.get('Player')
  40488. }); //(e ? 0 : t.markerOpacity);
  40489. var reticule = this.$app.core.get('Player').reticule;
  40490. transitions$1.start(lerp.property(reticule.material, 'opacity', 0), i, null, 0, null, 'retReOpac');
  40491. }
  40492. }, {
  40493. key: "handleStartOutside",
  40494. value: function handleStartOutside(duration) {
  40495. this.fadeIn(duration);
  40496. }
  40497. }, {
  40498. key: "fadeIn",
  40499. value: function fadeIn(duration) {
  40500. null !== duration && void 0 !== duration || (duration = 2000, logger.warn('DisplayController.fadeIn -> no transition time specified, defaulting to 2000 ms.'));
  40501. if (this.model) {
  40502. //this.model.chunks.forEach(item => (item.visible = true)) //xzw 4.6.0 隐藏chunk
  40503. this.model.panos.forEach(function (item) {
  40504. return item.updateMakerStyle();
  40505. });
  40506. }
  40507. }
  40508. }]);
  40509. return DisplayController;
  40510. }(EventEmitter);
  40511. });
  40512. defineComponent('QuickstartManager', function () {
  40513. return /*#__PURE__*/function () {
  40514. function QuickstartManager(qualityManager, scene, camera, controls, panoVideoRenderer) {
  40515. _classCallCheck(this, QuickstartManager);
  40516. this.locked = false;
  40517. this.qualityManager = qualityManager;
  40518. this.scene = scene;
  40519. this.camera = camera;
  40520. this.controls = controls;
  40521. this.quickStartcamera = controls.camera;
  40522. this.view = null;
  40523. this.panoVideoRenderer = panoVideoRenderer;
  40524. this.unlockDom = null;
  40525. this.unlockHanlde = null;
  40526. this.loadPromise = null;
  40527. this.ready = false;
  40528. this.touchStartPosition = new THREE.Vector2(0, 0);
  40529. this.touchMoveDelta = new THREE.Vector2(0, 0);
  40530. this.touchPrevPosition = new THREE.Vector2(0, 0);
  40531. this.touchMoveOffset = new THREE.Vector2(0, 0);
  40532. this.enter = false;
  40533. this.canEnter = false;
  40534. this.animFov = null;
  40535. this.animRotation = null;
  40536. this.initTarget = new THREE.Vector3(0, 0, 0);
  40537. this.enterView = {
  40538. pano: null,
  40539. quaternion: new THREE.Quaternion(),
  40540. position: new THREE.Vector3(),
  40541. fov: settings$3.insideFOV
  40542. };
  40543. }
  40544. _createClass(QuickstartManager, [{
  40545. key: "init",
  40546. value: function init(view, metadata) {
  40547. this.dom = this.$app.core.get('Player').domElement;
  40548. this.pano = view.pano;
  40549. this.setSize(window.innerWidth, window.innerHeight);
  40550. this.initView(view);
  40551. this.skybox = new THREE.Mesh(new THREE.BoxBufferGeometry(1, 1, 1), new ModelTextureMaterial({
  40552. side: THREE.DoubleSide
  40553. }));
  40554. this.skybox.material.uniforms.map.value = view.pano.getSkyboxTexture();
  40555. this.skybox.quaternion.copy(view.quaternion);
  40556. this.scene.add(this.skybox);
  40557. this.skybox.material.depthTest = false;
  40558. this.skybox.material.depthWrite = false;
  40559. this.skybox.renderOrder = 1000;
  40560. this.skybox.name = 'quickStartSkyBox';
  40561. this.skybox.material.uniforms.modelAlpha.value = 0;
  40562. this.skybox.position.copy(this.pano.position);
  40563. this.skybox.visible = true;
  40564. this.scene.add(this.skybox);
  40565. this.pano.attachToPanoVideoRenderer(this.$app.core.get('PanoVideoRenderer'));
  40566. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.StartPlayVideo, this.onVideoStartPlay.bind(this));
  40567. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.TextureUpdate, this.onVideoTextureUpdate.bind(this));
  40568. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.ResumeRender, this.onVideoRenderResume.bind(this));
  40569. this.$app.core.get('PanoVideoRenderer').on(PanoVideoRendererEvents.SuspendRender, this.onVideoRenderSuspend.bind(this));
  40570. if (this.$app.core.get('PanoVideoRenderer').videosInfo) {
  40571. var parameters = this.$app.core.get('PanoVideoRenderer').videosInfo.parameters;
  40572. 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);
  40573. if (parameters.cameraType == 8) {
  40574. this.skybox.material.defines.HasVideo = 8; //8目
  40575. } else if (parameters.cameraType == 2) {
  40576. this.skybox.material.defines.HasVideo = 2; //2目
  40577. }
  40578. this.skybox.material.defines['VideoMapping'] = parameters.mapping;
  40579. this.skybox.material.uniforms.videoReady.value = 0;
  40580. this.skybox.material.uniforms.progress.value = 1;
  40581. }
  40582. }
  40583. }, {
  40584. key: "initView",
  40585. value: function initView(view) {
  40586. this.view = view;
  40587. var pano = view.pano;
  40588. view.mode;
  40589. view.zoom;
  40590. view.position;
  40591. view.quaternion;
  40592. this.controls.locked = false;
  40593. this.controls.camera.position.copy(pano.position); // zeg 这部分代码使球幕点位初始化的相机旋转变为0
  40594. // if (pano.hasVideo && !view.setByUrl) {
  40595. // if (pano.videoInfo.dir) {
  40596. // this.initTarget.copy(pano.videoInfo.dir).add(pano.position)
  40597. // } else {
  40598. // var qua = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), THREE.MathUtils.degToRad(!this.$app.core.get('Player').model.supportsTiles ? 90 : 180))
  40599. // this.initTarget.copy(Vectors.FORWARD.clone().applyQuaternion(qua.multiply(pano.quaternion))).add(pano.position)
  40600. // }
  40601. // this.controls.lookAt(this.initTarget)
  40602. // } else {
  40603. this.initTarget.copy(new THREE.Vector3(0, 0, -1).applyQuaternion(view.quaternion)).add(view.position);
  40604. this.controls.lookAt(this.initTarget); // }
  40605. this.quickStartcamera.fov = this.view.fov;
  40606. this.quickStartcamera.aspect = window.innerWidth / window.innerHeight;
  40607. this.quickStartcamera.updateProjectionMatrix();
  40608. this.camera.fov = this.view.fov;
  40609. this.camera.aspect = window.innerWidth / window.innerHeight;
  40610. this.camera.position.copy(this.quickStartcamera.position);
  40611. this.camera.quaternion.copy(this.quickStartcamera.quaternion);
  40612. this.enterView.pano = pano;
  40613. this.enterView.position.copy(this.view.position);
  40614. this.enterView.quaternion.copy(this.view.quaternion);
  40615. this.enterView.fov = this.view.fov;
  40616. this.controls.update(0.016); //xzw 2023.1.18注释
  40617. /* this.controls.locked = true
  40618. this.controls.limitDownAngel = this.controls.lat */
  40619. this.view.position.copy(this.quickStartcamera.position);
  40620. this.view.quaternion.copy(this.quickStartcamera.quaternion);
  40621. }
  40622. }, {
  40623. key: "load",
  40624. value: function load(view) {
  40625. var _this = this;
  40626. if (this.loadPromise) return this.loadPromise;
  40627. var metadata = this.$app.store.__store.metadata;
  40628. this.view = view;
  40629. this.view.pano.shouldRedrawOnBaseLoaded = !0;
  40630. if (this.view.pano.tiled) {
  40631. this.init(view, metadata);
  40632. var $player = document.querySelector('.player[name=main]');
  40633. var lowSize = this.qualityManager.getPanoSize(PanoSizeClass.BASE),
  40634. highSize = this.qualityManager.getPanoSize(PanoSizeClass.STANDARD),
  40635. d = cameraLight.getHFOVForCamera(this.quickStartcamera, $player.clientWidth, $player.clientHeight),
  40636. p = this.quickStartcamera.fov,
  40637. r = Vectors$1.FORWARD.clone().applyQuaternion(this.view.quaternion);
  40638. var promise1 = this.view.pano.loadTiledPano(highSize, r, {
  40639. hFov: d,
  40640. vFov: p
  40641. }, !1, !1, !0);
  40642. var promise2 = this.view.pano.loadTiledPano(lowSize, r.clone().negate(), null, !1, !1, !0);
  40643. this.loadPromise = new Promise(function (resolve) {
  40644. (_this.view.pano.hasVideo || _this.qualityManager.getMaxNavPanoSize() < 1024 ? promise2 : promise1).then(resolve);
  40645. });
  40646. } else {
  40647. this.init(view, metadata);
  40648. this.loadPromise = new Promise(function (resolve) {
  40649. _this.view.pano.hasVideo ? _this.view.pano.loadCube('low').then(function () {
  40650. return resolve();
  40651. }) : _this.view.pano.loadCube('high').then(function () {
  40652. return resolve();
  40653. });
  40654. });
  40655. }
  40656. this.loadPromise.then(function () {
  40657. _this.ready = true;
  40658. _this.skybox.material.setProjectedPanos(_this.view.pano, _this.view.pano); // 此时已经显示初始点位了,所以也需要设置马赛克和滤镜
  40659. _this.$app.core.get('Player').paintEditor.updatePanoPaint(_this.view.pano.id, _this.view.pano.id);
  40660. _this.$app.FilterManager.updatePanoFilters(_this.view.pano, _this.view.pano);
  40661. });
  40662. return this.loadPromise;
  40663. }
  40664. }, {
  40665. key: "onVideoStartPlay",
  40666. value: function onVideoStartPlay() {}
  40667. }, {
  40668. key: "onVideoTextureUpdate",
  40669. value: function onVideoTextureUpdate(texture) {
  40670. this.skybox.material.uniforms.videoTexture.value = texture;
  40671. }
  40672. }, {
  40673. key: "onVideoRenderResume",
  40674. value: function onVideoRenderResume() {
  40675. this.skybox.material.uniforms.videoReady.value = 1; // 暂停背景音乐
  40676. this.$app.Scene.emit('panorama.videorenderer.resumerender');
  40677. }
  40678. }, {
  40679. key: "onVideoRenderSuspend",
  40680. value: function onVideoRenderSuspend() {
  40681. // this.skybox.material.uniforms.videoReady.value = 0 //修改 球幕视频暂停时不要隐藏
  40682. // todo 播放导览时球目视频挂起不恢复背景音乐
  40683. // 播放背景音乐
  40684. this.$app.Scene.emit('panorama.videorenderer.suspendrender');
  40685. }
  40686. }, {
  40687. key: "watingUnlock",
  40688. value: function watingUnlock() {
  40689. var _this2 = this;
  40690. this.locked = true;
  40691. this.controls.locked = true;
  40692. return new Promise(function (resolve) {
  40693. _this2.unlockHanlde = resolve;
  40694. });
  40695. }
  40696. }, {
  40697. key: "autoUnlock",
  40698. value: function autoUnlock() {
  40699. this.locked = false;
  40700. this.app.active = true;
  40701. this.controls.locked = false;
  40702. this.controls.limitDownAngel = null;
  40703. if (this.pano.hasVideo && browser$1.detectIOS()) {
  40704. this.panoVideoRenderer.setMuted(false);
  40705. } else {
  40706. this.panoVideoRenderer.setMuted(true);
  40707. }
  40708. this.panoVideoRenderer.activatePanorama(this.pano);
  40709. return Promise.resolve(true);
  40710. }
  40711. }, {
  40712. key: "activate",
  40713. value: function activate() {
  40714. this.panoVideoRenderer.setMuted(browser$1.urlQueryValue('sound') == '0');
  40715. this.panoVideoRenderer.activatePanorama(this.pano);
  40716. }
  40717. }, {
  40718. key: "unlock",
  40719. value: function unlock(speed) {
  40720. var _this3 = this;
  40721. if (this.enter) {
  40722. this.controls.rotationAcc.set(0, 0);
  40723. return;
  40724. }
  40725. this.enter = true;
  40726. this.app.emit('unlock');
  40727. this.controls.locked = false;
  40728. this.controls.rotationAcc.set(speed.x > 0 ? 0.3 : -0.3, 0);
  40729. this.controls.limitDownAngel = null;
  40730. if (this.animFov) transitions$1.cancel(this.animFov);
  40731. try {
  40732. parent.postMessage({
  40733. num: config.projectNum,
  40734. cmd: 'unlocking',
  40735. isParent: top == self
  40736. }, '*');
  40737. } catch (error) {
  40738. console.error('跨域', error);
  40739. }
  40740. this.animFov = transitions$1.start(lerp.property(this.quickStartcamera, 'fov', 70), 3000, function () {
  40741. _this3.unlockHanlde && _this3.unlockHanlde();
  40742. _this3.locked = false;
  40743. _this3.enter = true;
  40744. _this3.controls.locked = false;
  40745. _this3.controls.rotationAcc.set(0, 0);
  40746. _this3.controls.limitDownAngel = null;
  40747. try {
  40748. parent.postMessage({
  40749. num: config.projectNum,
  40750. cmd: 'unlocked',
  40751. isParent: top == self
  40752. }, '*');
  40753. } catch (error) {
  40754. console.error('跨域', error);
  40755. }
  40756. }, 0.0, easing.easeOutCubic);
  40757. }
  40758. }, {
  40759. key: "exit",
  40760. value: function exit() {
  40761. this.enter = false;
  40762. var pano = this.pano;
  40763. pano.enter();
  40764. this.controls.rotationAcc.set(0, 0);
  40765. this.controls.limitDownAngel = null;
  40766. if (this.animFov) transitions$1.cancel(this.animFov);
  40767. if (this.app.player.model) {
  40768. this.app.player.flyToPano({
  40769. pano: this.pano
  40770. });
  40771. } else {
  40772. this.smoothLookAt(this.initTarget, 1000);
  40773. }
  40774. }
  40775. }, {
  40776. key: "smoothLookAt",
  40777. value: function smoothLookAt(targetLookAt, duration) {
  40778. var _this4 = this;
  40779. duration = duration || 1000;
  40780. var targetDir = targetLookAt.clone().sub(this.controls.camera.position).normalize();
  40781. var currDir = this.controls.lookVector.clone();
  40782. var dir = new THREE.Vector3();
  40783. new THREE.Vector3();
  40784. var lerp = function lerp(alpha) {
  40785. dir.lerpVectors(currDir, targetDir, alpha);
  40786. _this4.controls.lookAt(dir.add(_this4.controls.camera.position));
  40787. };
  40788. this.animFov = transitions$1.start(lerp, duration);
  40789. }
  40790. }, {
  40791. key: "cancelRotate",
  40792. value: function cancelRotate() {
  40793. if (this.enter && this.app.startOption.needUnlock) this.controls.rotationAcc.set(0, 0);
  40794. }
  40795. }, {
  40796. key: "update",
  40797. value: function update(deltaTime) {
  40798. if (this.locked) ;
  40799. this.controls.update(deltaTime);
  40800. this.camera.position.copy(this.quickStartcamera.position);
  40801. this.camera.quaternion.copy(this.quickStartcamera.quaternion);
  40802. this.camera.fov = this.quickStartcamera.fov;
  40803. this.camera.updateProjectionMatrix();
  40804. this.view.position.copy(this.quickStartcamera.position);
  40805. this.view.quaternion.copy(this.quickStartcamera.quaternion);
  40806. this.view.fov = this.quickStartcamera.fov;
  40807. }
  40808. }, {
  40809. key: "setSize",
  40810. value: function setSize(width, height) {
  40811. this.camera.aspect = width / height;
  40812. this.camera.updateProjectionMatrix();
  40813. }
  40814. }, {
  40815. key: "destroy",
  40816. value: function destroy() {
  40817. this.scene.remove(this.skybox);
  40818. this.controls.rotationAcc.set(0, 0); // this.dom.removeEventListener('touchstart', this.cancelRotate)
  40819. // this.unlockDom.removeEventListener('touchstart', this.onTouchStart)
  40820. // this.unlockDom.removeEventListener('touchmove', this.onTouchMove)
  40821. // this.unlockDom.removeEventListener('touchend', this.onTouchEnd)
  40822. } //swiper事件的原因,用于快速切换解锁需要给定dom
  40823. }, {
  40824. key: "attachDom",
  40825. value: function attachDom(dom) {
  40826. dom.addEventListener('touchstart', this.onTouchStart.bind(this));
  40827. dom.addEventListener('touchmove', this.onTouchMove.bind(this));
  40828. dom.addEventListener('touchend', this.onTouchEnd.bind(this));
  40829. }
  40830. }, {
  40831. key: "onTouchEvent",
  40832. value: function onTouchEvent(eventType, event) {
  40833. if (event.type == 'touchstart') {
  40834. this.onTouchStart(event);
  40835. } else if (event.type == 'touchmove') {
  40836. this.onTouchMove(event);
  40837. } else if (event.type == 'touchend') {
  40838. this.onTouchEnd(event);
  40839. }
  40840. }
  40841. }, {
  40842. key: "onTouchStart",
  40843. value: function onTouchStart(event) {
  40844. this.touchStartPosition.set(event.touches[0].clientX, event.touches[0].clientY);
  40845. this.touchPrevPosition.set(event.touches[0].clientX, event.touches[0].clientY);
  40846. this.touchMoveDelta.set(0, 0);
  40847. this.touchMoveOffset.set(0, 0);
  40848. if (this.enter || this.app.needUnlock == false) {
  40849. this.controls.rotationAcc.set(0, 0);
  40850. this.controls.onTouchStart(event);
  40851. } else {
  40852. //this.controls.onTouchStart( event );
  40853. this.canEnter = false;
  40854. }
  40855. this._start = {
  40856. x: event.touches[0].clientX,
  40857. y: event.touches[0].clientY
  40858. };
  40859. }
  40860. }, {
  40861. key: "onTouchMove",
  40862. value: function onTouchMove(event) {
  40863. this._move = {
  40864. x: event.touches[0].clientX,
  40865. y: event.touches[0].clientY
  40866. };
  40867. this.touchMoveDelta.set(event.touches[0].clientX - this.touchPrevPosition.x, event.touches[0].clientY - this.touchPrevPosition.y);
  40868. this.touchPrevPosition.set(event.touches[0].clientX, event.touches[0].clientY);
  40869. this.touchMoveOffset.set(event.touches[0].clientX - this.touchStartPosition.x, event.touches[0].clientY - this.touchStartPosition.y);
  40870. if (this.enter || this.app.needUnlock == false) {
  40871. this.controls.onTouchMove(event);
  40872. } else {
  40873. var speedX = -this.touchMoveDelta.x;
  40874. var slideHor = Math.abs(this.getAngle(this._start, this._move)) < 15; //(Math.abs(this.touchMoveOffset.y) / Math.abs(this.touchMoveOffset.x)) < 0.15
  40875. var canEnter = slideHor && this.enter == false;
  40876. canEnter && this.unlock(new THREE.Vector2(speedX, 0));
  40877. }
  40878. }
  40879. }, {
  40880. key: "onTouchEnd",
  40881. value: function onTouchEnd(event) {
  40882. if (this.enter || this.app.needUnlock == false) {
  40883. this.controls.onTouchEnd(event);
  40884. }
  40885. }
  40886. }, {
  40887. key: "getAngle",
  40888. value: function getAngle(start, end) {
  40889. var diff_x = end.x - start.x,
  40890. diff_y = end.y - start.y;
  40891. return 360 * Math.atan(diff_y / diff_x) / (2 * Math.PI);
  40892. }
  40893. }]);
  40894. return QuickstartManager;
  40895. }();
  40896. });
  40897. var effects$1 = {
  40898. currentBlur: 0,
  40899. aspect: settings$3.aspect,
  40900. blurStrength: 1,
  40901. hblurPass: settings$3.HorizontalBlurShader,
  40902. vblurPass: settings$3.VerticalBlurShader,
  40903. bindEvents(e) {
  40904. e.on(PlayerEvents.ModeChanged, function (mode, t) {
  40905. if (mode === Viewmode$1.PANORAMA) {
  40906. transitions$1.cancel(effects$1.blur);
  40907. transitions$1.cancel(effects$1.addBlur);
  40908. transitions$1.start(effects$1.removeBlur, 500, null, 0, null, 'deblur');
  40909. }
  40910. });
  40911. },
  40912. blur(blur) {
  40913. effects$1.currentBlur = blur;
  40914. var t = blur * effects$1.blurStrength;
  40915. settings$3.VerticalBlurShader.uniforms.v.value = t / 512 * effects$1.aspect;
  40916. settings$3.HorizontalBlurShader.uniforms.h.value = t / 512;
  40917. },
  40918. addBlur(blur) {
  40919. blur = Math.max(blur, effects$1.currentBlur);
  40920. effects$1.blur(blur);
  40921. },
  40922. removeBlur(blur) {
  40923. blur = Math.min(1 - blur, effects$1.currentBlur);
  40924. effects$1.blur(blur);
  40925. }
  40926. };
  40927. effects$1.blur(0);
  40928. var BasicException$1 = function BasicException(message) {
  40929. _classCallCheck(this, BasicException);
  40930. this.message = message;
  40931. };
  40932. 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); }; }
  40933. 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; } }
  40934. var RendererCreationException$1 = /*#__PURE__*/function (_BasicException) {
  40935. _inherits(RendererCreationException, _BasicException);
  40936. var _super = _createSuper$W(RendererCreationException);
  40937. function RendererCreationException(e) {
  40938. _classCallCheck(this, RendererCreationException);
  40939. return _super.call(this, e);
  40940. }
  40941. return RendererCreationException;
  40942. }(BasicException$1);
  40943. 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); }; }
  40944. 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; } }
  40945. var sceneRenderer$3, player$i;
  40946. var hasInit; // zeg加 否则分屏时会重复初始化
  40947. //window.settings = settings
  40948. //window.ifTest = true // 调试不会开启陀螺仪
  40949. //window.VRScreenType="portrait" //: 不分屏,没有空中小球
  40950. //const flickerThreshold = 0.001
  40951. //////======================================================================================
  40952. /*
  40953. 必须 https!!!!!
  40954. 必须 https!!!!!
  40955. 必须 https!!!!!
  40956. */
  40957. //////======================================================================================
  40958. var avoidFlicker;
  40959. window.screenFaceOrient = 0;
  40960. var vrPermission = {};
  40961. var vrPermissionCallBack = function vrPermissionCallBack(info1, info2) {
  40962. if (info1 == 'reset') {
  40963. vrPermission = {};
  40964. } else {
  40965. vrPermission[info1] = info2;
  40966. if (Object.keys(vrPermission).length == 2 && (vrPermission.deviceMotion != 'granted' || vrPermission.deviceOrientation != 'granted')) {
  40967. //$alert({content:"运动和方向访问失败", "这会导致画面视角一直固定。您需要完全关闭" + (Config.app ?"App":"此浏览器") + ",然后再次打开,并允许访问运动与方向。"})
  40968. // if (!window.VRScreenNotFull) {
  40969. // $alert({ content: i18n.t('modules.base.vr_fail_reopen_tips') })
  40970. // }
  40971. console.error('运动和方向访问失败');
  40972. }
  40973. }
  40974. };
  40975. var vr = /*#__PURE__*/function (_THREE$EventDispatche) {
  40976. _inherits(vr, _THREE$EventDispatche);
  40977. var _super = _createSuper$V(vr);
  40978. function vr() {
  40979. _classCallCheck(this, vr);
  40980. return _super.call(this);
  40981. }
  40982. _createClass(vr, [{
  40983. key: "Init",
  40984. value: function Init(_sceneRenderer, _player) {
  40985. //初始化 外部使用
  40986. sceneRenderer$3 = _sceneRenderer;
  40987. player$i = _player;
  40988. player$i.VR = this;
  40989. if (!sceneRenderer$3.renderer || sceneRenderer$3.newRenderer || hasInit) return; //还未准备好renderer或已经Init过了
  40990. var vrTexture = common$1.loadTextureFromCache(texture.getImageURL('images/whiteCircle.png'));
  40991. player$i.model.panos.list.forEach(function (pano) {
  40992. pano.createVrMarker(vrTexture, player$i);
  40993. });
  40994. sceneRenderer$3.newRenderer = new vrRenderer(sceneRenderer$3.renderer, sceneRenderer$3, sceneRenderer$3.camera);
  40995. sceneRenderer$3.isHuawei5X = browser$1.detectHUAWEI5X();
  40996. sceneRenderer$3.oldRenderer = sceneRenderer$3.renderer;
  40997. webxr.init(sceneRenderer$3.renderer);
  40998. /* setTimeout(()=>{
  40999. console.log('userAgent', navigator.userAgent || c || window.opera)
  41000. }, 4000) */
  41001. initFlicker();
  41002. if (player$i.$app.config.vr.markerHeight != null && !isNaN(player$i.$app.config.vr.markerHeight)) {
  41003. var height = player$i.$app.config.vr.markerHeight;
  41004. player$i.model.panos.forEach(function (pano) {
  41005. if (!pano.vrMarker) return; //pano.vrMarker.position.y = pano.floorPosition.y + (v != void 0 ? v : pano.height - 0.2)
  41006. pano.vrMarker.position.y = pano.floorPosition.y + height;
  41007. });
  41008. }
  41009. var _vrEnabled = !1; //vr状态是否开启(开启陀螺仪)
  41010. var _vrSplitScreen = false; //是否分屏
  41011. var events = {
  41012. // get aspect
  41013. setSize: function setSize(b, c) {
  41014. sceneRenderer$3.camera.aspect = b / c;
  41015. }
  41016. };
  41017. createCursor(0.5, true, 1, 16777215, 0); //transparent改为true,旧版竟然可以是false
  41018. //if (!settings.hasOwnProperty('vrEnabled')) {
  41019. Object.defineProperty(settings$3, 'vrEnabled', {
  41020. get: function get() {
  41021. return _vrEnabled;
  41022. },
  41023. set: function set(b) {
  41024. b = !!b;
  41025. player$i.emit('vrStateChanged');
  41026. player$i.cameraControls.controls.panorama.locked = b;
  41027. player$i.model.chunks.forEach(function (c) {
  41028. return c.visible = !(b && (webxr.xrType || settings$3.vrSplitScreen));
  41029. }); //vr模式下 改变chunks显示会让画面分离度改变,可能和眼睛看物体远近不同的夹角有关。 而一直显示模型会有穿墙危险,所以改为一直不显示模型。// 为什么注释掉了?
  41030. //注: 2022.10.19: 调试pico的webxr时,发现若显示模型,会看出模型轮廓,画面被割裂(原地非过渡)。原因可能是头盔是两个camera,且都与原位置有偏差,所以不在pano中心。(但是之前vr眼镜似乎没有此现象?) 故而关闭模型显示,代价就是过渡时无法贴合模型,多楼层看起来像悬空的。
  41031. if (window.VRScreenType != 'portrait') {
  41032. //普通模式( 不是这种不需要分屏和vrMarker的情况)
  41033. common$1.updateVisible(VR.cursor, 'vr', b);
  41034. sceneRenderer$3.updateScreenSize({
  41035. forceUpdateSize: true
  41036. });
  41037. player$i.model.updateVrMarker(b, player$i); //因为手机chrome现在也能进入xr,但不一定有手柄所以还是先都显示marker
  41038. }
  41039. _vrEnabled = b;
  41040. if (webxr.xrType) {
  41041. return b ? webxr.enterVR() : webxr.leaveVR();
  41042. } else {
  41043. //交换renderer
  41044. b && settings$3.vrSplitScreen ? (sceneRenderer$3.renderer = sceneRenderer$3.newRenderer, player$i.cameraControls.cameras.panorama.staticFov = 70 //为了使镜头不变形
  41045. ) : (sceneRenderer$3.renderer = sceneRenderer$3.oldRenderer, player$i.cameraControls.cameras.panorama.staticFov = null);
  41046. }
  41047. if (!window.VRScreenNotFull) {
  41048. b ? browser$1.requestFullscreen(
  41049. /* player.domElement */
  41050. document.body) : browser$1.exitFullscreen();
  41051. } //是否全屏:!!document.fullscreenElement 注:pico3的xr全屏会黑屏; 部分设备(荣耀magic6)全屏后会自动横屏,orientation为90。 且全屏后调用screen.orientation.lock("portrait-primary") 报错说此设备不支持这个函数
  41052. //2024.9 突然发现在这不update会黑屏
  41053. sceneRenderer$3.updateScreenSize({
  41054. forceUpdateSize: true
  41055. });
  41056. if (!b) {
  41057. var pos = player$i.position;
  41058. var qur = new THREE.Quaternion().copy(player$i.camera.quaternion);
  41059. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(qur).add(pos);
  41060. if (lookAtPoint.x == pos.x && lookAtPoint.z == pos.z) {
  41061. console.log('看向正地面时无法lookAt,无法更新camera转向,直接退出vr');
  41062. } else player$i.cameraControls.activeControl.lookAt(lookAtPoint); //退出时更新一下camera的方向
  41063. player$i.viewLinkManager.showAllViews();
  41064. VR.shiftQuaternion = null;
  41065. var index = sceneRenderer$3.resizeListeners.indexOf(events);
  41066. sceneRenderer$3.resizeListeners.splice(index, 1);
  41067. } else {
  41068. player$i.viewLinkManager.hideAllViews();
  41069. sceneRenderer$3.resizeListeners.push(events); //处理失败:
  41070. setTimeout(function () {
  41071. console.log('是否检测到陀螺仪 ' + window.orientEnable);
  41072. if (settings$3.vrEnabled && !window.orientEnable) {
  41073. //很可能没能触发陀螺仪事件
  41074. if (browser$1.detectIOS()
  41075. /* && browser.detectSafari() */
  41076. ) {
  41077. var b = browser$1.iosVersion(); //{major: 10, minor: 3, patch: 1}
  41078. //console.log("开始获取权限 major"+b.major)
  41079. if (b.major == 12 && b.minor >= 2) {
  41080. if (!window.VRScreenNotFull) {
  41081. if (browser$1.detectSafari()) $alert({
  41082. content: i18n.t('modules.base.vr_fail_safari_tips')
  41083. });else {
  41084. //app??
  41085. $alert({
  41086. content: i18n.t('modules.base.vr_fail_app_tips')
  41087. });
  41088. }
  41089. }
  41090. } else if (b.major >= 13) {
  41091. var hasFailed = window.vrPermission && (window.vrPermission.deviceMotion != 'granted' || window.vrPermission.deviceOrientation != 'granted'); //hasFailed || $tips({content: i18n.t('modules.base.please_click_tips')})
  41092. setTimeout(function () {
  41093. if (!settings$3.vrEnabled || window.orientEnable) return;
  41094. vrPermissionCallBack('reset');
  41095. if (window.DeviceMotionEvent && window.DeviceMotionEvent.requestPermission && typeof window.DeviceMotionEvent.requestPermission === 'function') {
  41096. console.log('开始获取权限1'); ///注意:需要https 本地服务器permissionState会得到denied
  41097. window.DeviceMotionEvent.requestPermission().then(function (permissionState) {
  41098. console.log('permissionState1: ' + permissionState);
  41099. vrPermissionCallBack('deviceMotion', permissionState);
  41100. }).catch(function (e) {
  41101. vrPermissionCallBack('deviceMotion', false);
  41102. console.log(e);
  41103. });
  41104. } else {
  41105. console.log('window.DeviceMotionEvent undefined');
  41106. vrPermissionCallBack('deviceMotion', false);
  41107. }
  41108. if (window.DeviceOrientationEvent && window.DeviceOrientationEvent.requestPermission && typeof window.DeviceOrientationEvent.requestPermission === 'function') {
  41109. console.log('开始获取权限2');
  41110. window.DeviceOrientationEvent.requestPermission().then(function (permissionState) {
  41111. console.log('permissionState2: ' + permissionState);
  41112. vrPermissionCallBack('deviceOrientation', permissionState);
  41113. }).catch(function (e) {
  41114. vrPermissionCallBack('deviceOrientation', false);
  41115. console.log(e);
  41116. });
  41117. } else {
  41118. console.log('window.DeviceOrientationEvent undefined');
  41119. vrPermissionCallBack('deviceOrientation', false);
  41120. }
  41121. }, hasFailed ? 0 : 150);
  41122. /* /* setTimeout(function(){
  41123. if(settings.vrEnabled && !window.orientEnable){
  41124. $alert("若画面视角一直固定,您需要完全关闭Safari浏览器,然后再次打开以开启运动和方向访问。")
  41125. }
  41126. },4000) */
  41127. } else console.log('陀螺仪似乎未能启用 ios ' + b.major + '.' + b.minor);
  41128. }
  41129. }
  41130. }, 200);
  41131. }
  41132. }
  41133. });
  41134. Object.defineProperty(settings$3, 'vrSplitScreen', {
  41135. //分屏 许钟文加
  41136. get: function get() {
  41137. return _vrSplitScreen;
  41138. },
  41139. set: function set(b) {
  41140. b = !!b;
  41141. if (_vrSplitScreen == b || webxr.xrType) return;
  41142. _vrSplitScreen = b;
  41143. if (!settings$3.vrEnabled || window.VRScreenType == 'portrait') return;
  41144. player$i.emit('vrStateChanged');
  41145. b ? (sceneRenderer$3.renderer = sceneRenderer$3.newRenderer, player$i.cameraControls.cameras.panorama.staticFov = 70) : (sceneRenderer$3.renderer = sceneRenderer$3.oldRenderer, player$i.cameraControls.cameras.panorama.staticFov = null);
  41146. player$i.model.chunks.forEach(function (c) {
  41147. return c.visible = !b;
  41148. });
  41149. sceneRenderer$3.updateScreenSize({
  41150. forceUpdateSize: true
  41151. }); //sceneRenderer.setSize(window.innerWidth, window.innerHeight)//不这么写因刚旋转时 window.innerWidth, window.innerHeight 不准确
  41152. //console.log('vrSplitScreen', b, window.innerWidth, window.innerHeight, player.domElement.clientWidth, player.domElement.clientHeight)
  41153. }
  41154. }); //}
  41155. if (window.orientation == 90 || window.orientation == 270) {
  41156. //横屏
  41157. settings$3.vrSplitScreen = true;
  41158. }
  41159. window.addEventListener('orientationchange', function (e) {
  41160. console.log("vr orientation ".concat(window.orientation));
  41161. if (window.orientation == 0 || window.orientation == 180) {
  41162. //竖屏
  41163. settings$3.vrSplitScreen = false;
  41164. } else {
  41165. settings$3.vrSplitScreen = true;
  41166. }
  41167. });
  41168. hasInit = true;
  41169. }
  41170. }, {
  41171. key: "isSupportXR",
  41172. value: function isSupportXR() {
  41173. return !!webxr.xrType;
  41174. }
  41175. }]);
  41176. return vr;
  41177. }(THREE.EventDispatcher);
  41178. var VR;
  41179. window.VR = VR = new vr(); //vr对焦
  41180. var createCursor = function createCursor(a, b, c, d, e) {
  41181. var g,
  41182. h = new THREE.SpriteMaterial({
  41183. opacity: c,
  41184. color: d,
  41185. transparent: b,
  41186. map: boluoloadTextureFromCache(texture.getImageURL('images/vrCursor.png')),
  41187. side: THREE.DoubleSide
  41188. });
  41189. h.map.offset = new THREE.Vector2(1 / 17 * e, 0);
  41190. h.map.repeat = new THREE.Vector2(1 / 17, 1);
  41191. h.depthTest = !1, h.blending = THREE.AdditiveBlending;
  41192. g = new THREE.Sprite(h);
  41193. g.scale.set(a, a, a);
  41194. g.position.z = -5, g.visible = !1, g.name = 'cursor', g.renderOrder = RenderOrder.panoMarker; //add
  41195. sceneRenderer$3.camera.add(g);
  41196. sceneRenderer$3.scene.add(sceneRenderer$3.camera);
  41197. VR.cursor = g;
  41198. var i = new VROrientation(sceneRenderer$3.scene, g, sceneRenderer$3.camera);
  41199. VR.cursor.triggerTargetEvent = i.triggerTargetEvent.bind(i), sceneRenderer$3.updateListeners = [i].concat(sceneRenderer$3.updateListeners); //before player
  41200. };
  41201. window.orientEnable = 0; //是否能触发deviceorientation
  41202. var VROrientation = function VROrientation(a, b, c) {
  41203. var _this2 = this;
  41204. function d() {
  41205. g.orient = THREE.MathUtils.degToRad(window.orientation || 0);
  41206. }
  41207. var updateRot = function updateRot(a) {
  41208. //deviceorientation 需要https
  41209. if (!settings$3.vrEnabled && window.orientEnable) return;
  41210. window.orientEnable || (window.orientEnable = 1); //if(this.alpha == a.alpha || this.beta == a.beta || this.gamma == a.gamma)return;
  41211. var b = THREE.MathUtils.degToRad(a.alpha),
  41212. c = THREE.MathUtils.degToRad(a.beta),
  41213. d = THREE.MathUtils.degToRad(a.gamma); //console.log(a.alpha.toFixed(3), c.toFixed(3), a.gamma.toFixed(3))
  41214. //console.log((b-this.alpha).toFixed(3), (c-this.beta).toFixed(3), (d-this.gamma).toFixed(3))
  41215. if (_this2.isHuawei5X) {
  41216. -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);
  41217. } else {
  41218. _this2.alpha = b, _this2.beta = c, _this2.gamma = d;
  41219. }
  41220. /* if ( SceneRenderer.vrDebug ) {
  41221. $("#info-device-orientation").css("display", "block");
  41222. var e = "";
  41223. e += "alpha=(" + g.alpha + ")<BR/>",
  41224. e += "beta=(" + g.beta + ")<BR/>",
  41225. e += "gamma=" + g.gamma + "<BR/>",
  41226. document.getElementById("info-device-orientation").innerHTML = e
  41227. } */
  41228. };
  41229. this.cursor = b, this.raycaster = new THREE.Raycaster(), this.targetEventObj = {}, this.type = 1, this.canStartAnimation = !0;
  41230. var g = this;
  41231. 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) {
  41232. if (alpha == -1000) return; // 利用player.updatefromControl来最终更新camera
  41233. var aimQua = quaternion.clone();
  41234. g.euler.set(beta, alpha, -gamma, 'YXZ');
  41235. aimQua.setFromEuler(g.euler);
  41236. aimQua.multiply(g.q1);
  41237. aimQua.multiply(g.q0.setFromAxisAngle(g.zee, -f));
  41238. var diffAngle = this.lastQua.angleTo(aimQua);
  41239. if (diffAngle < 1e-7) return; //防抖:
  41240. if (avoidFlicker && VR.shiftQuaternion) {
  41241. quaternion.copy(this.lastQua);
  41242. var useRatio = math$2.linearClamp(diffAngle, avoidFlicker.threshold.min, avoidFlicker.threshold.max, avoidFlicker.useRatio, 0.9); //越小越延迟
  41243. //const useRatio = diffAngle > avoidFlicker.threshold ? 1 : avoidFlicker.useRatio //越小越延迟
  41244. lerp.quaternion(quaternion, aimQua)(useRatio); //diffAngle > avoidFlicker.threshold.min && console.log(useRatio)
  41245. } else {
  41246. quaternion.copy(aimQua);
  41247. }
  41248. this.lastQua.copy(quaternion);
  41249. if (VR.shiftQuaternion == void 0) {
  41250. //标记初始水平朝向(进入vr时的)
  41251. var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(player$i.camera.quaternion); //初始的相机对应的朝向
  41252. dir.setY(0).normalize(); //水平
  41253. var mat = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir, new THREE.Vector3(0, 1, 0));
  41254. var startQuaternion = new THREE.Quaternion().setFromRotationMatrix(mat);
  41255. var dir2 = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion); //初始的陀螺仪对应的朝向
  41256. dir2.setY(0).normalize(); //水平
  41257. var mat2 = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir2, new THREE.Vector3(0, 1, 0));
  41258. var invertQuaternion = new THREE.Quaternion().setFromRotationMatrix(mat2).invert();
  41259. VR.shiftQuaternion = startQuaternion.clone().premultiply(invertQuaternion); //将此刻陀螺仪的朝向dir2矫正到此刻相机朝向dir所要乘的quaternion
  41260. }
  41261. quaternion.premultiply(VR.shiftQuaternion);
  41262. updateScreenFaceOrient(quaternion);
  41263. };
  41264. parent !== window && window.addEventListener('message', function (a) {
  41265. //针对iframe的??
  41266. if (!a.data || a.data && a.data.type && a.data.type.indexOf('webpack') > -1) {
  41267. return;
  41268. }
  41269. var b = typeof a.data == 'string' ? JSON.parse(a.data) : a.data,
  41270. c = -1 !== window.navigator.userAgent.indexOf('KIW-TL00H');
  41271. b && b.alpha && b.beta && b.gamma && function (a) {
  41272. var c = THREE.MathUtils.degToRad(b.alpha),
  41273. d = THREE.MathUtils.degToRad(b.beta),
  41274. e = THREE.MathUtils.degToRad(b.gamma);
  41275. 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);
  41276. }(c);
  41277. }), this.update = function (a) {
  41278. TWEEN.update();
  41279. if (settings$3.vrEnabled) {
  41280. if (window.ifTest) this.triggerTargetEvent(); //测试时不根据陀螺仪来转向
  41281. else {
  41282. webxr.xrType || this.setObjectQuaternion(player$i.cameraControls.activeControl.camera.quaternion
  41283. /* this.target.quaternion */
  41284. , this.alpha, this.beta, this.gamma, this.orient);
  41285. this.triggerTargetEvent();
  41286. }
  41287. }
  41288. }, this.triggerTargetEvent = function () {
  41289. if (webxr.hasHandel) return; //判断vr cursor是否选中物体
  41290. var a = this.choseObj(),
  41291. b = a ? a.object : void 0;
  41292. this.targetEventObj.currentObj = b;
  41293. b !== this.targetEventObj.lastObj && (b && this.autoCursorPosition(a), 1 === this.type ? (this.cursorAnimate && this.cursorAnimate.stop(), b && b.enabled && this.startAnimate(function () {
  41294. this.clickCallback(b);
  41295. }.bind(this))) : this.type, this.targetEventObj.lastObj = b);
  41296. }, this.choseObj = function () {
  41297. this.raycaster.setFromCamera({
  41298. x: 0,
  41299. y: 0
  41300. }, c);
  41301. var b = this.raycaster.intersectObjects(player$i.model.vrMarkers.filter(function (e) {
  41302. return e.visible;
  41303. }));
  41304. if (b.length > 0) return b[0];
  41305. }, this.clickCallback = function (a) {
  41306. //this.runTHREEAction(a, 'onclick')
  41307. a.dispatchEvent('click');
  41308. }, this.startAnimate = function (a) {
  41309. //vr cursor's circle animation
  41310. this.canStartAnimation && this.initAnimation(a);
  41311. }, this.initAnimation = function (done) {
  41312. var b = this,
  41313. offset = this.cursor.material.map.offset,
  41314. f = function f(a) {
  41315. return Math.floor(17 * a) / 17; //对应17个精灵图片段
  41316. };
  41317. b.canStartAnimation = !1, this.cursorAnimate = new TWEEN.Tween(offset).to({
  41318. x: 1 //100%
  41319. }, 1e3).onStart(function () {
  41320. b.canStartAnimation = !1;
  41321. }).onStop(function () {
  41322. b.canStartAnimation = !0, this.x = 0, offset.x = 0;
  41323. }).onUpdate(function () {}).onComplete(function () {
  41324. done(), offset.x = 0, setTimeout(function () {
  41325. b.canStartAnimation = !0;
  41326. }, 1500);
  41327. }), this.cursorAnimate.easing(f), this.cursorAnimate.start();
  41328. }, this.autoCursorPosition = function (a) {
  41329. var b = Math.abs(a.distance - 10);
  41330. this.cursor.position.z = -b, b /= 10, this.cursor.scale.set(b, b, b);
  41331. };
  41332. };
  41333. /* 为分屏重新创建了个renderer,分别渲染左右两个矩形区域,对应左右相机。
  41334. 替换sceneRenderer.renderer即可
  41335. */
  41336. var vrRenderer = function vrRenderer(renderer, sceneRenderer, camera) {
  41337. // vrRenderer类
  41338. var VRCamera = new vrCamera(camera); //d
  41339. window.VRCamera = VRCamera;
  41340. VRCamera.bananaAspect = 0.8, this.width, this.height;
  41341. this.name = 'vrRenderer';
  41342. var b = this;
  41343. this.setSize = function (c, d) {
  41344. renderer.setSize.call(this, c, d
  41345. /* , false */
  41346. ), b.width = c, b.height = d;
  41347. };
  41348. this.render = function (b, c, e, f) {
  41349. var g, h;
  41350. if (c.__RESS__SKIP__STEREO__) {
  41351. var V = renderer.autoClear;
  41352. renderer.autoClear = !1;
  41353. renderer.setRenderTarget(e);
  41354. if (f) renderer.clear();
  41355. renderer.render(b, c);
  41356. renderer.setRenderTarget(null);
  41357. renderer.autoClear = V;
  41358. return; // renderer.render(b, c, e, f)
  41359. }
  41360. if ('PerspectiveCamera' === c.type) g = VRCamera.cameraL, h = VRCamera.cameraR, b.updateMatrixWorld(), null === c.parent && c.updateMatrixWorld(), VRCamera.vrCameraUpdate(c);else {
  41361. if ('OrthographicCamera' !== c.type) return DEBUG && console.error('Unsupported renderer: ', c.type);
  41362. g = h = c;
  41363. }
  41364. 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);
  41365. };
  41366. this.__proto__ = {
  41367. //? 这句会使sceneRenderer.renderer指向这个vrRenderer
  41368. __proto__: renderer
  41369. };
  41370. };
  41371. var vrCamera = function vrCamera(a) {
  41372. 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', {
  41373. //这个为什么不是随着画面的比例?
  41374. get: function get() {
  41375. return this._aspect;
  41376. },
  41377. set: function set(a) {
  41378. this._aspect !== a && (this.vrCameraNeedsUpdate = !0), this._aspect = a;
  41379. }
  41380. }), Object.defineProperty(this, 'overlap', {
  41381. //瞳距
  41382. get: function get() {
  41383. return this._overlap;
  41384. },
  41385. set: function set(a) {
  41386. this._overlap !== a && (this.vrCameraNeedsUpdate = !0), this._overlap = a;
  41387. }
  41388. }), this.vrCameraUpdate = function (a) {
  41389. 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) {
  41390. this.vrCameraNeedsUpdate = !1, this.bananaFocus = a.focus, this.bananaFov = 50 //a.fov, 原本用的player.camera的fov应该是50,但这里player.camera设置了70,会让镜头变窄
  41391. ;
  41392. this.bananaReal_aspect = a.aspect * this.bananaAspect, this.bananaNear = a.near, this.bananaFar = a.far, this.bananaFocus = 10;
  41393. var left,
  41394. right,
  41395. d = a.projectionMatrix.clone(),
  41396. e = this.overlap / 2,
  41397. shift = e * this.bananaNear / this.bananaFocus,
  41398. //bananaFocus是焦距吗
  41399. top = this.bananaNear * Math.tan(Math.PI / 180 * this.bananaFov * 0.5);
  41400. this.eyeLeft.elements[12] = -e, this.eyeRight.elements[12] = e, left = -top * this.bananaReal_aspect + shift, right = top * this.bananaReal_aspect + shift;
  41401. d.elements[0] = 2 * this.bananaNear / (right - left); //只改左右,不改上下,所以虽然bananaReal_aspect可能和原来一样,但调了vfov就会直接影响hfov
  41402. d.elements[8] = (right + left) / (right - left);
  41403. this.cameraL.projectionMatrix.copy(d);
  41404. left = -top * this.bananaReal_aspect - shift, right = top * this.bananaReal_aspect - shift;
  41405. d.elements[0] = 2 * this.bananaNear / (right - left);
  41406. d.elements[8] = (right + left) / (right - left);
  41407. this.cameraR.projectionMatrix.copy(d);
  41408. }
  41409. this.cameraL.matrixWorld.copy(a.matrixWorld).multiply(this.eyeLeft), this.cameraR.matrixWorld.copy(a.matrixWorld).multiply(this.eyeRight);
  41410. };
  41411. };
  41412. var boluoloadTextureFromCache = function boluoloadTextureFromCache(a) {
  41413. var b = new THREE.TextureLoader();
  41414. return b.crossOrigin = 'anonymous', b.load(a);
  41415. };
  41416. /* bus.on("orientation", () => {
  41417. console.log(`vr orientation ${window.orientation}`)
  41418. if(window.orientation== 0||window.orientation==180) { //竖屏
  41419. settings.vrSplitScreen = false
  41420. }else{
  41421. settings.vrSplitScreen = true
  41422. }
  41423. }) */
  41424. var webxr = {
  41425. init(renderer) {
  41426. var _this3 = this;
  41427. this.renderer = renderer;
  41428. renderer.xr.enabled = true;
  41429. var xr = this.renderer.xr;
  41430. var cameraVR = xr.getCamera();
  41431. var makeit = function makeit() {
  41432. //xr存在
  41433. VR.cursor.parent.remove(VR.cursor);
  41434. cameraVR.add(VR.cursor);
  41435. sceneRenderer$3.scene.add(cameraVR);
  41436. /* cameraVR.layers.enable(RenderLayers.RETICULE)
  41437. cameraVR.cameras.forEach(camera=>{//实际渲染的是这两个camera
  41438. camera.layers.enable(RenderLayers.RETICULE)
  41439. }) */
  41440. _this3.initHandler();
  41441. player$i.on('update', function (e) {
  41442. if (_this3.entered && _this3.hasHandel && (e.hasChanged.cameraChanged2 || e.hasChanged.vrHandlerMoved)) {
  41443. _this3.setHandlerLength(player$i.intersect);
  41444. player$i.reticule.move(null, null, false); //console.log('reticule move')
  41445. }
  41446. });
  41447. };
  41448. if ('xr' in navigator && 'isSessionSupported' in navigator.xr) {
  41449. //pico firefox 、 安卓手机chrome
  41450. var mode = 'immersive-vr';
  41451. navigator.xr.isSessionSupported(mode).then(function (supported) {
  41452. //会触发chrome请求下载VR服务
  41453. if (!supported) {
  41454. _this3.xrNotFound('isSessionSupported not supported');
  41455. } else {
  41456. _this3.xrType = 'xr'; //showEnterXR();
  41457. makeit();
  41458. }
  41459. }).catch(this.xrNotFound.bind(this, 'isSessionSupported error'));
  41460. } else if ('getVRDisplays' in navigator) {
  41461. //pico 的vr browser是这个 但该版本已被废弃,没有可供的浏览器可以调试
  41462. console.log('\n getVRDisplays!!!!!!!!!\n \n \n ');
  41463. var setDevice = function setDevice(device) {
  41464. _this3.xrType = 'vr';
  41465. _this3.device = device;
  41466. _this3.renderer.xr.setDevice(device); //新版是renderer.vr
  41467. makeit();
  41468. };
  41469. window.addEventListener('vrdisplayconnect', function (event) {
  41470. setDevice(event.display);
  41471. }, false);
  41472. window.addEventListener('vrdisplaydisconnect', function () {
  41473. console.log('vrdisplaydisconnect');
  41474. }, false);
  41475. window.addEventListener('vrdisplaypresentchange', function (event) {
  41476. console.log('vrdisplaypresentchange', event.display.isPresenting ? 'EXIT VR' : 'ENTER VR');
  41477. _this3.callback(!!event.display.isPresenting);
  41478. }, false);
  41479. window.addEventListener('vrdisplayactivate', function (event) {
  41480. event.display.requestPresent([{
  41481. source: this.renderer.domElement
  41482. }]);
  41483. }, false);
  41484. navigator.getVRDisplays().then(function (displays) {
  41485. if (displays.length > 0) {
  41486. setDevice(displays[0]);
  41487. } else {
  41488. this.xrNotFound('no displays');
  41489. }
  41490. }).catch(this.xrNotFound.bind(this, 'getVRDisplays error'));
  41491. } else {
  41492. this.xrNotFound('xr not supported');
  41493. }
  41494. {
  41495. //修改three源代码:
  41496. var originUpdateCamera = xr.updateCamera;
  41497. var _this = this;
  41498. xr.updateCamera = function (camera) {
  41499. //sceneRenderer.camera
  41500. //if (!_this.tranCamMatrix) {
  41501. //初始化,获取转换矩阵
  41502. originUpdateCamera(camera); //第一次计算得到的CameraVR的pose是未转换过的device的pose (注意:万一按了reset pose需要重新初始化device的pose,有reset事件吗)
  41503. _this.getShiftPosMat(cameraVR.position); //本来以为local模式下设备是不会位移的,结果居然会,所以需要一直更新devicePos,以及转换函数
  41504. _this.getTranCamMatrix(cameraVR.position, cameraVR.quaternion); //new THREE.Matrix4().multiplyMatrices(originMatrix, cameraVR.matrixWorld.clone().invert()),
  41505. //}
  41506. cameraVR.cameras[0].matrix.premultiply(_this.tranCamMatrix);
  41507. cameraVR.cameras[1].matrix.premultiply(_this.tranCamMatrix);
  41508. cameraVR.cameras.concat([cameraVR]).forEach(function (camera) {
  41509. //实际渲染的是两个cameras
  41510. camera.layers.mask = player$i.camera.layers.mask;
  41511. });
  41512. originUpdateCamera(camera); //根据cameraL和cameraR重算cameraVR matrixWorld
  41513. //还需要将cameraVR同步到camera的,因为originUpdateCamera写的不太好,在半中间同步
  41514. //camera.position.copy(cameraVR.position);
  41515. camera.quaternion.copy(cameraVR.quaternion); //camera.scale.copy(cameraVR.scale);
  41516. //camera.matrix.copy(cameraVR.matrix);
  41517. //camera.matrixWorld.copy(cameraVR.matrixWorld);
  41518. player$i.quaternion.copy(cameraVR.quaternion); //这步不写的话方向有问题贴图模糊
  41519. //player.position.copy(cameraVR.position);
  41520. //另外fov放大了,需要一致吗。但用的不是camera.fov, 搜topFov
  41521. camera.updateMatrixWorld(); //for choseObj
  41522. //updateScreenFaceOrient(cameraVR.quaternion)
  41523. };
  41524. player$i.on('update', function (e) {
  41525. //飞向下一个点时,因相机移动了而设备位置不能移动,相对位置改变,要重新绑定位置矩阵
  41526. if (!_this3.entered) return;
  41527. if (e.hasChanged.moved && _this3.devicePos) {
  41528. _this3.getShiftPosMat(_this3.devicePos);
  41529. _this3.getTranCamMatrix();
  41530. }
  41531. });
  41532. }
  41533. },
  41534. enterVR() {
  41535. var _this4 = this;
  41536. if (!this.xrType) return; //不支持
  41537. console.log('enterVR', this.xrType);
  41538. browser$1.exitFullscreen();
  41539. if (this.xrType == 'vr') {
  41540. this.device.isPresenting ? this.device.exitPresent() : this.device.requestPresent([{
  41541. source: renderer.domElement
  41542. }]);
  41543. } else if (this.xrType == 'xr') {
  41544. if (this.currentSession == void 0) {
  41545. //console.log('this.currentSession == void 0 ')
  41546. var getXRSessionInit = function getXRSessionInit(mode, options) {
  41547. var space = (options || {}).referenceSpaceType || 'local-floor';
  41548. var sessionInit = options && options.sessionInit || {}; // Nothing to do for default features.
  41549. if (space == 'viewer') return sessionInit;
  41550. 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.
  41551. if (sessionInit.optionalFeatures && sessionInit.optionalFeatures.includes(space)) return sessionInit;
  41552. 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
  41553. // of the user-supplied sessionInit requiredFeatures (if any) to ensure it's valid to
  41554. // request it later.
  41555. var newInit = Object.assign({}, sessionInit);
  41556. newInit.requiredFeatures = [space];
  41557. if (sessionInit.requiredFeatures) {
  41558. newInit.requiredFeatures = newInit.requiredFeatures.concat(sessionInit.requiredFeatures);
  41559. }
  41560. return newInit;
  41561. };
  41562. var onSessionEnded = function onSessionEnded() {
  41563. console.log('onSessionEnded');
  41564. _this4.currentSession.removeEventListener('end', onSessionEnded);
  41565. setTimeout(function () {
  41566. _this4.renderer.xr.setSession(null);
  41567. _this4.currentSession = null;
  41568. _this4.callback(false);
  41569. }, 1); //延迟原因:先使THREE里的onSessionEnded执行
  41570. };
  41571. var onReset = function onReset() {
  41572. console.log('onReset');
  41573. };
  41574. var onSessionStarted = function onSessionStarted(session) {
  41575. console.log('onSessionStarted');
  41576. /* var attributes = this.renderer.getContextAttributes();
  41577. console.log('xrCompatible', attributes.xrCompatible) */
  41578. session.addEventListener('end', onSessionEnded);
  41579. session.addEventListener('reset', onReset); //在空间被重置时触发,例如,用户校准 XR 设备或 XR 设备重连后自动切回原点。
  41580. _this4.renderer.xr.setSession(session);
  41581. _this4.currentSession = session;
  41582. _this4.callback(true);
  41583. };
  41584. var mode = 'immersive-vr';
  41585. var sessionInit = getXRSessionInit(mode);
  41586. navigator.xr.requestSession(mode, sessionInit).then(onSessionStarted);
  41587. } else {
  41588. console.log('this.currentSession.end()', this.currentSession);
  41589. this.currentSession.end();
  41590. } //为何我看到模拟器可以移动?但是并没有设置为bound
  41591. }
  41592. },
  41593. leaveVR() {
  41594. if (this.xrType == 'xr') {
  41595. this.currentSession && this.currentSession.end();
  41596. } else if (this.xrType == 'vr') ;
  41597. },
  41598. switchRender(state) {
  41599. //xr暂停原先sceneRenderer中的animate loop
  41600. if (state) {
  41601. console.log('switchRender', state);
  41602. this.renderer.setAnimationLoop(function () {
  41603. //必须使用setAnimationLoop来渲染才能有画面
  41604. sceneRenderer$3.animate({
  41605. byOther: true
  41606. });
  41607. });
  41608. sceneRenderer$3.started = false;
  41609. } else {
  41610. this.renderer.setAnimationLoop(null);
  41611. sceneRenderer$3.started = true;
  41612. sceneRenderer$3.animate();
  41613. }
  41614. },
  41615. callback(isEnter) {
  41616. //开启或关闭之后
  41617. isEnter = !!isEnter;
  41618. if (isEnter) ; else {
  41619. settings$3.vrEnabled = false; //由系统关闭的话,需要执行一下这句,确保一些东西关闭
  41620. this.tranCamMatrix = this.shiftQuaMat = this.shiftPosMat = null;
  41621. }
  41622. this.switchRender(isEnter);
  41623. common$1.updateVisible(this.handler, 'enterXR', isEnter);
  41624. this.entered = isEnter;
  41625. console.log('webxrEntered', isEnter);
  41626. player$i.$app.Scene.emit('webxrEntered', isEnter);
  41627. },
  41628. xrNotFound(text1, text2) {
  41629. console.error('xrNotFound:', text1, text2);
  41630. },
  41631. //求陀螺仪相机和player相机的转换矩阵
  41632. getShiftQuaMat(deviceQua) {
  41633. //根据初始的player的quaternion和设备陀螺仪的quaternion做一个绑定,得水平quaternion差
  41634. var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(player$i.quaternion
  41635. /* player.cameraControls.activeControl.camera.quaternion */
  41636. ); //初始的相机对应的朝向
  41637. dir.setY(0).normalize(); //水平
  41638. var mat = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir, new THREE.Vector3(0, 1, 0));
  41639. var dir2 = new THREE.Vector3(0, 0, -1).applyQuaternion(deviceQua); //初始的陀螺仪对应的朝向
  41640. dir2.setY(0).normalize(); //水平
  41641. var mat2 = new THREE.Matrix4().lookAt(new THREE.Vector3(), dir2, new THREE.Vector3(0, 1, 0));
  41642. this.shiftQuaMat = mat.clone().premultiply(mat2.clone().invert()); //将此刻陀螺仪的朝向dir2矫正到此刻相机朝向dir所要乘的quaternion
  41643. },
  41644. getShiftPosMat(devicePos) {
  41645. this.shiftPosMat1 = new THREE.Matrix4().setPosition(devicePos.clone().negate());
  41646. this.shiftPosMat2 = new THREE.Matrix4().setPosition(player$i.position.clone());
  41647. this.devicePos = devicePos.clone(); //记录,下次可以直接使用
  41648. },
  41649. getTranCamMatrix(devicePos, deviceQua, reverse) {
  41650. if (!this.shiftQuaMat && !deviceQua || !this.shiftPosMat1 && !devicePos) return;
  41651. if (!this.shiftQuaMat) this.getShiftQuaMat(deviceQua);
  41652. if (!this.shiftPosMat1) this.getShiftPosMat(devicePos); //先移到原点,再旋转,再移到终点
  41653. this.tranCamMatrix = new THREE.Matrix4().multiplyMatrices(this.shiftQuaMat, this.shiftPosMat1);
  41654. this.tranCamMatrix = new THREE.Matrix4().multiplyMatrices(this.shiftPosMat2, this.tranCamMatrix); //this.controller1.children[0].matrix.copy(this.tranCamMatrix)
  41655. },
  41656. initHandler() {
  41657. var _this5 = this;
  41658. console.log('initHandler');
  41659. var isChrome = /Chrome/i.test(navigator.userAgent);
  41660. var minAngleTorler = THREE.MathUtils.degToRad(5);
  41661. var controller0 = this.renderer.xr.getController(0); //right //WebXRController._targetRay
  41662. var controller1 = this.renderer.xr.getController(1); //left
  41663. controller0.name = 'controller0-right';
  41664. controller1.name = 'controller1-left';
  41665. var material = new THREE.MeshBasicMaterial({
  41666. color: '#ffffff',
  41667. opacity: 0.5,
  41668. transparent: true,
  41669. depthTest: false,
  41670. depthWrite: false
  41671. });
  41672. var stem = new THREE.Mesh(new THREE.BoxBufferGeometry(0.01, 0.01, 1), material);
  41673. var translateMatrix = new THREE.Matrix4().makeTranslation(0, 0, -0.5); //使一端居于原点
  41674. stem.geometry.applyMatrix4(translateMatrix);
  41675. var sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(0.03, 6, 5), material);
  41676. sphere.position.set(0, 0, -1);
  41677. var handler = new THREE.Object3D();
  41678. handler.add(stem);
  41679. handler.add(sphere);
  41680. handler.matrixAutoUpdate = false;
  41681. handler.name = 'handler';
  41682. common$1.updateVisible(handler, 'enterXR', false);
  41683. isChrome && common$1.updateVisible(handler, 'supportHandler', false); //可能是手机安装了VR框架,但无头盔无手柄
  41684. sceneRenderer$3.scene.add(handler);
  41685. this.handler = handler;
  41686. this.handler.lastMatrix = this.handler.matrix.clone();
  41687. var currentControl = controller0;
  41688. var handelConfirmed = function handelConfirmed() {
  41689. if (_this5.hasHandel) return; //是否包含手柄 有的话就不需要vrmarker等
  41690. common$1.updateVisible(handler, 'supportHandler', true);
  41691. player$i.model.panos.forEach(function (e) {
  41692. return e.vrMarker && common$1.updateVisible(e.vrMarker, 'supportHandler', false);
  41693. });
  41694. common$1.updateVisible(VR.cursor, 'supportHandler', false);
  41695. _this5.hasHandel = true;
  41696. };
  41697. var init = function init(control) {
  41698. var selectStartQua, selectStartTime;
  41699. control.addEventListener('selectstart', function (e) {
  41700. //相当于pointerdown 前面的按键
  41701. if (currentControl != control) {
  41702. currentControl = control;
  41703. console.log('切换control', control.name);
  41704. }
  41705. handelConfirmed();
  41706. selectStartQua = control.quaternion.clone();
  41707. selectStartTime = Date.now();
  41708. });
  41709. control.addEventListener('selectend', function (e) {
  41710. //相当于pointerup
  41711. //console.log('selectend')
  41712. var selectEndQua = control.quaternion.clone();
  41713. var selectEndTime = Date.now();
  41714. if (selectEndTime - selectStartTime < 1000 && selectEndQua.angleTo(selectStartQua) < minAngleTorler) {
  41715. //if (player.intersect) {
  41716. return player$i.flyToPanoClosestToMouse(); //} else console.log('no intersect')
  41717. } //最好执行updateIntersect, 且延长handle到intersect
  41718. });
  41719. /* control.addEventListener("squeezestart",(e)=>{//旁边的按键
  41720. console.log('squeezestart', control.name) //是否用这个来充当滚轮?但是vr真实视觉一般不适合放大
  41721. }) */
  41722. control.addEventListener('connected', function (e) {
  41723. //进入xr会执行
  41724. console.log('connected', control.name);
  41725. });
  41726. control.addEventListener('disconnected', function (e) {
  41727. //退出xr时会执行
  41728. console.log('disconnected', control.name);
  41729. });
  41730. var update = function update() {
  41731. if (currentControl != control) return;
  41732. _this5.handler.lastMatrix = _this5.handler.matrix.clone();
  41733. _this5.tranCamMatrix || new THREE.Matrix4();
  41734. _this5.tranCamMatrix && _this5.handler.matrix.copy(control.matrix).premultiply(_this5.tranCamMatrix);
  41735. _this5.handler.matrix.decompose(_this5.handler.position, _this5.handler.quaternion, new THREE.Vector3()); //console.log('handle update', this.handler.position.toArray() )
  41736. //material.opacity = player.reticule.material.uniforms.opacity.value
  41737. }; //google vr服务即使没有手柄也会不停执行update,位置还会变
  41738. //为何模拟器中手柄的旋转和渲染出的不同,模拟器中显示0,0,0, 实际是-0.49,0,0,模拟器的bug?
  41739. control.addEventListener('move', update);
  41740. update();
  41741. };
  41742. init(controller0);
  41743. init(controller1);
  41744. },
  41745. handlerMoved() {
  41746. return this.hasHandel && !this.handler.lastMatrix.equals(this.handler.matrix);
  41747. },
  41748. setRayCaster(raycaster) {
  41749. //console.log('dir',dir)
  41750. raycaster.set(this.handler.position, this.getHandlerDir());
  41751. },
  41752. getHandlerDir() {
  41753. return new THREE.Vector3(0, 0, -1).applyQuaternion(this.handler.quaternion);
  41754. },
  41755. setHandlerLength(intersect) {
  41756. if (!intersect) return;
  41757. this.handler.children[0].scale.z = intersect.distance;
  41758. this.handler.children[1].position.set(0, 0, -intersect.distance);
  41759. }
  41760. };
  41761. VR.webxr = webxr;
  41762. /*
  41763. see:
  41764. https://immersiveweb.dev/
  41765. https://github.com/immersive-web/webxr/blob/master/explainer.md
  41766. https://blog.csdn.net/zhaoxinyao9/article/details/126290815 (中文)
  41767. domo:https://www.4dmodel.com/test/webxr/
  41768. 目前 XRReferenceSpaceType 分为 5 种类型,分别如下。
  41769. viewer 表示具有原生原点的跟踪空间,一般用于不进行任何跟踪场景,任何设备都应该支持该类型
  41770. local 表示只跟踪用户旋转,不跟踪位置,可以理解为坐下,只用头部来观看场景
  41771. local-floor 与 local 类型相似,但是它是站立着的
  41772. bounded-floor 表示在安全区内跟踪旋转和位置,用户可以完全与场景进行交互
  41773. unbounded 表示用户可以自由在场景中移动和旋转,没有安全区限制
  41774. 还可以改进的地方:
  41775. 摇杆控制方向,向左向右旋转、向前进或者fov放大。直接加载4k。 似乎加载图有点慢?loading的三个球画一下。squeeze可以加功能。
  41776. disconnected的情况有哪些
  41777. 参考的门户网站:
  41778. 除了720外
  41779. https://www.ivrpano.com/p/a4135859726628b7?_s=56eadc3a2da6c16b
  41780. pico2 vr browser:
  41781. webxr案例用的three版本是111dev,而目前v4用的是143?,不知为何新版本会报错:
  41782. cannot create XRWebGLLayer before first calling makeXRCompatible
  41783. https://github.com/MozillaReality/FirefoxReality/issues/3420该网页提示升级firefox到10.1即可,故等升级中
  41784. 头盔需不需要换成4k?(很难知道是不是头盔) 但害怕会卡 ?屏幕像素支不支持这么高清。
  41785. */
  41786. function initFlicker() {
  41787. //设置防抖
  41788. var list = [// userAgent列表
  41789. {
  41790. name: 'nova 10z',
  41791. //设备名称
  41792. //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案例,不同浏览器不同
  41793. //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
  41794. //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
  41795. words: ['CHA-AL80', '537.36'],
  41796. threshold: {
  41797. min: 0.005,
  41798. max: 0.7
  41799. },
  41800. //变化大于这个角度不延迟, 为了防止移动过慢。只在相对静止要对准时防抖。
  41801. useRatio: 0.2 //越低代表抖动越强 //该设备平放桌面都在抖动 alpha等幅度0.02, 还有陀螺仪不准,有时转到背面画面还在当前。贝壳更是转不动。测过三个浏览器均是。可能是设备陀螺仪损坏
  41802. } //仍有的缺陷:因为移动延迟,对焦有点困难。
  41803. ];
  41804. var agent = window.navigator.userAgent;
  41805. for (var i = 0, j = list.length; i < j; i++) {
  41806. var item = list[i];
  41807. if (!item.words.some(function (word) {
  41808. return !agent.includes(word);
  41809. })) {
  41810. //每个word都在agent中存在
  41811. avoidFlicker = item;
  41812. break;
  41813. }
  41814. } //avoidFlicker = list[0]
  41815. if (!avoidFlicker) {
  41816. //给个默认 一点点的防抖 (对iphoneX表现有较明显的提升)
  41817. avoidFlicker = {
  41818. name: 'default',
  41819. threshold: {
  41820. min: 0.01,
  41821. max: 0.3
  41822. },
  41823. useRatio: 0.5 //越低代表抖动越强
  41824. };
  41825. } //console.log('initFlicker', window.navigator.userAgent )
  41826. }
  41827. function updateScreenFaceOrient(quaternion) {
  41828. if (!settings$3.vrSplitScreen) {
  41829. var dir = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion); //相机方向,也是屏幕旋转轴
  41830. player$i.camera.lookAt(player$i.camera.position.clone().add(dir)); //window.screenFaceOrient = THREE.MathUtils.radToDeg(player.camera.quaternion.angleTo(quaternion))
  41831. var dirCamera1 = new THREE.Vector3(1, 0, 0).applyQuaternion(quaternion); //相机横轴被旋转后的方向(如果得到的y还是0,说明没有歪)
  41832. var dirCamera2 = new THREE.Vector3(1, 0, 0).applyQuaternion(player$i.camera.quaternion); //相机横轴被旋转后的方向(这里得到的y是0)
  41833. window.screenFaceOrient = THREE.MathUtils.radToDeg(dirCamera1.angleTo(dirCamera2));
  41834. var crossAxis = dirCamera1.clone().cross(dirCamera2); // 通过朝dir还是-dir来判断逆时针还是顺时针
  41835. if (crossAxis.dot(dir) < 0) {
  41836. window.screenFaceOrient *= -1;
  41837. }
  41838. }
  41839. }
  41840. var VR$1 = VR;
  41841. 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); }; }
  41842. 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; } }
  41843. var player$h,
  41844. sceneRenderer$2,
  41845. miniDom;
  41846. var size$3 = {
  41847. w: 200,
  41848. h: 200,
  41849. right: 60,
  41850. top: 103
  41851. };
  41852. new THREE.RawShaderMaterial({
  41853. vertexShader: "\n attribute vec3 position;\n void main() { gl_Position = vec4( position, 1.0 );} \n ",
  41854. fragmentShader: "\n void main() { gl_FragColor = vec4( 0., 0., 0., 0.1); }\n ",
  41855. transparent: true,
  41856. depthWrite: false
  41857. });
  41858. var planeGeo$2 = new THREE.PlaneBufferGeometry(1, 1); //dollhouse模式小窗
  41859. var MiniDollhouse = /*#__PURE__*/function (_Viewport) {
  41860. _inherits(MiniDollhouse, _Viewport);
  41861. var _super = _createSuper$U(MiniDollhouse);
  41862. function MiniDollhouse(player_, sceneRenderer_, miniDom_) {
  41863. var _this;
  41864. _classCallCheck(this, MiniDollhouse);
  41865. player$h = player_;
  41866. miniDom = miniDom_;
  41867. sceneRenderer$2 = sceneRenderer_;
  41868. var camera = new THREE.PerspectiveCamera(constants$4.dollhouseFOV);
  41869. _this = _super.call(this, camera, {
  41870. left: 0.4,
  41871. bottom: 0.2,
  41872. width: size$3.w + 'px',
  41873. height: size$3.h + 'px',
  41874. name: 'mini'
  41875. });
  41876. var controls = _this.controls = new DollhouseControls(camera, null
  41877. /* dom */
  41878. , player$h);
  41879. common$1.setCameraLayers(camera, ['MODEL', 'cursor_mini']);
  41880. _this.dontClear = true; //覆盖在之前画好的
  41881. _this.initScene();
  41882. var updateCursor = function updateCursor() {
  41883. /* this.cursor.position.copy(player.position)
  41884. //let yaw = math.getYawByDir(player.getDirection())
  41885. this.cursor.rotation.z = -player.yaw - Math.PI / 2
  41886. this.needupdate = false */
  41887. //游标在当前点位上,飞出后不改旋转
  41888. if (player$h.mode == 'panorama') {
  41889. _this.cursor.position.copy(player$h.position);
  41890. _this.cursor.rotation.z = -player$h.yaw - Math.PI / 2; //ui要求要看起来大小不变
  41891. var s = _this.cursor.position.distanceTo(camera.position) * 0.3;
  41892. _this.cursor.scale.set(s, s, s);
  41893. }
  41894. };
  41895. updateCursor();
  41896. var init = function init() {
  41897. //player.once('pano.chosen', () => {
  41898. //wait for model.center
  41899. var boundingBox = player$h.model.boundingBox.clone().expandByScalar(5);
  41900. controls.setZoomBounds(player$h.model.boundingBox);
  41901. controls.setBounds(boundingBox);
  41902. var rect = miniDom.getBoundingClientRect();
  41903. size$3.w = Math.round(rect.width), size$3.h = Math.round(rect.height);
  41904. _this.width = size$3.w + 'px', _this.height = size$3.h + 'px'; //暂定宽高固定不变
  41905. var aspect = size$3.w / size$3.h;
  41906. controls.updateDistance(aspect);
  41907. _this.initCameraPose();
  41908. miniDom.addEventListener('click', function () {
  41909. if (!_this.disable && player$h.$app.store.getValue('metadata').controls.showDollhouse && !player$h.$app.Camera.locked) {
  41910. player$h.flyToNewMode({
  41911. mode: 'dollhouse'
  41912. });
  41913. }
  41914. });
  41915. /* let container = document.querySelector('#kankan-plugins__1')
  41916. rectBorder = document.createElement('div')
  41917. rectBorder.id = 'miniDollBorder'
  41918. rectBorder.style.border = radius + 'px solid rgba(0,0,0,0.1)'
  41919. rectBorder.style['border-radius'] = radius + 'px'
  41920. rectBorder.style.position = 'absolute'
  41921. rectBorder.style.width = size.w + 2 * radius + 'px' //size.x + 'px'
  41922. rectBorder.style.height = size.h + 2 * radius + 'px'
  41923. container.appendChild(rectBorder) */
  41924. //this.setClipArea(sceneRenderer.renderWidth, sceneRenderer.renderHeight)
  41925. };
  41926. if (player_.$app.Scene.loaded) {
  41927. init();
  41928. } else {
  41929. player_.$app.Scene.on('loaded', init);
  41930. }
  41931. player$h.on('update', function (e) {
  41932. if (e.hasChanged.cameraWorldMatrixChanged && !_this.disable || _this.needupdate) updateCursor();
  41933. });
  41934. var map = new Map();
  41935. var oldTra;
  41936. _this.beforeRender = function () {
  41937. if (player$h.mode == 'dollhouse') return;
  41938. player$h.model.chunks.forEach(function (e) {
  41939. map.set(e, {
  41940. material: e.material,
  41941. side: e.material.side
  41942. });
  41943. e.material = e.materialOutside;
  41944. e.material.side = 0;
  41945. });
  41946. if (player$h.modeTran.split('-')[1] == 'panorama'
  41947. /* player.mode == 'panorama' */
  41948. && player$h.model.floors.length > 1) {
  41949. oldTra = player$h.modeTran;
  41950. player$h.modeTran = 'dollhouse-dollhouse'; //player.model.setMode('dollhouse')
  41951. player$h.model.floors.forEach(function (floor) {
  41952. var show = floor == player$h.model.currentFloor;
  41953. show || floor.hide('bymi');
  41954. });
  41955. } //common.screenPass.render(sceneRenderer.renderer, bgColorMat) //蒙上一层背景
  41956. };
  41957. _this.afterRender = function () {
  41958. if (player$h.mode == 'dollhouse') return;
  41959. player$h.model.chunks.forEach(function (e) {
  41960. var a = map.get(e);
  41961. e.material = a.material;
  41962. e.material.side = a.side;
  41963. });
  41964. if (player$h.modeTran.split('-')[1] == 'panorama' && player$h.model.floors.length > 1) {
  41965. player$h.modeTran = oldTra; //player.model.setMode('panorama')
  41966. player$h.model.floors.forEach(function (floor) {
  41967. var show = floor == player$h.model.currentFloor;
  41968. show || floor.show('bymi');
  41969. });
  41970. }
  41971. };
  41972. sceneRenderer$2.on('render', function () {
  41973. _this.setClipArea();
  41974. }); //因为dom可能有动效所以要实时监听
  41975. /* player.on('mode.changed',()=>{//飞出后cursor变很大,隐藏吧 但这样dollhouse模式就不知道在哪,先不改算了
  41976. this.cursor.visible = player.mode == 'panorama'
  41977. }) */
  41978. return _this;
  41979. }
  41980. _createClass(MiniDollhouse, [{
  41981. key: "initScene",
  41982. value: function initScene() {
  41983. var cursor = new THREE.Mesh(planeGeo$2, new THREE.MeshBasicMaterial({
  41984. transparent: true,
  41985. //opacity: 0.8,
  41986. depthTest: false,
  41987. side: 2,
  41988. map: common$1.loadTextureFromCache(texture.getImageURL('images/pic_location128.png'))
  41989. }));
  41990. /* let s = this.controls.offset.length() / 3.5
  41991. var cursor = new Sprite({
  41992. fixOrient:true,
  41993. mat: new THREE.MeshBasicMaterial({
  41994. transparent: true,
  41995. opacity: 0.8,
  41996. depthTest: false,
  41997. side: 2,
  41998. map: common.loadTextureFromCache(texture.getImageURL('images/pic_location128_blue.png')),
  41999. }),
  42000. sizeInfo: {
  42001. camera: this.camera,
  42002. nearBound: s * 10, farBound: s * 50, minSize: 10, maxSize
  42003. }
  42004. }) */
  42005. cursor.name = 'miniDoll-cursor';
  42006. cursor.rotation.x = Math.PI / 2;
  42007. cursor.layers.set(RenderLayers.cursor_mini);
  42008. cursor.renderOrder = 10;
  42009. player$h.model.add(cursor);
  42010. this.cursor = cursor;
  42011. }
  42012. }, {
  42013. key: "initCameraPose",
  42014. value: function initCameraPose() {
  42015. /* this.controls.target.copy(player.model.center)
  42016. this.camera.position.copy(player.model.center)
  42017. this.camera.position.y += 30
  42018. this.controls.update(0) */
  42019. //this.controls.suitableDistance *= 0.9 //有的场景会超出范围,有的又太小
  42020. var oldControls = player$h.cameraControls.controls['dollhouse'];
  42021. player$h.cameraControls.controls['dollhouse'] = this.controls;
  42022. player$h.switchCameraMode('dollhouse', player$h.initialQua, null, null, null, {
  42023. heightRatio: 6
  42024. }); //稍微垂直点往下看
  42025. player$h.cameraControls.controls['dollhouse'] = oldControls;
  42026. var s = this.controls.offset.length() / 3.5;
  42027. this.cursor.scale.set(s, s, s);
  42028. } //会被界面上其他元素遮住
  42029. }, {
  42030. key: "setClipArea",
  42031. value: function setClipArea() {
  42032. var width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : sceneRenderer$2.renderWidth;
  42033. var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : sceneRenderer$2.renderHeight;
  42034. if (!player$h.domElement || this.disable) return; //console.log('setClipArea',width,height)
  42035. var mapRect = miniDom.getBoundingClientRect();
  42036. /*
  42037. let leftPX = Math.floor(mapRect.left)
  42038. this.left = leftPX / width
  42039. this.bottom = Math.floor(height - mapRect.bottom) / height */
  42040. /* this.left = (width - size.right - size.w) / width
  42041. this.bottom = (height - size.top - size.h) / height */
  42042. this.left = mapRect.left / width;
  42043. this.bottom = (height - mapRect.bottom) / height;
  42044. /* rectBorder.style.right = width - mapRect.right - radius + 'px'
  42045. rectBorder.style.top = mapRect.top - radius + 'px' */
  42046. return; //防止热点等元素覆盖这个区域:
  42047. } //圆角实现:在 xui_min_map 内为这个加个圆角矩形,实心且被clip,或空心但有border
  42048. }]);
  42049. return MiniDollhouse;
  42050. }(Viewport);
  42051. 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); }; }
  42052. 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; } }
  42053. new THREE.RawShaderMaterial({
  42054. fragmentShader: shaders.skysphere.fragmentShader,
  42055. vertexShader: shaders.skysphere.vertexShader,
  42056. uniforms: THREE.UniformsUtils.clone(shaders.skysphere.uniforms),
  42057. side: THREE.BackSide,
  42058. name: 'skysphereBG'
  42059. });
  42060. window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame;
  42061. var index$1 = 0;
  42062. defineComponent('SceneRenderer', function () {
  42063. return /*#__PURE__*/function (_EventEmitter) {
  42064. _inherits(SceneRenderer, _EventEmitter);
  42065. var _super = _createSuper$T(SceneRenderer);
  42066. function SceneRenderer() {
  42067. var _this;
  42068. _classCallCheck(this, SceneRenderer);
  42069. _this = _super.call(this);
  42070. _this.createScene = function (model) {
  42071. this.camera = new THREE.PerspectiveCamera();
  42072. /* this.camera.layers.enable(RenderLayers.PANOMARKERS)
  42073. this.camera.layers.enable(RenderLayers.RETICULE) */
  42074. common$1.setCameraLayers(this.camera, ['DEFAULT', 'Tag3d', 'PANOMARKERS', 'SKYBOX', 'MODEL', 'RETICULE']); // this.camera.position.set(0, 5, 20)
  42075. // this.camera.lookAt(0, 0, 0)
  42076. this.scene = new THREE.Scene();
  42077. this.light = new THREE.AmbientLight(16777215);
  42078. this.scene.add(this.light);
  42079. this.viewports = [new Viewport(this.camera, {
  42080. left: 0,
  42081. bottom: 0,
  42082. width: 1,
  42083. height: 1,
  42084. name: 'main'
  42085. })];
  42086. if (browser$1.urlHasValue('miniDoll')) {
  42087. this.viewports.push(new MiniDollhouse(this.$app.core.get('Player'), this));
  42088. } // 灯光非常耗性能
  42089. // var directionalLight = new THREE.DirectionalLight(0xffffff, 0.3)
  42090. // directionalLight.position.set(0, -1, 0).normalize()
  42091. // this.scene.add(directionalLight)
  42092. // var directionalLight1 = new THREE.DirectionalLight(0xffffff, 0.7)
  42093. // directionalLight1.position.set(-10, 3.5, 0).normalize()
  42094. // this.scene.add(directionalLight1)
  42095. // var directionalLight2 = new THREE.DirectionalLight(0xffffff, 0.7)
  42096. // directionalLight2.position.set(0, 3.5, 10).normalize()
  42097. // this.scene.add(directionalLight2)
  42098. // var directionalLight3 = new THREE.DirectionalLight(0xffffff, 0.7)
  42099. // directionalLight3.position.set(0, 3.5, -10).normalize()
  42100. // this.scene.add(directionalLight3)
  42101. // var directionalLight4 = new THREE.DirectionalLight(0xffffff, 0.7)
  42102. // directionalLight4.position.set(10, 3.5, 0).normalize()
  42103. // this.scene.add(directionalLight4)
  42104. // 照亮entryEntry
  42105. var directionalLight = new THREE.DirectionalLight(0xffffff, 1);
  42106. directionalLight.position.set(1, 10, 1).normalize();
  42107. this.scene.add(directionalLight); // this.scene.skyboxBG = new THREE.Mesh(new THREE.SphereBufferGeometry(2500, 20, 5), skyMat)
  42108. // this.scene.add(this.scene.skyboxBG)
  42109. };
  42110. _this.addComponent = function (e, ifAfterRender) {
  42111. this.components.push(e);
  42112. if (e.update) {
  42113. if (ifAfterRender) this.updateLisAfter.push(e); //add
  42114. else this.updateListeners.push(e);
  42115. }
  42116. if (e.setSize) {
  42117. this.resizeListeners.push(e);
  42118. this.forceUpdateSize = !0;
  42119. }
  42120. };
  42121. _this.removeComponent = function (e) {
  42122. var t = function t(_t) {
  42123. return _t !== e;
  42124. };
  42125. this.components = this.components.filter(t);
  42126. this.updateListeners = this.updateListeners.filter(t);
  42127. this.resizeListeners = this.resizeListeners.filter(t);
  42128. };
  42129. _this.start = function (dom) {
  42130. if (this.started) {
  42131. throw new BasicException$1("Can't start SceneRenderer, already started");
  42132. }
  42133. this.createContext(dom);
  42134. this.initComposer();
  42135. this.started = !0;
  42136. if (this.$app.config.mobile) {
  42137. try {
  42138. VR$1.Init(this, this.$app.core.get('Player'));
  42139. } catch (error) {
  42140. console.error(error);
  42141. }
  42142. }
  42143. (this.animate = this.animate.bind(this))();
  42144. };
  42145. _this.createContext = function (dom) {
  42146. try {
  42147. this.renderer = new THREE.WebGLRenderer({
  42148. antialias: true,
  42149. alpha: true
  42150. }); //set alpha for renderTex
  42151. this.renderer.autoClear = !0;
  42152. this.renderer.setPixelRatio(window.devicePixelRatio ? window.devicePixelRatio : 1);
  42153. this.renderer.setSize(window.innerWidth, window.innerHeight);
  42154. this.renderer.setClearColor('#292929', 1.0);
  42155. this.emit(SceneRendererEvents.ContextCreated);
  42156. } catch (e) {
  42157. throw new RendererCreationException$1('Unable to create a WebGL rendering context');
  42158. } //貌似没用
  42159. //settings.profiling.enabled && this.overrideTextures();
  42160. dom.appendChild(this.renderer.domElement);
  42161. };
  42162. _this.initComposer = function () {
  42163. this.composer = new THREE.EffectComposer(this.renderer);
  42164. this.composer.addPass(new THREE.RenderPass(this.scene, this.camera));
  42165. this.composer.addPass(this.effects.hblurPass);
  42166. this.composer.addPass(this.effects.vblurPass);
  42167. };
  42168. _this.setSize = function (width, height, ratio) {
  42169. this.renderWidth = width;
  42170. this.renderHeight = height;
  42171. this.effects.aspect = width / height;
  42172. this.renderer.setSize(width, height);
  42173. this.composer.setSize(width, height);
  42174. this.renderer.setPixelRatio(ratio);
  42175. this.css3dRenderer && this.css3dRenderer.setSize(width, height);
  42176. for (var i = 0; i < this.resizeListeners.length; i++) {
  42177. this.resizeListeners[i].setSize(width, height);
  42178. }
  42179. this.emit('resize', width, height);
  42180. };
  42181. _this.render = function () {
  42182. var _this2 = this;
  42183. var size = this.renderer.getSize(new THREE.Vector2());
  42184. if (size.x == 0 || size.y == 0) return; //同屏时关闭一个屏
  42185. this.emit('render', this.updateClock2.getDelta());
  42186. var getPX = function getPX(num, whole) {
  42187. num = typeof num == 'number' ? whole * num : parseFloat(num);
  42188. return Math.round(num);
  42189. };
  42190. this.viewports.forEach(function (viewport) {
  42191. _this2.update3dTiles({
  42192. viewport,
  42193. force: _this2.viewports.length > 1
  42194. });
  42195. var left = getPX(viewport.left, _this2.renderWidth);
  42196. var bottom = getPX(viewport.bottom, _this2.renderHeight);
  42197. var width = getPX(viewport.width, _this2.renderWidth);
  42198. var height = getPX(viewport.height, _this2.renderHeight);
  42199. _this2.renderer.setViewport(left, bottom, width, height); //规定视口,影响图形变换(画布的使用范围)
  42200. /* let scissorTest = width < this.renderWidth || height < this.renderHeight
  42201. this.renderer.setScissorTest(scissorTest)
  42202. scissorTest && this.renderer.setScissor(left, bottom, width, height)
  42203. */
  42204. _this2.renderer.autoClear = !viewport.dontClear; // || this.renderer.clear(true, true, true) // 清除颜色、深度、模板缓冲区
  42205. _this2.renderer.clearDepth();
  42206. viewport.beforeRender && viewport.beforeRender();
  42207. _this2.renderer.render(_this2.scene, viewport.camera);
  42208. viewport.afterRender && viewport.afterRender();
  42209. }); //this.effects.currentBlur > 0 ? this.composer.render() : this.renderer.render(this.scene, this.camera)
  42210. if (this.css3dRenderer) {
  42211. this.css3dRenderer.render(this.scene, this.camera);
  42212. }
  42213. };
  42214. _this.updateScreenSize = function () {
  42215. //许钟文改
  42216. //xzw 改 为了截屏 要改canvas大小 以及缩放时不模糊
  42217. var W, H, pixelRatio; //当截屏时有setTimeout 期间不能恢复大小,所以要用W,H记录正常大小
  42218. return function () {
  42219. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  42220. var render = false;
  42221. var ratio;
  42222. var w, h; //记录应当render的大小
  42223. if (o.forceUpdateSize) this.forceUpdateSize = true;
  42224. if (!o.resize && o.width != void 0 && o.height != void 0) {
  42225. w = o.width, h = o.height, render = true, ratio = 1;
  42226. } else {
  42227. w = this.renderer.domElement.parentElement.clientWidth;
  42228. h = this.renderer.domElement.parentElement.clientHeight;
  42229. if (o.resize) {
  42230. W = this.renderWidth;
  42231. H = this.renderHeight; //console.log('updateScreenSize',w,h)
  42232. }
  42233. if (w !== W || h !== H || this.forceUpdateSize || pixelRatio != window.devicePixelRatio) {
  42234. W = w, H = h, render = true;
  42235. pixelRatio = window.devicePixelRatio; //如果player放在小窗口了,也要监测devicePixelRatio,因为缩放时client宽高不会改变
  42236. ratio = window.devicePixelRatio;
  42237. }
  42238. }
  42239. if (render) {
  42240. //console.log('setSize',w,h, ratio)
  42241. this.setSize(w, h, ratio);
  42242. this.forceUpdateSize = !1;
  42243. }
  42244. };
  42245. }();
  42246. _this.updateComponents = function () {
  42247. //注意:transitions一定要放在最开头,计时才会准确
  42248. var delta = this.updateClock.getDelta();
  42249. for (var e = Math.min(1, delta), t = 0; t < this.updateListeners.length; t++) {
  42250. this.updateListeners[t].update(e);
  42251. }
  42252. };
  42253. _this.updateAfterRender = function () {
  42254. //add
  42255. common$1.timeMeasuring.addTimeMark('afterRender', 'start');
  42256. for (var t = 0; t < this.updateLisAfter.length; t++) {
  42257. this.updateLisAfter[t].update();
  42258. }
  42259. common$1.timeMeasuring.addTimeMark('afterRender', 'end');
  42260. };
  42261. _this.suspend = function () {
  42262. this.started = !1, this.suspendedObjects = this.scene.children.map(function (e) {
  42263. return this.scene.remove(e), e;
  42264. }.bind(this)), this.render();
  42265. };
  42266. _this.resume = function () {
  42267. this.suspendedObjects.forEach(function (e) {
  42268. this.scene.add(e);
  42269. }.bind(this));
  42270. this.suspendedObjects = [];
  42271. this.started = !0;
  42272. this.animate();
  42273. };
  42274. _this.animate = function () {
  42275. if (this.started) {
  42276. performance.mark('loop-start'); // 无论有没有reportTimings都要获取,因为getBestCound需要
  42277. //--------------------
  42278. window.requestAnimationFrame(this.animate);
  42279. this.updateScreenSize();
  42280. this.updateComponents(); //this.updateTextureMemory();
  42281. this.render();
  42282. this.updateAfterRender(); //注意:如果每一帧处理太多东西容易崩溃。
  42283. this.emit(SceneRendererEvents.AfterRender); //--------------------
  42284. common$1.timeMeasuring.addTimeMark('loop', 'end');
  42285. common$1.timeMeasuring.report(performance.now());
  42286. }
  42287. };
  42288. _this.getImageData = function () {
  42289. var e = document.createElement('canvas'),
  42290. t = e.getContext('2d');
  42291. return function (i, SceneRenderer, r) {
  42292. 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);
  42293. };
  42294. }();
  42295. _this.initSizedTexture2D = function (size, wrap, i) {
  42296. var renderer = this.renderer,
  42297. ctx = renderer.getContext(),
  42298. glState = renderer.state,
  42299. texture = new THREE.Texture();
  42300. texture.flipY = false;
  42301. texture.wrapS = wrap;
  42302. texture.wrapT = wrap;
  42303. i !== true && (i = false);
  42304. texture.generateMipmaps = i;
  42305. var glFormat = renderer.paramThreeToGL(texture.format),
  42306. glType = renderer.paramThreeToGL(texture.type),
  42307. h = renderer.properties.get(texture),
  42308. glTexture = ctx.createTexture();
  42309. glState.bindTexture(ctx.TEXTURE_2D, glTexture);
  42310. ctx.pixelStorei(ctx.UNPACK_FLIP_Y_WEBGL, texture.flipY);
  42311. ctx.texImage2D(ctx.TEXTURE_2D, 0, glFormat, size, size, 0, glFormat, glType, null);
  42312. var glWrap = renderer.paramThreeToGL(wrap);
  42313. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_S, glWrap);
  42314. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_WRAP_T, glWrap);
  42315. if (i) {
  42316. texture.magFilter = THREE.LinearFilter;
  42317. texture.minFilter = THREE.LinearMipMapLinearFilter;
  42318. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR);
  42319. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR_MIPMAP_NEAREST);
  42320. ctx.generateMipmap(ctx.TEXTURE_2D);
  42321. } else {
  42322. texture.magFilter = THREE.LinearFilter;
  42323. texture.minFilter = THREE.LinearFilter;
  42324. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MAG_FILTER, ctx.LINEAR);
  42325. ctx.texParameteri(ctx.TEXTURE_2D, ctx.TEXTURE_MIN_FILTER, ctx.LINEAR);
  42326. }
  42327. glState.bindTexture(ctx.TEXTURE_2D, null);
  42328. h.__webglTexture = glTexture;
  42329. return texture;
  42330. };
  42331. _this.deallocateCubeTexture = function (e) {
  42332. var t = this.renderer;
  42333. t.getContext();
  42334. t.properties.get(e); //i.deleteTexture(renderer.__image__webglTextureCube) //新版three没有这个耶
  42335. //改成自带的dispose , 虽然未被使用的zoomTarget没有dispose事件
  42336. e.dispose();
  42337. };
  42338. _this.renderToCubeMap = function () {
  42339. var inited = false,
  42340. scene = null,
  42341. material = null,
  42342. geo = null,
  42343. plane = null,
  42344. l = 1,
  42345. cubeCamera = null;
  42346. return function (tex, renderTarget, tileWidth, tileHeight, startXinTile, startYinTile, widthinTile, heightinTile, startX, startY, width, height, cubeFace, E, b, w) {
  42347. var renderer = this.oldRenderer || this.renderer; //不知道为什么vr时一定要用原来的render,否则好像没有autoClear..
  42348. if (!inited) {
  42349. scene = new THREE.Scene();
  42350. cubeCamera = new THREE.CubeCamera(0.1, 1000, renderTarget);
  42351. scene.add(cubeCamera);
  42352. material = new THREE.ShaderMaterial({
  42353. uniforms: {
  42354. map: {
  42355. type: 'scene',
  42356. value: null
  42357. },
  42358. opacity: {
  42359. type: 'startYinTile',
  42360. value: 1
  42361. },
  42362. baseColor: {
  42363. type: 'v3',
  42364. value: new THREE.Color('#fff')
  42365. }
  42366. },
  42367. vertexShader: shaders.basicTextured.vertexShader,
  42368. fragmentShader: shaders.basicTextured.fragmentShader,
  42369. depthWrite: !1,
  42370. depthTest: !1,
  42371. side: THREE.DoubleSide
  42372. });
  42373. geo = new THREE.PlaneGeometry(l, l);
  42374. plane = new THREE.Mesh(geo, material);
  42375. scene.add(plane);
  42376. inited = true;
  42377. } // 必须更新cubeCamera的renderTarget
  42378. cubeCamera.renderTarget = renderTarget;
  42379. var uv = geo.getAttribute('uv');
  42380. uv.setUsage(THREE.DynamicDrawUsage); // .setDynamic(!0)
  42381. uv.needsUpdate = true;
  42382. var uvArr = uv.array,
  42383. S = startXinTile / tileWidth,
  42384. //uv这几个值基本是固定的startXinTile:0,startYinTile:0,widthinTile:512,widthinTile:512,tileWidth:512,tileHeight:512 也就是说uv不会变、每张tile的有效范围是100%
  42385. M = startYinTile / tileHeight,
  42386. R = widthinTile / tileWidth,
  42387. P = heightinTile / tileHeight;
  42388. 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只占据需要绘制的部分。类似拼图。
  42389. //startX startY width height 都是在画布上的大小,比如画布大小为2048*2048,此tile为16分之一,tileX是1,tileY是1,则startX=2048/4,startY=2048/4
  42390. var pos = geo.getAttribute('position');
  42391. pos.setUsage(THREE.DynamicDrawUsage); // .setDynamic(!0)
  42392. pos.needsUpdate = true;
  42393. var posArr = pos.array,
  42394. D = startX / renderTarget.width - l / 2,
  42395. // 起始x
  42396. N = startY / renderTarget.height - l / 2,
  42397. // 起始y
  42398. B = width / renderTarget.width,
  42399. // 宽
  42400. F = height / renderTarget.height // 高
  42401. ;
  42402. 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;
  42403. renderer.properties.get(scene); //this.renderer.properties.get(scene);
  42404. material.uniforms.map.value = tex;
  42405. material.blending = E || THREE.NoBlending, material.transparent = !!b;
  42406. void 0 !== w && null !== w || (w = 1);
  42407. material.uniforms.opacity.value = w;
  42408. material.needUpdate = !0; // cubeFace 0-5 应该是指定渲染h中的面
  42409. if (cubeFace == 0) {
  42410. plane.scale.set(-1, -1, 1);
  42411. plane.position.set(l / 2, 0, 0);
  42412. }
  42413. if (cubeFace == 1) {
  42414. plane.scale.set(-1, -1, 1);
  42415. plane.position.set(l / -2, 0, 0);
  42416. }
  42417. if (cubeFace == 2) {
  42418. // 上
  42419. plane.scale.set(1, 1, 1);
  42420. plane.position.set(0, l / 2, 0);
  42421. }
  42422. if (cubeFace == 3) {
  42423. // 下
  42424. plane.scale.set(1, 1, 1);
  42425. plane.position.set(0, l / -2, 0);
  42426. }
  42427. if (cubeFace == 4) {
  42428. plane.scale.set(-1, -1, 1);
  42429. plane.position.set(0, 0, l / 2);
  42430. }
  42431. if (cubeFace == 5) {
  42432. plane.scale.set(-1, -1, 1);
  42433. plane.position.set(0, 0, l / -2);
  42434. }
  42435. plane.lookAt(cubeCamera.position);
  42436. /* renderer.setScissorTest(!0)
  42437. //指定绘制区域,类似遮罩(相对于屏幕)
  42438. renderer.setScissor(startX,startY,width,height) //加上这个会不会快一些,尤其是spherical
  42439. //指定绘制视口位置和大小(相对于屏幕)
  42440. */
  42441. renderTarget.viewport.set(0, 0, renderTarget.width, renderTarget.height);
  42442. var V = renderer.autoClear;
  42443. renderer.autoClear = !1;
  42444. cubeCamera.update(renderer, scene);
  42445. renderer.autoClear = V; //renderer.setScissorTest(!1)
  42446. /* this.renderer.render(scene, camera, this.planeTargets[cubeFace], !1),//针对有的场景app第一个点图加载不成功的问题
  42447. console.log(`图index ${cubeFace} , ${startX}, ${startY}, ${width}, ${height}`)
  42448. this.targetList[cubeFace] || (this.targetList[cubeFace] = [])
  42449. this.targetList[cubeFace].push([startX,startY,width,height])*/
  42450. };
  42451. }();
  42452. _this.copyCubeMap = function () {
  42453. //将texture渲染到zoomRenderTarget上
  42454. var inited = !1,
  42455. scene = null,
  42456. cubeCamera = null,
  42457. material = null,
  42458. geo = null,
  42459. mesh = null,
  42460. c = new THREE.Euler();
  42461. return function (texture, renderTarget, tWidth, tHeight, rWidth, rHeight, m, v, A) {
  42462. if (!inited) {
  42463. var w = 2;
  42464. scene = new THREE.Scene();
  42465. cubeCamera = new THREE.CubeCamera(0.1, 1000, renderTarget);
  42466. scene.add(cubeCamera);
  42467. material = new THREE.ShaderMaterial({
  42468. uniforms: {
  42469. tDiffuse: {
  42470. type: 't',
  42471. value: null
  42472. },
  42473. alpha: {
  42474. type: 'f',
  42475. value: 1
  42476. }
  42477. },
  42478. vertexShader: shaders.copyCubeMap.vertexShader,
  42479. fragmentShader: shaders.copyCubeMap.fragmentShader,
  42480. depthWrite: !1,
  42481. depthTest: !1,
  42482. side: THREE.DoubleSide
  42483. });
  42484. geo = new THREE.BoxGeometry(w, w, w);
  42485. mesh = new THREE.Mesh(geo, material);
  42486. mesh.scale.set(-1, -1, 1);
  42487. scene.add(mesh);
  42488. inited = !0;
  42489. }
  42490. var renderer = this.oldRenderer || this.renderer; //不知道为什么vr时一定要用原来的render,否则好像没有autoClear..
  42491. // 必须更新cubeCamera的renderTarget
  42492. cubeCamera.renderTarget = renderTarget;
  42493. for (var C = 0; C < 6; C++) {
  42494. this.getCubeOrientationForCubeFace(C, c);
  42495. mesh.rotation.copy(c);
  42496. mesh.matrixWorldNeedsUpdate = !0;
  42497. mesh.updateMatrixWorld();
  42498. material.uniforms.tDiffuse.value = texture;
  42499. material.blending = m || THREE.NoBlending;
  42500. material.transparent = !!v;
  42501. void 0 !== A && null !== A || (A = 1);
  42502. material.uniforms.alpha.value = A;
  42503. material.needUpdate = !0; // (renderTarget.activeCubeFace = C)
  42504. renderTarget.viewport.set(0, 0, rWidth, rHeight); // this.renderer.render(scene, camera, renderTarget, !1)
  42505. var V = renderer.autoClear;
  42506. renderer.autoClear = !1;
  42507. cubeCamera.update(renderer, scene);
  42508. renderer.autoClear = V;
  42509. }
  42510. };
  42511. }();
  42512. _this.getCubeOrientationForCubeFace = function (e, t) {
  42513. switch (e) {
  42514. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_X:
  42515. t.set(0, -Math.PI / 2, 0);
  42516. break;
  42517. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
  42518. t.set(0, Math.PI / 2, 0);
  42519. break;
  42520. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
  42521. t.set(Math.PI / 2, Math.PI, 0);
  42522. break;
  42523. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
  42524. t.set(-Math.PI / 2, Math.PI, 0);
  42525. break;
  42526. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
  42527. t.set(0, -Math.PI, 0);
  42528. break;
  42529. case GLCubeFaces$1.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
  42530. t.set(0, 0, 0);
  42531. }
  42532. };
  42533. _this.index = index$1++;
  42534. _this.scene = null;
  42535. _this.camera = null;
  42536. _this.light = null;
  42537. _this.renderer = null;
  42538. _this.effects = effects$1;
  42539. _this.css3dRenderer = null;
  42540. _this.animateCallback = null;
  42541. _this.composer = null;
  42542. _this.qualityManager = null;
  42543. _this.updateClock = new THREE.Clock();
  42544. _this.updateClock2 = new THREE.Clock();
  42545. _this.components = [];
  42546. _this.updateListeners = [];
  42547. _this.resizeListeners = [];
  42548. _this.updateLisAfter = []; //add
  42549. _this.forceUpdateSize = !1;
  42550. _this.started = !1;
  42551. _this.textures = {};
  42552. _this.suspendedObjects = [];
  42553. _this.vrMode = false;
  42554. _this.autoUpdate3dTiles = false;
  42555. common$1.timeMeasuring.reportTimings = false;
  42556. common$1.timeMeasuring.registerCollect('loop', {
  42557. minCount: 120,
  42558. median: 3,
  42559. refreshTime: 5 * 1000
  42560. }); // iphone13和电脑近似, iphonex很卡差别较大
  42561. //common.timeMeasuring.registerCollect('getMouseIntersect', { minCount: 120, median: 1, refreshTime: 10 * 1000 }) // iphone13和电脑近似, iphonex很卡差别较大
  42562. //写了一个针对多个iframe切换的事件,释放内存防止崩溃(因为iframe不像win页面那样会有unfocusPage的事件,即使隐藏了也会loop)
  42563. window.addEventListener('unfocusPage', function (e) {
  42564. console.log('unfocusPage', document.title);
  42565. _this.suspend();
  42566. _this.$app.core.get('PanoRenderer').disposeIdelTargets();
  42567. });
  42568. window.addEventListener('focusPage', function (e) {
  42569. console.log('focusPage', document.title);
  42570. _this.resume();
  42571. });
  42572. return _this;
  42573. }
  42574. _createClass(SceneRenderer, [{
  42575. key: "setMiniDollDisplay",
  42576. value: function setMiniDollDisplay(show) {
  42577. if (this.viewports.length == 2 == show) return;
  42578. var miniDom = document.querySelector('div[xui_min_map]');
  42579. if (show) {
  42580. miniDom.style.display = '';
  42581. if (!this.miniDollhouse) {
  42582. this.miniDollhouse = new MiniDollhouse(this.$app.core.get('Player'), this, miniDom);
  42583. }
  42584. this.viewports.push(this.miniDollhouse);
  42585. this.miniDollhouse.disable = false;
  42586. this.miniDollhouse.needupdate = true;
  42587. this.miniDollhouse.setClipArea(this.renderWidth, this.renderHeight);
  42588. } else {
  42589. this.viewports.length > 1 && this.viewports.pop();
  42590. this.miniDollhouse.disable = true;
  42591. }
  42592. }
  42593. /* setMiniDollEnable(state) {
  42594. //是否打开三维迷你视角。权重比上面那个高
  42595. this.enableMiniDoll = state
  42596. let miniDom = document.querySelector('div[xui_min_map]')
  42597. let player = this.$app.core.get('Player')
  42598. if (state) {
  42599. let judge = ()=>{
  42600. let show = player.mode == 'panorama'
  42601. miniDom.style.display = show ? '' : 'none'
  42602. this.setMiniDollDisplay(show)
  42603. }
  42604. if (!this.miniEventBinded) {
  42605. player.on('mode.changed', () => {
  42606. if (this.enableMiniDoll) {
  42607. judge()
  42608. }
  42609. })
  42610. this.miniEventBinded = true
  42611. }
  42612. judge()
  42613. } else {
  42614. this.setMiniDollDisplay(false)
  42615. }
  42616. } */
  42617. }, {
  42618. key: "update3dTiles",
  42619. value: function update3dTiles() {
  42620. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  42621. var player = this.$app.core.get('Player');
  42622. var _3dTilesRuntime = player.model._3dTilesRuntime;
  42623. if (_3dTilesRuntime) {
  42624. var deltaTime = this.updateClock2.getDelta(); //判断数量 __sdk.core.get('Player').model._3dTilesRuntime.getTileset().tiles.filter(e=>e._visible)
  42625. if (this.autoUpdate3dTiles || options.force) {
  42626. /**
  42627. * tilesetUpdate需要满足条件:
  42628. * 1. deltaTime累计超过UPDATE_INTERVAL
  42629. * 2. 相机发生变化 lastFrameChanged //xzw 2023.11.27
  42630. * options.force==true时,会忽视上述两点进行更新
  42631. */
  42632. if (player.lastFrameChanged || options.force) {
  42633. var _options$viewport;
  42634. var camera = ((_options$viewport = options.viewport) === null || _options$viewport === void 0 ? void 0 : _options$viewport.camera) || (player.cameraControls.activeControl ? player.cameraControls.activeControl.camera : this.camera);
  42635. _3dTilesRuntime.update(deltaTime, this.renderer, camera, options.force);
  42636. _3dTilesRuntime.stats && _3dTilesRuntime.stats.update();
  42637. }
  42638. }
  42639. if (player.mode !== Viewmode$1.PANORAMA) {
  42640. // 遍历tiles
  42641. _3dTilesRuntime.getTileset().tiles.forEach(function (tile) {
  42642. var tileContent = _3dTilesRuntime.getRenderMap()[tile.id];
  42643. if (tileContent && tileContent.modified !== 'remove') {
  42644. deltaTime = 9999; // 因为需要实时计算可视范围内的tile,所以一旦相机发生变化就要tilesetUpdate
  42645. if (tile.isVisibleAndInRequestVolume || player.mode === Viewmode$1.TRANSITIONING) {
  42646. // 如果tile在可视范围内或相机过渡中,则添加会对应floor
  42647. player.model.floors.get(tile.floorIndex).add(tileContent);
  42648. } else {
  42649. // 如果tile不在可视范围内,就从场景中remove
  42650. tileContent.removeFromParent();
  42651. tileContent.traverse(function (obj) {
  42652. if (obj.isChunk && obj.geometry) {
  42653. obj.geometry.dispose();
  42654. obj.material.dispose();
  42655. obj.material.uniforms.map && obj.material.uniforms.map.value.dispose();
  42656. }
  42657. });
  42658. }
  42659. }
  42660. });
  42661. }
  42662. }
  42663. }
  42664. }, {
  42665. key: "uploadTexture2D",
  42666. value:
  42667. /* uploadTexture2D = function (e, t, i, renderer, r, o) {
  42668. var a = this.renderer,
  42669. s = a.context,
  42670. l = a.state,
  42671. c = a.properties.get(t)
  42672. l.bindTexture(s.TEXTURE_2D, c.__webglTexture)
  42673. s.pixelStorei(s.UNPACK_FLIP_Y_WEBGL, t.flipY)
  42674. s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, t.premultiplyAlpha)
  42675. s.pixelStorei(s.UNPACK_ALIGNMENT, t.unpackAlignment)
  42676. s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_S, a.paramThreeToGL(t.wrapS))
  42677. s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_T, a.paramThreeToGL(t.wrapT))
  42678. s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MAG_FILTER, a.paramThreeToGL(t.magFilter))
  42679. s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MIN_FILTER, a.paramThreeToGL(t.minFilter))
  42680. s.texSubImage2D(s.TEXTURE_2D, 0, i, renderer, s.RGBA, s.UNSIGNED_BYTE, e)
  42681. t.generateMipmaps && s.generateMipmap(s.TEXTURE_2D)
  42682. l.bindTexture(s.TEXTURE_2D, null)
  42683. } */
  42684. function uploadTexture2D(img, tex, startX, startY, width, height) {
  42685. var renderer = this.renderer,
  42686. gl = renderer.getContext(),
  42687. webglState = renderer.state,
  42688. c = renderer.properties.get(tex);
  42689. webglState.bindTexture(gl.TEXTURE_2D, c.__webglTexture);
  42690. gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, tex.flipY);
  42691. gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, tex.premultiplyAlpha);
  42692. gl.pixelStorei(gl.UNPACK_ALIGNMENT, tex.unpackAlignment);
  42693. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, renderer.paramThreeToGL(tex.wrapS));
  42694. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, renderer.paramThreeToGL(tex.wrapT));
  42695. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, renderer.paramThreeToGL(tex.magFilter));
  42696. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, renderer.paramThreeToGL(tex.minFilter));
  42697. gl.texSubImage2D(gl.TEXTURE_2D, 0, startX, startY, gl.RGBA, gl.UNSIGNED_BYTE, img);
  42698. tex.generateMipmaps && gl.generateMipmap(gl.TEXTURE_2D);
  42699. webglState.bindTexture(gl.TEXTURE_2D, null);
  42700. }
  42701. /*
  42702. 注:tileY的方向同UV,从下到上
  42703. renderToCubeMap里的画布or镜头的xy范围是-0.5到0.5
  42704. */
  42705. }, {
  42706. key: "setBg",
  42707. value: function setBg(color, opacity) {
  42708. if (color) {
  42709. this.renderer.setClearColor(color);
  42710. }
  42711. if (opacity != void 0) {
  42712. this.renderer.setClearAlpha(opacity);
  42713. }
  42714. }
  42715. }]);
  42716. return SceneRenderer;
  42717. }(EventEmitter);
  42718. });
  42719. /*
  42720. Copyright (c) 2008, Adobe Systems Incorporated
  42721. All rights reserved.
  42722. Redistribution and use in source and binary forms, with or without
  42723. modification, are permitted provided that the following conditions are
  42724. met:
  42725. * Redistributions of source code must retain the above copyright notice,
  42726. this list of conditions and the following disclaimer.
  42727. * Redistributions in binary form must reproduce the above copyright
  42728. notice, this list of conditions and the following disclaimer in the
  42729. documentation and/or other materials provided with the distribution.
  42730. * Neither the name of Adobe Systems Incorporated nor the names of its
  42731. contributors may be used to endorse or promote products derived from
  42732. this software without specific prior written permission.
  42733. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
  42734. IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  42735. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  42736. PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  42737. CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  42738. EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  42739. PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  42740. PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  42741. LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  42742. NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  42743. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  42744. */
  42745. function JPEGEncoder$1(quality) {
  42746. var ffloor = Math.floor;
  42747. var YTable = new Array(64);
  42748. var UVTable = new Array(64);
  42749. var fdtbl_Y = new Array(64);
  42750. var fdtbl_UV = new Array(64);
  42751. var YDC_HT;
  42752. var UVDC_HT;
  42753. var YAC_HT;
  42754. var UVAC_HT;
  42755. var bitcode = new Array(65535);
  42756. var category = new Array(65535);
  42757. var outputfDCTQuant = new Array(64);
  42758. var DU = new Array(64);
  42759. var byteout = [];
  42760. var bytenew = 0;
  42761. var bytepos = 7;
  42762. var YDU = new Array(64);
  42763. var UDU = new Array(64);
  42764. var VDU = new Array(64);
  42765. var clt = new Array(256);
  42766. var RGB_YUV_TABLE = new Array(2048);
  42767. var currentQuality;
  42768. 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];
  42769. var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0];
  42770. var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
  42771. var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d];
  42772. 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];
  42773. var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0];
  42774. var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
  42775. var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77];
  42776. 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];
  42777. function initQuantTables(sf) {
  42778. 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];
  42779. for (var i = 0; i < 64; i++) {
  42780. var t = ffloor((YQT[i] * sf + 50) / 100);
  42781. if (t < 1) {
  42782. t = 1;
  42783. } else if (t > 255) {
  42784. t = 255;
  42785. }
  42786. YTable[ZigZag[i]] = t;
  42787. }
  42788. 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];
  42789. for (var j = 0; j < 64; j++) {
  42790. var u = ffloor((UVQT[j] * sf + 50) / 100);
  42791. if (u < 1) {
  42792. u = 1;
  42793. } else if (u > 255) {
  42794. u = 255;
  42795. }
  42796. UVTable[ZigZag[j]] = u;
  42797. }
  42798. var aasf = [1.0, 1.387039845, 1.306562965, 1.175875602, 1.0, 0.785694958, 0.5411961, 0.275899379];
  42799. var k = 0;
  42800. for (var row = 0; row < 8; row++) {
  42801. for (var col = 0; col < 8; col++) {
  42802. fdtbl_Y[k] = 1.0 / (YTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0);
  42803. fdtbl_UV[k] = 1.0 / (UVTable[ZigZag[k]] * aasf[row] * aasf[col] * 8.0);
  42804. k++;
  42805. }
  42806. }
  42807. }
  42808. function computeHuffmanTbl(nrcodes, std_table) {
  42809. var codevalue = 0;
  42810. var pos_in_table = 0;
  42811. var HT = new Array();
  42812. for (var k = 1; k <= 16; k++) {
  42813. for (var j = 1; j <= nrcodes[k]; j++) {
  42814. HT[std_table[pos_in_table]] = [];
  42815. HT[std_table[pos_in_table]][0] = codevalue;
  42816. HT[std_table[pos_in_table]][1] = k;
  42817. pos_in_table++;
  42818. codevalue++;
  42819. }
  42820. codevalue *= 2;
  42821. }
  42822. return HT;
  42823. }
  42824. function initHuffmanTbl() {
  42825. YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values);
  42826. UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values);
  42827. YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values);
  42828. UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values);
  42829. }
  42830. function initCategoryNumber() {
  42831. var nrlower = 1;
  42832. var nrupper = 2;
  42833. for (var cat = 1; cat <= 15; cat++) {
  42834. //Positive numbers
  42835. for (var nr = nrlower; nr < nrupper; nr++) {
  42836. category[32767 + nr] = cat;
  42837. bitcode[32767 + nr] = [];
  42838. bitcode[32767 + nr][1] = cat;
  42839. bitcode[32767 + nr][0] = nr;
  42840. } //Negative numbers
  42841. for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) {
  42842. category[32767 + nrneg] = cat;
  42843. bitcode[32767 + nrneg] = [];
  42844. bitcode[32767 + nrneg][1] = cat;
  42845. bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg;
  42846. }
  42847. nrlower <<= 1;
  42848. nrupper <<= 1;
  42849. }
  42850. }
  42851. function initRGBYUVTable() {
  42852. for (var i = 0; i < 256; i++) {
  42853. RGB_YUV_TABLE[i] = 19595 * i;
  42854. RGB_YUV_TABLE[i + 256 >> 0] = 38470 * i;
  42855. RGB_YUV_TABLE[i + 512 >> 0] = 7471 * i + 0x8000;
  42856. RGB_YUV_TABLE[i + 768 >> 0] = -11059 * i;
  42857. RGB_YUV_TABLE[i + 1024 >> 0] = -21709 * i;
  42858. RGB_YUV_TABLE[i + 1280 >> 0] = 32768 * i + 0x807fff;
  42859. RGB_YUV_TABLE[i + 1536 >> 0] = -27439 * i;
  42860. RGB_YUV_TABLE[i + 1792 >> 0] = -5329 * i;
  42861. }
  42862. } // IO functions
  42863. function writeBits(bs) {
  42864. var value = bs[0];
  42865. var posval = bs[1] - 1;
  42866. while (posval >= 0) {
  42867. if (value & 1 << posval) {
  42868. bytenew |= 1 << bytepos;
  42869. }
  42870. posval--;
  42871. bytepos--;
  42872. if (bytepos < 0) {
  42873. if (bytenew == 0xff) {
  42874. writeByte(0xff);
  42875. writeByte(0);
  42876. } else {
  42877. writeByte(bytenew);
  42878. }
  42879. bytepos = 7;
  42880. bytenew = 0;
  42881. }
  42882. }
  42883. }
  42884. function writeByte(value) {
  42885. //byteout.push(clt[value]); // write char directly instead of converting later
  42886. byteout.push(value);
  42887. if (byteout.length === 1) ;
  42888. }
  42889. function writeWord(value) {
  42890. writeByte(value >> 8 & 0xff);
  42891. writeByte(value & 0xff);
  42892. } // DCT & quantization core
  42893. function fDCTQuant(data, fdtbl) {
  42894. var d0, d1, d2, d3, d4, d5, d6, d7;
  42895. /* Pass 1: process rows. */
  42896. var dataOff = 0;
  42897. var i;
  42898. var I8 = 8;
  42899. var I64 = 64;
  42900. for (i = 0; i < I8; ++i) {
  42901. d0 = data[dataOff];
  42902. d1 = data[dataOff + 1];
  42903. d2 = data[dataOff + 2];
  42904. d3 = data[dataOff + 3];
  42905. d4 = data[dataOff + 4];
  42906. d5 = data[dataOff + 5];
  42907. d6 = data[dataOff + 6];
  42908. d7 = data[dataOff + 7];
  42909. var tmp0 = d0 + d7;
  42910. var tmp7 = d0 - d7;
  42911. var tmp1 = d1 + d6;
  42912. var tmp6 = d1 - d6;
  42913. var tmp2 = d2 + d5;
  42914. var tmp5 = d2 - d5;
  42915. var tmp3 = d3 + d4;
  42916. var tmp4 = d3 - d4;
  42917. /* Even part */
  42918. var tmp10 = tmp0 + tmp3;
  42919. /* phase 2 */
  42920. var tmp13 = tmp0 - tmp3;
  42921. var tmp11 = tmp1 + tmp2;
  42922. var tmp12 = tmp1 - tmp2;
  42923. data[dataOff] = tmp10 + tmp11;
  42924. /* phase 3 */
  42925. data[dataOff + 4] = tmp10 - tmp11;
  42926. var z1 = (tmp12 + tmp13) * 0.707106781;
  42927. /* c4 */
  42928. data[dataOff + 2] = tmp13 + z1;
  42929. /* phase 5 */
  42930. data[dataOff + 6] = tmp13 - z1;
  42931. /* Odd part */
  42932. tmp10 = tmp4 + tmp5;
  42933. /* phase 2 */
  42934. tmp11 = tmp5 + tmp6;
  42935. tmp12 = tmp6 + tmp7;
  42936. /* The rotator is modified from fig 4-8 to avoid extra negations. */
  42937. var z5 = (tmp10 - tmp12) * 0.382683433;
  42938. /* c6 */
  42939. var z2 = 0.5411961 * tmp10 + z5;
  42940. /* c2-c6 */
  42941. var z4 = 1.306562965 * tmp12 + z5;
  42942. /* c2+c6 */
  42943. var z3 = tmp11 * 0.707106781;
  42944. /* c4 */
  42945. var z11 = tmp7 + z3;
  42946. /* phase 5 */
  42947. var z13 = tmp7 - z3;
  42948. data[dataOff + 5] = z13 + z2;
  42949. /* phase 6 */
  42950. data[dataOff + 3] = z13 - z2;
  42951. data[dataOff + 1] = z11 + z4;
  42952. data[dataOff + 7] = z11 - z4;
  42953. dataOff += 8;
  42954. /* advance pointer to next row */
  42955. }
  42956. /* Pass 2: process columns. */
  42957. dataOff = 0;
  42958. for (i = 0; i < I8; ++i) {
  42959. d0 = data[dataOff];
  42960. d1 = data[dataOff + 8];
  42961. d2 = data[dataOff + 16];
  42962. d3 = data[dataOff + 24];
  42963. d4 = data[dataOff + 32];
  42964. d5 = data[dataOff + 40];
  42965. d6 = data[dataOff + 48];
  42966. d7 = data[dataOff + 56];
  42967. var tmp0p2 = d0 + d7;
  42968. var tmp7p2 = d0 - d7;
  42969. var tmp1p2 = d1 + d6;
  42970. var tmp6p2 = d1 - d6;
  42971. var tmp2p2 = d2 + d5;
  42972. var tmp5p2 = d2 - d5;
  42973. var tmp3p2 = d3 + d4;
  42974. var tmp4p2 = d3 - d4;
  42975. /* Even part */
  42976. var tmp10p2 = tmp0p2 + tmp3p2;
  42977. /* phase 2 */
  42978. var tmp13p2 = tmp0p2 - tmp3p2;
  42979. var tmp11p2 = tmp1p2 + tmp2p2;
  42980. var tmp12p2 = tmp1p2 - tmp2p2;
  42981. data[dataOff] = tmp10p2 + tmp11p2;
  42982. /* phase 3 */
  42983. data[dataOff + 32] = tmp10p2 - tmp11p2;
  42984. var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781;
  42985. /* c4 */
  42986. data[dataOff + 16] = tmp13p2 + z1p2;
  42987. /* phase 5 */
  42988. data[dataOff + 48] = tmp13p2 - z1p2;
  42989. /* Odd part */
  42990. tmp10p2 = tmp4p2 + tmp5p2;
  42991. /* phase 2 */
  42992. tmp11p2 = tmp5p2 + tmp6p2;
  42993. tmp12p2 = tmp6p2 + tmp7p2;
  42994. /* The rotator is modified from fig 4-8 to avoid extra negations. */
  42995. var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433;
  42996. /* c6 */
  42997. var z2p2 = 0.5411961 * tmp10p2 + z5p2;
  42998. /* c2-c6 */
  42999. var z4p2 = 1.306562965 * tmp12p2 + z5p2;
  43000. /* c2+c6 */
  43001. var z3p2 = tmp11p2 * 0.707106781;
  43002. /* c4 */
  43003. var z11p2 = tmp7p2 + z3p2;
  43004. /* phase 5 */
  43005. var z13p2 = tmp7p2 - z3p2;
  43006. data[dataOff + 40] = z13p2 + z2p2;
  43007. /* phase 6 */
  43008. data[dataOff + 24] = z13p2 - z2p2;
  43009. data[dataOff + 8] = z11p2 + z4p2;
  43010. data[dataOff + 56] = z11p2 - z4p2;
  43011. dataOff++;
  43012. /* advance pointer to next column */
  43013. } // Quantize/descale the coefficients
  43014. var fDCTQuant;
  43015. for (i = 0; i < I64; ++i) {
  43016. // Apply the quantization and scaling factor & Round to nearest integer
  43017. fDCTQuant = data[i] * fdtbl[i];
  43018. outputfDCTQuant[i] = fDCTQuant > 0.0 ? fDCTQuant + 0.5 | 0 : fDCTQuant - 0.5 | 0; //outputfDCTQuant[i] = fround(fDCTQuant);
  43019. }
  43020. return outputfDCTQuant;
  43021. }
  43022. function writeAPP0() {
  43023. writeWord(0xffe0); // marker
  43024. writeWord(16); // length
  43025. writeByte(0x4a); // J
  43026. writeByte(0x46); // F
  43027. writeByte(0x49); // I
  43028. writeByte(0x46); // F
  43029. writeByte(0); // = "JFIF",'\0'
  43030. writeByte(1); // versionhi
  43031. writeByte(1); // versionlo
  43032. writeByte(0); // xyunits
  43033. writeWord(1); // xdensity
  43034. writeWord(1); // ydensity
  43035. writeByte(0); // thumbnwidth
  43036. writeByte(0); // thumbnheight
  43037. }
  43038. function writeSOF0(width, height) {
  43039. writeWord(0xffc0); // marker
  43040. writeWord(17); // length, truecolor YUV JPG
  43041. writeByte(8); // precision
  43042. writeWord(height);
  43043. writeWord(width);
  43044. writeByte(3); // nrofcomponents
  43045. writeByte(1); // IdY
  43046. writeByte(0x11); // HVY
  43047. writeByte(0); // QTY
  43048. writeByte(2); // IdU
  43049. writeByte(0x11); // HVU
  43050. writeByte(1); // QTU
  43051. writeByte(3); // IdV
  43052. writeByte(0x11); // HVV
  43053. writeByte(1); // QTV
  43054. }
  43055. function writeDQT() {
  43056. writeWord(0xffdb); // marker
  43057. writeWord(132); // length
  43058. writeByte(0);
  43059. for (var i = 0; i < 64; i++) {
  43060. writeByte(YTable[i]);
  43061. }
  43062. writeByte(1);
  43063. for (var j = 0; j < 64; j++) {
  43064. writeByte(UVTable[j]);
  43065. }
  43066. }
  43067. function writeDHT() {
  43068. writeWord(0xffc4); // marker
  43069. writeWord(0x01a2); // length
  43070. writeByte(0); // HTYDCinfo
  43071. for (var i = 0; i < 16; i++) {
  43072. writeByte(std_dc_luminance_nrcodes[i + 1]);
  43073. }
  43074. for (var j = 0; j <= 11; j++) {
  43075. writeByte(std_dc_luminance_values[j]);
  43076. }
  43077. writeByte(0x10); // HTYACinfo
  43078. for (var k = 0; k < 16; k++) {
  43079. writeByte(std_ac_luminance_nrcodes[k + 1]);
  43080. }
  43081. for (var l = 0; l <= 161; l++) {
  43082. writeByte(std_ac_luminance_values[l]);
  43083. }
  43084. writeByte(1); // HTUDCinfo
  43085. for (var m = 0; m < 16; m++) {
  43086. writeByte(std_dc_chrominance_nrcodes[m + 1]);
  43087. }
  43088. for (var n = 0; n <= 11; n++) {
  43089. writeByte(std_dc_chrominance_values[n]);
  43090. }
  43091. writeByte(0x11); // HTUACinfo
  43092. for (var o = 0; o < 16; o++) {
  43093. writeByte(std_ac_chrominance_nrcodes[o + 1]);
  43094. }
  43095. for (var p = 0; p <= 161; p++) {
  43096. writeByte(std_ac_chrominance_values[p]);
  43097. }
  43098. }
  43099. function writeSOS() {
  43100. writeWord(0xffda); // marker
  43101. writeWord(12); // length
  43102. writeByte(3); // nrofcomponents
  43103. writeByte(1); // IdY
  43104. writeByte(0); // HTY
  43105. writeByte(2); // IdU
  43106. writeByte(0x11); // HTU
  43107. writeByte(3); // IdV
  43108. writeByte(0x11); // HTV
  43109. writeByte(0); // Ss
  43110. writeByte(0x3f); // Se
  43111. writeByte(0); // Bf
  43112. }
  43113. function processDU(CDU, fdtbl, DC, HTDC, HTAC) {
  43114. var EOB = HTAC[0x00];
  43115. var M16zeroes = HTAC[0xf0];
  43116. var pos;
  43117. var I16 = 16;
  43118. var I63 = 63;
  43119. var I64 = 64;
  43120. var DU_DCT = fDCTQuant(CDU, fdtbl); //ZigZag reorder
  43121. for (var j = 0; j < I64; ++j) {
  43122. DU[ZigZag[j]] = DU_DCT[j];
  43123. }
  43124. var Diff = DU[0] - DC;
  43125. DC = DU[0]; //Encode DC
  43126. if (Diff == 0) {
  43127. writeBits(HTDC[0]); // Diff might be 0
  43128. } else {
  43129. pos = 32767 + Diff;
  43130. writeBits(HTDC[category[pos]]);
  43131. writeBits(bitcode[pos]);
  43132. } //Encode ACs
  43133. var end0pos = 63; // was const... which is crazy
  43134. for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) {} //end0pos = first element in reverse order !=0
  43135. if (end0pos == 0) {
  43136. writeBits(EOB);
  43137. return DC;
  43138. }
  43139. var i = 1;
  43140. var lng;
  43141. while (i <= end0pos) {
  43142. var startpos = i;
  43143. for (; DU[i] == 0 && i <= end0pos; ++i) {}
  43144. var nrzeroes = i - startpos;
  43145. if (nrzeroes >= I16) {
  43146. lng = nrzeroes >> 4;
  43147. for (var nrmarker = 1; nrmarker <= lng; ++nrmarker) {
  43148. writeBits(M16zeroes);
  43149. }
  43150. nrzeroes = nrzeroes & 0xf;
  43151. }
  43152. pos = 32767 + DU[i];
  43153. writeBits(HTAC[(nrzeroes << 4) + category[pos]]);
  43154. writeBits(bitcode[pos]);
  43155. i++;
  43156. }
  43157. if (end0pos != I63) {
  43158. writeBits(EOB);
  43159. }
  43160. return DC;
  43161. }
  43162. function initCharLookupTable() {
  43163. var sfcc = String.fromCharCode;
  43164. for (var i = 0; i < 256; i++) {
  43165. ///// ACHTUNG // 255
  43166. clt[i] = sfcc(i);
  43167. }
  43168. }
  43169. this.encode = function (image, quality // image data object
  43170. ) {
  43171. new Date().getTime();
  43172. if (quality) setQuality(quality); // Initialize bit writer
  43173. byteout = []; //new Array(); //新版QQ浏览器使用new Array()可能得到一个 [empty × 4]……
  43174. bytenew = 0;
  43175. bytepos = 7; // Add JPEG headers
  43176. writeWord(0xffd8); // SOI
  43177. writeAPP0();
  43178. writeDQT();
  43179. writeSOF0(image.width, image.height);
  43180. writeDHT();
  43181. writeSOS(); // Encode 8x8 macroblocks
  43182. var DCY = 0;
  43183. var DCU = 0;
  43184. var DCV = 0;
  43185. bytenew = 0;
  43186. bytepos = 7;
  43187. this.encode.displayName = '_encode_';
  43188. var imageData = image.data;
  43189. var width = image.width;
  43190. var height = image.height;
  43191. var quadWidth = width * 4;
  43192. var x,
  43193. y = 0;
  43194. var r, g, b;
  43195. var start, p, col, row, pos;
  43196. while (y < height) {
  43197. x = 0;
  43198. while (x < quadWidth) {
  43199. start = quadWidth * y + x;
  43200. p = start;
  43201. col = -1;
  43202. row = 0;
  43203. for (pos = 0; pos < 64; pos++) {
  43204. row = pos >> 3; // /8
  43205. col = (pos & 7) * 4; // %8
  43206. p = start + row * quadWidth + col;
  43207. if (y + row >= height) {
  43208. // padding bottom
  43209. p -= quadWidth * (y + 1 + row - height);
  43210. }
  43211. if (x + col >= quadWidth) {
  43212. // padding right
  43213. p -= x + col - quadWidth + 4;
  43214. }
  43215. r = imageData[p++];
  43216. g = imageData[p++];
  43217. b = imageData[p++];
  43218. /* // calculate YUV values dynamically
  43219. YDU[pos]=((( 0.29900)*r+( 0.58700)*g+( 0.11400)*b))-128; //-0x80
  43220. UDU[pos]=(((-0.16874)*r+(-0.33126)*g+( 0.50000)*b));
  43221. VDU[pos]=((( 0.50000)*r+(-0.41869)*g+(-0.08131)*b));
  43222. */
  43223. // use lookup table (slightly faster)
  43224. YDU[pos] = (RGB_YUV_TABLE[r] + RGB_YUV_TABLE[g + 256 >> 0] + RGB_YUV_TABLE[b + 512 >> 0] >> 16) - 128;
  43225. UDU[pos] = (RGB_YUV_TABLE[r + 768 >> 0] + RGB_YUV_TABLE[g + 1024 >> 0] + RGB_YUV_TABLE[b + 1280 >> 0] >> 16) - 128;
  43226. VDU[pos] = (RGB_YUV_TABLE[r + 1280 >> 0] + RGB_YUV_TABLE[g + 1536 >> 0] + RGB_YUV_TABLE[b + 1792 >> 0] >> 16) - 128;
  43227. }
  43228. DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
  43229. DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
  43230. DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
  43231. x += 32;
  43232. }
  43233. y += 8;
  43234. } ////////////////////////////////////////////////////////////////
  43235. // Do the bit alignment of the EOI marker
  43236. if (bytepos >= 0) {
  43237. var fillbits = [];
  43238. fillbits[1] = bytepos + 1;
  43239. fillbits[0] = (1 << bytepos + 1) - 1;
  43240. writeBits(fillbits);
  43241. }
  43242. writeWord(0xffd9); //EOI
  43243. if (typeof module === 'undefined') return new Uint8Array(byteout);
  43244. return Buffer.from(byteout);
  43245. /* var jpegDataUri = 'data:image/jpeg;base64,' + btoa(byteout.join(''));
  43246. byteout = [];
  43247. // benchmarking
  43248. var duration = new Date().getTime() - time_start;
  43249. //console.log('Encoding time: '+ duration + 'ms');
  43250. //
  43251. return jpegDataUri */
  43252. };
  43253. function setQuality(quality) {
  43254. if (quality <= 0) {
  43255. quality = 1;
  43256. }
  43257. if (quality > 100) {
  43258. quality = 100;
  43259. }
  43260. if (currentQuality == quality) return; // don't recalc if unchanged
  43261. var sf = 0;
  43262. if (quality < 50) {
  43263. sf = Math.floor(5000 / quality);
  43264. } else {
  43265. sf = Math.floor(200 - quality * 2);
  43266. }
  43267. initQuantTables(sf);
  43268. currentQuality = quality; //console.log('Quality set to: '+quality +'%');
  43269. }
  43270. function init() {
  43271. var time_start = new Date().getTime();
  43272. if (!quality) quality = 50; // Create tables
  43273. initCharLookupTable();
  43274. initHuffmanTbl();
  43275. initCategoryNumber();
  43276. initRGBYUVTable();
  43277. setQuality(quality);
  43278. new Date().getTime() - time_start; //console.log('Initialization '+ duration + 'ms');
  43279. }
  43280. init();
  43281. } //module.exports = encode;
  43282. function encode$4(imgData, qu) {
  43283. if (typeof qu === 'undefined') qu = 50;
  43284. var encoder = new JPEGEncoder$1(qu);
  43285. var data = encoder.encode(imgData, qu);
  43286. return {
  43287. data: data,
  43288. width: imgData.width,
  43289. height: imgData.height
  43290. };
  43291. } // helper function to get the imageData of an existing image on the current page.
  43292. /* -*- tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
  43293. /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
  43294. /*
  43295. Copyright 2011 notmasteryet
  43296. Licensed under the Apache License, Version 2.0 (the "License");
  43297. you may not use this file except in compliance with the License.
  43298. You may obtain a copy of the License at
  43299. http://www.apache.org/licenses/LICENSE-2.0
  43300. Unless required by applicable law or agreed to in writing, software
  43301. distributed under the License is distributed on an "AS IS" BASIS,
  43302. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  43303. See the License for the specific language governing permissions and
  43304. limitations under the License.
  43305. */
  43306. // - The JPEG specification can be found in the ITU CCITT Recommendation T.81
  43307. // (www.w3.org/Graphics/JPEG/itu-t81.pdf)
  43308. // - The JFIF specification can be found in the JPEG File Interchange Format
  43309. // (www.w3.org/Graphics/JPEG/jfif3.pdf)
  43310. // - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters
  43311. // in PostScript Level 2, Technical Note #5116
  43312. // (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf)
  43313. var JpegImage = function jpegImage() {
  43314. 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]);
  43315. var dctCos1 = 4017; // cos(pi/16)
  43316. var dctSin1 = 799; // sin(pi/16)
  43317. var dctCos3 = 3406; // cos(3*pi/16)
  43318. var dctSin3 = 2276; // sin(3*pi/16)
  43319. var dctCos6 = 1567; // cos(6*pi/16)
  43320. var dctSin6 = 3784; // sin(6*pi/16)
  43321. var dctSqrt2 = 5793; // sqrt(2)
  43322. var dctSqrt1d2 = 2896; // sqrt(2) / 2
  43323. function constructor() {}
  43324. function buildHuffmanTable(codeLengths, values) {
  43325. var k = 0,
  43326. code = [],
  43327. i,
  43328. j,
  43329. length = 16;
  43330. while (length > 0 && !codeLengths[length - 1]) {
  43331. length--;
  43332. }
  43333. code.push({
  43334. children: [],
  43335. index: 0
  43336. });
  43337. var p = code[0],
  43338. q;
  43339. for (i = 0; i < length; i++) {
  43340. for (j = 0; j < codeLengths[i]; j++) {
  43341. p = code.pop();
  43342. p.children[p.index] = values[k];
  43343. while (p.index > 0) {
  43344. if (code.length === 0) throw new Error('Could not recreate Huffman Table');
  43345. p = code.pop();
  43346. }
  43347. p.index++;
  43348. code.push(p);
  43349. while (code.length <= i) {
  43350. code.push(q = {
  43351. children: [],
  43352. index: 0
  43353. });
  43354. p.children[p.index] = q.children;
  43355. p = q;
  43356. }
  43357. k++;
  43358. }
  43359. if (i + 1 < length) {
  43360. // p here points to last code
  43361. code.push(q = {
  43362. children: [],
  43363. index: 0
  43364. });
  43365. p.children[p.index] = q.children;
  43366. p = q;
  43367. }
  43368. }
  43369. return code[0].children;
  43370. }
  43371. function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive) {
  43372. frame.precision;
  43373. frame.samplesPerLine;
  43374. frame.scanLines;
  43375. var mcusPerLine = frame.mcusPerLine;
  43376. var progressive = frame.progressive;
  43377. frame.maxH;
  43378. frame.maxV;
  43379. var startOffset = offset,
  43380. bitsData = 0,
  43381. bitsCount = 0;
  43382. function readBit() {
  43383. if (bitsCount > 0) {
  43384. bitsCount--;
  43385. return bitsData >> bitsCount & 1;
  43386. }
  43387. bitsData = data[offset++];
  43388. if (bitsData == 0xff) {
  43389. var nextByte = data[offset++];
  43390. if (nextByte) {
  43391. throw new Error('unexpected marker: ' + (bitsData << 8 | nextByte).toString(16));
  43392. } // unstuff 0
  43393. }
  43394. bitsCount = 7;
  43395. return bitsData >>> 7;
  43396. }
  43397. function decodeHuffman(tree) {
  43398. var node = tree,
  43399. bit;
  43400. while ((bit = readBit()) !== null) {
  43401. node = node[bit];
  43402. if (typeof node === 'number') return node;
  43403. if (typeof node !== 'object') throw new Error('invalid huffman sequence');
  43404. }
  43405. return null;
  43406. }
  43407. function receive(length) {
  43408. var n = 0;
  43409. while (length > 0) {
  43410. var bit = readBit();
  43411. if (bit === null) return;
  43412. n = n << 1 | bit;
  43413. length--;
  43414. }
  43415. return n;
  43416. }
  43417. function receiveAndExtend(length) {
  43418. var n = receive(length);
  43419. if (n >= 1 << length - 1) return n;
  43420. return n + (-1 << length) + 1;
  43421. }
  43422. function decodeBaseline(component, zz) {
  43423. var t = decodeHuffman(component.huffmanTableDC);
  43424. var diff = t === 0 ? 0 : receiveAndExtend(t);
  43425. zz[0] = component.pred += diff;
  43426. var k = 1;
  43427. while (k < 64) {
  43428. var rs = decodeHuffman(component.huffmanTableAC);
  43429. var s = rs & 15,
  43430. r = rs >> 4;
  43431. if (s === 0) {
  43432. if (r < 15) break;
  43433. k += 16;
  43434. continue;
  43435. }
  43436. k += r;
  43437. var z = dctZigZag[k];
  43438. zz[z] = receiveAndExtend(s);
  43439. k++;
  43440. }
  43441. }
  43442. function decodeDCFirst(component, zz) {
  43443. var t = decodeHuffman(component.huffmanTableDC);
  43444. var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
  43445. zz[0] = component.pred += diff;
  43446. }
  43447. function decodeDCSuccessive(component, zz) {
  43448. zz[0] |= readBit() << successive;
  43449. }
  43450. var eobrun = 0;
  43451. function decodeACFirst(component, zz) {
  43452. if (eobrun > 0) {
  43453. eobrun--;
  43454. return;
  43455. }
  43456. var k = spectralStart,
  43457. e = spectralEnd;
  43458. while (k <= e) {
  43459. var rs = decodeHuffman(component.huffmanTableAC);
  43460. var s = rs & 15,
  43461. r = rs >> 4;
  43462. if (s === 0) {
  43463. if (r < 15) {
  43464. eobrun = receive(r) + (1 << r) - 1;
  43465. break;
  43466. }
  43467. k += 16;
  43468. continue;
  43469. }
  43470. k += r;
  43471. var z = dctZigZag[k];
  43472. zz[z] = receiveAndExtend(s) * (1 << successive);
  43473. k++;
  43474. }
  43475. }
  43476. var successiveACState = 0,
  43477. successiveACNextValue;
  43478. function decodeACSuccessive(component, zz) {
  43479. var k = spectralStart,
  43480. e = spectralEnd,
  43481. r = 0;
  43482. while (k <= e) {
  43483. var z = dctZigZag[k];
  43484. var direction = zz[z] < 0 ? -1 : 1;
  43485. switch (successiveACState) {
  43486. case 0:
  43487. // initial state
  43488. var rs = decodeHuffman(component.huffmanTableAC);
  43489. var s = rs & 15,
  43490. r = rs >> 4;
  43491. if (s === 0) {
  43492. if (r < 15) {
  43493. eobrun = receive(r) + (1 << r);
  43494. successiveACState = 4;
  43495. } else {
  43496. r = 16;
  43497. successiveACState = 1;
  43498. }
  43499. } else {
  43500. if (s !== 1) throw new Error('invalid ACn encoding');
  43501. successiveACNextValue = receiveAndExtend(s);
  43502. successiveACState = r ? 2 : 3;
  43503. }
  43504. continue;
  43505. case 1: // skipping r zero items
  43506. case 2:
  43507. if (zz[z]) zz[z] += (readBit() << successive) * direction;else {
  43508. r--;
  43509. if (r === 0) successiveACState = successiveACState == 2 ? 3 : 0;
  43510. }
  43511. break;
  43512. case 3:
  43513. // set value for a zero item
  43514. if (zz[z]) zz[z] += (readBit() << successive) * direction;else {
  43515. zz[z] = successiveACNextValue << successive;
  43516. successiveACState = 0;
  43517. }
  43518. break;
  43519. case 4:
  43520. // eob
  43521. if (zz[z]) zz[z] += (readBit() << successive) * direction;
  43522. break;
  43523. }
  43524. k++;
  43525. }
  43526. if (successiveACState === 4) {
  43527. eobrun--;
  43528. if (eobrun === 0) successiveACState = 0;
  43529. }
  43530. }
  43531. function decodeMcu(component, decode, mcu, row, col) {
  43532. var mcuRow = mcu / mcusPerLine | 0;
  43533. var mcuCol = mcu % mcusPerLine;
  43534. var blockRow = mcuRow * component.v + row;
  43535. var blockCol = mcuCol * component.h + col;
  43536. decode(component, component.blocks[blockRow][blockCol]);
  43537. }
  43538. function decodeBlock(component, decode, mcu) {
  43539. var blockRow = mcu / component.blocksPerLine | 0;
  43540. var blockCol = mcu % component.blocksPerLine;
  43541. decode(component, component.blocks[blockRow][blockCol]);
  43542. }
  43543. var componentsLength = components.length;
  43544. var component, i, j, k, n;
  43545. var decodeFn;
  43546. if (progressive) {
  43547. if (spectralStart === 0) decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;else decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
  43548. } else {
  43549. decodeFn = decodeBaseline;
  43550. }
  43551. var mcu = 0,
  43552. marker;
  43553. var mcuExpected;
  43554. if (componentsLength == 1) {
  43555. mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
  43556. } else {
  43557. mcuExpected = mcusPerLine * frame.mcusPerColumn;
  43558. }
  43559. if (!resetInterval) resetInterval = mcuExpected;
  43560. var h, v;
  43561. while (mcu < mcuExpected) {
  43562. // reset interval stuff
  43563. for (i = 0; i < componentsLength; i++) {
  43564. components[i].pred = 0;
  43565. }
  43566. eobrun = 0;
  43567. if (componentsLength == 1) {
  43568. component = components[0];
  43569. for (n = 0; n < resetInterval; n++) {
  43570. decodeBlock(component, decodeFn, mcu);
  43571. mcu++;
  43572. }
  43573. } else {
  43574. for (n = 0; n < resetInterval; n++) {
  43575. for (i = 0; i < componentsLength; i++) {
  43576. component = components[i];
  43577. h = component.h;
  43578. v = component.v;
  43579. for (j = 0; j < v; j++) {
  43580. for (k = 0; k < h; k++) {
  43581. decodeMcu(component, decodeFn, mcu, j, k);
  43582. }
  43583. }
  43584. }
  43585. mcu++; // If we've reached our expected MCU's, stop decoding
  43586. if (mcu === mcuExpected) break;
  43587. }
  43588. } // find marker
  43589. bitsCount = 0;
  43590. marker = data[offset] << 8 | data[offset + 1];
  43591. if (marker < 0xff00) {
  43592. throw new Error('marker was not found');
  43593. }
  43594. if (marker >= 0xffd0 && marker <= 0xffd7) {
  43595. // RSTx
  43596. offset += 2;
  43597. } else break;
  43598. }
  43599. return offset - startOffset;
  43600. }
  43601. function buildComponentData(frame, component) {
  43602. var lines = [];
  43603. var blocksPerLine = component.blocksPerLine;
  43604. var blocksPerColumn = component.blocksPerColumn;
  43605. var samplesPerLine = blocksPerLine << 3;
  43606. var R = new Int32Array(64),
  43607. r = new Uint8Array(64); // A port of poppler's IDCT method which in turn is taken from:
  43608. // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
  43609. // "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
  43610. // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
  43611. // 988-991.
  43612. function quantizeAndInverse(zz, dataOut, dataIn) {
  43613. var qt = component.quantizationTable;
  43614. var v0, v1, v2, v3, v4, v5, v6, v7, t;
  43615. var p = dataIn;
  43616. var i; // dequant
  43617. for (i = 0; i < 64; i++) {
  43618. p[i] = zz[i] * qt[i];
  43619. } // inverse DCT on rows
  43620. for (i = 0; i < 8; ++i) {
  43621. var row = 8 * i; // check for all-zero AC coefficients
  43622. 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) {
  43623. t = dctSqrt2 * p[0 + row] + 512 >> 10;
  43624. p[0 + row] = t;
  43625. p[1 + row] = t;
  43626. p[2 + row] = t;
  43627. p[3 + row] = t;
  43628. p[4 + row] = t;
  43629. p[5 + row] = t;
  43630. p[6 + row] = t;
  43631. p[7 + row] = t;
  43632. continue;
  43633. } // stage 4
  43634. v0 = dctSqrt2 * p[0 + row] + 128 >> 8;
  43635. v1 = dctSqrt2 * p[4 + row] + 128 >> 8;
  43636. v2 = p[2 + row];
  43637. v3 = p[6 + row];
  43638. v4 = dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128 >> 8;
  43639. v7 = dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128 >> 8;
  43640. v5 = p[3 + row] << 4;
  43641. v6 = p[5 + row] << 4; // stage 3
  43642. t = v0 - v1 + 1 >> 1;
  43643. v0 = v0 + v1 + 1 >> 1;
  43644. v1 = t;
  43645. t = v2 * dctSin6 + v3 * dctCos6 + 128 >> 8;
  43646. v2 = v2 * dctCos6 - v3 * dctSin6 + 128 >> 8;
  43647. v3 = t;
  43648. t = v4 - v6 + 1 >> 1;
  43649. v4 = v4 + v6 + 1 >> 1;
  43650. v6 = t;
  43651. t = v7 + v5 + 1 >> 1;
  43652. v5 = v7 - v5 + 1 >> 1;
  43653. v7 = t; // stage 2
  43654. t = v0 - v3 + 1 >> 1;
  43655. v0 = v0 + v3 + 1 >> 1;
  43656. v3 = t;
  43657. t = v1 - v2 + 1 >> 1;
  43658. v1 = v1 + v2 + 1 >> 1;
  43659. v2 = t;
  43660. t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
  43661. v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
  43662. v7 = t;
  43663. t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
  43664. v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
  43665. v6 = t; // stage 1
  43666. p[0 + row] = v0 + v7;
  43667. p[7 + row] = v0 - v7;
  43668. p[1 + row] = v1 + v6;
  43669. p[6 + row] = v1 - v6;
  43670. p[2 + row] = v2 + v5;
  43671. p[5 + row] = v2 - v5;
  43672. p[3 + row] = v3 + v4;
  43673. p[4 + row] = v3 - v4;
  43674. } // inverse DCT on columns
  43675. for (i = 0; i < 8; ++i) {
  43676. var col = i; // check for all-zero AC coefficients
  43677. 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) {
  43678. t = dctSqrt2 * dataIn[i + 0] + 8192 >> 14;
  43679. p[0 * 8 + col] = t;
  43680. p[1 * 8 + col] = t;
  43681. p[2 * 8 + col] = t;
  43682. p[3 * 8 + col] = t;
  43683. p[4 * 8 + col] = t;
  43684. p[5 * 8 + col] = t;
  43685. p[6 * 8 + col] = t;
  43686. p[7 * 8 + col] = t;
  43687. continue;
  43688. } // stage 4
  43689. v0 = dctSqrt2 * p[0 * 8 + col] + 2048 >> 12;
  43690. v1 = dctSqrt2 * p[4 * 8 + col] + 2048 >> 12;
  43691. v2 = p[2 * 8 + col];
  43692. v3 = p[6 * 8 + col];
  43693. v4 = dctSqrt1d2 * (p[1 * 8 + col] - p[7 * 8 + col]) + 2048 >> 12;
  43694. v7 = dctSqrt1d2 * (p[1 * 8 + col] + p[7 * 8 + col]) + 2048 >> 12;
  43695. v5 = p[3 * 8 + col];
  43696. v6 = p[5 * 8 + col]; // stage 3
  43697. t = v0 - v1 + 1 >> 1;
  43698. v0 = v0 + v1 + 1 >> 1;
  43699. v1 = t;
  43700. t = v2 * dctSin6 + v3 * dctCos6 + 2048 >> 12;
  43701. v2 = v2 * dctCos6 - v3 * dctSin6 + 2048 >> 12;
  43702. v3 = t;
  43703. t = v4 - v6 + 1 >> 1;
  43704. v4 = v4 + v6 + 1 >> 1;
  43705. v6 = t;
  43706. t = v7 + v5 + 1 >> 1;
  43707. v5 = v7 - v5 + 1 >> 1;
  43708. v7 = t; // stage 2
  43709. t = v0 - v3 + 1 >> 1;
  43710. v0 = v0 + v3 + 1 >> 1;
  43711. v3 = t;
  43712. t = v1 - v2 + 1 >> 1;
  43713. v1 = v1 + v2 + 1 >> 1;
  43714. v2 = t;
  43715. t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
  43716. v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
  43717. v7 = t;
  43718. t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
  43719. v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
  43720. v6 = t; // stage 1
  43721. p[0 * 8 + col] = v0 + v7;
  43722. p[7 * 8 + col] = v0 - v7;
  43723. p[1 * 8 + col] = v1 + v6;
  43724. p[6 * 8 + col] = v1 - v6;
  43725. p[2 * 8 + col] = v2 + v5;
  43726. p[5 * 8 + col] = v2 - v5;
  43727. p[3 * 8 + col] = v3 + v4;
  43728. p[4 * 8 + col] = v3 - v4;
  43729. } // convert to 8-bit integers
  43730. for (i = 0; i < 64; ++i) {
  43731. var sample = 128 + (p[i] + 8 >> 4);
  43732. dataOut[i] = sample < 0 ? 0 : sample > 0xff ? 0xff : sample;
  43733. }
  43734. }
  43735. var i, j;
  43736. for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
  43737. var scanLine = blockRow << 3;
  43738. for (i = 0; i < 8; i++) {
  43739. lines.push(new Uint8Array(samplesPerLine));
  43740. }
  43741. for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
  43742. quantizeAndInverse(component.blocks[blockRow][blockCol], r, R);
  43743. var offset = 0,
  43744. sample = blockCol << 3;
  43745. for (j = 0; j < 8; j++) {
  43746. var line = lines[scanLine + j];
  43747. for (i = 0; i < 8; i++) {
  43748. line[sample + i] = r[offset++];
  43749. }
  43750. }
  43751. }
  43752. }
  43753. return lines;
  43754. }
  43755. function clampTo8bit(a) {
  43756. return a < 0 ? 0 : a > 255 ? 255 : a;
  43757. }
  43758. constructor.prototype = {
  43759. load: function load(path) {
  43760. var xhr = new XMLHttpRequest();
  43761. xhr.open('GET', path, true);
  43762. xhr.responseType = 'arraybuffer';
  43763. xhr.onload = function () {
  43764. // TODO catch parse error
  43765. var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
  43766. this.parse(data);
  43767. if (this.onload) this.onload();
  43768. }.bind(this);
  43769. xhr.send(null);
  43770. },
  43771. parse: function parse(data) {
  43772. var offset = 0;
  43773. data.length;
  43774. function readUint16() {
  43775. var value = data[offset] << 8 | data[offset + 1];
  43776. offset += 2;
  43777. return value;
  43778. }
  43779. function readDataBlock() {
  43780. var length = readUint16();
  43781. var array = data.subarray(offset, offset + length - 2);
  43782. offset += array.length;
  43783. return array;
  43784. }
  43785. function prepareComponents(frame) {
  43786. var maxH = 0,
  43787. maxV = 0;
  43788. var component, componentId;
  43789. for (componentId in frame.components) {
  43790. if (frame.components.hasOwnProperty(componentId)) {
  43791. component = frame.components[componentId];
  43792. if (maxH < component.h) maxH = component.h;
  43793. if (maxV < component.v) maxV = component.v;
  43794. }
  43795. }
  43796. var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH);
  43797. var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV);
  43798. for (componentId in frame.components) {
  43799. if (frame.components.hasOwnProperty(componentId)) {
  43800. component = frame.components[componentId];
  43801. var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH);
  43802. var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV);
  43803. var blocksPerLineForMcu = mcusPerLine * component.h;
  43804. var blocksPerColumnForMcu = mcusPerColumn * component.v;
  43805. var blocks = [];
  43806. for (var i = 0; i < blocksPerColumnForMcu; i++) {
  43807. var row = [];
  43808. for (var j = 0; j < blocksPerLineForMcu; j++) {
  43809. row.push(new Int32Array(64));
  43810. }
  43811. blocks.push(row);
  43812. }
  43813. component.blocksPerLine = blocksPerLine;
  43814. component.blocksPerColumn = blocksPerColumn;
  43815. component.blocks = blocks;
  43816. }
  43817. }
  43818. frame.maxH = maxH;
  43819. frame.maxV = maxV;
  43820. frame.mcusPerLine = mcusPerLine;
  43821. frame.mcusPerColumn = mcusPerColumn;
  43822. }
  43823. var jfif = null;
  43824. var adobe = null;
  43825. var frame, resetInterval;
  43826. var quantizationTables = [],
  43827. frames = [];
  43828. var huffmanTablesAC = [],
  43829. huffmanTablesDC = [];
  43830. var fileMarker = readUint16();
  43831. if (fileMarker != 0xffd8) {
  43832. // SOI (Start of Image)
  43833. throw new Error('SOI not found');
  43834. }
  43835. fileMarker = readUint16();
  43836. while (fileMarker != 0xffd9) {
  43837. // EOI (End of image)
  43838. var i, j;
  43839. switch (fileMarker) {
  43840. case 0xff00:
  43841. break;
  43842. case 0xffe0: // APP0 (Application Specific)
  43843. case 0xffe1: // APP1
  43844. case 0xffe2: // APP2
  43845. case 0xffe3: // APP3
  43846. case 0xffe4: // APP4
  43847. case 0xffe5: // APP5
  43848. case 0xffe6: // APP6
  43849. case 0xffe7: // APP7
  43850. case 0xffe8: // APP8
  43851. case 0xffe9: // APP9
  43852. case 0xffea: // APP10
  43853. case 0xffeb: // APP11
  43854. case 0xffec: // APP12
  43855. case 0xffed: // APP13
  43856. case 0xffee: // APP14
  43857. case 0xffef: // APP15
  43858. case 0xfffe:
  43859. // COM (Comment)
  43860. var appData = readDataBlock();
  43861. if (fileMarker === 0xffe0) {
  43862. if (appData[0] === 0x4a && appData[1] === 0x46 && appData[2] === 0x49 && appData[3] === 0x46 && appData[4] === 0) {
  43863. // 'JFIF\x00'
  43864. jfif = {
  43865. version: {
  43866. major: appData[5],
  43867. minor: appData[6]
  43868. },
  43869. densityUnits: appData[7],
  43870. xDensity: appData[8] << 8 | appData[9],
  43871. yDensity: appData[10] << 8 | appData[11],
  43872. thumbWidth: appData[12],
  43873. thumbHeight: appData[13],
  43874. thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
  43875. };
  43876. }
  43877. } // TODO APP1 - Exif
  43878. if (fileMarker === 0xffee) {
  43879. if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6f && appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) {
  43880. // 'Adobe\x00'
  43881. adobe = {
  43882. version: appData[6],
  43883. flags0: appData[7] << 8 | appData[8],
  43884. flags1: appData[9] << 8 | appData[10],
  43885. transformCode: appData[11]
  43886. };
  43887. }
  43888. }
  43889. break;
  43890. case 0xffdb:
  43891. // DQT (Define Quantization Tables)
  43892. var quantizationTablesLength = readUint16();
  43893. var quantizationTablesEnd = quantizationTablesLength + offset - 2;
  43894. while (offset < quantizationTablesEnd) {
  43895. var quantizationTableSpec = data[offset++];
  43896. var tableData = new Int32Array(64);
  43897. if (quantizationTableSpec >> 4 === 0) {
  43898. // 8 bit values
  43899. for (j = 0; j < 64; j++) {
  43900. var z = dctZigZag[j];
  43901. tableData[z] = data[offset++];
  43902. }
  43903. } else if (quantizationTableSpec >> 4 === 1) {
  43904. //16 bit
  43905. for (j = 0; j < 64; j++) {
  43906. var z = dctZigZag[j];
  43907. tableData[z] = readUint16();
  43908. }
  43909. } else throw new Error('DQT: invalid table spec');
  43910. quantizationTables[quantizationTableSpec & 15] = tableData;
  43911. }
  43912. break;
  43913. case 0xffc0: // SOF0 (Start of Frame, Baseline DCT)
  43914. case 0xffc1: // SOF1 (Start of Frame, Extended DCT)
  43915. case 0xffc2:
  43916. // SOF2 (Start of Frame, Progressive DCT)
  43917. readUint16(); // skip data length
  43918. frame = {};
  43919. frame.extended = fileMarker === 0xffc1;
  43920. frame.progressive = fileMarker === 0xffc2;
  43921. frame.precision = data[offset++];
  43922. frame.scanLines = readUint16();
  43923. frame.samplesPerLine = readUint16();
  43924. frame.components = {};
  43925. frame.componentsOrder = [];
  43926. var componentsCount = data[offset++],
  43927. componentId;
  43928. for (i = 0; i < componentsCount; i++) {
  43929. componentId = data[offset];
  43930. var h = data[offset + 1] >> 4;
  43931. var v = data[offset + 1] & 15;
  43932. var qId = data[offset + 2];
  43933. frame.componentsOrder.push(componentId);
  43934. frame.components[componentId] = {
  43935. h: h,
  43936. v: v,
  43937. quantizationIdx: qId
  43938. };
  43939. offset += 3;
  43940. }
  43941. prepareComponents(frame);
  43942. frames.push(frame);
  43943. break;
  43944. case 0xffc4:
  43945. // DHT (Define Huffman Tables)
  43946. var huffmanLength = readUint16();
  43947. for (i = 2; i < huffmanLength;) {
  43948. var huffmanTableSpec = data[offset++];
  43949. var codeLengths = new Uint8Array(16);
  43950. var codeLengthSum = 0;
  43951. for (j = 0; j < 16; j++, offset++) {
  43952. codeLengthSum += codeLengths[j] = data[offset];
  43953. }
  43954. var huffmanValues = new Uint8Array(codeLengthSum);
  43955. for (j = 0; j < codeLengthSum; j++, offset++) {
  43956. huffmanValues[j] = data[offset];
  43957. }
  43958. i += 17 + codeLengthSum;
  43959. (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
  43960. }
  43961. break;
  43962. case 0xffdd:
  43963. // DRI (Define Restart Interval)
  43964. readUint16(); // skip data length
  43965. resetInterval = readUint16();
  43966. break;
  43967. case 0xffda:
  43968. // SOS (Start of Scan)
  43969. readUint16();
  43970. var selectorsCount = data[offset++];
  43971. var components = [],
  43972. component;
  43973. for (i = 0; i < selectorsCount; i++) {
  43974. component = frame.components[data[offset++]];
  43975. var tableSpec = data[offset++];
  43976. component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
  43977. component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
  43978. components.push(component);
  43979. }
  43980. var spectralStart = data[offset++];
  43981. var spectralEnd = data[offset++];
  43982. var successiveApproximation = data[offset++];
  43983. var processed = decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successiveApproximation >> 4, successiveApproximation & 15);
  43984. offset += processed;
  43985. break;
  43986. case 0xffff:
  43987. // Fill bytes
  43988. if (data[offset] !== 0xff) {
  43989. // Avoid skipping a valid marker.
  43990. offset--;
  43991. }
  43992. break;
  43993. default:
  43994. if (data[offset - 3] == 0xff && data[offset - 2] >= 0xc0 && data[offset - 2] <= 0xfe) {
  43995. // could be incorrect encoding -- last 0xFF byte of the previous
  43996. // block was eaten by the encoder
  43997. offset -= 3;
  43998. break;
  43999. }
  44000. throw new Error('unknown JPEG marker ' + fileMarker.toString(16));
  44001. }
  44002. fileMarker = readUint16();
  44003. }
  44004. if (frames.length != 1) throw new Error('only single frame JPEGs supported'); // set each frame's components quantization table
  44005. for (var i = 0; i < frames.length; i++) {
  44006. var cp = frames[i].components;
  44007. for (var j in cp) {
  44008. cp[j].quantizationTable = quantizationTables[cp[j].quantizationIdx];
  44009. delete cp[j].quantizationIdx;
  44010. }
  44011. }
  44012. this.width = frame.samplesPerLine;
  44013. this.height = frame.scanLines;
  44014. this.jfif = jfif;
  44015. this.adobe = adobe;
  44016. this.components = [];
  44017. for (var i = 0; i < frame.componentsOrder.length; i++) {
  44018. var component = frame.components[frame.componentsOrder[i]];
  44019. this.components.push({
  44020. lines: buildComponentData(frame, component),
  44021. scaleX: component.h / frame.maxH,
  44022. scaleY: component.v / frame.maxV
  44023. });
  44024. }
  44025. },
  44026. getData: function getData(width, height) {
  44027. var scaleX = this.width / width,
  44028. scaleY = this.height / height;
  44029. var component1, component2, component3, component4;
  44030. var component1Line, component2Line, component3Line, component4Line;
  44031. var x, y;
  44032. var offset = 0;
  44033. var Y, Cb, Cr, K, C, M, Ye, R, G, B;
  44034. var colorTransform;
  44035. var dataLength = width * height * this.components.length;
  44036. var data = new Uint8Array(dataLength);
  44037. switch (this.components.length) {
  44038. case 1:
  44039. component1 = this.components[0];
  44040. for (y = 0; y < height; y++) {
  44041. component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
  44042. for (x = 0; x < width; x++) {
  44043. Y = component1Line[0 | x * component1.scaleX * scaleX];
  44044. data[offset++] = Y;
  44045. }
  44046. }
  44047. break;
  44048. case 2:
  44049. // PDF might compress two component data in custom colorspace
  44050. component1 = this.components[0];
  44051. component2 = this.components[1];
  44052. for (y = 0; y < height; y++) {
  44053. component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
  44054. component2Line = component2.lines[0 | y * component2.scaleY * scaleY];
  44055. for (x = 0; x < width; x++) {
  44056. Y = component1Line[0 | x * component1.scaleX * scaleX];
  44057. data[offset++] = Y;
  44058. Y = component2Line[0 | x * component2.scaleX * scaleX];
  44059. data[offset++] = Y;
  44060. }
  44061. }
  44062. break;
  44063. case 3:
  44064. // The default transform for three components is true
  44065. colorTransform = true; // The adobe transform marker overrides any previous setting
  44066. if (this.adobe && this.adobe.transformCode) colorTransform = true;else if (typeof this.colorTransform !== 'undefined') colorTransform = !!this.colorTransform;
  44067. component1 = this.components[0];
  44068. component2 = this.components[1];
  44069. component3 = this.components[2];
  44070. for (y = 0; y < height; y++) {
  44071. component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
  44072. component2Line = component2.lines[0 | y * component2.scaleY * scaleY];
  44073. component3Line = component3.lines[0 | y * component3.scaleY * scaleY];
  44074. for (x = 0; x < width; x++) {
  44075. if (!colorTransform) {
  44076. R = component1Line[0 | x * component1.scaleX * scaleX];
  44077. G = component2Line[0 | x * component2.scaleX * scaleX];
  44078. B = component3Line[0 | x * component3.scaleX * scaleX];
  44079. } else {
  44080. Y = component1Line[0 | x * component1.scaleX * scaleX];
  44081. Cb = component2Line[0 | x * component2.scaleX * scaleX];
  44082. Cr = component3Line[0 | x * component3.scaleX * scaleX];
  44083. R = clampTo8bit(Y + 1.402 * (Cr - 128));
  44084. G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
  44085. B = clampTo8bit(Y + 1.772 * (Cb - 128));
  44086. }
  44087. data[offset++] = R;
  44088. data[offset++] = G;
  44089. data[offset++] = B;
  44090. }
  44091. }
  44092. break;
  44093. case 4:
  44094. if (!this.adobe) throw new Error('Unsupported color mode (4 components)'); // The default transform for four components is false
  44095. colorTransform = false; // The adobe transform marker overrides any previous setting
  44096. if (this.adobe && this.adobe.transformCode) colorTransform = true;else if (typeof this.colorTransform !== 'undefined') colorTransform = !!this.colorTransform;
  44097. component1 = this.components[0];
  44098. component2 = this.components[1];
  44099. component3 = this.components[2];
  44100. component4 = this.components[3];
  44101. for (y = 0; y < height; y++) {
  44102. component1Line = component1.lines[0 | y * component1.scaleY * scaleY];
  44103. component2Line = component2.lines[0 | y * component2.scaleY * scaleY];
  44104. component3Line = component3.lines[0 | y * component3.scaleY * scaleY];
  44105. component4Line = component4.lines[0 | y * component4.scaleY * scaleY];
  44106. for (x = 0; x < width; x++) {
  44107. if (!colorTransform) {
  44108. C = component1Line[0 | x * component1.scaleX * scaleX];
  44109. M = component2Line[0 | x * component2.scaleX * scaleX];
  44110. Ye = component3Line[0 | x * component3.scaleX * scaleX];
  44111. K = component4Line[0 | x * component4.scaleX * scaleX];
  44112. } else {
  44113. Y = component1Line[0 | x * component1.scaleX * scaleX];
  44114. Cb = component2Line[0 | x * component2.scaleX * scaleX];
  44115. Cr = component3Line[0 | x * component3.scaleX * scaleX];
  44116. K = component4Line[0 | x * component4.scaleX * scaleX];
  44117. C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128));
  44118. M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128));
  44119. Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128));
  44120. }
  44121. data[offset++] = 255 - C;
  44122. data[offset++] = 255 - M;
  44123. data[offset++] = 255 - Ye;
  44124. data[offset++] = 255 - K;
  44125. }
  44126. }
  44127. break;
  44128. default:
  44129. throw new Error('Unsupported color mode');
  44130. }
  44131. return data;
  44132. },
  44133. copyToImageData: function copyToImageData(imageData, formatAsRGBA) {
  44134. var width = imageData.width,
  44135. height = imageData.height;
  44136. var imageDataArray = imageData.data;
  44137. var data = this.getData(width, height);
  44138. var i = 0,
  44139. j = 0,
  44140. x,
  44141. y;
  44142. var Y, K, C, M, R, G, B;
  44143. switch (this.components.length) {
  44144. case 1:
  44145. for (y = 0; y < height; y++) {
  44146. for (x = 0; x < width; x++) {
  44147. Y = data[i++];
  44148. imageDataArray[j++] = Y;
  44149. imageDataArray[j++] = Y;
  44150. imageDataArray[j++] = Y;
  44151. if (formatAsRGBA) {
  44152. imageDataArray[j++] = 255;
  44153. }
  44154. }
  44155. }
  44156. break;
  44157. case 3:
  44158. for (y = 0; y < height; y++) {
  44159. for (x = 0; x < width; x++) {
  44160. R = data[i++];
  44161. G = data[i++];
  44162. B = data[i++];
  44163. imageDataArray[j++] = R;
  44164. imageDataArray[j++] = G;
  44165. imageDataArray[j++] = B;
  44166. if (formatAsRGBA) {
  44167. imageDataArray[j++] = 255;
  44168. }
  44169. }
  44170. }
  44171. break;
  44172. case 4:
  44173. for (y = 0; y < height; y++) {
  44174. for (x = 0; x < width; x++) {
  44175. C = data[i++];
  44176. M = data[i++];
  44177. Y = data[i++];
  44178. K = data[i++];
  44179. R = 255 - clampTo8bit(C * (1 - K / 255) + K);
  44180. G = 255 - clampTo8bit(M * (1 - K / 255) + K);
  44181. B = 255 - clampTo8bit(Y * (1 - K / 255) + K);
  44182. imageDataArray[j++] = R;
  44183. imageDataArray[j++] = G;
  44184. imageDataArray[j++] = B;
  44185. if (formatAsRGBA) {
  44186. imageDataArray[j++] = 255;
  44187. }
  44188. }
  44189. }
  44190. break;
  44191. default:
  44192. throw new Error('Unsupported color mode');
  44193. }
  44194. }
  44195. };
  44196. return constructor;
  44197. }();
  44198. function decode$6(jpegData, opts) {
  44199. var defaultOpts = {
  44200. useTArray: false,
  44201. // "undefined" means "Choose whether to transform colors based on the image’s color model."
  44202. colorTransform: undefined,
  44203. formatAsRGBA: true
  44204. };
  44205. if (opts) {
  44206. if (typeof opts === 'object') {
  44207. opts = {
  44208. useTArray: typeof opts.useTArray === 'undefined' ? defaultOpts.useTArray : opts.useTArray,
  44209. colorTransform: typeof opts.colorTransform === 'undefined' ? defaultOpts.colorTransform : opts.colorTransform,
  44210. formatAsRGBA: typeof opts.formatAsRGBA === 'undefined' ? defaultOpts.formatAsRGBA : opts.formatAsRGBA
  44211. };
  44212. } else {
  44213. // backwards compatiblity, before 0.3.5, we only had the useTArray param
  44214. opts = defaultOpts;
  44215. opts.useTArray = true;
  44216. }
  44217. } else {
  44218. opts = defaultOpts;
  44219. }
  44220. var arr = new Uint8Array(jpegData);
  44221. var decoder = new JpegImage();
  44222. decoder.parse(arr);
  44223. decoder.colorTransform = opts.colorTransform;
  44224. var channels = opts.formatAsRGBA ? 4 : 3;
  44225. var bytesNeeded = decoder.width * decoder.height * channels;
  44226. try {
  44227. var image = {
  44228. width: decoder.width,
  44229. height: decoder.height,
  44230. data: opts.useTArray ? new Uint8Array(bytesNeeded) : new Buffer(bytesNeeded)
  44231. };
  44232. } catch (err) {
  44233. if (err instanceof RangeError) {
  44234. throw new Error('Could not allocate enough memory for the image. ' + 'Required: ' + bytesNeeded);
  44235. } else {
  44236. throw err;
  44237. }
  44238. }
  44239. decoder.copyToImageData(image, opts.formatAsRGBA);
  44240. return image;
  44241. }
  44242. var JPEGEncoder = {
  44243. encode: encode$4,
  44244. decode: decode$6
  44245. };
  44246. function n$3(e, t, i) {
  44247. e && (e = e.toLowerCase().trim());
  44248. var n = new I.UP.clone(),
  44249. r = Math.PI / 3,
  44250. o = Math.PI / 2;
  44251. switch (e) {
  44252. case 'left':
  44253. i.copy(t), i.applyAxisAngle(n, o);
  44254. break;
  44255. case 'right':
  44256. i.copy(t), i.applyAxisAngle(n, -o);
  44257. break;
  44258. case 'forwardleft':
  44259. i.copy(t), i.applyAxisAngle(n, r);
  44260. break;
  44261. case 'forwardright':
  44262. i.copy(t), i.applyAxisAngle(n, -r);
  44263. break;
  44264. case 'forward':
  44265. default:
  44266. i.copy(t);
  44267. }
  44268. return i;
  44269. }
  44270. function r$2(e, t) {
  44271. if (e) {
  44272. var i = {
  44273. pano: e,
  44274. lookAtPoint: null,
  44275. duration: null,
  44276. maxDistanceOverride: null,
  44277. skipWarpingCheck: !1
  44278. };
  44279. this.player.flyToPano(i, function () {
  44280. t && t({
  44281. success: !0,
  44282. message: 'Transition complete.'
  44283. });
  44284. });
  44285. } else R.warn('Showcase -> clickPanoObject: Unable to find pano.'), t && t({
  44286. success: !1,
  44287. error: 'Unable to find pano.'
  44288. });
  44289. }
  44290. function o$1(e, t) {
  44291. var i = this.findRankedPano(e, t);
  44292. return i >= 0 ? this.handleToObject[i] : (R.warn('Showcase -> findRankedPanoObject: Unable to find nearby pano.'), null);
  44293. }
  44294. function a$2(e, t) {
  44295. var i = this.findRankedtag(e, t);
  44296. return i >= 0 ? this.handleToObject[i] : (R.warn('Showcase -> findRankedtagObject: Unable to find nearby tag.'), null);
  44297. }
  44298. function s$2(e, t) {
  44299. t.copy(I.FORWARD), e.getDirection(t);
  44300. }
  44301. var myObjects = {
  44302. director: null,
  44303. player: null,
  44304. controls: null,
  44305. sceneRenderer: null,
  44306. model: null,
  44307. //app中会调用
  44308. init: function init(director, controls, player, sceneRenderer) {
  44309. this.director = director;
  44310. this.player = player;
  44311. this.controls = controls;
  44312. this.sceneRenderer = sceneRenderer;
  44313. },
  44314. handleToObject: {},
  44315. objectToHandle: {},
  44316. handleCount: 0,
  44317. onMessageReceive: function onMessageReceive(e) {
  44318. if (e) {
  44319. var t = e.targetFunction,
  44320. i = e.params,
  44321. n = e.onDone;
  44322. t && this[t] && this[t](i, n);
  44323. }
  44324. },
  44325. waitForInit: function waitForInit(e, t) {
  44326. F.then(t.bind({
  44327. success: !0,
  44328. message: 'Init complete.'
  44329. }));
  44330. },
  44331. moveToPano: function (e, t) {
  44332. var i = new THREE.Euler(0, 0, 0, 'YXZ'),
  44333. n = new THREE.Quaternion();
  44334. return function (e, t) {
  44335. var r = e.pano,
  44336. o = e.rotation,
  44337. a = e.transition;
  44338. if (!this.model) return t({
  44339. success: !1,
  44340. error: 'The model has not been loaded yet'
  44341. });
  44342. var s = this.model.panos.get(r);
  44343. if (!s) return t({
  44344. success: !1,
  44345. error: r + ' does not exist in this model'
  44346. });
  44347. if (!o) return t({
  44348. sucess: !1,
  44349. erorr: o + ' is not a valid rotation'
  44350. });
  44351. 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);
  44352. var l = {
  44353. success: !0,
  44354. message: r
  44355. };
  44356. if (a === A.FADEOUT) n.setFromEuler(i), this.player.warpToPano(s, n, null, null, b.BLACK, null, null, t.bind(this, l));else {
  44357. var h, u;
  44358. a === A.INSTANT && (h = 0, u = 0);
  44359. var d = I.FORWARD.clone().applyEuler(i).add(s.position);
  44360. this.player.flyToPano({
  44361. pano: s,
  44362. lookAtPoint: d,
  44363. duration: h,
  44364. aimDuration: u
  44365. }, t.bind(this, l));
  44366. }
  44367. };
  44368. }(),
  44369. moveInDirection: function moveInDirection(e, t) {
  44370. var i = e.direction;
  44371. return 'undefined' == typeof v[i] ? (R.warn('Showcase -> moveInDirection: Cannot move in invalid direction.'), void (t && t({
  44372. success: !1,
  44373. error: 'Invalid direction.'
  44374. }))) : void this.player.flyLocalDirection(I[i].clone()).then(function (e) {
  44375. t(e ? {
  44376. success: !0,
  44377. message: 'moved ' + i
  44378. } : {
  44379. success: !1,
  44380. error: 'Cannot move in direction: ' + i
  44381. });
  44382. });
  44383. },
  44384. getPose: function getPose(e, t) {
  44385. this.player.camera.position, new THREE.Euler().setFromQuaternion(this.player.camera.quaternion, 'YXZ');
  44386. return t({
  44387. success: !0,
  44388. message: B(this.player)
  44389. });
  44390. },
  44391. //截图,我们有用到
  44392. takeScreenShot: function () {
  44393. var camera = new THREE.PerspectiveCamera(),
  44394. webGLRenderTarget = new THREE.WebGLRenderTarget(); //图片分辨率,图片质量,回调函数
  44395. return function (imgInfo, callFunc) {
  44396. if (!imgInfo.resolution) return callFunc({
  44397. success: !1,
  44398. error: 'An invalid resolution was specified'
  44399. });
  44400. if (imgInfo.resolution.width === -1 || imgInfo.resolution.height === -1) {
  44401. var size = this.sceneRenderer.renderer.getSize();
  44402. imgInfo.resolution.width = size.width;
  44403. imgInfo.resolution.height = size.height;
  44404. }
  44405. common$1.setCameraLayers(camera, ['DEFAULT', 'SKYBOX', 'MODEL']); //camera.layers.set(RenderLayers.DEFAULT)
  44406. if (imgInfo.visibleObjects) {
  44407. imgInfo.visibleObjects.showPucks && camera.layers.enable(RenderLayers.PANOMARKERS);
  44408. imgInfo.visibleObjects.showReticule && camera.layers.enable(RenderLayers.RETICULE);
  44409. }
  44410. var width = imgInfo.resolution.width,
  44411. height = imgInfo.resolution.height,
  44412. aspect = width / height;
  44413. 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双面时有效否则是黑色的
  44414. webGLRenderTarget.setSize(width, height), this.sceneRenderer.renderer.setRenderTarget(webGLRenderTarget);
  44415. if (imgInfo.bgOpacity != void 0) {
  44416. imgInfo.bgOpacityOld = this.sceneRenderer.renderer.getClearAlpha();
  44417. this.sceneRenderer.setBg(null, imgInfo.bgOpacity);
  44418. }
  44419. var alpha = this.sceneRenderer.renderer.getClearAlpha();
  44420. this.sceneRenderer.renderer.render(this.sceneRenderer.scene, camera);
  44421. this.sceneRenderer.renderer.setRenderTarget(null);
  44422. if (imgInfo.bgOpacity != void 0) {
  44423. this.sceneRenderer.setBg(null, imgInfo.bgOpacityOld);
  44424. } //var pixelBuffer = new Uint8Array(width * height * 4)
  44425. //this.sceneRenderer.renderer.readRenderTargetPixels(webGLRenderTarget, 0, 0, width, height, pixelBuffer)
  44426. // var c = JPEGEncoder.encode({
  44427. // data: pixelBuffer,
  44428. // width: width,
  44429. // height: height,
  44430. // heading: 180,
  44431. // pitch: 0
  44432. // }, {
  44433. // quality: imgInfo.quality || 75,
  44434. // flipY: !1 //许钟文改 原本是true. 不在这里翻转,因为它翻转后会使顶部像素重复高10像素,底部少了10像素。
  44435. // })
  44436. // , imgBase64Url = "data:image/jpg;base64," + common.uint8ToBase64(c.data);
  44437. //https://github.com/eugeneware/jpeg-js/blob/master/lib/encoder.js
  44438. var usePng = alpha < 1 || imgInfo.png;
  44439. if (usePng) {
  44440. var imgBase64Url = common$1.renderTargetToDataUrl(webGLRenderTarget, webGLRenderTarget.width, webGLRenderTarget.height, this.sceneRenderer.renderer, imgInfo.quality ? imgInfo.quality / 100 : undefined, true);
  44441. } else {
  44442. var pixelBuffer = new Uint8Array(width * height * 4);
  44443. this.sceneRenderer.renderer.readRenderTargetPixels(webGLRenderTarget, 0, 0, width, height, pixelBuffer);
  44444. var rawImageData = JPEGEncoder.encode( //无法透明
  44445. {
  44446. data: pixelBuffer,
  44447. width: width,
  44448. height: height,
  44449. heading: 180,
  44450. pitch: 0
  44451. }, imgInfo.quality);
  44452. var imgBase64Url = 'data:image/jpg;base64,' + common$1.uint8ToBase64(rawImageData.data);
  44453. } //jpg 开头通常是 /9j/
  44454. callFunc({
  44455. success: !0,
  44456. message: imgBase64Url,
  44457. camera: camera
  44458. });
  44459. };
  44460. }(),
  44461. findRankedPano: function (e, t) {
  44462. var i = new THREE.Vector3(),
  44463. r = new THREE.Vector3();
  44464. return function (e, t) {
  44465. s$2(this.player, r), n$3(t, r, i);
  44466. var o = this.player.rankedPanoInDirection(e, i);
  44467. if (o) {
  44468. var a = this.objectToHandle[o.id];
  44469. return a || (this.objectToHandle[o.id] = a = this.handleCount++, this.handleToObject[a] = o), a;
  44470. }
  44471. return R.warn('Showcase -> findRankedPano: Unable to find nearby pano.'), -1;
  44472. };
  44473. }(),
  44474. findRankedtag: function (e, t) {
  44475. var i = new THREE.Vector3(),
  44476. r = new THREE.Vector3();
  44477. return function (e, t) {
  44478. s$2(this.player, r), n$3(t, r, i);
  44479. var o = this.player.rankedtagInDirection(e, i);
  44480. if (o) {
  44481. var a = this.objectToHandle[o.sid];
  44482. return a || (this.objectToHandle[o.sid] = a = this.handleCount++, this.handleToObject[a] = o), a;
  44483. }
  44484. return R.warn('Showcase -> findRankedtag: Unable to find nearby tag.'), -1;
  44485. };
  44486. }(),
  44487. clickNearesttag: function clickNearesttag(e) {
  44488. this.clickRankedtag(0, e);
  44489. },
  44490. clickRankedtag: function clickRankedtag(e, t) {
  44491. var i = a$2.call(this, e, t);
  44492. i && O.call(this, i);
  44493. },
  44494. clickNearestPano: function clickNearestPano(e, t) {
  44495. this.clickRankedPano(0, e, t);
  44496. },
  44497. clickRankedPano: function clickRankedPano(e, t, i) {
  44498. var n = o$1.call(this, e, t);
  44499. n ? r$2.call(this, n, i) : i(null);
  44500. },
  44501. clickPano: function clickPano(e, t) {
  44502. var i = this.handleTable[e];
  44503. i ? r$2.call(this, i, t) : t(null);
  44504. },
  44505. rotateDirection: function () {
  44506. return function (e, t) {
  44507. var i = e.direction,
  44508. n = e.angle;
  44509. if (!P.active) {
  44510. var r = 0,
  44511. o = 0,
  44512. a = 0,
  44513. s = 0;
  44514. if (!n || isNaN(n)) return R.warn('Showcase -> rotateDirection: Invalid rotation angle.'), void (t && t({
  44515. success: !1,
  44516. error: 'Invalid rotation angle.'
  44517. }));
  44518. if (this.player.mode === E.TRANSITIONING) return R.warn('Automation -> rotateDirection: Cannot rotate while transitioning'), void (t && t({
  44519. success: !1,
  44520. error: 'Cannot rotate while transitioning'
  44521. }));
  44522. if (i === v.RIGHT || i === v.LEFT) i === v.RIGHT && (n = -n), r = n > 0 ? -1 : 1, a = n;else {
  44523. if (i !== v.UP && i !== v.DOWN) return R.warn('Showcase -> rotateDirection: Invalid direction for rotation: ' + i), void (t && t({
  44524. success: !1,
  44525. error: 'Invalid direction for rotation.'
  44526. }));
  44527. if (this.player.mode === E.FLOORPLAN) return R.warn('Showcase -> rotateDirection: Cannot rotate ' + i + ' in floorplan mode'), void (t && t({
  44528. success: !1,
  44529. error: 'Cannot rotate ' + i + ' in floorplan mode'
  44530. }));
  44531. 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({
  44532. success: !1,
  44533. error: 'Already at maximum rotation in direction: ' + i
  44534. }));
  44535. o = n > 0 ? 1 : -1, s = n;
  44536. }
  44537. var l = n;
  44538. n = c.Math.degToRad(n), a = c.Math.degToRad(a), s = c.Math.degToRad(s);
  44539. var h = this.controls.activeControl,
  44540. u = function u() {
  44541. h.stopRotating(!0), t && t({
  44542. success: !0,
  44543. message: 'Rotated ' + l.toFixed(2) + '° in direction: ' + e.direction
  44544. });
  44545. };
  44546. h.startRotating(r, o), P.start(a, s, this.player, u);
  44547. }
  44548. };
  44549. }(),
  44550. rotate: function () {
  44551. var e = new THREE.Vector3(),
  44552. t = new THREE.Vector3();
  44553. return function (i, n) {
  44554. var r = i.xAngle,
  44555. o = i.yAngle;
  44556. if (!P.active) {
  44557. if (r = r || 0, o = o || 0, isNaN(r) || isNaN(o)) return R.warn('Showcase -> rotate: Invalid rotation angle.'), void (n && n({
  44558. success: !1,
  44559. error: 'Invalid rotation angle.'
  44560. }));
  44561. if (this.player.mode === E.TRANSITIONING) return R.warn('Automation -> rotate: Cannot rotate while transitioning'), void (n && n({
  44562. success: !1,
  44563. error: 'Cannot rotate while transitioning'
  44564. }));
  44565. Math.abs(r) < 0.01 && (r = 0), Math.abs(o) < 0.01 && (o = 0);
  44566. var a = o;
  44567. o = N.call(this, o), r = -r;
  44568. var s = a > 0 ? 'UP' : 'DOWN';
  44569. if (!r && a && !o) return R.warn('Showcase -> rotate: Already at maximum rotation in direction: ' + s), void (n && n({
  44570. success: !1,
  44571. error: 'Already at maximum rotation in direction: ' + s
  44572. }));
  44573. a > o && R.warn('Showcase -> rotate: Reached maximum rotation in direction: ' + s);
  44574. var l = o;
  44575. 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);
  44576. var h = (e.angleTo(t), r > 0 ? -1 : r < 0 ? 1 : 0),
  44577. u = o > 0 ? 1 : o < 0 ? -1 : 0;
  44578. Math.abs(r) > Math.abs(o) ? u *= Math.abs(o / r) : Math.abs(o) > Math.abs(r) && (h *= Math.abs(r / o));
  44579. var d = this.controls.activeControl,
  44580. p = function p() {
  44581. d.stopRotating(!0), n && n({
  44582. success: !0,
  44583. message: 'Rotated ' + i.xAngle.toFixed(2) + '° horizontally, ' + l.toFixed(2) + '° vertically'
  44584. });
  44585. };
  44586. d.startRotating(h, u), P.start(r, o, this.player, p);
  44587. }
  44588. };
  44589. }(),
  44590. panCamera: function panCamera(e, t) {
  44591. function i(e) {
  44592. switch (r.removeAllListeners(T.AutoPanComplete), r.removeAllListeners(T.AutoPanInterrupt), r.removeAllListeners(T.AutoPanClamped), e) {
  44593. case T.AutoPanInterrupt:
  44594. t({
  44595. success: !0,
  44596. message: 'Camera panning interrupted.'
  44597. });
  44598. break;
  44599. case T.AutoPanClamped:
  44600. if (r.autoPanPosition.x !== n.x || r.autoPanPosition.z !== n.z) {
  44601. 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({
  44602. success: !1,
  44603. error: 'Already at edge of current model bounds.'
  44604. });
  44605. var i = 'The view point is outside the bounds for the current model. ';
  44606. i += 'The view point was clamped to ' + o(r.target.x, r.target.z), console.warn(i);
  44607. }
  44608. case T.AutoPanComplete:
  44609. t({
  44610. success: !0,
  44611. message: 'Panned camera to position ' + o(r.autoPanPosition.x, r.autoPanPosition.z)
  44612. });
  44613. }
  44614. }
  44615. if (this.player.mode !== E.DOLLHOUSE && this.player.mode !== E.FLOORPLAN) return t({
  44616. success: !1,
  44617. error: 'Camera panning is not available in the current mode: ' + this.player.mode
  44618. });
  44619. var n = e.position,
  44620. r = this.player.control;
  44621. r.setAutoPanPosition(n.x, n.z), r.autoPan = !0;
  44622. var o = function o(e, t) {
  44623. return '(' + e.toFixed(2) + ', ' + t.toFixed(2) + ')';
  44624. };
  44625. 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));
  44626. },
  44627. click: function click(e, t) {
  44628. var i = e.x,
  44629. n = e.y,
  44630. r = e.percentage;
  44631. 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);
  44632. },
  44633. mouseOver: function mouseOver(e, t) {
  44634. var i = e.x,
  44635. n = e.y,
  44636. r = e.percentage;
  44637. r === !0 && (i = i / 100 * $('#player').width(), n = n / 100 * $('#player').height()), this.player.handleInputMove(i, n), this.player.updateIntersect();
  44638. },
  44639. moveToMode: function moveToMode(e, t) {
  44640. function i(e) {
  44641. t(e ? {
  44642. success: !1,
  44643. error: 'Failed to load new mode: ' + e
  44644. } : {
  44645. success: !0,
  44646. message: 'Moved to new mode: ' + n
  44647. });
  44648. }
  44649. var n = e.mode;
  44650. n === E.PANORAMA || n === E.DOLLHOUSE || n === E.FLOORPLAN ? this.director.changeMode(n).then(function () {
  44651. i();
  44652. }, function (e) {
  44653. i(e);
  44654. }) : t({
  44655. success: !1,
  44656. error: 'Invalid mode selection'
  44657. });
  44658. }
  44659. };
  44660. var automation = {
  44661. init: function init(e, t, i, n, r) {
  44662. myObjects.init(e, t, i, r);
  44663. },
  44664. //许钟文加:
  44665. takeScreenShot: function takeScreenShot(o, f) {
  44666. myObjects.takeScreenShot(o, f);
  44667. }
  44668. };
  44669. defineComponent('Screenshot', function () {
  44670. var _execute, _recover, _toFish, _unFish;
  44671. return _execute = /*#__PURE__*/_classPrivateFieldKey("execute"), _recover = /*#__PURE__*/_classPrivateFieldKey("recover"), _toFish = /*#__PURE__*/_classPrivateFieldKey("toFish"), _unFish = /*#__PURE__*/_classPrivateFieldKey("unFish"), /*#__PURE__*/function () {
  44672. function Screenshot() {
  44673. _classCallCheck(this, Screenshot);
  44674. Object.defineProperty(this, _execute, {
  44675. value: _execute2
  44676. });
  44677. Object.defineProperty(this, _recover, {
  44678. writable: true,
  44679. value: function value(changeBefore) {
  44680. this.player.reticule.visible = true;
  44681. this.player.model.floorLogos.firstLogo.visible = changeBefore.fL0;
  44682. this.player.model.floorLogos.secondLogo.visible = changeBefore.fL1;
  44683. this.player.path.currentPanoMarker.mesh.visible = true;
  44684. this.player.model.panos.list.forEach(function (pano) {
  44685. pano.isAligned() && (pano.marker.visible = pano.marker.forceHide);
  44686. });
  44687. this.$app.core.get('CameraControls').controls.floorplan.snapshotTopAspect = null;
  44688. if (this.player.mode != Viewmode$1.PANORAMA) {
  44689. if (ModelSide.side === null) {
  44690. //兼容ModelSide
  44691. this.player.model.chunks.forEach(function (chunk) {
  44692. chunk.material.side = THREE.FrontSide;
  44693. });
  44694. }
  44695. var skyboxBG = this.$app.core.get('SceneRenderer').scene.skyboxBG;
  44696. skyboxBG && (skyboxBG.material.side = THREE.BackSide);
  44697. }
  44698. this.player.model.skybox.material.side = THREE.BackSide;
  44699. this.player.OverlayManager.show('all', true);
  44700. if (changeBefore.includes && changeBefore.includes.includes('billboards')) {
  44701. this.player.OverlayManager.decoratePlaneGroup.children.forEach(function (e) {
  44702. return e.show('screenshot');
  44703. });
  44704. } else {
  44705. this.player.OverlayManager.show('all', true);
  44706. }
  44707. this.player.GLTFEditor.show('all', true);
  44708. changeBefore.notHideMonitors || this.player.$app.Camera.monitor.control.showAll();
  44709. }
  44710. });
  44711. Object.defineProperty(this, _toFish, {
  44712. writable: true,
  44713. value: function value(changeBefore) {
  44714. if (!this.player.model.fishSkybox) {
  44715. this.player.model.fishSkybox = new THREE.Mesh(new THREE.SphereGeometry(constants$4.skyRadius, 80, 50), this.player.model.skybox.material);
  44716. this.core.get('SceneRenderer').scene.add(this.player.model.fishSkybox);
  44717. }
  44718. this.player.model.fishSkybox.position.copy(this.player.position);
  44719. this.player.model.fishSkybox.visible = true;
  44720. this.player.model.skybox.visible = false;
  44721. for (var i = 0; i < this.player.model.chunks.length; i++) {
  44722. //场景过小的话可能比fishSkybox还小所以隐藏
  44723. this.player.model.chunks[i].visible = false;
  44724. }
  44725. changeBefore.cameraPosOld = this.player.camera.position.clone();
  44726. this.player.cameraControls.activeControl.fishState = true; //切换到鱼眼镜头
  44727. this.player.cameraControls.activeControl.camera.fov = settings$3.fish.insideFOV;
  44728. this.player.cameraControls.activeControl.target.copy(this.player.position);
  44729. this.player.updateFromControls();
  44730. }
  44731. });
  44732. Object.defineProperty(this, _unFish, {
  44733. writable: true,
  44734. value: function value(changeBefore) {
  44735. if (this.player.mode == Viewmode$1.PANORAMA) {
  44736. this.player.cameraControls.activeControl.camera.position.copy(changeBefore.cameraPosOld);
  44737. this.player.cameraControls.activeControl.fishState = false; //this.player.cameraControls.activeControl.update(0);
  44738. this.player.model.fishSkybox.visible = false;
  44739. this.player.model.skybox.visible = true;
  44740. for (var i = 0; i < this.player.model.chunks.length; i++) {
  44741. this.player.model.chunks[i].visible = true;
  44742. }
  44743. this.player.cameraControls.activeControl.camera.fov = settings$3.insideFOV;
  44744. }
  44745. this.player.updateFromControls();
  44746. }
  44747. });
  44748. }
  44749. _createClass(Screenshot, [{
  44750. key: "capture",
  44751. value: function capture(options) {
  44752. this.player = this.$app.core.get('Player');
  44753. console.log(options);
  44754. if (this.player.flying || this.player.isWarping() || this.player.mode == Viewmode$1.TRANSITIONING) {
  44755. logger$1.warn('you take a screenshot on flying or transitioning mode!!');
  44756. } //之前这么写,改变了当前canvas大小截图:R.updateScreenSize(options);
  44757. var _this$player$getSize = this.player.getSize(),
  44758. clientWidth = _this$player$getSize.clientWidth,
  44759. clientHeight = _this$player$getSize.clientHeight;
  44760. var fL0 = this.player.model.floorLogos.firstLogo.visible;
  44761. var fL1 = this.player.model.floorLogos.secondLogo.visible;
  44762. this.player.model.panos.list.forEach(function (pano) {
  44763. pano.isAligned() && (pano.marker.forceHide = pano.marker.visible, pano.marker.visible = false);
  44764. });
  44765. this.player.reticule.visible = false;
  44766. this.player.model.floorLogos.firstLogo.visible = false;
  44767. this.player.model.floorLogos.secondLogo.visible = false;
  44768. this.player.path.currentPanoMarker.mesh.visible = false; //因为修改了截图时的projection中y的正负,如果side不反向,会黑(可能因为渲染到了背面?)。
  44769. if (this.player.mode != Viewmode$1.PANORAMA) {
  44770. if (ModelSide.side === null) {
  44771. //兼容ModelSide
  44772. this.player.model.chunks.forEach(function (chunk) {
  44773. chunk.material.side = THREE.BackSide;
  44774. });
  44775. } //this.$app.core.get('SceneRenderer').scene.skyboxBG.material.side = THREE.FrontSide
  44776. }
  44777. this.player.model.skybox.material.side = THREE.DoubleSide;
  44778. this.player.GLTFEditor.hide('all');
  44779. options.notHideMonitors || this.player.$app.Camera.monitor.control.hideAll();
  44780. if (options.includes && options.includes.includes('billboards')) {
  44781. // 显示指示牌
  44782. this.player.OverlayManager.decoratePlaneGroup.children.forEach(function (e) {
  44783. return e.hide('screenshot');
  44784. });
  44785. } else {
  44786. this.player.OverlayManager.hide('all');
  44787. }
  44788. if (options.snapshotTopview && this.player.mode == Viewmode$1.FLOORPLAN) {
  44789. this.$app.core.get('CameraControls').controls.floorplan.snapshotTopAspect = clientWidth / clientHeight;
  44790. }
  44791. options.changeBefore = Object.assign({}, options, {
  44792. fL0,
  44793. fL1
  44794. }); // fL0, fL1, notHideTags: options.notHideTags, notHideMonitors: options.notHideMonitors,
  44795. _classPrivateFieldBase(this, _execute)[_execute](options);
  44796. }
  44797. /**
  44798. * 按顺序在当前视角一个个截图
  44799. * @param {*} options
  44800. * @param {*} lastState
  44801. */
  44802. }]);
  44803. return Screenshot;
  44804. }();
  44805. function _execute2(options, lastState) {
  44806. var _this = this;
  44807. var task, state;
  44808. if (options.tasks.unFish && options.tasks.unFish.length) {
  44809. task = options.tasks.unFish.splice(0, 1)[0];
  44810. state = 'unFish';
  44811. } else if (options.tasks.fish && options.tasks.fish.length) {
  44812. task = options.tasks.fish.splice(0, 1)[0];
  44813. state = 'fish';
  44814. } else {
  44815. state = 'finish';
  44816. } //turn state:
  44817. if (lastState == 'unFish' && state == 'fish') {
  44818. //变成鱼眼
  44819. _classPrivateFieldBase(this, _toFish)[_toFish](options.changeBefore);
  44820. } else if (lastState == 'fish' && state == 'finish') {
  44821. //结束鱼眼
  44822. _classPrivateFieldBase(this, _unFish)[_unFish](options.changeBefore);
  44823. _classPrivateFieldBase(this, _recover)[_recover](options.changeBefore);
  44824. } else if (state == 'finish') {
  44825. _classPrivateFieldBase(this, _recover)[_recover](options.changeBefore);
  44826. } else {
  44827. logger$1.info('other state:' + lastState + '|' + state);
  44828. }
  44829. if (state != 'finish') automation.takeScreenShot({
  44830. resolution: {
  44831. width: task.width,
  44832. height: task.height
  44833. },
  44834. bgOpacity: task.bgOpacity,
  44835. quality: options.quality || (settings$3.isSafari ? 50 : 65)
  44836. }, function (d) {
  44837. options.done && options.done(d.message, task.name, d);
  44838. _classPrivateFieldBase(_this, _execute)[_execute](options, state);
  44839. });
  44840. }
  44841. });
  44842. var PathDisplayMode = Object.freeze({
  44843. Show: 0,
  44844. Hide: 1,
  44845. Retain: 2
  44846. });
  44847. var PathDiscardMode = Object.freeze({
  44848. Standard: 0,
  44849. Slow: 1,
  44850. Retain: 2
  44851. });
  44852. 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); }; }
  44853. 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; } }
  44854. defineComponent('Director', function () {
  44855. return /*#__PURE__*/function (_EventEmitter) {
  44856. _inherits(Director, _EventEmitter);
  44857. var _super = _createSuper$S(Director);
  44858. function Director() {
  44859. var _this;
  44860. _classCallCheck(this, Director);
  44861. _this = _super.call(this);
  44862. _this.endlessLoop = settings$3.warp.loop;
  44863. _this.clock = new THREE.Clock(true);
  44864. _this.currentItem = null;
  44865. _this.destinationItem = null;
  44866. _this.tourIsPlaying = false;
  44867. _this.nextFunc = null;
  44868. _this.onTheBus = false;
  44869. _this.reachSource = null;
  44870. _this.interrupted = false;
  44871. _this.nItems = 0;
  44872. _this.currentScript = 0;
  44873. _this.walkingSectionPaused = false;
  44874. _this.C = Object.freeze({
  44875. None: 0,
  44876. Moving: 1,
  44877. Aiming: 2,
  44878. Interlude: 3
  44879. });
  44880. _this.I = Object.freeze({
  44881. Forward: 1,
  44882. NoChange: 0,
  44883. Backwards: -1
  44884. });
  44885. _this.transitionStage = _this.C.None;
  44886. _this.player = _this.$app.core.get('Player');
  44887. return _this;
  44888. }
  44889. _createClass(Director, [{
  44890. key: "init",
  44891. value: function init() {
  44892. this.updateModel();
  44893. this.resetAll();
  44894. this.bindEvents();
  44895. }
  44896. }, {
  44897. key: "resetAll",
  44898. value: function resetAll() {
  44899. this.currentItem = null;
  44900. this.destinationItem = null;
  44901. this.tourIsPlaying = false;
  44902. this.transitionStage = this.C.None;
  44903. this.nextFunc = null;
  44904. this.onTheBus = false;
  44905. this.reachSource = null;
  44906. this.interrupted = false;
  44907. if (this.player.model) {
  44908. switch (this.player.model.switch_scene_type) {
  44909. case 1:
  44910. this.defaultWarpStyle = WarpStyle.BLACK;
  44911. break;
  44912. case 2:
  44913. this.defaultWarpStyle = WarpStyle.WALK;
  44914. break;
  44915. case 3:
  44916. this.defaultWarpStyle = WarpStyle.STD;
  44917. break;
  44918. default:
  44919. this.defaultWarpStyle = WarpStyle.BLACK;
  44920. break;
  44921. }
  44922. } else {
  44923. this.defaultWarpStyle = WarpStyle.BLACK, logger$1.warn('No model yet, choosing "' + this.defaultWarpStyle + '" transitions');
  44924. }
  44925. this.resetSpecialTransition();
  44926. }
  44927. }, {
  44928. key: "updateModel",
  44929. value: function updateModel() {
  44930. this.player.model = this.modelManager.getActiveModel();
  44931. this.nItems = 0;
  44932. }
  44933. }, {
  44934. key: "bindEvents",
  44935. value: function bindEvents() {
  44936. 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));
  44937. }
  44938. }, {
  44939. key: "handleFlyToWarpInterruption",
  44940. value: function handleFlyToWarpInterruption(warpStyle, func) {
  44941. if (warpStyle === WarpStyle.WALK) {
  44942. this.interrupt(BlackoutStyle.NONE), this.pauseWalkingSection(), this.player.fastForwardActivePanoFlight();
  44943. } else if (this.transitionStage === this.C.Interlude) {
  44944. this.interrupt(BlackoutStyle.NONE);
  44945. func && func();
  44946. }
  44947. }
  44948. }, {
  44949. key: "handlePlayerMove",
  44950. value: function handlePlayerMove(t) {
  44951. this.transitionStage === this.C.Interlude && this.interrupt(BlackoutStyle.NONE);
  44952. }
  44953. }, {
  44954. key: "handlePlayerPanoChosen",
  44955. value: function handlePlayerPanoChosen(e, t) {
  44956. this.intermediateState() || e.id === t.id || (this.onTheBus = !1, this.emit('update.controls'));
  44957. }
  44958. }, {
  44959. key: "handlePlayerModeChanged",
  44960. value: function handlePlayerModeChanged(e, t) {
  44961. this.intermediateState() || e === t || (this.onTheBus = !1, this.emit('update.controls'));
  44962. }
  44963. }, {
  44964. key: "handlePlayerInputStart",
  44965. value: function handlePlayerInputStart(e) {
  44966. this.transitionStage === this.C.Interlude && this.interrupt(BlackoutStyle.NONE);
  44967. }
  44968. }, {
  44969. key: "handlePlayerFlyingStarted",
  44970. value: function handlePlayerFlyingStarted() {
  44971. this.clearWalkingSectionPaused();
  44972. }
  44973. }, {
  44974. key: "describe",
  44975. value: function describe() {
  44976. return {
  44977. nItems: this.nItems,
  44978. currentItem: this.currentItem,
  44979. destinationItem: this.destinationItem,
  44980. tourIsPlaying: this.tourIsPlaying,
  44981. onTheBus: this.onTheBus,
  44982. endlessLoop: this.endlessLoop,
  44983. viewMode: this.player.mode,
  44984. inTransition: this._inTransition(),
  44985. transitionStage: this.transitionStage,
  44986. tourInProgress: this.tourInProgress
  44987. };
  44988. }
  44989. }, {
  44990. key: "_inTransition",
  44991. value: function _inTransition() {
  44992. return this.player.flying || this.player.isWarping() || this.player.isWaitingToWarp() || this.player.mode === Viewmode.TRANSITIONING || this.tourIsPlaying;
  44993. }
  44994. }, {
  44995. key: "bounceable",
  44996. value: function bounceable() {
  44997. var e = this.clock.getDelta();
  44998. return this.isInterrupted() || e < 0.9 && e > 0.01 || this.player.flying && !this.player.isWarping();
  44999. }
  45000. }, {
  45001. key: "currentMoveDirection",
  45002. value: function currentMoveDirection() {
  45003. 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;
  45004. }
  45005. }, {
  45006. key: "clearPath",
  45007. value: function clearPath() {
  45008. this._inTransition() || this.player.path.discardPathObject();
  45009. }
  45010. }, {
  45011. key: "allFloors",
  45012. value: function allFloors() {
  45013. /* var t = this.player.controls[this.player.mode];
  45014. t && t.emit("move", "gui"),
  45015. this.player.controls[ViewMode.PANORAMA].emit(ControlEvents.InteractionGui, "floor-control"),*/
  45016. this.player.model.toggleAllFloors();
  45017. }
  45018. }, {
  45019. key: "actionComplete",
  45020. value: function actionComplete(t) {
  45021. var state = this.transitionStage;
  45022. 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');
  45023. if (this.currentScript && (this.player.model.enableTagMovie && state === this.C.Interlude || this.player.model.enableTagMovie && state === this.C.Aiming && this.nextFunc === null)) {
  45024. this.openTag();
  45025. } else {
  45026. if (this.nextFunc) {
  45027. var e = this.nextFunc;
  45028. this.nextFunc = null;
  45029. e();
  45030. }
  45031. }
  45032. }
  45033. }, {
  45034. key: "awaitCompletion",
  45035. value: function awaitCompletion(e, t) {
  45036. this.nextFunc = t;
  45037. e();
  45038. }
  45039. }, {
  45040. key: "updateSuccessFunction",
  45041. value: function updateSuccessFunction(e) {
  45042. this.nextFunc = e;
  45043. }
  45044. }, {
  45045. key: "interrupt",
  45046. value: function interrupt(e, t) {
  45047. if (!this.wouldInterrupt()) {
  45048. return false;
  45049. }
  45050. this.tourIsPlaying && (this.player.zoomEnabled = this.wasZoomEnabled);
  45051. this.tourIsPlaying = !1;
  45052. this.interrupted = !0;
  45053. this.nextFunc = null;
  45054. this.emit(DirectorEvents.ActionInterrupted);
  45055. null !== e && void 0 !== e || (e = BlackoutStyle.BEGINNING);
  45056. this.player.interruptAndFastForward(e, t);
  45057. return true;
  45058. }
  45059. }, {
  45060. key: "wouldInterrupt",
  45061. value: function wouldInterrupt() {
  45062. return this.transitionStage !== this.C.None;
  45063. }
  45064. }, {
  45065. key: "intermediateState",
  45066. value: function intermediateState() {
  45067. return this.transitionStage !== this.C.None;
  45068. }
  45069. }, {
  45070. key: "isInterrupted",
  45071. value: function isInterrupted() {
  45072. return this.interrupted;
  45073. }
  45074. }, {
  45075. key: "pauseWalkingSection",
  45076. value: function pauseWalkingSection() {
  45077. this.walkingSectionPaused = !0;
  45078. }
  45079. }, {
  45080. key: "clearWalkingSectionPaused",
  45081. value: function clearWalkingSectionPaused() {
  45082. this.walkingSectionPaused = !1;
  45083. }
  45084. }, {
  45085. key: "autoTour",
  45086. value: function autoTour() {
  45087. if (!settings$3.nestscenes || !settings$3.nestscenes.scenes || !settings$3.nestscenes.scenes.length || settings$3.nestscenes.scenes[0].script) return;
  45088. if (settings$3.basic.menu.scene_autoplay) {
  45089. settings$3.warp.auto = 0;
  45090. $('#play').removeClass('play').addClass('pause');
  45091. G.playing = true;
  45092. $('.gui-floor').hide();
  45093. $('.rightbar').hide();
  45094. $('#userlogo').hide();
  45095. $('#page-view').hide();
  45096. $('#back-url').hide();
  45097. $('.indoordir, .indoorscale').hide();
  45098. $('#virgule, #barrageShow, #barrageCon').hide();
  45099. }
  45100. settings$3.warp.auto >= 0 && transitions.trigger({
  45101. duration: 1e3 * Math.min(300, settings$3.warp.auto),
  45102. done: function () {
  45103. this.playTour();
  45104. }.bind(this),
  45105. name: '_atr'
  45106. });
  45107. }
  45108. }, {
  45109. key: "atDestinationPano",
  45110. value: function atDestinationPano() {
  45111. if (!this.player.currentPano || null === this.destinationItem) return false;
  45112. var t = this.player.currentPano.id;
  45113. if (void 0 === t) return false;
  45114. var e = this.player.model.heroLocations;
  45115. return null !== this.destinationItem && void 0 !== e[this.destinationItem] && t == e[this.destinationItem].panoId;
  45116. }
  45117. }, {
  45118. key: "redirectToItem",
  45119. value: function redirectToItem(t, e) {
  45120. if (null === t || void 0 === t) return void logger$1.warn('Director.redirectToItem() -> Redirecting to null item.');
  45121. if (!this.wouldInterrupt()) return void logger$1.warn('Director.redirectToItem() -> Director cannot redirect if there is nothing to interrupt.');
  45122. if (this.player.mode === Viewmode$1.TRANSITIONING) return void logger$1.debug('Director.redirectToItem() -> Cannot redirect while transitioning.');
  45123. logger$1.debug('Director.redirectToItem() -> Redirecting to ' + t + ' via ' + e);
  45124. var i = function () {
  45125. transitions.setTimeout(function () {
  45126. this.setDestinationItem(t), logger$1.info('from redirectToItem'), this.goToDestination(true, BlackoutStyle.BEGINNING, settings$3.warp.warpInterruptionRedirectTime, false);
  45127. }.bind(this), 0);
  45128. }.bind(this);
  45129. this.interrupt(BlackoutStyle.END, 0), this.updateSuccessFunction(i);
  45130. }
  45131. }, {
  45132. key: "useSpecialTransition",
  45133. value: function useSpecialTransition(t) {
  45134. void 0 !== t && this.defaultWarpStyle !== WarpStyle.BLACK && logger$1.debug('useSpecialTransition(): ' + t), this.nextWarpStyle = this.defaultWarpStyle;
  45135. }
  45136. }, {
  45137. key: "resetSpecialTransition",
  45138. value: function resetSpecialTransition() {
  45139. this.nextWarpStyle = this.defaultWarpStyle;
  45140. }
  45141. }, {
  45142. key: "arrivedAtDestination",
  45143. value: function arrivedAtDestination(e) {
  45144. if (this.player.flying || this.player.isWarping()) logger$1.warn('Cannot advance to interlude or aiming while player is flying or warping.');else {
  45145. this.transitionStage = this.C.Aiming;
  45146. var t = this.tourIsPlaying ? this.tourInterlude.bind(this, this.nextItem(this.currentItem)) : null;
  45147. this.player.model.fadePanoMarkers(0), this.awaitCompletion(function () {
  45148. this.resetSpecialTransition(), e ? this.player.aimTourCamera(this.destinationItem, PathDisplayMode.Retain, PathDisplayMode.Slow, this.actionComplete.bind(this)) : this.actionComplete();
  45149. }.bind(this), t);
  45150. }
  45151. if (!this.play.control.canPlay) {
  45152. this.play.control.canPlay = true;
  45153. }
  45154. if (this.play.control.wait && this.play.control.isPlaying) {
  45155. this.record.updateFragmentUI(this.play.control.currentIndex);
  45156. this.play.control.wait = false;
  45157. }
  45158. }
  45159. }, {
  45160. key: "toast",
  45161. value: function toast(msg) {
  45162. setTimeout(function () {
  45163. document.getElementsByClassName('toast-wrap')[0].getElementsByClassName('toast-msg')[0].innerHTML = msg;
  45164. var toastTag = document.getElementsByClassName('toast-wrap')[0];
  45165. toastTag.className = toastTag.className.replace('toastAnimate', '');
  45166. setTimeout(function () {
  45167. toastTag.className = toastTag.className + ' toastAnimate';
  45168. }, 10);
  45169. }, 10);
  45170. }
  45171. }, {
  45172. key: "tour360view",
  45173. value: function tour360view() {
  45174. //360显示toast
  45175. if (this.player.currentPano && this.player.currentPano.alignmentType === 2) {
  45176. var language = this.player.model.language;
  45177. this.toast(language.watchPr); // settings.basic.menu.compass_enable && $(".indoordir, .indoorscale").fadeOut(300);
  45178. } else if ($('#play').hasClass('play')) ;
  45179. }
  45180. }, {
  45181. key: "goToDestination",
  45182. value: function goToDestination(e, t, i, n) {
  45183. this.destinationItem = objects.play.control.currentIndex;
  45184. if (this.onTheBus = !0, this.emit('update.controls'), !n && this.atDestinationPano()) return void this.arrivedAtDestination(!0);
  45185. if (this.player.flying || this.player.isWarping()) logger$1.warn('Cannot go to new destination while player is flying or warping.');else {
  45186. var r = this.player.model.getHeroDescriptorByIndex(this.destinationItem),
  45187. o = null,
  45188. a = null;
  45189. if (r.pano != null && typeof r.pano != 'undefined') {
  45190. var s = 0 === this.destinationItem || e ? WarpStyle.BLACK : this.nextWarpStyle;
  45191. 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);
  45192. } else a = this.player.warpToNonPanoByHeroIndex.bind(this.player, this.destinationItem, this.actionComplete.bind(this)), o = this.arrivedAtDestination.bind(this, !1);
  45193. this.transitionStage = this.C.Moving, this.player.model.fadePanoMarkers(0, null, {
  45194. hideVideoFlag: true
  45195. }), this.awaitCompletion(function () {
  45196. a();
  45197. }.bind(this), o), this.emit('update.controls');
  45198. }
  45199. }
  45200. }, {
  45201. key: "tourInterlude",
  45202. value: function tourInterlude() {
  45203. // if (h.trackAlways("reach_highlight", {
  45204. // reach_source: this.reachSource
  45205. // }),
  45206. this.player.model.fadePanoMarkers(0);
  45207. this.emit('update.controls');
  45208. 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 () {
  45209. this.transitionStage = this.C.Interlude, this.player.tourInterlude(this.nextItem(this.currentItem), this.actionComplete.bind(this));
  45210. }.bind(this), this.goNext.bind(this));
  45211. }
  45212. }, {
  45213. key: "playTour",
  45214. value: function playTour() {
  45215. 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()));
  45216. }
  45217. }, {
  45218. key: "hideTourBar",
  45219. value: function hideTourBar() {
  45220. if (browser.isMobile()) {
  45221. $('.btn-cat-play').removeClass('cat-mob-pause').addClass('cat-mob-play');
  45222. } else {
  45223. $('.btn-cat-play').removeClass('cat-pc-pause').addClass('cat-pc-play');
  45224. }
  45225. $('#gui').show();
  45226. }
  45227. }, {
  45228. key: "stopTour",
  45229. value: function stopTour() {
  45230. 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'));
  45231. }
  45232. }, {
  45233. key: "endTourProgress",
  45234. value: function endTourProgress() {
  45235. this.tourInProgress = !1, this.emit('update.controls'), this.emit(DirectorEvents.TourEnd);
  45236. }
  45237. }, {
  45238. key: "goToHighlight",
  45239. value: function goToHighlight(t) {
  45240. this.clearWalkingSectionPaused();
  45241. this.destinationItem = t;
  45242. this.useSpecialTransition('Hilight');
  45243. this.goToDestination();
  45244. }
  45245. }, {
  45246. key: "goToHighlightByLocation",
  45247. value: function goToHighlightByLocation(location) {
  45248. function getLocation(item) {
  45249. if (item.panoId && item.panoId == location) {
  45250. return true;
  45251. } else {
  45252. return false;
  45253. }
  45254. }
  45255. var index = this.player.model.heroLocations.findIndex(getLocation); //if (this.canInterrupt() || !this.wouldInterrupt()) {
  45256. if (!this.wouldInterrupt()) {
  45257. if (logger$1.debug('<tour.goto ' + index + '>'), this.wouldInterrupt() && (index === this.destinationItem ? this.interrupt() : this.redirectToItem(index, 'goToHighlight')), this.isInterrupted()) return;
  45258. this.clearWalkingSectionPaused(), this.setDestinationItem(index), this.useSpecialTransition('Hilight'), this.goToDestination(); // analytics.trackAlways("USER", {
  45259. // event_type: "reach_highlight",
  45260. // reach_source: "thumb"
  45261. // })
  45262. }
  45263. }
  45264. }, {
  45265. key: "prevHighlight",
  45266. value: function prevHighlight() {
  45267. this.bounceable() || (this.player.emit('tour_manual', 'prev'), this.interrupt(BlackoutStyle.BEGINNING) || this.isInterrupted() || (this.clearWalkingSectionPaused(), this.reachSource = 'prev', this.goPrev()));
  45268. }
  45269. }, {
  45270. key: "nextHighlight",
  45271. value: function nextHighlight() {
  45272. this.bounceable() || (this.player.emit('tour_manual', 'next'), this.interrupt(BlackoutStyle.BEGINNING) || this.isInterrupted() || (this.clearWalkingSectionPaused(), this.reachSource = 'next', this.goNext()));
  45273. }
  45274. }, {
  45275. key: "changeMode",
  45276. value: function changeMode(t, e) {
  45277. var i = e || 'gui';
  45278. switch (this.wouldInterrupt() && this.interrupt(), this.player.controls[t].emit('interaction.' + i), this.clearWalkingSectionPaused(), t) {
  45279. case Viewmode$1.PANORAMA:
  45280. this.player.insideMode();
  45281. break;
  45282. case Viewmode$1.DOLLHOUSE:
  45283. case Viewmode$1.FLOORPLAN:
  45284. this.player.flyToNewMode({
  45285. mode: t
  45286. });
  45287. }
  45288. }
  45289. }, {
  45290. key: "atEndOfTour",
  45291. value: function atEndOfTour() {
  45292. var t = this.currentItem >= this.nItems - 1;
  45293. return t;
  45294. }
  45295. }, {
  45296. key: "firstDestination",
  45297. value: function firstDestination() {
  45298. if (this.nItems <= 0) {
  45299. return null;
  45300. }
  45301. for (var i = 0; i < this.nItems; i++) {
  45302. if (this.player.model.images['list'][i].script === this.currentScript) {
  45303. return i;
  45304. }
  45305. }
  45306. return 0;
  45307. }
  45308. }, {
  45309. key: "finalDestination",
  45310. value: function finalDestination() {
  45311. if (this.nItems <= 0) return null;
  45312. for (var i = this.nItems - 1; i >= 0; i--) {
  45313. if (this.player.model.images['list'][i].script === this.currentScript) {
  45314. return i;
  45315. }
  45316. }
  45317. return 0;
  45318. }
  45319. }, {
  45320. key: "goPrev",
  45321. value: function goPrev() {
  45322. this.tourAdvance(-1);
  45323. }
  45324. }, {
  45325. key: "goNext",
  45326. value: function goNext() {
  45327. this.tourAdvance(1);
  45328. }
  45329. }, {
  45330. key: "setDestinationItem",
  45331. value: function setDestinationItem(t) {
  45332. if (t > this.nItems) {
  45333. t = this.firstDestination();
  45334. }
  45335. this.destinationItem = t;
  45336. this.emit('update.controls');
  45337. }
  45338. }, {
  45339. key: "setCurrentItem",
  45340. value: function setCurrentItem(t) {
  45341. this.currentItem = t, this.emit('update.controls');
  45342. }
  45343. }, {
  45344. key: "nextItem",
  45345. value: function nextItem(t) {
  45346. return null === t ? this.firstDestination() : t >= this.nItems - 1 ? this.endlessLoop ? this.firstDestination() : null : t + 1;
  45347. }
  45348. }, {
  45349. key: "prevItem",
  45350. value: function prevItem(t) {
  45351. return null === t ? this.firstDestination() : t < 0 ? this.endlessLoop ? this.lastDestination() : null : t - 1;
  45352. }
  45353. }, {
  45354. key: "tourAdvance",
  45355. value: function tourAdvance(t) {
  45356. logger$1.debug('tourAdvance(' + t + ')');
  45357. null === this.currentItem || void 0 === this.currentItem ? this.setDestinationItem(this.firstDestination()) : this.setDestinationItem(this.currentItem + t);
  45358. 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'));
  45359. this.goToDestination();
  45360. }
  45361. }]);
  45362. return Director;
  45363. }(EventEmitter);
  45364. });
  45365. /*
  45366. 热点markSpot的拖拽定位
  45367. */
  45368. var MoveCtrl = function MoveCtrl(o) {
  45369. this.elem = o.elem;
  45370. this.domParent = o.domParent;
  45371. this.elem.addEventListener('mousedown', this.beginMove.bind(this));
  45372. this.elem.addEventListener('touchstart', this.beginMove.bind(this));
  45373. this.elem.addEventListener('pointerdown', this.beginMove.bind(this)); //this.elem.on('pointerdown mousedown touchstart', this.beginMove.bind(this))
  45374. document.addEventListener('mousedown', this.move.bind(this));
  45375. document.addEventListener('touchmove', this.move.bind(this));
  45376. document.addEventListener('pointermove', this.move.bind(this)); //$(document).on('pointermove mousemove touchmove', this.move.bind(this))
  45377. {
  45378. //A screen(edit player屏幕的侦听难加上所以直接写在controls里吧 )
  45379. o.cameraControls.on('pointerUp', this.moveDone.bind(this)); //B screen
  45380. document.addEventListener('pointerup', this.moveDone.bind(this));
  45381. document.addEventListener('mouseup', this.moveDone.bind(this));
  45382. document.addEventListener('touchend', this.moveDone.bind(this));
  45383. document.addEventListener('touchcancel', this.moveDone.bind(this)); //$(document).on('pointerup mouseup touchend touchcancel', this.moveDone.bind(this))
  45384. }
  45385. this.beginMoveFuc = o.beginMoveFuc;
  45386. this.moveDoneFuc = o.moveDoneFuc;
  45387. this.hasBound = o.hasBound;
  45388. this.useTransform = o.useTransform; //为true时适用于页面resize时,elem不需要
  45389. if (o.hasBound) {
  45390. this.needGetBound = 1;
  45391. window.addEventListener('resize', function () {
  45392. this.needGetBound = 1;
  45393. }.bind(this));
  45394. }
  45395. this.recover();
  45396. };
  45397. MoveCtrl.prototype.beginMove = function (e) {
  45398. //每次begin
  45399. e.preventDefault(); //防止页面滑动
  45400. e.stopPropagation();
  45401. if (this.hasBound) this.getMoveBound();
  45402. if (this.moving) return;
  45403. e = e.originalEvent || e;
  45404. var isTouch = e.type.indexOf('touch') > -1; //console.log(isTouch)
  45405. this.moving = true;
  45406. if (this.useTransform) {
  45407. //‘translate(55.5556px, 71.1111px)’
  45408. var transform = this.elem.style.transform;
  45409. var x, y;
  45410. if (!transform) {
  45411. x = y = 0;
  45412. } else {
  45413. var a1 = transform.indexOf('(');
  45414. var a2 = transform.indexOf(')');
  45415. transform = transform.slice(a1 + 1, a2).split(',');
  45416. x = parseFloat(transform[0]);
  45417. y = parseFloat(transform[1]);
  45418. }
  45419. this.dragInfo = {
  45420. startElem: {
  45421. x,
  45422. y
  45423. },
  45424. endElem: {
  45425. x,
  45426. y
  45427. }
  45428. };
  45429. } else {
  45430. this.dragInfo = {
  45431. startElem: {
  45432. x: parseFloat(this.elem[0].style.left),
  45433. y: parseFloat(this.elem[0].style.top)
  45434. }
  45435. /* ,
  45436. endElem: {
  45437. x: 0,
  45438. y: 0
  45439. } */
  45440. };
  45441. }
  45442. this.dragInfo.startMouse = {
  45443. x: isTouch ? e.changedTouches[0].clientX : e.clientX,
  45444. y: isTouch ? e.changedTouches[0].clientY : e.clientY
  45445. };
  45446. if (this.beginMoveFuc) this.beginMoveFuc(); //console.log('beginMove')
  45447. //if(this.controlEvent)this.dealMoveCallBack();
  45448. };
  45449. MoveCtrl.prototype.move = function (e) {
  45450. //位移
  45451. if (!this.moving) return;
  45452. e = e.originalEvent || e;
  45453. var isTouch = e.type.indexOf('touch') > -1; //console.log(isTouch)
  45454. var x = isTouch ? e.changedTouches[0].clientX : e.clientX;
  45455. var y = isTouch ? e.changedTouches[0].clientY : e.clientY;
  45456. this.dragInfo.vector = {
  45457. //位移
  45458. x: x - this.dragInfo.startMouse.x,
  45459. y: y - this.dragInfo.startMouse.y
  45460. };
  45461. this.dragInfo.endElem = {
  45462. x: this.dragInfo.startElem.x + this.dragInfo.vector.x,
  45463. y: this.dragInfo.startElem.y + this.dragInfo.vector.y
  45464. }; //console.log(this.dragInfo.endElem)
  45465. //限制移动范围
  45466. if (this.hasBound) {
  45467. this.dragInfo.endElem.x = Math.max(this.bound.left, this.dragInfo.endElem.x);
  45468. this.dragInfo.endElem.x = Math.min(this.bound.right, this.dragInfo.endElem.x);
  45469. this.dragInfo.endElem.y = Math.max(this.bound.top, this.dragInfo.endElem.y);
  45470. this.dragInfo.endElem.y = Math.min(this.bound.bottom, this.dragInfo.endElem.y);
  45471. }
  45472. if (this.useTransform) {
  45473. this.elem.style.transform = 'translate(' + this.dragInfo.endElem.x + 'px,' + this.dragInfo.endElem.y + 'px)';
  45474. } else {
  45475. this.elem.style.left = this.dragInfo.endElem.x + 'px';
  45476. this.elem.style.top = this.dragInfo.endElem.y + 'px';
  45477. }
  45478. };
  45479. MoveCtrl.prototype.moveDone = function (e) {
  45480. if (!this.moving) return;
  45481. this.getMoveBound();
  45482. this.moving = false;
  45483. this.move(e);
  45484. if (this.moveDoneFuc) this.moveDoneFuc(this.reportPos()); //最后一次刷新一下位置
  45485. this.dragInfo.startElem = this.dragInfo.endElem;
  45486. this.dragInfo.vector = {
  45487. x: 0,
  45488. y: 0
  45489. }; //console.log('moveDone')
  45490. };
  45491. MoveCtrl.prototype.getMoveBound = function () {
  45492. //限制移动范围
  45493. if (!this.needGetBound) return;
  45494. var width = isMobile ? 68 : 100;
  45495. var height = isMobile ? 32 : 60; //this.$elem[0].scrollHeight; //scrollHeight没用的
  45496. var w = ($('#player').width() - width) / 2;
  45497. if (isMobile) {
  45498. this.bound = {
  45499. left: -w,
  45500. right: w,
  45501. top: -($('#player').height() / 2 - $('header')[0].offsetTop - $('header').height() - height / 2),
  45502. bottom: $('#player').height() / 2 - $('footer').height() - height / 2
  45503. };
  45504. } else {
  45505. this.bound = {
  45506. left: -w,
  45507. right: w,
  45508. top: -($('#player').height() / 2 - 50 - height / 2),
  45509. bottom: $('#player').height() / 2 - height / 2
  45510. };
  45511. }
  45512. console.log(this.bound);
  45513. this.needGetBound = 0;
  45514. };
  45515. MoveCtrl.prototype.reportPos = function () {
  45516. //输出创建热点所需要的平面上的坐标
  45517. return {
  45518. x: this.dragInfo.endElem.x + this.domParent.clientWidth / 2,
  45519. y: this.dragInfo.endElem.y + this.domParent.clientHeight / 2
  45520. };
  45521. }; //外部调用----------
  45522. MoveCtrl.prototype.recover = function () {
  45523. //恢复到初始状态
  45524. this.dragInfo = {
  45525. startElem: {
  45526. x: 0,
  45527. y: 0
  45528. },
  45529. endElem: {
  45530. x: 0,
  45531. y: 0
  45532. }
  45533. };
  45534. if (this.useTransform) {
  45535. this.elem.style.transform = '';
  45536. } else {
  45537. this.elem.style.left = 0;
  45538. this.elem.style.top = 0;
  45539. }
  45540. };
  45541. 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); }; }
  45542. 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; } }
  45543. var Label2D = /*#__PURE__*/function (_EventEmitter) {
  45544. _inherits(Label2D, _EventEmitter);
  45545. var _super = _createSuper$R(Label2D);
  45546. function Label2D() {
  45547. var _this;
  45548. var info = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  45549. var player = arguments.length > 1 ? arguments[1] : undefined;
  45550. _classCallCheck(this, Label2D);
  45551. _this = _super.call(this);
  45552. if (info.pos3d) {
  45553. _this.pos3d = new THREE.Vector3().copy(info.pos3d);
  45554. }
  45555. if (info.pos2d) {
  45556. _this.pos2d = new THREE.Vector2().copy(info.pos2d);
  45557. _this.setElemPos();
  45558. }
  45559. _this.name = info.name;
  45560. _this.elem = info.elem;
  45561. _this.camera = info.camera;
  45562. _this.domParent = info.domParent;
  45563. _this.player = player;
  45564. _this.useTransform = info.useTransform;
  45565. _this.mayShelter = info.mayShelter;
  45566. return _this;
  45567. }
  45568. _createClass(Label2D, [{
  45569. key: "update",
  45570. value: function update() {
  45571. /* if(objects.player.mode !== 'dollhouse' || !this.enable || !this.text
  45572. || objects.model.currentFloor.floorIndex != this.floorIndex && !objects.model.allFloorsVisible
  45573. || config.isEdit && (objects.mainDesign && objects.mainDesign.editing || objects.player.EditOverlay && objects.player.EditOverlay.editing||
  45574. objects.player.linkEditor && (objects.player.linkEditor.setPanoVisible || objects.player.linkEditor.setTagVisible)
  45575. )
  45576. ){
  45577. this.elem.css('display','none'); return;
  45578. } */
  45579. if (!this.pos3d || this.dragging) return; //console.log(this.name, this.camera.matrixWorldInverse.elements, this.camera.projectionMatrix.elements)
  45580. var p = convertTool.getPos2d(this.pos3d, this.player, this.camera, this.domParent);
  45581. if (!p.trueSide) {
  45582. this.elem.style.display = 'none';
  45583. return;
  45584. } //判断label是否被模型遮挡,遮挡则消失
  45585. if (this.mayShelter && convertTool.ifShelter(this.pos3d, this.player, {
  45586. x: p.vector.x,
  45587. y: p.vector.y
  45588. }, this.camera
  45589. /* , objects.model.allFloorsVisible ? null : this.floorIndex */
  45590. )) {
  45591. this.elem.style.display = 'none';
  45592. return;
  45593. }
  45594. this.elem.style.display = 'block'; //先显示,driftDir才能计算位置
  45595. if (this.driftDir) {
  45596. //针对入户门标识。 label位置相对position向外偏移一段(driftDir为箭头方向),保证label的外沿相对position距离spaceDis个像素,这样看上去就会贴近箭头且距离稳定。
  45597. var driftPoint = convertTool.getPos2d(this.pos3d.clone().add(this.driftDir)); //先将label置于position的位置,然后求从箭头开始到position的这条射线在label的rect中的二维交点(向外的那个交点)
  45598. var rect = this.elem[0].children[0].getBoundingClientRect();
  45599. var crossPos2d = math$2.getCrossPointAtRect(driftPoint.pos, p.pos, rect.width, rect.height, p.pos.x - rect.width / 2, p.pos.y - rect.height / 2);
  45600. var driftVec = crossPos2d.sub(p.pos.clone()); //得到二维偏移方向
  45601. var dis = this.pos3d.distanceTo(this.camera.position);
  45602. var spaceDis = 100 / dis; //边距(距离position) 为了防止离远时看起来似乎较远,除以一下相机距离
  45603. //将label的二维位置向外偏移 长度为label的中心到label边缘(crossPos2d)的距离 外加一小段spaceDis
  45604. this.pos2d = p.pos.clone().add(driftVec.multiplyScalar((spaceDis + driftVec.length()) / driftVec.length()));
  45605. } else {
  45606. this.pos2d = new THREE.Vector2().copy(p.vector);
  45607. }
  45608. this.setElemPos();
  45609. }
  45610. }, {
  45611. key: "setElemPos",
  45612. value: function setElemPos() {
  45613. if (this.useTransform) {
  45614. var transformX = this.pos2d.x / 2 * this.domParent.clientWidth;
  45615. var transformY = -this.pos2d.y / 2 * this.domParent.clientHeight;
  45616. this.elem.style.transform = 'translate(' + Math.round(transformX) + 'px,' + Math.round(transformY) + 'px)';
  45617. } else {
  45618. this.elem.style.left = this.pos2d.x + 'px', this.elem.style.top = this.pos2d.y + 'px';
  45619. }
  45620. }
  45621. }]);
  45622. return Label2D;
  45623. }(EventEmitter);
  45624. 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); }; }
  45625. 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; } }
  45626. var player$g;
  45627. var isMobile$2;
  45628. var playerB$1,
  45629. markBmoveCtrl,
  45630. lastMouseB = new THREE.Vector2();
  45631. var MatchDataGetWrong = {};
  45632. var MatchData = {};
  45633. var insideLookLimitDownOld, insideLookLimitUpOld;
  45634. function mousedownB(e) {
  45635. //editSpot.playerBmousedown = true
  45636. lastMouseB = getMouseB(e);
  45637. /* if (config.isEdit && editor.mainDesign.floorExamingStep == 2) { //模型地面高度
  45638. if (editor.mainDesign.hoverPull) {
  45639. editor.mainDesign.dragLineBegin(editSpot);
  45640. }
  45641. return;
  45642. } */
  45643. }
  45644. function getMouseB(e) {
  45645. e = e.originalEvent || e;
  45646. var isTouch = e.type.indexOf('touch') > -1;
  45647. var x = isTouch ? e.changedTouches[0].clientX : e.offsetX;
  45648. var y = isTouch ? isMobile$2 ? e.changedTouches[0].clientY - player$g.domElement.clientHeight : e.changedTouches[0].clientY : e.offsetY; //手机的上下分屏有点麻烦。电脑触屏使用的后者没有测过
  45649. return {
  45650. x: x,
  45651. y: y
  45652. };
  45653. }
  45654. function getPoint(dir, panoB) {
  45655. //获取B的click dir是经过matrix变换的方向,要变成没有变换的点击点
  45656. var dir = dir.clone();
  45657. var matrixWorld = panoB.matrixWorld.clone();
  45658. matrixWorld.invert(); //求逆矩阵
  45659. dir = math$2.crossRight(dir, matrixWorld); //dir右乘逆矩阵 得无matrix转化的向量O’B
  45660. //console.log('B的dir(无matrix转化):')
  45661. //console.log(dir.clone().normalize())
  45662. return panoB.position.clone().add(dir);
  45663. }
  45664. defineComponent('TagEditManager', function () {
  45665. return /*#__PURE__*/function (_Emiter) {
  45666. _inherits(Editspot, _Emiter);
  45667. var _super = _createSuper$Q(Editspot);
  45668. function Editspot(splitView) {
  45669. var _this;
  45670. var info = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  45671. _classCallCheck(this, Editspot);
  45672. _this = _super.call(this);
  45673. _this.splitView = splitView;
  45674. _this.panoA; //不同于splitView的panoA. 只有getA时才会改变
  45675. _this.paonB; //基本和splitView的paonB一样,因为右侧不能移动所以不会变
  45676. _this.markTagPos; //被计算出的热点位置
  45677. _this.init(info);
  45678. /* splitView.on('leave', () => {
  45679. //player.unableChangePano = false
  45680. }) */
  45681. return _this;
  45682. }
  45683. _createClass(Editspot, [{
  45684. key: "init",
  45685. value: function init(info) {
  45686. var _this2 = this;
  45687. if (this.inited) return;
  45688. playerB$1 = this.$app.dom.querySelector('.player[name="copy"]'); //副屏
  45689. player$g = this.$app.core.get('Player');
  45690. this.$app.core.get('TagManager');
  45691. isMobile$2 = this.$app.config.mobile;
  45692. this.panosHistory = []; //每次定位时左侧走过的点位
  45693. /* this.mouseA = new THREE.Vector2(Infinity, Infinity)
  45694. this.mouseB = new THREE.Vector2(Infinity, Infinity) */
  45695. //两个热点标记
  45696. this.markSpotA = new Label2D({
  45697. name: 'markSpotA',
  45698. elem: info.spotA,
  45699. domParent: player$g.domElement,
  45700. camera: player$g.camera,
  45701. useTransform: true
  45702. }, player$g); //不使用panorama那个camera,因为在飞向下一个点时camera不更新
  45703. this.markSpotB = new Label2D({
  45704. name: 'markSpotB',
  45705. elem: info.spotB,
  45706. domParent: playerB$1,
  45707. camera: this.splitView.panoramaCam,
  45708. useTransform: true
  45709. }, player$g);
  45710. this.markSpotA.name = 'markSpotA';
  45711. this.markSpotB.name = 'markSpotB'; //热点的拖拽控制
  45712. new MoveCtrl({
  45713. elem: this.markSpotA.elem,
  45714. domParent: player$g.domElement,
  45715. useTransform: true,
  45716. cameraControls: player$g.cameraControls,
  45717. beginMoveFuc: function beginMoveFuc() {
  45718. if (!_this2.editing) return;
  45719. _this2.markSpotA.dragging = true; //this.markSpotA.elem.addClass("dragging")
  45720. player$g.cameraControls.controls.panorama.locked = true;
  45721. _this2.splitView.panoramaCtl.locked = true;
  45722. },
  45723. moveDoneFuc: function moveDoneFuc(e) {
  45724. if (!_this2.editing) return;
  45725. _this2.markSpotA.dragging = false; //this.markSpotA.elem.removeClass("dragging")
  45726. player$g.cameraControls.controls.panorama.locked = false;
  45727. _this2.splitView.panoramaCtl.locked = false;
  45728. e && _this2.moveToReGetA(e);
  45729. player$g.mouseCouldBeClickToMove = false;
  45730. }
  45731. });
  45732. markBmoveCtrl = new MoveCtrl({
  45733. elem: this.markSpotB.elem,
  45734. domParent: playerB$1,
  45735. useTransform: true,
  45736. cameraControls: player$g.cameraControls,
  45737. beginMoveFuc: function beginMoveFuc() {
  45738. _this2.markSpotB.dragging = true; //this.markSpotB.elem.addClass("dragging")
  45739. _this2.splitView.panoramaCtl.locked = true; //防止相机移动
  45740. player$g.cameraControls.controls.panorama.locked = true; //避免在B区抬起不触发moveDone
  45741. },
  45742. moveDoneFuc: function moveDoneFuc(e) {
  45743. _this2.markSpotB.dragging = false; //this.markSpotB.elem.removeClass("dragging")
  45744. _this2.splitView.panoramaCtl.locked = false;
  45745. player$g.cameraControls.controls.panorama.locked = false;
  45746. e && _this2.moveToReGetB(e);
  45747. }
  45748. });
  45749. playerB$1.addEventListener('pointerdown', mousedownB);
  45750. playerB$1.addEventListener('touchstart', mousedownB);
  45751. playerB$1.addEventListener('pointerup', this.clickToReGetB.bind(this)); //iphone pointerup无效
  45752. playerB$1.addEventListener('touchend', this.clickToReGetB.bind(this)); //player不断更新时,如果画面改变,要更新热点位置。
  45753. player$g.on('update', function (e) {
  45754. if (_this2.editing) {
  45755. if (e.hasChanged.cameraChanged2) {
  45756. /* this.markSpotA.camera.updateMatrix() //没自动更新
  45757. this.markSpotA.camera.updateMatrixWorld() */
  45758. _this2.markSpotA.update();
  45759. }
  45760. if (_this2.splitView.changed()
  45761. /* || this.changed() */
  45762. ) {
  45763. _this2.markSpotB.update();
  45764. }
  45765. }
  45766. }); //左屏改变漫游点
  45767. player$g.on('pano.chosen', function (pano1, pano2) {
  45768. _this2.changePano(pano2);
  45769. }); //左侧第一次点击确定位置
  45770. player$g.on('click', function (e) {
  45771. if (_this2.editing && !_this2.clickA) {
  45772. e.intersect && _this2.getA(e.intersect);
  45773. e.consume(); //使用了,阻止后续进行
  45774. }
  45775. }); //左屏改变漫游点时询问是否有要转向的aim target。 转向markTagPos
  45776. player$g.on('ifFocusPoint', function (askAim) {
  45777. if (_this2.editing && _this2.markTagPos) {
  45778. var importance = 3; //设置当前的importance级别。如果askAim已高于该级别 就不操作
  45779. if (askAim.importance < importance) {
  45780. askAim.importance = importance;
  45781. askAim.aim = _this2.markTagPos.clone();
  45782. }
  45783. }
  45784. });
  45785. this.inited = true;
  45786. }
  45787. /* changed = (function () {
  45788. var previousState = {}
  45789. return function () {
  45790. let changed = !previousState.mouseB || !this.mouseB.equals(previousState.mouseB)
  45791. previousState.mouseB = this.mouseB.clone()
  45792. return changed
  45793. }
  45794. })() */
  45795. //添加热点
  45796. }, {
  45797. key: "enter",
  45798. value: function enter() {
  45799. var _this3 = this;
  45800. /* var checkCanAddSpot = function(){
  45801. if(player.is360View(player.mode, player.currentPano)){
  45802. player.currentPano.view.backToPanorama();
  45803. $waiting.show()
  45804. }
  45805. return player.currentPano && (config.settings.visions != 2 || player.currentPano.assistPano)
  45806. }
  45807. if(!checkCanAddSpot()){
  45808. var timer = setInterval(() => {
  45809. if(checkCanAddSpot()){
  45810. editSpot.addSpot()
  45811. clearInterval(timer)
  45812. }
  45813. }, 50)
  45814. return;
  45815. } */
  45816. player$g.viewLinkManager.exitView().then(function () {
  45817. if (player$g.flying || player$g.flyingToTag) {
  45818. if (player$g.flyingToTag) ;
  45819. player$g.once(PlayerEvents.FlyingEnded, function () {
  45820. //等到飞行结束后再开始
  45821. _this3.enter();
  45822. });
  45823. return;
  45824. }
  45825. player$g.flyToMode('panorama', function () {
  45826. var begin = function begin() {
  45827. if (!player$g.currentPano) {
  45828. setTimeout(begin, 50);
  45829. return;
  45830. } //$waiting.hide()
  45831. _this3.editing = true;
  45832. if (_this3.setSpotPos || player$g.flying) return;
  45833. _this3.splitView.enter();
  45834. _this3.panosHistory = [];
  45835. /* this.splitView.changePano(player.currentPano) //因为在enter之前已经分屏了,但之后可能飞到另一个漫游点了,所以同步下,保证右侧和左侧是对应的
  45836. this.splitView.setSceneB() */
  45837. _this3.panoB = _this3.splitView.panoB;
  45838. _this3.markSpotA.elem.style.display = 'none';
  45839. _this3.markSpotB.elem.style.display = 'none';
  45840. _this3.markSpotA.pos3d = _this3.clickA = null;
  45841. _this3.markSpotB.pos3d = _this3.clickB = null;
  45842. _this3.markTagPos = null; //clear focus
  45843. player$g.reticule.visible = false;
  45844. player$g.locked = true; //左屏禁止移动,直到第一次点击
  45845. /* if (settings.visions == 1) {
  45846. player.unableChangePano = true
  45847. } */
  45848. if (insideLookLimitDownOld == void 0) {
  45849. insideLookLimitDownOld = settings$3.insideLookLimitDown;
  45850. insideLookLimitUpOld = settings$3.insideLookLimitUp;
  45851. settings$3.insideLookLimitDown = -35;
  45852. settings$3.insideLookLimitUp = 35;
  45853. }
  45854. };
  45855. begin();
  45856. });
  45857. });
  45858. }
  45859. /*
  45860. 开始热点位置修改
  45861. */
  45862. }, {
  45863. key: "reSetPos",
  45864. value: function reSetPos(pos) {
  45865. var _this4 = this;
  45866. this.markTagPos = new THREE.Vector3().copy(pos);
  45867. player$g.viewLinkManager.exitView().then(function () {
  45868. if (player$g.flying || player$g.flyingToTag) {
  45869. if (player$g.flyingToTag) ;
  45870. player$g.once(PlayerEvents.FlyingEnded, function () {
  45871. //等到飞行结束后再开始
  45872. _this4.reSetPos(pos);
  45873. });
  45874. return;
  45875. }
  45876. _this4.editing = true;
  45877. _this4.panosHistory = []; //$waiting.hide() //objects.gui.showWaiting(false, "reSetPos")
  45878. _this4.hotRePos = true;
  45879. _this4.markSpotA.pos3d = _this4.clickA = _this4.markTagPos.clone();
  45880. _this4.markSpotA.enable = true;
  45881. _this4.markSpotB.pos3d = _this4.clickB = _this4.markTagPos.clone();
  45882. _this4.markSpotA.elem.style.display = 'block';
  45883. _this4.markSpotB.elem.style.display = 'block'; //store.commit('SetPlayerOptions', { showPositionMarks: true }) //热点hotspot可见
  45884. _this4.markSpotB.enable = true;
  45885. setTimeout(function () {
  45886. _this4.markSpotA.update();
  45887. _this4.markSpotB.update();
  45888. }, 300); //console.log('reSetPos', player.currentPano.id)
  45889. /* this.splitView.changePano(player.currentPano)
  45890. this.splitView.setSceneB() */
  45891. _this4.splitView.enter();
  45892. _this4.panoA = _this4.splitView.panoA;
  45893. _this4.panoB = _this4.splitView.panoB;
  45894. if (insideLookLimitDownOld == void 0) {
  45895. insideLookLimitDownOld = settings$3.insideLookLimitDown;
  45896. insideLookLimitUpOld = settings$3.insideLookLimitUp;
  45897. settings$3.insideLookLimitDown = -35;
  45898. settings$3.insideLookLimitUp = 35;
  45899. } //转向:
  45900. player$g.flyToPano({
  45901. pano: player$g.currentPano,
  45902. aimDuration: 500,
  45903. lookAtPoint: _this4.markTagPos
  45904. });
  45905. return true;
  45906. });
  45907. } //确定热点位置
  45908. }, {
  45909. key: "confirmPos",
  45910. value: function confirmPos(Tag) {
  45911. if (!this.editing) return;
  45912. var sid = common$1.getRandomSid();
  45913. var pos = this.computeHotPos();
  45914. if (Tag) {
  45915. //测试
  45916. player$g.model.add(new Tag(sid, {
  45917. position: pos
  45918. }));
  45919. }
  45920. if (!this.panoA) {
  45921. return {};
  45922. }
  45923. return {
  45924. sid,
  45925. position: pos,
  45926. panoId: this.panoA.id //添加热点时,相机站在当前点
  45927. };
  45928. }
  45929. }, {
  45930. key: "exit",
  45931. value: function exit() {
  45932. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  45933. if (o.cancel) ;
  45934. this.clickA = this.clickB = null;
  45935. this.markSpotA.pos3d = this.markSpotB.pos3d = null;
  45936. /* markSpotA.enable = false;
  45937. markSpotB.enable = false; */
  45938. this.splitView.leave();
  45939. this.markSpotA.elem.style.display = 'none';
  45940. this.markSpotB.elem.style.display = 'none'; // 每次退出需要将markSpot位置重置屏幕中央
  45941. this.markSpotA.pos2d = new THREE.Vector2();
  45942. this.markSpotB.pos2d = new THREE.Vector2();
  45943. this.markSpotA.setElemPos();
  45944. this.markSpotB.setElemPos();
  45945. player$g.reticule.visible = true;
  45946. if (this.hideMarker) {
  45947. editSpot.hideMarker.visible = true;
  45948. editSpot.hideMarker = null;
  45949. }
  45950. this.hotRePos = false;
  45951. this.editing = false;
  45952. player$g.locked = false;
  45953. if (insideLookLimitDownOld != void 0) {
  45954. settings$3.insideLookLimitDown = insideLookLimitDownOld;
  45955. settings$3.insideLookLimitUp = insideLookLimitUpOld;
  45956. insideLookLimitDownOld = insideLookLimitUpOld = null;
  45957. }
  45958. } //左方更改位置
  45959. }, {
  45960. key: "changePano",
  45961. value: function changePano(pano) {
  45962. if (!this.editing) return;
  45963. this.splitView.changePano(pano); //if (!this.markTagPos) return
  45964. if (this.markTagPos) {
  45965. this.markSpotA.pos3d = this.markTagPos.clone(); //使用计算出的坐标
  45966. this.panosHistory.push(pano);
  45967. }
  45968. if (pano.assistPano == this.splitView.panoB || pano == this.splitView.panoB) {
  45969. this.splitView.pauseCameraBind = false;
  45970. } else {
  45971. if (!this.splitView.pauseCameraBind) {
  45972. this.splitView.pauseCameraBind = true;
  45973. this.markSpotB.pos3d && this.splitView.panoramaCtl.startLookAt(this.markSpotB.pos3d); //重新focus回tag一下,因为刚为了很可能转到别的方向了
  45974. }
  45975. }
  45976. } //在左边屏确定位置时
  45977. }, {
  45978. key: "getA",
  45979. value: function getA(intersect) {
  45980. var _this5 = this;
  45981. if (player$g.flying || !this.editing) return;
  45982. this.panoA = player$g.currentPano; //记录改变位置时的左屏pano
  45983. player$g.locked = false; //没有下相机的信息时,分屏后左右pano一样,当左屏确定位置后需要自动飞向别的pano
  45984. if (settings$3.visions != 2 && this.panoA == this.panoB) {
  45985. var modelViewMatrix = player$g.model.matrixWorld.clone().invert();
  45986. var pos = intersect.point.clone().applyMatrix4(modelViewMatrix); //自动飞到旁边最近的点:(为了避免走到的点可能看不见目标,所以取最近的)
  45987. //var metadata = store.getters['scene/metadata'];
  45988. if (
  45989. /* metadata.sceneSource != 12 && */
  45990. !this.clickA) {
  45991. //123的点位在不同房间,全景图很不一样所以不飞(用户需尽量走到可以看到热点的其他位置进行校准,如果没有可见位置,就当做在该房间内的局部全景热点,因为其他房间看不到所以不准确没有关系)
  45992. this.clickA = this.clickB = pos;
  45993. var nearestPano = player$g.model.panos.find([function (pano) {
  45994. return player$g.currentPano.neighbourPanos[pano.id] && player$g.currentPano != pano && pano.isAligned();
  45995. }], [Panorama.sortFunctions.distanceToPoint(player$g.currentPano.position)]); //player.unableChangePano = false
  45996. if (nearestPano) player$g.flyToPano({
  45997. pano: nearestPano,
  45998. lookAtPoint: pos.clone()
  45999. });else {
  46000. console.log('当前场景只有一个pano,所以不走到下一个点');
  46001. }
  46002. }
  46003. this.clickA = this.clickB = pos;
  46004. } else {
  46005. if (player$g.currentPano.assistPano != this.splitView.panoB || this.panosHistory.length > 0) {
  46006. //左屏已经到另一个点 或者又回来这个点,右侧都不用自动改位置
  46007. if (!this.clickA) {
  46008. //测距第二步时左边走到别的地方,右边要加载对应的
  46009. this.splitView.setSceneB();
  46010. this.panoB = this.splitView.panoB;
  46011. this.splitView.pauseCameraBind = false;
  46012. if (settings$3.visions != 2) {
  46013. //恢复到两边一样,再次执行,以类似第一步开始时
  46014. this.splitView.panoramaCtl.startLookAt(intersect.point);
  46015. return this.getA(intersect);
  46016. }
  46017. } else {
  46018. this.panoA = player$g.currentPano;
  46019. var modelViewMatrix = player$g.model.matrixWorld.clone().invert(); //×模型矩阵的逆矩阵,是因为当飞出屋子再飞进去时模型位移了,现在要保证采集的点是模型没有任何变换下的点。在计算2d坐标时会乘以模型矩阵。
  46020. this.clickA = intersect.point.clone().applyMatrix4(modelViewMatrix);
  46021. this.markSpotA.pos3d = this.clickA;
  46022. this.markSpotA.update();
  46023. this.computeHotPos(); //objects.tagManager.markTag.rePos(markSpotA.computeHotPos({ onlyGetPos: true, dontRestric: editSpot.editType == "measure" })) //总是记录最新算出的坐标 A或B到下一个位置时就使用它
  46024. //console.log("远近:" + objects.tagManager.markTag.position.distanceTo(player.position));
  46025. return;
  46026. }
  46027. }
  46028. if (settings$3.visions != 2) {
  46029. console.warn('settings.visions != 2 ???');
  46030. }
  46031. var data = this.getMatchData();
  46032. if (!data) {
  46033. //$waiting.show() ////objects.gui.showWaiting(true, "getMatchData")
  46034. var name = this.panoA.id + '_' + this.panoB.id;
  46035. MatchDataGetWrong[name] = (MatchDataGetWrong[name] || 0) + 1;
  46036. if (MatchDataGetWrong[name] > 5) {
  46037. console.error('获取不到matchdata 放弃使用: ' + name);
  46038. } else {
  46039. setTimeout(function () {
  46040. _this5.getA(intersect);
  46041. }, 200);
  46042. return;
  46043. }
  46044. } //if (texGetted) $waiting.hide() //objects.gui.showWaiting(false, "getMatchData")
  46045. var modelViewMatrix = player$g.model.matrixWorld.clone().invert(); //×模型矩阵的逆矩阵,是因为当飞出屋子再飞进去时模型位移了,现在要保证采集的点是模型没有任何变换下的点。在计算2d坐标时会乘以模型矩阵。
  46046. this.clickA = intersect.point.clone().applyMatrix4(modelViewMatrix);
  46047. this.dirA = math$2.getNormalDir(this.clickA,
  46048. /* player.model.supportsTiles, */
  46049. player$g.currentPano); //经过matrix变换的方向
  46050. //通过A预测B
  46051. this.UVa = math$2.getUVfromDir(this.dirA);
  46052. this.UVb = this.searchPointAtLeft(this.UVa);
  46053. if (!this.UVb) {
  46054. //因为B相机相对A相机在y向偏移,所以预估UV
  46055. console.log('找不到UVb,假设一个'); //$tips({ content: "辅助校准位置可能不准确,请检查并拖动到"+ (config.isMobile ? "上方":"左侧")+"相同位置" })
  46056. //$tips({ content: i18n.t('modules.hotspot.m_location_move_tips', { direction: i18n.t(`modules.hotspot.m_location_${config.isMobile?'up':'left'}`) }) })
  46057. var shiftY = -0.02; //最好根据历史统计一下。因为x也可能很不一样
  46058. this.UVb = {
  46059. x: this.UVa.x,
  46060. y: this.UVa.y + shiftY
  46061. };
  46062. } else {
  46063. this.UVb.x = this.UVb.x.toFixed(3) - 0;
  46064. this.UVb.y = this.UVb.y.toFixed(3) - 0;
  46065. }
  46066. this.dirB = math$2.getDirFromUV(this.UVb);
  46067. this.clickB = getPoint(this.dirB, this.splitView.panoB); //更新相机朝向,并记得要立刻updateMatrix,getPos2d需要用到matrix
  46068. /* panoramaCam.lookAt(this.clickB)
  46069. panoramaCam.updateMatrix();
  46070. panoramaCam.updateMatrixWorld(); */
  46071. //UV显示对照更新
  46072. /* $("#IMGparent > div").eq(0).find('.cursor1').css({"display":"block",
  46073. "left": this.UVa.x*100+"100%",
  46074. "top": this.UVa.y*100+"100%"})
  46075. $("#IMGparent > div").eq(1).find('.cursor1').css({"display":"block",
  46076. "left": this.UVb.x*100+"100%",
  46077. "top": this.UVb.y*100+"100%"}) */
  46078. }
  46079. this.markSpotA.pos3d = this.clickA;
  46080. this.markSpotB.pos3d = this.clickB; //热点标记可见
  46081. //store.commit('SetPlayerOptions', { showPositionMarks: true })
  46082. this.markSpotA.elem.style.display = 'block';
  46083. this.markSpotB.elem.style.display = 'block';
  46084. this.markSpotA.enable = true;
  46085. this.markSpotB.enable = true;
  46086. this.markSpotA.update();
  46087. this.markSpotB.update();
  46088. if (settings$3.visions != 2 && this.panoA == this.panoB) {
  46089. this.markTagPos = this.markSpotA.pos3d.clone();
  46090. } else {
  46091. this.computeHotPos();
  46092. } //$('#player').css('cursor', '');
  46093. this.$app.TagManager.emit('tagManager.markTagPos');
  46094. } //在右边屏确定位置时
  46095. }, {
  46096. key: "getB",
  46097. value: function getB(mouse) {
  46098. var intersect = convertTool.getMouseIntersect(this.splitView.panoramaCam, [this.splitView.cube], mouse);
  46099. var modelViewMatrix = player$g.model.matrixWorld.clone().invert(); //×模型矩阵的逆矩阵,是因为当飞出屋子再飞进去时模型位移了,现在要保证采集的点是模型没有任何变换下的点。在计算2d坐标时会乘以模型矩阵。
  46100. this.clickB = intersect.point.clone().applyMatrix4(modelViewMatrix);
  46101. this.markSpotB.pos3d = this.clickB; //更新hotspot三维位置
  46102. this.markSpotB.update(); //更新hotspot二维位置
  46103. this.computeHotPos();
  46104. }
  46105. }, {
  46106. key: "moveToReGetA",
  46107. value: function moveToReGetA(e) {
  46108. //拖拽左侧热点到新的位置
  46109. player$g.handleInputStart(e.x, e.y, true, true); //更新mouse
  46110. player$g.updateIntersect({}); //let intersect = player.getMouseIntersect(null, this.linkEditor.footIcons)
  46111. player$g.intersect ? this.getA(player$g.intersect) : this.markSpotA.update(); //update:回到原来的位置
  46112. player$g.mouseDown = false; //移动端这个不会归零 所以手动
  46113. }
  46114. }, {
  46115. key: "moveToReGetB",
  46116. value: function moveToReGetB(e) {
  46117. //拖拽右侧热点到新的位置
  46118. var mouse = new THREE.Vector2();
  46119. math$2.convertScreenPositionToNDC(e.x, e.y, mouse, playerB$1); //获取在canvasB的mouse
  46120. this.getB(mouse);
  46121. }
  46122. }, {
  46123. key: "clickToReGetB",
  46124. value: function clickToReGetB(e) {
  46125. //点击右侧,热点到新的位置(左侧点击不能确定位置)
  46126. //this.playerBmousedown = false
  46127. if (markBmoveCtrl.moving) return; //这时候使用的是moveToReGetB 因为拖拽热点
  46128. var mouseB = getMouseB(e);
  46129. if (Math.abs(lastMouseB.x - mouseB.x) > 3 || Math.abs(lastMouseB.y - mouseB.y) > 3) return; //在拖拽画布
  46130. if (!this.clickA && !this.hotRePos) {
  46131. console.log('..?..');
  46132. this.$app.TagManager.emit('tagManager.firstMarkTagPosB'); //$tips({ content:i18n.t(`show.location_start_tips`,{direction: i18n.t(`show.location_${config.isMobile?'up':'left'}`)}) });
  46133. return;
  46134. }
  46135. var mouse = new THREE.Vector2();
  46136. math$2.convertScreenPositionToNDC(mouseB.x, mouseB.y, mouse, playerB$1); //获取在canvasB的mouse
  46137. this.getB(mouse);
  46138. }
  46139. }, {
  46140. key: "restricPosAtRoom",
  46141. value: function restricPosAtRoom(pos3d) {
  46142. var A = player$g.currentPano.position; //如果不支持编辑户型的话就得不到rooms 直接使用模型判断 但可能出门 能限制在skybox内
  46143. /* var group = objects.player.model.wallManager.roomInfo && objects.player.model.wallManager.roomInfo.oriRoomGroup;
  46144. if(group){
  46145. group.visible = true;
  46146. var intersect = convertTool.ifIntersectChunks(A, pos3d, {model: group.children});
  46147. if(intersect && intersect.length ){
  46148. console.log('热点飘出房间')
  46149. var pos = intersect[0].point.clone().setY(intersect[0].point.y + 0.001)//+ 0.001防止重叠
  46150. pos3d.copy(pos)
  46151. }
  46152. group.visible = false;
  46153. //新版只有一个房间,可能需要用柱子等其他物体隔开(不在oriRoomData内),还是用模型好。且oriRoomData需一开始就初始化mainDesign。
  46154. }else{ */
  46155. var B = pos3d;
  46156. var dir = B.clone().sub(A).normalize();
  46157. var ray = new THREE.Raycaster(A, dir, 0, A.distanceTo(B));
  46158. var o = ray.intersectObjects(player$g.model.skyBoxTight
  46159. /* .colliders */
  46160. ); //模型不准时热点就永远放不准 只有激光的比较准
  46161. if (o && o.length) {
  46162. console.log('热点飘出skyBoxTight外,矫正:' + pos3d.toArray() + ' --> ' + o[0].point.toArray());
  46163. pos3d.copy(o[0].point).sub(dir.clone().multiplyScalar(0.001));
  46164. } //}
  46165. return pos3d;
  46166. }
  46167. }, {
  46168. key: "computeHotPos",
  46169. value: function computeHotPos() {
  46170. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  46171. //通过采集的两个点位信息,来计算3d坐标
  46172. if (!this.panoA || !this.clickA) {
  46173. return null;
  46174. }
  46175. var A = this.panoA.position.clone();
  46176. var B = this.panoB.position.clone();
  46177. var p1 = this.clickA;
  46178. var p2 = this.clickB;
  46179. var _math$getLineIntersec = math$2.getLineIntersect({
  46180. A,
  46181. B,
  46182. p1,
  46183. p2
  46184. }),
  46185. pos3d = _math$getLineIntersec.pos3d;
  46186. if (!o.dontRestric) this.restricPosAtRoom(pos3d);
  46187. this.markTagPos = pos3d;
  46188. console.log('markTagPos: ', pos3d.toArray());
  46189. return pos3d;
  46190. } //-----------通过上下相机来预测初始位置-------------
  46191. }, {
  46192. key: "getMatchData",
  46193. value: function getMatchData() {
  46194. //获取上下相机的 view pair 对照数据
  46195. var name = this.panoA.id + '_' + this.panoB.id;
  46196. if (MatchData[name]) return MatchData[name];else {
  46197. http.get(this.$app.resource.getEditDataURL("mapping/".concat(name, ".json"))).then(function (data) {
  46198. MatchData[name] = data;
  46199. });
  46200. }
  46201. }
  46202. }, {
  46203. key: "searchPointAtLeft",
  46204. value: function searchPointAtLeft(UVa) {
  46205. //借用view pair数据 通过UVa(热点在左屏的uv位置) 预测UVb
  46206. var data = this.getMatchData();
  46207. if (!UVa) {
  46208. console.log('!!!');
  46209. }
  46210. if (!data || !data['view pair'] || !data['view pair']['uv']) return null; /////////////////////////
  46211. var tx = UVa.x;
  46212. var ty = UVa.y;
  46213. var leftTop = {},
  46214. rightTop = {},
  46215. leftBot = {},
  46216. rightBot = {};
  46217. var info = {
  46218. leftTop: leftTop,
  46219. rightTop: rightTop,
  46220. leftBot: leftBot,
  46221. rightBot: rightBot
  46222. };
  46223. var result; //$('#IMGparent .cursor2').remove()
  46224. data['view pair']['uv'].forEach(function (pair) {
  46225. if (pair[0] < tx && pair[1] <= ty) {
  46226. judge(leftTop, pair);
  46227. } else if (pair[0] >= tx && pair[1] <= ty) {
  46228. judge(rightTop, pair);
  46229. } else if (pair[0] < tx && pair[1] >= ty) {
  46230. judge(leftBot, pair);
  46231. } else {
  46232. judge(rightBot, pair);
  46233. }
  46234. });
  46235. function judge(o, pair) {
  46236. var x = pair[0];
  46237. var y = pair[1]; //var dis = Math.abs(x-tx) + Math.abs(y-ty);
  46238. var dis = (x - tx) * (x - tx) + (y - ty) * (y - ty);
  46239. if (o.dis == void 0 || o.dis > dis) {
  46240. o.dis = dis;
  46241. o.pair = pair;
  46242. }
  46243. }
  46244. var hasValue = 0; //四个方向有值的个数
  46245. for (var i in info) {
  46246. if (info[i].pair) hasValue++;
  46247. }
  46248. var percent = {}; //根据距离算出比例 近似成左右边的uv比例
  46249. if (hasValue >= 3) {
  46250. //有三个值就足够算出
  46251. result = compute();
  46252. } else if (hasValue == 2) {
  46253. //两个值的需要 对角线上都有值
  46254. if (leftTop.pair && rightBot.pair || leftBot.pair && rightTop.pair) {
  46255. result = compute();
  46256. }
  46257. } else ;
  46258. function getSmallest(dir1, dir2) {
  46259. if (!dir1.pair) return dir2;else if (!dir2.pair) return dir1;
  46260. if (dir1.dis < dir2.dis) return dir1;else return dir2;
  46261. }
  46262. function compute() {
  46263. //线性插值计算(比例) uvA对应的uvB
  46264. var left = getSmallest(leftTop, leftBot);
  46265. var right = getSmallest(rightTop, rightBot);
  46266. var top = getSmallest(leftTop, rightTop);
  46267. var bottom = getSmallest(leftBot, rightBot);
  46268. percent.x = (tx - left.pair[0]) / (right.pair[0] - left.pair[0]);
  46269. percent.y = (ty - top.pair[1]) / (bottom.pair[1] - top.pair[1]); //得到对应的uv
  46270. var x = left.pair[2] + (right.pair[2] - left.pair[2]) * percent.x;
  46271. var y = top.pair[3] + (bottom.pair[3] - top.pair[3]) * percent.y;
  46272. return {
  46273. x: x,
  46274. y: y
  46275. };
  46276. }
  46277. return result;
  46278. }
  46279. }]);
  46280. return Editspot;
  46281. }(tinyEmitter);
  46282. });
  46283. /*
  46284. 若关联全景中加热点, 热点仅在此pano可见。无需分屏
  46285. */
  46286. /*
  46287. 初始画面
  46288. */
  46289. var FirstView = /*#__PURE__*/function () {
  46290. function FirstView(metadata, panos) {
  46291. _classCallCheck(this, FirstView);
  46292. this.quickstart = true;
  46293. this.mode = Viewmode$1.PANORAMA;
  46294. this.zoom = -1, this.fov = browser$1.urlHasValue('fov') ? Number(browser$1.urlQueryValue('fov')) : settings$3.insideFOV;
  46295. this.pano = null;
  46296. this.position = new THREE.Vector3();
  46297. this.quaternion = new THREE.Quaternion();
  46298. this.init(metadata, panos);
  46299. }
  46300. _createClass(FirstView, [{
  46301. key: "init",
  46302. value: function init(metadata, panos) {
  46303. var urlFirstView = browser$1.urlHasValue('pose', true); //使用地址栏的信息 如 &pose=pano:2,qua:-0.2205,-0.718,-0.2613,0.605
  46304. if (urlFirstView) {
  46305. try {
  46306. urlFirstView = common$1.replaceAll(urlFirstView, 'pano', '"pano"');
  46307. urlFirstView = common$1.replaceAll(urlFirstView, 'qua:', '"qua":[');
  46308. urlFirstView = '{' + urlFirstView + ']}';
  46309. var info = JSON.parse(urlFirstView);
  46310. this.pano = panos.get(info.pano);
  46311. if (!this.pano) {
  46312. urlFirstView = false;
  46313. console.error('检测到firstView但是 找不到该pano');
  46314. } else {
  46315. this.quaternion = new THREE.Quaternion().fromArray(info.qua);
  46316. this.zoom = -1;
  46317. this.setByUrl = true;
  46318. }
  46319. } catch (e) {
  46320. urlFirstView = false;
  46321. console.error('检测到firstView但是解析出错' + e);
  46322. }
  46323. } else {
  46324. if (metadata && metadata.entry) {
  46325. var entry = metadata.entry;
  46326. this.updateByEntry(entry, panos);
  46327. } else {
  46328. this.pano = panos.list[0];
  46329. this.quaternion.copy(this.pano.quaternion);
  46330. }
  46331. }
  46332. this.position.copy(this.pano.position);
  46333. if (this.quaternion.equals(new THREE.Quaternion(-0.5, 0.5, 0.5, 0.5))) {
  46334. //俯视向下会黑屏
  46335. this.quaternion.set(0, 0, 0, 1);
  46336. console.log('检测到初始画面quaternion为-0.5,0.5,0.5,0.5,强制更改为0,0,0,1');
  46337. }
  46338. }
  46339. }, {
  46340. key: "updateByEntry",
  46341. value: function updateByEntry(entry, panos) {
  46342. if (typeof entry == 'string') {
  46343. entry = JSON.parse(entry);
  46344. }
  46345. if (entry.pano) {
  46346. this.pano = panos.get(entry.pano);
  46347. } //有可能客户补拍,那时候这个id可能不存在了。
  46348. if (this.pano == void 0) {
  46349. this.pano = panos.list[0];
  46350. }
  46351. this.quaternion.copy(this.pano.quaternion);
  46352. if (entry.camera) {
  46353. this.quaternion = new THREE.Quaternion().fromArray(entry.camera.quaternion);
  46354. this.zoom = entry.camera.zoom;
  46355. }
  46356. }
  46357. }, {
  46358. key: "fromGuideView",
  46359. value: function fromGuideView(guidItem, panos) {
  46360. this.mode = guidItem.value.mode;
  46361. this.zoom = guidItem.value.zoom;
  46362. this.position.copy(guidItem.value.pos);
  46363. this.quaternion.set(guidItem.value.qua._x, guidItem.value.qua._y, guidItem.value.qua._z, guidItem.value.qua._w);
  46364. this.pano = panos.get(guidItem.value.pano);
  46365. }
  46366. }]);
  46367. return FirstView;
  46368. }();
  46369. 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); }; }
  46370. 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; } }
  46371. var renderer$1, playerB, player$f;
  46372. var texWaitTimer = {};
  46373. var panos2; //分屏模块
  46374. var SplitView = /*#__PURE__*/function (_EventEmitter) {
  46375. _inherits(SplitView, _EventEmitter);
  46376. var _super = _createSuper$P(SplitView);
  46377. function SplitView($app, editType) {
  46378. var _this;
  46379. _classCallCheck(this, SplitView);
  46380. _this = _super.call(this);
  46381. _this.changed = function () {
  46382. //判断右边分屏是否移动了panoramaCam 即是否需要更新markB的位置
  46383. var previousState;
  46384. return function () {
  46385. var cameraChanged;
  46386. var p = this.panoramaCam.position.clone(),
  46387. q = this.panoramaCam.quaternion.clone();
  46388. if (!previousState || !MathLight.closeTo(previousState.position, p, 5) || !MathLight.closeTo(previousState.quaternion, q, 5)) cameraChanged = true;
  46389. if (cameraChanged) {
  46390. previousState = {
  46391. position: p,
  46392. quaternion: q
  46393. };
  46394. }
  46395. return cameraChanged;
  46396. };
  46397. }();
  46398. _this.$app = $app;
  46399. {
  46400. _this.init();
  46401. }
  46402. _this.editType = editType;
  46403. _this.pauseCameraBind; //右屏是否不跟左屏动
  46404. return _this;
  46405. }
  46406. _createClass(SplitView, [{
  46407. key: "init",
  46408. value: function init() {
  46409. var _this2 = this;
  46410. player$f = this.$app.core.get('Player'); //-------------设置副屏-------------
  46411. playerB = this.$app.dom.querySelector('.player[name="copy"]'); //创建新的renderer、 scene 和 相机控制
  46412. renderer$1 = new THREE.WebGLRenderer({
  46413. antialias: true
  46414. /* !config.isMobile */
  46415. });
  46416. renderer$1.setPixelRatio(window.devicePixelRatio);
  46417. renderer$1.setSize(300, 300, false);
  46418. playerB.appendChild(renderer$1.domElement);
  46419. var ctls = this.$app.withNewComponent('CameraControls');
  46420. ctls.init(playerB, ['panorama']);
  46421. ctls.activateControls('panorama');
  46422. this.panoramaCtl = ctls.activeControl;
  46423. this.panoramaCam = ctls.activeControl.camera;
  46424. this.panoramaCam.fov = 60;
  46425. this.panoramaCam.name = 'splitViewCam';
  46426. this.panoramaCam.layers.toggle(RenderLayers.DEFAULT);
  46427. this.panoramaCam.layers.enable(RenderLayers.PANOMARKERS);
  46428. this.panoramaCam.layers.enable(RenderLayers.SubScreen); //this.panoramaCam.layers.enable(RenderLayers.Tag3d)
  46429. if (settings$3.visions == 2 && !player$f.model.panos.list[0].assistPano) {
  46430. //诊断出没有vision2的数据
  46431. settings$3.visions = 1;
  46432. console.warn('自动更改 visions = 1');
  46433. }
  46434. if (settings$3.visions != 2 && player$f.model.supportsTiles) {
  46435. //没有下相机的单张全景图,所以只加载和左侧一样的tiles贴图,需要重新创建tiles相关,因贴图无法共用(会报错)
  46436. var sceneRenderer2 = this.$app.withNewComponent('SceneRenderer', 1);
  46437. var panoRenderer2 = this.$app.withNewComponent('PanoRenderer', 1);
  46438. var tileDownloader2 = this.$app.withNewComponent('TileDownloader', {
  46439. $app: this.$app
  46440. });
  46441. tileDownloader2.index = 1;
  46442. sceneRenderer2.renderer = renderer$1;
  46443. tileDownloader2.processPriorityQueue = true; //?
  46444. panoRenderer2.init(sceneRenderer2, tileDownloader2);
  46445. panos2 = new PanoramaCollection();
  46446. panos2.extend(player$f.model.panos.list.map(function (pano) {
  46447. var panoCopy = new Panorama(_this2.$app, pano.id, pano);
  46448. panoCopy.floorPosition = pano.floorPosition;
  46449. panoCopy.copyForSplitView = true; //mark
  46450. panoCopy.attachToPanoRenderer(panoRenderer2);
  46451. panoCopy.tileDownloader = tileDownloader2;
  46452. panoCopy.qualityManager = _this2.$app.core.get('QualityManager');
  46453. return panoCopy;
  46454. }));
  46455. tileDownloader2.setPanoData(panos2, [], this.$app.core.get('ModelManager').projectNum);
  46456. tileDownloader2.setUrls(player$f.model.urls); //?
  46457. tileDownloader2.useComponent();
  46458. this.tileDownloader = tileDownloader2;
  46459. tileDownloader2.tilePrioritizer = new TilePrioritizer(this.$app.core.get('QualityManager'), player$f.basePanoSize, player$f.standardPanoSize, player$f.highPanoSize, player$f.ultraHighPanoSize);
  46460. tileDownloader2.tilePrioritizer.name = 'forSplitView';
  46461. }
  46462. {
  46463. //添加天空盒
  46464. this.cube = new THREE.Mesh(new THREE.BoxGeometry(10, 10, 10), new ModelTextureMaterial({
  46465. side: THREE.BackSide,
  46466. transparent: false,
  46467. name: 'splitViewCubeMat',
  46468. not_Cube: settings$3.visions == 2 || !player$f.model.supportsTiles //如果有下相机,右侧是单张图,否则和左侧一样
  46469. }, 'skybox'));
  46470. this.cube.name = 'splitView-cube';
  46471. this.cube.layers.set(RenderLayers.SubScreen);
  46472. this.$app.core.get('SceneRenderer').scene.add(this.cube);
  46473. }
  46474. {
  46475. //--event
  46476. player$f.on('updateFromControls', function (player, e) {
  46477. if (_this2.editing) {
  46478. var _this2$tileDownloader;
  46479. if (_this2.pauseCameraBind) {
  46480. _this2.panoramaCtl.update(e);
  46481. } else {
  46482. _this2.panoramaCtl.lon = player.cameraControls.controls.panorama.lon;
  46483. _this2.panoramaCtl.lat = player.cameraControls.controls.panorama.lat;
  46484. _this2.panoramaCtl.update(e);
  46485. player.cameraControls.controls.panorama.lon = _this2.panoramaCtl.lon;
  46486. player.cameraControls.controls.panorama.lat = _this2.panoramaCtl.lat;
  46487. } //console.log('同步')
  46488. (_this2$tileDownloader = _this2.tileDownloader) === null || _this2$tileDownloader === void 0 ? void 0 : _this2$tileDownloader.tilePrioritizer.updateCriteria(_this2.panoB, _this2.panoB.position, new THREE.Vector3(0, 0, -1).applyQuaternion(_this2.panoramaCtl.camera.quaternion));
  46489. }
  46490. });
  46491. }
  46492. }
  46493. }, {
  46494. key: "enter",
  46495. value: function enter() {
  46496. var _this$tileDownloader;
  46497. //开始分屏
  46498. if (this.editing) return;
  46499. this.editing = true;
  46500. this.$app.core.get('SceneRenderer').addComponent(this);
  46501. (_this$tileDownloader = this.tileDownloader2) === null || _this$tileDownloader === void 0 ? void 0 : _this$tileDownloader.start();
  46502. var camera = player$f.cameraControls.cameras.panorama;
  46503. camera.fov = camera.staticFov = 60;
  46504. this.zoomEnabled = settings$3.zoom.enabled;
  46505. settings$3.zoom.enabled = false; //这个决定滚轮是缩放或者前进
  46506. this.pauseCameraBind = false; //false时两个相机的旋转角度是一致的,互相影响
  46507. this.panoA = player$f.currentPano;
  46508. this.setSize();
  46509. this.setSceneB();
  46510. this.emit('enter');
  46511. player$f.OverlayManager.hide('all');
  46512. player$f.GLTFEditor.hide('all');
  46513. }
  46514. }, {
  46515. key: "leave",
  46516. value: function leave() {
  46517. var _this$tileDownloader2;
  46518. //结束分屏
  46519. if (!this.editing) return;
  46520. this.$app.core.get('SceneRenderer').removeComponent(this);
  46521. this.emit('leave');
  46522. this.editing = false;
  46523. settings$3.zoom.enabled = this.zoomEnabled;
  46524. player$f.OverlayManager.show('all', true);
  46525. player$f.GLTFEditor.show('all', true);
  46526. player$f.cameraControls.cameras.panorama.staticFov = null;
  46527. if (this.panoB && this.panoB != this.panoA) {
  46528. this.panoB.exit();
  46529. this.panoB.useAtScreenB = false;
  46530. }
  46531. (_this$tileDownloader2 = this.tileDownloader2) === null || _this$tileDownloader2 === void 0 ? void 0 : _this$tileDownloader2.stop();
  46532. }
  46533. }, {
  46534. key: "setSceneB",
  46535. value: function setSceneB() {
  46536. //设置右屏
  46537. var oldPanoB = this.panoB;
  46538. if (settings$3.visions != 2) {
  46539. this.panoB = this.panoA;
  46540. this.cube.position.copy(this.panoB.position);
  46541. this.panoramaCam.position.copy(this.panoB.position);
  46542. } else if (this.panoB != this.panoA.assistPano) {
  46543. this.panoB = this.panoA.assistPano;
  46544. this.cube.position.copy(this.panoB.position);
  46545. this.panoramaCam.position.copy(this.panoB.position); //隐藏marker
  46546. /* if (!config.isMobile || this.editType != "measure") */
  46547. {
  46548. this.hideMarker && (this.hideMarker.visible = true);
  46549. this.hideMarker = this.panoA.marker;
  46550. this.hideMarker.visible = false;
  46551. }
  46552. }
  46553. this.getTextureForCube(this.panoB);
  46554. this.panoB.useAtScreenB = true;
  46555. if (oldPanoB && oldPanoB != this.panoB) {
  46556. oldPanoB.exit();
  46557. oldPanoB.useAtScreenB = false;
  46558. }
  46559. }
  46560. /*
  46561. 注意:当visions==2时,才有下相机assistPano,而下相机没有tile
  46562. */
  46563. }, {
  46564. key: "getTextureForCube",
  46565. value: function getTextureForCube(pano) {
  46566. var _this3 = this;
  46567. //获取右方贴图
  46568. console.log('getTextureForCube', pano.id);
  46569. var pano = pano || this.panoB;
  46570. if (settings$3.visions != 2 && player$f.model.supportsTiles) {
  46571. pano = panos2.index[pano.id]; //加载tiles贴图需要换成panos2的pano
  46572. }
  46573. /* var wait = player.checkAndWaitForPanoLoad(pano, 'high', 'high', 2048, () => {
  46574. //标准pc:2048
  46575. this.getTextureForCube(pano)
  46576. }) */
  46577. var loaded = function loaded() {
  46578. if (texWaitTimer[_this3.panoB.id]) {
  46579. clearTimeout(texWaitTimer[_this3.panoB.id]);
  46580. delete texWaitTimer[_this3.panoB.id];
  46581. }
  46582. if (pano && _this3.panoB.id != pano.id) {
  46583. console.log('getTextureForCube退出');
  46584. return;
  46585. } //可能加载好就退出或者换到别的点
  46586. console.log('texGetted', pano.id);
  46587. pano.ensureSkyboxReadyForRender();
  46588. var tex = pano.getSkyboxTexture();
  46589. _this3.cube.material.uniforms.pano1Map.value = tex;
  46590. _this3.cube.material.uniforms.pano1Matrix.value.copy(_this3.panoB.matrixWorld);
  46591. };
  46592. if (pano.tiled) {
  46593. //若无下相机,使用和左侧一样的漫游点(的copy), 是tiled
  46594. player$f.checkAndWaitForPanoLoad(pano, 'high', 'high', 512, function () {
  46595. loaded();
  46596. /* var d = cameraLight.getHFOVForCamera(player.camera, player.domElement.clientWidth / 2, player.domElement.clientHeight),
  46597. p = player.zoomFov,
  46598. r = player.getDirection()
  46599. var loadPromise = pano.loadTiledPano( 2048, r,
  46600. {
  46601. hFov: d,
  46602. vFov: p,
  46603. },
  46604. !1,
  46605. !1,
  46606. !0
  46607. )
  46608. loadPromise.then(() => {
  46609. loaded()
  46610. }) */
  46611. //改为用tilePrioritizer
  46612. });
  46613. } else {
  46614. //下相机都是单张贴图
  46615. player$f.checkAndWaitForPanoLoad(pano, 'high', 'high', 2048, function () {
  46616. loaded();
  46617. }); //修改位置时 右侧可能变黑 为何
  46618. }
  46619. /* if (!wait) {
  46620. if (texWaitTimer[this.panoB.id]) {
  46621. clearTimeout(texWaitTimer[this.panoB.id])
  46622. delete texWaitTimer[this.panoB.id]
  46623. }
  46624. if (pano && this.panoB.id != pano.id) {
  46625. console.log('getTextureForCube退出')
  46626. return
  46627. } //可能加载好就退出或者换到别的点
  46628. //$waiting.hide()
  46629. texGetted = true
  46630. console.log('texGetted ')
  46631. pano.ensureSkyboxReadyForRender()
  46632. var tex = pano.getSkyboxTexture()
  46633. this.cube.material.uniforms.pano1Map.value = tex
  46634. this.cube.material.uniforms.pano1Matrix.value.copy(this.panoB.matrixWorld)
  46635. } else {
  46636. if (!texWaitTimer[this.panoB.id]) {
  46637. //如果20秒后还没加载好贴图就停止
  46638. texWaitTimer[this.panoB.id] = setTimeout(() => {
  46639. //$waiting.hide()
  46640. clearTimeout(texWaitTimer[this.panoB.id])
  46641. delete texWaitTimer[this.panoB.id]
  46642. console.log('无法获取贴图,可能网络状态不佳')
  46643. }, 20e3)
  46644. }
  46645. //$waiting.show() // objects.gui.showWaiting(true, "getTextureForCube")
  46646. texGetted = false
  46647. } */
  46648. }
  46649. }, {
  46650. key: "update",
  46651. value: function update() {
  46652. //渲染右屏
  46653. if (!this.editing) return;
  46654. /* objects.tagManager.tagDiscs.forEach((disc) => {
  46655. if (!disc.visible || disc.material.uniforms.opacity.value == 0) return;
  46656. disc.canvasA_Qua = disc.quaternion.clone();
  46657. disc.canvasA_Scale = disc.scale.clone();
  46658. disc.tag.update(player.mode, panoramaCam, player.currentPano, player.flying)
  46659. }) */
  46660. renderer$1.render(this.$app.core.get('SceneRenderer').scene, this.panoramaCam);
  46661. /* objects.tagManager.tagDiscs.forEach((disc) => {
  46662. if (!disc.visible || disc.material.uniforms.opacity.value == 0) return;
  46663. disc.quaternion.copy(disc.canvasA_Qua)
  46664. disc.scale.copy(disc.canvasA_Scale)
  46665. }) */
  46666. }
  46667. }, {
  46668. key: "setSize",
  46669. value: function setSize() {
  46670. //右屏更改大小
  46671. if (!this.editing) return;
  46672. renderer$1.setSize(playerB.clientWidth, playerB.clientHeight, true, Math.min(window.devicePixelRatio, 2));
  46673. this.panoramaCam.updateAspect(playerB.clientWidth / playerB.clientHeight);
  46674. }
  46675. }, {
  46676. key: "changePano",
  46677. value: function changePano(pano) {
  46678. this.panoA = pano;
  46679. }
  46680. }]);
  46681. return SplitView;
  46682. }(EventEmitter);
  46683. var Preloaders = /*#__PURE__*/function () {
  46684. function Preloaders(model, player) {
  46685. _classCallCheck(this, Preloaders);
  46686. this.model = model;
  46687. this.panos = model.panos;
  46688. this.player = player;
  46689. this.retryMinimumTime = 1e4;
  46690. }
  46691. _createClass(Preloaders, [{
  46692. key: "start",
  46693. value: function start() {
  46694. this.loadNextPano(function (e) {
  46695. if (e) {
  46696. this.start();
  46697. } else {
  46698. logger$1.debug('No suitable pano loaded, waiting a little while before looking again');
  46699. setTimeout(function () {
  46700. this.start();
  46701. }.bind(this), 1e3);
  46702. }
  46703. }.bind(this));
  46704. }
  46705. }, {
  46706. key: "validLoadTarget",
  46707. value: function validLoadTarget(e) {
  46708. return e && !e.isLoaded('high') && Date.now() - e.failedLoadingAt > this.retryMinimumTime;
  46709. }
  46710. }, {
  46711. key: "listImagePanos",
  46712. value: function listImagePanos() {
  46713. var e = [],
  46714. t = this;
  46715. this.model.images.forEach(function (i) {
  46716. if (i.metadata && i.metadata.scan_id) {
  46717. var n = t.model.panos.get(i.metadata.scan_id);
  46718. n && !n.isLoaded('high') && e.push(n);
  46719. }
  46720. });
  46721. return e;
  46722. }
  46723. }, {
  46724. key: "loadNextPano",
  46725. value: function loadNextPano(e) {
  46726. var pano,
  46727. i,
  46728. n = this.model.waitQueue.filter(function (e) {
  46729. return e.object instanceof Panorama;
  46730. });
  46731. if (n.length > 0) {
  46732. pano = n[0].object;
  46733. logger$1.debug('Overrode pano selection: Flying to an unloaded pano ' + pano.id);
  46734. } else if (this.validLoadTarget(this.player.currentPano)) {
  46735. pano = this.player.currentPano;
  46736. logger$1.debug('Overrode pano selection: Currently at an unloaded pano ' + pano.id);
  46737. } else if (this.validLoadTarget(this.player.closestPano)) {
  46738. pano = this.player.closestPano;
  46739. logger$1.debug('Overrode pano selection: Hovering over an unloaded pano ' + pano.id);
  46740. } else if (this.player.mode === Viewmode$1.PANORAMA) {
  46741. 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())]);
  46742. pano && logger$1.debug('Normal pano selection: neighbor ' + pano.id);
  46743. }
  46744. if (pano) {
  46745. i = i || pano.isLoaded('low') ? 'high' : 'low';
  46746. logger$1.debug('Preloading ' + i + '-res pano ' + pano.id);
  46747. console.log('Preloading ' + i + '-res pano ' + pano.id);
  46748. pano.loadCube(i).done(e).fail(function () {
  46749. logger$1.warn('Failed preloading pano', pano.id, ', marking it as failed and forgetting it for a while'), e();
  46750. });
  46751. } else {
  46752. e && e(null);
  46753. }
  46754. }
  46755. }]);
  46756. return Preloaders;
  46757. }();
  46758. 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; } } }; }
  46759. 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); }
  46760. 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; }
  46761. var Shim = {};
  46762. var _geometryId = 0; // Geometry uses even numbers as Id
  46763. var _m1$3 = new THREE.Matrix4();
  46764. var _obj$1 = new THREE.Object3D();
  46765. var _offset$1 = new THREE.Vector3();
  46766. function Geometry() {
  46767. Object.defineProperty(this, 'id', {
  46768. value: _geometryId += 2
  46769. });
  46770. this.uuid = THREE.MathUtils.generateUUID();
  46771. this.name = '';
  46772. this.type = 'Geometry';
  46773. this.vertices = [];
  46774. this.colors = [];
  46775. this.faces = [];
  46776. this.faceVertexUvs = [[]];
  46777. this.morphTargets = [];
  46778. this.morphNormals = [];
  46779. this.skinWeights = [];
  46780. this.skinIndices = [];
  46781. this.lineDistances = [];
  46782. this.boundingBox = null;
  46783. this.boundingSphere = null; // update flags
  46784. this.elementsNeedUpdate = false;
  46785. this.verticesNeedUpdate = false;
  46786. this.uvsNeedUpdate = false;
  46787. this.normalsNeedUpdate = false;
  46788. this.colorsNeedUpdate = false;
  46789. this.lineDistancesNeedUpdate = false;
  46790. this.groupsNeedUpdate = false;
  46791. }
  46792. Geometry.prototype = Object.assign(Object.create(THREE.EventDispatcher.prototype), {
  46793. constructor: Geometry,
  46794. isGeometry: true,
  46795. applyMatrix4: function applyMatrix4(matrix) {
  46796. var normalMatrix = new THREE.Matrix3().getNormalMatrix(matrix);
  46797. for (var i = 0, il = this.vertices.length; i < il; i++) {
  46798. var vertex = this.vertices[i];
  46799. vertex.applyMatrix4(matrix);
  46800. }
  46801. for (var _i = 0, _il = this.faces.length; _i < _il; _i++) {
  46802. var face = this.faces[_i];
  46803. face.normal.applyMatrix3(normalMatrix).normalize();
  46804. for (var j = 0, jl = face.vertexNormals.length; j < jl; j++) {
  46805. face.vertexNormals[j].applyMatrix3(normalMatrix).normalize();
  46806. }
  46807. }
  46808. if (this.boundingBox !== null) {
  46809. this.computeBoundingBox();
  46810. }
  46811. if (this.boundingSphere !== null) {
  46812. this.computeBoundingSphere();
  46813. }
  46814. this.verticesNeedUpdate = true;
  46815. this.normalsNeedUpdate = true;
  46816. return this;
  46817. },
  46818. rotateX: function rotateX(angle) {
  46819. // rotate geometry around world x-axis
  46820. _m1$3.makeRotationX(angle);
  46821. this.applyMatrix4(_m1$3);
  46822. return this;
  46823. },
  46824. rotateY: function rotateY(angle) {
  46825. // rotate geometry around world y-axis
  46826. _m1$3.makeRotationY(angle);
  46827. this.applyMatrix4(_m1$3);
  46828. return this;
  46829. },
  46830. rotateZ: function rotateZ(angle) {
  46831. // rotate geometry around world z-axis
  46832. _m1$3.makeRotationZ(angle);
  46833. this.applyMatrix4(_m1$3);
  46834. return this;
  46835. },
  46836. translate: function translate(x, y, z) {
  46837. // translate geometry
  46838. _m1$3.makeTranslation(x, y, z);
  46839. this.applyMatrix4(_m1$3);
  46840. return this;
  46841. },
  46842. scale: function scale(x, y, z) {
  46843. // scale geometry
  46844. _m1$3.makeScale(x, y, z);
  46845. this.applyMatrix4(_m1$3);
  46846. return this;
  46847. },
  46848. lookAt: function lookAt(vector) {
  46849. _obj$1.lookAt(vector);
  46850. _obj$1.updateMatrix();
  46851. this.applyMatrix4(_obj$1.matrix);
  46852. return this;
  46853. },
  46854. fromBufferGeometry: function fromBufferGeometry(geometry) {
  46855. var scope = this;
  46856. var index = geometry.index !== null ? geometry.index : undefined;
  46857. var attributes = geometry.attributes;
  46858. if (attributes.position === undefined) {
  46859. console.error('THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion.');
  46860. return this;
  46861. }
  46862. var position = attributes.position;
  46863. var normal = attributes.normal;
  46864. var color = attributes.color;
  46865. var uv = attributes.uv;
  46866. var uv2 = attributes.uv2;
  46867. if (uv2 !== undefined) this.faceVertexUvs[1] = [];
  46868. for (var i = 0; i < position.count; i++) {
  46869. scope.vertices.push(new THREE.Vector3().fromBufferAttribute(position, i));
  46870. if (color !== undefined) {
  46871. scope.colors.push(new THREE.Color().fromBufferAttribute(color, i));
  46872. }
  46873. }
  46874. function addFace(a, b, c, materialIndex) {
  46875. var vertexColors = color === undefined ? [] : [scope.colors[a].clone(), scope.colors[b].clone(), scope.colors[c].clone()];
  46876. var vertexNormals = normal === undefined ? [] : [new THREE.Vector3().fromBufferAttribute(normal, a), new THREE.Vector3().fromBufferAttribute(normal, b), new THREE.Vector3().fromBufferAttribute(normal, c)];
  46877. var face = new Face3(a, b, c, vertexNormals, vertexColors, materialIndex);
  46878. scope.faces.push(face);
  46879. if (uv !== undefined) {
  46880. scope.faceVertexUvs[0].push([new THREE.Vector2().fromBufferAttribute(uv, a), new THREE.Vector2().fromBufferAttribute(uv, b), new THREE.Vector2().fromBufferAttribute(uv, c)]);
  46881. }
  46882. if (uv2 !== undefined) {
  46883. scope.faceVertexUvs[1].push([new THREE.Vector2().fromBufferAttribute(uv2, a), new THREE.Vector2().fromBufferAttribute(uv2, b), new THREE.Vector2().fromBufferAttribute(uv2, c)]);
  46884. }
  46885. }
  46886. var groups = geometry.groups;
  46887. if (groups.length > 0) {
  46888. for (var _i2 = 0; _i2 < groups.length; _i2++) {
  46889. var group = groups[_i2];
  46890. var start = group.start;
  46891. var count = group.count;
  46892. for (var j = start, jl = start + count; j < jl; j += 3) {
  46893. if (index !== undefined) {
  46894. addFace(index.getX(j), index.getX(j + 1), index.getX(j + 2), group.materialIndex);
  46895. } else {
  46896. addFace(j, j + 1, j + 2, group.materialIndex);
  46897. }
  46898. }
  46899. }
  46900. } else {
  46901. if (index !== undefined) {
  46902. for (var _i3 = 0; _i3 < index.count; _i3 += 3) {
  46903. addFace(index.getX(_i3), index.getX(_i3 + 1), index.getX(_i3 + 2));
  46904. }
  46905. } else {
  46906. for (var _i4 = 0; _i4 < position.count; _i4 += 3) {
  46907. addFace(_i4, _i4 + 1, _i4 + 2);
  46908. }
  46909. }
  46910. }
  46911. this.computeFaceNormals();
  46912. if (geometry.boundingBox !== null) {
  46913. this.boundingBox = geometry.boundingBox.clone();
  46914. }
  46915. if (geometry.boundingSphere !== null) {
  46916. this.boundingSphere = geometry.boundingSphere.clone();
  46917. }
  46918. return this;
  46919. },
  46920. center: function center() {
  46921. this.computeBoundingBox();
  46922. this.boundingBox.getCenter(_offset$1).negate();
  46923. this.translate(_offset$1.x, _offset$1.y, _offset$1.z);
  46924. return this;
  46925. },
  46926. normalize: function normalize() {
  46927. this.computeBoundingSphere();
  46928. var center = this.boundingSphere.center;
  46929. var radius = this.boundingSphere.radius;
  46930. var s = radius === 0 ? 1 : 1.0 / radius;
  46931. var matrix = new THREE.Matrix4();
  46932. matrix.set(s, 0, 0, -s * center.x, 0, s, 0, -s * center.y, 0, 0, s, -s * center.z, 0, 0, 0, 1);
  46933. this.applyMatrix4(matrix);
  46934. return this;
  46935. },
  46936. computeFaceNormals: function computeFaceNormals() {
  46937. var cb = new THREE.Vector3(),
  46938. ab = new THREE.Vector3();
  46939. for (var f = 0, fl = this.faces.length; f < fl; f++) {
  46940. var face = this.faces[f];
  46941. var vA = this.vertices[face.a];
  46942. var vB = this.vertices[face.b];
  46943. var vC = this.vertices[face.c];
  46944. cb.subVectors(vC, vB);
  46945. ab.subVectors(vA, vB);
  46946. cb.cross(ab);
  46947. cb.normalize();
  46948. face.normal.copy(cb);
  46949. }
  46950. },
  46951. computeVertexNormals: function computeVertexNormals() {
  46952. var areaWeighted = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
  46953. var vertices = new Array(this.vertices.length);
  46954. for (var v = 0, vl = this.vertices.length; v < vl; v++) {
  46955. vertices[v] = new THREE.Vector3();
  46956. }
  46957. if (areaWeighted) {
  46958. // vertex normals weighted by triangle areas
  46959. // http://www.iquilezles.org/www/articles/normals/normals.htm
  46960. var cb = new THREE.Vector3(),
  46961. ab = new THREE.Vector3();
  46962. for (var f = 0, fl = this.faces.length; f < fl; f++) {
  46963. var face = this.faces[f];
  46964. var vA = this.vertices[face.a];
  46965. var vB = this.vertices[face.b];
  46966. var vC = this.vertices[face.c];
  46967. cb.subVectors(vC, vB);
  46968. ab.subVectors(vA, vB);
  46969. cb.cross(ab);
  46970. vertices[face.a].add(cb);
  46971. vertices[face.b].add(cb);
  46972. vertices[face.c].add(cb);
  46973. }
  46974. } else {
  46975. this.computeFaceNormals();
  46976. for (var _f = 0, _fl = this.faces.length; _f < _fl; _f++) {
  46977. var _face = this.faces[_f];
  46978. vertices[_face.a].add(_face.normal);
  46979. vertices[_face.b].add(_face.normal);
  46980. vertices[_face.c].add(_face.normal);
  46981. }
  46982. }
  46983. for (var _v = 0, _vl = this.vertices.length; _v < _vl; _v++) {
  46984. vertices[_v].normalize();
  46985. }
  46986. for (var _f2 = 0, _fl2 = this.faces.length; _f2 < _fl2; _f2++) {
  46987. var _face2 = this.faces[_f2];
  46988. var vertexNormals = _face2.vertexNormals;
  46989. if (vertexNormals.length === 3) {
  46990. vertexNormals[0].copy(vertices[_face2.a]);
  46991. vertexNormals[1].copy(vertices[_face2.b]);
  46992. vertexNormals[2].copy(vertices[_face2.c]);
  46993. } else {
  46994. vertexNormals[0] = vertices[_face2.a].clone();
  46995. vertexNormals[1] = vertices[_face2.b].clone();
  46996. vertexNormals[2] = vertices[_face2.c].clone();
  46997. }
  46998. }
  46999. if (this.faces.length > 0) {
  47000. this.normalsNeedUpdate = true;
  47001. }
  47002. },
  47003. computeFlatVertexNormals: function computeFlatVertexNormals() {
  47004. this.computeFaceNormals();
  47005. for (var f = 0, fl = this.faces.length; f < fl; f++) {
  47006. var face = this.faces[f];
  47007. var vertexNormals = face.vertexNormals;
  47008. if (vertexNormals.length === 3) {
  47009. vertexNormals[0].copy(face.normal);
  47010. vertexNormals[1].copy(face.normal);
  47011. vertexNormals[2].copy(face.normal);
  47012. } else {
  47013. vertexNormals[0] = face.normal.clone();
  47014. vertexNormals[1] = face.normal.clone();
  47015. vertexNormals[2] = face.normal.clone();
  47016. }
  47017. }
  47018. if (this.faces.length > 0) {
  47019. this.normalsNeedUpdate = true;
  47020. }
  47021. },
  47022. computeMorphNormals: function computeMorphNormals() {
  47023. // save original normals
  47024. // - create temp variables on first access
  47025. // otherwise just copy (for faster repeated calls)
  47026. for (var f = 0, fl = this.faces.length; f < fl; f++) {
  47027. var face = this.faces[f];
  47028. if (!face.__originalFaceNormal) {
  47029. face.__originalFaceNormal = face.normal.clone();
  47030. } else {
  47031. face.__originalFaceNormal.copy(face.normal);
  47032. }
  47033. if (!face.__originalVertexNormals) face.__originalVertexNormals = [];
  47034. for (var i = 0, il = face.vertexNormals.length; i < il; i++) {
  47035. if (!face.__originalVertexNormals[i]) {
  47036. face.__originalVertexNormals[i] = face.vertexNormals[i].clone();
  47037. } else {
  47038. face.__originalVertexNormals[i].copy(face.vertexNormals[i]);
  47039. }
  47040. }
  47041. } // use temp geometry to compute face and vertex normals for each morph
  47042. var tmpGeo = new Geometry();
  47043. tmpGeo.faces = this.faces;
  47044. for (var _i5 = 0, _il2 = this.morphTargets.length; _i5 < _il2; _i5++) {
  47045. // create on first access
  47046. if (!this.morphNormals[_i5]) {
  47047. this.morphNormals[_i5] = {};
  47048. this.morphNormals[_i5].faceNormals = [];
  47049. this.morphNormals[_i5].vertexNormals = [];
  47050. var dstNormalsFace = this.morphNormals[_i5].faceNormals;
  47051. var dstNormalsVertex = this.morphNormals[_i5].vertexNormals;
  47052. for (var _f3 = 0, _fl3 = this.faces.length; _f3 < _fl3; _f3++) {
  47053. var faceNormal = new THREE.Vector3();
  47054. var vertexNormals = {
  47055. a: new THREE.Vector3(),
  47056. b: new THREE.Vector3(),
  47057. c: new THREE.Vector3()
  47058. };
  47059. dstNormalsFace.push(faceNormal);
  47060. dstNormalsVertex.push(vertexNormals);
  47061. }
  47062. }
  47063. var morphNormals = this.morphNormals[_i5]; // set vertices to morph target
  47064. tmpGeo.vertices = this.morphTargets[_i5].vertices; // compute morph normals
  47065. tmpGeo.computeFaceNormals();
  47066. tmpGeo.computeVertexNormals(); // store morph normals
  47067. for (var _f4 = 0, _fl4 = this.faces.length; _f4 < _fl4; _f4++) {
  47068. var _face3 = this.faces[_f4];
  47069. var _faceNormal = morphNormals.faceNormals[_f4];
  47070. var _vertexNormals = morphNormals.vertexNormals[_f4];
  47071. _faceNormal.copy(_face3.normal);
  47072. _vertexNormals.a.copy(_face3.vertexNormals[0]);
  47073. _vertexNormals.b.copy(_face3.vertexNormals[1]);
  47074. _vertexNormals.c.copy(_face3.vertexNormals[2]);
  47075. }
  47076. } // restore original normals
  47077. for (var _f5 = 0, _fl5 = this.faces.length; _f5 < _fl5; _f5++) {
  47078. var _face4 = this.faces[_f5];
  47079. _face4.normal = _face4.__originalFaceNormal;
  47080. _face4.vertexNormals = _face4.__originalVertexNormals;
  47081. }
  47082. },
  47083. computeBoundingBox: function computeBoundingBox() {
  47084. if (this.boundingBox === null) {
  47085. this.boundingBox = new THREE.Box3();
  47086. }
  47087. this.boundingBox.setFromPoints(this.vertices);
  47088. },
  47089. computeBoundingSphere: function computeBoundingSphere() {
  47090. if (this.boundingSphere === null) {
  47091. this.boundingSphere = new THREE.Sphere();
  47092. }
  47093. this.boundingSphere.setFromPoints(this.vertices);
  47094. },
  47095. merge: function merge(geometry, matrix) {
  47096. var materialIndexOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  47097. if (!(geometry && geometry.isGeometry)) {
  47098. console.error('THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry);
  47099. return;
  47100. }
  47101. var normalMatrix;
  47102. var vertexOffset = this.vertices.length,
  47103. vertices1 = this.vertices,
  47104. vertices2 = geometry.vertices,
  47105. faces1 = this.faces,
  47106. faces2 = geometry.faces,
  47107. colors1 = this.colors,
  47108. colors2 = geometry.colors;
  47109. if (matrix !== undefined) {
  47110. normalMatrix = new THREE.Matrix3().getNormalMatrix(matrix);
  47111. } // vertices
  47112. for (var i = 0, il = vertices2.length; i < il; i++) {
  47113. var vertex = vertices2[i];
  47114. var vertexCopy = vertex.clone();
  47115. if (matrix !== undefined) vertexCopy.applyMatrix4(matrix);
  47116. vertices1.push(vertexCopy);
  47117. } // colors
  47118. for (var _i6 = 0, _il3 = colors2.length; _i6 < _il3; _i6++) {
  47119. colors1.push(colors2[_i6].clone());
  47120. } // faces
  47121. for (var _i7 = 0, _il4 = faces2.length; _i7 < _il4; _i7++) {
  47122. var face = faces2[_i7];
  47123. var normal = void 0,
  47124. color = void 0;
  47125. var faceVertexNormals = face.vertexNormals,
  47126. faceVertexColors = face.vertexColors;
  47127. var faceCopy = new Face3(face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset);
  47128. faceCopy.normal.copy(face.normal);
  47129. if (normalMatrix !== undefined) {
  47130. faceCopy.normal.applyMatrix3(normalMatrix).normalize();
  47131. }
  47132. for (var j = 0, jl = faceVertexNormals.length; j < jl; j++) {
  47133. normal = faceVertexNormals[j].clone();
  47134. if (normalMatrix !== undefined) {
  47135. normal.applyMatrix3(normalMatrix).normalize();
  47136. }
  47137. faceCopy.vertexNormals.push(normal);
  47138. }
  47139. faceCopy.color.copy(face.color);
  47140. for (var _j = 0, _jl = faceVertexColors.length; _j < _jl; _j++) {
  47141. color = faceVertexColors[_j];
  47142. faceCopy.vertexColors.push(color.clone());
  47143. }
  47144. faceCopy.materialIndex = face.materialIndex + materialIndexOffset;
  47145. faces1.push(faceCopy);
  47146. } // uvs
  47147. for (var _i8 = 0, _il5 = geometry.faceVertexUvs.length; _i8 < _il5; _i8++) {
  47148. var faceVertexUvs2 = geometry.faceVertexUvs[_i8];
  47149. if (this.faceVertexUvs[_i8] === undefined) this.faceVertexUvs[_i8] = [];
  47150. for (var _j2 = 0, _jl2 = faceVertexUvs2.length; _j2 < _jl2; _j2++) {
  47151. var uvs2 = faceVertexUvs2[_j2],
  47152. uvsCopy = [];
  47153. for (var k = 0, kl = uvs2.length; k < kl; k++) {
  47154. uvsCopy.push(uvs2[k].clone());
  47155. }
  47156. this.faceVertexUvs[_i8].push(uvsCopy);
  47157. }
  47158. }
  47159. },
  47160. mergeMesh: function mergeMesh(mesh) {
  47161. if (!(mesh && mesh.isMesh)) {
  47162. console.error('THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh);
  47163. return;
  47164. }
  47165. if (mesh.matrixAutoUpdate) mesh.updateMatrix();
  47166. this.merge(mesh.geometry, mesh.matrix);
  47167. },
  47168. /*
  47169. * Checks for duplicate vertices with hashmap.
  47170. * Duplicated vertices are removed
  47171. * and faces' vertices are updated.
  47172. */
  47173. mergeVertices: function mergeVertices() {
  47174. var precisionPoints = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 4;
  47175. var verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)
  47176. var unique = [],
  47177. changes = [];
  47178. var precision = Math.pow(10, precisionPoints);
  47179. for (var i = 0, il = this.vertices.length; i < il; i++) {
  47180. var v = this.vertices[i];
  47181. var key = Math.round(v.x * precision) + '_' + Math.round(v.y * precision) + '_' + Math.round(v.z * precision);
  47182. if (verticesMap[key] === undefined) {
  47183. verticesMap[key] = i;
  47184. unique.push(this.vertices[i]);
  47185. changes[i] = unique.length - 1;
  47186. } else {
  47187. //console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);
  47188. changes[i] = changes[verticesMap[key]];
  47189. }
  47190. } // if faces are completely degenerate after merging vertices, we
  47191. // have to remove them from the geometry.
  47192. var faceIndicesToRemove = [];
  47193. for (var _i9 = 0, _il6 = this.faces.length; _i9 < _il6; _i9++) {
  47194. var face = this.faces[_i9];
  47195. face.a = changes[face.a];
  47196. face.b = changes[face.b];
  47197. face.c = changes[face.c];
  47198. var indices = [face.a, face.b, face.c]; // if any duplicate vertices are found in a Face3
  47199. // we have to remove the face as nothing can be saved
  47200. for (var n = 0; n < 3; n++) {
  47201. if (indices[n] === indices[(n + 1) % 3]) {
  47202. faceIndicesToRemove.push(_i9);
  47203. break;
  47204. }
  47205. }
  47206. }
  47207. for (var _i10 = faceIndicesToRemove.length - 1; _i10 >= 0; _i10--) {
  47208. var idx = faceIndicesToRemove[_i10];
  47209. this.faces.splice(idx, 1);
  47210. for (var j = 0, jl = this.faceVertexUvs.length; j < jl; j++) {
  47211. this.faceVertexUvs[j].splice(idx, 1);
  47212. }
  47213. } // Use unique set of vertices
  47214. var diff = this.vertices.length - unique.length;
  47215. this.vertices = unique;
  47216. return diff;
  47217. },
  47218. setFromPoints: function setFromPoints(points) {
  47219. this.vertices = [];
  47220. for (var i = 0, l = points.length; i < l; i++) {
  47221. var point = points[i];
  47222. this.vertices.push(new THREE.Vector3(point.x, point.y, point.z || 0));
  47223. }
  47224. return this;
  47225. },
  47226. sortFacesByMaterialIndex: function sortFacesByMaterialIndex() {
  47227. var faces = this.faces;
  47228. var length = faces.length; // tag faces
  47229. for (var i = 0; i < length; i++) {
  47230. faces[i]._id = i;
  47231. } // sort faces
  47232. function materialIndexSort(a, b) {
  47233. return a.materialIndex - b.materialIndex;
  47234. }
  47235. faces.sort(materialIndexSort); // sort uvs
  47236. var uvs1 = this.faceVertexUvs[0];
  47237. var uvs2 = this.faceVertexUvs[1];
  47238. var newUvs1, newUvs2;
  47239. if (uvs1 && uvs1.length === length) newUvs1 = [];
  47240. if (uvs2 && uvs2.length === length) newUvs2 = [];
  47241. for (var _i11 = 0; _i11 < length; _i11++) {
  47242. var id = faces[_i11]._id;
  47243. if (newUvs1) newUvs1.push(uvs1[id]);
  47244. if (newUvs2) newUvs2.push(uvs2[id]);
  47245. }
  47246. if (newUvs1) this.faceVertexUvs[0] = newUvs1;
  47247. if (newUvs2) this.faceVertexUvs[1] = newUvs2;
  47248. },
  47249. toJSON: function toJSON() {
  47250. var data = {
  47251. metadata: {
  47252. version: 4.5,
  47253. type: 'Geometry',
  47254. generator: 'Geometry.toJSON'
  47255. }
  47256. }; // standard Geometry serialization
  47257. data.uuid = this.uuid;
  47258. data.type = this.type;
  47259. if (this.name !== '') data.name = this.name;
  47260. if (this.parameters !== undefined) {
  47261. var parameters = this.parameters;
  47262. for (var key in parameters) {
  47263. if (parameters[key] !== undefined) data[key] = parameters[key];
  47264. }
  47265. return data;
  47266. }
  47267. var vertices = [];
  47268. for (var i = 0; i < this.vertices.length; i++) {
  47269. var vertex = this.vertices[i];
  47270. vertices.push(vertex.x, vertex.y, vertex.z);
  47271. }
  47272. var faces = [];
  47273. var normals = [];
  47274. var normalsHash = {};
  47275. var colors = [];
  47276. var colorsHash = {};
  47277. var uvs = [];
  47278. var uvsHash = {};
  47279. for (var _i12 = 0; _i12 < this.faces.length; _i12++) {
  47280. var face = this.faces[_i12];
  47281. var hasMaterial = true;
  47282. var hasFaceUv = false; // deprecated
  47283. var hasFaceVertexUv = this.faceVertexUvs[0][_i12] !== undefined;
  47284. var hasFaceNormal = face.normal.length() > 0;
  47285. var hasFaceVertexNormal = face.vertexNormals.length > 0;
  47286. var hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;
  47287. var hasFaceVertexColor = face.vertexColors.length > 0;
  47288. var faceType = 0;
  47289. faceType = setBit(faceType, 0, 0); // isQuad
  47290. faceType = setBit(faceType, 1, hasMaterial);
  47291. faceType = setBit(faceType, 2, hasFaceUv);
  47292. faceType = setBit(faceType, 3, hasFaceVertexUv);
  47293. faceType = setBit(faceType, 4, hasFaceNormal);
  47294. faceType = setBit(faceType, 5, hasFaceVertexNormal);
  47295. faceType = setBit(faceType, 6, hasFaceColor);
  47296. faceType = setBit(faceType, 7, hasFaceVertexColor);
  47297. faces.push(faceType);
  47298. faces.push(face.a, face.b, face.c);
  47299. faces.push(face.materialIndex);
  47300. if (hasFaceVertexUv) {
  47301. var faceVertexUvs = this.faceVertexUvs[0][_i12];
  47302. faces.push(getUvIndex(faceVertexUvs[0]), getUvIndex(faceVertexUvs[1]), getUvIndex(faceVertexUvs[2]));
  47303. }
  47304. if (hasFaceNormal) {
  47305. faces.push(getNormalIndex(face.normal));
  47306. }
  47307. if (hasFaceVertexNormal) {
  47308. var vertexNormals = face.vertexNormals;
  47309. faces.push(getNormalIndex(vertexNormals[0]), getNormalIndex(vertexNormals[1]), getNormalIndex(vertexNormals[2]));
  47310. }
  47311. if (hasFaceColor) {
  47312. faces.push(getColorIndex(face.color));
  47313. }
  47314. if (hasFaceVertexColor) {
  47315. var vertexColors = face.vertexColors;
  47316. faces.push(getColorIndex(vertexColors[0]), getColorIndex(vertexColors[1]), getColorIndex(vertexColors[2]));
  47317. }
  47318. }
  47319. function setBit(value, position, enabled) {
  47320. return enabled ? value | 1 << position : value & ~(1 << position);
  47321. }
  47322. function getNormalIndex(normal) {
  47323. var hash = normal.x.toString() + normal.y.toString() + normal.z.toString();
  47324. if (normalsHash[hash] !== undefined) {
  47325. return normalsHash[hash];
  47326. }
  47327. normalsHash[hash] = normals.length / 3;
  47328. normals.push(normal.x, normal.y, normal.z);
  47329. return normalsHash[hash];
  47330. }
  47331. function getColorIndex(color) {
  47332. var hash = color.r.toString() + color.g.toString() + color.b.toString();
  47333. if (colorsHash[hash] !== undefined) {
  47334. return colorsHash[hash];
  47335. }
  47336. colorsHash[hash] = colors.length;
  47337. colors.push(color.getHex());
  47338. return colorsHash[hash];
  47339. }
  47340. function getUvIndex(uv) {
  47341. var hash = uv.x.toString() + uv.y.toString();
  47342. if (uvsHash[hash] !== undefined) {
  47343. return uvsHash[hash];
  47344. }
  47345. uvsHash[hash] = uvs.length / 2;
  47346. uvs.push(uv.x, uv.y);
  47347. return uvsHash[hash];
  47348. }
  47349. data.data = {};
  47350. data.data.vertices = vertices;
  47351. data.data.normals = normals;
  47352. if (colors.length > 0) data.data.colors = colors;
  47353. if (uvs.length > 0) data.data.uvs = [uvs]; // temporal backward compatibility
  47354. data.data.faces = faces;
  47355. return data;
  47356. },
  47357. clone: function clone() {
  47358. return new Geometry().copy(this);
  47359. },
  47360. copy: function copy(source) {
  47361. // reset
  47362. this.vertices = [];
  47363. this.colors = [];
  47364. this.faces = [];
  47365. this.faceVertexUvs = [[]];
  47366. this.morphTargets = [];
  47367. this.morphNormals = [];
  47368. this.skinWeights = [];
  47369. this.skinIndices = [];
  47370. this.lineDistances = [];
  47371. this.boundingBox = null;
  47372. this.boundingSphere = null; // name
  47373. this.name = source.name; // vertices
  47374. var vertices = source.vertices;
  47375. for (var i = 0, il = vertices.length; i < il; i++) {
  47376. this.vertices.push(vertices[i].clone());
  47377. } // colors
  47378. var colors = source.colors;
  47379. for (var _i13 = 0, _il7 = colors.length; _i13 < _il7; _i13++) {
  47380. this.colors.push(colors[_i13].clone());
  47381. } // faces
  47382. var faces = source.faces;
  47383. for (var _i14 = 0, _il8 = faces.length; _i14 < _il8; _i14++) {
  47384. this.faces.push(faces[_i14].clone());
  47385. } // face vertex uvs
  47386. for (var _i15 = 0, _il9 = source.faceVertexUvs.length; _i15 < _il9; _i15++) {
  47387. var faceVertexUvs = source.faceVertexUvs[_i15];
  47388. if (this.faceVertexUvs[_i15] === undefined) {
  47389. this.faceVertexUvs[_i15] = [];
  47390. }
  47391. for (var j = 0, jl = faceVertexUvs.length; j < jl; j++) {
  47392. var uvs = faceVertexUvs[j],
  47393. uvsCopy = [];
  47394. for (var k = 0, kl = uvs.length; k < kl; k++) {
  47395. var uv = uvs[k];
  47396. uvsCopy.push(uv.clone());
  47397. }
  47398. this.faceVertexUvs[_i15].push(uvsCopy);
  47399. }
  47400. } // morph targets
  47401. var morphTargets = source.morphTargets;
  47402. for (var _i16 = 0, _il10 = morphTargets.length; _i16 < _il10; _i16++) {
  47403. var morphTarget = {};
  47404. morphTarget.name = morphTargets[_i16].name; // vertices
  47405. if (morphTargets[_i16].vertices !== undefined) {
  47406. morphTarget.vertices = [];
  47407. for (var _j3 = 0, _jl3 = morphTargets[_i16].vertices.length; _j3 < _jl3; _j3++) {
  47408. morphTarget.vertices.push(morphTargets[_i16].vertices[_j3].clone());
  47409. }
  47410. } // normals
  47411. if (morphTargets[_i16].normals !== undefined) {
  47412. morphTarget.normals = [];
  47413. for (var _j4 = 0, _jl4 = morphTargets[_i16].normals.length; _j4 < _jl4; _j4++) {
  47414. morphTarget.normals.push(morphTargets[_i16].normals[_j4].clone());
  47415. }
  47416. }
  47417. this.morphTargets.push(morphTarget);
  47418. } // morph normals
  47419. var morphNormals = source.morphNormals;
  47420. for (var _i17 = 0, _il11 = morphNormals.length; _i17 < _il11; _i17++) {
  47421. var morphNormal = {}; // vertex normals
  47422. if (morphNormals[_i17].vertexNormals !== undefined) {
  47423. morphNormal.vertexNormals = [];
  47424. for (var _j5 = 0, _jl5 = morphNormals[_i17].vertexNormals.length; _j5 < _jl5; _j5++) {
  47425. var srcVertexNormal = morphNormals[_i17].vertexNormals[_j5];
  47426. var destVertexNormal = {};
  47427. destVertexNormal.a = srcVertexNormal.a.clone();
  47428. destVertexNormal.b = srcVertexNormal.b.clone();
  47429. destVertexNormal.c = srcVertexNormal.c.clone();
  47430. morphNormal.vertexNormals.push(destVertexNormal);
  47431. }
  47432. } // face normals
  47433. if (morphNormals[_i17].faceNormals !== undefined) {
  47434. morphNormal.faceNormals = [];
  47435. for (var _j6 = 0, _jl6 = morphNormals[_i17].faceNormals.length; _j6 < _jl6; _j6++) {
  47436. morphNormal.faceNormals.push(morphNormals[_i17].faceNormals[_j6].clone());
  47437. }
  47438. }
  47439. this.morphNormals.push(morphNormal);
  47440. } // skin weights
  47441. var skinWeights = source.skinWeights;
  47442. for (var _i18 = 0, _il12 = skinWeights.length; _i18 < _il12; _i18++) {
  47443. this.skinWeights.push(skinWeights[_i18].clone());
  47444. } // skin indices
  47445. var skinIndices = source.skinIndices;
  47446. for (var _i19 = 0, _il13 = skinIndices.length; _i19 < _il13; _i19++) {
  47447. this.skinIndices.push(skinIndices[_i19].clone());
  47448. } // line distances
  47449. var lineDistances = source.lineDistances;
  47450. for (var _i20 = 0, _il14 = lineDistances.length; _i20 < _il14; _i20++) {
  47451. this.lineDistances.push(lineDistances[_i20]);
  47452. } // bounding box
  47453. var boundingBox = source.boundingBox;
  47454. if (boundingBox !== null) {
  47455. this.boundingBox = boundingBox.clone();
  47456. } // bounding sphere
  47457. var boundingSphere = source.boundingSphere;
  47458. if (boundingSphere !== null) {
  47459. this.boundingSphere = boundingSphere.clone();
  47460. } // update flags
  47461. this.elementsNeedUpdate = source.elementsNeedUpdate;
  47462. this.verticesNeedUpdate = source.verticesNeedUpdate;
  47463. this.uvsNeedUpdate = source.uvsNeedUpdate;
  47464. this.normalsNeedUpdate = source.normalsNeedUpdate;
  47465. this.colorsNeedUpdate = source.colorsNeedUpdate;
  47466. this.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;
  47467. this.groupsNeedUpdate = source.groupsNeedUpdate;
  47468. return this;
  47469. },
  47470. dispose: function dispose() {
  47471. this.dispatchEvent({
  47472. type: 'dispose'
  47473. });
  47474. }
  47475. });
  47476. Shim.Geometry = Geometry;
  47477. var DirectGeometry = /*#__PURE__*/function () {
  47478. function DirectGeometry() {
  47479. _classCallCheck(this, DirectGeometry);
  47480. this.vertices = [];
  47481. this.normals = [];
  47482. this.colors = [];
  47483. this.uvs = [];
  47484. this.uvs2 = [];
  47485. this.groups = [];
  47486. this.morphTargets = {};
  47487. this.skinWeights = [];
  47488. this.skinIndices = []; // this.lineDistances = [];
  47489. this.boundingBox = null;
  47490. this.boundingSphere = null; // update flags
  47491. this.verticesNeedUpdate = false;
  47492. this.normalsNeedUpdate = false;
  47493. this.colorsNeedUpdate = false;
  47494. this.uvsNeedUpdate = false;
  47495. this.groupsNeedUpdate = false;
  47496. }
  47497. _createClass(DirectGeometry, [{
  47498. key: "computeGroups",
  47499. value: function computeGroups(geometry) {
  47500. var groups = [];
  47501. var group, i;
  47502. var materialIndex = undefined;
  47503. var faces = geometry.faces;
  47504. for (i = 0; i < faces.length; i++) {
  47505. var face = faces[i]; // materials
  47506. if (face.materialIndex !== materialIndex) {
  47507. materialIndex = face.materialIndex;
  47508. if (group !== undefined) {
  47509. group.count = i * 3 - group.start;
  47510. groups.push(group);
  47511. }
  47512. group = {
  47513. start: i * 3,
  47514. materialIndex: materialIndex
  47515. };
  47516. }
  47517. }
  47518. if (group !== undefined) {
  47519. group.count = i * 3 - group.start;
  47520. groups.push(group);
  47521. }
  47522. this.groups = groups;
  47523. }
  47524. }, {
  47525. key: "fromGeometry",
  47526. value: function fromGeometry(geometry) {
  47527. var faces = geometry.faces;
  47528. var vertices = geometry.vertices;
  47529. var faceVertexUvs = geometry.faceVertexUvs;
  47530. var hasFaceVertexUv = faceVertexUvs[0] && faceVertexUvs[0].length > 0;
  47531. var hasFaceVertexUv2 = faceVertexUvs[1] && faceVertexUvs[1].length > 0; // morphs
  47532. var morphTargets = geometry.morphTargets;
  47533. var morphTargetsLength = morphTargets.length;
  47534. var morphTargetsPosition;
  47535. if (morphTargetsLength > 0) {
  47536. morphTargetsPosition = [];
  47537. for (var i = 0; i < morphTargetsLength; i++) {
  47538. morphTargetsPosition[i] = {
  47539. name: morphTargets[i].name,
  47540. data: []
  47541. };
  47542. }
  47543. this.morphTargets.position = morphTargetsPosition;
  47544. }
  47545. var morphNormals = geometry.morphNormals;
  47546. var morphNormalsLength = morphNormals.length;
  47547. var morphTargetsNormal;
  47548. if (morphNormalsLength > 0) {
  47549. morphTargetsNormal = [];
  47550. for (var _i21 = 0; _i21 < morphNormalsLength; _i21++) {
  47551. morphTargetsNormal[_i21] = {
  47552. name: morphNormals[_i21].name,
  47553. data: []
  47554. };
  47555. }
  47556. this.morphTargets.normal = morphTargetsNormal;
  47557. } // skins
  47558. var skinIndices = geometry.skinIndices;
  47559. var skinWeights = geometry.skinWeights;
  47560. var hasSkinIndices = skinIndices.length === vertices.length;
  47561. var hasSkinWeights = skinWeights.length === vertices.length; //
  47562. if (vertices.length > 0 && faces.length === 0) {
  47563. console.error('THREE.DirectGeometry: Faceless geometries are not supported.');
  47564. }
  47565. for (var _i22 = 0; _i22 < faces.length; _i22++) {
  47566. var face = faces[_i22];
  47567. this.vertices.push(vertices[face.a], vertices[face.b], vertices[face.c]);
  47568. var vertexNormals = face.vertexNormals;
  47569. if (vertexNormals.length === 3) {
  47570. this.normals.push(vertexNormals[0], vertexNormals[1], vertexNormals[2]);
  47571. } else {
  47572. var normal = face.normal;
  47573. this.normals.push(normal, normal, normal);
  47574. }
  47575. var vertexColors = face.vertexColors;
  47576. if (vertexColors.length === 3) {
  47577. this.colors.push(vertexColors[0], vertexColors[1], vertexColors[2]);
  47578. } else {
  47579. var color = face.color;
  47580. this.colors.push(color, color, color);
  47581. }
  47582. if (hasFaceVertexUv === true) {
  47583. var vertexUvs = faceVertexUvs[0][_i22];
  47584. if (vertexUvs !== undefined) {
  47585. this.uvs.push(vertexUvs[0], vertexUvs[1], vertexUvs[2]);
  47586. } else {
  47587. console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', _i22);
  47588. this.uvs.push(new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2());
  47589. }
  47590. }
  47591. if (hasFaceVertexUv2 === true) {
  47592. var _vertexUvs = faceVertexUvs[1][_i22];
  47593. if (_vertexUvs !== undefined) {
  47594. this.uvs2.push(_vertexUvs[0], _vertexUvs[1], _vertexUvs[2]);
  47595. } else {
  47596. console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', _i22);
  47597. this.uvs2.push(new THREE.Vector2(), new THREE.Vector2(), new THREE.Vector2());
  47598. }
  47599. } // morphs
  47600. for (var j = 0; j < morphTargetsLength; j++) {
  47601. var morphTarget = morphTargets[j].vertices;
  47602. morphTargetsPosition[j].data.push(morphTarget[face.a], morphTarget[face.b], morphTarget[face.c]);
  47603. }
  47604. for (var _j7 = 0; _j7 < morphNormalsLength; _j7++) {
  47605. var morphNormal = morphNormals[_j7].vertexNormals[_i22];
  47606. morphTargetsNormal[_j7].data.push(morphNormal.a, morphNormal.b, morphNormal.c);
  47607. } // skins
  47608. if (hasSkinIndices) {
  47609. this.skinIndices.push(skinIndices[face.a], skinIndices[face.b], skinIndices[face.c]);
  47610. }
  47611. if (hasSkinWeights) {
  47612. this.skinWeights.push(skinWeights[face.a], skinWeights[face.b], skinWeights[face.c]);
  47613. }
  47614. }
  47615. this.computeGroups(geometry);
  47616. this.verticesNeedUpdate = geometry.verticesNeedUpdate;
  47617. this.normalsNeedUpdate = geometry.normalsNeedUpdate;
  47618. this.colorsNeedUpdate = geometry.colorsNeedUpdate;
  47619. this.uvsNeedUpdate = geometry.uvsNeedUpdate;
  47620. this.groupsNeedUpdate = geometry.groupsNeedUpdate;
  47621. if (geometry.boundingSphere !== null) {
  47622. this.boundingSphere = geometry.boundingSphere.clone();
  47623. }
  47624. if (geometry.boundingBox !== null) {
  47625. this.boundingBox = geometry.boundingBox.clone();
  47626. }
  47627. return this;
  47628. }
  47629. }]);
  47630. return DirectGeometry;
  47631. }();
  47632. THREE.BufferGeometry.prototype.fromGeometry = function (geometry) {
  47633. geometry.__directGeometry = new DirectGeometry().fromGeometry(geometry);
  47634. return this.fromDirectGeometry(geometry.__directGeometry);
  47635. }, THREE.BufferGeometry.prototype.fromDirectGeometry = function (geometry) {
  47636. var positions = new Float32Array(geometry.vertices.length * 3);
  47637. this.setAttribute('position', new THREE.BufferAttribute(positions, 3).copyVector3sArray(geometry.vertices));
  47638. if (geometry.normals.length > 0) {
  47639. var normals = new Float32Array(geometry.normals.length * 3);
  47640. this.setAttribute('normal', new THREE.BufferAttribute(normals, 3).copyVector3sArray(geometry.normals));
  47641. }
  47642. if (geometry.colors.length > 0) {
  47643. var colors = new Float32Array(geometry.colors.length * 3);
  47644. this.setAttribute('color', new THREE.BufferAttribute(colors, 3).copyColorsArray(geometry.colors));
  47645. }
  47646. if (geometry.uvs.length > 0) {
  47647. var uvs = new Float32Array(geometry.uvs.length * 2);
  47648. this.setAttribute('uv', new THREE.BufferAttribute(uvs, 2).copyVector2sArray(geometry.uvs));
  47649. }
  47650. if (geometry.uvs2.length > 0) {
  47651. var uvs2 = new Float32Array(geometry.uvs2.length * 2);
  47652. this.setAttribute('uv2', new THREE.BufferAttribute(uvs2, 2).copyVector2sArray(geometry.uvs2));
  47653. } // groups
  47654. this.groups = geometry.groups; // morphs
  47655. for (var name in geometry.morphTargets) {
  47656. var array = [];
  47657. var morphTargets = geometry.morphTargets[name];
  47658. for (var i = 0, l = morphTargets.length; i < l; i++) {
  47659. var morphTarget = morphTargets[i];
  47660. var attribute = new Float32BufferAttribute(morphTarget.data.length * 3, 3);
  47661. attribute.name = morphTarget.name;
  47662. array.push(attribute.copyVector3sArray(morphTarget.data));
  47663. }
  47664. this.morphAttributes[name] = array;
  47665. } // skinning
  47666. if (geometry.skinIndices.length > 0) {
  47667. var skinIndices = new Float32BufferAttribute(geometry.skinIndices.length * 4, 4);
  47668. this.setAttribute('skinIndex', skinIndices.copyVector4sArray(geometry.skinIndices));
  47669. }
  47670. if (geometry.skinWeights.length > 0) {
  47671. var skinWeights = new Float32BufferAttribute(geometry.skinWeights.length * 4, 4);
  47672. this.setAttribute('skinWeight', skinWeights.copyVector4sArray(geometry.skinWeights));
  47673. } //
  47674. if (geometry.boundingSphere !== null) {
  47675. this.boundingSphere = geometry.boundingSphere.clone();
  47676. }
  47677. if (geometry.boundingBox !== null) {
  47678. this.boundingBox = geometry.boundingBox.clone();
  47679. }
  47680. return this;
  47681. };
  47682. var Face3 = /*#__PURE__*/function () {
  47683. function Face3(a, b, c, normal, color) {
  47684. var materialIndex = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
  47685. _classCallCheck(this, Face3);
  47686. this.a = a;
  47687. this.b = b;
  47688. this.c = c;
  47689. this.normal = normal && normal.isVector3 ? normal : new THREE.Vector3();
  47690. this.vertexNormals = Array.isArray(normal) ? normal : [];
  47691. this.color = color && color.isColor ? color : new THREE.Color();
  47692. this.vertexColors = Array.isArray(color) ? color : [];
  47693. this.materialIndex = materialIndex;
  47694. }
  47695. _createClass(Face3, [{
  47696. key: "clone",
  47697. value: function clone() {
  47698. return new this.constructor().copy(this);
  47699. }
  47700. }, {
  47701. key: "copy",
  47702. value: function copy(source) {
  47703. this.a = source.a;
  47704. this.b = source.b;
  47705. this.c = source.c;
  47706. this.normal.copy(source.normal);
  47707. this.color.copy(source.color);
  47708. this.materialIndex = source.materialIndex;
  47709. for (var i = 0, il = source.vertexNormals.length; i < il; i++) {
  47710. this.vertexNormals[i] = source.vertexNormals[i].clone();
  47711. }
  47712. for (var _i23 = 0, _il15 = source.vertexColors.length; _i23 < _il15; _i23++) {
  47713. this.vertexColors[_i23] = source.vertexColors[_i23].clone();
  47714. }
  47715. return this;
  47716. }
  47717. }]);
  47718. return Face3;
  47719. }();
  47720. Shim.Face3 = Face3;
  47721. THREE.Shim = Shim; //扩展
  47722. //export default Shim
  47723. //修改
  47724. THREE.EventDispatcher.prototype.addEventListener = function (type, listener) {
  47725. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  47726. _ref$importance = _ref.importance,
  47727. importance = _ref$importance === void 0 ? 0 : _ref$importance,
  47728. once = _ref.once;
  47729. //add importance
  47730. if (this._listeners === undefined) this._listeners = {};
  47731. var listeners = this._listeners;
  47732. if (listeners[type] === undefined) {
  47733. listeners[type] = [];
  47734. }
  47735. /* if(type == 'flyingDone'){
  47736. console.log('addEventListener flyingDone')
  47737. } */
  47738. if (!listeners[type].some(function (e) {
  47739. return e.listener == listener;
  47740. })) {
  47741. listeners[type].push({
  47742. listener,
  47743. importance,
  47744. once
  47745. });
  47746. listeners[type] = listeners[type].sort(function (e, a) {
  47747. return a.importance - e.importance;
  47748. }); //add
  47749. }
  47750. };
  47751. THREE.EventDispatcher.prototype.hasEventListener = function (type, listener) {
  47752. if (this._listeners === undefined) return false;
  47753. var listeners = this._listeners;
  47754. return listeners[type] !== undefined && listeners[type].some(function (e) {
  47755. return e.listener == listener;
  47756. });
  47757. };
  47758. THREE.EventDispatcher.prototype.removeEventListener = function (type, listener) {
  47759. if (this._listeners === undefined) return;
  47760. var listeners = this._listeners;
  47761. var listenerArray = listeners[type];
  47762. if (listenerArray !== undefined) {
  47763. /* const index = listenerArray.indexOf( listener );
  47764. if ( index !== - 1 ) {
  47765. listenerArray.splice( index, 1 );
  47766. } */
  47767. var item = listenerArray.find(function (e) {
  47768. return e.listener == listener;
  47769. });
  47770. item && listenerArray.splice(listenerArray.indexOf(item), 1);
  47771. }
  47772. };
  47773. THREE.EventDispatcher.prototype.removeEventListeners = function (type) {
  47774. //add
  47775. if (this._listeners && this._listeners[type] !== undefined) {
  47776. delete this._listeners[type];
  47777. }
  47778. };
  47779. THREE.EventDispatcher.prototype.removeAllListeners = function () {
  47780. //add
  47781. this._listeners = {};
  47782. };
  47783. THREE.EventDispatcher.prototype.dispatchEvent = function (event) {
  47784. if (typeof event == 'string') {
  47785. //add
  47786. event = {
  47787. type: event
  47788. };
  47789. }
  47790. if (this._listeners === undefined) return;
  47791. var listeners = this._listeners;
  47792. var listenerArray = listeners[event.type];
  47793. if (listenerArray !== undefined) {
  47794. event.target = this; // Make a copy, in case listeners are removed while iterating.
  47795. var _iterator = _createForOfIteratorHelper$7(listenerArray.slice(0)),
  47796. _step;
  47797. try {
  47798. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  47799. var _step$value = _step.value,
  47800. listener = _step$value.listener,
  47801. once = _step$value.once;
  47802. if (once) {
  47803. this.removeEventListener(event.type, listener);
  47804. }
  47805. var result = listener.call(this, event); //add stopContinue
  47806. if (result && result.stopContinue) {
  47807. break;
  47808. }
  47809. }
  47810. } catch (err) {
  47811. _iterator.e(err);
  47812. } finally {
  47813. _iterator.f();
  47814. }
  47815. }
  47816. };
  47817. THREE.EventDispatcher.prototype.traverse = function (callback) {
  47818. var result = callback(this);
  47819. if (result && result.stopContinue) {
  47820. //xzw add
  47821. return;
  47822. }
  47823. var children = this.children;
  47824. if (children) {
  47825. for (var i = 0, l = children.length; i < l; i++) {
  47826. children[i].traverse(callback);
  47827. }
  47828. }
  47829. };
  47830. THREE.Quaternion.prototype.toObject = function (e) {
  47831. return {
  47832. x: this.x,
  47833. y: this.y,
  47834. z: this.z,
  47835. w: this.w
  47836. };
  47837. };
  47838. THREE.Euler.prototype.toObject = function (addOrder) {
  47839. var euler = {
  47840. x: this.x,
  47841. y: this.y,
  47842. z: this.z
  47843. };
  47844. addOrder && (euler.order = this.order);
  47845. return euler;
  47846. };
  47847. THREE.Vector3.prototype.toObject = function () {
  47848. return {
  47849. x: this.x,
  47850. y: this.y,
  47851. z: this.z
  47852. };
  47853. };
  47854. THREE.Vector2.prototype.toObject = function () {
  47855. return {
  47856. x: this.x,
  47857. y: this.y
  47858. };
  47859. };
  47860. THREE.Object3D.prototype.traverse = function (callback, lastResult) {
  47861. var result = callback(this, lastResult); //lastResult一般用于收集祖先的visible
  47862. if (result && result.stopContinue) {
  47863. //xzw add
  47864. return;
  47865. }
  47866. var children = this.children;
  47867. for (var i = 0, l = children.length; i < l; i++) {
  47868. children[i] && children[i].traverse(callback, result);
  47869. }
  47870. };
  47871. THREE.Object3D.prototype.isChildOf = function (rootParent) {
  47872. //是否后代, 包括自身
  47873. var parent = this;
  47874. while (parent) {
  47875. if (parent == rootParent) {
  47876. return true;
  47877. }
  47878. parent = parent.parent;
  47879. }
  47880. };
  47881. THREE.Object3D.prototype.realVisible = function () {
  47882. var v = true;
  47883. var parent = this;
  47884. var lastParent;
  47885. while (parent) {
  47886. if (parent.visible === false) {
  47887. v = false;
  47888. break;
  47889. }
  47890. lastParent = parent;
  47891. parent = parent.parent;
  47892. }
  47893. if (v && !(lastParent instanceof THREE.Scene)) {
  47894. //已被删除
  47895. v = false;
  47896. }
  47897. return v;
  47898. };
  47899. THREE.Object3D.prototype.traverseVisible = function (callback) {
  47900. if (this.realVisible() == false) return; //改
  47901. callback(this);
  47902. var children = this.children;
  47903. for (var i = 0, l = children.length; i < l; i++) {
  47904. children[i].traverseVisible(callback);
  47905. }
  47906. };
  47907. THREE.Object3D.prototype.updateVisible = function () {
  47908. console.log(arguments);
  47909. common$1.updateVisible.apply(this, [this].concat(Array.prototype.slice.call(arguments)));
  47910. };
  47911. 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; } } }; }
  47912. 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); }
  47913. 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; }
  47914. defineComponent('Scene', function () {
  47915. return /*#__PURE__*/function () {
  47916. function Scene() {
  47917. _classCallCheck(this, Scene);
  47918. this.ready = false;
  47919. this.loaded = false;
  47920. this.tilegen = true; //应该放到setting里
  47921. this.quickstart = false;
  47922. this.position = new THREE.Vector3(15, 10, 15); //默认初始点位置
  47923. this.splitViews = []; //分屏
  47924. // if (this.$app.config.view === false) {
  47925. // this.locked = Deferred()
  47926. // this.$app.store.on('auth', () => {
  47927. // this.locked.resolve()
  47928. // })
  47929. // }
  47930. }
  47931. _createClass(Scene, [{
  47932. key: "beforeLoad",
  47933. value: function beforeLoad() {
  47934. this.$app.withComponent('Screenshot');
  47935. this.$app.withComponent('SceneRenderer');
  47936. this.$app.withComponent('PanoRenderer');
  47937. this.$app.withComponent('PanoVideoRenderer');
  47938. this.$app.withComponent('QualityManager');
  47939. this.$app.withComponent('ModelManager');
  47940. this.$app.withComponent('CameraControls');
  47941. this.$app.withComponent('DisplayController');
  47942. this.$app.withComponent('TileDownloader', {
  47943. concurrentDownloads: this.tilegen ? 6 : 2,
  47944. $app: this.$app
  47945. });
  47946. this.$app.withComponent('Player');
  47947. this.$app.withComponent('Director');
  47948. this.$app.core.get('SceneRenderer').createScene();
  47949. this.$app.core.get('CameraControls').init(this.$app.dom.querySelector('.player'));
  47950. this.$app.core.get('QualityManager').init();
  47951. this.$app.core.get('TileDownloader').init();
  47952. this.$app.core.get('PanoRenderer').init();
  47953. } //启动
  47954. }, {
  47955. key: "start",
  47956. value: function () {
  47957. var _start = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
  47958. var _this = this;
  47959. var auth, metadata, metadataForVideo, _iterator, _step, data, buildScene;
  47960. return regenerator.wrap(function _callee2$(_context2) {
  47961. while (1) {
  47962. switch (_context2.prev = _context2.next) {
  47963. case 0:
  47964. if (!this.ready) {
  47965. _context2.next = 2;
  47966. break;
  47967. }
  47968. return _context2.abrupt("return");
  47969. case 2:
  47970. if (!(this.$app.config.view === false && this.$app.config.useAuth)) {
  47971. _context2.next = 14;
  47972. break;
  47973. }
  47974. _context2.prev = 3;
  47975. _context2.next = 6;
  47976. return this.$app.resource.auth();
  47977. case 6:
  47978. auth = _context2.sent;
  47979. if (!(auth.success == false)) {
  47980. _context2.next = 9;
  47981. break;
  47982. }
  47983. return _context2.abrupt("return");
  47984. case 9:
  47985. _context2.next = 14;
  47986. break;
  47987. case 11:
  47988. _context2.prev = 11;
  47989. _context2.t0 = _context2["catch"](3);
  47990. return _context2.abrupt("return");
  47991. case 14:
  47992. console.log('start0----------');
  47993. _context2.next = 17;
  47994. return this.$app.resource.metadata();
  47995. case 17:
  47996. metadata = _context2.sent;
  47997. if (!(metadata == void 0)) {
  47998. _context2.next = 20;
  47999. break;
  48000. }
  48001. return _context2.abrupt("return");
  48002. case 20:
  48003. if (!(metadata.filters && metadata.filters == 1)) {
  48004. _context2.next = 23;
  48005. break;
  48006. }
  48007. _context2.next = 23;
  48008. return this.$app.store.get('filters');
  48009. case 23:
  48010. if (!(metadata.cutModel && metadata.cutModel == 1)) {
  48011. _context2.next = 27;
  48012. break;
  48013. }
  48014. _context2.next = 26;
  48015. return this.$app.store.get('cutModel');
  48016. case 26:
  48017. this.$app.store.getValue('metadata').cutModel = _context2.sent;
  48018. case 27:
  48019. // if (metadata.sceneDraw && metadata.sceneDraw == 1) {
  48020. // let data = await this.$app.store.get('sceneDraw')
  48021. // this.$app.store.getValue('metadata').sceneDraw = {
  48022. // data,
  48023. // labelVisible: this.$app.store.getValue('metadata').controls.showDrawTitle,
  48024. // }
  48025. // }
  48026. console.log('load0--------------------');
  48027. if (this.$app.store.getValue('metadata').controls.showAllModel === 1) {
  48028. ModelSide.setSide(2);
  48029. } else {
  48030. ModelSide.setSide(null);
  48031. }
  48032. this.beforeLoad(); // 判断是否需要锁住场景不继续加载
  48033. if (!this.$app.Scene.locked) {
  48034. _context2.next = 33;
  48035. break;
  48036. }
  48037. _context2.next = 33;
  48038. return this.$app.Scene.locked;
  48039. case 33:
  48040. // 判断你是否加载单张4k全景图
  48041. if (metadata.sceneKind && metadata.sceneKind == 'pano') {
  48042. this.$app.core.get('Player').model.supportsTiles = false;
  48043. } //是否加载tile图片
  48044. // if (this.$app.core.get('Player').model.supportsTiles)
  48045. this.$app.core.get('TileDownloader').start();
  48046. metadataForVideo = JSON.parse(JSON.stringify(metadata));
  48047. _context2.next = 38;
  48048. return VersionControl.handle(metadataForVideo, this.$app);
  48049. case 38:
  48050. this.$app.core.get('PanoVideoRenderer').init(metadataForVideo.videos);
  48051. /**
  48052. * 加载paint图片
  48053. */
  48054. // console.error("start load", new Date().getTime())
  48055. if (!(metadata.mosaic && metadata.mosaicList && metadata.mosaicList.length)) {
  48056. _context2.next = 59;
  48057. break;
  48058. }
  48059. _iterator = _createForOfIteratorHelper$6(metadata.mosaicList);
  48060. _context2.prev = 41;
  48061. _iterator.s();
  48062. case 43:
  48063. if ((_step = _iterator.n()).done) {
  48064. _context2.next = 51;
  48065. break;
  48066. }
  48067. data = _step.value;
  48068. _context2.t1 = data.fileName;
  48069. if (!_context2.t1) {
  48070. _context2.next = 49;
  48071. break;
  48072. }
  48073. _context2.next = 49;
  48074. return texture.loadWithoutUpdate(this.$app.resource.getUserResourceURL(data.fileName));
  48075. case 49:
  48076. _context2.next = 43;
  48077. break;
  48078. case 51:
  48079. _context2.next = 56;
  48080. break;
  48081. case 53:
  48082. _context2.prev = 53;
  48083. _context2.t2 = _context2["catch"](41);
  48084. _iterator.e(_context2.t2);
  48085. case 56:
  48086. _context2.prev = 56;
  48087. _iterator.f();
  48088. return _context2.finish(56);
  48089. case 59:
  48090. _context2.next = 61;
  48091. return this.$app.resource.visions();
  48092. case 61:
  48093. //步骤1
  48094. this.initPanos(metadata); //解析漫游点,步骤1的延伸
  48095. this.$app.FilterManager.initFilters(); // 初始化滤镜数据
  48096. _context2.next = 65;
  48097. return this.isQuick(metadata);
  48098. case 65:
  48099. //步骤2 Quick Start
  48100. /**
  48101. * 基础资源已准备完毕
  48102. */
  48103. this.$app.Scene.emit('ready');
  48104. this.ready = true;
  48105. buildScene = /*#__PURE__*/function () {
  48106. var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  48107. return regenerator.wrap(function _callee$(_context) {
  48108. while (1) {
  48109. switch (_context.prev = _context.next) {
  48110. case 0:
  48111. console.log('buildScene--------------------'); //await this.$app.resource.floorcad()
  48112. _context.next = 3;
  48113. return _this.$app.resource.flooruser();
  48114. case 3:
  48115. _this.$app.core.get('SceneRenderer').addComponent(transitions$1); //将加载的模型构建好以便于直接使用
  48116. _this.$app.core.get('Player').model.build();
  48117. _this.afterLoad();
  48118. if (!_this.$app.core.get('Player').model.supportsTiles) {
  48119. new Preloaders(_this.$app.core.get('Player').model, _this.$app.core.get('Player')).start();
  48120. }
  48121. _context.next = 9;
  48122. return _this.loadPanos();
  48123. case 9:
  48124. case "end":
  48125. return _context.stop();
  48126. }
  48127. }
  48128. }, _callee);
  48129. }));
  48130. return function buildScene() {
  48131. return _ref.apply(this, arguments);
  48132. };
  48133. }();
  48134. console.log('load2--------------------', this.$app.config.isRouteSnap);
  48135. /* if(this.$app.config.isRouteSnap){//xzw add
  48136. console.log('load3--------------------')
  48137. this.$app.core.get('SceneRenderer').addComponent(transitions)
  48138. this.afterLoad()
  48139. this.$app.Scene.emit('loaded')
  48140. }else */
  48141. if (!(metadata.modelKind === '3dtiles')) {
  48142. _context2.next = 75;
  48143. break;
  48144. }
  48145. _context2.next = 72;
  48146. return this.$app.resource.modelmesh3dTiles();
  48147. case 72:
  48148. //步骤3
  48149. this.$app.Scene.on('3dTilesLoaded', buildScene);
  48150. _context2.next = 81;
  48151. break;
  48152. case 75:
  48153. _context2.next = 77;
  48154. return this.$app.resource.modelmeshDam();
  48155. case 77:
  48156. _context2.next = 79;
  48157. return this.$app.resource.textures();
  48158. case 79:
  48159. _context2.next = 81;
  48160. return buildScene();
  48161. case 81:
  48162. case "end":
  48163. return _context2.stop();
  48164. }
  48165. }
  48166. }, _callee2, this, [[3, 11], [41, 53, 56, 59]]);
  48167. }));
  48168. function start() {
  48169. return _start.apply(this, arguments);
  48170. }
  48171. return start;
  48172. }()
  48173. }, {
  48174. key: "isQuick",
  48175. value: function () {
  48176. var _isQuick = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(metadata) {
  48177. return regenerator.wrap(function _callee3$(_context3) {
  48178. while (1) {
  48179. switch (_context3.prev = _context3.next) {
  48180. case 0:
  48181. if (!this.firstView.quickstart) {
  48182. _context3.next = 3;
  48183. break;
  48184. }
  48185. _context3.next = 3;
  48186. return this.quickEnter(this.firstView, metadata
  48187. /* , startOption */
  48188. );
  48189. case 3:
  48190. case "end":
  48191. return _context3.stop();
  48192. }
  48193. }
  48194. }, _callee3, this);
  48195. }));
  48196. function isQuick(_x) {
  48197. return _isQuick.apply(this, arguments);
  48198. }
  48199. return isQuick;
  48200. }()
  48201. }, {
  48202. key: "loadPanos",
  48203. value: function () {
  48204. var _loadPanos = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5() {
  48205. var _this2 = this;
  48206. var loadData;
  48207. return regenerator.wrap(function _callee5$(_context5) {
  48208. while (1) {
  48209. switch (_context5.prev = _context5.next) {
  48210. case 0:
  48211. _context5.next = 2;
  48212. return this.$app.core.get('Player').start(this.firstView);
  48213. case 2:
  48214. if (this.firstView.quickstart) {
  48215. this.$app.core.get('SceneRenderer').removeComponent(this.$app.core.get('QuickstartManager'));
  48216. this.$app.core.get('QuickstartManager').destroy();
  48217. } // 第一个点位加载完后执行
  48218. this.loaded = true;
  48219. this.$app.Scene.emit('loaded', this.$app.core.get('Player').currentPano); //-------这两个争取addComponent在最后-------
  48220. this.$app.core.get('TileDownloader').useComponent();
  48221. this.$app.core.get('SceneRenderer').addComponent(this.$app.core.get('PanoRenderer'), true); //------------------------------------------
  48222. loadData = /*#__PURE__*/function () {
  48223. var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4() {
  48224. return regenerator.wrap(function _callee4$(_context4) {
  48225. while (1) {
  48226. switch (_context4.prev = _context4.next) {
  48227. case 0:
  48228. _context4.next = 2;
  48229. return _this2.$app.store.get('tags');
  48230. case 2:
  48231. _context4.next = 4;
  48232. return _this2.$app.store.get('tours');
  48233. case 4:
  48234. _context4.next = 6;
  48235. return _this2.$app.store.get('links');
  48236. case 6:
  48237. _context4.next = 8;
  48238. return _this2.$app.store.get('cameras');
  48239. case 8:
  48240. _context4.next = 10;
  48241. return _this2.$app.store.get('billboards');
  48242. case 10:
  48243. _context4.next = 12;
  48244. return _this2.$app.store.get('cutModel');
  48245. case 12:
  48246. _context4.next = 14;
  48247. return _this2.$app.store.get('sceneDraw');
  48248. case 14:
  48249. _context4.next = 16;
  48250. return _this2.$app.store.get('traces');
  48251. case 16:
  48252. // await this.$app.store.get('filters')
  48253. // await this.$app.store.get('mosaics')
  48254. _this2.$app.Scene.emit('loadeddata');
  48255. case 17:
  48256. case "end":
  48257. return _context4.stop();
  48258. }
  48259. }
  48260. }, _callee4);
  48261. }));
  48262. return function loadData() {
  48263. return _ref2.apply(this, arguments);
  48264. };
  48265. }(); // TRANSITIONING时loadData会造成动画卡顿
  48266. if (!(this.$app.core.get('Player').mode !== Viewmode$1.TRANSITIONING)) {
  48267. _context5.next = 13;
  48268. break;
  48269. }
  48270. _context5.next = 11;
  48271. return loadData();
  48272. case 11:
  48273. _context5.next = 14;
  48274. break;
  48275. case 13:
  48276. this.$app.Camera.once('mode.afterChange', loadData);
  48277. case 14:
  48278. setTimeout(function () {
  48279. logSth(_this2.$app);
  48280. }, 2000);
  48281. case 15:
  48282. case "end":
  48283. return _context5.stop();
  48284. }
  48285. }
  48286. }, _callee5, this);
  48287. }));
  48288. function loadPanos() {
  48289. return _loadPanos.apply(this, arguments);
  48290. }
  48291. return loadPanos;
  48292. }()
  48293. }, {
  48294. key: "initPanos",
  48295. value: function initPanos(metadata) {
  48296. this.startSceneRenderer();
  48297. var model = this.$app.core.get('Player').model;
  48298. this.$app.core.get('ModelManager').init();
  48299. this.$app.core.get('ModelManager').addModel(model);
  48300. this.firstView = new FirstView(metadata, model.panos);
  48301. this.firstView.quickstart = true;
  48302. }
  48303. }, {
  48304. key: "afterLoad",
  48305. value: function afterLoad() {
  48306. this.$app.core.get('SceneRenderer').scene.add(this.$app.core.get('Player').model);
  48307. this.$app.core.get('Player').init();
  48308. this.$app.core.get('Player').setScene();
  48309. this.$app.core.get('DisplayController').init();
  48310. effects$1.bindEvents(this.$app.core.get('Player'));
  48311. this.$app.core.get('SceneRenderer').addComponent(this.$app.core.get('Player'));
  48312. 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'));
  48313. }
  48314. }, {
  48315. key: "startSceneRenderer",
  48316. value: function startSceneRenderer() {
  48317. if (this.$app.core.get('SceneRenderer').started) return;
  48318. try {
  48319. this.$app.core.get('SceneRenderer').start(this.$app.dom.querySelector('.player'));
  48320. } catch (msg) {
  48321. logger$1.error(msg.message);
  48322. } // 单实例才允许VR
  48323. if (this.$app.uid == 1 && this.$app.config.mobile) {
  48324. VR$1.Init(this.$app.core.get('SceneRenderer'), this.$app.core.get('Player'));
  48325. }
  48326. }
  48327. }, {
  48328. key: "quickEnter",
  48329. value: function () {
  48330. var _quickEnter = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee6(firstView, metadata) {
  48331. var _this3 = this;
  48332. var control, quickstartManager;
  48333. return regenerator.wrap(function _callee6$(_context6) {
  48334. while (1) {
  48335. switch (_context6.prev = _context6.next) {
  48336. case 0:
  48337. //logger.warn('Quickstart engaged. Hold on to your knickers.')
  48338. //var control = this.$app.core.get('CameraControls').controls[Viewmode.PANORAMA]
  48339. this.$app.core.get('CameraControls').activateControls(Viewmode$1.PANORAMA);
  48340. control = this.$app.core.get('CameraControls').controls[Viewmode$1.PANORAMA];
  48341. this.$app.withComponent('QuickstartManager', this.$app.core.get('QualityManager'), this.$app.core.get('SceneRenderer').scene, this.$app.core.get('SceneRenderer').camera, control);
  48342. quickstartManager = this.$app.core.get('QuickstartManager'); //quickstartManager.init(firstView, metadata)
  48343. _context6.next = 6;
  48344. return quickstartManager.load(firstView);
  48345. case 6:
  48346. this.$app.core.get('SceneRenderer').addComponent(quickstartManager);
  48347. this.$app.core.get('SceneRenderer').once(SceneRendererEvents.AfterRender, function () {
  48348. logger$1.info("".concat(_this3.$app.config.num, "First render after quickstart load finished."));
  48349. });
  48350. case 8:
  48351. case "end":
  48352. return _context6.stop();
  48353. }
  48354. }
  48355. }, _callee6, this);
  48356. }));
  48357. function quickEnter(_x2, _x3) {
  48358. return _quickEnter.apply(this, arguments);
  48359. }
  48360. return quickEnter;
  48361. }()
  48362. /**
  48363. * 拆分
  48364. */
  48365. }, {
  48366. key: "getSplit",
  48367. value: function () {
  48368. var _getSplit = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee7(editType, split) {
  48369. return regenerator.wrap(function _callee7$(_context7) {
  48370. while (1) {
  48371. switch (_context7.prev = _context7.next) {
  48372. case 0:
  48373. this.$app.dom.classList.add('kankan-app__split');
  48374. _context7.prev = 1;
  48375. _context7.next = 4;
  48376. return this.$app.resource.visions2();
  48377. case 4:
  48378. _context7.next = 9;
  48379. break;
  48380. case 6:
  48381. _context7.prev = 6;
  48382. _context7.t0 = _context7["catch"](1);
  48383. logger$1.warn("".concat(this.$app.config.num, "[load visions2] fail"));
  48384. case 9:
  48385. //splitViews由许钟文定义
  48386. if (!this.splitViews[editType]) {
  48387. this.splitViews[editType] = new SplitView(this.$app, editType);
  48388. }
  48389. split && this.splitViews[editType].enter();
  48390. return _context7.abrupt("return", this.splitViews[editType]);
  48391. case 12:
  48392. case "end":
  48393. return _context7.stop();
  48394. }
  48395. }
  48396. }, _callee7, this, [[1, 6]]);
  48397. }));
  48398. function getSplit(_x4, _x5) {
  48399. return _getSplit.apply(this, arguments);
  48400. }
  48401. return getSplit;
  48402. }()
  48403. /**
  48404. * 还原
  48405. */
  48406. }, {
  48407. key: "restore",
  48408. value: function restore(editType) {
  48409. this.$app.dom.classList.remove('kankan-app__split');
  48410. this.splitViews[editType].leave();
  48411. }
  48412. }]);
  48413. return Scene;
  48414. }();
  48415. });
  48416. function logSth(app) {
  48417. var _app$TagManager$tagsI;
  48418. var player = app.core.get('Player');
  48419. var tagCount = ((_app$TagManager$tagsI = app.TagManager.tagsInitial) === null || _app$TagManager$tagsI === void 0 ? void 0 : _app$TagManager$tagsI.length) || 0;
  48420. var chunkLen = player.model.chunks.length;
  48421. var vertexC = player.model.chunks.reduce(function (total, chunk) {
  48422. return total + chunk.geometry.attributes.position.count;
  48423. }, 0);
  48424. var texSizeBlock = player.model.texSizeBlock;
  48425. var panoCount = player.model.panos.list.length;
  48426. var videoPanoCount = player.model.panos.list.filter(function (p) {
  48427. return p.hasVideo;
  48428. }).length;
  48429. var overlayCount = player.OverlayManager.list.length;
  48430. var overlayVideoCount = player.OverlayManager.list.filter(function (e) {
  48431. return e.info.type == 'video';
  48432. }).length;
  48433. var views = Object.keys(player.viewLinkManager.views);
  48434. var viewLinkCount = views.length;
  48435. var viewPanoLinkCount = views.filter(function (e) {
  48436. return player.viewLinkManager.views[e].linkType == 'pano';
  48437. }).length;
  48438. 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');
  48439. }
  48440. /**
  48441. * 解压采用protobuf的方式压缩的文件,比如:dam,vision.modeldata
  48442. */
  48443. var Deompress = {
  48444. damPro: Base64.decode('bWVzc2FnZSBiaW5hcnlfbWVzaCB7CglyZXBlYXRlZCBjaHVua19zaW1wbGUgY2h1bmsgPSAxOwoJcmVwZWF0ZWQgY2h1bmtfcXVhbnRpemVkIHF1YW50aXplZF9jaHVuayA9IDI7Cn0KCi8vIERlZmluaXRpb24gb2YgdmVydGljZXM6IDNEIGNvb3JkaW5hdGVzLCBhbmQgMkQgdGV4dHVyZSBjb29yZGluYXRlcy4KbWVzc2FnZSB2ZXJ0aWNlc19zaW1wbGUgewoJcmVwZWF0ZWQgZmxvYXQgeHl6ID0gMSBbcGFja2VkPXRydWVdOyAgLy8geF8wLHlfMCx6XzAsIHhfMSx5XzEsel8xLCAuLi4KCXJlcGVhdGVkIGZsb2F0IHV2ID0gMiBbcGFja2VkPXRydWVdOyAgLy8gdV8wLHZfMCwgdV8xLHZfMSwgLi4uCn0KCi8vIEluZGV4ZXMgb2YgdmVydGljZXMgb2YgZmFjZXMKbWVzc2FnZSBmYWNlc19zaW1wbGUgewoJcmVwZWF0ZWQgdWludDMyIGZhY2VzID0gMSBbcGFja2VkPXRydWVdOyAvLyBpMDAsaTAxLGkwMiwgaTEwLGkxMSxpMTIsIC4uLgp9CgovLyBBIHNpbXBseSBlbmNvZGVkIGNodW5rLgovLyBUT0RPOiBhZGQgY2h1bmsgcHJvcGVyaXRlcyAoc3VjaCBhcyAicmVmbGVjdGl2ZSIpCm1lc3NhZ2UgY2h1bmtfc2ltcGxlIHsKCW9wdGlvbmFsIHZlcnRpY2VzX3NpbXBsZSB2ZXJ0aWNlcyA9IDE7CglvcHRpb25hbCBmYWNlc19zaW1wbGUgZmFjZXMgPSAyOwoJb3B0aW9uYWwgc3RyaW5nIGNodW5rX25hbWUgPSAzOwoJb3B0aW9uYWwgc3RyaW5nIG1hdGVyaWFsX25hbWUgPSA0Owp9CgovLyBRdWFudGl6ZWQgdmVyc2lvbnMgZm9sbG93OgptZXNzYWdlIHZlcnRpY2VzX3F1YW50aXplZCB7CglvcHRpb25hbCBmbG9hdCBxdWFudGl6YXRpb24gPSAxOwoJcmVwZWF0ZWQgZmxvYXQgdHJhbnNsYXRpb24gPSAyOwoJcmVwZWF0ZWQgc2ludDMyIHggPSAzIFtwYWNrZWQ9dHJ1ZV07CglyZXBlYXRlZCBzaW50MzIgeSA9IDQgW3BhY2tlZD10cnVlXTsKCXJlcGVhdGVkIHNpbnQzMiB6ID0gNSBbcGFja2VkPXRydWVdOwp9CgptZXNzYWdlIHV2X3F1YW50aXplZCB7CglvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CglvcHRpb25hbCBmbG9hdCBxdWFudGl6YXRpb24gPSAyOwoJcmVwZWF0ZWQgc2ludDMyIHUgPSAzIFtwYWNrZWQ9dHJ1ZV07CglyZXBlYXRlZCBzaW50MzIgdiA9IDQgW3BhY2tlZD10cnVlXTsKfQoKLy8gSW5kZXhlcyBvZiB2ZXJ0aWNlcyBvZiBmYWNlcwptZXNzYWdlIGZhY2VzX2NvbXByZXNzZWQgewoJcmVwZWF0ZWQgc2ludDMyIGZhY2VzID0gMSBbcGFja2VkPXRydWVdOyAvLyBpMDAsaTAxLGkwMiwgaTEwLGkxMSxpMTIsIC4uLgp9CgptZXNzYWdlIGNodW5rX3F1YW50aXplZCB7CglvcHRpb25hbCBzdHJpbmcgY2h1bmtfbmFtZSA9IDE7CglvcHRpb25hbCBzdHJpbmcgbWF0ZXJpYWxfbmFtZSA9IDI7CglvcHRpb25hbCB2ZXJ0aWNlc19xdWFudGl6ZWQgdmVydGljZXMgPSAzOwoJcmVwZWF0ZWQgdXZfcXVhbnRpemVkIHV2cyA9IDQ7CglvcHRpb25hbCBmYWNlc19zaW1wbGUgZmFjZXMgPSA1Owp9Cg=='),
  48445. visionmodeldataPro: Base64.decode( //'Ly8KLy8gUHJvdG9jb2wgQnVmZmVyIGZvciBwdWNrIHZpc2liaWxpdHkgYW5kIHJlbGF0ZWQgZGF0YQovLwovL3BhY2thZ2UgZW9zLnN0b3JhZ2U7CgovLyBpbXBvcnQgImVvcy9pbmZyYS9jb21tb24ucHJvdG8iOwovLyBUaGUgZm9sbG93aW5nIHdlcmUgbWFudWFsbHkgZXh0cmFjdGVkIGhlcmUsIEpTIGRvZXMgbm90IGxpa2UgcHJvdG9idWYgaW1wb3J0cwoKbWVzc2FnZSBBZmZpbmUzZiB7CglvcHRpb25hbCBRdWF0ZXJuaW9uZiByb3RhdGlvbiA9IDE7CglvcHRpb25hbCBWZWN0b3IzZiB0cmFuc2xhdGlvbiA9IDI7Cn0KCm1lc3NhZ2UgUXVhdGVybmlvbmYgewoJb3B0aW9uYWwgZmxvYXQgdyA9IDE7CglvcHRpb25hbCBmbG9hdCB4ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHkgPSAzOwoJb3B0aW9uYWwgZmxvYXQgeiA9IDQ7Cn0KCm1lc3NhZ2UgVmVjdG9yM2YgewoJb3B0aW9uYWwgZmxvYXQgeCA9IDE7CglvcHRpb25hbCBmbG9hdCB5ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHogPSAzOwp9CgovLwovLyBPbmUgc3dlZXAgLyBwYW5vCi8vCm1lc3NhZ2UgU3dlZXBMb2NhdGlvbiB7CglvcHRpb25hbCBieXRlcyB1dWlkID0gMTsgIC8qIHV1aWQgKi8KCW9wdGlvbmFsIEFmZmluZTNmIHBvc2UgPSAyOyAgLyogY2FtZXJhIHBvc2UgKHgsIHkseikgaW4gbWV0ZXIgYW5kIGEgcXVhdGVybmlvbiovCglvcHRpb25hbCBWZWN0b3IzZiBwdWNrID0gMzsgIC8qIHB1Y2sgbG9jYXRpb24gLSB4IGFueSBpcyBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgcG9zZSwgeiBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBjbG9zZXN0IGZsb29yIHVuZGVyIHRoZSBjYW1lcmEgKi8KCW9wdGlvbmFsIGludDMyIGdyb3VwID0gNDsgIC8qIGZsb29yIGluZGV4ICovCglvcHRpb25hbCBpbnQzMiBzdWJncm91cCA9IDU7ICAvKiByb29tIGluZGV4ICovCglyZXBlYXRlZCBpbnQzMiB2aXNpYmxlcyA9IDY7ICAvKiBsaXN0IG9mIGluZGljZXMgdG8gYWxsIHB1Y2tzIHZpc2libGUgZnJvbSB0aGlzIHB1Y2sgKi8KCXJlcGVhdGVkIGZsb2F0IHNjb3JlcyA9IDc7IC8qIHVzZWQgYXMgcGFydCBvZiBzY29yaW5nIGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB3aGljaCBwdWNrIHRvIGdvIHRvIG5leHQgKi8KfQoKLy8KLy8gQWxsIHB1Y2tzIGluIGEgbW9kZWwuIFB1Y2tzIGFyZSBzdG9yZWQgaW4gc2Nhbm5pbmcgb3JkZXIuCi8vCm1lc3NhZ2UgTmF2aWdhdGlvbkluZm8gewoJcmVwZWF0ZWQgU3dlZXBMb2NhdGlvbiBzd2VlcExvY2F0aW9ucyA9IDE7Cn0K'
  48446. 'Ly8KLy8gUHJvdG9jb2wgQnVmZmVyIGZvciBwdWNrIHZpc2liaWxpdHkgYW5kIHJlbGF0ZWQgZGF0YQovLwovL3BhY2thZ2UgZW9zLnN0b3JhZ2U7CgovLyBpbXBvcnQgImVvcy9pbmZyYS9jb21tb24ucHJvdG8iOwovLyBUaGUgZm9sbG93aW5nIHdlcmUgbWFudWFsbHkgZXh0cmFjdGVkIGhlcmUsIEpTIGRvZXMgbm90IGxpa2UgcHJvdG9idWYgaW1wb3J0cwoKbWVzc2FnZSBBZmZpbmUzZiB7CglvcHRpb25hbCBRdWF0ZXJuaW9uZiByb3RhdGlvbiA9IDE7CglvcHRpb25hbCBWZWN0b3IzZiB0cmFuc2xhdGlvbiA9IDI7Cn0KCm1lc3NhZ2UgUXVhdGVybmlvbmYgewoJb3B0aW9uYWwgZmxvYXQgdyA9IDE7CglvcHRpb25hbCBmbG9hdCB4ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHkgPSAzOwoJb3B0aW9uYWwgZmxvYXQgeiA9IDQ7Cn0KCm1lc3NhZ2UgVmVjdG9yM2YgewoJb3B0aW9uYWwgZmxvYXQgeCA9IDE7CglvcHRpb25hbCBmbG9hdCB5ID0gMjsKCW9wdGlvbmFsIGZsb2F0IHogPSAzOwp9CgovLwovLyBPbmUgc3dlZXAgLyBwYW5vCi8vCm1lc3NhZ2UgU3dlZXBMb2NhdGlvbiB7CglvcHRpb25hbCBieXRlcyB1dWlkID0gMTsgIC8qIHV1aWQgKi8KCW9wdGlvbmFsIEFmZmluZTNmIHBvc2UgPSAyOyAgLyogY2FtZXJhIHBvc2UgKHgsIHkseikgaW4gbWV0ZXIgYW5kIGEgcXVhdGVybmlvbiovCglvcHRpb25hbCBWZWN0b3IzZiBwdWNrID0gMzsgIC8qIHB1Y2sgbG9jYXRpb24gLSB4IGFueSBpcyBnZW5lcmFsbHkgdGhlIHNhbWUgYXMgcG9zZSwgeiBpcyB0aGUgaGVpZ2h0IG9mIHRoZSBjbG9zZXN0IGZsb29yIHVuZGVyIHRoZSBjYW1lcmEgKi8KCW9wdGlvbmFsIGludDMyIGdyb3VwID0gNDsgIC8qIGZsb29yIGluZGV4ICovCglvcHRpb25hbCBpbnQzMiBzdWJncm91cCA9IDU7ICAvKiByb29tIGluZGV4ICovCglyZXBlYXRlZCBpbnQzMiB2aXNpYmxlcyA9IDY7ICAvKiBsaXN0IG9mIGluZGljZXMgdG8gYWxsIHB1Y2tzIHZpc2libGUgZnJvbSB0aGlzIHB1Y2sgKi8KCXJlcGVhdGVkIGludDMyIHZpc2libGVzMiA9IDc7IAoJcmVwZWF0ZWQgaW50MzIgdmlzaWJsZXMzID0gODsKfQoKLy8KLy8gQWxsIHB1Y2tzIGluIGEgbW9kZWwuIFB1Y2tzIGFyZSBzdG9yZWQgaW4gc2Nhbm5pbmcgb3JkZXIuCi8vCm1lc3NhZ2UgTmF2aWdhdGlvbkluZm8gewoJcmVwZWF0ZWQgU3dlZXBMb2NhdGlvbiBzd2VlcExvY2F0aW9ucyA9IDE7Cn0='),
  48447. decoderMesh() {
  48448. var builderMesh = dcodeIO.ProtoBuf.loadProto(this.damPro);
  48449. return builderMesh.build('binary_mesh');
  48450. },
  48451. decoderModeldata() {
  48452. var builderModeldata = dcodeIO.ProtoBuf.loadProto(this.visionmodeldataPro);
  48453. return builderModeldata.build('NavigationInfo');
  48454. },
  48455. decompressMesh(content) {
  48456. var data = null;
  48457. try {
  48458. data = this.decoderMesh().decode(content);
  48459. } catch (k) {
  48460. logger$1.error('failed parsing proto for .dam');
  48461. return null;
  48462. }
  48463. return data;
  48464. },
  48465. decompressModeldata(content) {
  48466. var data = null;
  48467. try {
  48468. data = this.decoderModeldata().decode(content);
  48469. } catch (k) {
  48470. logger$1.error('failed parsing proto for .modeldata');
  48471. return null;
  48472. }
  48473. return data;
  48474. }
  48475. };
  48476. 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); }; }
  48477. 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; } }
  48478. /*
  48479. meshObject = {
  48480. geometry: i,
  48481. textureName: e.material_name,
  48482. name: e.chunk_name,
  48483. meshUrl: t
  48484. }
  48485. */
  48486. //模型会分成多个chunk
  48487. var Chunk = /*#__PURE__*/function (_THREE$Mesh) {
  48488. _inherits(Chunk, _THREE$Mesh);
  48489. var _super = _createSuper$O(Chunk);
  48490. function Chunk(meshObject) {
  48491. var _this;
  48492. _classCallCheck(this, Chunk);
  48493. var materialInside = new ModelTextureMaterial({
  48494. side: THREE.DoubleSide
  48495. });
  48496. _this = _super.call(this, meshObject.geometry, materialInside);
  48497. _this.materialInside = materialInside;
  48498. var uniform = THREE.UniformsUtils.clone(shaders.modelOutside.uniforms);
  48499. _this.materialOutside = new THREE.RawShaderMaterial({
  48500. fragmentShader: shaders.modelOutside.fragmentShader,
  48501. vertexShader: shaders.modelOutside.vertexShader,
  48502. uniforms: uniform,
  48503. side: THREE.FrontSide,
  48504. name: 'chunkOut',
  48505. transparent: true //只有设置了透明才能使用renderOrder 和 depthTest
  48506. });
  48507. _this.materialOutside.extraValues = {}; //xzw add
  48508. _this.name = meshObject.name || '';
  48509. _this.meshUrl = meshObject.meshUrl;
  48510. _this.tileId = meshObject.tileId;
  48511. if (meshObject.tileId) {
  48512. _this.materialInside.defines['Is3dTiles'] = 1;
  48513. _this.materialOutside.defines['Is3dTiles'] = 1;
  48514. }
  48515. if (meshObject.textureName) _this.textureName = meshObject.textureName;else _this.setTextureMap(meshObject.texture);
  48516. _this.isChunk = true;
  48517. _this.layers.set(RenderLayers.MODEL);
  48518. return _this;
  48519. }
  48520. _createClass(Chunk, [{
  48521. key: "setTextureMap",
  48522. value: function setTextureMap(texture) {
  48523. this.materialInside.uniforms.map.value = texture;
  48524. this.materialOutside.uniforms.map.value = texture;
  48525. }
  48526. }, {
  48527. key: "setMode",
  48528. value: function setMode(mode) {
  48529. var modeTran = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '-';
  48530. //mode可能是transitioning
  48531. /* let getExtValue = (name)=>{//因为opacity两个材质都有 ,在其他地方设置后会被这里覆盖
  48532. return material.extraValues && material.extraValues[name] != void 0 ? material.extraValues[name] : this.material.uniforms[name].value
  48533. } */
  48534. modeTran.split('-')[0];
  48535. modeTran.split('-')[1];
  48536. var material = this.materialInside;
  48537. if ((mode === Viewmode$1.DOLLHOUSE || mode === Viewmode$1.FLOORPLAN) && !(mode == 'transitioning' && modeTran.includes(Viewmode$1.PANORAMA))) {
  48538. //xzw改:当dollhouse和floorplan转换时也用outside. 飞出飞入时都是materialInside
  48539. material = this.materialOutside;
  48540. }
  48541. if (mode === Viewmode$1.PANORAMA) {
  48542. material.side = THREE.DoubleSide; // material.side = THREE.BackSide
  48543. } else {
  48544. material.side = THREE.FrontSide;
  48545. }
  48546. if (mode == Viewmode$1.DOLLHOUSE && ModelSide.side !== null) {
  48547. material.side = ModelSide.side;
  48548. } //material.transparent = this.material.transparent
  48549. //material.uniforms.opacity.value = getExtValue('opacity')
  48550. this.material = material;
  48551. }
  48552. }]);
  48553. return Chunk;
  48554. }(THREE.Mesh);
  48555. /*
  48556. * @Author: Rindy
  48557. * @Date: 2021-05-13 17:27:29
  48558. * @LastEditors: Rindy
  48559. * @LastEditTime: 2021-05-27 16:30:31
  48560. * @Description: Process
  48561. */
  48562. var Process = {
  48563. //读入dam文件后,需要进行处理才能转换成mesh,方法如下:
  48564. //loaddata和e一样
  48565. convertProtobufToSceneObject: function convertProtobufToSceneObject(app, loaddata, prefixTexture) {
  48566. // function getMaterial(imgUrl) {
  48567. // imgUrl in materails || (materails[imgUrl] = new THREE.MeshBasicMaterial({
  48568. // map: THREE.ImageUtils.loadTexture(imgUrl)
  48569. // }));
  48570. // return materails[imgUrl];
  48571. // }
  48572. function getMesh(chunk) {
  48573. var geometry = new THREE.BufferGeometry();
  48574. geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(chunk.vertices.xyz, 0, 3), 3));
  48575. chunk.vertices.uv.length > 0 && geometry.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(chunk.vertices.uv, 0, 2), 2));
  48576. geometry.setIndex(new THREE.BufferAttribute(new Uint32Array(chunk.faces.faces, 0, 1), 1));
  48577. geometry.applyMatrix4(matrix);
  48578. geometry.computeBoundingBox();
  48579. var meshUrl = settings$3.job + settings$3.format;
  48580. if (config$6.model.name) {
  48581. meshUrl = config$6.model.name;
  48582. }
  48583. return new Chunk({
  48584. geometry: geometry,
  48585. textureName: chunk.material_name,
  48586. name: chunk.chunk_name,
  48587. meshUrl: app.resource.getViewImagesURL(meshUrl) //app.resource.getViewImagesURL(settings.job + settings.format),
  48588. }); // var mesh = new THREE.Mesh(geometry,getMaterial(prefixTexture + chunk.material_name));
  48589. // mesh.name = chunk.chunk_name;
  48590. // logger.warn("No chunks in damfile...");
  48591. // return mesh;
  48592. }
  48593. if (0 == loaddata.chunk.length) {
  48594. logger$1.warn('No chunks in damfile...');
  48595. return null;
  48596. }
  48597. var matrix = new THREE.Matrix4();
  48598. matrix.set(1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1); //var materails = {};
  48599. return loaddata.chunk.map(getMesh);
  48600. },
  48601. //vision.modeldata的数据不能直接用,需要转换,方法如下:
  48602. visionModeldata: function visionModeldata(loaddata) {
  48603. loaddata.sweepLocations.forEach(function (s) {
  48604. //许钟文 add 将某些旧场景visibles3为[]的改成至少包含visibles的所有
  48605. s.visibles3 = s.visibles3 || [];
  48606. s.visibles.forEach(function (v) {
  48607. s.visibles3.indexOf(v) == -1 && s.visibles3.push(v);
  48608. });
  48609. }); //------有的场景非4dkk拍摄、手动上传的,visibles2可能都是[],那么就转化为null,这样flying时才会有模型 by许钟文
  48610. var hasVisibles2;
  48611. for (var len = loaddata.sweepLocations.length, ss = 0; ss < len; ss++) {
  48612. var v = loaddata.sweepLocations[ss].visibles2 && loaddata.sweepLocations[ss].visibles2.length || 0;
  48613. if (v > 0) {
  48614. hasVisibles2 = true;
  48615. break;
  48616. }
  48617. }
  48618. if (!hasVisibles2) {
  48619. loaddata.sweepLocations.forEach(function (s) {
  48620. s.visibles2 = null;
  48621. });
  48622. logger$1.info('检测到疑似没有noblock数据,应该是手动上传,block置空');
  48623. } //-------------------
  48624. var modeldata = loaddata.sweepLocations.map(function (n, i) {
  48625. return {
  48626. uuid: n.uuid.toUTF8().replace(/-/g, ''),
  48627. position: {
  48628. x: n.pose.translation.x,
  48629. y: n.pose.translation.y,
  48630. z: n.pose.translation.z
  48631. },
  48632. quaternion: {
  48633. x: n.pose.rotation.x,
  48634. y: n.pose.rotation.y,
  48635. z: n.pose.rotation.z,
  48636. w: n.pose.rotation.w
  48637. },
  48638. puck: {
  48639. x: n.puck.x,
  48640. y: n.puck.y,
  48641. z: n.puck.z
  48642. },
  48643. //floor: n.group,
  48644. alignmentType: n.alignment_type,
  48645. neighbours: n.visibles3 || n.visibles,
  48646. noBlocks: n.visibles2,
  48647. // 过渡时出模型的点
  48648. seeMarkers: n.visibles,
  48649. //可以看见marker及热点的点
  48650. group: n.group,
  48651. subgroup: n.subgroup,
  48652. index: i //add
  48653. };
  48654. }.bind(this)).map(function (n) {
  48655. n.position = this.convertVisionVector(n.position);
  48656. n.quaternion = this.convertVisionQuaternion(n.quaternion);
  48657. n.puck = this.convertVisionVector(n.puck);
  48658. return n;
  48659. }.bind(this)); // modeldata.forEach(function (n) {
  48660. // n.neighbours = n.neighbours.filter((o) => o >= 0 )
  48661. // n.seeMarkers = n.seeMarkers.filter((o) => o >= 0 )
  48662. // })
  48663. modeldata.forEach(function (n) {
  48664. n.neighbours = n.neighbours.filter(function (o) {
  48665. return modeldata[o];
  48666. }).map(function (o) {
  48667. return modeldata[o].uuid;
  48668. });
  48669. });
  48670. modeldata.forEach(function (t) {
  48671. //xzw
  48672. if (t.noBlocks) t.noBlocks = t.noBlocks.map(function (t) {
  48673. return modeldata[t].uuid;
  48674. });
  48675. });
  48676. modeldata.forEach(function (t) {
  48677. //xzw
  48678. if (t.seeMarkers) t.seeMarkers = t.seeMarkers.filter(function (t) {
  48679. return modeldata[t];
  48680. }).map(function (t) {
  48681. return modeldata[t].uuid;
  48682. });
  48683. });
  48684. return modeldata; //def.resolve(m);
  48685. },
  48686. panos: function panos($app, modeldata, metadata) {
  48687. var panoramaCollection = $app.core.get('Player').model.panos;
  48688. var panoVideoRenderer = $app.core.get('PanoVideoRenderer');
  48689. var panoVideos = panoVideoRenderer.videosInfo.videos;
  48690. if ($app.config.view) {
  48691. // 展示页仅加载可视点位球幕视频
  48692. var visiblePanoVideos = new Map();
  48693. panoramaCollection.extend(modeldata.map(function (modeldataitem) {
  48694. if (modeldataitem.neighbours.length) {
  48695. var video = panoVideos.get(modeldataitem.uuid);
  48696. video && visiblePanoVideos.set(modeldataitem.uuid, video);
  48697. return new Panorama($app, modeldataitem.uuid, modeldataitem, video);
  48698. } else {
  48699. return new Panorama($app, modeldataitem.uuid, modeldataitem, null);
  48700. }
  48701. }.bind(this)), 'id');
  48702. panoVideoRenderer.initVideoPlayer($app.dom, visiblePanoVideos);
  48703. } else {
  48704. // 编辑页加载所有点位球幕视频
  48705. panoramaCollection.extend(modeldata.map(function (modeldataitem) {
  48706. return new Panorama($app, modeldataitem.uuid, modeldataitem, panoVideos.get(modeldataitem.uuid));
  48707. }.bind(this)), 'id');
  48708. panoVideoRenderer.initVideoPlayer($app.dom, panoVideos);
  48709. } //forEach是PanoramaCollection的函数
  48710. //listItem是Panorama的一个对象
  48711. panoramaCollection.forEach(function (listItem) {
  48712. if (listItem.neighbourUUIDs) {
  48713. listItem.neighbourUUIDs.forEach(function (uuid) {
  48714. //get是PanoramaCollection的函数
  48715. var pano = panoramaCollection.get(uuid);
  48716. pano && panoramaCollection.setNeighbour(listItem, pano, !0);
  48717. }); // 点位隐藏时neighbourPanos为undefined,会被赋默认值,导致点位隐藏不可用,所以取空对象
  48718. listItem.neighbourPanos = panoramaCollection.getNeighbours(listItem) || {};
  48719. }
  48720. });
  48721. if (0 === panoramaCollection.length) {
  48722. logger$1.warn('Model has no panos, turning off inside mode');
  48723. }
  48724. return panoramaCollection;
  48725. },
  48726. panosAssist(modeldata, $app) {
  48727. //xzw add
  48728. return modeldata.map(function (data) {
  48729. data.panoType = 'assistant'; //isAssist = true
  48730. data.tiled = false;
  48731. return new Panorama($app, data.uuid, data);
  48732. }.bind(this));
  48733. },
  48734. //变换vision.modeldata里拍摄点的坐标
  48735. convertVisionVector: function convertVisionVector(position) {
  48736. return new THREE.Vector3(position.x, position.z, -position.y);
  48737. },
  48738. //变换vision.modeldata里拍摄点的旋转角度quaternion
  48739. convertVisionQuaternion: function convertVisionQuaternion(quaternion) {
  48740. 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)));
  48741. },
  48742. //变换初始点的坐标
  48743. convertWorkshopVector: function convertWorkshopVector(position) {
  48744. return new THREE.Vector3(-position.x, position.y, position.z);
  48745. },
  48746. //变换初始点的quaternion
  48747. convertWorkshopQuaternion: function convertWorkshopQuaternion(quaternion) {
  48748. 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));
  48749. }
  48750. };
  48751. var Chunks = {
  48752. parseIdsFromChunkName(chunkName, floorRoomIds) {
  48753. floorRoomIds.floorId = this.parseFloor(chunkName);
  48754. floorRoomIds.roomId = this.parseRoom(chunkName);
  48755. },
  48756. parseFloor(chunkName) {
  48757. var floorInfo = chunkName.match(/_group([0-9]+)/);
  48758. if (!floorInfo) return 0;
  48759. try {
  48760. return parseInt(floorInfo[1], 10);
  48761. } catch (msg) {
  48762. logger.warn('Non-int value "' + floorInfo[1] + '" for mesh group, defaulting to floor 0');
  48763. return 0;
  48764. }
  48765. },
  48766. parseRoom(chunkName) {
  48767. var roomInfo = chunkName.match(/_sub([0-9]+)/);
  48768. if (!roomInfo) return -1;
  48769. try {
  48770. return parseInt(roomInfo[1], 10);
  48771. } catch (msg) {
  48772. logger.warn('Non-int value "' + roomInfo[1] + '" for mesh subgroup, defaulting to subgroup 0');
  48773. return 0;
  48774. }
  48775. }
  48776. };
  48777. var ModelTextureLoader = {
  48778. load(model, textures, resource) {
  48779. return new Promise(function (resolve) {
  48780. function addTexture(flag, texture) {
  48781. if (!flag) {
  48782. textures.push(texture);
  48783. p++;
  48784. p === textureLen && resolve();
  48785. }
  48786. }
  48787. if (!model.chunks[0] || !model.chunks[0].meshUrl) {
  48788. return resolve();
  48789. }
  48790. var textureLen = common$1.countUnique(model.chunks.map(function (chunk) {
  48791. return chunk.textureName;
  48792. }));
  48793. var modelVersion = '';
  48794. if (model.chunks[0].meshUrl.indexOf('_50k') !== -1) ;
  48795. var textureType = 'low';
  48796. if (settings$3.minimalMemoryMode && 'high' === textureType) {
  48797. if (browser$1.detectSamsungS6()) {
  48798. logger$1.warn('Galaxy S6 cannot handle large textures, turning down quality.');
  48799. textureType = 'low';
  48800. } else if (textureLen > settings$3.maxMobileTextures) {
  48801. logger$1.warn('Model probably too large for mobile, turning down quality.');
  48802. textureType = 'low';
  48803. }
  48804. }
  48805. var p = 0;
  48806. var textureFoldName = model.data.job.uuid + modelVersion + '_50k_texture_jpg_' + 'high1' + '/';
  48807. if (config$6.model.name) {
  48808. textureFoldName = config$6.model.name.replace('.dam', '_texture/');
  48809. }
  48810. model.chunks.forEach(function (chunk) {
  48811. if (!chunk.material.map && chunk.textureName) {
  48812. var textureUrl = model.urls.get(textureFoldName + chunk.textureName);
  48813. chunk.setTextureMap(texture.load(textureUrl, addTexture.bind(this, texture.isLoaded(textureUrl))));
  48814. }
  48815. });
  48816. });
  48817. }
  48818. };
  48819. function _defineProperty$1(obj, key, value) {
  48820. if (key in obj) {
  48821. Object.defineProperty(obj, key, {
  48822. value: value,
  48823. enumerable: true,
  48824. configurable: true,
  48825. writable: true
  48826. });
  48827. } else {
  48828. obj[key] = value;
  48829. }
  48830. return obj;
  48831. }
  48832. function _AwaitValue(value) {
  48833. this.wrapped = value;
  48834. }
  48835. function _awaitAsyncGenerator(value) {
  48836. return new _AwaitValue(value);
  48837. }
  48838. function AsyncGenerator(gen) {
  48839. var front, back;
  48840. function send(key, arg) {
  48841. return new Promise(function (resolve, reject) {
  48842. var request = {
  48843. key: key,
  48844. arg: arg,
  48845. resolve: resolve,
  48846. reject: reject,
  48847. next: null
  48848. };
  48849. if (back) {
  48850. back = back.next = request;
  48851. } else {
  48852. front = back = request;
  48853. resume(key, arg);
  48854. }
  48855. });
  48856. }
  48857. function resume(key, arg) {
  48858. try {
  48859. var result = gen[key](arg);
  48860. var value = result.value;
  48861. var wrappedAwait = value instanceof _AwaitValue;
  48862. Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) {
  48863. if (wrappedAwait) {
  48864. resume(key === "return" ? "return" : "next", arg);
  48865. return;
  48866. }
  48867. settle(result.done ? "return" : "normal", arg);
  48868. }, function (err) {
  48869. resume("throw", err);
  48870. });
  48871. } catch (err) {
  48872. settle("throw", err);
  48873. }
  48874. }
  48875. function settle(type, value) {
  48876. switch (type) {
  48877. case "return":
  48878. front.resolve({
  48879. value: value,
  48880. done: true
  48881. });
  48882. break;
  48883. case "throw":
  48884. front.reject(value);
  48885. break;
  48886. default:
  48887. front.resolve({
  48888. value: value,
  48889. done: false
  48890. });
  48891. break;
  48892. }
  48893. front = front.next;
  48894. if (front) {
  48895. resume(front.key, front.arg);
  48896. } else {
  48897. back = null;
  48898. }
  48899. }
  48900. this._invoke = send;
  48901. if (typeof gen["return"] !== "function") {
  48902. this["return"] = undefined;
  48903. }
  48904. }
  48905. AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () {
  48906. return this;
  48907. };
  48908. AsyncGenerator.prototype.next = function (arg) {
  48909. return this._invoke("next", arg);
  48910. };
  48911. AsyncGenerator.prototype["throw"] = function (arg) {
  48912. return this._invoke("throw", arg);
  48913. };
  48914. AsyncGenerator.prototype["return"] = function (arg) {
  48915. return this._invoke("return", arg);
  48916. };
  48917. function _wrapAsyncGenerator(fn) {
  48918. return function () {
  48919. return new AsyncGenerator(fn.apply(this, arguments));
  48920. };
  48921. }
  48922. function _asyncIterator(iterable) {
  48923. var method;
  48924. if (typeof Symbol !== "undefined") {
  48925. if (Symbol.asyncIterator) method = iterable[Symbol.asyncIterator];
  48926. if (method == null && Symbol.iterator) method = iterable[Symbol.iterator];
  48927. }
  48928. if (method == null) method = iterable["@@asyncIterator"];
  48929. if (method == null) method = iterable["@@iterator"];
  48930. if (method == null) throw new TypeError("Object is not async iterable");
  48931. return method.call(iterable);
  48932. }
  48933. /**
  48934. * @author Deepkolos / https://github.com/deepkolos
  48935. */
  48936. var WorkerPool$1 = /*#__PURE__*/function () {
  48937. function WorkerPool() {
  48938. var pool = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 4;
  48939. _classCallCheck(this, WorkerPool);
  48940. this.pool = pool;
  48941. this.queue = [];
  48942. this.workers = [];
  48943. this.workersResolve = [];
  48944. this.workerStatus = 0;
  48945. }
  48946. _createClass(WorkerPool, [{
  48947. key: "_initWorker",
  48948. value: function _initWorker(workerId) {
  48949. if (!this.workers[workerId]) {
  48950. var worker = this.workerCreator();
  48951. worker.addEventListener('message', this._onMessage.bind(this, workerId));
  48952. this.workers[workerId] = worker;
  48953. }
  48954. }
  48955. }, {
  48956. key: "_getIdleWorker",
  48957. value: function _getIdleWorker() {
  48958. for (var i = 0; i < this.pool; i++) {
  48959. if (!(this.workerStatus & 1 << i)) return i;
  48960. }
  48961. return -1;
  48962. }
  48963. }, {
  48964. key: "_onMessage",
  48965. value: function _onMessage(workerId, msg) {
  48966. var resolve = this.workersResolve[workerId];
  48967. resolve && resolve(msg);
  48968. if (this.queue.length) {
  48969. var _this$queue$shift = this.queue.shift(),
  48970. _resolve = _this$queue$shift.resolve,
  48971. _msg = _this$queue$shift.msg,
  48972. transfer = _this$queue$shift.transfer;
  48973. this.workersResolve[workerId] = _resolve;
  48974. this.workers[workerId].postMessage(_msg, transfer);
  48975. } else {
  48976. this.workerStatus ^= 1 << workerId;
  48977. }
  48978. }
  48979. }, {
  48980. key: "setWorkerCreator",
  48981. value: function setWorkerCreator(workerCreator) {
  48982. this.workerCreator = workerCreator;
  48983. }
  48984. }, {
  48985. key: "setWorkerLimit",
  48986. value: function setWorkerLimit(pool) {
  48987. this.pool = pool;
  48988. }
  48989. }, {
  48990. key: "postMessage",
  48991. value: function postMessage(msg, transfer) {
  48992. var _this = this;
  48993. return new Promise(function (resolve) {
  48994. var workerId = _this._getIdleWorker();
  48995. if (workerId !== -1) {
  48996. _this._initWorker(workerId);
  48997. _this.workerStatus |= 1 << workerId;
  48998. _this.workersResolve[workerId] = resolve;
  48999. _this.workers[workerId].postMessage(msg, transfer);
  49000. } else {
  49001. _this.queue.push({
  49002. resolve,
  49003. msg,
  49004. transfer
  49005. });
  49006. }
  49007. });
  49008. }
  49009. }, {
  49010. key: "dispose",
  49011. value: function dispose() {
  49012. this.workers.forEach(function (worker) {
  49013. return worker.terminate();
  49014. });
  49015. this.workersResolve.length = 0;
  49016. this.workers.length = 0;
  49017. this.queue.length = 0;
  49018. this.workerStatus = 0;
  49019. }
  49020. }]);
  49021. return WorkerPool;
  49022. }();
  49023. var t = 0,
  49024. n$2 = 2,
  49025. p$1 = 1,
  49026. x$1 = 2,
  49027. nt = 0,
  49028. ct = 9,
  49029. gt = 15,
  49030. yt = 16,
  49031. dt = 22,
  49032. Ot = 37,
  49033. Ft = 43,
  49034. $t = 76,
  49035. se = 83,
  49036. pe = 97,
  49037. xe = 100,
  49038. de = 103,
  49039. Ae = 109;
  49040. var Si = function Si() {
  49041. _classCallCheck(this, Si);
  49042. 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 = [{
  49043. vendorId: 0,
  49044. descriptorType: 0,
  49045. descriptorBlockSize: 0,
  49046. versionNumber: 2,
  49047. colorModel: 0,
  49048. colorPrimaries: 1,
  49049. transferFunction: 2,
  49050. flags: 0,
  49051. texelBlockDimension: [0, 0, 0, 0],
  49052. bytesPlane: [0, 0, 0, 0, 0, 0, 0, 0],
  49053. samples: []
  49054. }], this.keyValue = {}, this.globalData = null;
  49055. };
  49056. var Ii = /*#__PURE__*/function () {
  49057. function Ii(t, e, n, i) {
  49058. _classCallCheck(this, Ii);
  49059. this._dataView = new DataView(t.buffer, t.byteOffset + e, n), this._littleEndian = i, this._offset = 0;
  49060. }
  49061. _createClass(Ii, [{
  49062. key: "_nextUint8",
  49063. value: function _nextUint8() {
  49064. var t = this._dataView.getUint8(this._offset);
  49065. return this._offset += 1, t;
  49066. }
  49067. }, {
  49068. key: "_nextUint16",
  49069. value: function _nextUint16() {
  49070. var t = this._dataView.getUint16(this._offset, this._littleEndian);
  49071. return this._offset += 2, t;
  49072. }
  49073. }, {
  49074. key: "_nextUint32",
  49075. value: function _nextUint32() {
  49076. var t = this._dataView.getUint32(this._offset, this._littleEndian);
  49077. return this._offset += 4, t;
  49078. }
  49079. }, {
  49080. key: "_nextUint64",
  49081. value: function _nextUint64() {
  49082. var t = this._dataView.getUint32(this._offset, this._littleEndian) + Math.pow(2, 32) * this._dataView.getUint32(this._offset + 4, this._littleEndian);
  49083. return this._offset += 8, t;
  49084. }
  49085. }, {
  49086. key: "_nextInt32",
  49087. value: function _nextInt32() {
  49088. var t = this._dataView.getInt32(this._offset, this._littleEndian);
  49089. return this._offset += 4, t;
  49090. }
  49091. }, {
  49092. key: "_skip",
  49093. value: function _skip(t) {
  49094. return this._offset += t, this;
  49095. }
  49096. }, {
  49097. key: "_scan",
  49098. value: function _scan(t) {
  49099. var e = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  49100. var n = this._offset;
  49101. var i = 0;
  49102. for (; this._dataView.getUint8(this._offset) !== e && i < t;) {
  49103. i++, this._offset++;
  49104. }
  49105. return i < t && this._offset++, new Uint8Array(this._dataView.buffer, this._dataView.byteOffset + n, i);
  49106. }
  49107. }]);
  49108. return Ii;
  49109. }();
  49110. var Ti = [171, 75, 84, 88, 32, 50, 48, 187, 13, 10, 26, 10];
  49111. function Ei(t) {
  49112. return 'undefined' != typeof TextDecoder ? new TextDecoder().decode(t) : Buffer.from(t).toString('utf8');
  49113. }
  49114. function Pi(t) {
  49115. var e = new Uint8Array(t.buffer, t.byteOffset, Ti.length);
  49116. 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.');
  49117. var n = new Si(),
  49118. i = 17 * Uint32Array.BYTES_PER_ELEMENT,
  49119. s = new Ii(t, Ti.length, i, !0);
  49120. 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();
  49121. var a = s._nextUint32();
  49122. n.supercompressionScheme = s._nextUint32();
  49123. var r = s._nextUint32(),
  49124. o = s._nextUint32(),
  49125. l = s._nextUint32(),
  49126. f = s._nextUint32(),
  49127. U = s._nextUint64(),
  49128. c = s._nextUint64(),
  49129. h = new Ii(t, Ti.length + i, 3 * a * 8, !0);
  49130. for (var _e3 = 0; _e3 < a; _e3++) {
  49131. n.levels.push({
  49132. levelData: new Uint8Array(t.buffer, t.byteOffset + h._nextUint64(), h._nextUint64()),
  49133. uncompressedByteLength: h._nextUint64()
  49134. });
  49135. }
  49136. var _ = new Ii(t, r, o, !0),
  49137. p = {
  49138. vendorId: _._skip(4)._nextUint16(),
  49139. descriptorType: _._nextUint16(),
  49140. versionNumber: _._nextUint16(),
  49141. descriptorBlockSize: _._nextUint16(),
  49142. colorModel: _._nextUint8(),
  49143. colorPrimaries: _._nextUint8(),
  49144. transferFunction: _._nextUint8(),
  49145. flags: _._nextUint8(),
  49146. texelBlockDimension: [_._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8()],
  49147. bytesPlane: [_._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8()],
  49148. samples: []
  49149. },
  49150. g = (p.descriptorBlockSize / 4 - 6) / 4;
  49151. for (var _t2 = 0; _t2 < g; _t2++) {
  49152. var _e4 = {
  49153. bitOffset: _._nextUint16(),
  49154. bitLength: _._nextUint8(),
  49155. channelType: _._nextUint8(),
  49156. samplePosition: [_._nextUint8(), _._nextUint8(), _._nextUint8(), _._nextUint8()],
  49157. sampleLower: -Infinity,
  49158. sampleUpper: Infinity
  49159. };
  49160. 64 & _e4.channelType ? (_e4.sampleLower = _._nextInt32(), _e4.sampleUpper = _._nextInt32()) : (_e4.sampleLower = _._nextUint32(), _e4.sampleUpper = _._nextUint32()), p.samples[_t2] = _e4;
  49161. }
  49162. n.dataFormatDescriptor.length = 0, n.dataFormatDescriptor.push(p);
  49163. var y = new Ii(t, l, f, !0);
  49164. for (; y._offset < f;) {
  49165. var _t3 = y._nextUint32(),
  49166. _e5 = y._scan(_t3),
  49167. _i2 = Ei(_e5),
  49168. _s = y._scan(_t3 - _e5.byteLength);
  49169. n.keyValue[_i2] = _i2.match(/^ktx/i) ? Ei(_s) : _s, y._offset % 4 && y._skip(4 - y._offset % 4);
  49170. }
  49171. if (c <= 0) return n;
  49172. var x = new Ii(t, U, c, !0),
  49173. u = x._nextUint16(),
  49174. b = x._nextUint16(),
  49175. d = x._nextUint32(),
  49176. m = x._nextUint32(),
  49177. w = x._nextUint32(),
  49178. D = x._nextUint32(),
  49179. B = [];
  49180. for (var _t4 = 0; _t4 < a; _t4++) {
  49181. B.push({
  49182. imageFlags: x._nextUint32(),
  49183. rgbSliceByteOffset: x._nextUint32(),
  49184. rgbSliceByteLength: x._nextUint32(),
  49185. alphaSliceByteOffset: x._nextUint32(),
  49186. alphaSliceByteLength: x._nextUint32()
  49187. });
  49188. }
  49189. var L = U + x._offset,
  49190. A = L + d,
  49191. k = A + m,
  49192. v = k + w,
  49193. S = new Uint8Array(t.buffer, t.byteOffset + L, d),
  49194. I = new Uint8Array(t.buffer, t.byteOffset + A, m),
  49195. O = new Uint8Array(t.buffer, t.byteOffset + k, w),
  49196. T = new Uint8Array(t.buffer, t.byteOffset + v, D);
  49197. return n.globalData = {
  49198. endpointCount: u,
  49199. selectorCount: b,
  49200. imageDescs: B,
  49201. endpointsData: S,
  49202. selectorsData: I,
  49203. tablesData: O,
  49204. extendedData: T
  49205. }, n;
  49206. }
  49207. var A$1, I$1, B$1;
  49208. var g$1 = {
  49209. env: {
  49210. emscripten_notify_memory_growth: function emscripten_notify_memory_growth(A) {
  49211. B$1 = new Uint8Array(I$1.exports.memory.buffer);
  49212. }
  49213. }
  49214. };
  49215. var Q = /*#__PURE__*/function () {
  49216. function Q() {
  49217. _classCallCheck(this, Q);
  49218. }
  49219. _createClass(Q, [{
  49220. key: "init",
  49221. value: function init() {
  49222. return A$1 || (A$1 = 'undefined' != typeof fetch ? fetch('data:application/wasm;base64,' + C).then(function (A) {
  49223. return A.arrayBuffer();
  49224. }).then(function (A) {
  49225. return WebAssembly.instantiate(A, g$1);
  49226. }).then(this._init) : WebAssembly.instantiate(Buffer.from(C, 'base64'), g$1).then(this._init), A$1);
  49227. }
  49228. }, {
  49229. key: "_init",
  49230. value: function _init(A) {
  49231. I$1 = A.instance, g$1.env.emscripten_notify_memory_growth(0);
  49232. }
  49233. }, {
  49234. key: "decode",
  49235. value: function decode(A) {
  49236. var g = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  49237. if (!I$1) throw new Error('ZSTDDecoder: Await .init() before decoding.');
  49238. var _Q = A.byteLength,
  49239. C = I$1.exports.malloc(_Q);
  49240. B$1.set(A, C), g = g || Number(I$1.exports.ZSTD_findDecompressedSize(C, _Q));
  49241. var E = I$1.exports.malloc(g),
  49242. i = I$1.exports.ZSTD_decompress(E, g, C, _Q),
  49243. D = B$1.slice(E, E + i);
  49244. return I$1.exports.free(C), I$1.exports.free(E), D;
  49245. }
  49246. }]);
  49247. return Q;
  49248. }();
  49249. 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';
  49250. 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); }; }
  49251. 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; } }
  49252. var _taskCache = new WeakMap();
  49253. var _activeLoaders = 0;
  49254. var _zstd;
  49255. var KTX2Loader = /*#__PURE__*/function (_Loader) {
  49256. _inherits(KTX2Loader, _Loader);
  49257. var _super = _createSuper$N(KTX2Loader);
  49258. function KTX2Loader(manager) {
  49259. var _this;
  49260. _classCallCheck(this, KTX2Loader);
  49261. _this = _super.call(this, manager);
  49262. _this.transcoderPath = '';
  49263. _this.transcoderBinary = null;
  49264. _this.transcoderPending = null;
  49265. _this.workerPool = new WorkerPool$1();
  49266. _this.workerSourceURL = '';
  49267. _this.workerConfig = null;
  49268. if (typeof MSC_TRANSCODER !== 'undefined') {
  49269. console.warn('THREE.KTX2Loader: Please update to latest "basis_transcoder".' + ' "msc_basis_transcoder" is no longer supported in three.js r125+.');
  49270. }
  49271. return _this;
  49272. }
  49273. _createClass(KTX2Loader, [{
  49274. key: "setTranscoderPath",
  49275. value: function setTranscoderPath(path) {
  49276. this.transcoderPath = path;
  49277. return this;
  49278. }
  49279. }, {
  49280. key: "setWorkerLimit",
  49281. value: function setWorkerLimit(num) {
  49282. this.workerPool.setWorkerLimit(num);
  49283. return this;
  49284. }
  49285. }, {
  49286. key: "detectSupport",
  49287. value: function detectSupport(renderer) {
  49288. this.workerConfig = {
  49289. astcSupported: renderer.extensions.has('WEBGL_compressed_texture_astc'),
  49290. etc1Supported: renderer.extensions.has('WEBGL_compressed_texture_etc1'),
  49291. etc2Supported: renderer.extensions.has('WEBGL_compressed_texture_etc'),
  49292. dxtSupported: renderer.extensions.has('WEBGL_compressed_texture_s3tc'),
  49293. bptcSupported: renderer.extensions.has('EXT_texture_compression_bptc'),
  49294. pvrtcSupported: renderer.extensions.has('WEBGL_compressed_texture_pvrtc') || renderer.extensions.has('WEBKIT_WEBGL_compressed_texture_pvrtc')
  49295. };
  49296. if (renderer.capabilities.isWebGL2) {
  49297. // https://github.com/mrdoob/three.js/pull/22928
  49298. this.workerConfig.etc1Supported = false;
  49299. }
  49300. return this;
  49301. }
  49302. }, {
  49303. key: "init",
  49304. value: function init() {
  49305. var _this2 = this;
  49306. if (!this.transcoderPending) {
  49307. // Load transcoder wrapper.
  49308. var jsLoader = new THREE$1.FileLoader(this.manager);
  49309. jsLoader.setPath(this.transcoderPath);
  49310. jsLoader.setWithCredentials(this.withCredentials);
  49311. var jsContent = jsLoader.loadAsync('basis_transcoder.js'); // Load transcoder WASM binary.
  49312. var binaryLoader = new THREE$1.FileLoader(this.manager);
  49313. binaryLoader.setPath(this.transcoderPath);
  49314. binaryLoader.setResponseType('arraybuffer');
  49315. binaryLoader.setWithCredentials(this.withCredentials);
  49316. var binaryContent = binaryLoader.loadAsync('basis_transcoder.wasm');
  49317. this.transcoderPending = Promise.all([jsContent, binaryContent]).then(function (_ref) {
  49318. var _ref2 = _slicedToArray(_ref, 2),
  49319. jsContent = _ref2[0],
  49320. binaryContent = _ref2[1];
  49321. var fn = KTX2Loader.BasisWorker.toString();
  49322. 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');
  49323. _this2.workerSourceURL = URL.createObjectURL(new Blob([body]));
  49324. _this2.transcoderBinary = binaryContent;
  49325. _this2.workerPool.setWorkerCreator(function () {
  49326. var worker = new Worker(_this2.workerSourceURL);
  49327. var transcoderBinary = _this2.transcoderBinary.slice(0);
  49328. worker.postMessage({
  49329. type: 'init',
  49330. config: _this2.workerConfig,
  49331. transcoderBinary
  49332. }, [transcoderBinary]);
  49333. return worker;
  49334. });
  49335. });
  49336. if (_activeLoaders > 0) {
  49337. // Each instance loads a transcoder and allocates workers, increasing network and memory cost.
  49338. console.warn('THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.' + ' Use a single KTX2Loader instance, or call .dispose() on old instances.');
  49339. }
  49340. _activeLoaders++;
  49341. }
  49342. return this.transcoderPending;
  49343. }
  49344. }, {
  49345. key: "load",
  49346. value: function load(url, onLoad, onProgress, onError) {
  49347. var _this3 = this;
  49348. if (this.workerConfig === null) {
  49349. throw new Error('THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.');
  49350. }
  49351. var loader = new THREE$1.FileLoader(this.manager);
  49352. loader.setResponseType('arraybuffer');
  49353. loader.setWithCredentials(this.withCredentials);
  49354. loader.load(url, function (buffer) {
  49355. // Check for an existing task using this buffer. A transferred buffer cannot be transferred
  49356. // again from this thread.
  49357. if (_taskCache.has(buffer)) {
  49358. var cachedTask = _taskCache.get(buffer);
  49359. return cachedTask.promise.then(onLoad).catch(onError);
  49360. }
  49361. _this3._createTexture(buffer).then(function (texture) {
  49362. return onLoad ? onLoad(texture) : null;
  49363. }).catch(onError);
  49364. }, onProgress, onError);
  49365. }
  49366. }, {
  49367. key: "_createTextureFrom",
  49368. value: function _createTextureFrom(transcodeResult) {
  49369. var mipmaps = transcodeResult.mipmaps,
  49370. width = transcodeResult.width,
  49371. height = transcodeResult.height,
  49372. format = transcodeResult.format,
  49373. type = transcodeResult.type,
  49374. error = transcodeResult.error,
  49375. dfdTransferFn = transcodeResult.dfdTransferFn,
  49376. dfdFlags = transcodeResult.dfdFlags;
  49377. if (type === 'error') return Promise.reject(error);
  49378. var texture = new THREE$1.CompressedTexture(mipmaps, width, height, format, THREE$1.UnsignedByteType);
  49379. texture.minFilter = mipmaps.length === 1 ? THREE$1.LinearFilter : THREE$1.LinearMipmapLinearFilter;
  49380. texture.magFilter = THREE$1.LinearFilter;
  49381. texture.generateMipmaps = false;
  49382. texture.needsUpdate = true;
  49383. texture.encoding = dfdTransferFn === x$1 ? THREE$1.sRGBEncoding : THREE$1.LinearEncoding;
  49384. texture.premultiplyAlpha = !!(dfdFlags & p$1);
  49385. return texture;
  49386. }
  49387. /**
  49388. * @param {ArrayBuffer} buffer
  49389. * @param {object?} config
  49390. * @return {Promise<CompressedTexture|DataTexture|Data3DTexture>}
  49391. */
  49392. }, {
  49393. key: "_createTexture",
  49394. value: function _createTexture(buffer) {
  49395. var _this4 = this;
  49396. var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  49397. var container = Pi(new Uint8Array(buffer));
  49398. if (container.vkFormat !== nt) {
  49399. return createDataTexture(container);
  49400. } //
  49401. var taskConfig = config;
  49402. var texturePending = this.init().then(function () {
  49403. return _this4.workerPool.postMessage({
  49404. type: 'transcode',
  49405. buffer,
  49406. taskConfig: taskConfig
  49407. }, [buffer]);
  49408. }).then(function (e) {
  49409. return _this4._createTextureFrom(e.data);
  49410. }); // Cache the task result.
  49411. _taskCache.set(buffer, {
  49412. promise: texturePending
  49413. });
  49414. return texturePending;
  49415. }
  49416. }, {
  49417. key: "dispose",
  49418. value: function dispose() {
  49419. this.workerPool.dispose();
  49420. if (this.workerSourceURL) URL.revokeObjectURL(this.workerSourceURL);
  49421. _activeLoaders--;
  49422. return this;
  49423. }
  49424. }]);
  49425. return KTX2Loader;
  49426. }(THREE$1.Loader);
  49427. /* CONSTANTS */
  49428. KTX2Loader.BasisFormat = {
  49429. ETC1S: 0,
  49430. UASTC_4x4: 1
  49431. };
  49432. KTX2Loader.TranscoderFormat = {
  49433. ETC1: 0,
  49434. ETC2: 1,
  49435. BC1: 2,
  49436. BC3: 3,
  49437. BC4: 4,
  49438. BC5: 5,
  49439. BC7_M6_OPAQUE_ONLY: 6,
  49440. BC7_M5: 7,
  49441. PVRTC1_4_RGB: 8,
  49442. PVRTC1_4_RGBA: 9,
  49443. ASTC_4x4: 10,
  49444. ATC_RGB: 11,
  49445. ATC_RGBA_INTERPOLATED_ALPHA: 12,
  49446. RGBA32: 13,
  49447. RGB565: 14,
  49448. BGR565: 15,
  49449. RGBA4444: 16
  49450. };
  49451. KTX2Loader.EngineFormat = {
  49452. RGBAFormat: THREE$1.RGBAFormat,
  49453. RGBA_ASTC_4x4_Format: THREE$1.RGBA_ASTC_4x4_Format,
  49454. RGBA_BPTC_Format: THREE$1.RGBA_BPTC_Format,
  49455. RGBA_ETC2_EAC_Format: THREE$1.RGBA_ETC2_EAC_Format,
  49456. RGBA_PVRTC_4BPPV1_Format: THREE$1.RGBA_PVRTC_4BPPV1_Format,
  49457. RGBA_S3TC_DXT5_Format: THREE$1.RGBA_S3TC_DXT5_Format,
  49458. RGB_ETC1_Format: THREE$1.RGB_ETC1_Format,
  49459. RGB_ETC2_Format: THREE$1.RGB_ETC2_Format,
  49460. RGB_PVRTC_4BPPV1_Format: THREE$1.RGB_PVRTC_4BPPV1_Format,
  49461. RGB_S3TC_DXT1_Format: THREE$1.RGB_S3TC_DXT1_Format
  49462. };
  49463. /* WEB WORKER */
  49464. KTX2Loader.BasisWorker = function () {
  49465. var config;
  49466. var transcoderPending;
  49467. var BasisModule;
  49468. var EngineFormat = _EngineFormat; // eslint-disable-line no-undef
  49469. var TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef
  49470. var BasisFormat = _BasisFormat; // eslint-disable-line no-undef
  49471. self.addEventListener('message', function (e) {
  49472. var message = e.data;
  49473. switch (message.type) {
  49474. case 'init':
  49475. config = message.config;
  49476. init(message.transcoderBinary);
  49477. break;
  49478. case 'transcode':
  49479. transcoderPending.then(function () {
  49480. try {
  49481. var _transcode = transcode(message.buffer),
  49482. width = _transcode.width,
  49483. height = _transcode.height,
  49484. hasAlpha = _transcode.hasAlpha,
  49485. mipmaps = _transcode.mipmaps,
  49486. format = _transcode.format,
  49487. dfdTransferFn = _transcode.dfdTransferFn,
  49488. dfdFlags = _transcode.dfdFlags;
  49489. var buffers = [];
  49490. for (var i = 0; i < mipmaps.length; ++i) {
  49491. buffers.push(mipmaps[i].data.buffer);
  49492. }
  49493. self.postMessage({
  49494. type: 'transcode',
  49495. id: message.id,
  49496. width,
  49497. height,
  49498. hasAlpha,
  49499. mipmaps,
  49500. format,
  49501. dfdTransferFn,
  49502. dfdFlags
  49503. }, buffers);
  49504. } catch (error) {
  49505. console.error(error);
  49506. self.postMessage({
  49507. type: 'error',
  49508. id: message.id,
  49509. error: error.message
  49510. });
  49511. }
  49512. });
  49513. break;
  49514. }
  49515. });
  49516. function init(wasmBinary) {
  49517. transcoderPending = new Promise(function (resolve) {
  49518. BasisModule = {
  49519. wasmBinary,
  49520. onRuntimeInitialized: resolve
  49521. };
  49522. BASIS(BasisModule); // eslint-disable-line no-undef
  49523. }).then(function () {
  49524. BasisModule.initializeBasis();
  49525. if (BasisModule.KTX2File === undefined) {
  49526. console.warn('THREE.KTX2Loader: Please update Basis Universal transcoder.');
  49527. }
  49528. });
  49529. }
  49530. function transcode(buffer) {
  49531. var ktx2File = new BasisModule.KTX2File(new Uint8Array(buffer));
  49532. function cleanup() {
  49533. ktx2File.close();
  49534. ktx2File.delete();
  49535. }
  49536. if (!ktx2File.isValid()) {
  49537. cleanup();
  49538. throw new Error('THREE.KTX2Loader: Invalid or unsupported .ktx2 file');
  49539. }
  49540. var basisFormat = ktx2File.isUASTC() ? BasisFormat.UASTC_4x4 : BasisFormat.ETC1S;
  49541. var width = ktx2File.getWidth();
  49542. var height = ktx2File.getHeight();
  49543. var levels = ktx2File.getLevels();
  49544. var hasAlpha = ktx2File.getHasAlpha();
  49545. var dfdTransferFn = ktx2File.getDFDTransferFunc();
  49546. var dfdFlags = ktx2File.getDFDFlags();
  49547. var _getTranscoderFormat = getTranscoderFormat(basisFormat, width, height, hasAlpha),
  49548. transcoderFormat = _getTranscoderFormat.transcoderFormat,
  49549. engineFormat = _getTranscoderFormat.engineFormat;
  49550. if (!width || !height || !levels) {
  49551. cleanup();
  49552. throw new Error('THREE.KTX2Loader: Invalid texture');
  49553. }
  49554. if (!ktx2File.startTranscoding()) {
  49555. cleanup();
  49556. throw new Error('THREE.KTX2Loader: .startTranscoding failed');
  49557. }
  49558. var mipmaps = [];
  49559. for (var mip = 0; mip < levels; mip++) {
  49560. var levelInfo = ktx2File.getImageLevelInfo(mip, 0, 0);
  49561. var mipWidth = levelInfo.origWidth;
  49562. var mipHeight = levelInfo.origHeight;
  49563. var dst = new Uint8Array(ktx2File.getImageTranscodedSizeInBytes(mip, 0, 0, transcoderFormat));
  49564. var status = ktx2File.transcodeImage(dst, mip, 0, 0, transcoderFormat, 0, -1, -1);
  49565. if (!status) {
  49566. cleanup();
  49567. throw new Error('THREE.KTX2Loader: .transcodeImage failed.');
  49568. }
  49569. mipmaps.push({
  49570. data: dst,
  49571. width: mipWidth,
  49572. height: mipHeight
  49573. });
  49574. }
  49575. cleanup();
  49576. return {
  49577. width,
  49578. height,
  49579. hasAlpha,
  49580. mipmaps,
  49581. format: engineFormat,
  49582. dfdTransferFn,
  49583. dfdFlags
  49584. };
  49585. } //
  49586. // Optimal choice of a transcoder target format depends on the Basis format (ETC1S or UASTC),
  49587. // device capabilities, and texture dimensions. The list below ranks the formats separately
  49588. // for ETC1S and UASTC.
  49589. //
  49590. // In some cases, transcoding UASTC to RGBA32 might be preferred for higher quality (at
  49591. // significant memory cost) compared to ETC1/2, BC1/3, and PVRTC. The transcoder currently
  49592. // chooses RGBA32 only as a last resort and does not expose that option to the caller.
  49593. var FORMAT_OPTIONS = [{
  49594. if: 'astcSupported',
  49595. basisFormat: [BasisFormat.UASTC_4x4],
  49596. transcoderFormat: [TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4],
  49597. engineFormat: [EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format],
  49598. priorityETC1S: Infinity,
  49599. priorityUASTC: 1,
  49600. needsPowerOfTwo: false
  49601. }, {
  49602. if: 'bptcSupported',
  49603. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  49604. transcoderFormat: [TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5],
  49605. engineFormat: [EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format],
  49606. priorityETC1S: 3,
  49607. priorityUASTC: 2,
  49608. needsPowerOfTwo: false
  49609. }, {
  49610. if: 'dxtSupported',
  49611. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  49612. transcoderFormat: [TranscoderFormat.BC1, TranscoderFormat.BC3],
  49613. engineFormat: [EngineFormat.RGB_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format],
  49614. priorityETC1S: 4,
  49615. priorityUASTC: 5,
  49616. needsPowerOfTwo: false
  49617. }, {
  49618. if: 'etc2Supported',
  49619. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  49620. transcoderFormat: [TranscoderFormat.ETC1, TranscoderFormat.ETC2],
  49621. engineFormat: [EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format],
  49622. priorityETC1S: 1,
  49623. priorityUASTC: 3,
  49624. needsPowerOfTwo: false
  49625. }, {
  49626. if: 'etc1Supported',
  49627. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  49628. transcoderFormat: [TranscoderFormat.ETC1],
  49629. engineFormat: [EngineFormat.RGB_ETC1_Format],
  49630. priorityETC1S: 2,
  49631. priorityUASTC: 4,
  49632. needsPowerOfTwo: false
  49633. }, {
  49634. if: 'pvrtcSupported',
  49635. basisFormat: [BasisFormat.ETC1S, BasisFormat.UASTC_4x4],
  49636. transcoderFormat: [TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA],
  49637. engineFormat: [EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format],
  49638. priorityETC1S: 5,
  49639. priorityUASTC: 6,
  49640. needsPowerOfTwo: true
  49641. }];
  49642. var ETC1S_OPTIONS = FORMAT_OPTIONS.sort(function (a, b) {
  49643. return a.priorityETC1S - b.priorityETC1S;
  49644. });
  49645. var UASTC_OPTIONS = FORMAT_OPTIONS.sort(function (a, b) {
  49646. return a.priorityUASTC - b.priorityUASTC;
  49647. });
  49648. function getTranscoderFormat(basisFormat, width, height, hasAlpha) {
  49649. var transcoderFormat;
  49650. var engineFormat;
  49651. var options = basisFormat === BasisFormat.ETC1S ? ETC1S_OPTIONS : UASTC_OPTIONS;
  49652. for (var i = 0; i < options.length; i++) {
  49653. var opt = options[i];
  49654. if (!config[opt.if]) continue;
  49655. if (!opt.basisFormat.includes(basisFormat)) continue;
  49656. if (hasAlpha && opt.transcoderFormat.length < 2) continue;
  49657. if (opt.needsPowerOfTwo && !(isPowerOfTwo(width) && isPowerOfTwo(height))) continue;
  49658. transcoderFormat = opt.transcoderFormat[hasAlpha ? 1 : 0];
  49659. engineFormat = opt.engineFormat[hasAlpha ? 1 : 0];
  49660. return {
  49661. transcoderFormat,
  49662. engineFormat
  49663. };
  49664. }
  49665. console.warn('THREE.KTX2Loader: No suitable compressed texture format found. Decoding to RGBA32.');
  49666. transcoderFormat = TranscoderFormat.RGBA32;
  49667. engineFormat = EngineFormat.RGBAFormat;
  49668. return {
  49669. transcoderFormat,
  49670. engineFormat
  49671. };
  49672. }
  49673. function isPowerOfTwo(value) {
  49674. if (value <= 2) return true;
  49675. return (value & value - 1) === 0 && value !== 0;
  49676. }
  49677. }; //
  49678. // DataTexture and Data3DTexture parsing.
  49679. var FORMAT_MAP = {
  49680. [Ae]: THREE$1.RGBAFormat,
  49681. [pe]: THREE$1.RGBAFormat,
  49682. [Ot]: THREE$1.RGBAFormat,
  49683. [Ft]: THREE$1.RGBAFormat,
  49684. [de]: THREE$1.RGFormat,
  49685. [se]: THREE$1.RGFormat,
  49686. [yt]: THREE$1.RGFormat,
  49687. [dt]: THREE$1.RGFormat,
  49688. [xe]: THREE$1.RedFormat,
  49689. [$t]: THREE$1.RedFormat,
  49690. [gt]: THREE$1.RedFormat,
  49691. [ct]: THREE$1.RedFormat
  49692. };
  49693. var TYPE_MAP = {
  49694. [Ae]: THREE$1.FloatType,
  49695. [pe]: THREE$1.HalfFloatType,
  49696. [Ot]: THREE$1.UnsignedByteType,
  49697. [Ft]: THREE$1.UnsignedByteType,
  49698. [de]: THREE$1.FloatType,
  49699. [se]: THREE$1.HalfFloatType,
  49700. [yt]: THREE$1.UnsignedByteType,
  49701. [dt]: THREE$1.UnsignedByteType,
  49702. [xe]: THREE$1.FloatType,
  49703. [$t]: THREE$1.HalfFloatType,
  49704. [gt]: THREE$1.UnsignedByteType,
  49705. [ct]: THREE$1.UnsignedByteType
  49706. };
  49707. var ENCODING_MAP = {
  49708. [Ft]: THREE$1.sRGBEncoding,
  49709. [dt]: THREE$1.sRGBEncoding,
  49710. [gt]: THREE$1.sRGBEncoding
  49711. };
  49712. function createDataTexture(_x) {
  49713. return _createDataTexture.apply(this, arguments);
  49714. }
  49715. function _createDataTexture() {
  49716. _createDataTexture = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(container) {
  49717. var vkFormat, pixelWidth, pixelHeight, pixelDepth, level, levelData, view, texture;
  49718. return regenerator.wrap(function _callee2$(_context2) {
  49719. while (1) {
  49720. switch (_context2.prev = _context2.next) {
  49721. case 0:
  49722. vkFormat = container.vkFormat, pixelWidth = container.pixelWidth, pixelHeight = container.pixelHeight, pixelDepth = container.pixelDepth;
  49723. if (!(FORMAT_MAP[vkFormat] === undefined)) {
  49724. _context2.next = 3;
  49725. break;
  49726. }
  49727. throw new Error('THREE.KTX2Loader: Unsupported vkFormat.');
  49728. case 3:
  49729. //
  49730. level = container.levels[0];
  49731. if (!(container.supercompressionScheme === t)) {
  49732. _context2.next = 8;
  49733. break;
  49734. }
  49735. levelData = level.levelData;
  49736. _context2.next = 16;
  49737. break;
  49738. case 8:
  49739. if (!(container.supercompressionScheme === n$2)) {
  49740. _context2.next = 15;
  49741. break;
  49742. }
  49743. if (!_zstd) {
  49744. _zstd = new Promise( /*#__PURE__*/function () {
  49745. var _ref3 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(resolve) {
  49746. var zstd;
  49747. return regenerator.wrap(function _callee$(_context) {
  49748. while (1) {
  49749. switch (_context.prev = _context.next) {
  49750. case 0:
  49751. zstd = new Q();
  49752. _context.next = 3;
  49753. return zstd.init();
  49754. case 3:
  49755. resolve(zstd);
  49756. case 4:
  49757. case "end":
  49758. return _context.stop();
  49759. }
  49760. }
  49761. }, _callee);
  49762. }));
  49763. return function (_x2) {
  49764. return _ref3.apply(this, arguments);
  49765. };
  49766. }());
  49767. }
  49768. _context2.next = 12;
  49769. return _zstd;
  49770. case 12:
  49771. levelData = _context2.sent.decode(level.levelData, level.uncompressedByteLength);
  49772. _context2.next = 16;
  49773. break;
  49774. case 15:
  49775. throw new Error('THREE.KTX2Loader: Unsupported supercompressionScheme.');
  49776. case 16:
  49777. if (TYPE_MAP[vkFormat] === THREE$1.FloatType) {
  49778. view = new Float32Array(levelData.buffer, levelData.byteOffset, levelData.byteLength / Float32Array.BYTES_PER_ELEMENT);
  49779. } else if (TYPE_MAP[vkFormat] === THREE$1.HalfFloatType) {
  49780. view = new Uint16Array(levelData.buffer, levelData.byteOffset, levelData.byteLength / Uint16Array.BYTES_PER_ELEMENT);
  49781. } else {
  49782. view = levelData;
  49783. } //
  49784. texture = pixelDepth === 0 ? new THREE$1.DataTexture(view, pixelWidth, pixelHeight) : new THREE$1.Data3DTexture(view, pixelWidth, pixelHeight, pixelDepth);
  49785. texture.type = TYPE_MAP[vkFormat];
  49786. texture.format = FORMAT_MAP[vkFormat];
  49787. texture.encoding = ENCODING_MAP[vkFormat] || THREE$1.LinearEncoding;
  49788. texture.needsUpdate = true; //
  49789. return _context2.abrupt("return", Promise.resolve(texture));
  49790. case 23:
  49791. case "end":
  49792. return _context2.stop();
  49793. }
  49794. }
  49795. }, _callee2);
  49796. }));
  49797. return _createDataTexture.apply(this, arguments);
  49798. }
  49799. 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);};}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;}}var _marked=/*#__PURE__*/regenerator.mark(makeStringIterator),_marked2=/*#__PURE__*/regenerator.mark(makeArrayBufferIterator),_marked3=/*#__PURE__*/regenerator.mark(makeMeshPrimitiveIterator);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;}}};}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);}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;}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;/*! *****************************************************************************
  49800. Copyright (c) Microsoft Corporation.
  49801. Permission to use, copy, modify, and/or distribute this software for any
  49802. purpose with or without fee is hereby granted.
  49803. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
  49804. REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  49805. AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
  49806. INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  49807. LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  49808. OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  49809. PERFORMANCE OF THIS SOFTWARE.
  49810. ***************************************************************************** */ // !zeg改 必须将window赋值给globalThis,否则会导致钉钉和支付宝小程序打不开
  49811. 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
  49812. 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$5(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$5(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$5(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.1-alpha.18";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$5(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$5(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$5(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$5(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$5(loaders),_step10;try{for(_iterator10.s();!(_step10=_iterator10.n()).done;){var loader=_step10.value;var _iterator11=_createForOfIteratorHelper$5(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$5(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$5(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$2={};config$2.EPSILON=1e-12;config$2.debug=false;config$2.precision=4;config$2.printTypes=false;config$2.printDegrees=false;config$2.printRowMajor=true;function round(value){return Math.round(value/config$2.EPSILON)*config$2.EPSILON;}function formatValue(value){var _ref5=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{},_ref5$precision=_ref5.precision,precision=_ref5$precision===void 0?config$2.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$2.EPSILON;if(epsilon){config$2.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$2.EPSILON*Math.max(1.0,Math.abs(a),Math.abs(b));}return false;}finally{config$2.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$M(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$2);}},{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$2.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$2.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$M(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);/**
  49813. * Common utilities
  49814. * @module glMatrix
  49815. */ // Configuration Constants
  49816. 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);};/**
  49817. * 2 Dimensional Vector
  49818. * @module vec2
  49819. */ /**
  49820. * Creates a new, empty vec2
  49821. *
  49822. * @returns {vec2} a new 2D vector
  49823. */function create$4(){var out=new ARRAY_TYPE(2);if(ARRAY_TYPE!=Float32Array){out[0]=0;out[1]=0;}return out;}/**
  49824. * Transforms the vec2 with a mat2
  49825. *
  49826. * @param {vec2} out the receiving vector
  49827. * @param {ReadonlyVec2} a the vector to transform
  49828. * @param {ReadonlyMat2} m matrix to transform with
  49829. * @returns {vec2} out
  49830. */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;}/**
  49831. * Transforms the vec2 with a mat2d
  49832. *
  49833. * @param {vec2} out the receiving vector
  49834. * @param {ReadonlyVec2} a the vector to transform
  49835. * @param {ReadonlyMat2d} m matrix to transform with
  49836. * @returns {vec2} out
  49837. */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;}/**
  49838. * Transforms the vec2 with a mat3
  49839. * 3rd vector component is implicitly '1'
  49840. *
  49841. * @param {vec2} out the receiving vector
  49842. * @param {ReadonlyVec2} a the vector to transform
  49843. * @param {ReadonlyMat3} m matrix to transform with
  49844. * @returns {vec2} out
  49845. */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;}/**
  49846. * Transforms the vec2 with a mat4
  49847. * 3rd vector component is implicitly '0'
  49848. * 4th vector component is implicitly '1'
  49849. *
  49850. * @param {vec2} out the receiving vector
  49851. * @param {ReadonlyVec2} a the vector to transform
  49852. * @param {ReadonlyMat4} m matrix to transform with
  49853. * @returns {vec2} out
  49854. */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$M(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$2.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$2.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);/**
  49855. * 3 Dimensional Vector
  49856. * @module vec3
  49857. */ /**
  49858. * Creates a new, empty vec3
  49859. *
  49860. * @returns {vec3} a new 3D vector
  49861. */function create$3(){var out=new ARRAY_TYPE(3);if(ARRAY_TYPE!=Float32Array){out[0]=0;out[1]=0;out[2]=0;}return out;}/**
  49862. * Calculates the length of a vec3
  49863. *
  49864. * @param {ReadonlyVec3} a vector to calculate length of
  49865. * @returns {Number} length of a
  49866. */function length$2(a){var x=a[0];var y=a[1];var z=a[2];return Math.hypot(x,y,z);}/**
  49867. * Creates a new vec3 initialized with the given values
  49868. *
  49869. * @param {Number} x X component
  49870. * @param {Number} y Y component
  49871. * @param {Number} z Z component
  49872. * @returns {vec3} a new 3D vector
  49873. */function fromValues(x,y,z){var out=new ARRAY_TYPE(3);out[0]=x;out[1]=y;out[2]=z;return out;}/**
  49874. * Normalize a vec3
  49875. *
  49876. * @param {vec3} out the receiving vector
  49877. * @param {ReadonlyVec3} a vector to normalize
  49878. * @returns {vec3} out
  49879. */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?
  49880. len=1/Math.sqrt(len);}out[0]=a[0]*len;out[1]=a[1]*len;out[2]=a[2]*len;return out;}/**
  49881. * Calculates the dot product of two vec3's
  49882. *
  49883. * @param {ReadonlyVec3} a the first operand
  49884. * @param {ReadonlyVec3} b the second operand
  49885. * @returns {Number} dot product of a and b
  49886. */function dot$2(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];}/**
  49887. * Computes the cross product of two vec3's
  49888. *
  49889. * @param {vec3} out the receiving vector
  49890. * @param {ReadonlyVec3} a the first operand
  49891. * @param {ReadonlyVec3} b the second operand
  49892. * @returns {vec3} out
  49893. */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;}/**
  49894. * Transforms the vec3 with a mat4.
  49895. * 4th vector component is implicitly '1'
  49896. *
  49897. * @param {vec3} out the receiving vector
  49898. * @param {ReadonlyVec3} a the vector to transform
  49899. * @param {ReadonlyMat4} m matrix to transform with
  49900. * @returns {vec3} out
  49901. */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;}/**
  49902. * Transforms the vec3 with a mat3.
  49903. *
  49904. * @param {vec3} out the receiving vector
  49905. * @param {ReadonlyVec3} a the vector to transform
  49906. * @param {ReadonlyMat3} m the 3x3 matrix to transform with
  49907. * @returns {vec3} out
  49908. */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;}/**
  49909. * Transforms the vec3 with a quat
  49910. * Can also be used for dual quaternions. (Multiply it with the real part)
  49911. *
  49912. * @param {vec3} out the receiving vector
  49913. * @param {ReadonlyVec3} a the vector to transform
  49914. * @param {ReadonlyQuat} q quaternion to transform with
  49915. * @returns {vec3} out
  49916. */function transformQuat$1(out,a,q){// benchmarks: https://jsperf.com/quaternion-transform-vec3-implementations-fixed
  49917. 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];
  49918. // var uv = vec3.cross([], qvec, a);
  49919. var uvx=qy*z-qz*y,uvy=qz*x-qx*z,uvz=qx*y-qy*x;// var uuv = vec3.cross([], qvec, uv);
  49920. var uuvx=qy*uvz-qz*uvy,uuvy=qz*uvx-qx*uvz,uuvz=qx*uvy-qy*uvx;// vec3.scale(uv, uv, 2 * w);
  49921. var w2=qw*2;uvx*=w2;uvy*=w2;uvz*=w2;// vec3.scale(uuv, uuv, 2);
  49922. uuvx*=2;uuvy*=2;uuvz*=2;// return vec3.add(out, a, vec3.add(out, uv, uuv));
  49923. out[0]=x+uvx+uuvx;out[1]=y+uvy+uuvy;out[2]=z+uvz+uuvz;return out;}/**
  49924. * Rotate a 3D vector around the x-axis
  49925. * @param {vec3} out The receiving vec3
  49926. * @param {ReadonlyVec3} a The vec3 point to rotate
  49927. * @param {ReadonlyVec3} b The origin of the rotation
  49928. * @param {Number} rad The angle of rotation in radians
  49929. * @returns {vec3} out
  49930. */function rotateX$2(out,a,b,rad){var p=[],r=[];//Translate point to the origin
  49931. p[0]=a[0]-b[0];p[1]=a[1]-b[1];p[2]=a[2]-b[2];//perform rotation
  49932. 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
  49933. out[0]=r[0]+b[0];out[1]=r[1]+b[1];out[2]=r[2]+b[2];return out;}/**
  49934. * Rotate a 3D vector around the y-axis
  49935. * @param {vec3} out The receiving vec3
  49936. * @param {ReadonlyVec3} a The vec3 point to rotate
  49937. * @param {ReadonlyVec3} b The origin of the rotation
  49938. * @param {Number} rad The angle of rotation in radians
  49939. * @returns {vec3} out
  49940. */function rotateY$2(out,a,b,rad){var p=[],r=[];//Translate point to the origin
  49941. p[0]=a[0]-b[0];p[1]=a[1]-b[1];p[2]=a[2]-b[2];//perform rotation
  49942. 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
  49943. out[0]=r[0]+b[0];out[1]=r[1]+b[1];out[2]=r[2]+b[2];return out;}/**
  49944. * Rotate a 3D vector around the z-axis
  49945. * @param {vec3} out The receiving vec3
  49946. * @param {ReadonlyVec3} a The vec3 point to rotate
  49947. * @param {ReadonlyVec3} b The origin of the rotation
  49948. * @param {Number} rad The angle of rotation in radians
  49949. * @returns {vec3} out
  49950. */function rotateZ$2(out,a,b,rad){var p=[],r=[];//Translate point to the origin
  49951. p[0]=a[0]-b[0];p[1]=a[1]-b[1];p[2]=a[2]-b[2];//perform rotation
  49952. 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
  49953. out[0]=r[0]+b[0];out[1]=r[1]+b[1];out[2]=r[2]+b[2];return out;}/**
  49954. * Get the angle between two 3D vectors
  49955. * @param {ReadonlyVec3} a The first operand
  49956. * @param {ReadonlyVec3} b The second operand
  49957. * @returns {Number} The angle in radians
  49958. */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));}/**
  49959. * Alias for {@link vec3.length}
  49960. * @function
  49961. */var len$2=length$2/**
  49962. * Perform some operation over an array of vec3s.
  49963. *
  49964. * @param {Array} a the array of vectors to iterate over
  49965. * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed
  49966. * @param {Number} offset Number of elements to skip at the beginning of the array
  49967. * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array
  49968. * @param {Function} fn Function to call for each vector in the array
  49969. * @param {Object} [arg] additional argument to pass to fn
  49970. * @returns {Array} a
  49971. * @function
  49972. */;(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$M(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$2.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$2.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$M(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$2.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);/**
  49973. * 3x3 Matrix
  49974. * @module mat3
  49975. */ /**
  49976. * Creates a new identity mat3
  49977. *
  49978. * @returns {mat3} a new 3x3 matrix
  49979. */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;}/**
  49980. * Transpose the values of a mat3
  49981. *
  49982. * @param {mat3} out the receiving matrix
  49983. * @param {ReadonlyMat3} a the source matrix
  49984. * @returns {mat3} out
  49985. */function transpose$1(out,a){// If we are transposing ourselves we can skip a few steps but have to cache some values
  49986. 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;}/**
  49987. * Inverts a mat3
  49988. *
  49989. * @param {mat3} out the receiving matrix
  49990. * @param {ReadonlyMat3} a the source matrix
  49991. * @returns {mat3} out
  49992. */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
  49993. 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;}/**
  49994. * Calculates the determinant of a mat3
  49995. *
  49996. * @param {ReadonlyMat3} a the source matrix
  49997. * @returns {Number} determinant of a
  49998. */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);}/**
  49999. * Multiplies two mat3's
  50000. *
  50001. * @param {mat3} out the receiving matrix
  50002. * @param {ReadonlyMat3} a the first operand
  50003. * @param {ReadonlyMat3} b the second operand
  50004. * @returns {mat3} out
  50005. */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;}/**
  50006. * Translate a mat3 by the given vector
  50007. *
  50008. * @param {mat3} out the receiving matrix
  50009. * @param {ReadonlyMat3} a the matrix to translate
  50010. * @param {ReadonlyVec2} v vector to translate by
  50011. * @returns {mat3} out
  50012. */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;}/**
  50013. * Rotates a mat3 by the given angle
  50014. *
  50015. * @param {mat3} out the receiving matrix
  50016. * @param {ReadonlyMat3} a the matrix to rotate
  50017. * @param {Number} rad the angle to rotate the matrix by
  50018. * @returns {mat3} out
  50019. */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;}/**
  50020. * Scales the mat3 by the dimensions in the given vec2
  50021. *
  50022. * @param {mat3} out the receiving matrix
  50023. * @param {ReadonlyMat3} a the matrix to rotate
  50024. * @param {ReadonlyVec2} v the vec2 to scale the matrix by
  50025. * @returns {mat3} out
  50026. **/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;}/**
  50027. * Calculates a 3x3 matrix from the given quaternion
  50028. *
  50029. * @param {mat3} out mat3 receiving operation result
  50030. * @param {ReadonlyQuat} q Quaternion to create matrix from
  50031. *
  50032. * @returns {mat3} out
  50033. */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$M(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);/**
  50034. * Set a mat4 to the identity matrix
  50035. *
  50036. * @param {mat4} out the receiving matrix
  50037. * @returns {mat4} out
  50038. */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;}/**
  50039. * Transpose the values of a mat4
  50040. *
  50041. * @param {mat4} out the receiving matrix
  50042. * @param {ReadonlyMat4} a the source matrix
  50043. * @returns {mat4} out
  50044. */function _transpose(out,a){// If we are transposing ourselves we can skip a few steps but have to cache some values
  50045. 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;}/**
  50046. * Inverts a mat4
  50047. *
  50048. * @param {mat4} out the receiving matrix
  50049. * @param {ReadonlyMat4} a the source matrix
  50050. * @returns {mat4} out
  50051. */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
  50052. 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;}/**
  50053. * Calculates the determinant of a mat4
  50054. *
  50055. * @param {ReadonlyMat4} a the source matrix
  50056. * @returns {Number} determinant of a
  50057. */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
  50058. return b00*b11-b01*b10+b02*b09+b03*b08-b04*b07+b05*b06;}/**
  50059. * Multiplies two mat4s
  50060. *
  50061. * @param {mat4} out the receiving matrix
  50062. * @param {ReadonlyMat4} a the first operand
  50063. * @param {ReadonlyMat4} b the second operand
  50064. * @returns {mat4} out
  50065. */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
  50066. 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;}/**
  50067. * Translate a mat4 by the given vector
  50068. *
  50069. * @param {mat4} out the receiving matrix
  50070. * @param {ReadonlyMat4} a the matrix to translate
  50071. * @param {ReadonlyVec3} v vector to translate by
  50072. * @returns {mat4} out
  50073. */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;}/**
  50074. * Scales the mat4 by the dimensions in the given vec3 not using vectorization
  50075. *
  50076. * @param {mat4} out the receiving matrix
  50077. * @param {ReadonlyMat4} a the matrix to scale
  50078. * @param {ReadonlyVec3} v the vec3 to scale the matrix by
  50079. * @returns {mat4} out
  50080. **/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;}/**
  50081. * Rotates a mat4 by the given angle around the given axis
  50082. *
  50083. * @param {mat4} out the receiving matrix
  50084. * @param {ReadonlyMat4} a the matrix to rotate
  50085. * @param {Number} rad the angle to rotate the matrix by
  50086. * @param {ReadonlyVec3} axis the axis to rotate around
  50087. * @returns {mat4} out
  50088. */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
  50089. 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
  50090. 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
  50091. out[12]=a[12];out[13]=a[13];out[14]=a[14];out[15]=a[15];}return out;}/**
  50092. * Rotates a matrix by the given angle around the X axis
  50093. *
  50094. * @param {mat4} out the receiving matrix
  50095. * @param {ReadonlyMat4} a the matrix to rotate
  50096. * @param {Number} rad the angle to rotate the matrix by
  50097. * @returns {mat4} out
  50098. */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
  50099. 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
  50100. 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;}/**
  50101. * Rotates a matrix by the given angle around the Y axis
  50102. *
  50103. * @param {mat4} out the receiving matrix
  50104. * @param {ReadonlyMat4} a the matrix to rotate
  50105. * @param {Number} rad the angle to rotate the matrix by
  50106. * @returns {mat4} out
  50107. */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
  50108. 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
  50109. 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;}/**
  50110. * Rotates a matrix by the given angle around the Z axis
  50111. *
  50112. * @param {mat4} out the receiving matrix
  50113. * @param {ReadonlyMat4} a the matrix to rotate
  50114. * @param {Number} rad the angle to rotate the matrix by
  50115. * @returns {mat4} out
  50116. */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
  50117. 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
  50118. 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;}/**
  50119. * Returns the scaling factor component of a transformation
  50120. * matrix. If a matrix is built with fromRotationTranslationScale
  50121. * with a normalized Quaternion paramter, the returned vector will be
  50122. * the same as the scaling vector
  50123. * originally supplied.
  50124. * @param {vec3} out Vector to receive scaling factor component
  50125. * @param {ReadonlyMat4} mat Matrix to be decomposed (input)
  50126. * @return {vec3} out
  50127. */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;}/**
  50128. * Calculates a 4x4 matrix from the given quaternion
  50129. *
  50130. * @param {mat4} out mat4 receiving operation result
  50131. * @param {ReadonlyQuat} q Quaternion to create matrix from
  50132. *
  50133. * @returns {mat4} out
  50134. */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;}/**
  50135. * Generates a frustum matrix with the given bounds
  50136. *
  50137. * @param {mat4} out mat4 frustum matrix will be written into
  50138. * @param {Number} left Left bound of the frustum
  50139. * @param {Number} right Right bound of the frustum
  50140. * @param {Number} bottom Bottom bound of the frustum
  50141. * @param {Number} top Top bound of the frustum
  50142. * @param {Number} near Near bound of the frustum
  50143. * @param {Number} far Far bound of the frustum
  50144. * @returns {mat4} out
  50145. */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;}/**
  50146. * Generates a perspective projection matrix with the given bounds.
  50147. * Passing null/undefined/no value for far will generate infinite projection matrix.
  50148. *
  50149. * @param {mat4} out mat4 frustum matrix will be written into
  50150. * @param {number} fovy Vertical field of view in radians
  50151. * @param {number} aspect Aspect ratio. typically viewport width/height
  50152. * @param {number} near Near bound of the frustum
  50153. * @param {number} far Far bound of the frustum, can be null or Infinity
  50154. * @returns {mat4} out
  50155. */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;}/**
  50156. * Generates a orthogonal projection matrix with the given bounds
  50157. *
  50158. * @param {mat4} out mat4 frustum matrix will be written into
  50159. * @param {number} left Left bound of the frustum
  50160. * @param {number} right Right bound of the frustum
  50161. * @param {number} bottom Bottom bound of the frustum
  50162. * @param {number} top Top bound of the frustum
  50163. * @param {number} near Near bound of the frustum
  50164. * @param {number} far Far bound of the frustum
  50165. * @returns {mat4} out
  50166. */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;}/**
  50167. * Generates a look-at matrix with the given eye position, focal point, and up axis.
  50168. * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.
  50169. *
  50170. * @param {mat4} out mat4 frustum matrix will be written into
  50171. * @param {ReadonlyVec3} eye Position of the viewer
  50172. * @param {ReadonlyVec3} center Point the viewer is looking at
  50173. * @param {ReadonlyVec3} up vec3 pointing up
  50174. * @returns {mat4} out
  50175. */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;}/**
  50176. * 4 Dimensional Vector
  50177. * @module vec4
  50178. */ /**
  50179. * Creates a new, empty vec4
  50180. *
  50181. * @returns {vec4} a new 4D vector
  50182. */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;}/**
  50183. * Adds two vec4's
  50184. *
  50185. * @param {vec4} out the receiving vector
  50186. * @param {ReadonlyVec4} a the first operand
  50187. * @param {ReadonlyVec4} b the second operand
  50188. * @returns {vec4} out
  50189. */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;}/**
  50190. * Scales a vec4 by a scalar number
  50191. *
  50192. * @param {vec4} out the receiving vector
  50193. * @param {ReadonlyVec4} a the vector to scale
  50194. * @param {Number} b amount to scale the vector by
  50195. * @returns {vec4} out
  50196. */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;}/**
  50197. * Calculates the length of a vec4
  50198. *
  50199. * @param {ReadonlyVec4} a vector to calculate length of
  50200. * @returns {Number} length of a
  50201. */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);}/**
  50202. * Calculates the squared length of a vec4
  50203. *
  50204. * @param {ReadonlyVec4} a vector to calculate squared length of
  50205. * @returns {Number} squared length of a
  50206. */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;}/**
  50207. * Normalize a vec4
  50208. *
  50209. * @param {vec4} out the receiving vector
  50210. * @param {ReadonlyVec4} a vector to normalize
  50211. * @returns {vec4} out
  50212. */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;}/**
  50213. * Calculates the dot product of two vec4's
  50214. *
  50215. * @param {ReadonlyVec4} a the first operand
  50216. * @param {ReadonlyVec4} b the second operand
  50217. * @returns {Number} dot product of a and b
  50218. */function dot$1(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3];}/**
  50219. * Performs a linear interpolation between two vec4's
  50220. *
  50221. * @param {vec4} out the receiving vector
  50222. * @param {ReadonlyVec4} a the first operand
  50223. * @param {ReadonlyVec4} b the second operand
  50224. * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
  50225. * @returns {vec4} out
  50226. */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;}/**
  50227. * Transforms the vec4 with a mat4.
  50228. *
  50229. * @param {vec4} out the receiving vector
  50230. * @param {ReadonlyVec4} a the vector to transform
  50231. * @param {ReadonlyMat4} m matrix to transform with
  50232. * @returns {vec4} out
  50233. */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;}/**
  50234. * Transforms the vec4 with a quat
  50235. *
  50236. * @param {vec4} out the receiving vector
  50237. * @param {ReadonlyVec4} a the vector to transform
  50238. * @param {ReadonlyQuat} q quaternion to transform with
  50239. * @returns {vec4} out
  50240. */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
  50241. 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
  50242. 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$M(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);/**
  50243. * Quaternion
  50244. * @module quat
  50245. */ /**
  50246. * Creates a new identity quat
  50247. *
  50248. * @returns {quat} a new quaternion
  50249. */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;}/**
  50250. * Set a quat to the identity quaternion
  50251. *
  50252. * @param {quat} out the receiving quaternion
  50253. * @returns {quat} out
  50254. */function _identity(out){out[0]=0;out[1]=0;out[2]=0;out[3]=1;return out;}/**
  50255. * Sets a quat from the given angle and rotation axis,
  50256. * then returns it.
  50257. *
  50258. * @param {quat} out the receiving quaternion
  50259. * @param {ReadonlyVec3} axis the axis around which to rotate
  50260. * @param {Number} rad the angle in radians
  50261. * @returns {quat} out
  50262. **/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;}/**
  50263. * Multiplies two quat's
  50264. *
  50265. * @param {quat} out the receiving quaternion
  50266. * @param {ReadonlyQuat} a the first operand
  50267. * @param {ReadonlyQuat} b the second operand
  50268. * @returns {quat} out
  50269. */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;}/**
  50270. * Rotates a quaternion by the given angle about the X axis
  50271. *
  50272. * @param {quat} out quat receiving operation result
  50273. * @param {ReadonlyQuat} a quat to rotate
  50274. * @param {number} rad angle (in radians) to rotate
  50275. * @returns {quat} out
  50276. */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;}/**
  50277. * Rotates a quaternion by the given angle about the Y axis
  50278. *
  50279. * @param {quat} out quat receiving operation result
  50280. * @param {ReadonlyQuat} a quat to rotate
  50281. * @param {number} rad angle (in radians) to rotate
  50282. * @returns {quat} out
  50283. */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;}/**
  50284. * Rotates a quaternion by the given angle about the Z axis
  50285. *
  50286. * @param {quat} out quat receiving operation result
  50287. * @param {ReadonlyQuat} a quat to rotate
  50288. * @param {number} rad angle (in radians) to rotate
  50289. * @returns {quat} out
  50290. */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;}/**
  50291. * Calculates the W component of a quat from the X, Y, and Z components.
  50292. * Assumes that quaternion is 1 unit in length.
  50293. * Any existing W component will be ignored.
  50294. *
  50295. * @param {quat} out the receiving quaternion
  50296. * @param {ReadonlyQuat} a quat to calculate W component of
  50297. * @returns {quat} out
  50298. */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;}/**
  50299. * Performs a spherical linear interpolation between two quat
  50300. *
  50301. * @param {quat} out the receiving quaternion
  50302. * @param {ReadonlyQuat} a the first operand
  50303. * @param {ReadonlyQuat} b the second operand
  50304. * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
  50305. * @returns {quat} out
  50306. */function _slerp(out,a,b,t){// benchmarks:
  50307. // http://jsperf.com/quaternion-slerp-implementations
  50308. 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
  50309. cosom=ax*bx+ay*by+az*bz+aw*bw;// adjust signs (if necessary)
  50310. if(cosom<0.0){cosom=-cosom;bx=-bx;by=-by;bz=-bz;bw=-bw;}// calculate coefficients
  50311. if(1.0-cosom>EPSILON){// standard case (slerp)
  50312. 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
  50313. // ... so we can do a linear interpolation
  50314. scale0=1.0-t;scale1=t;}// calculate final values
  50315. 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;}/**
  50316. * Calculates the inverse of a quat
  50317. *
  50318. * @param {quat} out the receiving quaternion
  50319. * @param {ReadonlyQuat} a quat to calculate inverse of
  50320. * @returns {quat} out
  50321. */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
  50322. out[0]=-a0*invDot;out[1]=-a1*invDot;out[2]=-a2*invDot;out[3]=a3*invDot;return out;}/**
  50323. * Calculates the conjugate of a quat
  50324. * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.
  50325. *
  50326. * @param {quat} out the receiving quaternion
  50327. * @param {ReadonlyQuat} a quat to calculate conjugate of
  50328. * @returns {quat} out
  50329. */function _conjugate(out,a){out[0]=-a[0];out[1]=-a[1];out[2]=-a[2];out[3]=a[3];return out;}/**
  50330. * Creates a quaternion from the given 3x3 rotation matrix.
  50331. *
  50332. * NOTE: The resultant quaternion is not normalized, so you should be sure
  50333. * to renormalize the quaternion yourself where necessary.
  50334. *
  50335. * @param {quat} out the receiving quaternion
  50336. * @param {ReadonlyMat3} m rotation matrix
  50337. * @returns {quat} out
  50338. * @function
  50339. */function fromMat3(out,m){// Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes
  50340. // article "Quaternion Calculus and Fast Animation".
  50341. var fTrace=m[0]+m[4]+m[8];var fRoot;if(fTrace>0.0){// |w| > 1/2, may as well choose w > 1/2
  50342. fRoot=Math.sqrt(fTrace+1.0);// 2w
  50343. out[3]=0.5*fRoot;fRoot=0.5/fRoot;// 1/(4w)
  50344. 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
  50345. 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;}/**
  50346. * Adds two quat's
  50347. *
  50348. * @param {quat} out the receiving quaternion
  50349. * @param {ReadonlyQuat} a the first operand
  50350. * @param {ReadonlyQuat} b the second operand
  50351. * @returns {quat} out
  50352. * @function
  50353. */var _add=add$1;/**
  50354. * Scales a quat by a scalar number
  50355. *
  50356. * @param {quat} out the receiving vector
  50357. * @param {ReadonlyQuat} a the vector to scale
  50358. * @param {Number} b amount to scale the vector by
  50359. * @returns {quat} out
  50360. * @function
  50361. */var _scale2=scale$1;/**
  50362. * Calculates the dot product of two quat's
  50363. *
  50364. * @param {ReadonlyQuat} a the first operand
  50365. * @param {ReadonlyQuat} b the second operand
  50366. * @returns {Number} dot product of a and b
  50367. * @function
  50368. */var _dot=dot$1;/**
  50369. * Performs a linear interpolation between two quat's
  50370. *
  50371. * @param {quat} out the receiving quaternion
  50372. * @param {ReadonlyQuat} a the first operand
  50373. * @param {ReadonlyQuat} b the second operand
  50374. * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
  50375. * @returns {quat} out
  50376. * @function
  50377. */var _lerp=lerp$1;/**
  50378. * Calculates the length of a quat
  50379. *
  50380. * @param {ReadonlyQuat} a vector to calculate length of
  50381. * @returns {Number} length of a
  50382. */var length=length$1;/**
  50383. * Calculates the squared length of a quat
  50384. *
  50385. * @param {ReadonlyQuat} a vector to calculate squared length of
  50386. * @returns {Number} squared length of a
  50387. * @function
  50388. */var squaredLength=squaredLength$1;/**
  50389. * Normalize a quat
  50390. *
  50391. * @param {quat} out the receiving quaternion
  50392. * @param {ReadonlyQuat} a quaternion to normalize
  50393. * @returns {quat} out
  50394. * @function
  50395. */var normalize=normalize$1;/**
  50396. * Sets a quaternion to represent the shortest rotation from one
  50397. * vector to another.
  50398. *
  50399. * Both vectors are assumed to be unit length.
  50400. *
  50401. * @param {quat} out the receiving quaternion.
  50402. * @param {ReadonlyVec3} a the initial vector
  50403. * @param {ReadonlyVec3} b the destination vector
  50404. * @returns {quat} out
  50405. */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$2(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);}};}()/**
  50406. * Performs a spherical linear interpolation with two control points
  50407. *
  50408. * @param {quat} out the receiving quaternion
  50409. * @param {ReadonlyQuat} a the first operand
  50410. * @param {ReadonlyQuat} b the second operand
  50411. * @param {ReadonlyQuat} c the third operand
  50412. * @param {ReadonlyQuat} d the fourth operand
  50413. * @param {Number} t interpolation amount, in the range [0-1], between the two inputs
  50414. * @returns {quat} out
  50415. */;(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;};})()/**
  50416. * Sets the specified quaternion with values corresponding to the given
  50417. * axes. Each axis is a vec3 and is expected to be unit length and
  50418. * perpendicular to all other specified axes.
  50419. *
  50420. * @param {ReadonlyVec3} view the vector representing the viewing direction
  50421. * @param {ReadonlyVec3} right the vector representing the local "right" direction
  50422. * @param {ReadonlyVec3} up the vector representing the local "up" direction
  50423. * @returns {quat} out
  50424. */;(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$M(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$2._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$2._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$5(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$5(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
  50425. 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做调整
  50426. 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/* frameState.camera.right / 100 */:Math.max(tile._distanceToCamera,1e-7);//xzw 改
  50427. var height=frameState.height,sseDenominator=frameState.sseDenominator;var viewDistanceScale=tileset.options.viewDistanceScale;// 屏幕空间误差SSE = (几何误差geometricError * canvas高度) / (相机到tile的距离 * 相机指数)
  50428. 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
  50429. _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
  50430. },{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模型)
  50431. var isFloorShow=tile.tileset.options.currentFloorId=='all'||tile.floorIndex==void 0||tile.floorIndex==tile.tileset.options.currentFloorId;// 循环遍历子tile
  50432. if(this.canTraverse(tile,frameState)&&isFloorShow){this.updateChildTiles(tile,frameState);// 根据isVisibleAndInRequestVolume判断是否select
  50433. 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$5(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
  50434. var checkRefines=tile.refine===TILE_REFINEMENT.REPLACE&&tile.hasRenderContent&&!skipLevelOfDetail;var hasVisibleChild=false;var refines=true;var _iterator17=_createForOfIteratorHelper$5(children),_step17;try{for(_iterator17.s();!(_step17=_iterator17.n()).done;){var child=_step17.value;child._selectionDepth=depth;// !zeg改 全部显示子tile,isVisibleAndInRequestVolume只判断是否选中。如果在这里过滤视野外tile,模型会需要重新加载
  50435. if(stack.find(child)){stack.delete(child);}stack.push(child);// 如果hasVisibleChild全都不为true,则tile全在可视范围外,不会被selectTile
  50436. 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;}// 判断是否遍历(即判断是否更新更精细的模型)
  50437. },{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一般不可能只有一层)
  50438. 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都将重新加载
  50439. // // 如果tile不在可视范围内,则不加载更精细的模型
  50440. // if (!ignoreVisibility && !tile.isVisibleAndInRequestVolume) {
  50441. // return false
  50442. // }
  50443. 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;}// 是否更新更精细的模型
  50444. },{key:"shouldRefine",value:function shouldRefine(tile,frameState,useParentMetric){if(tile.tileset.options.loadMaxLevelDirect){return true;//xzw add : 直接加载到最高清晰度,用于截图
  50445. }var screenSpaceError=tile._screenSpaceError;if(useParentMetric){screenSpaceError=tile.getScreenSpaceError(frameState,true);}// 距离越近,SSE越大
  50446. 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可视
  50447. },{key:"anyChildrenVisible",value:function anyChildrenVisible(tile,frameState){var anyVisible=false;var _iterator18=_createForOfIteratorHelper$5(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$5(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所在楼层
  50448. 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;}// 是否在可视范围内
  50449. },{key:"isVisibleAndInRequestVolume",get:function get(){return this.tileset.visible&&this._visible&&this._inRequestVolume;//xzw add this.tileset.visible
  50450. }},{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请求
  50451. this.controller=new AbortController();contentUrl=this.tileset.getTileUrl(this.contentUrl)+"?_=".concat(this.tileset.options.imageVersion);// !zeg改 添加version后缀
  50452. 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
  50453. 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$M(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
  50454. 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也不可视
  50455. 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$M(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$5(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$M(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
  50456. {var v=true;Object.defineProperty(_assertThisInitialized(_this15),'visible',{//xzw add。false的时候其tiles将不会显示
  50457. get:function get(){return v;},set:function set(visi){if(visi!=v){_this15.nextForceUpdate=true;v=visi;}}});}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$5(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$5(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$5(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$5(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$5(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$5(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改
  50458. }},{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$5(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$5(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$5(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$5(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$5(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$M(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$M(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$M(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$M(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$M(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$M(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$M(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$M(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$M(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$M(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$M(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$5(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);}/**
  50459. * -----------------------CesiumIonLoader--------------------------
  50460. */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$5(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$2,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$2||(i$2={})),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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(scenegraph.json.meshes||[]);_context12.prev=1;_iterator40.s();case 3:if((_step40=_iterator40.n()).done){_context12.next=24;break;}mesh=_step40.value;_iterator41=_createForOfIteratorHelper$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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$5(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
  50461. 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$5(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$5(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$5(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$5(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
  50462. function generateGradientTexture(gradient){var size=64;// create canvas
  50463. var canvas=document.createElement('canvas');canvas.width=size;canvas.height=size;// get context
  50464. var context=canvas.getContext('2d');// draw gradient
  50465. 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);
  50466. 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;
  50467. return texture;}function _getCameraFrustum(camera){camera.updateMatrix();// make sure camera's local matrix is updated
  50468. camera.updateMatrixWorld();// make sure camera's world matrix is updated
  50469. 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
  50470. var planeGeometry=new THREE$1.PlaneGeometry(10,5);// Align the geometry to the plane
  50471. 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
  50472. /*
  50473. const edges = new EdgesGeometry(planeGeometry)
  50474. var dispPlane = new LineSegments(edges, new LineBasicMaterial({ color: 0x00ffff }))*/ //plane
  50475. 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
  50476. 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;}/*
  50477. * from https://github.com/tentone/geo-three
  50478. * Tree-shaking did not work, probably due to static class methods
  50479. */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/
  50480. 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
  50481. // values taken from: https://gist.github.com/mikhailov-work/ee72ba4191942acecc03fe6da94fc73f
  50482. // original file licensed under Apache-2.0
  50483. 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:/**
  50484. * Loads a tileset of 3D Tiles according to the given {@link LoaderProps}
  50485. * @public
  50486. *
  50487. * @param props - Properties for this load call {@link LoaderProps}.
  50488. * @returns An object containing the 3D Model to be added to the scene
  50489. * and a runtime engine to be updated every frame.
  50490. */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
  50491. if(disposeFlag||options.pauseTilesetUpdate){return;}// Assumes camera fov, near and far are not changing
  50492. 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
  50493. sseDenominator=0.25*(camera.top-camera.bottom);//等同于相机距离,因为越远看的越广//camera.aspect > 1 ? (camera.right - camera.left) : (camera.top - camera.bottom)
  50494. //越大越粗糙
  50495. }lastCameraAspect=camera.aspect;lastCameraTop=camera.top;//add
  50496. lastCameraLeft=camera.left;//add
  50497. 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
  50498. type:camera.type,//xzw add
  50499. left:camera.left,right:camera.right,top:camera.top,bottom:camera.bottom//xzw add
  50500. },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更新
  50501. tileset._cache.reset();tileset._traverser.traverse(tileset.root,frameState,tileset.options);// 遍历更新
  50502. var _iterator55=_createForOfIteratorHelper$5(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
  50503. 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
  50504. }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
  50505. 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对不上
  50506. renderMap={};boxMap={};unloadQueue=[];// !zeg改 使用4dkankan里传入的model
  50507. root=props.model||new THREE$1.Group();tileBoxes=new THREE$1.Group();if(options.debug){root.add(tileBoxes);// 只在debug的时候才把tileBoxes添加进root
  50508. }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改 用于兼容专属逻辑
  50509. imageVersion:options.imageVersion,// !zeg改 用于更新瓦片模型的version
  50510. ingoreVisibleCompute:!!options.ingoreVisibleCompute,// !zeg改 禁用屏幕外瓦片计算
  50511. 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
  50512. 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}})}));//
  50513. // transformations
  50514. 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
  50515. // https://github.com/visgl/loaders.gl/issues/1994
  50516. 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
  50517. 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无需等待
  50518. //let lastCameraTransform = null
  50519. 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$5(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
  50520. update:function update(dt,renderer,camera,isForse){cameraReference=camera;rendererReference=renderer;if(!isForse)isForse=tileset.nextForceUpdate;tileset.nextForceUpdate=false;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) {
  50521. // lastCameraTransform = new Matrix4$1().copy(camera.matrixWorld)
  50522. //} else {
  50523. //const cameraChanged = !camera.matrixWorld.equals(lastCameraTransform) || !(camera.aspect == lastCameraAspect)
  50524. //if (cameraChanged || isForse) {
  50525. //if (lastCameraTransform == null) {
  50526. // lastCameraTransform = new Matrix4$1().copy(camera.matrixWorld)
  50527. //} else {
  50528. //const cameraChanged = !camera.matrixWorld.equals(lastCameraTransform) || !(camera.aspect == lastCameraAspect)
  50529. //if (cameraChanged || isForse) {
  50530. timer=0;tileset._frameNumber++;camera.getWorldPosition(lastCameraPosition);//lastCameraTransform.copy(camera.matrixWorld)
  50531. //lastCameraTransform.copy(camera.matrixWorld)
  50532. tilesetUpdate(tileset,renderMap,renderer,camera);//}
  50533. //}
  50534. }},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改
  50535. // 显示并让所有tile按照相机位置细化,不受可视范围影响
  50536. ingoreVisibleCompute:function ingoreVisibleCompute(visi){tileset.options.ingoreVisibleCompute=visi;tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);},// 暂停tile更新,保持当前tile的显隐和depth
  50537. pauseTilesetUpdate:function pauseTilesetUpdate(isPause){options.pauseTilesetUpdate=isPause;if(!isPause){tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);}},// 设置是否限制为最低精度tile深度
  50538. limit2lowestDepth:function limit2lowestDepth(isLowest){options.isLowestDepth=!!isLowest;if(cameraReference){tileset._frameNumber++;tilesetUpdate(tileset,renderMap,rendererReference,cameraReference);}},// 清空正在加载的tile
  50539. clearLoadingTiles:function clearLoadingTiles(){tileset.loadingTiles.forEach(function(tile){return tile.controller&&tile.controller.abort();});},// 模型的总体积
  50540. 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
  50541. // The computed trasnform already contains the root's transform, so we have to invert it
  50542. 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
  50543. }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
  50544. // 模型加载成功
  50545. var tileContent=gltf.scenes[0];var meshes=[];tileContent.traverse(function(object){if(object.type=='Mesh'){meshes.push(object);// 提取tileContent里面的所有mesh
  50546. }});tileContent.clear();// 清空tileContent
  50547. // 清空tileContent
  50548. 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里
  50549. 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])
  50550. }if(tile.tileset.options.type=='4dkk'){// 将mesh转为chunk
  50551. 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
  50552. }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
  50553. 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
  50554. var _iterator57=_createForOfIteratorHelper$5(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);}}
  50555. var baseURL = getScriptURL(); // 兼容V2
  50556. var compatiblev2 = function compatiblev2(data) {
  50557. if (!data.floors) {
  50558. data = {
  50559. floors: [data]
  50560. };
  50561. }
  50562. data.floors.map(function (data) {
  50563. data.column = data.column || [];
  50564. data.window = data.window || [];
  50565. data.door = data.door || [];
  50566. data.groundCase = data.groundCase || [];
  50567. data.bayCase = data.bayCase || [];
  50568. data.slideDoor = data.slideDoor || [];
  50569. data.tagging = data.tagging || [];
  50570. data.furnColumn = data.furnColumn || [];
  50571. data.furnFlue = data.furnFlue || [];
  50572. if (data.rooms || data.room || data.points) {
  50573. data.room = data.rooms || data.room || data.points;
  50574. data.room.forEach(function (room) {
  50575. if (!isNumber(room.top)) {
  50576. room.top = isNumber(data.top) ? data.top : 1;
  50577. }
  50578. if (!isNumber(room.bottom)) {
  50579. room.bottom = isNumber(data.bottom) ? data.bottom : 1;
  50580. }
  50581. if (!room.ground && room.points) {
  50582. room.ground = room.points;
  50583. }
  50584. if (!room.hole) {
  50585. room.hole = [];
  50586. }
  50587. room.close = true;
  50588. });
  50589. }
  50590. return data;
  50591. });
  50592. return data;
  50593. };
  50594. defineComponent('resource', function () {
  50595. return /*#__PURE__*/function () {
  50596. function Resource() {
  50597. _classCallCheck(this, Resource);
  50598. this.reload = false;
  50599. this.version = Date.now();
  50600. this.nowTime = Date.now();
  50601. this.imageVersion = 0;
  50602. this.linkVersion = 0;
  50603. }
  50604. _createClass(Resource, [{
  50605. key: "num",
  50606. get: function get() {
  50607. return this.$app.config.num;
  50608. }
  50609. }, {
  50610. key: "mode",
  50611. get: function get() {
  50612. return this.$app.config.view ? 'view' : 'edit';
  50613. }
  50614. }, {
  50615. key: "time",
  50616. get: function get() {
  50617. if (this.reload || this.refresh) {
  50618. if (this.reload) {
  50619. this.reload = false;
  50620. this.refresh = Date.now();
  50621. }
  50622. return this.refresh;
  50623. }
  50624. return this.version;
  50625. }
  50626. }, {
  50627. key: "base",
  50628. value: function base(path) {
  50629. return baseURL + path;
  50630. }
  50631. }, {
  50632. key: "auth",
  50633. value: function () {
  50634. var _auth = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  50635. var data;
  50636. return regenerator.wrap(function _callee$(_context) {
  50637. while (1) {
  50638. switch (_context.prev = _context.next) {
  50639. case 0:
  50640. if (!(this.mode != 'edit')) {
  50641. _context.next = 2;
  50642. break;
  50643. }
  50644. return _context.abrupt("return");
  50645. case 2:
  50646. _context.prev = 2;
  50647. _context.next = 5;
  50648. return this.$app.remote_editor.getAuth({
  50649. num: this.num
  50650. });
  50651. case 5:
  50652. data = _context.sent;
  50653. if (data.success) {
  50654. this.$app.store.set('auth', data.data);
  50655. }
  50656. return _context.abrupt("return", data);
  50657. case 10:
  50658. _context.prev = 10;
  50659. _context.t0 = _context["catch"](2);
  50660. throw _context.t0;
  50661. case 13:
  50662. case "end":
  50663. return _context.stop();
  50664. }
  50665. }
  50666. }, _callee, this, [[2, 10]]);
  50667. }));
  50668. function auth() {
  50669. return _auth.apply(this, arguments);
  50670. }
  50671. return auth;
  50672. }()
  50673. }, {
  50674. key: "metadata",
  50675. value: function () {
  50676. var _metadata = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
  50677. var data, resp, params;
  50678. return regenerator.wrap(function _callee2$(_context2) {
  50679. while (1) {
  50680. switch (_context2.prev = _context2.next) {
  50681. case 0:
  50682. logger$1.time("".concat(this.$app.config.num, "[load metadata]").concat(this.$app.uid));
  50683. data = null;
  50684. resp = null;
  50685. params = "?num=".concat(this.$app.config.num);
  50686. if (this.$app.config.params) {
  50687. params += "&".concat(this.$app.config.params);
  50688. }
  50689. if (browser$1.urlHasValue('sign')) {
  50690. params += "&sign=".concat(browser$1.valueFromUrl('sign'));
  50691. }
  50692. params += "&_=".concat(this.time);
  50693. if (!this.$app.config.view) {
  50694. _context2.next = 23;
  50695. break;
  50696. }
  50697. if (!(this.$app.config.deploy == 'local' && !this.$app.config.server)) {
  50698. _context2.next = 14;
  50699. break;
  50700. }
  50701. _context2.next = 11;
  50702. return http.get(this.getViewResourceURL("data/scene.json?_=".concat(this.time)));
  50703. case 11:
  50704. resp = _context2.sent;
  50705. _context2.next = 21;
  50706. break;
  50707. case 14:
  50708. if (!window.__KANKAN_DATA) {
  50709. _context2.next = 18;
  50710. break;
  50711. }
  50712. resp = window.__KANKAN_DATA;
  50713. _context2.next = 21;
  50714. break;
  50715. case 18:
  50716. _context2.next = 20;
  50717. return http.get("/service/scene/getInfo" + params);
  50718. case 20:
  50719. resp = _context2.sent;
  50720. case 21:
  50721. _context2.next = 26;
  50722. break;
  50723. case 23:
  50724. _context2.next = 25;
  50725. return http.get("/service/scene/edit/getInfo" + params);
  50726. case 25:
  50727. resp = _context2.sent;
  50728. case 26:
  50729. if (!(resp.success != void 0)) {
  50730. _context2.next = 34;
  50731. break;
  50732. }
  50733. if (!resp.success) {
  50734. _context2.next = 31;
  50735. break;
  50736. }
  50737. data = resp.data;
  50738. _context2.next = 32;
  50739. break;
  50740. case 31:
  50741. return _context2.abrupt("return");
  50742. case 32:
  50743. _context2.next = 35;
  50744. break;
  50745. case 34:
  50746. data = resp;
  50747. case 35:
  50748. if (data.entry) {
  50749. if (typeof data.entry === 'string') {
  50750. data.entry = JSON.parse(data.entry);
  50751. }
  50752. }
  50753. if (data.boxVideos) {
  50754. if (typeof data.boxVideos === 'string') {
  50755. data.boxVideos = JSON.parse(data.boxVideos);
  50756. }
  50757. }
  50758. if (data.boxPhotos) {
  50759. if (typeof data.boxPhotos === 'string') {
  50760. data.boxPhotos = JSON.parse(data.boxPhotos);
  50761. }
  50762. }
  50763. if (data.boxModels) {
  50764. if (typeof data.boxModels === 'string') {
  50765. data.boxModels = JSON.parse(data.boxModels);
  50766. }
  50767. }
  50768. if (data.videos) {
  50769. if (typeof data.videos === 'string') {
  50770. data.videos = JSON.parse(data.videos);
  50771. }
  50772. }
  50773. if (data.version) {
  50774. this.version = data.version;
  50775. this.imageVersion = data.imgVersion || 0;
  50776. this.linkVersion = data.linkVersion || 0;
  50777. }
  50778. if (data.sns == void 0) {
  50779. data.sns = {};
  50780. if (data.sns.share == void 0) {
  50781. data.sns.share = {};
  50782. data.sns.share = {
  50783. __init__: true,
  50784. title: data.title,
  50785. keywords: '',
  50786. description: data.description,
  50787. image: data.entry ? 'thumb-1k.jpg' : null
  50788. };
  50789. }
  50790. }
  50791. if (data.orientation) {
  50792. data.orientation = Number(data.orientation);
  50793. }
  50794. logger$1.timeEnd("".concat(this.$app.config.num, "[load metadata]").concat(this.$app.uid));
  50795. this.$app.store.set('metadata', data);
  50796. return _context2.abrupt("return", data);
  50797. case 46:
  50798. case "end":
  50799. return _context2.stop();
  50800. }
  50801. }
  50802. }, _callee2, this);
  50803. }));
  50804. function metadata() {
  50805. return _metadata.apply(this, arguments);
  50806. }
  50807. return metadata;
  50808. }()
  50809. /**
  50810. * 加载漫游点
  50811. */
  50812. }, {
  50813. key: "visions",
  50814. value: function () {
  50815. var _visions = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {
  50816. var _this = this;
  50817. var data, metadata, decompress;
  50818. return regenerator.wrap(function _callee3$(_context3) {
  50819. while (1) {
  50820. switch (_context3.prev = _context3.next) {
  50821. case 0:
  50822. logger$1.time("".concat(this.$app.config.num, "[load visions]").concat(this.$app.uid));
  50823. _context3.next = 3;
  50824. return http.getBueffer(this.getResourceURL("scene_view_data/{num}/images/vision.modeldata?_=".concat(this.version)));
  50825. case 3:
  50826. data = _context3.sent;
  50827. _context3.next = 6;
  50828. return this.$app.store.get('metadata');
  50829. case 6:
  50830. metadata = _context3.sent;
  50831. logger$1.timeEnd("".concat(this.$app.config.num, "[load visions]").concat(this.$app.uid));
  50832. decompress = function decompress(buffer) {
  50833. logger$1.time("".concat(_this.$app.config.num, "[parse modeldata]").concat(_this.$app.uid));
  50834. var sweepLocations = Deompress.decompressModeldata(buffer);
  50835. if (metadata.dataSync == 'ajk') {
  50836. //同步漫游点数据(安居客需要)
  50837. _this.$app.DataSYNC.use('DataAJK', {
  50838. sweepLocations: sweepLocations
  50839. });
  50840. }
  50841. var modeldata = Process.visionModeldata(sweepLocations);
  50842. logger$1.timeEnd("".concat(_this.$app.config.num, "[parse modeldata]").concat(_this.$app.uid)); // todo
  50843. //将vision.modeldata数据进行处理,生成Panorama对象数组,以及设置邻居点, metadata用于检测球幕视频
  50844. _this.$app.core.get('Player').model.panos = Process.panos(_this.$app, modeldata, metadata);
  50845. _this.$app.core.get('Player').model.dispatchEvent({
  50846. type: 'gotPanos'
  50847. });
  50848. };
  50849. decompress(data);
  50850. case 10:
  50851. case "end":
  50852. return _context3.stop();
  50853. }
  50854. }
  50855. }, _callee3, this);
  50856. }));
  50857. function visions() {
  50858. return _visions.apply(this, arguments);
  50859. }
  50860. return visions;
  50861. }()
  50862. /**
  50863. * 加载辅助点位
  50864. */
  50865. }, {
  50866. key: "visions2",
  50867. value: function () {
  50868. var _visions2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4() {
  50869. var _this2 = this;
  50870. var model, data, decompress;
  50871. return regenerator.wrap(function _callee4$(_context4) {
  50872. while (1) {
  50873. switch (_context4.prev = _context4.next) {
  50874. case 0:
  50875. model = this.$app.core.get('Player').model;
  50876. logger$1.time("".concat(this.$app.config.num, "[load visions2]").concat(this.$app.uid));
  50877. _context4.next = 4;
  50878. return http.getBueffer(this.getResourceURL("scene_view_data/{num}/images/vision2.modeldata?_=".concat(this.version)));
  50879. case 4:
  50880. data = _context4.sent;
  50881. logger$1.timeEnd("".concat(this.$app.config.num, "[load visions2]").concat(this.$app.uid));
  50882. decompress = function decompress(buffer) {
  50883. logger$1.time("".concat(_this2.$app.config.num, "[parse modeldata2]").concat(_this2.$app.uid));
  50884. var sweepLocations = Deompress.decompressModeldata(buffer);
  50885. var modeldata = Process.visionModeldata(sweepLocations);
  50886. logger$1.timeEnd("".concat(_this2.$app.config.num, "[parse modeldata2]").concat(_this2.$app.uid));
  50887. var panos = Process.panosAssist(modeldata, _this2.$app);
  50888. panos.forEach(function (pano) {
  50889. model.panos.index[pano.id - 1].assistPano = pano;
  50890. });
  50891. };
  50892. decompress(data);
  50893. case 8:
  50894. case "end":
  50895. return _context4.stop();
  50896. }
  50897. }
  50898. }, _callee4, this);
  50899. }));
  50900. function visions2() {
  50901. return _visions2.apply(this, arguments);
  50902. }
  50903. return visions2;
  50904. }()
  50905. /**
  50906. * 加载模型
  50907. */
  50908. }, {
  50909. key: "modelmesh3dTiles",
  50910. value: function () {
  50911. var _modelmesh3dTiles = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5() {
  50912. var _this3 = this;
  50913. var player, sceneRenderer, result, runtime;
  50914. return regenerator.wrap(function _callee5$(_context5) {
  50915. while (1) {
  50916. switch (_context5.prev = _context5.next) {
  50917. case 0:
  50918. logger$1.time("".concat(this.$app.config.num, "[load modelmesh]").concat(this.$app.uid));
  50919. player = this.$app.core.get('Player');
  50920. sceneRenderer = this.$app.core.get('SceneRenderer');
  50921. _context5.next = 5;
  50922. return Loader3DTiles.load({
  50923. // url: texture.getImageURL('images/3dtiles/tileset.json'),
  50924. // url: texture.getImageURL('images/3dtiles_tianranqi/tileset.json'),
  50925. // url: 'https://4dkk.4dage.com/scene_view_data/SS-Ds19qsmuFA/images/3dtiles/tileset.json',
  50926. // url: 'https://testgis.4dage.com/LVBADUI_qp/tileset.json',
  50927. url: this.getResourceURL("scene_view_data/{num}/images/3dtiles/tileset.json?_=".concat(Date.now())),
  50928. renderer: sceneRenderer.renderer,
  50929. options: {
  50930. dracoDecoderPath: texture.getImageURL('images/loaders/DRACOLoader/draco'),
  50931. basisTranscoderPath: texture.getImageURL('images/loaders/KTX2Loader/basis'),
  50932. maximumScreenSpaceError: browser$1.isMobile() ? 5000 : 40,
  50933. // 和geometryError的计算有关,值越小,瓦片细化所需距离越远
  50934. maxConcurrency: 2,
  50935. isLowestDepth: true,
  50936. // 限制为最低精度
  50937. // debug: true, // 显示tiles的boundingVolume线框
  50938. // updateInterval: 0.01, // update的频率(ms)
  50939. ingoreVisibleCompute: true,
  50940. // 禁用屏幕外瓦片计算,防止初始画面没有模型时不加载tiles
  50941. maximumMemoryUsage: browser$1.detectIOS() ? 0.1 : 64,
  50942. // 最大tiles缓存,默认32(ios防崩) xzw2024:ios不缓存?
  50943. imageVersion: this.imageVersion,
  50944. // 用于更新瓦片模型的version
  50945. type: '4dkk' // 用于兼容专属逻辑
  50946. },
  50947. model: player.model
  50948. });
  50949. case 5:
  50950. result = _context5.sent;
  50951. runtime = result.runtime;
  50952. player.model._3dTilesRuntime = runtime;
  50953. sceneRenderer.autoUpdate3dTiles = true; // // 3dtiles调试面板
  50954. // // ---------------- stats-widget -------------------
  50955. // const statsParent = document.createElement('div')
  50956. // statsParent.id = 'stats-widget'
  50957. // statsParent.style.position = 'absolute'
  50958. // statsParent.style.top = '20px'
  50959. // statsParent.style.left = '100px'
  50960. // statsParent.style.backgroundColor = 'rgb(255 255 255 / 83%)'
  50961. // statsParent.style.padding = '10px'
  50962. // statsParent.style.width = '300px'
  50963. // statsParent.style.wordBreak = 'break-all'
  50964. // statsParent.style.zIndex = '9999'
  50965. // statsParent.style.fontSize = '18px'
  50966. // document.querySelector('body').appendChild(statsParent)
  50967. // player.model._3dTilesRuntime.stats = new StatsWidget(runtime.getStats(), { container: statsParent })
  50968. // // -------------------------------------------------
  50969. // 当瓦片都加载完时,继续加载其他场景数据
  50970. runtime.getTileset().on('endTileLoading', function (data) {
  50971. if (data.loadingCount == 0 && !player.model.mesh3dTilesLoaded) {
  50972. player.model.mesh3dTilesLoaded = true;
  50973. player.model.floors.sort();
  50974. if (browser$1.detectIOS()) {
  50975. // ios要计算模型体积,当体积过大时,不会加载最精细一层
  50976. var modelBox = new THREE.Box3();
  50977. player.model.floors.forEach(function (floor) {
  50978. return modelBox.union(floor.boundingBox);
  50979. });
  50980. player.model._3dTilesRuntime.setModelSize(modelBox.getSize(new THREE.Vector3()));
  50981. }
  50982. _this3.$app.Scene.emit('3dTilesLoaded');
  50983. player.model._3dTilesRuntime.pauseTilesetUpdate(false); // 先update一次
  50984. player.model._3dTilesRuntime.pauseTilesetUpdate(true);
  50985. logger$1.timeEnd("".concat(_this3.$app.config.num, "[load modelmesh]").concat(_this3.$app.uid));
  50986. }
  50987. });
  50988. case 10:
  50989. case "end":
  50990. return _context5.stop();
  50991. }
  50992. }
  50993. }, _callee5, this);
  50994. }));
  50995. function modelmesh3dTiles() {
  50996. return _modelmesh3dTiles.apply(this, arguments);
  50997. }
  50998. return modelmesh3dTiles;
  50999. }()
  51000. }, {
  51001. key: "modelmeshDam",
  51002. value: function () {
  51003. var _modelmeshDam = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee6() {
  51004. var _this4 = this;
  51005. var dam, data, addToModel, decompress;
  51006. return regenerator.wrap(function _callee6$(_context6) {
  51007. while (1) {
  51008. switch (_context6.prev = _context6.next) {
  51009. case 0:
  51010. addToModel = function _addToModel(chunks, player) {
  51011. if (0 === chunks.length) {
  51012. logger$1.warn('No geometry found for model, loading faux geometry, disabling outside mode');
  51013. player.model.supportedModes[Viewmode$1.DOLLHOUSE] = !1;
  51014. player.model.supportedModes[Viewmode$1.FLOORPLAN] = !1;
  51015. var chunk = new Chunk({
  51016. geometry: new THREE.PlaneBufferGeometry(5, 5, 1, 1)
  51017. });
  51018. chunk.material.visible = !1;
  51019. chunk.rotateX(-Math.PI / 2);
  51020. chunk.geometry.computeBoundingBox();
  51021. chunks = [chunk];
  51022. }
  51023. chunks.forEach(function (mesh) {
  51024. var floorIndex = 0;
  51025. if (player.model.floorsEnabled) {
  51026. floorIndex = Chunks.parseFloor(mesh.name);
  51027. }
  51028. player.model.addChunk(floorIndex, mesh);
  51029. });
  51030. player.model.floors.sort(); //deferred.resolve(player.model);
  51031. };
  51032. dam = settings$3.job + settings$3.format; //dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam
  51033. if (this.$app.config.model.name) {
  51034. dam = this.$app.config.model.name;
  51035. }
  51036. logger$1.time("".concat(this.$app.config.num, "[load modelmesh]").concat(this.$app.uid));
  51037. _context6.next = 6;
  51038. return http.getBueffer(this.getResourceURL("scene_view_data/{num}/images/".concat(dam, "?_=").concat(this.imageVersion)));
  51039. case 6:
  51040. data = _context6.sent;
  51041. logger$1.timeEnd("".concat(this.$app.config.num, "[load modelmesh]").concat(this.$app.uid));
  51042. decompress = function decompress(buffer) {
  51043. logger$1.time("".concat(_this4.$app.config.num, "[parse dam]").concat(_this4.$app.uid));
  51044. var meshdata = Deompress.decompressMesh(buffer);
  51045. var chunks = Process.convertProtobufToSceneObject(_this4.$app, meshdata);
  51046. logger$1.timeEnd("".concat(_this4.$app.config.num, "[parse dam]").concat(_this4.$app.uid));
  51047. addToModel(chunks, _this4.$app.core.get('Player'));
  51048. };
  51049. decompress(data);
  51050. case 10:
  51051. case "end":
  51052. return _context6.stop();
  51053. }
  51054. }
  51055. }, _callee6, this);
  51056. }));
  51057. function modelmeshDam() {
  51058. return _modelmeshDam.apply(this, arguments);
  51059. }
  51060. return modelmeshDam;
  51061. }()
  51062. }, {
  51063. key: "textures",
  51064. value: function () {
  51065. var _textures = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee7() {
  51066. return regenerator.wrap(function _callee7$(_context7) {
  51067. while (1) {
  51068. switch (_context7.prev = _context7.next) {
  51069. case 0:
  51070. logger$1.time("".concat(this.$app.config.num, "[load textures]").concat(this.$app.uid));
  51071. _context7.next = 3;
  51072. return ModelTextureLoader.load(this.$app.core.get('Player').model, this.$app.core.get('Player').model.meshTextures, this);
  51073. case 3:
  51074. logger$1.timeEnd("".concat(this.$app.config.num, "[load textures]").concat(this.$app.uid));
  51075. this.$app.core.get('Player').model.meshTexturesLoaded = !0;
  51076. case 5:
  51077. case "end":
  51078. return _context7.stop();
  51079. }
  51080. }
  51081. }, _callee7, this);
  51082. }));
  51083. function textures() {
  51084. return _textures.apply(this, arguments);
  51085. }
  51086. return textures;
  51087. }()
  51088. /**
  51089. * 原始算法楼层数据(数据同步使用)
  51090. * @returns
  51091. */
  51092. }, {
  51093. key: "floor",
  51094. value: function () {
  51095. var _floor = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee8() {
  51096. var data;
  51097. return regenerator.wrap(function _callee8$(_context8) {
  51098. while (1) {
  51099. switch (_context8.prev = _context8.next) {
  51100. case 0:
  51101. data = null;
  51102. _context8.prev = 1;
  51103. logger$1.time("".concat(this.$app.config.num, "[load floor]").concat(this.$app.uid));
  51104. _context8.next = 5;
  51105. return http.get(this.getResourceURL("scene_view_data/{num}/data/floor.json?_=".concat(this.time)));
  51106. case 5:
  51107. data = _context8.sent;
  51108. logger$1.timeEnd("".concat(this.$app.config.num, "[load floor]").concat(this.$app.uid));
  51109. _context8.next = 12;
  51110. break;
  51111. case 9:
  51112. _context8.prev = 9;
  51113. _context8.t0 = _context8["catch"](1);
  51114. logger$1.warn('loaded [floor] error');
  51115. case 12:
  51116. return _context8.abrupt("return", data);
  51117. case 13:
  51118. case "end":
  51119. return _context8.stop();
  51120. }
  51121. }
  51122. }, _callee8, this, [[1, 9]]);
  51123. }));
  51124. function floor() {
  51125. return _floor.apply(this, arguments);
  51126. }
  51127. return floor;
  51128. }()
  51129. }, {
  51130. key: "floorcad",
  51131. value: function () {
  51132. var _floorcad = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee9() {
  51133. var data;
  51134. return regenerator.wrap(function _callee9$(_context9) {
  51135. while (1) {
  51136. switch (_context9.prev = _context9.next) {
  51137. case 0:
  51138. data = null;
  51139. _context9.prev = 1;
  51140. logger$1.time("".concat(this.$app.config.num, "[load floorcad]").concat(this.$app.uid));
  51141. _context9.next = 5;
  51142. return http.get(this.getResourceURL("scene_view_data/{num}/data/floorplan_cad.json?_=".concat(this.time)));
  51143. case 5:
  51144. data = _context9.sent;
  51145. if (!data.floors) {
  51146. data = compatiblev2(data);
  51147. }
  51148. if (data && data.floors) {
  51149. data.floors = data.floors.filter(function (floor) {
  51150. return floor.segment && floor.segment.length > 0;
  51151. });
  51152. }
  51153. logger$1.timeEnd("".concat(this.$app.config.num, "[load floorcad]").concat(this.$app.uid));
  51154. _context9.next = 14;
  51155. break;
  51156. case 11:
  51157. _context9.prev = 11;
  51158. _context9.t0 = _context9["catch"](1);
  51159. logger$1.warn('loaded [floorcad] error');
  51160. case 14:
  51161. this.$app.store.set('floorcad', data);
  51162. return _context9.abrupt("return", data);
  51163. case 16:
  51164. case "end":
  51165. return _context9.stop();
  51166. }
  51167. }
  51168. }, _callee9, this, [[1, 11]]);
  51169. }));
  51170. function floorcad() {
  51171. return _floorcad.apply(this, arguments);
  51172. }
  51173. return floorcad;
  51174. }()
  51175. }, {
  51176. key: "flooruser",
  51177. value: function () {
  51178. var _flooruser = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee10() {
  51179. var data, meta;
  51180. return regenerator.wrap(function _callee10$(_context10) {
  51181. while (1) {
  51182. switch (_context10.prev = _context10.next) {
  51183. case 0:
  51184. data = null;
  51185. meta = this.$app.store.getValue('metadata');
  51186. _context10.prev = 2;
  51187. logger$1.time("".concat(this.$app.config.num, "[load flooruser]").concat(this.$app.uid));
  51188. if (!meta.floorPlanUser) {
  51189. _context10.next = 10;
  51190. break;
  51191. }
  51192. _context10.next = 7;
  51193. return http.get(this.getUserResourceURL("floorplan.json", this.reload));
  51194. case 7:
  51195. data = _context10.sent;
  51196. _context10.next = 13;
  51197. break;
  51198. case 10:
  51199. _context10.next = 12;
  51200. return http.get(this.getViewDataURL("floorplan.json"));
  51201. case 12:
  51202. data = _context10.sent;
  51203. case 13:
  51204. logger$1.timeEnd("".concat(this.$app.config.num, "[load flooruser]").concat(this.$app.uid));
  51205. _context10.next = 30;
  51206. break;
  51207. case 16:
  51208. _context10.prev = 16;
  51209. _context10.t0 = _context10["catch"](2);
  51210. logger$1.warn('loaded [flooruser] error');
  51211. if (!meta.floorPlanUser) {
  51212. _context10.next = 29;
  51213. break;
  51214. }
  51215. _context10.prev = 20;
  51216. _context10.next = 23;
  51217. return http.get(this.getViewDataURL("floorplan.json"));
  51218. case 23:
  51219. data = _context10.sent;
  51220. _context10.next = 29;
  51221. break;
  51222. case 26:
  51223. _context10.prev = 26;
  51224. _context10.t1 = _context10["catch"](20);
  51225. logger$1.warn('loaded [flooruser] error');
  51226. case 29:
  51227. if (!data) {
  51228. data = {
  51229. unit: 'm',
  51230. floors: [{
  51231. walls: {
  51232. Wall7: {
  51233. important: false,
  51234. geoType: 'Wall',
  51235. children: [],
  51236. start: 'Point3',
  51237. vectorId: 'Wall7',
  51238. width: 0.2,
  51239. end: 'Point0',
  51240. out: false
  51241. },
  51242. Wall6: {
  51243. important: false,
  51244. geoType: 'Wall',
  51245. children: [],
  51246. start: 'Point2',
  51247. vectorId: 'Wall6',
  51248. width: 0.2,
  51249. end: 'Point3',
  51250. out: false
  51251. },
  51252. Wall5: {
  51253. important: false,
  51254. geoType: 'Wall',
  51255. children: [],
  51256. start: 'Point1',
  51257. vectorId: 'Wall5',
  51258. width: 0.2,
  51259. end: 'Point2',
  51260. out: false
  51261. },
  51262. Wall4: {
  51263. important: false,
  51264. geoType: 'Wall',
  51265. children: [],
  51266. start: 'Point0',
  51267. vectorId: 'Wall4',
  51268. width: 0.2,
  51269. end: 'Point1',
  51270. out: false
  51271. }
  51272. },
  51273. subgroup: 0,
  51274. name: '1楼',
  51275. id: 0,
  51276. points: {
  51277. Point1: {
  51278. parent: {
  51279. Wall5: 'start',
  51280. Wall4: 'end'
  51281. },
  51282. geoType: 'Point',
  51283. vectorId: 'Point1',
  51284. x: 5.531,
  51285. y: 5.777
  51286. },
  51287. Point0: {
  51288. parent: {
  51289. Wall7: 'end',
  51290. Wall4: 'start'
  51291. },
  51292. geoType: 'Point',
  51293. vectorId: 'Point0',
  51294. x: 5.531,
  51295. y: -6.046
  51296. },
  51297. Point3: {
  51298. parent: {
  51299. Wall7: 'start',
  51300. Wall6: 'end'
  51301. },
  51302. geoType: 'Point',
  51303. vectorId: 'Point3',
  51304. x: -2.663,
  51305. y: -6.046
  51306. },
  51307. Point2: {
  51308. parent: {
  51309. Wall6: 'start',
  51310. Wall5: 'end'
  51311. },
  51312. geoType: 'Point',
  51313. vectorId: 'Point2',
  51314. x: -2.663,
  51315. y: 5.777
  51316. }
  51317. }
  51318. }],
  51319. currentId: 8,
  51320. angle: 0,
  51321. type: 'cad',
  51322. version: 'v4.0'
  51323. };
  51324. }
  51325. case 30:
  51326. // if (meta.orientation && data.cadInfo == void 0) {
  51327. // data.angle = 0
  51328. // data.compass = Number(meta.orientation)
  51329. // }
  51330. this.$app.store.set('flooruser', data);
  51331. return _context10.abrupt("return", data);
  51332. case 32:
  51333. case "end":
  51334. return _context10.stop();
  51335. }
  51336. }
  51337. }, _callee10, this, [[2, 16], [20, 26]]);
  51338. }));
  51339. function flooruser() {
  51340. return _flooruser.apply(this, arguments);
  51341. }
  51342. return flooruser;
  51343. }()
  51344. }, {
  51345. key: "billboards",
  51346. value: function () {
  51347. var _billboards = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee11() {
  51348. var _metadata2, data;
  51349. return regenerator.wrap(function _callee11$(_context11) {
  51350. while (1) {
  51351. switch (_context11.prev = _context11.next) {
  51352. case 0:
  51353. _context11.prev = 0;
  51354. _context11.next = 3;
  51355. return this.$app.store.get('metadata');
  51356. case 3:
  51357. _metadata2 = _context11.sent;
  51358. data = null;
  51359. if (!(this.mode === 'view')) {
  51360. _context11.next = 14;
  51361. break;
  51362. }
  51363. if (_metadata2.billboards) {
  51364. _context11.next = 8;
  51365. break;
  51366. }
  51367. return _context11.abrupt("return");
  51368. case 8:
  51369. _context11.next = 10;
  51370. return http.get(this.getUserResourceURL("billboards.json"));
  51371. case 10:
  51372. data = _context11.sent;
  51373. this.$app.store.set('billboards', data);
  51374. _context11.next = 18;
  51375. break;
  51376. case 14:
  51377. _context11.next = 16;
  51378. return this.$app.remote_editor.billboards_list({
  51379. num: this.num
  51380. });
  51381. case 16:
  51382. data = _context11.sent;
  51383. this.$app.store.set('billboards', data.data);
  51384. case 18:
  51385. _context11.next = 23;
  51386. break;
  51387. case 20:
  51388. _context11.prev = 20;
  51389. _context11.t0 = _context11["catch"](0);
  51390. logger$1.error('loaded [billboards] error', _context11.t0);
  51391. case 23:
  51392. case "end":
  51393. return _context11.stop();
  51394. }
  51395. }
  51396. }, _callee11, this, [[0, 20]]);
  51397. }));
  51398. function billboards() {
  51399. return _billboards.apply(this, arguments);
  51400. }
  51401. return billboards;
  51402. }()
  51403. }, {
  51404. key: "cutModel",
  51405. value: function () {
  51406. var _cutModel = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee12() {
  51407. var _metadata3, data;
  51408. return regenerator.wrap(function _callee12$(_context12) {
  51409. while (1) {
  51410. switch (_context12.prev = _context12.next) {
  51411. case 0:
  51412. _context12.prev = 0;
  51413. _context12.next = 3;
  51414. return this.$app.store.get('metadata');
  51415. case 3:
  51416. _metadata3 = _context12.sent;
  51417. data = null;
  51418. if (_metadata3.cutModel) {
  51419. _context12.next = 7;
  51420. break;
  51421. }
  51422. return _context12.abrupt("return");
  51423. case 7:
  51424. if (!(this.mode === 'view')) {
  51425. _context12.next = 14;
  51426. break;
  51427. }
  51428. _context12.next = 10;
  51429. return http.get(this.getUserResourceURL("cutModel.json"));
  51430. case 10:
  51431. data = _context12.sent;
  51432. this.$app.store.set('cutModel', data);
  51433. _context12.next = 18;
  51434. break;
  51435. case 14:
  51436. _context12.next = 16;
  51437. return this.$app.remote_editor.cutModel_list({
  51438. num: this.num
  51439. });
  51440. case 16:
  51441. data = _context12.sent;
  51442. this.$app.store.set('cutModel', data.data);
  51443. case 18:
  51444. _context12.next = 23;
  51445. break;
  51446. case 20:
  51447. _context12.prev = 20;
  51448. _context12.t0 = _context12["catch"](0);
  51449. logger$1.error('loaded [cutModel] error', _context12.t0);
  51450. case 23:
  51451. case "end":
  51452. return _context12.stop();
  51453. }
  51454. }
  51455. }, _callee12, this, [[0, 20]]);
  51456. }));
  51457. function cutModel() {
  51458. return _cutModel.apply(this, arguments);
  51459. }
  51460. return cutModel;
  51461. }()
  51462. }, {
  51463. key: "tags",
  51464. value: function () {
  51465. var _tags = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee13(tagsURL) {
  51466. var _this5 = this;
  51467. var response, _metadata4;
  51468. return regenerator.wrap(function _callee13$(_context13) {
  51469. while (1) {
  51470. switch (_context13.prev = _context13.next) {
  51471. case 0:
  51472. if (!(!this.$app.config.isLoadTags && !tagsURL)) {
  51473. _context13.next = 2;
  51474. break;
  51475. }
  51476. return _context13.abrupt("return");
  51477. case 2:
  51478. response = {
  51479. data: {
  51480. icons: [],
  51481. tags: []
  51482. }
  51483. };
  51484. _context13.prev = 3;
  51485. _context13.next = 6;
  51486. return this.$app.store.get('metadata');
  51487. case 6:
  51488. _metadata4 = _context13.sent;
  51489. // if (metadata.tags) {
  51490. logger$1.time("".concat(this.num, "[load tags]").concat(this.$app.uid));
  51491. if (!(this.mode == 'view')) {
  51492. _context13.next = 24;
  51493. break;
  51494. }
  51495. if (_metadata4.tags) {
  51496. _context13.next = 11;
  51497. break;
  51498. }
  51499. return _context13.abrupt("return");
  51500. case 11:
  51501. response.success = true;
  51502. if (!tagsURL) {
  51503. _context13.next = 18;
  51504. break;
  51505. }
  51506. _context13.next = 15;
  51507. return http.get(tagsURL);
  51508. case 15:
  51509. _context13.t0 = _context13.sent;
  51510. _context13.next = 21;
  51511. break;
  51512. case 18:
  51513. _context13.next = 20;
  51514. return http.get(this.getUserResourceURL("hot.json"));
  51515. case 20:
  51516. _context13.t0 = _context13.sent;
  51517. case 21:
  51518. response.data.tags = _context13.t0;
  51519. _context13.next = 27;
  51520. break;
  51521. case 24:
  51522. _context13.next = 26;
  51523. return this.$app.remote_editor.tag_list({
  51524. num: this.num
  51525. });
  51526. case 26:
  51527. response = _context13.sent;
  51528. case 27:
  51529. if (response.success && response.data && response.data.tags) {
  51530. response.data.tags.map(function (tag) {
  51531. if (tag.position) {
  51532. tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z); // visiblePanos不知为何在obj场景里会有重复id,保险起见初始化统一去重
  51533. tag.visiblePanos ? tag.visiblePanos = Array.from(new Set(tag.visiblePanos)).map(function (id) {
  51534. return _this5.$app.core.get('Player').model.panos.index[id];
  51535. }) : tag.visiblePanos = _this5.$app.TagManager.getVisiblePano(tag.position, {
  51536. maxDis: 5
  51537. });
  51538. }
  51539. return tag;
  51540. });
  51541. }
  51542. logger$1.timeEnd("".concat(this.num, "[load tags]").concat(this.$app.uid)); // }
  51543. _context13.next = 34;
  51544. break;
  51545. case 31:
  51546. _context13.prev = 31;
  51547. _context13.t1 = _context13["catch"](3);
  51548. logger$1.error('loaded [tags] error', _context13.t1);
  51549. case 34:
  51550. this.$app.store.set('tags', response.data);
  51551. return _context13.abrupt("return", response.data);
  51552. case 36:
  51553. case "end":
  51554. return _context13.stop();
  51555. }
  51556. }
  51557. }, _callee13, this, [[3, 31]]);
  51558. }));
  51559. function tags(_x) {
  51560. return _tags.apply(this, arguments);
  51561. }
  51562. return tags;
  51563. }() //加载痕迹物证
  51564. }, {
  51565. key: "traces",
  51566. value: function () {
  51567. var _traces = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee14() {
  51568. var _this6 = this;
  51569. var response, _metadata5, data;
  51570. return regenerator.wrap(function _callee14$(_context14) {
  51571. while (1) {
  51572. switch (_context14.prev = _context14.next) {
  51573. case 0:
  51574. response = {
  51575. data: {
  51576. icons: [],
  51577. traces: []
  51578. }
  51579. };
  51580. _context14.prev = 1;
  51581. _context14.next = 4;
  51582. return this.$app.store.get('metadata');
  51583. case 4:
  51584. _metadata5 = _context14.sent;
  51585. // if (metadata.traces) {
  51586. logger$1.time("".concat(this.num, "[load traces]").concat(this.$app.uid));
  51587. if (!(this.mode == 'view')) {
  51588. _context14.next = 15;
  51589. break;
  51590. }
  51591. if (_metadata5.evidence) {
  51592. _context14.next = 9;
  51593. break;
  51594. }
  51595. return _context14.abrupt("return");
  51596. case 9:
  51597. response.success = true;
  51598. _context14.next = 12;
  51599. return http.get(this.getUserResourceURL("evidence.json"));
  51600. case 12:
  51601. response.data.evidences = _context14.sent;
  51602. _context14.next = 18;
  51603. break;
  51604. case 15:
  51605. _context14.next = 17;
  51606. return this.$app.remote_editor.evidence_list({
  51607. num: this.num
  51608. });
  51609. case 17:
  51610. response = _context14.sent;
  51611. case 18:
  51612. if (response.success && response.data && response.data.evidences) {
  51613. response.data.evidences.map(function (trace) {
  51614. if (trace.position) {
  51615. trace.position = new THREE.Vector3(trace.position.x, trace.position.y, trace.position.z); // visiblePanos不知为何在obj场景里会有重复id,保险起见初始化统一去重
  51616. trace.visiblePanos ? trace.visiblePanos = Array.from(new Set(trace.visiblePanos)).map(function (id) {
  51617. return _this6.$app.core.get('Player').model.panos.index[id];
  51618. }) : trace.visiblePanos = _this6.$app.TagManager.getVisiblePano(trace.position, {
  51619. maxDis: 5
  51620. });
  51621. }
  51622. return trace;
  51623. });
  51624. }
  51625. logger$1.timeEnd("".concat(this.num, "[load traces]").concat(this.$app.uid)); // }
  51626. _context14.next = 25;
  51627. break;
  51628. case 22:
  51629. _context14.prev = 22;
  51630. _context14.t0 = _context14["catch"](1);
  51631. logger$1.error('loaded [traces] error', _context14.t0);
  51632. case 25:
  51633. data = {
  51634. traces: response.data.evidences || [],
  51635. icons: response.data.icons || []
  51636. };
  51637. this.$app.store.set('traces', data);
  51638. return _context14.abrupt("return", data);
  51639. case 28:
  51640. case "end":
  51641. return _context14.stop();
  51642. }
  51643. }
  51644. }, _callee14, this, [[1, 22]]);
  51645. }));
  51646. function traces() {
  51647. return _traces.apply(this, arguments);
  51648. }
  51649. return traces;
  51650. }()
  51651. }, {
  51652. key: "tours",
  51653. value: function () {
  51654. var _tours = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee15() {
  51655. var data, _metadata6;
  51656. return regenerator.wrap(function _callee15$(_context15) {
  51657. while (1) {
  51658. switch (_context15.prev = _context15.next) {
  51659. case 0:
  51660. data = [];
  51661. _context15.prev = 1;
  51662. _context15.next = 4;
  51663. return this.$app.store.get('metadata');
  51664. case 4:
  51665. _metadata6 = _context15.sent;
  51666. if (!_metadata6.tours) {
  51667. _context15.next = 9;
  51668. break;
  51669. }
  51670. _context15.next = 8;
  51671. return http.get(this.getUserResourceURL("tour.json"));
  51672. case 8:
  51673. data = _context15.sent;
  51674. case 9:
  51675. _context15.next = 14;
  51676. break;
  51677. case 11:
  51678. _context15.prev = 11;
  51679. _context15.t0 = _context15["catch"](1);
  51680. logger$1.error('loaded [tour] error', _context15.t0);
  51681. case 14:
  51682. this.$app.store.set('tours', data);
  51683. return _context15.abrupt("return", data);
  51684. case 16:
  51685. case "end":
  51686. return _context15.stop();
  51687. }
  51688. }
  51689. }, _callee15, this, [[1, 11]]);
  51690. }));
  51691. function tours() {
  51692. return _tours.apply(this, arguments);
  51693. }
  51694. return tours;
  51695. }()
  51696. }, {
  51697. key: "links",
  51698. value: function () {
  51699. var _links = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee16() {
  51700. var _this7 = this;
  51701. var _metadata7, data;
  51702. return regenerator.wrap(function _callee16$(_context16) {
  51703. while (1) {
  51704. switch (_context16.prev = _context16.next) {
  51705. case 0:
  51706. _context16.prev = 0;
  51707. _context16.next = 3;
  51708. return this.$app.store.get('metadata');
  51709. case 3:
  51710. _metadata7 = _context16.sent;
  51711. data = null;
  51712. if (!(this.mode === 'view')) {
  51713. _context16.next = 15;
  51714. break;
  51715. }
  51716. if (_metadata7.links) {
  51717. _context16.next = 8;
  51718. break;
  51719. }
  51720. return _context16.abrupt("return");
  51721. case 8:
  51722. _context16.next = 10;
  51723. return http.get(this.getUserResourceURL("links.json"));
  51724. case 10:
  51725. data = _context16.sent;
  51726. data = data.filter(function (tag) {
  51727. return tag.panoId !== undefined || _this7.$app.core.get('Player').model.panos.get(tag.nearestPano);
  51728. }); // 过滤掉无效Pano
  51729. this.$app.store.set('links', data);
  51730. _context16.next = 20;
  51731. break;
  51732. case 15:
  51733. _context16.next = 17;
  51734. return this.$app.remote_editor.linkPan_list({
  51735. num: this.num
  51736. });
  51737. case 17:
  51738. data = _context16.sent;
  51739. data.data.tags = data.data.tags.filter(function (tag) {
  51740. return tag.panoId !== undefined || _this7.$app.core.get('Player').model.panos.get(tag.nearestPano);
  51741. }); // 过滤掉无效Pano
  51742. this.$app.store.set('links', data.data);
  51743. case 20:
  51744. _context16.next = 25;
  51745. break;
  51746. case 22:
  51747. _context16.prev = 22;
  51748. _context16.t0 = _context16["catch"](0);
  51749. logger$1.error('loaded [tour] error', _context16.t0);
  51750. case 25:
  51751. case "end":
  51752. return _context16.stop();
  51753. }
  51754. }
  51755. }, _callee16, this, [[0, 22]]);
  51756. }));
  51757. function links() {
  51758. return _links.apply(this, arguments);
  51759. }
  51760. return links;
  51761. }()
  51762. }, {
  51763. key: "cameras",
  51764. value: function () {
  51765. var _cameras = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee17() {
  51766. var _metadata8, data;
  51767. return regenerator.wrap(function _callee17$(_context17) {
  51768. while (1) {
  51769. switch (_context17.prev = _context17.next) {
  51770. case 0:
  51771. _context17.prev = 0;
  51772. _context17.next = 3;
  51773. return this.$app.store.get('metadata');
  51774. case 3:
  51775. _metadata8 = _context17.sent;
  51776. if (_metadata8.surveillances) {
  51777. _context17.next = 6;
  51778. break;
  51779. }
  51780. return _context17.abrupt("return");
  51781. case 6:
  51782. data = null;
  51783. if (!(this.mode === 'view')) {
  51784. _context17.next = 14;
  51785. break;
  51786. }
  51787. _context17.next = 10;
  51788. return http.get(this.getUserResourceURL("surveillance.json"));
  51789. case 10:
  51790. data = _context17.sent;
  51791. this.$app.store.set('cameras', data);
  51792. _context17.next = 18;
  51793. break;
  51794. case 14:
  51795. _context17.next = 16;
  51796. return this.$app.remote_editor.surveillance_list({
  51797. num: this.num
  51798. });
  51799. case 16:
  51800. data = _context17.sent;
  51801. this.$app.store.set('cameras', data.data);
  51802. case 18:
  51803. _context17.next = 23;
  51804. break;
  51805. case 20:
  51806. _context17.prev = 20;
  51807. _context17.t0 = _context17["catch"](0);
  51808. logger$1.error('loaded [cameras] error', _context17.t0);
  51809. case 23:
  51810. case "end":
  51811. return _context17.stop();
  51812. }
  51813. }
  51814. }, _callee17, this, [[0, 20]]);
  51815. }));
  51816. function cameras() {
  51817. return _cameras.apply(this, arguments);
  51818. }
  51819. return cameras;
  51820. }()
  51821. }, {
  51822. key: "sceneDraw",
  51823. value: function () {
  51824. var _sceneDraw = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee18() {
  51825. var _metadata9, data;
  51826. return regenerator.wrap(function _callee18$(_context18) {
  51827. while (1) {
  51828. switch (_context18.prev = _context18.next) {
  51829. case 0:
  51830. _context18.prev = 0;
  51831. _context18.next = 3;
  51832. return this.$app.store.get('metadata');
  51833. case 3:
  51834. _metadata9 = _context18.sent;
  51835. if (!(!_metadata9.sceneDraw && !_metadata9.hasSegAi)) {
  51836. _context18.next = 6;
  51837. break;
  51838. }
  51839. return _context18.abrupt("return");
  51840. case 6:
  51841. data = null;
  51842. if (!(this.mode === 'view')) {
  51843. _context18.next = 14;
  51844. break;
  51845. }
  51846. _context18.next = 10;
  51847. return http.get(this.getUserResourceURL("sceneDraw.json"));
  51848. case 10:
  51849. data = _context18.sent;
  51850. this.$app.store.set('sceneDraw', data);
  51851. _context18.next = 18;
  51852. break;
  51853. case 14:
  51854. _context18.next = 16;
  51855. return this.$app.remote_editor.sceneDraw_list({
  51856. num: this.num
  51857. });
  51858. case 16:
  51859. data = _context18.sent;
  51860. this.$app.store.set('sceneDraw', data.data);
  51861. case 18:
  51862. _context18.next = 23;
  51863. break;
  51864. case 20:
  51865. _context18.prev = 20;
  51866. _context18.t0 = _context18["catch"](0);
  51867. logger$1.error('loaded [sceneDraw] error', _context18.t0);
  51868. case 23:
  51869. case "end":
  51870. return _context18.stop();
  51871. }
  51872. }
  51873. }, _callee18, this, [[0, 20]]);
  51874. }));
  51875. function sceneDraw() {
  51876. return _sceneDraw.apply(this, arguments);
  51877. }
  51878. return sceneDraw;
  51879. }()
  51880. }, {
  51881. key: "mosaics",
  51882. value: function () {
  51883. var _mosaics = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee19() {
  51884. var _metadata10, data;
  51885. return regenerator.wrap(function _callee19$(_context19) {
  51886. while (1) {
  51887. switch (_context19.prev = _context19.next) {
  51888. case 0:
  51889. _context19.prev = 0;
  51890. _context19.next = 3;
  51891. return this.$app.store.get('metadata');
  51892. case 3:
  51893. _metadata10 = _context19.sent;
  51894. if (_metadata10.mosaic) {
  51895. _context19.next = 6;
  51896. break;
  51897. }
  51898. return _context19.abrupt("return");
  51899. case 6:
  51900. data = null;
  51901. if (!(this.mode === 'view')) {
  51902. _context19.next = 14;
  51903. break;
  51904. }
  51905. _context19.next = 10;
  51906. return http.get(this.getUserResourceURL("mosaic.json"));
  51907. case 10:
  51908. data = _context19.sent;
  51909. this.$app.store.set('mosaics', data);
  51910. _context19.next = 18;
  51911. break;
  51912. case 14:
  51913. _context19.next = 16;
  51914. return this.$app.remote_editor.mosaics_list({
  51915. num: this.num
  51916. });
  51917. case 16:
  51918. data = _context19.sent;
  51919. this.$app.store.set('mosaics', data.data);
  51920. case 18:
  51921. _context19.next = 23;
  51922. break;
  51923. case 20:
  51924. _context19.prev = 20;
  51925. _context19.t0 = _context19["catch"](0);
  51926. logger$1.error('loaded [tour] error', _context19.t0);
  51927. case 23:
  51928. case "end":
  51929. return _context19.stop();
  51930. }
  51931. }
  51932. }, _callee19, this, [[0, 20]]);
  51933. }));
  51934. function mosaics() {
  51935. return _mosaics.apply(this, arguments);
  51936. }
  51937. return mosaics;
  51938. }()
  51939. }, {
  51940. key: "filters",
  51941. value: function () {
  51942. var _filters = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee20() {
  51943. var _metadata11, data;
  51944. return regenerator.wrap(function _callee20$(_context20) {
  51945. while (1) {
  51946. switch (_context20.prev = _context20.next) {
  51947. case 0:
  51948. _context20.prev = 0;
  51949. _context20.next = 3;
  51950. return this.$app.store.get('metadata');
  51951. case 3:
  51952. _metadata11 = _context20.sent;
  51953. if (_metadata11.filters) {
  51954. _context20.next = 6;
  51955. break;
  51956. }
  51957. return _context20.abrupt("return");
  51958. case 6:
  51959. data = null;
  51960. if (!(this.mode === 'view')) {
  51961. _context20.next = 14;
  51962. break;
  51963. }
  51964. _context20.next = 10;
  51965. return http.get(this.getUserResourceURL("filter.json"));
  51966. case 10:
  51967. data = _context20.sent;
  51968. this.$app.store.set('filters', data);
  51969. _context20.next = 18;
  51970. break;
  51971. case 14:
  51972. _context20.next = 16;
  51973. return this.$app.remote_editor.filter_list({
  51974. num: this.num
  51975. });
  51976. case 16:
  51977. data = _context20.sent;
  51978. this.$app.store.set('filters', data.data);
  51979. case 18:
  51980. _context20.next = 23;
  51981. break;
  51982. case 20:
  51983. _context20.prev = 20;
  51984. _context20.t0 = _context20["catch"](0);
  51985. logger$1.error('loaded [tour] error', _context20.t0);
  51986. case 23:
  51987. case "end":
  51988. return _context20.stop();
  51989. }
  51990. }
  51991. }, _callee20, this, [[0, 20]]);
  51992. }));
  51993. function filters() {
  51994. return _filters.apply(this, arguments);
  51995. }
  51996. return filters;
  51997. }()
  51998. /**
  51999. * 获取场景相关的资源图片
  52000. * @param {*} path
  52001. * @returns
  52002. */
  52003. }, {
  52004. key: "getImage",
  52005. value: function () {
  52006. var _getImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee21(path) {
  52007. var data;
  52008. return regenerator.wrap(function _callee21$(_context21) {
  52009. while (1) {
  52010. switch (_context21.prev = _context21.next) {
  52011. case 0:
  52012. _context21.next = 2;
  52013. return http.getImage("".concat(this.$app.config.resource).concat(path));
  52014. case 2:
  52015. data = _context21.sent;
  52016. this.$app.store.set(path, data);
  52017. return _context21.abrupt("return", data);
  52018. case 5:
  52019. case "end":
  52020. return _context21.stop();
  52021. }
  52022. }
  52023. }, _callee21, this);
  52024. }));
  52025. function getImage(_x2) {
  52026. return _getImage.apply(this, arguments);
  52027. }
  52028. return getImage;
  52029. }()
  52030. }, {
  52031. key: "getUserImage",
  52032. value: function () {
  52033. var _getUserImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee22(path) {
  52034. var data;
  52035. return regenerator.wrap(function _callee22$(_context22) {
  52036. while (1) {
  52037. switch (_context22.prev = _context22.next) {
  52038. case 0:
  52039. data = http.getImage(this.getUserResourceURL(path));
  52040. this.$app.store.set(path, data);
  52041. return _context22.abrupt("return", data);
  52042. case 3:
  52043. case "end":
  52044. return _context22.stop();
  52045. }
  52046. }
  52047. }, _callee22, this);
  52048. }));
  52049. function getUserImage(_x3) {
  52050. return _getUserImage.apply(this, arguments);
  52051. }
  52052. return getUserImage;
  52053. }()
  52054. /**
  52055. * 获取SDK相关的资源图片
  52056. * @param {*} path
  52057. * @returns
  52058. */
  52059. }, {
  52060. key: "getAppImage",
  52061. value: function () {
  52062. var _getAppImage = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee23(path) {
  52063. var data;
  52064. return regenerator.wrap(function _callee23$(_context23) {
  52065. while (1) {
  52066. switch (_context23.prev = _context23.next) {
  52067. case 0:
  52068. _context23.next = 2;
  52069. return http.getImage(this.base(path));
  52070. case 2:
  52071. data = _context23.sent;
  52072. this.$app.store.set(path, data);
  52073. return _context23.abrupt("return", data);
  52074. case 5:
  52075. case "end":
  52076. return _context23.stop();
  52077. }
  52078. }
  52079. }, _callee23, this);
  52080. }));
  52081. function getAppImage(_x4) {
  52082. return _getAppImage.apply(this, arguments);
  52083. }
  52084. return getAppImage;
  52085. }()
  52086. }, {
  52087. key: "getAppURL",
  52088. value: function getAppURL(url) {
  52089. return this.base(url);
  52090. }
  52091. /**
  52092. * 获取服务器资源
  52093. */
  52094. }, {
  52095. key: "getServerURL",
  52096. value: function getServerURL(url) {
  52097. return this.$app.config.server + url;
  52098. }
  52099. /**
  52100. * 获取场景资源地址
  52101. * @param {*} url
  52102. * @returns
  52103. */
  52104. }, {
  52105. key: "getResourceURL",
  52106. value: function getResourceURL(url) {
  52107. return this.$app.config.resource + url.replace(/\{num\}/g, this.num);
  52108. }
  52109. /**
  52110. * 获取用户资源地址
  52111. * @param {*} url
  52112. * @returns
  52113. */
  52114. }, {
  52115. key: "getUserResourceURL",
  52116. value: function getUserResourceURL(url, clearCache, now) {
  52117. if (!url || !url.trim()) {
  52118. return url;
  52119. }
  52120. if (url.indexOf('data:image') === 0 || url.indexOf('blob:') === 0 || url.indexOf('http') === 0 || url.indexOf('file') === 0) {
  52121. return url;
  52122. }
  52123. if (clearCache) {
  52124. this.reload = true;
  52125. }
  52126. var full;
  52127. if (url.indexOf('?t=') != -1) {
  52128. full = this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/").concat(url);
  52129. } else {
  52130. if (now) {
  52131. //防止热点icon第一次查看抖动问题
  52132. full = this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/").concat(url, "?_=").concat(this.nowTime);
  52133. } else {
  52134. full = this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/").concat(url, "?_=").concat(this.time);
  52135. }
  52136. var search = url.split('?')[1];
  52137. if (search) {
  52138. full += '&' + search;
  52139. }
  52140. }
  52141. return full;
  52142. }
  52143. /**
  52144. * 获取用户空间模型资源地址
  52145. * @param {*} url
  52146. * @returns
  52147. */
  52148. }, {
  52149. key: "getUserModelResourceURL",
  52150. value: function getUserModelResourceURL(url, clearCache) {
  52151. if (!url || !url.trim()) {
  52152. return url;
  52153. }
  52154. if (url.indexOf('blob:') === 0 || url.indexOf('http') === 0 || url.indexOf('file') === 0) {
  52155. return url;
  52156. }
  52157. if (clearCache) {
  52158. this.reload = true;
  52159. }
  52160. return this.$app.config.resource + "scene_".concat(this.mode, "_data/").concat(this.num, "/user/boxModels/").concat(url, "?_=").concat(this.time);
  52161. }
  52162. /**
  52163. * 获取导览视频上传oss地址
  52164. * @param {*} url
  52165. * @returns
  52166. */
  52167. }, {
  52168. key: "getTourVideoURL",
  52169. value: function getTourVideoURL(url, clearCache) {
  52170. if (clearCache) {
  52171. this.reload = true;
  52172. }
  52173. return this.$app.config.resource + "".concat(url, "?_=").concat(this.time);
  52174. }
  52175. /**
  52176. * 获取展示资源地址
  52177. * @param {*} url
  52178. * @returns
  52179. */
  52180. }, {
  52181. key: "getViewResourceURL",
  52182. value: function getViewResourceURL(url) {
  52183. return this.$app.config.resource + "scene_view_data/".concat(this.num, "/").concat(url);
  52184. }
  52185. /**
  52186. * 获取展示数据地址
  52187. * @param {*} url
  52188. * @returns
  52189. */
  52190. }, {
  52191. key: "getViewDataURL",
  52192. value: function getViewDataURL(url) {
  52193. return this.$app.config.resource + "scene_view_data/".concat(this.num, "/data/").concat(url, "?_=").concat(this.version);
  52194. }
  52195. /**
  52196. * 获取编辑数据地址
  52197. * @param {*} url
  52198. * @returns
  52199. */
  52200. }, {
  52201. key: "getEditDataURL",
  52202. value: function getEditDataURL(url) {
  52203. return this.$app.config.resource + "scene_edit_data/".concat(this.num, "/data/").concat(url, "?_=").concat(this.version);
  52204. }
  52205. /**
  52206. * 获取展示全景图地址
  52207. * @param {*} url
  52208. * @returns
  52209. */
  52210. }, {
  52211. key: "getViewImagesURL",
  52212. value: function getViewImagesURL(url) {
  52213. if (url.indexOf('&_=') !== -1) {
  52214. return url;
  52215. }
  52216. var version = url.indexOf('/panorama/') !== -1 ? this.linkVersion : this.imageVersion;
  52217. if (url.indexOf('?') !== -1) {
  52218. return this.$app.config.resource + "scene_view_data/".concat(this.num, "/images/").concat(url, "&_=").concat(version);
  52219. }
  52220. return this.$app.config.resource + "scene_view_data/".concat(this.num, "/images/").concat(url, "?_=").concat(version);
  52221. }
  52222. /**
  52223. * 获取编辑页全景图地址
  52224. * @param {*} url
  52225. * @returns
  52226. */
  52227. }, {
  52228. key: "getUserImagesURL",
  52229. value: function getUserImagesURL(url) {
  52230. var str;
  52231. if (this.mode == 'view') {
  52232. str = 'scene_view_data';
  52233. } else {
  52234. str = 'scene_edit_data';
  52235. }
  52236. if (url.indexOf('&_=') !== -1) {
  52237. return url;
  52238. } else if (url.indexOf('?') !== -1) {
  52239. return this.$app.config.resource + "".concat(str, "/").concat(this.num, "/images/").concat(url, "&_=").concat(this.version);
  52240. }
  52241. return this.$app.config.resource + "".concat(str, "/").concat(this.num, "/images/").concat(url, "?_=").concat(this.version);
  52242. }
  52243. }]);
  52244. return Resource;
  52245. }();
  52246. });
  52247. /**
  52248. * Make a map and return a function for checking if a key
  52249. * is in that map.
  52250. * IMPORTANT: all calls of this function must be prefixed with
  52251. * \/\*#\_\_PURE\_\_\*\/
  52252. * So that rollup can tree-shake them if necessary.
  52253. */
  52254. function makeMap(str, expectsLowerCase) {
  52255. var map = Object.create(null);
  52256. var list = str.split(',');
  52257. for (var i = 0; i < list.length; i++) {
  52258. map[list[i]] = true;
  52259. }
  52260. return expectsLowerCase ? function (val) {
  52261. return !!map[val.toLowerCase()];
  52262. } : function (val) {
  52263. return !!map[val];
  52264. };
  52265. }
  52266. Object.freeze({}) ;
  52267. Object.freeze([]) ;
  52268. var extend = Object.assign;
  52269. var hasOwnProperty = Object.prototype.hasOwnProperty;
  52270. var hasOwn = function hasOwn(val, key) {
  52271. return hasOwnProperty.call(val, key);
  52272. };
  52273. var isArray$1 = Array.isArray;
  52274. var isMap = function isMap(val) {
  52275. return toTypeString(val) === '[object Map]';
  52276. };
  52277. var isString$1 = function isString(val) {
  52278. return typeof val === 'string';
  52279. };
  52280. var isSymbol = function isSymbol(val) {
  52281. return typeof val === 'symbol';
  52282. };
  52283. var isObject$1 = function isObject(val) {
  52284. return val !== null && typeof val === 'object';
  52285. };
  52286. var objectToString = Object.prototype.toString;
  52287. var toTypeString = function toTypeString(value) {
  52288. return objectToString.call(value);
  52289. };
  52290. var toRawType = function toRawType(value) {
  52291. // extract "RawType" from strings like "[object RawType]"
  52292. return toTypeString(value).slice(8, -1);
  52293. };
  52294. var isIntegerKey = function isIntegerKey(key) {
  52295. return isString$1(key) && key !== 'NaN' && key[0] !== '-' && '' + parseInt(key, 10) === key;
  52296. };
  52297. var cacheStringFunction$1 = function cacheStringFunction(fn) {
  52298. var cache = Object.create(null);
  52299. return function (str) {
  52300. var hit = cache[str];
  52301. return hit || (cache[str] = fn(str));
  52302. };
  52303. };
  52304. /**
  52305. * @private
  52306. */
  52307. var capitalize = cacheStringFunction$1(function (str) {
  52308. return str.charAt(0).toUpperCase() + str.slice(1);
  52309. });
  52310. var hasChanged = function hasChanged(value, oldValue) {
  52311. return !Object.is(value, oldValue);
  52312. };
  52313. 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; } } }; }
  52314. 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); }
  52315. 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; }
  52316. var activeEffectScope;
  52317. function recordEffectScope(effect) {
  52318. var scope = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : activeEffectScope;
  52319. if (scope && scope.active) {
  52320. scope.effects.push(effect);
  52321. }
  52322. }
  52323. var createDep = function createDep(effects) {
  52324. var dep = new Set(effects);
  52325. dep.w = 0;
  52326. dep.n = 0;
  52327. return dep;
  52328. };
  52329. var wasTracked = function wasTracked(dep) {
  52330. return (dep.w & trackOpBit) > 0;
  52331. };
  52332. var newTracked = function newTracked(dep) {
  52333. return (dep.n & trackOpBit) > 0;
  52334. };
  52335. var initDepMarkers = function initDepMarkers(_ref) {
  52336. var deps = _ref.deps;
  52337. if (deps.length) {
  52338. for (var i = 0; i < deps.length; i++) {
  52339. deps[i].w |= trackOpBit; // set was tracked
  52340. }
  52341. }
  52342. };
  52343. var finalizeDepMarkers = function finalizeDepMarkers(effect) {
  52344. var deps = effect.deps;
  52345. if (deps.length) {
  52346. var ptr = 0;
  52347. for (var i = 0; i < deps.length; i++) {
  52348. var dep = deps[i];
  52349. if (wasTracked(dep) && !newTracked(dep)) {
  52350. dep.delete(effect);
  52351. } else {
  52352. deps[ptr++] = dep;
  52353. } // clear bits
  52354. dep.w &= ~trackOpBit;
  52355. dep.n &= ~trackOpBit;
  52356. }
  52357. deps.length = ptr;
  52358. }
  52359. };
  52360. var targetMap = new WeakMap(); // The number of effects currently being tracked recursively.
  52361. var effectTrackDepth = 0;
  52362. var trackOpBit = 1;
  52363. /**
  52364. * The bitwise track markers support at most 30 levels of recursion.
  52365. * This value is chosen to enable modern JS engines to use a SMI on all platforms.
  52366. * When recursion depth is greater, fall back to using a full cleanup.
  52367. */
  52368. var maxMarkerBits = 30;
  52369. var activeEffect;
  52370. var ITERATE_KEY = Symbol('iterate' );
  52371. var MAP_KEY_ITERATE_KEY = Symbol('Map key iterate' );
  52372. var ReactiveEffect = /*#__PURE__*/function () {
  52373. function ReactiveEffect(fn) {
  52374. var scheduler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  52375. var scope = arguments.length > 2 ? arguments[2] : undefined;
  52376. _classCallCheck(this, ReactiveEffect);
  52377. this.fn = fn;
  52378. this.scheduler = scheduler;
  52379. this.active = true;
  52380. this.deps = [];
  52381. this.parent = undefined;
  52382. recordEffectScope(this, scope);
  52383. }
  52384. _createClass(ReactiveEffect, [{
  52385. key: "run",
  52386. value: function run() {
  52387. if (!this.active) {
  52388. return this.fn();
  52389. }
  52390. var parent = activeEffect;
  52391. var lastShouldTrack = shouldTrack;
  52392. while (parent) {
  52393. if (parent === this) {
  52394. return;
  52395. }
  52396. parent = parent.parent;
  52397. }
  52398. try {
  52399. this.parent = activeEffect;
  52400. activeEffect = this;
  52401. shouldTrack = true;
  52402. trackOpBit = 1 << ++effectTrackDepth;
  52403. if (effectTrackDepth <= maxMarkerBits) {
  52404. initDepMarkers(this);
  52405. } else {
  52406. cleanupEffect(this);
  52407. }
  52408. return this.fn();
  52409. } finally {
  52410. if (effectTrackDepth <= maxMarkerBits) {
  52411. finalizeDepMarkers(this);
  52412. }
  52413. trackOpBit = 1 << --effectTrackDepth;
  52414. activeEffect = this.parent;
  52415. shouldTrack = lastShouldTrack;
  52416. this.parent = undefined;
  52417. }
  52418. }
  52419. }, {
  52420. key: "stop",
  52421. value: function stop() {
  52422. if (this.active) {
  52423. cleanupEffect(this);
  52424. if (this.onStop) {
  52425. this.onStop();
  52426. }
  52427. this.active = false;
  52428. }
  52429. }
  52430. }]);
  52431. return ReactiveEffect;
  52432. }();
  52433. function cleanupEffect(effect) {
  52434. var deps = effect.deps;
  52435. if (deps.length) {
  52436. for (var i = 0; i < deps.length; i++) {
  52437. deps[i].delete(effect);
  52438. }
  52439. deps.length = 0;
  52440. }
  52441. }
  52442. function effect$1(fn, options) {
  52443. if (fn.effect) {
  52444. fn = fn.effect.fn;
  52445. }
  52446. var _effect = new ReactiveEffect(fn);
  52447. if (options) {
  52448. extend(_effect, options);
  52449. if (options.scope) recordEffectScope(_effect, options.scope);
  52450. }
  52451. if (!options || !options.lazy) {
  52452. _effect.run();
  52453. }
  52454. var runner = _effect.run.bind(_effect);
  52455. runner.effect = _effect;
  52456. return runner;
  52457. }
  52458. function stop(runner) {
  52459. runner.effect.stop();
  52460. }
  52461. var shouldTrack = true;
  52462. var trackStack = [];
  52463. function pauseTracking() {
  52464. trackStack.push(shouldTrack);
  52465. shouldTrack = false;
  52466. }
  52467. function resetTracking() {
  52468. var last = trackStack.pop();
  52469. shouldTrack = last === undefined ? true : last;
  52470. }
  52471. function track(target, type, key) {
  52472. if (shouldTrack && activeEffect) {
  52473. var depsMap = targetMap.get(target);
  52474. if (!depsMap) {
  52475. targetMap.set(target, depsMap = new Map());
  52476. }
  52477. var dep = depsMap.get(key);
  52478. if (!dep) {
  52479. depsMap.set(key, dep = createDep());
  52480. }
  52481. var eventInfo = {
  52482. effect: activeEffect,
  52483. target,
  52484. type,
  52485. key
  52486. } ;
  52487. trackEffects(dep, eventInfo);
  52488. }
  52489. }
  52490. function trackEffects(dep, debuggerEventExtraInfo) {
  52491. var shouldTrack = false;
  52492. if (effectTrackDepth <= maxMarkerBits) {
  52493. if (!newTracked(dep)) {
  52494. dep.n |= trackOpBit; // set newly tracked
  52495. shouldTrack = !wasTracked(dep);
  52496. }
  52497. } else {
  52498. // Full cleanup mode.
  52499. shouldTrack = !dep.has(activeEffect);
  52500. }
  52501. if (shouldTrack) {
  52502. dep.add(activeEffect);
  52503. activeEffect.deps.push(dep);
  52504. if (activeEffect.onTrack) {
  52505. activeEffect.onTrack(Object.assign({
  52506. effect: activeEffect
  52507. }, debuggerEventExtraInfo));
  52508. }
  52509. }
  52510. }
  52511. function trigger$1(target, type, key, newValue, oldValue, oldTarget) {
  52512. var depsMap = targetMap.get(target);
  52513. if (!depsMap) {
  52514. // never been tracked
  52515. return;
  52516. }
  52517. var deps = [];
  52518. if (type === "clear"
  52519. /* CLEAR */
  52520. ) {
  52521. // collection being cleared
  52522. // trigger all effects for target
  52523. deps = _toConsumableArray(depsMap.values());
  52524. } else if (key === 'length' && isArray$1(target)) {
  52525. depsMap.forEach(function (dep, key) {
  52526. if (key === 'length' || key >= newValue) {
  52527. deps.push(dep);
  52528. }
  52529. });
  52530. } else {
  52531. // schedule runs for SET | ADD | DELETE
  52532. if (key !== void 0) {
  52533. deps.push(depsMap.get(key));
  52534. } // also run for iteration key on ADD | DELETE | Map.SET
  52535. switch (type) {
  52536. case "add"
  52537. /* ADD */
  52538. :
  52539. if (!isArray$1(target)) {
  52540. deps.push(depsMap.get(ITERATE_KEY));
  52541. if (isMap(target)) {
  52542. deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
  52543. }
  52544. } else if (isIntegerKey(key)) {
  52545. // new index added to array -> length changes
  52546. deps.push(depsMap.get('length'));
  52547. }
  52548. break;
  52549. case "delete"
  52550. /* DELETE */
  52551. :
  52552. if (!isArray$1(target)) {
  52553. deps.push(depsMap.get(ITERATE_KEY));
  52554. if (isMap(target)) {
  52555. deps.push(depsMap.get(MAP_KEY_ITERATE_KEY));
  52556. }
  52557. }
  52558. break;
  52559. case "set"
  52560. /* SET */
  52561. :
  52562. if (isMap(target)) {
  52563. deps.push(depsMap.get(ITERATE_KEY));
  52564. }
  52565. break;
  52566. }
  52567. }
  52568. var eventInfo = {
  52569. target,
  52570. type,
  52571. key,
  52572. newValue,
  52573. oldValue,
  52574. oldTarget
  52575. } ;
  52576. if (deps.length === 1) {
  52577. if (deps[0]) {
  52578. {
  52579. triggerEffects(deps[0], eventInfo);
  52580. }
  52581. }
  52582. } else {
  52583. var effects = [];
  52584. var _iterator = _createForOfIteratorHelper$4(deps),
  52585. _step;
  52586. try {
  52587. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  52588. var dep = _step.value;
  52589. if (dep) {
  52590. effects.push.apply(effects, _toConsumableArray(dep));
  52591. }
  52592. }
  52593. } catch (err) {
  52594. _iterator.e(err);
  52595. } finally {
  52596. _iterator.f();
  52597. }
  52598. {
  52599. triggerEffects(createDep(effects), eventInfo);
  52600. }
  52601. }
  52602. }
  52603. function triggerEffects(dep, debuggerEventExtraInfo) {
  52604. // spread into array for stabilization
  52605. var _iterator2 = _createForOfIteratorHelper$4(isArray$1(dep) ? dep : _toConsumableArray(dep)),
  52606. _step2;
  52607. try {
  52608. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  52609. var _effect2 = _step2.value;
  52610. if (_effect2 !== activeEffect || _effect2.allowRecurse) {
  52611. if ("development" !== 'production' && _effect2.onTrigger) {
  52612. _effect2.onTrigger(extend({
  52613. effect: _effect2
  52614. }, debuggerEventExtraInfo));
  52615. }
  52616. if (_effect2.scheduler) {
  52617. _effect2.scheduler();
  52618. } else {
  52619. _effect2.run();
  52620. }
  52621. }
  52622. }
  52623. } catch (err) {
  52624. _iterator2.e(err);
  52625. } finally {
  52626. _iterator2.f();
  52627. }
  52628. }
  52629. var isNonTrackableKeys = /*#__PURE__*/makeMap("__proto__,__v_isRef,__isVue");
  52630. var builtInSymbols = new Set(Object.getOwnPropertyNames(Symbol).map(function (key) {
  52631. return Symbol[key];
  52632. }).filter(isSymbol));
  52633. var get = /*#__PURE__*/createGetter();
  52634. var readonlyGet = /*#__PURE__*/createGetter(true);
  52635. var arrayInstrumentations = /*#__PURE__*/createArrayInstrumentations();
  52636. function createArrayInstrumentations() {
  52637. var instrumentations = {};
  52638. ['includes', 'indexOf', 'lastIndexOf'].forEach(function (key) {
  52639. instrumentations[key] = function () {
  52640. var arr = toRaw(this);
  52641. for (var i = 0, l = this.length; i < l; i++) {
  52642. track(arr, "get"
  52643. /* GET */
  52644. , i + '');
  52645. } // we run the method using the original args first (which may be reactive)
  52646. for (var _len2 = arguments.length, args = new Array(_len2), _key3 = 0; _key3 < _len2; _key3++) {
  52647. args[_key3] = arguments[_key3];
  52648. }
  52649. var res = arr[key].apply(arr, args);
  52650. if (res === -1 || res === false) {
  52651. // if that didn't work, run it again using raw values.
  52652. return arr[key].apply(arr, _toConsumableArray(args.map(toRaw)));
  52653. } else {
  52654. return res;
  52655. }
  52656. };
  52657. });
  52658. ['push', 'pop', 'shift', 'unshift', 'splice'].forEach(function (key) {
  52659. instrumentations[key] = function () {
  52660. pauseTracking();
  52661. for (var _len3 = arguments.length, args = new Array(_len3), _key4 = 0; _key4 < _len3; _key4++) {
  52662. args[_key4] = arguments[_key4];
  52663. }
  52664. var res = toRaw(this)[key].apply(this, args);
  52665. resetTracking();
  52666. return res;
  52667. };
  52668. });
  52669. return instrumentations;
  52670. }
  52671. function createGetter() {
  52672. var isReadonly = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  52673. var shallow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  52674. return function get(target, key, receiver) {
  52675. if (key === "__v_isReactive"
  52676. /* IS_REACTIVE */
  52677. ) {
  52678. return !isReadonly;
  52679. } else if (key === "__v_isReadonly"
  52680. /* IS_READONLY */
  52681. ) {
  52682. return isReadonly;
  52683. } else if (key === "__v_isShallow"
  52684. /* IS_SHALLOW */
  52685. ) {
  52686. return shallow;
  52687. } else if (key === "__v_raw"
  52688. /* RAW */
  52689. && receiver === (isReadonly ? shallow ? shallowReadonlyMap : readonlyMap : shallow ? shallowReactiveMap : reactiveMap).get(target)) {
  52690. return target;
  52691. }
  52692. var targetIsArray = isArray$1(target);
  52693. if (!isReadonly && targetIsArray && hasOwn(arrayInstrumentations, key)) {
  52694. return Reflect.get(arrayInstrumentations, key, receiver);
  52695. }
  52696. var res = Reflect.get(target, key, receiver);
  52697. if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {
  52698. return res;
  52699. }
  52700. if (!isReadonly) {
  52701. track(target, "get"
  52702. /* GET */
  52703. , key);
  52704. }
  52705. if (shallow) {
  52706. return res;
  52707. }
  52708. if (isRef(res)) {
  52709. // ref unwrapping - does not apply for Array + integer key.
  52710. var shouldUnwrap = !targetIsArray || !isIntegerKey(key);
  52711. return shouldUnwrap ? res.value : res;
  52712. }
  52713. if (isObject$1(res)) {
  52714. // Convert returned value into a proxy as well. we do the isObject check
  52715. // here to avoid invalid value warning. Also need to lazy access readonly
  52716. // and reactive here to avoid circular dependency.
  52717. return isReadonly ? readonly(res) : reactive(res);
  52718. }
  52719. return res;
  52720. };
  52721. }
  52722. var set = /*#__PURE__*/createSetter();
  52723. function createSetter() {
  52724. var shallow = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  52725. return function set(target, key, value, receiver) {
  52726. var oldValue = target[key];
  52727. if (isReadonly(oldValue) && isRef(oldValue) && !isRef(value)) {
  52728. return false;
  52729. }
  52730. if (!shallow && !isReadonly(value)) {
  52731. if (!isShallow(value)) {
  52732. value = toRaw(value);
  52733. oldValue = toRaw(oldValue);
  52734. }
  52735. if (!isArray$1(target) && isRef(oldValue) && !isRef(value)) {
  52736. oldValue.value = value;
  52737. return true;
  52738. }
  52739. }
  52740. var hadKey = isArray$1(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key);
  52741. var result = Reflect.set(target, key, value, receiver); // don't trigger if target is something up in the prototype chain of original
  52742. if (target === toRaw(receiver)) {
  52743. if (!hadKey) {
  52744. trigger$1(target, "add"
  52745. /* ADD */
  52746. , key, value);
  52747. } else if (hasChanged(value, oldValue)) {
  52748. trigger$1(target, "set"
  52749. /* SET */
  52750. , key, value, oldValue);
  52751. }
  52752. }
  52753. return result;
  52754. };
  52755. }
  52756. function deleteProperty(target, key) {
  52757. var hadKey = hasOwn(target, key);
  52758. var oldValue = target[key];
  52759. var result = Reflect.deleteProperty(target, key);
  52760. if (result && hadKey) {
  52761. trigger$1(target, "delete"
  52762. /* DELETE */
  52763. , key, undefined, oldValue);
  52764. }
  52765. return result;
  52766. }
  52767. function has(target, key) {
  52768. var result = Reflect.has(target, key);
  52769. if (!isSymbol(key) || !builtInSymbols.has(key)) {
  52770. track(target, "has"
  52771. /* HAS */
  52772. , key);
  52773. }
  52774. return result;
  52775. }
  52776. function ownKeys$3(target) {
  52777. track(target, "iterate"
  52778. /* ITERATE */
  52779. , isArray$1(target) ? 'length' : ITERATE_KEY);
  52780. return Reflect.ownKeys(target);
  52781. }
  52782. var mutableHandlers = {
  52783. get,
  52784. set,
  52785. deleteProperty,
  52786. has,
  52787. ownKeys: ownKeys$3
  52788. };
  52789. var readonlyHandlers = {
  52790. get: readonlyGet,
  52791. set(target, key) {
  52792. {
  52793. console.warn("Set operation on key \"".concat(String(key), "\" failed: target is readonly."), target);
  52794. }
  52795. return true;
  52796. },
  52797. deleteProperty(target, key) {
  52798. {
  52799. console.warn("Delete operation on key \"".concat(String(key), "\" failed: target is readonly."), target);
  52800. }
  52801. return true;
  52802. }
  52803. };
  52804. var toShallow = function toShallow(value) {
  52805. return value;
  52806. };
  52807. var getProto = function getProto(v) {
  52808. return Reflect.getPrototypeOf(v);
  52809. };
  52810. function get$1(target, key) {
  52811. var isReadonly = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  52812. var isShallow = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  52813. // #1772: readonly(reactive(Map)) should return readonly + reactive version
  52814. // of the value
  52815. target = target["__v_raw"
  52816. /* RAW */
  52817. ];
  52818. var rawTarget = toRaw(target);
  52819. var rawKey = toRaw(key);
  52820. if (key !== rawKey) {
  52821. !isReadonly && track(rawTarget, "get"
  52822. /* GET */
  52823. , key);
  52824. }
  52825. !isReadonly && track(rawTarget, "get"
  52826. /* GET */
  52827. , rawKey);
  52828. var _getProto = getProto(rawTarget),
  52829. has = _getProto.has;
  52830. var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  52831. if (has.call(rawTarget, key)) {
  52832. return wrap(target.get(key));
  52833. } else if (has.call(rawTarget, rawKey)) {
  52834. return wrap(target.get(rawKey));
  52835. } else if (target !== rawTarget) {
  52836. // #3602 readonly(reactive(Map))
  52837. // ensure that the nested reactive `Map` can do tracking for itself
  52838. target.get(key);
  52839. }
  52840. }
  52841. function has$1(key) {
  52842. var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  52843. var target = this["__v_raw"
  52844. /* RAW */
  52845. ];
  52846. var rawTarget = toRaw(target);
  52847. var rawKey = toRaw(key);
  52848. if (key !== rawKey) {
  52849. !isReadonly && track(rawTarget, "has"
  52850. /* HAS */
  52851. , key);
  52852. }
  52853. !isReadonly && track(rawTarget, "has"
  52854. /* HAS */
  52855. , rawKey);
  52856. return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);
  52857. }
  52858. function size$2(target) {
  52859. var isReadonly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  52860. target = target["__v_raw"
  52861. /* RAW */
  52862. ];
  52863. !isReadonly && track(toRaw(target), "iterate"
  52864. /* ITERATE */
  52865. , ITERATE_KEY);
  52866. return Reflect.get(target, 'size', target);
  52867. }
  52868. function add(value) {
  52869. value = toRaw(value);
  52870. var target = toRaw(this);
  52871. var proto = getProto(target);
  52872. var hadKey = proto.has.call(target, value);
  52873. if (!hadKey) {
  52874. target.add(value);
  52875. trigger$1(target, "add"
  52876. /* ADD */
  52877. , value, value);
  52878. }
  52879. return this;
  52880. }
  52881. function set$1(key, value) {
  52882. value = toRaw(value);
  52883. var target = toRaw(this);
  52884. var _getProto2 = getProto(target),
  52885. has = _getProto2.has,
  52886. get = _getProto2.get;
  52887. var hadKey = has.call(target, key);
  52888. if (!hadKey) {
  52889. key = toRaw(key);
  52890. hadKey = has.call(target, key);
  52891. } else {
  52892. checkIdentityKeys(target, has, key);
  52893. }
  52894. var oldValue = get.call(target, key);
  52895. target.set(key, value);
  52896. if (!hadKey) {
  52897. trigger$1(target, "add"
  52898. /* ADD */
  52899. , key, value);
  52900. } else if (hasChanged(value, oldValue)) {
  52901. trigger$1(target, "set"
  52902. /* SET */
  52903. , key, value, oldValue);
  52904. }
  52905. return this;
  52906. }
  52907. function deleteEntry(key) {
  52908. var target = toRaw(this);
  52909. var _getProto3 = getProto(target),
  52910. has = _getProto3.has,
  52911. get = _getProto3.get;
  52912. var hadKey = has.call(target, key);
  52913. if (!hadKey) {
  52914. key = toRaw(key);
  52915. hadKey = has.call(target, key);
  52916. } else {
  52917. checkIdentityKeys(target, has, key);
  52918. }
  52919. var oldValue = get ? get.call(target, key) : undefined; // forward the operation before queueing reactions
  52920. var result = target.delete(key);
  52921. if (hadKey) {
  52922. trigger$1(target, "delete"
  52923. /* DELETE */
  52924. , key, undefined, oldValue);
  52925. }
  52926. return result;
  52927. }
  52928. function clear() {
  52929. var target = toRaw(this);
  52930. var hadItems = target.size !== 0;
  52931. var oldTarget = isMap(target) ? new Map(target) : new Set(target) ; // forward the operation before queueing reactions
  52932. var result = target.clear();
  52933. if (hadItems) {
  52934. trigger$1(target, "clear"
  52935. /* CLEAR */
  52936. , undefined, undefined, oldTarget);
  52937. }
  52938. return result;
  52939. }
  52940. function createForEach(isReadonly, isShallow) {
  52941. return function forEach(callback, thisArg) {
  52942. var observed = this;
  52943. var target = observed["__v_raw"
  52944. /* RAW */
  52945. ];
  52946. var rawTarget = toRaw(target);
  52947. var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  52948. !isReadonly && track(rawTarget, "iterate"
  52949. /* ITERATE */
  52950. , ITERATE_KEY);
  52951. return target.forEach(function (value, key) {
  52952. // important: make sure the callback is
  52953. // 1. invoked with the reactive map as `this` and 3rd arg
  52954. // 2. the value received should be a corresponding reactive/readonly.
  52955. return callback.call(thisArg, wrap(value), wrap(key), observed);
  52956. });
  52957. };
  52958. }
  52959. function createIterableMethod(method, isReadonly, isShallow) {
  52960. return function () {
  52961. var target = this["__v_raw"
  52962. /* RAW */
  52963. ];
  52964. var rawTarget = toRaw(target);
  52965. var targetIsMap = isMap(rawTarget);
  52966. var isPair = method === 'entries' || method === Symbol.iterator && targetIsMap;
  52967. var isKeyOnly = method === 'keys' && targetIsMap;
  52968. var innerIterator = target[method].apply(target, arguments);
  52969. var wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive;
  52970. !isReadonly && track(rawTarget, "iterate"
  52971. /* ITERATE */
  52972. , isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY); // return a wrapped iterator which returns observed versions of the
  52973. // values emitted from the real iterator
  52974. return {
  52975. // iterator protocol
  52976. next() {
  52977. var _innerIterator$next = innerIterator.next(),
  52978. value = _innerIterator$next.value,
  52979. done = _innerIterator$next.done;
  52980. return done ? {
  52981. value,
  52982. done
  52983. } : {
  52984. value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),
  52985. done
  52986. };
  52987. },
  52988. // iterable protocol
  52989. [Symbol.iterator]() {
  52990. return this;
  52991. }
  52992. };
  52993. };
  52994. }
  52995. function createReadonlyMethod(type) {
  52996. return function () {
  52997. {
  52998. var key = (arguments.length <= 0 ? undefined : arguments[0]) ? "on key \"".concat(arguments.length <= 0 ? undefined : arguments[0], "\" ") : "";
  52999. console.warn("".concat(capitalize(type), " operation ").concat(key, "failed: target is readonly."), toRaw(this));
  53000. }
  53001. return type === "delete"
  53002. /* DELETE */
  53003. ? false : this;
  53004. };
  53005. }
  53006. function createInstrumentations() {
  53007. var mutableInstrumentations = {
  53008. get(key) {
  53009. return get$1(this, key);
  53010. },
  53011. get size() {
  53012. return size$2(this);
  53013. },
  53014. has: has$1,
  53015. add,
  53016. set: set$1,
  53017. delete: deleteEntry,
  53018. clear,
  53019. forEach: createForEach(false, false)
  53020. };
  53021. var shallowInstrumentations = {
  53022. get(key) {
  53023. return get$1(this, key, false, true);
  53024. },
  53025. get size() {
  53026. return size$2(this);
  53027. },
  53028. has: has$1,
  53029. add,
  53030. set: set$1,
  53031. delete: deleteEntry,
  53032. clear,
  53033. forEach: createForEach(false, true)
  53034. };
  53035. var readonlyInstrumentations = {
  53036. get(key) {
  53037. return get$1(this, key, true);
  53038. },
  53039. get size() {
  53040. return size$2(this, true);
  53041. },
  53042. has(key) {
  53043. return has$1.call(this, key, true);
  53044. },
  53045. add: createReadonlyMethod("add"
  53046. /* ADD */
  53047. ),
  53048. set: createReadonlyMethod("set"
  53049. /* SET */
  53050. ),
  53051. delete: createReadonlyMethod("delete"
  53052. /* DELETE */
  53053. ),
  53054. clear: createReadonlyMethod("clear"
  53055. /* CLEAR */
  53056. ),
  53057. forEach: createForEach(true, false)
  53058. };
  53059. var shallowReadonlyInstrumentations = {
  53060. get(key) {
  53061. return get$1(this, key, true, true);
  53062. },
  53063. get size() {
  53064. return size$2(this, true);
  53065. },
  53066. has(key) {
  53067. return has$1.call(this, key, true);
  53068. },
  53069. add: createReadonlyMethod("add"
  53070. /* ADD */
  53071. ),
  53072. set: createReadonlyMethod("set"
  53073. /* SET */
  53074. ),
  53075. delete: createReadonlyMethod("delete"
  53076. /* DELETE */
  53077. ),
  53078. clear: createReadonlyMethod("clear"
  53079. /* CLEAR */
  53080. ),
  53081. forEach: createForEach(true, true)
  53082. };
  53083. var iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator];
  53084. iteratorMethods.forEach(function (method) {
  53085. mutableInstrumentations[method] = createIterableMethod(method, false, false);
  53086. readonlyInstrumentations[method] = createIterableMethod(method, true, false);
  53087. shallowInstrumentations[method] = createIterableMethod(method, false, true);
  53088. shallowReadonlyInstrumentations[method] = createIterableMethod(method, true, true);
  53089. });
  53090. return [mutableInstrumentations, readonlyInstrumentations, shallowInstrumentations, shallowReadonlyInstrumentations];
  53091. }
  53092. var _createInstrumentatio = /* #__PURE__*/createInstrumentations(),
  53093. _createInstrumentatio2 = _slicedToArray(_createInstrumentatio, 4),
  53094. mutableInstrumentations = _createInstrumentatio2[0],
  53095. readonlyInstrumentations = _createInstrumentatio2[1],
  53096. shallowInstrumentations = _createInstrumentatio2[2],
  53097. shallowReadonlyInstrumentations = _createInstrumentatio2[3];
  53098. function createInstrumentationGetter(isReadonly, shallow) {
  53099. var instrumentations = shallow ? isReadonly ? shallowReadonlyInstrumentations : shallowInstrumentations : isReadonly ? readonlyInstrumentations : mutableInstrumentations;
  53100. return function (target, key, receiver) {
  53101. if (key === "__v_isReactive"
  53102. /* IS_REACTIVE */
  53103. ) {
  53104. return !isReadonly;
  53105. } else if (key === "__v_isReadonly"
  53106. /* IS_READONLY */
  53107. ) {
  53108. return isReadonly;
  53109. } else if (key === "__v_raw"
  53110. /* RAW */
  53111. ) {
  53112. return target;
  53113. }
  53114. return Reflect.get(hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver);
  53115. };
  53116. }
  53117. var mutableCollectionHandlers = {
  53118. get: /*#__PURE__*/createInstrumentationGetter(false, false)
  53119. };
  53120. var readonlyCollectionHandlers = {
  53121. get: /*#__PURE__*/createInstrumentationGetter(true, false)
  53122. };
  53123. function checkIdentityKeys(target, has, key) {
  53124. var rawKey = toRaw(key);
  53125. if (rawKey !== key && has.call(target, rawKey)) {
  53126. var type = toRawType(target);
  53127. 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.");
  53128. }
  53129. }
  53130. var reactiveMap = new WeakMap();
  53131. var shallowReactiveMap = new WeakMap();
  53132. var readonlyMap = new WeakMap();
  53133. var shallowReadonlyMap = new WeakMap();
  53134. function targetTypeMap(rawType) {
  53135. switch (rawType) {
  53136. case 'Object':
  53137. case 'Array':
  53138. return 1
  53139. /* COMMON */
  53140. ;
  53141. case 'Map':
  53142. case 'Set':
  53143. case 'WeakMap':
  53144. case 'WeakSet':
  53145. return 2
  53146. /* COLLECTION */
  53147. ;
  53148. default:
  53149. return 0
  53150. /* INVALID */
  53151. ;
  53152. }
  53153. }
  53154. function getTargetType(value) {
  53155. return value["__v_skip"
  53156. /* SKIP */
  53157. ] || !Object.isExtensible(value) ? 0
  53158. /* INVALID */
  53159. : targetTypeMap(toRawType(value));
  53160. }
  53161. function reactive(target) {
  53162. // if trying to observe a readonly proxy, return the readonly version.
  53163. if (isReadonly(target)) {
  53164. return target;
  53165. }
  53166. return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);
  53167. }
  53168. /**
  53169. * Creates a readonly copy of the original object. Note the returned copy is not
  53170. * made reactive, but `readonly` can be called on an already reactive object.
  53171. */
  53172. function readonly(target) {
  53173. return createReactiveObject(target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap);
  53174. }
  53175. function createReactiveObject(target, isReadonly, baseHandlers, collectionHandlers, proxyMap) {
  53176. if (!isObject$1(target)) {
  53177. {
  53178. console.warn("value cannot be made reactive: ".concat(String(target)));
  53179. }
  53180. return target;
  53181. } // target is already a Proxy, return it.
  53182. // exception: calling readonly() on a reactive object
  53183. if (target["__v_raw"
  53184. /* RAW */
  53185. ] && !(isReadonly && target["__v_isReactive"
  53186. /* IS_REACTIVE */
  53187. ])) {
  53188. return target;
  53189. } // target already has corresponding Proxy
  53190. var existingProxy = proxyMap.get(target);
  53191. if (existingProxy) {
  53192. return existingProxy;
  53193. } // only a whitelist of value types can be observed.
  53194. var targetType = getTargetType(target);
  53195. if (targetType === 0
  53196. /* INVALID */
  53197. ) {
  53198. return target;
  53199. }
  53200. var proxy = new Proxy(target, targetType === 2
  53201. /* COLLECTION */
  53202. ? collectionHandlers : baseHandlers);
  53203. proxyMap.set(target, proxy);
  53204. return proxy;
  53205. }
  53206. function isReadonly(value) {
  53207. return !!(value && value["__v_isReadonly"
  53208. /* IS_READONLY */
  53209. ]);
  53210. }
  53211. function isShallow(value) {
  53212. return !!(value && value["__v_isShallow"
  53213. /* IS_SHALLOW */
  53214. ]);
  53215. }
  53216. function toRaw(observed) {
  53217. var raw = observed && observed["__v_raw"
  53218. /* RAW */
  53219. ];
  53220. return raw ? toRaw(raw) : observed;
  53221. }
  53222. var toReactive = function toReactive(value) {
  53223. return isObject$1(value) ? reactive(value) : value;
  53224. };
  53225. var toReadonly = function toReadonly(value) {
  53226. return isObject$1(value) ? readonly(value) : value;
  53227. };
  53228. function isRef(r) {
  53229. return !!(r && r.__v_isRef === true);
  53230. }
  53231. Promise.resolve();
  53232. 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; } } }; }
  53233. 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); }
  53234. 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; }
  53235. var queued = false;
  53236. var queue = [];
  53237. var p = Promise.resolve();
  53238. var nextTick = function nextTick(fn) {
  53239. return p.then(fn);
  53240. };
  53241. var queueJob = function queueJob(job) {
  53242. if (!queue.includes(job)) queue.push(job);
  53243. if (!queued) {
  53244. queued = true;
  53245. nextTick(flushJobs);
  53246. }
  53247. };
  53248. var flushJobs = function flushJobs() {
  53249. var _iterator = _createForOfIteratorHelper$3(queue),
  53250. _step;
  53251. try {
  53252. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  53253. var job = _step.value;
  53254. job();
  53255. }
  53256. } catch (err) {
  53257. _iterator.e(err);
  53258. } finally {
  53259. _iterator.f();
  53260. }
  53261. queue.length = 0;
  53262. queued = false;
  53263. };
  53264. function normalizeStyle(value) {
  53265. if (isArray(value)) {
  53266. var res = {};
  53267. for (var i = 0; i < value.length; i++) {
  53268. var item = value[i];
  53269. var normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);
  53270. if (normalized) {
  53271. for (var key in normalized) {
  53272. res[key] = normalized[key];
  53273. }
  53274. }
  53275. }
  53276. return res;
  53277. } else if (isString(value)) {
  53278. return value;
  53279. } else if (isObject(value)) {
  53280. return value;
  53281. }
  53282. }
  53283. var listDelimiterRE = /;(?![^(]*\))/g;
  53284. var propertyDelimiterRE = /:(.+)/;
  53285. function parseStringStyle(cssText) {
  53286. var ret = {};
  53287. cssText.split(listDelimiterRE).forEach(function (item) {
  53288. if (item) {
  53289. var tmp = item.split(propertyDelimiterRE);
  53290. tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());
  53291. }
  53292. });
  53293. return ret;
  53294. }
  53295. function normalizeClass(value) {
  53296. var res = '';
  53297. if (isString(value)) {
  53298. res = value;
  53299. } else if (isArray(value)) {
  53300. for (var i = 0; i < value.length; i++) {
  53301. var normalized = normalizeClass(value[i]);
  53302. if (normalized) {
  53303. res += normalized + ' ';
  53304. }
  53305. }
  53306. } else if (isObject(value)) {
  53307. for (var name in value) {
  53308. if (value[name]) {
  53309. res += name + ' ';
  53310. }
  53311. }
  53312. }
  53313. return res.trim();
  53314. }
  53315. function looseCompareArrays(a, b) {
  53316. if (a.length !== b.length) return false;
  53317. var equal = true;
  53318. for (var i = 0; equal && i < a.length; i++) {
  53319. equal = looseEqual(a[i], b[i]);
  53320. }
  53321. return equal;
  53322. }
  53323. function looseEqual(a, b) {
  53324. if (a === b) return true;
  53325. var aValidType = isDate(a);
  53326. var bValidType = isDate(b);
  53327. if (aValidType || bValidType) {
  53328. return aValidType && bValidType ? a.getTime() === b.getTime() : false;
  53329. }
  53330. aValidType = isArray(a);
  53331. bValidType = isArray(b);
  53332. if (aValidType || bValidType) {
  53333. return aValidType && bValidType ? looseCompareArrays(a, b) : false;
  53334. }
  53335. aValidType = isObject(a);
  53336. bValidType = isObject(b);
  53337. if (aValidType || bValidType) {
  53338. /* istanbul ignore if: this if will probably never be called */
  53339. if (!aValidType || !bValidType) {
  53340. return false;
  53341. }
  53342. var aKeysCount = Object.keys(a).length;
  53343. var bKeysCount = Object.keys(b).length;
  53344. if (aKeysCount !== bKeysCount) {
  53345. return false;
  53346. }
  53347. for (var key in a) {
  53348. var aHasKey = a.hasOwnProperty(key);
  53349. var bHasKey = b.hasOwnProperty(key);
  53350. if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {
  53351. return false;
  53352. }
  53353. }
  53354. }
  53355. return String(a) === String(b);
  53356. }
  53357. function looseIndexOf(arr, val) {
  53358. return arr.findIndex(function (item) {
  53359. return looseEqual(item, val);
  53360. });
  53361. }
  53362. Object.freeze({}) ;
  53363. Object.freeze([]) ;
  53364. var remove = function remove(arr, el) {
  53365. var i = arr.indexOf(el);
  53366. if (i > -1) {
  53367. arr.splice(i, 1);
  53368. }
  53369. };
  53370. var isArray = Array.isArray;
  53371. var isDate = function isDate(val) {
  53372. return val instanceof Date;
  53373. };
  53374. var isString = function isString(val) {
  53375. return typeof val === 'string';
  53376. };
  53377. var isObject = function isObject(val) {
  53378. return val !== null && typeof val === 'object';
  53379. };
  53380. var cacheStringFunction = function cacheStringFunction(fn) {
  53381. var cache = Object.create(null);
  53382. return function (str) {
  53383. var hit = cache[str];
  53384. return hit || (cache[str] = fn(str));
  53385. };
  53386. };
  53387. var camelizeRE = /-(\w)/g;
  53388. /**
  53389. * @private
  53390. */
  53391. var camelize = cacheStringFunction(function (str) {
  53392. return str.replace(camelizeRE, function (_, c) {
  53393. return c ? c.toUpperCase() : '';
  53394. });
  53395. });
  53396. var hyphenateRE = /\B([A-Z])/g;
  53397. /**
  53398. * @private
  53399. */
  53400. var hyphenate = cacheStringFunction(function (str) {
  53401. return str.replace(hyphenateRE, '-$1').toLowerCase();
  53402. });
  53403. var toNumber = function toNumber(val) {
  53404. var n = parseFloat(val);
  53405. return isNaN(n) ? val : n;
  53406. };
  53407. var forceAttrRE = /^(spellcheck|draggable|form|list|type)$/;
  53408. var bind = function bind(_ref) {
  53409. var el = _ref.el,
  53410. get = _ref.get,
  53411. effect = _ref.effect,
  53412. arg = _ref.arg,
  53413. modifiers = _ref.modifiers;
  53414. var prevValue; // record static class
  53415. if (arg === 'class') {
  53416. el._class = el.className;
  53417. }
  53418. effect(function () {
  53419. var value = get();
  53420. if (arg) {
  53421. if (modifiers === null || modifiers === void 0 ? void 0 : modifiers.camel) {
  53422. arg = camelize(arg);
  53423. }
  53424. setProp(el, arg, value, prevValue);
  53425. } else {
  53426. for (var key in value) {
  53427. setProp(el, key, value[key], prevValue && prevValue[key]);
  53428. }
  53429. for (var _key in prevValue) {
  53430. if (!value || !(_key in value)) {
  53431. setProp(el, _key, null);
  53432. }
  53433. }
  53434. }
  53435. prevValue = value;
  53436. });
  53437. };
  53438. var setProp = function setProp(el, key, value, prevValue) {
  53439. if (key === 'class') {
  53440. el.setAttribute('class', normalizeClass(el._class ? [el._class, value] : value) || '');
  53441. } else if (key === 'style') {
  53442. value = normalizeStyle(value);
  53443. var style = el.style;
  53444. if (!value) {
  53445. el.removeAttribute('style');
  53446. } else if (isString(value)) {
  53447. if (value !== prevValue) style.cssText = value;
  53448. } else {
  53449. for (var _key2 in value) {
  53450. setStyle(style, _key2, value[_key2]);
  53451. }
  53452. if (prevValue && !isString(prevValue)) {
  53453. for (var _key3 in prevValue) {
  53454. if (value[_key3] == null) {
  53455. setStyle(style, _key3, '');
  53456. }
  53457. }
  53458. }
  53459. }
  53460. } else if (!(el instanceof SVGElement) && key in el && !forceAttrRE.test(key)) {
  53461. // @ts-ignore
  53462. el[key] = value;
  53463. if (key === 'value') {
  53464. // @ts-ignore
  53465. el._value = value;
  53466. }
  53467. } else {
  53468. // special case for <input v-model type="checkbox"> with
  53469. // :true-value & :false-value
  53470. // store value as dom properties since non-string values will be
  53471. // stringified.
  53472. if (key === 'true-value') {
  53473. el._trueValue = value;
  53474. } else if (key === 'false-value') {
  53475. el._falseValue = value;
  53476. } else if (value != null) {
  53477. el.setAttribute(key, value);
  53478. } else {
  53479. el.removeAttribute(key);
  53480. }
  53481. }
  53482. };
  53483. var importantRE = /\s*!important$/;
  53484. var setStyle = function setStyle(style, name, val) {
  53485. if (isArray(val)) {
  53486. val.forEach(function (v) {
  53487. return setStyle(style, name, v);
  53488. });
  53489. } else {
  53490. if (name.startsWith('--')) {
  53491. // custom property definition
  53492. style.setProperty(name, val);
  53493. } else {
  53494. if (importantRE.test(val)) {
  53495. // !important
  53496. style.setProperty(hyphenate(name), val.replace(importantRE, ''), 'important');
  53497. } else {
  53498. style[name] = val;
  53499. }
  53500. }
  53501. }
  53502. };
  53503. var checkAttr = function checkAttr(el, name) {
  53504. var val = el.getAttribute(name);
  53505. if (val != null) el.removeAttribute(name);
  53506. return val;
  53507. };
  53508. var listen = function listen(el, event, handler, options) {
  53509. el.addEventListener(event, handler, options);
  53510. };
  53511. var simplePathRE = /^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/;
  53512. var systemModifiers = ['ctrl', 'shift', 'alt', 'meta'];
  53513. var modifierGuards = {
  53514. stop: function stop(e) {
  53515. return e.stopPropagation();
  53516. },
  53517. prevent: function prevent(e) {
  53518. return e.preventDefault();
  53519. },
  53520. self: function self(e) {
  53521. return e.target !== e.currentTarget;
  53522. },
  53523. ctrl: function ctrl(e) {
  53524. return !e.ctrlKey;
  53525. },
  53526. shift: function shift(e) {
  53527. return !e.shiftKey;
  53528. },
  53529. alt: function alt(e) {
  53530. return !e.altKey;
  53531. },
  53532. meta: function meta(e) {
  53533. return !e.metaKey;
  53534. },
  53535. left: function left(e) {
  53536. return 'button' in e && e.button !== 0;
  53537. },
  53538. middle: function middle(e) {
  53539. return 'button' in e && e.button !== 1;
  53540. },
  53541. right: function right(e) {
  53542. return 'button' in e && e.button !== 2;
  53543. },
  53544. exact: function exact(e, modifiers) {
  53545. return systemModifiers.some(function (m) {
  53546. return e["".concat(m, "Key")] && !modifiers[m];
  53547. });
  53548. }
  53549. };
  53550. var on = function on(_ref) {
  53551. var el = _ref.el,
  53552. get = _ref.get,
  53553. exp = _ref.exp,
  53554. arg = _ref.arg,
  53555. modifiers = _ref.modifiers;
  53556. if (!arg) {
  53557. {
  53558. console.error("v-on=\"obj\" syntax is not supported in petite-vue.");
  53559. }
  53560. return;
  53561. }
  53562. var handler = simplePathRE.test(exp) ? get("(e => ".concat(exp, "(e))")) : get("($event => { ".concat(exp, " })")); // special lifecycle events
  53563. if ((arg === 'mounted' || arg === 'unmounted')) {
  53564. console.error("mounted and unmounted hooks now need to be prefixed with vue: " + "- use @vue:".concat(arg, "=\"handler\" instead."));
  53565. }
  53566. if (arg === 'vue:mounted') {
  53567. nextTick(handler);
  53568. return;
  53569. } else if (arg === 'vue:unmounted') {
  53570. return function () {
  53571. return handler();
  53572. };
  53573. }
  53574. if (modifiers) {
  53575. // map modifiers
  53576. if (arg === 'click') {
  53577. if (modifiers.right) arg = 'contextmenu';
  53578. if (modifiers.middle) arg = 'mouseup';
  53579. }
  53580. var raw = handler;
  53581. handler = function handler(e) {
  53582. if ('key' in e && !(hyphenate(e.key) in modifiers)) {
  53583. return;
  53584. }
  53585. for (var key in modifiers) {
  53586. var guard = modifierGuards[key];
  53587. if (guard && guard(e, modifiers)) {
  53588. return;
  53589. }
  53590. }
  53591. return raw(e);
  53592. };
  53593. }
  53594. listen(el, arg, handler, modifiers);
  53595. };
  53596. var show = function show(_ref) {
  53597. var el = _ref.el,
  53598. get = _ref.get,
  53599. effect = _ref.effect;
  53600. var initialDisplay = el.style.display;
  53601. effect(function () {
  53602. el.style.display = get() ? initialDisplay : 'none';
  53603. });
  53604. };
  53605. var text = function text(_ref) {
  53606. var el = _ref.el,
  53607. get = _ref.get,
  53608. effect = _ref.effect;
  53609. effect(function () {
  53610. el.textContent = toDisplayString(get());
  53611. });
  53612. };
  53613. var toDisplayString = function toDisplayString(value) {
  53614. return value == null ? '' : isObject(value) ? JSON.stringify(value, null, 2) : String(value);
  53615. };
  53616. var html = function html(_ref) {
  53617. var el = _ref.el,
  53618. get = _ref.get,
  53619. effect = _ref.effect;
  53620. effect(function () {
  53621. el.innerHTML = get();
  53622. });
  53623. };
  53624. var model = function model(_ref) {
  53625. var el = _ref.el,
  53626. exp = _ref.exp,
  53627. get = _ref.get,
  53628. effect = _ref.effect,
  53629. modifiers = _ref.modifiers;
  53630. var type = el.type;
  53631. var assign = get("(val) => { ".concat(exp, " = val }"));
  53632. var _ref2 = modifiers || {},
  53633. trim = _ref2.trim,
  53634. _ref2$number = _ref2.number,
  53635. number = _ref2$number === void 0 ? type === 'number' : _ref2$number;
  53636. if (el.tagName === 'SELECT') {
  53637. var sel = el;
  53638. listen(el, 'change', function () {
  53639. var selectedVal = Array.prototype.filter.call(sel.options, function (o) {
  53640. return o.selected;
  53641. }).map(function (o) {
  53642. return number ? toNumber(getValue(o)) : getValue(o);
  53643. });
  53644. assign(sel.multiple ? selectedVal : selectedVal[0]);
  53645. });
  53646. effect(function () {
  53647. var value = get();
  53648. var isMultiple = sel.multiple;
  53649. for (var i = 0, l = sel.options.length; i < l; i++) {
  53650. var option = sel.options[i];
  53651. var optionValue = getValue(option);
  53652. if (isMultiple) {
  53653. if (isArray(value)) {
  53654. option.selected = looseIndexOf(value, optionValue) > -1;
  53655. } else {
  53656. option.selected = value.has(optionValue);
  53657. }
  53658. } else {
  53659. if (looseEqual(getValue(option), value)) {
  53660. if (sel.selectedIndex !== i) sel.selectedIndex = i;
  53661. return;
  53662. }
  53663. }
  53664. }
  53665. if (!isMultiple && sel.selectedIndex !== -1) {
  53666. sel.selectedIndex = -1;
  53667. }
  53668. });
  53669. } else if (type === 'checkbox') {
  53670. listen(el, 'change', function () {
  53671. var modelValue = get();
  53672. var checked = el.checked;
  53673. if (isArray(modelValue)) {
  53674. var elementValue = getValue(el);
  53675. var index = looseIndexOf(modelValue, elementValue);
  53676. var found = index !== -1;
  53677. if (checked && !found) {
  53678. assign(modelValue.concat(elementValue));
  53679. } else if (!checked && found) {
  53680. var filtered = _toConsumableArray(modelValue);
  53681. filtered.splice(index, 1);
  53682. assign(filtered);
  53683. }
  53684. } else {
  53685. assign(getCheckboxValue(el, checked));
  53686. }
  53687. });
  53688. var oldValue;
  53689. effect(function () {
  53690. var value = get();
  53691. if (isArray(value)) {
  53692. el.checked = looseIndexOf(value, getValue(el)) > -1;
  53693. } else if (value !== oldValue) {
  53694. el.checked = looseEqual(value, getCheckboxValue(el, true));
  53695. }
  53696. oldValue = value;
  53697. });
  53698. } else if (type === 'radio') {
  53699. listen(el, 'change', function () {
  53700. assign(getValue(el));
  53701. });
  53702. var _oldValue;
  53703. effect(function () {
  53704. var value = get();
  53705. if (value !== _oldValue) {
  53706. el.checked = looseEqual(value, getValue(el));
  53707. }
  53708. });
  53709. } else {
  53710. // text-like
  53711. var resolveValue = function resolveValue(val) {
  53712. if (trim) return val.trim();
  53713. if (number) return toNumber(val);
  53714. return val;
  53715. };
  53716. listen(el, 'compositionstart', onCompositionStart);
  53717. listen(el, 'compositionend', onCompositionEnd);
  53718. listen(el, (modifiers === null || modifiers === void 0 ? void 0 : modifiers.lazy) ? 'change' : 'input', function () {
  53719. if (el.composing) return;
  53720. assign(resolveValue(el.value));
  53721. });
  53722. if (trim) {
  53723. listen(el, 'change', function () {
  53724. el.value = el.value.trim();
  53725. });
  53726. }
  53727. effect(function () {
  53728. if (el.composing) {
  53729. return;
  53730. }
  53731. var curVal = el.value;
  53732. var newVal = get();
  53733. if (document.activeElement === el && resolveValue(curVal) === newVal) {
  53734. return;
  53735. }
  53736. if (curVal !== newVal) {
  53737. el.value = newVal;
  53738. }
  53739. });
  53740. }
  53741. };
  53742. var getValue = function getValue(el) {
  53743. return '_value' in el ? el._value : el.value;
  53744. }; // retrieve raw value for true-value and false-value set via :true-value or :false-value bindings
  53745. var getCheckboxValue = function getCheckboxValue(el, checked) {
  53746. var key = checked ? '_trueValue' : '_falseValue';
  53747. return key in el ? el[key] : checked;
  53748. };
  53749. var onCompositionStart = function onCompositionStart(e) {
  53750. e.target.composing = true;
  53751. };
  53752. var onCompositionEnd = function onCompositionEnd(e) {
  53753. var target = e.target;
  53754. if (target.composing) {
  53755. target.composing = false;
  53756. trigger(target, 'input');
  53757. }
  53758. };
  53759. var trigger = function trigger(el, type) {
  53760. var e = document.createEvent('HTMLEvents');
  53761. e.initEvent(type, true, true);
  53762. el.dispatchEvent(e);
  53763. };
  53764. var evalCache = Object.create(null);
  53765. var evaluate = function evaluate(scope, exp, el) {
  53766. return execute(scope, "return(".concat(exp, ")"), el);
  53767. };
  53768. var execute = function execute(scope, exp, el) {
  53769. var fn = evalCache[exp] || (evalCache[exp] = toFunction(exp));
  53770. try {
  53771. return fn(scope, el);
  53772. } catch (e) {
  53773. {
  53774. console.warn("Error when evaluating expression \"".concat(exp, "\":"));
  53775. }
  53776. console.error(e);
  53777. }
  53778. };
  53779. var toFunction = function toFunction(exp) {
  53780. try {
  53781. return new Function("$data", "$el", "with($data){".concat(exp, "}"));
  53782. } catch (e) {
  53783. console.error("".concat(e.message, " in expression: ").concat(exp));
  53784. return function () {};
  53785. }
  53786. };
  53787. var effect = function effect(_ref) {
  53788. var el = _ref.el,
  53789. ctx = _ref.ctx,
  53790. exp = _ref.exp,
  53791. effect = _ref.effect;
  53792. nextTick(function () {
  53793. return effect(function () {
  53794. return execute(ctx.scope, exp, el);
  53795. });
  53796. });
  53797. };
  53798. var builtInDirectives = {
  53799. bind,
  53800. on,
  53801. show,
  53802. text,
  53803. html,
  53804. model,
  53805. effect
  53806. };
  53807. var _if = function _if(el, exp, ctx) {
  53808. if (!exp.trim()) {
  53809. console.warn("v-if expression cannot be empty.");
  53810. }
  53811. var parent = el.parentElement;
  53812. var anchor = new Comment('v-if');
  53813. parent.insertBefore(anchor, el);
  53814. var branches = [{
  53815. exp,
  53816. el
  53817. }]; // locate else branch
  53818. var elseEl;
  53819. var elseExp;
  53820. while (elseEl = el.nextElementSibling) {
  53821. elseExp = null;
  53822. if (checkAttr(elseEl, 'v-else') === '' || (elseExp = checkAttr(elseEl, 'v-else-if'))) {
  53823. parent.removeChild(elseEl);
  53824. branches.push({
  53825. exp: elseExp,
  53826. el: elseEl
  53827. });
  53828. } else {
  53829. break;
  53830. }
  53831. }
  53832. var nextNode = el.nextSibling;
  53833. parent.removeChild(el);
  53834. var block;
  53835. var activeBranchIndex = -1;
  53836. var removeActiveBlock = function removeActiveBlock() {
  53837. if (block) {
  53838. parent.insertBefore(anchor, block.el);
  53839. block.remove();
  53840. block = undefined;
  53841. }
  53842. };
  53843. ctx.effect(function () {
  53844. for (var i = 0; i < branches.length; i++) {
  53845. var _branches$i = branches[i],
  53846. _exp = _branches$i.exp,
  53847. _el = _branches$i.el;
  53848. if (!_exp || evaluate(ctx.scope, _exp)) {
  53849. if (i !== activeBranchIndex) {
  53850. removeActiveBlock();
  53851. block = new Block(_el, ctx);
  53852. block.insert(parent, anchor);
  53853. parent.removeChild(anchor);
  53854. activeBranchIndex = i;
  53855. }
  53856. return;
  53857. }
  53858. } // no matched branch.
  53859. activeBranchIndex = -1;
  53860. removeActiveBlock();
  53861. });
  53862. return nextNode;
  53863. };
  53864. var forAliasRE = /([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/;
  53865. var forIteratorRE = /,([^,\}\]]*)(?:,([^,\}\]]*))?$/;
  53866. var stripParensRE = /^\(|\)$/g;
  53867. var destructureRE = /^[{[]\s*((?:[\w_$]+\s*,?\s*)+)[\]}]$/;
  53868. var _for = function _for(el, exp, ctx) {
  53869. var inMatch = exp.match(forAliasRE);
  53870. if (!inMatch) {
  53871. console.warn("invalid v-for expression: ".concat(exp));
  53872. return;
  53873. }
  53874. var nextNode = el.nextSibling;
  53875. var parent = el.parentElement;
  53876. var anchor = new Text('');
  53877. parent.insertBefore(anchor, el);
  53878. parent.removeChild(el);
  53879. var sourceExp = inMatch[2].trim();
  53880. var valueExp = inMatch[1].trim().replace(stripParensRE, '').trim();
  53881. var destructureBindings;
  53882. var isArrayDestructure = false;
  53883. var indexExp;
  53884. var objIndexExp;
  53885. var keyAttr = 'key';
  53886. var keyExp = el.getAttribute(keyAttr) || el.getAttribute(keyAttr = ':key') || el.getAttribute(keyAttr = 'v-bind:key');
  53887. if (keyExp) {
  53888. el.removeAttribute(keyAttr);
  53889. if (keyAttr === 'key') keyExp = JSON.stringify(keyExp);
  53890. }
  53891. var match;
  53892. if (match = valueExp.match(forIteratorRE)) {
  53893. valueExp = valueExp.replace(forIteratorRE, '').trim();
  53894. indexExp = match[1].trim();
  53895. if (match[2]) {
  53896. objIndexExp = match[2].trim();
  53897. }
  53898. }
  53899. if (match = valueExp.match(destructureRE)) {
  53900. destructureBindings = match[1].split(',').map(function (s) {
  53901. return s.trim();
  53902. });
  53903. isArrayDestructure = valueExp[0] === '[';
  53904. }
  53905. var mounted = false;
  53906. var blocks;
  53907. var childCtxs;
  53908. var keyToIndexMap;
  53909. var createChildContexts = function createChildContexts(source) {
  53910. var map = new Map();
  53911. var ctxs = [];
  53912. if (isArray(source)) {
  53913. for (var i = 0; i < source.length; i++) {
  53914. ctxs.push(createChildContext(map, source[i], i));
  53915. }
  53916. } else if (typeof source === 'number') {
  53917. for (var _i = 0; _i < source; _i++) {
  53918. ctxs.push(createChildContext(map, _i + 1, _i));
  53919. }
  53920. } else if (isObject(source)) {
  53921. var _i2 = 0;
  53922. for (var key in source) {
  53923. ctxs.push(createChildContext(map, source[key], _i2++, key));
  53924. }
  53925. }
  53926. return [ctxs, map];
  53927. };
  53928. var createChildContext = function createChildContext(map, value, index, objKey) {
  53929. var data = {};
  53930. if (destructureBindings) {
  53931. destructureBindings.forEach(function (b, i) {
  53932. return data[b] = value[isArrayDestructure ? i : b];
  53933. });
  53934. } else {
  53935. data[valueExp] = value;
  53936. }
  53937. if (objKey) {
  53938. indexExp && (data[indexExp] = objKey);
  53939. objIndexExp && (data[objIndexExp] = index);
  53940. } else {
  53941. indexExp && (data[indexExp] = index);
  53942. }
  53943. var childCtx = createScopedContext(ctx, data);
  53944. var key = keyExp ? evaluate(childCtx.scope, keyExp) : index;
  53945. map.set(key, index);
  53946. childCtx.key = key;
  53947. return childCtx;
  53948. };
  53949. var mountBlock = function mountBlock(ctx, ref) {
  53950. var block = new Block(el, ctx);
  53951. block.key = ctx.key;
  53952. block.insert(parent, ref);
  53953. return block;
  53954. };
  53955. ctx.effect(function () {
  53956. var source = evaluate(ctx.scope, sourceExp);
  53957. var prevKeyToIndexMap = keyToIndexMap;
  53958. var _createChildContexts = createChildContexts(source);
  53959. var _createChildContexts2 = _slicedToArray(_createChildContexts, 2);
  53960. childCtxs = _createChildContexts2[0];
  53961. keyToIndexMap = _createChildContexts2[1];
  53962. if (!mounted) {
  53963. blocks = childCtxs.map(function (s) {
  53964. return mountBlock(s, anchor);
  53965. });
  53966. mounted = true;
  53967. } else {
  53968. for (var _i3 = 0; _i3 < blocks.length; _i3++) {
  53969. if (!keyToIndexMap.has(blocks[_i3].key)) {
  53970. blocks[_i3].remove();
  53971. }
  53972. }
  53973. var nextBlocks = [];
  53974. var i = childCtxs.length;
  53975. var nextBlock;
  53976. var prevMovedBlock;
  53977. while (i--) {
  53978. var childCtx = childCtxs[i];
  53979. var oldIndex = prevKeyToIndexMap.get(childCtx.key);
  53980. var block = void 0;
  53981. if (oldIndex == null) {
  53982. // new
  53983. block = mountBlock(childCtx, nextBlock ? nextBlock.el : anchor);
  53984. } else {
  53985. // update
  53986. block = blocks[oldIndex];
  53987. Object.assign(block.ctx.scope, childCtx.scope);
  53988. if (oldIndex !== i) {
  53989. // moved
  53990. if (blocks[oldIndex + 1] !== nextBlock || // If the next has moved, it must move too
  53991. prevMovedBlock === nextBlock) {
  53992. prevMovedBlock = block;
  53993. block.insert(parent, nextBlock ? nextBlock.el : anchor);
  53994. }
  53995. }
  53996. }
  53997. nextBlocks.unshift(nextBlock = block);
  53998. }
  53999. blocks = nextBlocks;
  54000. }
  54001. });
  54002. return nextNode;
  54003. };
  54004. var ref = function ref(_ref) {
  54005. var el = _ref.el,
  54006. $refs = _ref.ctx.scope.$refs,
  54007. get = _ref.get,
  54008. effect = _ref.effect;
  54009. var prevRef;
  54010. effect(function () {
  54011. var ref = get();
  54012. $refs[ref] = el;
  54013. if (prevRef && ref !== prevRef) {
  54014. delete $refs[prevRef];
  54015. }
  54016. prevRef = ref;
  54017. });
  54018. return function () {
  54019. prevRef && delete $refs[prevRef];
  54020. };
  54021. };
  54022. var dirRE = /^(?:v-|:|@)/;
  54023. var modifierRE = /\.([\w-]+)/g;
  54024. var inOnce = false;
  54025. var walk = function walk(node, ctx) {
  54026. var type = node.nodeType;
  54027. if (type === 1) {
  54028. // Element
  54029. var el = node;
  54030. if (el.hasAttribute('v-pre')) {
  54031. return;
  54032. }
  54033. checkAttr(el, 'v-cloak');
  54034. var exp; // v-if
  54035. if (exp = checkAttr(el, 'v-if')) {
  54036. return _if(el, exp, ctx);
  54037. } // v-for
  54038. if (exp = checkAttr(el, 'v-for')) {
  54039. return _for(el, exp, ctx);
  54040. } // v-scope
  54041. if ((exp = checkAttr(el, 'v-scope')) || exp === '') {
  54042. var scope = exp ? evaluate(ctx.scope, exp) : {};
  54043. ctx = createScopedContext(ctx, scope);
  54044. if (scope.$template) {
  54045. resolveTemplate(el, scope.$template);
  54046. }
  54047. } // v-once
  54048. var hasVOnce = checkAttr(el, 'v-once') != null;
  54049. if (hasVOnce) {
  54050. inOnce = true;
  54051. } // ref
  54052. if (exp = checkAttr(el, 'ref')) {
  54053. applyDirective(el, ref, "\"".concat(exp, "\""), ctx);
  54054. } // process children first before self attrs
  54055. walkChildren(el, ctx); // other directives
  54056. var deferred = [];
  54057. for (var _i = 0, _arr = _toConsumableArray(el.attributes); _i < _arr.length; _i++) {
  54058. var _arr$_i = _arr[_i],
  54059. name = _arr$_i.name,
  54060. value = _arr$_i.value;
  54061. if (dirRE.test(name) && name !== 'v-cloak') {
  54062. if (name === 'v-model') {
  54063. // defer v-model since it relies on :value bindings to be processed
  54064. // first, but also before v-on listeners (#73)
  54065. deferred.unshift([name, value]);
  54066. } else if (name[0] === '@' || /^v-on\b/.test(name)) {
  54067. deferred.push([name, value]);
  54068. } else {
  54069. processDirective(el, name, value, ctx);
  54070. }
  54071. }
  54072. }
  54073. for (var _i2 = 0, _deferred = deferred; _i2 < _deferred.length; _i2++) {
  54074. var _deferred$_i = _slicedToArray(_deferred[_i2], 2),
  54075. _name = _deferred$_i[0],
  54076. _value = _deferred$_i[1];
  54077. processDirective(el, _name, _value, ctx);
  54078. }
  54079. if (hasVOnce) {
  54080. inOnce = false;
  54081. }
  54082. } else if (type === 3) {
  54083. // Text
  54084. var data = node.data;
  54085. if (data.includes(ctx.delimiters[0])) {
  54086. var segments = [];
  54087. var lastIndex = 0;
  54088. var match;
  54089. while (match = ctx.delimitersRE.exec(data)) {
  54090. var leading = data.slice(lastIndex, match.index);
  54091. if (leading) segments.push(JSON.stringify(leading));
  54092. segments.push("$s(".concat(match[1], ")"));
  54093. lastIndex = match.index + match[0].length;
  54094. }
  54095. if (lastIndex < data.length) {
  54096. segments.push(JSON.stringify(data.slice(lastIndex)));
  54097. }
  54098. applyDirective(node, text, segments.join('+'), ctx);
  54099. }
  54100. } else if (type === 11) {
  54101. walkChildren(node, ctx);
  54102. }
  54103. };
  54104. var walkChildren = function walkChildren(node, ctx) {
  54105. var child = node.firstChild;
  54106. while (child) {
  54107. child = walk(child, ctx) || child.nextSibling;
  54108. }
  54109. };
  54110. var processDirective = function processDirective(el, raw, exp, ctx) {
  54111. var dir;
  54112. var arg;
  54113. var modifiers; // modifiers
  54114. raw = raw.replace(modifierRE, function (_, m) {
  54115. (modifiers || (modifiers = {}))[m] = true;
  54116. return '';
  54117. });
  54118. if (raw[0] === ':') {
  54119. dir = bind;
  54120. arg = raw.slice(1);
  54121. } else if (raw[0] === '@') {
  54122. dir = on;
  54123. arg = raw.slice(1);
  54124. } else {
  54125. var argIndex = raw.indexOf(':');
  54126. var dirName = argIndex > 0 ? raw.slice(2, argIndex) : raw.slice(2);
  54127. dir = builtInDirectives[dirName] || ctx.dirs[dirName];
  54128. arg = argIndex > 0 ? raw.slice(argIndex + 1) : undefined;
  54129. }
  54130. if (dir) {
  54131. if (dir === bind && arg === 'ref') dir = ref;
  54132. applyDirective(el, dir, exp, ctx, arg, modifiers);
  54133. el.removeAttribute(raw);
  54134. } else {
  54135. console.error("unknown custom directive ".concat(raw, "."));
  54136. }
  54137. };
  54138. var applyDirective = function applyDirective(el, dir, exp, ctx, arg, modifiers) {
  54139. var get = function get() {
  54140. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : exp;
  54141. return evaluate(ctx.scope, e, el);
  54142. };
  54143. var cleanup = dir({
  54144. el,
  54145. get,
  54146. effect: ctx.effect,
  54147. ctx,
  54148. exp,
  54149. arg,
  54150. modifiers
  54151. });
  54152. if (cleanup) {
  54153. ctx.cleanups.push(cleanup);
  54154. }
  54155. };
  54156. var resolveTemplate = function resolveTemplate(el, template) {
  54157. if (template[0] === '#') {
  54158. var templateEl = document.querySelector(template);
  54159. if (!templateEl) {
  54160. console.error("template selector ".concat(template, " has no matching <template> element."));
  54161. }
  54162. el.appendChild(templateEl.content.cloneNode(true));
  54163. return;
  54164. }
  54165. el.innerHTML = template;
  54166. };
  54167. var createContext = function createContext(parent) {
  54168. var ctx = Object.assign(Object.assign({
  54169. delimiters: ['{{', '}}'],
  54170. delimitersRE: /\{\{([^]+?)\}\}/g
  54171. }, parent), {
  54172. scope: parent ? parent.scope : reactive({}),
  54173. dirs: parent ? parent.dirs : {},
  54174. effects: [],
  54175. blocks: [],
  54176. cleanups: [],
  54177. effect: function effect(fn) {
  54178. if (inOnce) {
  54179. queueJob(fn);
  54180. return fn;
  54181. }
  54182. var e = effect$1(fn, {
  54183. scheduler: function scheduler() {
  54184. return queueJob(e);
  54185. }
  54186. });
  54187. ctx.effects.push(e);
  54188. return e;
  54189. }
  54190. });
  54191. return ctx;
  54192. };
  54193. var createScopedContext = function createScopedContext(ctx) {
  54194. var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  54195. var parentScope = ctx.scope;
  54196. var mergedScope = Object.create(parentScope);
  54197. Object.defineProperties(mergedScope, Object.getOwnPropertyDescriptors(data));
  54198. mergedScope.$refs = Object.create(parentScope.$refs);
  54199. var reactiveProxy = reactive(new Proxy(mergedScope, {
  54200. set(target, key, val, receiver) {
  54201. // when setting a property that doesn't exist on current scope,
  54202. // do not create it on the current scope and fallback to parent scope.
  54203. if (receiver === reactiveProxy && !target.hasOwnProperty(key)) {
  54204. return Reflect.set(parentScope, key, val);
  54205. }
  54206. return Reflect.set(target, key, val, receiver);
  54207. }
  54208. }));
  54209. bindContextMethods(reactiveProxy);
  54210. return Object.assign(Object.assign({}, ctx), {
  54211. scope: reactiveProxy
  54212. });
  54213. };
  54214. var bindContextMethods = function bindContextMethods(scope) {
  54215. for (var _i = 0, _Object$keys = Object.keys(scope); _i < _Object$keys.length; _i++) {
  54216. var key = _Object$keys[_i];
  54217. if (typeof scope[key] === 'function') {
  54218. scope[key] = scope[key].bind(scope);
  54219. }
  54220. }
  54221. };
  54222. var Block = /*#__PURE__*/function () {
  54223. function Block(template, parentCtx) {
  54224. var isRoot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  54225. _classCallCheck(this, Block);
  54226. this.isFragment = template instanceof HTMLTemplateElement;
  54227. if (isRoot) {
  54228. this.template = template;
  54229. } else if (this.isFragment) {
  54230. this.template = template.content.cloneNode(true);
  54231. } else {
  54232. this.template = template.cloneNode(true);
  54233. }
  54234. if (isRoot) {
  54235. this.ctx = parentCtx;
  54236. } else {
  54237. // create child context
  54238. this.parentCtx = parentCtx;
  54239. parentCtx.blocks.push(this);
  54240. this.ctx = createContext(parentCtx);
  54241. }
  54242. walk(this.template, this.ctx);
  54243. }
  54244. _createClass(Block, [{
  54245. key: "el",
  54246. get: function get() {
  54247. return this.start || this.template;
  54248. }
  54249. }, {
  54250. key: "insert",
  54251. value: function insert(parent) {
  54252. var anchor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  54253. if (this.isFragment) {
  54254. if (this.start) {
  54255. // already inserted, moving
  54256. var node = this.start;
  54257. var next;
  54258. while (node) {
  54259. next = node.nextSibling;
  54260. parent.insertBefore(node, anchor);
  54261. if (node === this.end) break;
  54262. node = next;
  54263. }
  54264. } else {
  54265. this.start = new Text('');
  54266. this.end = new Text('');
  54267. parent.insertBefore(this.end, anchor);
  54268. parent.insertBefore(this.start, this.end);
  54269. parent.insertBefore(this.template, this.end);
  54270. }
  54271. } else {
  54272. parent.insertBefore(this.template, anchor);
  54273. }
  54274. }
  54275. }, {
  54276. key: "remove",
  54277. value: function remove$1() {
  54278. if (this.parentCtx) {
  54279. remove(this.parentCtx.blocks, this);
  54280. }
  54281. if (this.start) {
  54282. var parent = this.start.parentNode;
  54283. var node = this.start;
  54284. var next;
  54285. while (node) {
  54286. next = node.nextSibling;
  54287. parent.removeChild(node);
  54288. if (node === this.end) break;
  54289. node = next;
  54290. }
  54291. } else {
  54292. this.template.parentNode.removeChild(this.template);
  54293. }
  54294. this.teardown();
  54295. }
  54296. }, {
  54297. key: "teardown",
  54298. value: function teardown() {
  54299. this.ctx.blocks.forEach(function (child) {
  54300. child.teardown();
  54301. });
  54302. this.ctx.effects.forEach(stop);
  54303. this.ctx.cleanups.forEach(function (fn) {
  54304. return fn();
  54305. });
  54306. }
  54307. }]);
  54308. return Block;
  54309. }();
  54310. var escapeRegex = function escapeRegex(str) {
  54311. return str.replace(/[-.*+?^${}()|[\]\/\\]/g, '\\$&');
  54312. };
  54313. var createApp = function createApp(initialData) {
  54314. // root context
  54315. var ctx = createContext();
  54316. if (initialData) {
  54317. ctx.scope = reactive(initialData);
  54318. bindContextMethods(ctx.scope); // handle custom delimiters
  54319. if (initialData.$delimiters) {
  54320. var _ctx$delimiters = ctx.delimiters = initialData.$delimiters,
  54321. _ctx$delimiters2 = _slicedToArray(_ctx$delimiters, 2),
  54322. open = _ctx$delimiters2[0],
  54323. close = _ctx$delimiters2[1];
  54324. ctx.delimitersRE = new RegExp(escapeRegex(open) + '([^]+?)' + escapeRegex(close), 'g');
  54325. }
  54326. } // global internal helpers
  54327. ctx.scope.$s = toDisplayString;
  54328. ctx.scope.$nextTick = nextTick;
  54329. ctx.scope.$refs = Object.create(null);
  54330. var rootBlocks;
  54331. return {
  54332. directive(name, def) {
  54333. if (def) {
  54334. ctx.dirs[name] = def;
  54335. return this;
  54336. } else {
  54337. return ctx.dirs[name];
  54338. }
  54339. },
  54340. mount(el) {
  54341. if (typeof el === 'string') {
  54342. el = document.querySelector(el);
  54343. if (!el) {
  54344. console.error("selector ".concat(el, " has no matching element."));
  54345. return;
  54346. }
  54347. }
  54348. el = el || document.documentElement;
  54349. var roots;
  54350. if (el.hasAttribute('v-scope')) {
  54351. roots = [el];
  54352. } else {
  54353. roots = _toConsumableArray(el.querySelectorAll("[v-scope]")).filter(function (root) {
  54354. return !root.matches("[v-scope] [v-scope]");
  54355. });
  54356. }
  54357. if (!roots.length) {
  54358. roots = [el];
  54359. }
  54360. if (roots.length === 1 && roots[0] === document.documentElement) {
  54361. 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`.");
  54362. }
  54363. rootBlocks = roots.map(function (el) {
  54364. return new Block(el, ctx, true);
  54365. });
  54366. return this;
  54367. },
  54368. unmount() {
  54369. rootBlocks.forEach(function (block) {
  54370. return block.teardown();
  54371. });
  54372. }
  54373. };
  54374. };
  54375. var s = document.currentScript;
  54376. if (s && s.hasAttribute('init')) {
  54377. createApp().mount();
  54378. }
  54379. var PetiteVue = /*#__PURE__*/Object.freeze({
  54380. __proto__: null,
  54381. createApp: createApp,
  54382. nextTick: nextTick,
  54383. reactive: reactive
  54384. });
  54385. var base64ToBlob = function base64ToBlob(base64) {
  54386. var arr = base64.split(','),
  54387. mime = arr[0].match(/:(.*?);/)[1],
  54388. bstr = atob(arr[1]),
  54389. n = bstr.length,
  54390. u8arr = new Uint8Array(n);
  54391. while (n--) {
  54392. u8arr[n] = bstr.charCodeAt(n);
  54393. }
  54394. return new Blob([u8arr], {
  54395. type: mime
  54396. });
  54397. };
  54398. function convertBlob2File(blob, name) {
  54399. return new File([blob], name, {
  54400. type: blob.type
  54401. });
  54402. }
  54403. function download(blob, name) {
  54404. if (!blob || !name) {
  54405. return;
  54406. }
  54407. var objectUrl = window.URL.createObjectURL(blob);
  54408. var a = document.createElement('a');
  54409. a.href = objectUrl;
  54410. a.download = name;
  54411. a.click();
  54412. a.remove();
  54413. window.URL.revokeObjectURL(objectUrl);
  54414. }
  54415. function downloadFromURL(url, name) {
  54416. return new Promise( /*#__PURE__*/function () {
  54417. var _ref = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(resolve, reject) {
  54418. var response, blob;
  54419. return regenerator.wrap(function _callee$(_context) {
  54420. while (1) {
  54421. switch (_context.prev = _context.next) {
  54422. case 0:
  54423. if (!(!url || !name)) {
  54424. _context.next = 2;
  54425. break;
  54426. }
  54427. return _context.abrupt("return", reject("url or name is null"));
  54428. case 2:
  54429. if (!(url instanceof Blob)) {
  54430. _context.next = 7;
  54431. break;
  54432. }
  54433. download(url, name);
  54434. resolve(true);
  54435. _context.next = 19;
  54436. break;
  54437. case 7:
  54438. if (!(url.indexOf('data:') === 0)) {
  54439. _context.next = 12;
  54440. break;
  54441. }
  54442. download(base64ToBlob(url), name);
  54443. resolve(true);
  54444. _context.next = 19;
  54445. break;
  54446. case 12:
  54447. _context.next = 14;
  54448. return fetch(url);
  54449. case 14:
  54450. response = _context.sent;
  54451. _context.next = 17;
  54452. return response.blob();
  54453. case 17:
  54454. blob = _context.sent;
  54455. // 创建隐藏的可下载链接
  54456. if (blob) {
  54457. download(blob, name);
  54458. resolve(true);
  54459. } else {
  54460. reject(false);
  54461. }
  54462. case 19:
  54463. case "end":
  54464. return _context.stop();
  54465. }
  54466. }
  54467. }, _callee);
  54468. }));
  54469. return function (_x, _x2) {
  54470. return _ref.apply(this, arguments);
  54471. };
  54472. }());
  54473. }
  54474. var file = /*#__PURE__*/Object.freeze({
  54475. __proto__: null,
  54476. base64ToBlob: base64ToBlob,
  54477. convertBlob2File: convertBlob2File,
  54478. download: download,
  54479. downloadFromURL: downloadFromURL
  54480. });
  54481. 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); }; }
  54482. 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; } }
  54483. var vec1 = new THREE.Vector3(),
  54484. vec2 = new THREE.Vector3(),
  54485. vec3 = new THREE.Vector3();
  54486. var quat1 = new THREE.Quaternion(),
  54487. quat2 = new THREE.Quaternion();
  54488. var cameraModel; // 监控相机颜色
  54489. var normalColor = new THREE.Color(1, 1, 1);
  54490. var hoverColor = new THREE.Color(2, 2, 2);
  54491. /**
  54492. * 监控相机
  54493. */
  54494. var SecurityCamera = /*#__PURE__*/function (_THREE$PerspectiveCam) {
  54495. _inherits(SecurityCamera, _THREE$PerspectiveCam);
  54496. var _super = _createSuper$L(SecurityCamera);
  54497. function SecurityCamera(control, options, videoPlayer) {
  54498. var _this;
  54499. _classCallCheck(this, SecurityCamera);
  54500. _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);
  54501. _this.shake = function () {
  54502. var id0 = transitions$1.getUniqueId(),
  54503. id1 = transitions$1.getUniqueId();
  54504. var _self = _assertThisInitialized(_this);
  54505. var targetQuat;
  54506. return function shake(needsShake) {
  54507. targetQuat = targetQuat && targetQuat.equals(_self.shakingRange.to) ? _self.shakingRange.from : _self.shakingRange.to;
  54508. if (needsShake) {
  54509. transitions$1.start(lerp.quaternion(_self.quaternion, targetQuat), _self.shakingDuration, null, 0, null, null, id0);
  54510. transitions$1.start(lerp.quaternion(_self.cylinder.quaternion, targetQuat), _self.shakingDuration, function () {
  54511. return shake(true);
  54512. }, 0, null, null, id1);
  54513. } else {
  54514. transitions$1.cancelById(id0);
  54515. transitions$1.cancelById(id1);
  54516. }
  54517. };
  54518. }();
  54519. _this.options = options;
  54520. _this.control = control;
  54521. _this.player = _this.control.player;
  54522. _this.videoPlayer = videoPlayer;
  54523. _this.sid = options.sid;
  54524. _this.name = options.name || '';
  54525. _this.videoType = options.videoType;
  54526. _this.type = 'SecurityCamera';
  54527. _this.panoId = options.panoId;
  54528. _this.videoSrc = options.video;
  54529. _this.videoActive = false;
  54530. _this.overWeight = options.overWeight;
  54531. _this.shakingDuration = options.duration || 2000;
  54532. _this.shakingRange = {
  54533. from: new THREE.Quaternion(),
  54534. to: new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI / 2)
  54535. };
  54536. options.from && _this.shakingRange.from.setFromEuler(options.from);
  54537. options.to && _this.shakingRange.to.setFromEuler(options.to);
  54538. _this.posOri = options.posOri || new THREE.Vector3();
  54539. _this.posOffset = options.posOffset || new THREE.Vector3(); // options.position && this.position.copy(options.position)
  54540. _this.position.copy(_this.posOri).add(_this.posOffset); // target的优先级大于rotation
  54541. if (options.target) {
  54542. _this.target = options.target;
  54543. _this.lookAt(options.target);
  54544. } else {
  54545. options.rotation && _this.quaternion.setFromEuler(options.rotation);
  54546. _this.target = new THREE.Vector3(0, 0, -1).applyQuaternion(_this.quaternion).add(_this.position);
  54547. }
  54548. _this.cylinderNear = options.near || 0.03;
  54549. _this.cylinderFar = options.far || 3;
  54550. _this.roll = 0;
  54551. _this.init(); // this.layers.toggle(RenderLayers.DEFAULT)
  54552. _this.layers.enable(RenderLayers.PANOMARKERS);
  54553. _this.layers.enable(RenderLayers.RETICULE);
  54554. _this.player.model.add(_assertThisInitialized(_this));
  54555. /* this.events = {
  54556. onDomElementTouchStart: () => {
  54557. if (this.shouldPlay) {
  54558. console.log('onDomElementTouchStart')
  54559. this.video.play()
  54560. this.player.domElement.removeEventListener('touchstart', this.events.onDomElementTouchStart)
  54561. }
  54562. },
  54563. } */
  54564. return _this;
  54565. } // 横滚角
  54566. _createClass(SecurityCamera, [{
  54567. key: "setRoll",
  54568. value: function setRoll(angle) {
  54569. this.roll = angle % 360;
  54570. this.obj3d.quaternion.setFromAxisAngle(vec1.set(0, 0, -1), THREE.MathUtils.degToRad(angle));
  54571. }
  54572. }, {
  54573. key: "yaw",
  54574. get: function get() {
  54575. // 左右转角
  54576. var lookAt = vec1.copy(this.cylinder.bottom.position).applyQuaternion(this.quaternion);
  54577. var lookAtXZ = lookAt.setY(0);
  54578. var frontDir = vec2.set(0, 0, 1);
  54579. var frontCross = vec3.set(1, 0, 0);
  54580. var angle = (THREE.MathUtils.radToDeg(lookAtXZ.angleTo(frontDir) * Math.sign(lookAtXZ.dot(frontCross))) + 180) % 360;
  54581. if (angle > 180) angle = angle - 360;
  54582. return angle;
  54583. },
  54584. set: function set(yaw) {
  54585. var pitch = this.pitch; // 要先计算pitch,防止窜数据
  54586. var upDir = vec1.set(0, 1, 0);
  54587. var rightDir = vec2.set(1, 0, 0);
  54588. var yawQuat = quat1.setFromAxisAngle(upDir, THREE.MathUtils.degToRad(yaw));
  54589. var pitchQuat = quat2.setFromAxisAngle(rightDir, THREE.MathUtils.degToRad(pitch));
  54590. this.quaternion.multiplyQuaternions(yawQuat, pitchQuat);
  54591. this.updateTarget();
  54592. }
  54593. }, {
  54594. key: "pitch",
  54595. get: function get() {
  54596. // 上下转角
  54597. var lookAt = vec1.copy(this.cylinder.bottom.position).applyQuaternion(this.quaternion);
  54598. var projectVec = vec2.copy(lookAt).projectOnPlane(vec3.set(0, 1, 0));
  54599. var pitch = THREE.MathUtils.radToDeg(lookAt.angleTo(projectVec) * Math.sign(lookAt.y)) % 180;
  54600. if (pitch > 90) pitch = 90 - pitch;
  54601. return pitch;
  54602. },
  54603. set: function set(pitch) {
  54604. pitch = Math.min(Math.max(pitch, -89.9), 89.9); // 防止万向锁
  54605. var yaw = this.yaw < 0 ? this.yaw + 360 : this.yaw;
  54606. var upDir = vec1.set(0, 1, 0);
  54607. var rightDir = vec2.set(1, 0, 0); //.applyQuaternion(this.quaternion)
  54608. var yawQuat = quat1.setFromAxisAngle(upDir, THREE.MathUtils.degToRad(yaw));
  54609. var pitchQuat = quat2.setFromAxisAngle(rightDir, THREE.MathUtils.degToRad(pitch));
  54610. this.quaternion.multiplyQuaternions(yawQuat, pitchQuat);
  54611. this.updateTarget();
  54612. } // 监控镜头摇晃(暂未使用)
  54613. }, {
  54614. key: "init",
  54615. value: function init() {
  54616. var _this2 = this;
  54617. // 投射体材质
  54618. this.normalMat = new THREE.MeshBasicMaterial({
  54619. color: Colors.mainColor,
  54620. //0x00c8af,
  54621. transparent: true,
  54622. opacity: 0.1,
  54623. side: THREE.DoubleSide,
  54624. depthTest: false
  54625. });
  54626. this.build();
  54627. this.options.pitch && (this.pitch = this.options.pitch);
  54628. this.options.yaw && (this.yaw = this.options.yaw);
  54629. this.options.roll && this.setRoll(this.options.roll);
  54630. this.updateInfo(true);
  54631. var video = this.createVideo();
  54632. var canPlayed = function canPlayed(e) {
  54633. _this2.player.$app.Camera.emit('SecurityCamera.videoActive', _this2.sid);
  54634. _this2.videoActive = true; //console.error(' videoActive ',this.sid)
  54635. // this.aspect = video.videoWidth / video.videoHeight
  54636. //this.rebuildCylinder()
  54637. _this2.updateInfo(true);
  54638. };
  54639. if (this.overWeight) {
  54640. canPlayed(); //等点击时再报不能看
  54641. } else if (this.videoSrc) {
  54642. //console.error('createVideo', this.videoSrc, this.sid)
  54643. video.onloadedmetadata = function () {
  54644. video.canPlayed = true;
  54645. video.masters.forEach(function (v) {
  54646. //一个video可以对应多个camera,因为它们链接一样
  54647. v.dispatchEvent({
  54648. type: 'loadedmetadata'
  54649. });
  54650. });
  54651. };
  54652. if (video.canPlayed) {
  54653. canPlayed();
  54654. } else {
  54655. this.addEventListener('loadedmetadata', canPlayed);
  54656. }
  54657. if (Hls.isSupported() && this.videoType !== 2) {
  54658. //似乎Hls不支持就无法播放
  54659. var hls = new Hls();
  54660. hls.loadSource(this.videoSrc);
  54661. hls.attachMedia(video);
  54662. hls.on(Hls.Events.ERROR, function (event, data) {
  54663. return console.log('HLS加载失败', event, data);
  54664. });
  54665. this.hlsVideoPlayer = hls;
  54666. } // else {
  54667. // console.log(video.src)
  54668. // video.onerror = () => {
  54669. // debugger
  54670. // console.log('###replace')
  54671. // video.src = this.videoSrc
  54672. // video.src = video.src.replace('.flv', '.mp4')
  54673. // }
  54674. // //console.error('Hls is not Supported')
  54675. // }
  54676. this.play(); // ios需要
  54677. this.pause();
  54678. } // 监控视频材质
  54679. this.videoMat = new THREE.MeshBasicMaterial({
  54680. map: new THREE.VideoTexture(video),
  54681. side: THREE.DoubleSide,
  54682. depthTest: false,
  54683. transparent: true // opacity: 0.5,
  54684. });
  54685. this.events = {
  54686. setSize: function setSize(width, height) {
  54687. if (_this2.isWatching) {
  54688. _this2.updateAspect();
  54689. }
  54690. }
  54691. };
  54692. this.player.on('setSize', this.events.setSize);
  54693. }
  54694. }, {
  54695. key: "updateAspect",
  54696. value: function updateAspect() {
  54697. //更新aspect且修改geometry
  54698. var aspect = this.player.cameraControls.cameras.dollhouse.aspect;
  54699. if (aspect != this.aspect) {
  54700. this.aspect = aspect;
  54701. this.updateMesh();
  54702. }
  54703. }
  54704. }, {
  54705. key: "updateMesh",
  54706. value: function updateMesh() {
  54707. var nearHeight, nearWidth, farHeight, farWidth;
  54708. nearHeight = Math.tan(THREE.MathUtils.degToRad(this.fov / 2)) * this.cylinderNear;
  54709. nearWidth = nearHeight * this.aspect;
  54710. farHeight = Math.tan(THREE.MathUtils.degToRad(this.fov / 2)) * this.cylinderFar;
  54711. farWidth = farHeight * this.aspect;
  54712. /* if (this.control.player.$app.config.mobile) {
  54713. ;[nearHeight, nearWidth] = [nearWidth, nearHeight]
  54714. ;[farHeight, farWidth] = [farWidth, farHeight]
  54715. } */
  54716. // 投射体(底面以外)
  54717. var vertices = [],
  54718. bottomVertices = [];
  54719. vertices.push(-nearWidth, nearHeight, -this.cylinderNear);
  54720. vertices.push(nearWidth, nearHeight, -this.cylinderNear);
  54721. vertices.push(nearWidth, -nearHeight, -this.cylinderNear);
  54722. vertices.push(-nearWidth, -nearHeight, -this.cylinderNear);
  54723. bottomVertices.push(-farWidth, farHeight, -this.cylinderFar);
  54724. bottomVertices.push(farWidth, farHeight, -this.cylinderFar);
  54725. bottomVertices.push(farWidth, -farHeight, -this.cylinderFar);
  54726. bottomVertices.push(-farWidth, -farHeight, -this.cylinderFar);
  54727. vertices = vertices.concat(bottomVertices);
  54728. var firstBuild = !this.cylinder;
  54729. if (firstBuild) {
  54730. var uvs = [];
  54731. uvs.push(0, 1, 1, 1, 1, 0, 0, 0);
  54732. uvs.push(0, 1, 1, 1, 1, 0, 0, 0);
  54733. var indexs = [];
  54734. indexs.push(0, 1, 3, 2, 3, 1);
  54735. indexs.push(0, 1, 4, 5, 4, 1);
  54736. indexs.push(1, 2, 5, 6, 5, 2);
  54737. indexs.push(2, 3, 6, 7, 6, 3);
  54738. indexs.push(3, 0, 7, 4, 7, 0); // indexs.push(4, 7, 5, 6, 5, 7)
  54739. var cylinderGeo = new THREE.BufferGeometry();
  54740. cylinderGeo.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(uvs), 2));
  54741. cylinderGeo.setIndex(new THREE.BufferAttribute(new Uint16Array(indexs), 1));
  54742. this.cylinder = new THREE.Mesh(cylinderGeo, this.normalMat); //if (this.control.player.$app.config.mobile) this.cylinder.rotateZ(-Math.PI / 2) //用户自己旋转屏幕吧
  54743. this.obj3d.add(this.cylinder);
  54744. }
  54745. this.cylinder.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3)); // 投射体底面 (视频)
  54746. var bottomGeo = new THREE.PlaneGeometry(farWidth * 2, farHeight * 2);
  54747. if (firstBuild) {
  54748. this.cylinder.bottom = new THREE.Mesh(bottomGeo, this.normalMat);
  54749. this.cylinder.add(this.cylinder.bottom);
  54750. } else {
  54751. this.cylinder.bottom.geometry.dispose();
  54752. this.cylinder.bottom.geometry = bottomGeo;
  54753. }
  54754. this.cylinder.bottom.position.set(0, 0, this.cylinderNear - this.cylinderFar); // 投射体线框
  54755. if (firstBuild) {
  54756. this.cylinder.line = new THREE.LineSegments(new THREE.EdgesGeometry(this.cylinder.geometry), new THREE.LineBasicMaterial({
  54757. color: 0xffffff,
  54758. opacity: 0.6,
  54759. transparent: true
  54760. }));
  54761. this.cylinder.add(this.cylinder.line);
  54762. } else {
  54763. this.cylinder.line.geometry.dispose();
  54764. this.cylinder.line.geometry = new THREE.EdgesGeometry(this.cylinder.geometry);
  54765. }
  54766. }
  54767. }, {
  54768. key: "createVideo",
  54769. value: function createVideo(src) {
  54770. src && (this.videoSrc = src);
  54771. var video = this.videoPlayer.getVideo(this.videoSrc, this);
  54772. this.video = video;
  54773. return video;
  54774. } // 创建投射体,加载摄像头模型
  54775. }, {
  54776. key: "build",
  54777. value: function build() {
  54778. this.obj3d = new THREE.Group();
  54779. this.obj3d.camera = this;
  54780. this.add(this.obj3d); // 摄像头
  54781. if (!cameraModel) {
  54782. var self = this;
  54783. loaders.gltf(texture.getImageURL('images/camera.glb'), function (gltf) {
  54784. self.tag = gltf.scene.children[0].children[0];
  54785. self.tag.geometry.translate(30, 50, -10);
  54786. self.tag.quaternion.setFromEuler(new THREE.Euler(Math.PI / 2, Math.PI, 0));
  54787. self.obj3d.add(self.tag);
  54788. cameraModel = self.tag.clone();
  54789. });
  54790. } else {
  54791. this.tag = cameraModel.clone();
  54792. this.obj3d.add(this.tag);
  54793. }
  54794. this.updateMesh();
  54795. this.titleLabel = new TextSprite({
  54796. text: this.name,
  54797. backgroundColor: {
  54798. r: 255,
  54799. g: 255,
  54800. b: 255,
  54801. a: 0
  54802. },
  54803. textColor: {
  54804. r: 255,
  54805. g: 255,
  54806. b: 255,
  54807. a: 1
  54808. },
  54809. textshadowColor: '#888',
  54810. borderRadius: 2,
  54811. fontsize: 34,
  54812. renderOrder: 5,
  54813. margin: {
  54814. x: 12,
  54815. y: 10
  54816. },
  54817. //fixOrient:true,
  54818. player: this.player,
  54819. sizeInfo: {
  54820. scale: 0.4,
  54821. nearBound: 3
  54822. }
  54823. });
  54824. this.titleLabel.sprite.material.depthTest = this.titleLabel.sprite.material.depthWrite = true;
  54825. this.titleLabel.position.set(0, -0.2, 0.1);
  54826. this.add(this.titleLabel);
  54827. this.dispatchEvent({
  54828. type: 'build'
  54829. });
  54830. } // 显示监控视频或显示投射体
  54831. }, {
  54832. key: "showVideo",
  54833. value: function showVideo(isShow) {
  54834. //console.warn('showVideo', this.info.sid, isShow )
  54835. if (this.player.cameraControls.activeControl) {
  54836. this.player.cameraControls.activeControl.enabled = isShow ? this.control.isEdit : true;
  54837. }
  54838. if (!this.videoActive) return;
  54839. if (isShow) {
  54840. /* if (browser.detectIOS()) {
  54841. this.player.domElement.addEventListener('touchstart', this.events.onDomElementTouchStart, true)
  54842. } */
  54843. this.play();
  54844. this.normalMat.opacity = 0;
  54845. common$1.updateVisible(this.cylinder, 'watch', true, 1, 'add');
  54846. this.cylinder.bottom.material = this.videoMat; // this.player.$app.core.get('SceneRenderer').camera = this
  54847. this.cylinder.bottom.renderOrder = RenderOrder.monitorPlane;
  54848. } else {
  54849. this.pause();
  54850. this.normalMat.opacity = 0.08;
  54851. common$1.updateVisible(this.cylinder, 'watch', false, 1, 'cancel');
  54852. this.cylinder.bottom.material = this.normalMat; // this.player.$app.core.get('SceneRenderer').camera = this.player.camera
  54853. this.cylinder.bottom.renderOrder = RenderOrder.visibleFloor;
  54854. }
  54855. }
  54856. }, {
  54857. key: "play",
  54858. value: function play() {
  54859. var _this3 = this;
  54860. //console.log('play monitor', this.sid, this.videoSrc)
  54861. this.shouldPlay = true;
  54862. if (browser$1.detectWeixin()) {
  54863. //用微信平台的 WeixinJSBridge 越过 Autoplay Policy
  54864. try {
  54865. top.WeixinJSBridge && top.WeixinJSBridge.invoke('getNetworkType', {}, function (e) {
  54866. _this3.video.play();
  54867. }, false);
  54868. } catch (error) {
  54869. this.video.play();
  54870. }
  54871. } else {
  54872. this.video.play();
  54873. if (this.video.paused) {
  54874. console.log('播放不了');
  54875. /* this.player.once('pointerStart', () => {
  54876. this.play()
  54877. }) */
  54878. }
  54879. }
  54880. }
  54881. }, {
  54882. key: "pause",
  54883. value: function pause() {
  54884. this.shouldPlay = false;
  54885. this.video.pause();
  54886. } // 观看监控
  54887. }, {
  54888. key: "watch",
  54889. value: function watch(watchPosition) {
  54890. var _this4 = this;
  54891. this.player.compass.setDisplay(false, true); //产品修改需求监控隐藏指南针 2024/3/18
  54892. if (!this.player.$app.config.view) this.player.compass.switch('axis');
  54893. this.updateAspect(); //console.warn("watch", this.sid)
  54894. this.isWatching = true;
  54895. var dollhouseControl = this.player.cameraControls.controls.dollhouse;
  54896. dollhouseControl.minDistance = 0;
  54897. dollhouseControl.minPolarAngle = -Math.PI;
  54898. dollhouseControl.maxPolarAngle = Math.PI;
  54899. dollhouseControl.mode = 'security';
  54900. dollhouseControl.forbitSetRanges = true; //防止resize时minDistance改变
  54901. this.target.set(0, 0, -1).applyQuaternion(this.quaternion).add(this.position);
  54902. if (!this.videoActive && !this.isNew) {
  54903. //console.error('cannotWatchVideo', this.sid, this.videoSrc)
  54904. this.player.$app.Camera.emit('SecurityCamera.cannotWatchVideo', this.sid);
  54905. } // 切换当前楼层
  54906. var changeFloor = function changeFloor() {
  54907. if (!_this4.player.model.panos.get(_this4.panoId)) return; //当无法获取到pano.floorIndex时无需切换楼层(#43674 监控所绑定的点位被删除)
  54908. var floorIndex = _this4.player.model.panos.get(_this4.panoId).floorIndex;
  54909. var currentFloorId = _this4.player.model.currentFloorId;
  54910. if (currentFloorId != floorIndex
  54911. /*&& currentFloorId != 'all'*/
  54912. ) {
  54913. _this4.player.$app.Scene.emit('Scene.gotoFloor', floorIndex); // 直接emit事件给UI就行,不用额外再调Scene.gotoFloor()
  54914. }
  54915. };
  54916. transitions$1.cancelById('leaveMonitor');
  54917. if (this.player.mode == Viewmode$1.DOLLHOUSE) {
  54918. changeFloor();
  54919. var activeControl = this.player.cameraControls.activeControl;
  54920. transitions$1.start(lerp.property(dollhouseControl.camera, 'fov', this.fov, function (v) {
  54921. dollhouseControl.camera.staticFov = v;
  54922. }), 1000);
  54923. transitions$1.start(lerp.vector(activeControl.target, this.target), 1000, null, 0, easing[settings$3.flydown.rotationEasing], null, settings$3.freeze.LookRotationForPlay);
  54924. transitions$1.start(lerp.vector(activeControl.camera.position, watchPosition || this.position), 1000, function () {
  54925. if (_this4.player.mode != Viewmode$1.DOLLHOUSE) return;
  54926. _this4.showVideo(true);
  54927. _this4.tag.material.color.copy(hoverColor);
  54928. dollhouseControl.camera.near = 0.09; // 调太小的话摄像机会露出来
  54929. }, 0, easing[settings$3.flydown.movementEasing], null, settings$3.freeze.LookRotationForPlay);
  54930. } else {
  54931. dollhouseControl.camera.staticFov = dollhouseControl.camera.fov = this.fov;
  54932. dollhouseControl.camera.updateProjectionMatrix(); // console.error("watch")
  54933. this.player.flyToNewMode({
  54934. mode: Viewmode$1.DOLLHOUSE,
  54935. position: watchPosition || this.position,
  54936. target: this.target,
  54937. callback: function callback() {
  54938. changeFloor();
  54939. _this4.showVideo(true);
  54940. _this4.tag.material.color.copy(hoverColor);
  54941. dollhouseControl.camera.near = 0.09;
  54942. }
  54943. });
  54944. }
  54945. this.player.emit('beginShowMonitor');
  54946. } // 停止观看监控
  54947. }, {
  54948. key: "leave",
  54949. value: function leave() {
  54950. var _this5 = this;
  54951. this.player.compass.setDisplay(true, false); //产品修改需求监控隐藏指南针 2024/3/18
  54952. if (!this.player.$app.config.view) this.player.compass.switch('direction'); //console.warn("leave", this.sid)
  54953. this.showVideo(false);
  54954. this.isWatching = false; // if (this.control.isEdit) {
  54955. // this.player.reticule.visible = true
  54956. // }
  54957. this.tag.material.color.copy(normalColor);
  54958. var dollhouseControl = this.player.cameraControls.controls.dollhouse;
  54959. dollhouseControl.camera.near = 1;
  54960. dollhouseControl.minPolarAngle = 25 / 180 * Math.PI;
  54961. dollhouseControl.maxPolarAngle = Math.PI / 2;
  54962. dollhouseControl.mode = 'model'; // transitions.start(lerp.property(dollhouseControl.camera, 'fov', 70), 200, () => dollhouseControl.camera.updateProjectionMatrix())
  54963. transitions$1.cancelById('leaveMonitor');
  54964. transitions$1.cancelById(settings$3.freeze.LookRotationForPlay); //xzw add
  54965. var endFov = this.player.baseFov * (1 / this.player.zoomLevel);
  54966. transitions$1.start(lerp.property(dollhouseControl.camera, 'fov', endFov, function (v) {
  54967. dollhouseControl.camera.staticFov = v;
  54968. }), 1000, function () {
  54969. dollhouseControl.camera.staticFov = null;
  54970. dollhouseControl.camera.fov = endFov;
  54971. dollhouseControl.camera.updateProjectionMatrix();
  54972. dollhouseControl.forbitSetRanges = false;
  54973. dollhouseControl.updateDistance(dollhouseControl.camera.aspect);
  54974. _this5.player.emit('leavedShowMonitor');
  54975. }, null, null, null, 'leaveMonitor');
  54976. } // 设置position
  54977. }, {
  54978. key: "updatePosition",
  54979. value: function updatePosition(position) {
  54980. this.position.set(position.x, position.y, position.z);
  54981. this.updateTarget();
  54982. } // 设置rotation
  54983. }, {
  54984. key: "updateRotation",
  54985. value: function updateRotation(rotation) {
  54986. this.rotation.set(rotation.x, rotation.y, rotation.z);
  54987. this.updateTarget();
  54988. } // 设置target
  54989. }, {
  54990. key: "updateTarget",
  54991. value: function updateTarget(target) {
  54992. if (target) {
  54993. this.target.set(target.x, target.y, target.z); //.sub(this.position).multiplyScalar(-1).add(this.position)
  54994. this.lookAt(this.target);
  54995. } else {
  54996. this.target.set(0, 0, -1).applyQuaternion(this.quaternion).add(this.position);
  54997. }
  54998. } // 根据fov、cylinderFar等数据更新线框
  54999. /* rebuildCylinder() {
  55000. this.target.set(0, 0, -1).applyQuaternion(this.quaternion).add(this.position)
  55001. let nearHeight, nearWidth, farHeight, farWidth
  55002. if (this.aspect <= window.innerWidth / window.innerHeight) {
  55003. nearHeight = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderNear
  55004. nearWidth = nearHeight * this.aspect
  55005. farHeight = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderFar
  55006. farWidth = farHeight * this.aspect
  55007. if (this.control.player.$app.config.mobile) {
  55008. ;[nearHeight, nearWidth] = [nearWidth, nearHeight]
  55009. ;[farHeight, farWidth] = [farWidth, farHeight]
  55010. }
  55011. } else {
  55012. nearWidth = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderNear * (window.innerWidth / window.innerHeight)
  55013. nearHeight = nearWidth / this.aspect
  55014. farWidth = Math.tan(((this.fov / 2) * Math.PI) / 180) * this.cylinderFar * (window.innerWidth / window.innerHeight)
  55015. farHeight = farWidth / this.aspect
  55016. }
  55017. // 投射体
  55018. let vertices = [],
  55019. bottomVertices = []
  55020. vertices.push(-nearWidth, nearHeight, -this.cylinderNear)
  55021. vertices.push(nearWidth, nearHeight, -this.cylinderNear)
  55022. vertices.push(nearWidth, -nearHeight, -this.cylinderNear)
  55023. vertices.push(-nearWidth, -nearHeight, -this.cylinderNear)
  55024. bottomVertices.push(-farWidth, farHeight, -this.cylinderFar)
  55025. bottomVertices.push(farWidth, farHeight, -this.cylinderFar)
  55026. bottomVertices.push(farWidth, -farHeight, -this.cylinderFar)
  55027. bottomVertices.push(-farWidth, -farHeight, -this.cylinderFar)
  55028. vertices = vertices.concat(bottomVertices)
  55029. this.cylinder.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3))
  55030. // this.cylinder.bottom.geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(bottomVertices), 3))
  55031. this.cylinder.bottom.geometry.dispose()
  55032. this.cylinder.bottom.geometry = new THREE.PlaneGeometry(farWidth * 2, farHeight * 2)
  55033. // 投射体线框
  55034. this.cylinder.line.geometry.dispose()
  55035. this.cylinder.line.geometry = new THREE.EdgesGeometry(this.cylinder.geometry)
  55036. } */
  55037. /**
  55038. * @param {*} isSave 是否保存当前数据
  55039. * @returns 返回监控当前数据
  55040. */
  55041. }, {
  55042. key: "updateInfo",
  55043. value: function updateInfo(isSave) {
  55044. var info = {
  55045. sid: this.sid,
  55046. name: this.name,
  55047. panoId: this.panoId,
  55048. posOri: {
  55049. x: this.posOri.x,
  55050. y: this.posOri.y,
  55051. z: this.posOri.z
  55052. },
  55053. posOffset: {
  55054. x: this.posOffset.x,
  55055. y: this.posOffset.y,
  55056. z: this.posOffset.z
  55057. },
  55058. fov: this.fov,
  55059. aspect: this.aspect,
  55060. far: this.cylinderFar,
  55061. roll: Math.round(this.roll),
  55062. pitch: Math.round(this.pitch),
  55063. yaw: Math.round(this.yaw),
  55064. /* playUrl */
  55065. video: this.videoSrc,
  55066. videoType: this.videoType
  55067. };
  55068. if (isSave) this.info = info;
  55069. return info;
  55070. }
  55071. /* show(reason, level=0) {
  55072. console.warn('show',this.info.sid, reason, level)
  55073. if(!reason) common.updateVisible(this, 'common', true)
  55074. else common.updateVisible(this, reason, true, level, 'add')
  55075. }
  55076. hide(reason, level=0) {
  55077. if(!reason) common.updateVisible(this, 'common', true)
  55078. else common.updateVisible(this, reason, false, level, 'cancel')
  55079. } */
  55080. }, {
  55081. key: "dispose",
  55082. value: function dispose() {
  55083. var parent = this.parent;
  55084. parent.remove(this);
  55085. transitions$1.cancelById('cameraHighlight' + this.sid);
  55086. this.tag.geometry.dispose();
  55087. this.tag.material.dispose();
  55088. this.cylinder.line.geometry.dispose();
  55089. this.cylinder.line.material.dispose();
  55090. this.cylinder.geometry.dispose();
  55091. this.normalMat.dispose();
  55092. this.videoMat.dispose();
  55093. this.player.off('setSize', this.events.setSize);
  55094. this.titleLabel.dispose();
  55095. this.hlsVideoPlayer && this.hlsVideoPlayer.destroy();
  55096. }
  55097. }, {
  55098. key: "highlight",
  55099. value: function highlight(state) {
  55100. if (this.hightlighted == state) return;
  55101. this.hightlighted = state;
  55102. transitions$1.cancelById('cameraHighlight' + this.sid);
  55103. transitions$1.start(lerp.color(this.tag.material.color, state ? hoverColor : normalColor), 100, null, null, null, null, 'cameraHighlight' + this.sid);
  55104. }
  55105. }]);
  55106. return SecurityCamera;
  55107. }(THREE.PerspectiveCamera);
  55108. /*
  55109. xzw 2023.6.9
  55110. 新增需求:视频永远铺满屏幕,而非和场景背景对应。
  55111. 这样一来fov那些改变没有意义其实,只是mesh有直观变化,相机不变fov也行,只要能铺满。
  55112. 视频mesh不需要旋转,在手机端时用户可以自行旋转手机来观看。电脑的话就只能自己把屏幕变窄了。
  55113. */
  55114. var SecurityControls = /*#__PURE__*/function () {
  55115. function SecurityControls(player) {
  55116. var _this = this;
  55117. _classCallCheck(this, SecurityControls);
  55118. this.onModeChange = function (fromMode, toMode) {
  55119. // 在floorplan隐藏(编辑时跳到floorplan不用隐藏)
  55120. if (fromMode == void 0 && toMode == void 0) {
  55121. var modes = _this.player.modeTran.split('-');
  55122. fromMode = modes[0], toMode = modes[1];
  55123. }
  55124. if (fromMode === Viewmode$1.FLOORPLAN) {
  55125. _this.isFloorplan = false;
  55126. _this.isEdit || _this.cameras.forEach(function (cam) {
  55127. return common$1.updateVisible(cam, 'mode', true);
  55128. }
  55129. /* cam.show() */
  55130. );
  55131. }
  55132. if (toMode === Viewmode$1.FLOORPLAN) {
  55133. _this.isFloorplan = true;
  55134. _this.isEdit || _this.cameras.forEach(function (cam) {
  55135. return common$1.updateVisible(cam, 'mode', false);
  55136. }
  55137. /* cam.hide() */
  55138. );
  55139. }
  55140. };
  55141. this.app = player.$app;
  55142. this.player = player;
  55143. this.isEdit = false; // 是否进入编辑页面
  55144. this.unbindDollhouse = false; // dollhouseCamera是否跟随当前监控一起动
  55145. this.cameras = [];
  55146. this.hoverCamera = null;
  55147. this.watchingCamera = null; // 正在观看的相机
  55148. this.editingCamera = null; // 正在编辑的相机
  55149. this.selectType = null; // 相机还是投影面
  55150. this.transformType = 0;
  55151. this.hideCylinder = true; // 用于标明是否隐藏线框
  55152. //this.isFloorplan = player.mode === Viewmode.FLOORPLAN // 用于在FLOORPLAN模式下隐藏obj3d
  55153. // 退出监控的移动范围
  55154. this.maxVisiAngle = Math.PI / 6;
  55155. this.maxVisiZoom = 2;
  55156. this.maxVisiDistance = 1;
  55157. this.bindEvents();
  55158. }
  55159. _createClass(SecurityControls, [{
  55160. key: "currentCamera",
  55161. get: function get() {
  55162. if (this.isEdit) {
  55163. return this.editingCamera;
  55164. } else {
  55165. return this.watchingCamera;
  55166. }
  55167. }
  55168. }, {
  55169. key: "editingCamera",
  55170. get: function get() {
  55171. return this._editingCamera;
  55172. },
  55173. set: function set(c) {
  55174. if (c != this._editingCamera) {
  55175. this._editingCamera && common$1.updateVisible(this._editingCamera, 'edit', false, 2, 'cancel');
  55176. if (c) common$1.updateVisible(c, 'edit', true, 2, 'add');
  55177. this._editingCamera = c;
  55178. }
  55179. }
  55180. }, {
  55181. key: "addCamera",
  55182. value: function addCamera(camera) {
  55183. this.cameras.push(camera);
  55184. }
  55185. }, {
  55186. key: "removeCamera",
  55187. value: function removeCamera(camera) {
  55188. // this.disableTransformControl()
  55189. camera.isWatching && this.stopWatch();
  55190. this.cameras = this.cameras.filter(function (c) {
  55191. return c != camera;
  55192. });
  55193. camera.dispose();
  55194. }
  55195. /**
  55196. * 观看监控
  55197. * @param { Vector3 } watchPosition dollhose相机跳转位置,有则unbindDollhouse为true,无则默认监控位置
  55198. */
  55199. }, {
  55200. key: "watch",
  55201. value: function () {
  55202. var _watch = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(camera, watchPosition) {
  55203. return regenerator.wrap(function _callee$(_context) {
  55204. while (1) {
  55205. switch (_context.prev = _context.next) {
  55206. case 0:
  55207. if (!camera.overWeight) {
  55208. _context.next = 2;
  55209. break;
  55210. }
  55211. return _context.abrupt("return", this.player.$app.Camera.emit('fileOverSize', {
  55212. sid: camera.sid
  55213. }));
  55214. case 2:
  55215. if (!(this.player.mode == 'transitioning')) {
  55216. _context.next = 4;
  55217. break;
  55218. }
  55219. return _context.abrupt("return");
  55220. case 4:
  55221. if (!(this.app.Camera.monitor.locked && this.app.Camera.monitor.locked.then)) {
  55222. _context.next = 7;
  55223. break;
  55224. }
  55225. _context.next = 7;
  55226. return this.app.Camera.monitor.locked;
  55227. case 7:
  55228. if (this.watchingCamera) {
  55229. this.watchingCamera != camera && this.stopWatch();
  55230. } else {
  55231. // 只记录还没在watch时的状态
  55232. this.lastViewState = {
  55233. mode: this.player.mode,
  55234. floorIndex: this.player.model.allFloorsVisible ? 'all' : this.player.model.currentFloorId,
  55235. quaternion: this.player.quaternion.clone(),
  55236. position: this.player.position.clone(),
  55237. target: this.player.cameraControls.activeControl.target.clone(),
  55238. currentScale: this.player.cameraControls.activeControl.currentScale
  55239. };
  55240. }
  55241. camera.watch(watchPosition);
  55242. this.watchingCamera = camera;
  55243. this.player.$app.Camera.emit('SecurityCamera.watch', {
  55244. sid: camera.sid,
  55245. supportPlay: Hls.isSupported() || camera.videoActive
  55246. }); //
  55247. this.app.TagManager.switchAllDisplay(false, 'watchMonitor', {
  55248. cameras: true
  55249. }); // // 进入监控后,使currentPano变为监控所在pano
  55250. // let pano = this.player.model.panos.get(camera.panoId)
  55251. // if (pano.neighbourUUIDs.filter(id => id != pano.id).length > 0) {
  55252. // this.player.currentPano = pano
  55253. // } else {
  55254. // let notAlonePano = this.player.model.panos.closestPanoTowardPoint({
  55255. // point: camera.position,
  55256. // require: [pano => pano.neighbourUUIDs.filter(id => id != pano.id).length > 0],
  55257. // })
  55258. // notAlonePano && (this.player.currentPano = notAlonePano)
  55259. // }
  55260. if (this.isEdit) {
  55261. this.unbindDollhouse = !!watchPosition;
  55262. this.editingCamera = camera;
  55263. this.selectType = 'camera';
  55264. this.player.$app.Camera.emit('SecurityCamera.select', this.currentCamera.updateInfo());
  55265. }
  55266. case 13:
  55267. case "end":
  55268. return _context.stop();
  55269. }
  55270. }
  55271. }, _callee, this);
  55272. }));
  55273. function watch(_x, _x2) {
  55274. return _watch.apply(this, arguments);
  55275. }
  55276. return watch;
  55277. }()
  55278. }, {
  55279. key: "stopWatch",
  55280. value: function stopWatch() {
  55281. if (this.watchingCamera) {
  55282. //console.error('stopWatch', this.watchingCamera.sid)
  55283. this.watchingCamera.isWatching && this.watchingCamera.leave();
  55284. this.player.$app.Camera.emit('SecurityCamera.stopWatch', this.watchingCamera.sid);
  55285. this.watchingCamera = null;
  55286. if (this.isEdit) {
  55287. this.editingCamera = null;
  55288. this.selectType = null;
  55289. this.player.$app.Camera.emit('SecurityCamera.unselect');
  55290. }
  55291. this.app.TagManager.switchAllDisplay(true, 'watchMonitor', {
  55292. cameras: true
  55293. });
  55294. }
  55295. }
  55296. }, {
  55297. key: "hideAll",
  55298. value: function hideAll(floorIndex) {
  55299. var _this2 = this;
  55300. var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'common';
  55301. var level = arguments.length > 2 ? arguments[2] : undefined;
  55302. var type = arguments.length > 3 ? arguments[3] : undefined;
  55303. this.cameras.forEach(function (cam) {
  55304. if (floorIndex == void 0 || _this2.player.model.panos.get(cam.panoId) && _this2.player.model.panos.get(cam.panoId).floorIndex === floorIndex) {
  55305. // 当floorIndex有值时,该方法无法影响"获取不到floorIndex的监控" (#43674 监控所绑定的点位被删除)
  55306. // /* cam != this.editingCamera && */ cam.hide(reason) // 编辑中的监控不会被隐藏
  55307. common$1.updateVisible(cam, reason, false, level, type);
  55308. }
  55309. });
  55310. }
  55311. }, {
  55312. key: "showAll",
  55313. value: function showAll(floorIndex) {
  55314. var _this3 = this;
  55315. var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'common';
  55316. var level = arguments.length > 2 ? arguments[2] : undefined;
  55317. var type = arguments.length > 3 ? arguments[3] : undefined;
  55318. //if (this.isFloorplan) return
  55319. this.cameras.forEach(function (cam) {
  55320. if (floorIndex == void 0 || _this3.player.model.panos.get(cam.panoId) && _this3.player.model.panos.get(cam.panoId).floorIndex === floorIndex) {
  55321. // 当floorIndex有值时,该方法无法影响"获取不到floorIndex的监控" (#43674 监控所绑定的点位被删除)
  55322. //cam.show(reason)
  55323. common$1.updateVisible(cam, reason, true, level, type);
  55324. }
  55325. });
  55326. } // enableTransformControl() {
  55327. // this.player.model.transformControls.switchEditState('overlay')
  55328. // }
  55329. // disableTransformControl() {
  55330. // this.player.model.transformControls.detach()
  55331. // this.editingCamera && this.editingCamera.showVideo(false)
  55332. // this.editingCamera = null
  55333. // this.selectType = null
  55334. // this.player.$app.Camera.emit('SecurityCamera.unselect')
  55335. // }
  55336. }, {
  55337. key: "bindEvents",
  55338. value: function bindEvents() {
  55339. var _this4 = this;
  55340. this.player.on('pointerUp', this.onMouseUp.bind(this));
  55341. this.player.on('touchend', this.onMouseUp.bind(this));
  55342. this.player.on('pointerMove', this.onMouseMove.bind(this));
  55343. this.player.domElement.addEventListener('mousewheel', this.onMouseWheel.bind(this));
  55344. {
  55345. var cameraMeshes = [];
  55346. this.player.on('collectIntersectMesh', function (meshes, e) {
  55347. //推送要intersect的mesh
  55348. cameraMeshes = _this4.cameras.filter(function (camera) {
  55349. return camera.tag && camera.obj3d.visible;
  55350. }).map(function (camera) {
  55351. return camera.tag;
  55352. });
  55353. meshes.push.apply(meshes, _toConsumableArray(cameraMeshes));
  55354. });
  55355. this.player.on('judgeIntersect', function (intersect, e) {
  55356. //判断是否intersect了overlay
  55357. if (e.getConsumed()) return;
  55358. if (intersect && cameraMeshes.includes(intersect.object)) {
  55359. _this4.hoverCamera = intersect.object.parent.camera;
  55360. _this4.player.$app.Camera.emit('SecurityCamera.hover', _this4.hoverCamera.sid);
  55361. _this4.hoverCamera.highlight(true);
  55362. CursorDeal.add('hoverMonitor');
  55363. e.consume();
  55364. } else {
  55365. if (_this4.hoverCamera) {
  55366. _this4.hoverCamera.highlight(false);
  55367. _this4.hoverCamera = null;
  55368. _this4.player.$app.Camera.emit('SecurityCamera.nothover');
  55369. CursorDeal.remove('hoverMonitor');
  55370. }
  55371. }
  55372. });
  55373. }
  55374. this.player.on(PlayerEvents.PanoChosen, function () {
  55375. _this4.isEdit || _this4.stopWatch(); // 在浏览监控时退出当前监控
  55376. });
  55377. this.player.on(PlayerEvents.ModeChanging, function (currentMode, mode) {
  55378. _this4.isEdit || _this4.stopWatch(); // 在浏览监控时退出当前监控
  55379. _this4.onModeChange(currentMode, mode);
  55380. });
  55381. }
  55382. }, {
  55383. key: "onMouseUp",
  55384. value: function onMouseUp(e) {
  55385. if (!this.hoverCamera) this.onMouseMove();
  55386. if (this.hoverCamera && this.hoverCamera.visible === true) {
  55387. e.consume();
  55388. if (!this.hoverCamera.videoActive && !this.hoverCamera.isNew && this.app.config.view == true) {
  55389. // #42503 在展示页时若监控无法播放不飞入
  55390. this.player.$app.Camera.emit('SecurityCamera.cannotWatchVideo', this.hoverCamera.sid);
  55391. return;
  55392. }
  55393. this.watch(this.hoverCamera);
  55394. }
  55395. }
  55396. }, {
  55397. key: "onMouseMove",
  55398. value: function onMouseMove() {
  55399. if (this.watchingCamera && this.watchingCamera.isWatching) {
  55400. if (this.isEdit) {
  55401. if (this.player.mouseDown) {
  55402. this.unbindDollhouse = true;
  55403. }
  55404. }
  55405. }
  55406. /* // hover 高亮
  55407. let intersect = this.player.getMouseIntersect(
  55408. null,
  55409. this.cameras.filter(camera => camera.tag && camera.obj3d.visible).map(camera => camera.tag)
  55410. )
  55411. if (intersect) {
  55412. this.hoverCamera = intersect.object.parent.camera
  55413. if (!this.watchingCamera) {
  55414. transitions.start(lerp.color(this.hoverCamera.tag.material.color, this.hoverColor), 100)
  55415. this.player.$app.Camera.emit('SecurityCamera.hover', this.hoverCamera.sid)
  55416. }
  55417. } else if (this.hoverCamera) {
  55418. if (!this.watchingCamera) {
  55419. transitions.start(lerp.color(this.hoverCamera.tag.material.color, this.normalColor), 100)
  55420. this.player.$app.Camera.emit('SecurityCamera.nothover')
  55421. }
  55422. this.hoverCamera = null
  55423. } */
  55424. }
  55425. }, {
  55426. key: "onMouseWheel",
  55427. value: function onMouseWheel() {
  55428. if (this.watchingCamera && this.watchingCamera.isWatching) {
  55429. if (this.isEdit) {
  55430. this.unbindDollhouse = true;
  55431. }
  55432. }
  55433. }
  55434. }]);
  55435. return SecurityControls;
  55436. }();
  55437. 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); }; }
  55438. 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; } }
  55439. var TagSpot = /*#__PURE__*/function (_THREE$Group) {
  55440. _inherits(TagSpot, _THREE$Group);
  55441. var _super = _createSuper$K(TagSpot);
  55442. function TagSpot(player) {
  55443. var _this;
  55444. _classCallCheck(this, TagSpot);
  55445. _this = _super.call(this);
  55446. _this.player = player;
  55447. _this.renderOrder = RenderOrder.reticule;
  55448. _this.name = 'TagSpot3d';
  55449. _this.visible = false;
  55450. _this.height = new THREE.Vector3(0, 0, 0.12);
  55451. player.model.add(_assertThisInitialized(_this));
  55452. _this.build();
  55453. player.on('update', function (e) {
  55454. if (e.lastFrameChanged) _this.updateSize();
  55455. });
  55456. return _this;
  55457. }
  55458. _createClass(TagSpot, [{
  55459. key: "build",
  55460. value: function build() {
  55461. var tagMap = common$1.loadTextureFromCache(texture.getImageURL('images/tag_icon_default.png'));
  55462. tagMap.minFilter = THREE.LinearMipMapLinearFilter;
  55463. tagMap.generateMipmaps = true;
  55464. var tag = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.15, 0.15, 1, 1), new THREE.MeshBasicMaterial({
  55465. transparent: true,
  55466. depthTest: false,
  55467. map: tagMap
  55468. }));
  55469. tag.renderOrder = RenderOrder.tagDisc;
  55470. tag.position.copy(this.height);
  55471. this.topMesh = tag;
  55472. this.add(tag);
  55473. var stemLine = LineDraw.createLine([this.height, new THREE.Vector3(0, 0, 0)], {
  55474. width: 2,
  55475. color: '#eee'
  55476. }); //垂线
  55477. this.line = stemLine;
  55478. this.add(stemLine);
  55479. var arrowMap = common$1.loadTextureFromCache(texture.getImageURL('images/tag_pointer.png'));
  55480. arrowMap.anisotropy = 5;
  55481. arrowMap.minFilter = THREE.LinearMipMapLinearFilter;
  55482. arrowMap.generateMipmaps = true;
  55483. var arrow = new THREE.Mesh(new THREE.PlaneBufferGeometry(0.35, 0.35, 1, 1), new THREE.MeshBasicMaterial({
  55484. transparent: true,
  55485. depthTest: false,
  55486. map: arrowMap
  55487. }));
  55488. this.bottomMesh = arrow;
  55489. this.add(arrow);
  55490. }
  55491. }, {
  55492. key: "updateSize",
  55493. value: function updateSize() {
  55494. if (!this.visible) return;
  55495. var s = math$2.getScaleForConstantSize({
  55496. width2d: 500,
  55497. position: this.position,
  55498. player: this.player
  55499. });
  55500. this.topMesh.scale.set(s, s, s);
  55501. }
  55502. }]);
  55503. return TagSpot;
  55504. }(THREE.Group);
  55505. 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); }; }
  55506. 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; } }
  55507. var maxFileSize = 50;
  55508. var Monitor = /*#__PURE__*/function () {
  55509. function Monitor(app) {
  55510. var _this = this;
  55511. _classCallCheck(this, Monitor);
  55512. this.app = app;
  55513. this.edit = {};
  55514. this.isSingleView = false;
  55515. this.locked = null;
  55516. this.deferred = Deferred$1();
  55517. if (!Hls.isSupported()) {
  55518. console.error('Hls is not Supported, 部分监控视频可能不支持'); //iphoneX不支持 小米Civi 1S支持。
  55519. }
  55520. this.app.Scene.on('loaded', function () {
  55521. var player = _this.app.core.get('Player');
  55522. _this.control = new SecurityControls(player);
  55523. !_this.app.config.view && !_this.app.config.mobile; //手机编辑页无法编辑监控所以当做展示页面处理
  55524. //if (!Hls.isSupported() && !canEdit) return //不支持
  55525. var nonsupportH5Video = window.MediaSource && browser$1.detectAndroidMobile();
  55526. _this.videoPlayer = nonsupportH5Video ? new FlvVideoPlayer(player) : new H5VideoPlayer(player); // if (!this.app.config.mobile) {
  55527. // // 移动端禁用监控
  55528. // 初始数据
  55529. var addMonitorsFromData = function addMonitorsFromData(arr) {
  55530. // 编辑页要先隐藏cylinder
  55531. //this.control.hideCylinder = true //showSurveilScope //canEdit 默认不显示范围
  55532. arr.forEach(function (data) {
  55533. var option = {
  55534. sid: data.sid,
  55535. name: data.name,
  55536. panoId: data.panoId,
  55537. video: data.urlType === 2 ? app.resource.getUserResourceURL(data.fileName) : data.playUrl,
  55538. //1=m3u8 2=mp4
  55539. posOri: new THREE.Vector3(parseFloat(data.data['posOri-x']), parseFloat(data.data['posOri-y']), parseFloat(data.data['posOri-z'])),
  55540. posOffset: new THREE.Vector3(parseFloat(data.data['posOffset-x']), parseFloat(data.data['posOffset-y']), parseFloat(data.data['posOffset-z'])),
  55541. fov: parseInt(data.data.fov),
  55542. //纵向fov
  55543. far: parseFloat(data.data.far),
  55544. yaw: parseInt(data.data.yaw),
  55545. roll: parseInt(data.data.roll),
  55546. pitch: parseInt(data.data.pitch),
  55547. videoType: data.urlType
  55548. };
  55549. if (_this.app.config.mobile && data.urlType === 2 && data.fileSize > (1 << 20) * maxFileSize) {
  55550. option.overWeight = true;
  55551. }
  55552. if (nonsupportH5Video && data.urlType === 2) {
  55553. option.video = option.video.replace('.mp4', '.flv');
  55554. }
  55555. var camera = new SecurityCamera(_this.control, option, _this.videoPlayer);
  55556. _this.control.addCamera(camera);
  55557. });
  55558. _this.edit.hideCylinder(true); //默认关闭
  55559. if (!_this.app.store.getValue('metadata').controls.showCameraTitle) {
  55560. _this.changeTitlesShow(false);
  55561. }
  55562. _this.control.onModeChange();
  55563. _this.deferred && _this.deferred.resolve();
  55564. };
  55565. var monitorData = _this.app.store.getValue('cameras');
  55566. if (monitorData) addMonitorsFromData(monitorData);else _this.app.store.on('cameras', function (data) {
  55567. return addMonitorsFromData(data);
  55568. }); // }
  55569. // 判断,激光场景在单屏内添加热点
  55570. var isSingleView_ = function isSingleView_(metadata) {
  55571. _this.isSingleView = metadata.sceneFrom == 'laser' || metadata.threeCamType == 'yzl';
  55572. };
  55573. var metadata = _this.app.store.getValue('metadata');
  55574. if (metadata) isSingleView_(metadata);else _this.app.store.on('metadata', function (data) {
  55575. return isSingleView_(data);
  55576. }); // spot3d,用于单屏 -----------------------------------
  55577. if (_this.isSingleView) {
  55578. _this.spot3d = new TagSpot(player);
  55579. _this.spot3d.visible = false;
  55580. var intersectSpot3d;
  55581. var lookAt = new THREE.Vector3(); // spot3d相关事件
  55582. player.on('pointerStart', function (e) {
  55583. if (!_this.isSingleView) return;
  55584. if (!_this.editingCamera) return;
  55585. if (intersectSpot3d) {
  55586. _this.updateTagPos = true;
  55587. player.cameraControls.activeControl.enabled = false;
  55588. }
  55589. });
  55590. player.on('pointerMove', function (e) {
  55591. if (!_this.isSingleView) return;
  55592. if (!_this.editingCamera && !_this.updateTagPos) return;
  55593. intersectSpot3d = player.getMouseIntersect(null, [_this.spot3d.topMesh, _this.spot3d.bottomMesh]);
  55594. if (intersectSpot3d) {
  55595. player.domElement.style.cursor = 'move';
  55596. } else if (_this.editingCamera && !_this.updateTagPos) {
  55597. player.domElement.style.cursor = 'default';
  55598. }
  55599. if (_this.updateTagPos) {
  55600. var intersect = player.getMouseIntersect(null, player.OverlayManager.list.concat(player.model.colliders));
  55601. if (intersect) {
  55602. _this.spot3d.visible = true;
  55603. _this.spot3d.position.copy(intersect.point);
  55604. _this.spot3d.lookAt(lookAt.addVectors(intersect.point, intersect.normal));
  55605. _this.spot3d.topMesh.lookAt(player.camera.position);
  55606. _this.spot3d.updateSize();
  55607. } else {
  55608. _this.spot3d.visible = false;
  55609. }
  55610. }
  55611. });
  55612. player.on('pointerUp', function (e) {
  55613. if (!_this.isSingleView) return;
  55614. if (_this.spot3d && _this.spot3d.visible) {
  55615. player.cameraControls.activeControl.enabled = true;
  55616. player.cameraControls.activeControl.pointerDragOn = false;
  55617. _this.updateTagPos = false;
  55618. if (!_this.editingCamera) {
  55619. _this.editingCamera = {
  55620. position: _this.spot3d.position,
  55621. sid: common$1.getRandomSid()
  55622. };
  55623. }
  55624. }
  55625. });
  55626. } // --------------------------------------------------
  55627. player.on('update', function () {
  55628. // 显隐过滤
  55629. if (_this.camPosChosing || // 选择监控位置时
  55630. _this.control.isEdit || // 编辑监控时
  55631. _this.app.TagManager.tagPosChosing || // 选择热点位置时
  55632. _this.app.TagManager.tagInfoEditing || // 编辑热点时
  55633. _this.app.TourManager.editing || // 进入导览模块
  55634. _this.app.ViewLinkEdit.markView || // 编辑场景关联时
  55635. player.currentPano.panoType == '360view' || player.paintEditor && player.paintEditor.painting || player.linkEditor && player.linkEditor.setPanoVisible || player.linkEditor && player.linkEditor.setTagVisible // 设置热点可视时
  55636. ) {
  55637. // 只显示正在观看的监控
  55638. _this.control.cameras.forEach(function (camera) {
  55639. //camera.obj3d.visible = !!camera.isWatching
  55640. common$1.updateVisible(camera, 'hideAtSomePage', !!camera.isWatching);
  55641. });
  55642. } else {
  55643. _this.control.cameras.forEach(function (camera) {
  55644. //camera.obj3d.visible = true
  55645. common$1.updateVisible(camera, 'hideAtSomePage', true);
  55646. });
  55647. }
  55648. });
  55649. });
  55650. /**
  55651. * ------------------------进入或离开当前模块--------------------------
  55652. */
  55653. this.edit.enterModule = function (isShowCylinder) {
  55654. if (_this.control) {
  55655. //this.edit.hideCylinder(!isShowCylinder) //说要默认不显示
  55656. // 在进入模块的时候还必须传videoActive给UI
  55657. setTimeout(function () {
  55658. //等待侦听加上
  55659. _this.control.cameras.forEach(function (camera) {
  55660. camera.videoActive && _this.app.Camera.emit('SecurityCamera.videoActive', camera.sid);
  55661. });
  55662. }, 1);
  55663. } else {
  55664. _this.deferred.then(function () {
  55665. return _this.edit.enterModule(isShowCylinder);
  55666. });
  55667. }
  55668. };
  55669. this.edit.leaveModule = function () {
  55670. if (_this.control) ; else {
  55671. _this.deferred = null;
  55672. }
  55673. };
  55674. /**
  55675. * ------------------------新增或编辑(确定坐标)---------------------
  55676. */
  55677. this.edit.enter = function (camera) {
  55678. _this.editingCamera = camera;
  55679. _this.camPosChosing = true;
  55680. if (_this.isSingleView) {
  55681. _this.app.TagManager.switchAllDisplay(false, 'editMonitor', {
  55682. cameras: true
  55683. });
  55684. var player = _this.app.core.get('Player');
  55685. player.reticule.visible = false;
  55686. if (camera) {
  55687. // 修改
  55688. player.flyToPano({
  55689. pano: player.model.panos.get(camera.panoId),
  55690. lookAtPoint: camera.position.clone(),
  55691. aimDuration: 500,
  55692. checkAlone: true
  55693. }, function () {
  55694. player.locked = true;
  55695. _this.updateTagPos = false;
  55696. _this.spot3d.position.set(camera.position.x, camera.position.y, camera.position.z);
  55697. _this.spot3d.updateSize();
  55698. setTimeout(function () {
  55699. var tagScreenPos = new THREE.Vector3(0, 0, 0);
  55700. var tagNDCPos = new THREE.Vector3(0, 0, 0.5);
  55701. math$2.projectPositionToCanvas(camera.position, player.camera, tagScreenPos, player.domElement);
  55702. math$2.convertScreenPositionToNDC(tagScreenPos.x, tagScreenPos.y, tagNDCPos, player.domElement);
  55703. var intersect = player.getMouseIntersect(tagNDCPos, player.OverlayManager.list.concat(player.model.colliders));
  55704. intersect && (_this.spot3d.lookAt(intersect.normal.add(_this.spot3d.position)), _this.spot3d.topMesh.lookAt(player.camera.position));
  55705. _this.spot3d.visible = true;
  55706. }, 10);
  55707. });
  55708. } else {
  55709. // 新增
  55710. _this.edit.cancelWatching();
  55711. player.locked = true;
  55712. _this.updateTagPos = true;
  55713. _this.spot3d.position.set(0, 1000, 0);
  55714. _this.spot3d.updateSize();
  55715. _this.spot3d.visible = true;
  55716. }
  55717. } else {
  55718. _this.app.core.get('Scene').getSplit('TAG').then(function (view) {
  55719. if (_this.editHandle == void 0) {
  55720. _this.editHandle = _this.app.withNewComponent('TagEditManager', view, {
  55721. spotA: _this.app.dom.querySelector('.player[name="main"] .player-mark'),
  55722. spotB: _this.app.dom.querySelector('.player[name="copy"] .player-mark')
  55723. });
  55724. }
  55725. if (camera) {
  55726. // 修改
  55727. _this.editHandle.reSetPos(camera.position);
  55728. } else {
  55729. // 新增
  55730. _this.editHandle.enter();
  55731. }
  55732. });
  55733. }
  55734. camera && common$1.updateVisible(camera.titleLabel, 'editPos', false);
  55735. }; // 修改监控坐标
  55736. this.edit.modify = function (sid) {
  55737. _this.checkMonitorExist(sid, function (camera) {
  55738. _this.edit.enter(camera);
  55739. });
  55740. }; // 退出坐标选择
  55741. this.edit.exit = function () {
  55742. var player = _this.app.core.get('Player');
  55743. if (_this.isSingleView) {
  55744. player.domElement.style.cursor = 'default';
  55745. player.locked = false;
  55746. player.reticule.visible = true;
  55747. _this.spot3d.visible = false;
  55748. _this.updateTagPos = false;
  55749. _this.app.TagManager.switchAllDisplay(true, 'editMonitor', {
  55750. cameras: true
  55751. });
  55752. } else {
  55753. if (!_this.editHandle) {
  55754. return;
  55755. }
  55756. app.core.get('Scene').restore('TAG');
  55757. _this.editHandle.exit({
  55758. cancel: true
  55759. });
  55760. setTimeout(function () {
  55761. player.cameraControls.activeControl.camera.fov = 70;
  55762. player.camera.fov = player.baseFov * (1 / player.zoomLevel);
  55763. }, 50);
  55764. }
  55765. _this.editingCamera && _this.editingCamera.titleLabel && common$1.updateVisible(_this.editingCamera.titleLabel, 'editPos', true);
  55766. _this.editingCamera = null;
  55767. _this.camPosChosing = false;
  55768. }; // 确认监控坐标
  55769. this.edit.confirm = function (onlyExitWithPosition) {
  55770. var player = _this.app.core.get('Player');
  55771. if (_this.isSingleView) {
  55772. if (!_this.editingCamera) return;
  55773. if (!_this.spot3d.visible) {
  55774. _this.edit.exit();
  55775. return null;
  55776. }
  55777. var sid = _this.editingCamera.sid;
  55778. var position = _this.spot3d.position;
  55779. if (_this.editingCamera.type != 'SecurityCamera') {
  55780. var panoId = player.currentPano.id;
  55781. var camera = new SecurityCamera(_this.control, {
  55782. sid,
  55783. posOri: position,
  55784. panoId,
  55785. target: player.currentPano.position.clone()
  55786. }, _this.videoPlayer);
  55787. camera.isNew = true;
  55788. _this.control.addCamera(camera);
  55789. _this.control.editingCamera = camera;
  55790. } else {
  55791. _this.editingCamera.updatePosition(position);
  55792. _this.editingCamera.posOri.copy(position);
  55793. _this.editingCamera.posOffset.set(0, 0, 0);
  55794. }
  55795. _this.edit.exit();
  55796. _this.edit.watch(sid, true, true);
  55797. return sid;
  55798. } else {
  55799. if (!_this.editHandle) {
  55800. return null;
  55801. }
  55802. var _this$editHandle$conf = _this.editHandle.confirmPos(),
  55803. _position = _this$editHandle$conf.position,
  55804. _sid = _this$editHandle$conf.sid;
  55805. if (!_position) {
  55806. onlyExitWithPosition || _this.edit.exit(); // 未选定位置时不用退出
  55807. return null;
  55808. }
  55809. if (!_this.editingCamera) {
  55810. var _panoId = player.currentPano.id;
  55811. var _camera = new SecurityCamera(_this.control, {
  55812. sid: _sid,
  55813. posOri: _position,
  55814. panoId: _panoId,
  55815. target: player.currentPano.position.clone()
  55816. }, _this.videoPlayer);
  55817. _camera.isNew = true;
  55818. _this.control.addCamera(_camera);
  55819. _this.control.editingCamera = _camera;
  55820. } else {
  55821. _sid = _this.editingCamera.sid;
  55822. _this.editingCamera.updatePosition(_position);
  55823. _this.editingCamera.posOri.copy(_position);
  55824. _this.editingCamera.posOffset.set(0, 0, 0);
  55825. _this.control.editingCamera = _this.editingCamera;
  55826. }
  55827. _this.edit.exit();
  55828. setTimeout(function () {
  55829. _this.edit.watch(_sid, true, true);
  55830. }, 100);
  55831. return _sid;
  55832. }
  55833. };
  55834. /**
  55835. * ----------------------------查看、删除、保存等---------------------------------
  55836. */
  55837. /**
  55838. * 观看监控
  55839. * @param { true | false } isEdit 是否是进入编辑
  55840. * @param { true | false } isAdd 是否是新增监控
  55841. */
  55842. this.edit.watch = function () {
  55843. var watchPosition = new THREE.Vector3();
  55844. return function (sid, isEdit, isAdd) {
  55845. _this.checkMonitorExist(sid, function (camera) {
  55846. _this.control.isEdit = !!isEdit;
  55847. if (isEdit) {
  55848. _this.app.core.get('Player').locked = true;
  55849. _this.app.core.get('Player').cameraControls.activeControl.enabled = true;
  55850. common$1.updateVisible(camera.cylinder, 'enterEdit', true, 1, 'add');
  55851. }
  55852. if (isAdd) {
  55853. watchPosition.set(-1.5, 0, 0.2).applyQuaternion(camera.quaternion).add(camera.position);
  55854. _this.control.watch(camera, watchPosition);
  55855. } else {
  55856. _this.control.watch(camera);
  55857. }
  55858. });
  55859. if (isEdit || isAdd) {
  55860. _this.app.core.get('Player').modelSideManager.tempAuto();
  55861. }
  55862. };
  55863. }(); // 保存监控数据
  55864. this.edit.save = function () {
  55865. _this.control.currentCamera.isNew = false;
  55866. return _this.control.currentCamera.updateInfo(true);
  55867. }; // 退出监控编辑或查看
  55868. this.edit.cancel = function () {
  55869. var player = _this.app.core.get('Player'); // this.control.editingCamera.videoMat.opacity = 1
  55870. // 查看时退出,没有selectCamera,直接cancelWatching
  55871. // 新增时退出,selectCamera会被undoEdit的removeCamera清除,然后cancelWatching
  55872. if (_this.control.editingCamera) {
  55873. common$1.updateVisible(_this.control.editingCamera.cylinder, 'enterEdit', false, 1, 'cancel');
  55874. player.modelSideManager.recover();
  55875. _this.edit.hideCylinder(_this.control.hideCylinder); //新添加的设置
  55876. }
  55877. if (!_this.control.editingCamera) {
  55878. _this.edit.cancelWatching();
  55879. }
  55880. _this.control.isEdit = false;
  55881. _this.control.editingCamera = null;
  55882. _this.control.selectType = null;
  55883. player.locked = false; // 如果没有cancelWatching,则重新watch一次,保证镜头正对着监控视频
  55884. if (_this.control.watchingCamera) {
  55885. _this.control.watch(_this.control.watchingCamera);
  55886. }
  55887. }; // 退出监控查看
  55888. this.edit.cancelWatching = function () {
  55889. var player = _this.app.core.get('Player');
  55890. if (!_this.control.watchingCamera) return;
  55891. _this.control.stopWatch(); // 回到查看前的位置和视角
  55892. var _this$control$lastVie = _this.control.lastViewState,
  55893. mode = _this$control$lastVie.mode,
  55894. floorIndex = _this$control$lastVie.floorIndex,
  55895. target = _this$control$lastVie.target,
  55896. quaternion = _this$control$lastVie.quaternion,
  55897. position = _this$control$lastVie.position,
  55898. currentScale = _this$control$lastVie.currentScale;
  55899. if (mode == Viewmode$1.DOLLHOUSE && player.mode == Viewmode$1.DOLLHOUSE) {
  55900. // 切换当前楼层
  55901. var currentFloorId = player.model.allFloorsVisible ? 'all' : player.model.currentFloorId;
  55902. if (currentFloorId != floorIndex) {
  55903. player.$app.Scene.gotoFloor(floorIndex);
  55904. }
  55905. var activeControl = player.cameraControls.activeControl;
  55906. transitions$1.start(lerp.vector(activeControl.target, target), 1000, null, 0, easing[settings$3.flydown.rotationEasing], null, settings$3.freeze.LookRotationForPlay);
  55907. transitions$1.start(lerp.vector(activeControl.camera.position, position), 1000, function () {}, 0, easing[settings$3.flydown.movementEasing], null, settings$3.freeze.LookRotationForPlay);
  55908. } else if (mode == Viewmode$1.PANORAMA) {
  55909. player.flyToNewMode({
  55910. mode: Viewmode$1.PANORAMA,
  55911. pano: player.currentPano,
  55912. quaternion,
  55913. callback: function callback() {}
  55914. });
  55915. } else {
  55916. player.flyToNewMode({
  55917. mode,
  55918. quaternion,
  55919. target,
  55920. position,
  55921. currentScale,
  55922. floor: floorIndex,
  55923. callback: function callback() {}
  55924. });
  55925. }
  55926. }; // 删除监控
  55927. this.edit.delete = function (sid) {
  55928. _this.checkMonitorExist(sid, function (camera) {
  55929. camera.isWatching && _this.edit.cancelWatching();
  55930. _this.control.removeCamera(camera);
  55931. });
  55932. }; // 隐藏监控线框
  55933. this.edit.hideCylinder = function (isHide) {
  55934. var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'force';
  55935. //有按钮控制
  55936. //按钮控制
  55937. console.log('hideCylinder', isHide, reason);
  55938. _this.control.hideCylinder = isHide;
  55939. _this.control.cameras.forEach(function (camera) {
  55940. common$1.updateVisible(camera.cylinder, reason, !isHide);
  55941. });
  55942. };
  55943. /**
  55944. * ---------------------属性设置-------------------------------
  55945. */
  55946. // 设置监控名称
  55947. this.edit.setName = function (name) {
  55948. _this.control.currentCamera.name = name;
  55949. _this.control.currentCamera.titleLabel.setText(name);
  55950. }; // 设置监控坐标
  55951. this.edit.setPosition = function (position) {
  55952. _this.control.currentCamera.updatePosition(position);
  55953. if (!_this.control.unbindDollhouse) {
  55954. var dollhouseControl = _this.app.core.get('Player').cameraControls.controls.dollhouse;
  55955. dollhouseControl.camera.position.copy(_this.control.currentCamera.position);
  55956. dollhouseControl.target.copy(_this.control.currentCamera.target);
  55957. }
  55958. };
  55959. /**
  55960. * 根据xyz分别设置监控坐标,传入的是posOffset的值
  55961. * key: 'x' | 'y' | 'z'
  55962. */
  55963. this.edit.setSeparatePosition = function () {
  55964. var position = new THREE.Vector3();
  55965. return function (key, value) {
  55966. if (isNaN(parseFloat(value))) return;
  55967. _this.control.currentCamera.posOffset[key] = parseFloat(value);
  55968. position.copy(_this.control.currentCamera.posOri).add(_this.control.currentCamera.posOffset);
  55969. _this.edit.setPosition(position);
  55970. };
  55971. }(); // 设置监控fov
  55972. this.edit.setFov = function (fov) {
  55973. if (_this.control.currentCamera.isWatching && !_this.control.unbindDollhouse) _this.app.core.get('Player').cameraControls.cameras.dollhouse.fov = fov;
  55974. _this.control.currentCamera.fov = fov;
  55975. _this.control.currentCamera.updateProjectionMatrix();
  55976. _this.control.currentCamera.updateMesh();
  55977. }; // 设置视频长宽比
  55978. this.edit.setAspect = function (aspect) {
  55979. _this.control.currentCamera.updateAspect(aspect);
  55980. }; // 设置视频透明度
  55981. this.edit.setOpacity = function (opacity) {
  55982. _this.control.currentCamera.videoMat.opacity = opacity / 100;
  55983. }; // 设置横向角
  55984. this.edit.setRoll = function (angle) {
  55985. _this.control.currentCamera.setRoll(angle);
  55986. }; // 设置左右转角
  55987. this.edit.setYaw = function (angle) {
  55988. _this.control.currentCamera.yaw = angle;
  55989. if (_this.control.watchingCamera && !_this.control.unbindDollhouse) {
  55990. var dollhouseControl = _this.app.core.get('Player').cameraControls.controls.dollhouse;
  55991. dollhouseControl.target.copy(_this.control.currentCamera.target);
  55992. }
  55993. }; // 设置上下转角
  55994. this.edit.setPitch = function (angle) {
  55995. _this.control.currentCamera.pitch = angle;
  55996. if (_this.control.watchingCamera && !_this.control.unbindDollhouse) {
  55997. var dollhouseControl = _this.app.core.get('Player').cameraControls.controls.dollhouse;
  55998. dollhouseControl.target.copy(_this.control.currentCamera.target);
  55999. }
  56000. }; // 设置监控视频地址
  56001. this.edit.setVideoSrc = function (videoSrc, reload) {
  56002. //videoSrc = {src:xxx, urlType:xxx}
  56003. // let time0 = new Date().getTime()
  56004. var currentCamera = _this.control.currentCamera;
  56005. currentCamera.videoActive = false;
  56006. currentCamera.showVideo(false); // 1秒内没load好就reload一次,防止在路径正确的情况下偶尔不知为何加载不出来
  56007. var reloadHandle = setTimeout(function () {
  56008. if (!reload) {
  56009. console.error('reload');
  56010. _this.edit.setVideoSrc(videoSrc, true);
  56011. }
  56012. }, 1000);
  56013. if (currentCamera.videoType === 2) {
  56014. videoSrc.src = common$1.getDealedUrl(videoSrc.src, _this.app);
  56015. }
  56016. var video = currentCamera.createVideo(videoSrc.src);
  56017. video.onloadedmetadata = function () {
  56018. clearTimeout(reloadHandle);
  56019. _this.app.Camera.emit('SecurityCamera.videoActive', currentCamera.sid);
  56020. currentCamera.videoActive = true; // currentCamera.aspect = video.videoWidth / video.videoHeight
  56021. //currentCamera.updateMesh()
  56022. currentCamera.showVideo(true);
  56023. };
  56024. currentCamera.hlsVideoPlayer && currentCamera.hlsVideoPlayer.destroy();
  56025. currentCamera.videoType = videoSrc.urlType;
  56026. if (Hls.isSupported() && currentCamera.videoType === 1) {
  56027. var hls = new Hls();
  56028. hls.loadSource(videoSrc.src);
  56029. hls.attachMedia(video);
  56030. hls.on(Hls.Events.ERROR, function (event, data) {
  56031. return console.log('HLS加载失败', event, data);
  56032. });
  56033. currentCamera.hlsVideoPlayer = hls;
  56034. } else {
  56035. video.src = videoSrc.src;
  56036. }
  56037. currentCamera.play();
  56038. currentCamera.videoMat.map = new THREE.VideoTexture(currentCamera.video);
  56039. }; // 设置线框距离
  56040. this.edit.setCylinderFar = function (far) {
  56041. _this.control.currentCamera.cylinderFar = far;
  56042. _this.control.currentCamera.cylinder.bottom.position.set(0, 0, -far);
  56043. _this.control.currentCamera.updateMesh(); // if (this.control.watchingCamera) {
  56044. // let dollhouseControl = this.app.core.get('Player').cameraControls.controls.dollhouse
  56045. // dollhouseControl.target.copy(this.control.currentCamera.target)
  56046. // }
  56047. }; // 切换控制器(暂时用不到)
  56048. // this.edit.switchTransformType = type => {
  56049. // if (type == this.control.transformType) return
  56050. // if (this.control.transformType == 0) {
  56051. // this.control.enableTransformControl()
  56052. // }
  56053. // this.control.transformType = type
  56054. // if (type == 0) {
  56055. // this.control.disableTransformControl()
  56056. // }
  56057. // if (type == 1) {
  56058. // this.app.core.get('Player').model.transformControls.space = 'world'
  56059. // this.app.core.get('Player').model.transformControls.setMode('translate')
  56060. // }
  56061. // if (type == 2) {
  56062. // this.app.core.get('Player').model.transformControls.space = 'world'
  56063. // this.app.core.get('Player').model.transformControls.setMode('rotate')
  56064. // }
  56065. // }
  56066. /**
  56067. * ------------------------数据回退------------------------------
  56068. */
  56069. // Transform改为默认值
  56070. this.edit.undoTransform = function () {
  56071. // let info = this.control.currentCamera.info
  56072. // this.edit.setSeparatePosition('x', info.posOffset.x)
  56073. // this.edit.setSeparatePosition('y', info.posOffset.y)
  56074. // this.edit.setSeparatePosition('z', info.posOffset.z)
  56075. // this.edit.setRoll(info.roll)
  56076. // this.edit.setPitch(info.pitch)
  56077. // this.edit.setYaw(info.yaw)
  56078. _this.edit.setRoll(0);
  56079. _this.edit.setPitch(0);
  56080. _this.edit.setYaw(0);
  56081. _this.app.Camera.emit('SecurityCamera.select', _this.control.currentCamera.updateInfo());
  56082. }; // fov和线框距离改为默认值
  56083. this.edit.undoScope = function () {
  56084. // let info = this.control.currentCamera.info
  56085. // this.edit.setCylinderFar(info.far)
  56086. // this.edit.setFov(info.fov)
  56087. _this.edit.setCylinderFar(3);
  56088. _this.edit.setFov(70);
  56089. _this.app.Camera.emit('SecurityCamera.select', _this.control.currentCamera.updateInfo());
  56090. }; // 回撤
  56091. this.edit.undoEdit = function () {
  56092. var camera = _this.control.currentCamera;
  56093. if (camera.isNew) {
  56094. // 删除添加的模型
  56095. _this.control.removeCamera(camera);
  56096. } else {
  56097. // 回退数据
  56098. var info = camera.info;
  56099. if (info.far != camera.cylinderFar) _this.edit.setCylinderFar(info.far); // 需要将far放在第一个
  56100. camera.posOri.x = info.posOri.x;
  56101. camera.posOri.y = info.posOri.y;
  56102. camera.posOri.z = info.posOri.z;
  56103. _this.edit.setSeparatePosition('x', info.posOffset.x);
  56104. _this.edit.setSeparatePosition('y', info.posOffset.y);
  56105. _this.edit.setSeparatePosition('z', info.posOffset.z);
  56106. if (info.fov != camera.fov) _this.edit.setFov(info.fov); //if (info.aspect != camera.aspect) this.edit.setAspect(info.aspect)
  56107. if (info.roll != camera.roll) _this.edit.setRoll(info.roll);
  56108. if (info.pitch != camera.pitch) _this.edit.setPitch(info.pitch);
  56109. if (info.yaw != camera.yaw) _this.edit.setYaw(info.yaw);
  56110. if (info.video != camera.videoSrc) _this.edit.setVideoSrc({
  56111. src: info.video,
  56112. urlType: info.videoType
  56113. });
  56114. _this.app.Camera.emit('SecurityCamera.select', _this.control.currentCamera.updateInfo());
  56115. }
  56116. };
  56117. }
  56118. _createClass(Monitor, [{
  56119. key: "showAll",
  56120. value: function showAll(reason, level, type) {
  56121. var _this2 = this;
  56122. this.waitSecurityControls(function () {
  56123. _this2.control.showAll(null, reason, level, type);
  56124. }, this.showAll.bind(this));
  56125. }
  56126. }, {
  56127. key: "hideAll",
  56128. value: function hideAll(reason, level, type) {
  56129. var _this3 = this;
  56130. this.waitSecurityControls(function () {
  56131. _this3.control.hideAll(null, reason, level, type);
  56132. }, this.hideAll.bind(this));
  56133. }
  56134. /* showRange(show) {
  56135. this.edit.hideCylinder(!show, 'showRange')
  56136. } */
  56137. }, {
  56138. key: "changeTitlesShow",
  56139. value: function changeTitlesShow(state) {
  56140. var cause = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'onShow';
  56141. //xzw add
  56142. this.control.showTitles = !!state;
  56143. this.control.cameras.forEach(function (cam) {
  56144. common$1.updateVisible(cam.titleLabel, cause, !!state);
  56145. });
  56146. } // 等待SecurityControls
  56147. }, {
  56148. key: "waitSecurityControls",
  56149. value: function waitSecurityControls(func, waitFunc) {
  56150. if (this.control) {
  56151. func && func();
  56152. } else {
  56153. this.deferred.then(function () {
  56154. return waitFunc();
  56155. });
  56156. }
  56157. } // 检测监控sid是否存在
  56158. }, {
  56159. key: "checkMonitorExist",
  56160. value: function checkMonitorExist(sid, func) {
  56161. var camera = this.control.cameras.find(function (cam) {
  56162. return cam.sid == sid;
  56163. });
  56164. if (camera) {
  56165. func(camera);
  56166. } else {
  56167. console.error('监控sid不存在!');
  56168. }
  56169. }
  56170. }, {
  56171. key: "watch",
  56172. value: function watch(sid) {
  56173. var cameras = this.app.store.getValue('cameras');
  56174. if (cameras == void 0 || !cameras.length) {
  56175. return;
  56176. }
  56177. var find = cameras.find(function (c) {
  56178. return c.sid == sid;
  56179. });
  56180. if (find == void 0) {
  56181. return;
  56182. }
  56183. this.edit.watch(sid);
  56184. }
  56185. }, {
  56186. key: "lock",
  56187. value: function lock() {
  56188. this.locked = Deferred$1();
  56189. }
  56190. }, {
  56191. key: "unlock",
  56192. value: function unlock() {
  56193. if (this.locked && this.locked.resolve) {
  56194. this.locked.resolve();
  56195. }
  56196. this.locked = null;
  56197. }
  56198. }, {
  56199. key: "highlight",
  56200. value: function highlight(sid) {
  56201. var cam = this.control.cameras.find(function (c) {
  56202. return c.sid == sid;
  56203. });
  56204. this.control.cameras.forEach(function (e) {
  56205. return e.highlight(false);
  56206. }); //先取消,一次只能高亮一个camera
  56207. cam && cam.highlight(true);
  56208. }
  56209. }]);
  56210. return Monitor;
  56211. }();
  56212. var FlvVideoPlayer = /*#__PURE__*/function (_FlvVideoPlayerBase) {
  56213. _inherits(FlvVideoPlayer, _FlvVideoPlayerBase);
  56214. var _super = _createSuper$J(FlvVideoPlayer);
  56215. function FlvVideoPlayer(player) {
  56216. _classCallCheck(this, FlvVideoPlayer);
  56217. return _super.call(this, player);
  56218. }
  56219. _createClass(FlvVideoPlayer, [{
  56220. key: "_getVideoPath",
  56221. value: function _getVideoPath(src) {
  56222. return src;
  56223. }
  56224. }]);
  56225. return FlvVideoPlayer;
  56226. }(FlvVideoPlayerBase);
  56227. var H5VideoPlayer = /*#__PURE__*/function (_H5VideoPlayerBase) {
  56228. _inherits(H5VideoPlayer, _H5VideoPlayerBase);
  56229. var _super2 = _createSuper$J(H5VideoPlayer);
  56230. function H5VideoPlayer(player) {
  56231. _classCallCheck(this, H5VideoPlayer);
  56232. return _super2.call(this, player);
  56233. }
  56234. _createClass(H5VideoPlayer, [{
  56235. key: "_getVideoPath",
  56236. value: function _getVideoPath(src) {
  56237. return src;
  56238. }
  56239. }]);
  56240. return H5VideoPlayer;
  56241. }(H5VideoPlayerBase);
  56242. /*
  56243. note:
  56244. https的地址不能使用http的链接
  56245. 即使不支持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
  56246. */
  56247. 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); }; }
  56248. 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; } }
  56249. /**
  56250. * 视角截取
  56251. */
  56252. var ViewExtract = /*#__PURE__*/function (_Emiter) {
  56253. _inherits(ViewExtract, _Emiter);
  56254. var _super = _createSuper$I(ViewExtract);
  56255. function ViewExtract(app) {
  56256. var _this;
  56257. _classCallCheck(this, ViewExtract);
  56258. _this = _super.call(this);
  56259. _this.app = app;
  56260. /**
  56261. * 数据状态
  56262. */
  56263. _this.state = {
  56264. /**
  56265. * 固定输出的图长宽比
  56266. */
  56267. scale: 1.78,
  56268. /**
  56269. * 缩放滑动条范围
  56270. */
  56271. range: {
  56272. min: 0.7,
  56273. max: 3,
  56274. current: 0
  56275. },
  56276. /**
  56277. * 默认设置
  56278. */
  56279. defaults: {
  56280. zoomMax: 0,
  56281. zoomMin: 0,
  56282. zoomEnabled: 0,
  56283. zoomToDefaultWhenToPano: 0
  56284. },
  56285. options: {
  56286. padding: {},
  56287. beforeExport: null,
  56288. afterExport: null
  56289. }
  56290. };
  56291. _this.player = null;
  56292. _this.__is_enter = false;
  56293. _this.__on_zoom = function (zoom) {
  56294. return _this.emit('zoom', zoom);
  56295. };
  56296. _this.__on_size = function () {
  56297. var domElement = _this.player.domElement;
  56298. var paddingTop = _this.state.options.padding.top || 0;
  56299. var paddingBottom = _this.state.options.padding.bottom || 0;
  56300. var paddingLeft = _this.state.options.padding.left || 0;
  56301. var paddingRight = _this.state.options.padding.right || 0;
  56302. var offsetWidth = paddingLeft + paddingRight;
  56303. var offsetHeight = paddingTop + paddingBottom;
  56304. var canvasWidth = window.innerWidth - offsetWidth;
  56305. var canvasHeight = window.innerHeight - offsetHeight;
  56306. if (canvasWidth / canvasHeight < _this.state.scale) {
  56307. //为了保证图片输出的fovH和画布上的一样,只能压缩一下高度了,否则要改截图的canvas的fov
  56308. var height = canvasWidth / _this.state.scale;
  56309. domElement.style.height = "".concat(height, "px");
  56310. domElement.style.top = (canvasHeight - height) / 2 + offsetHeight + 'px';
  56311. } else {
  56312. domElement.style.top = "".concat(offsetHeight, "px");
  56313. domElement.style.height = "calc(100% - ".concat(offsetHeight, "px)");
  56314. }
  56315. };
  56316. _this.__on_update = function () {
  56317. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  56318. _ref$hasChanged = _ref.hasChanged,
  56319. hasChanged = _ref$hasChanged === void 0 ? false : _ref$hasChanged;
  56320. var force = arguments.length > 1 ? arguments[1] : undefined;
  56321. if (!_this.__is_enter || !_this.player.lastFrameChanged && !force) {
  56322. return;
  56323. } //监听outside模式下的zoom
  56324. var control = _this.player.cameraControls.activeControl;
  56325. if (_this.player.mode == 'dollhouse') {
  56326. var dis = control.camera.position.distanceTo(control.target);
  56327. var zoomlevel = math$2.linearClamp(dis, control.minDistance, Math.max(control.maxDistance / 2, control.minDistance + 3), _this.state.range.max, _this.state.range.min);
  56328. _this.emit('zoom', zoomlevel);
  56329. } else if (_this.player.mode == 'floorplan' && hasChanged.cameraProjectionChanged) {
  56330. var absoluteScale = control.getDefaultAbsoluteScale(_this.player.model.size); //改
  56331. var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
  56332. var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
  56333. var _zoomlevel = math$2.linearClamp(control.absoluteScale, minS, maxS, _this.state.range.max, _this.state.range.min);
  56334. _this.emit('zoom', _zoomlevel);
  56335. }
  56336. };
  56337. return _this;
  56338. }
  56339. _createClass(ViewExtract, [{
  56340. key: "options",
  56341. value: function options(option) {
  56342. this.state.options = Object.assign(this.state.options, option || {});
  56343. return this;
  56344. }
  56345. }, {
  56346. key: "enter",
  56347. value: function enter() {
  56348. if (this.__is_enter) {
  56349. return;
  56350. }
  56351. if (this.player === null) {
  56352. this.player = this.app.core.get('Player');
  56353. }
  56354. this.__is_enter = true;
  56355. this.__on_size();
  56356. this.state.defaults.zoomMax = settings$3.zoom.max;
  56357. this.state.defaults.zoomMin = settings$3.zoom.min;
  56358. this.state.defaults.zoomEnabled = settings$3.zoom.enabled;
  56359. this.state.defaults.zoomToDefaultWhenToPano = settings$3.zoom.zoomToDefaultWhenToPano;
  56360. settings$3.zoom.max = this.state.range.max;
  56361. settings$3.zoom.min = this.state.range.min;
  56362. settings$3.zoom.enabled = true;
  56363. settings$3.zoom.zoomToDefaultWhenToPano = false;
  56364. settings$3.highestQualityTile = true;
  56365. this.player.on('zoomTo', this.__on_zoom);
  56366. this.player.on('setSize', this.__on_size);
  56367. this.player.on('update', this.__on_update);
  56368. this.__on_zoom(this.player.zoomLevel);
  56369. this.__on_update(0, true);
  56370. return this;
  56371. }
  56372. }, {
  56373. key: "leave",
  56374. value: function leave() {
  56375. if (this.__is_enter === false) {
  56376. return;
  56377. }
  56378. this.__is_enter = false;
  56379. this.player.zoomTo(1);
  56380. settings$3.zoom.max = this.state.defaults.zoomMax;
  56381. settings$3.zoom.min = this.state.defaults.zoomMin;
  56382. settings$3.zoom.enabled = this.state.defaults.zoomEnabled;
  56383. settings$3.zoom.zoomToDefaultWhenToPano = this.state.defaults.zoomToDefaultWhenToPano;
  56384. settings$3.highestQualityTile = false;
  56385. this.player.off('zoomTo', this.__on_zoom);
  56386. this.player.off('setSize', this.__on_size);
  56387. this.player.off('update', this.__on_update);
  56388. this.player.domElement.style.top = 0;
  56389. this.player.domElement.style.height = '100%';
  56390. return this;
  56391. }
  56392. /**
  56393. *
  56394. * @param {String} type camera | scale
  56395. * @returns
  56396. */
  56397. }, {
  56398. key: "reset",
  56399. value: function reset(type) {
  56400. var _this2 = this;
  56401. if (!this.__is_enter) {
  56402. return this;
  56403. }
  56404. if (type === 'camera') {
  56405. if (this.player.mode == 'panorama') {
  56406. this.player.cameraControls.activeControl.lat = 0;
  56407. }
  56408. } else if (type == 'scale') {
  56409. var control = this.player.cameraControls.activeControl;
  56410. if (this.player.mode == 'transitioning') {
  56411. return player.once('mode.changed', function (fromMode, toMode) {
  56412. if (!_this2.__is_enter) return;
  56413. _this2.reset(type);
  56414. });
  56415. } else if (this.player.mode == 'panorama') {
  56416. this.player.zoomTo(1);
  56417. } else if (this.player.mode == 'dollhouse') {
  56418. //自己定一个target
  56419. control.target.copy(this.player.model.center); //this.onRangeChange({ value: 100 })
  56420. } else if (this.player.mode == 'floorplan') {
  56421. //自己定一个target
  56422. control.target.setX(this.player.model.center.x);
  56423. control.target.setZ(this.player.model.center.z);
  56424. control.camera.position.setX(this.player.model.center.x); //使角度归零
  56425. control.camera.position.setZ(this.player.model.center.z);
  56426. control.rotateToView(this.player.model.size, this.player.getDirection()); //再旋转
  56427. control.zoomToContain(this.player.model.size);
  56428. }
  56429. }
  56430. return this;
  56431. }
  56432. }, {
  56433. key: "scale",
  56434. value: function scale(value) {
  56435. if (!this.__is_enter) {
  56436. return this;
  56437. }
  56438. value = value > 1 ? parseInt(value) / 100 : value;
  56439. if (value < this.state.range.min) {
  56440. value = this.state.range.min;
  56441. } else if (value > this.state.range.max) {
  56442. value = this.state.range.max;
  56443. }
  56444. this.state.range.current = value;
  56445. var control = this.player.cameraControls.activeControl;
  56446. var zoomLevel = value;
  56447. if (this.player.mode == 'panorama') {
  56448. settings$3.zoom.enabled = true;
  56449. this.player.zoomTo(zoomLevel);
  56450. } else if (this.player.mode == 'dollhouse') {
  56451. var disWanted = math$2.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
  56452. control.camera.position.copy(control.target).add(this.player.getDirection().multiplyScalar(-disWanted));
  56453. } else if (this.player.mode == 'floorplan') {
  56454. var absoluteScale = control.getDefaultAbsoluteScale(this.player.model.size); //改
  56455. var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
  56456. var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
  56457. control.absoluteScale = math$2.linearClamp(zoomLevel, this.state.range.min, this.state.range.max, maxS, minS);
  56458. }
  56459. return this;
  56460. }
  56461. }, {
  56462. key: "ready",
  56463. value: function ready() {
  56464. var _this3 = this;
  56465. var deferre = Deferred$1();
  56466. if (this.__is_enter == false) {
  56467. deferre.reject('please call enter before');
  56468. } else if (this.player.mode == 'panorama') {
  56469. var timer = setInterval(function () {
  56470. if (_this3.player.currentPano && !_this3.player.flying) {
  56471. clearInterval(timer);
  56472. if (typeof _this3.state.options.beforeExport === 'function') {
  56473. _this3.state.options.beforeExport();
  56474. }
  56475. var tileSize = _this3.getTileSize();
  56476. var vec = new THREE.Vector3(0, 0, -1).applyQuaternion(_this3.player.quaternion);
  56477. var camera = _this3.player.cameraControls.activeControl.camera;
  56478. var vFov = camera.fov;
  56479. var hFov = cameraLight.getHFOVForCamera(camera, camera.aspect, 1);
  56480. var promise = _this3.player.currentPano.loadTiledPano(tileSize, vec, {
  56481. hFov,
  56482. vFov
  56483. }, !1, !1, !0);
  56484. promise.done(function () {
  56485. return deferre.resolve();
  56486. }).fail(function () {
  56487. return deferre.resolve();
  56488. });
  56489. }
  56490. }, 200);
  56491. } else {
  56492. deferre.resolve();
  56493. }
  56494. return deferre;
  56495. }
  56496. }, {
  56497. key: "export",
  56498. value: function _export(func) {
  56499. var _this4 = this;
  56500. if (typeof func !== 'function') {
  56501. return this;
  56502. }
  56503. this.ready().done( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  56504. var _this4$getViewSize, width, height, captures;
  56505. return regenerator.wrap(function _callee$(_context) {
  56506. while (1) {
  56507. switch (_context.prev = _context.next) {
  56508. case 0:
  56509. _this4$getViewSize = _this4.getViewSize(), width = _this4$getViewSize.width, height = _this4$getViewSize.height;
  56510. _context.next = 3;
  56511. return _this4.app.Camera.screenshot([{
  56512. width,
  56513. height,
  56514. name: 'capture'
  56515. }]);
  56516. case 3:
  56517. captures = _context.sent;
  56518. if (captures.length) {
  56519. func(captures[0]);
  56520. } else {
  56521. func(null);
  56522. }
  56523. if (typeof _this4.state.options.afterExport === 'function') {
  56524. _this4.state.options.afterExport();
  56525. }
  56526. case 6:
  56527. case "end":
  56528. return _context.stop();
  56529. }
  56530. }
  56531. }, _callee);
  56532. }))).fail(function () {
  56533. func(null);
  56534. if (typeof _this4.state.options.afterExport === 'function') {
  56535. _this4.state.options.afterExport();
  56536. }
  56537. });
  56538. return this;
  56539. }
  56540. /**
  56541. * 导出图片
  56542. * @param {*} filename
  56543. * @returns
  56544. */
  56545. }, {
  56546. key: "exportFile",
  56547. value: function exportFile(filename) {
  56548. this.export(function (capture) {
  56549. var url = window.URL.createObjectURL(capture.data);
  56550. var link = document.createElement('a');
  56551. link.href = url;
  56552. link.download = filename;
  56553. link.click();
  56554. });
  56555. return this;
  56556. }
  56557. /**
  56558. * 获取全景图高度
  56559. * @returns
  56560. */
  56561. }, {
  56562. key: "getMaxHeight",
  56563. value: function getMaxHeight() {
  56564. return this.app.core.get('QualityManager').tileClass == '2k' ? 4096 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 * 2 : 1024;
  56565. }
  56566. /**
  56567. * 获取单面大小
  56568. * @returns
  56569. */
  56570. }, {
  56571. key: "getTileSize",
  56572. value: function getTileSize() {
  56573. return this.app.core.get('QualityManager').tileClass == '2k' ? 2048 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 : 512;
  56574. }
  56575. }, {
  56576. key: "getViewSize",
  56577. value: function getViewSize() {
  56578. if (this.player.mode != 'panorama') {
  56579. return {
  56580. width: 1780,
  56581. height: 1000
  56582. };
  56583. }
  56584. var maxHeight = this.getMaxHeight();
  56585. var height = this.player.cameraControls.activeControl.camera.fov / 180 * maxHeight;
  56586. var width = height * this.state.scale;
  56587. var size = {
  56588. width: Math.round(width),
  56589. height: Math.round(height)
  56590. };
  56591. return size;
  56592. }
  56593. }]);
  56594. return ViewExtract;
  56595. }(tinyEmitter);
  56596. var AStart = /*#__PURE__*/function () {
  56597. function AStart() {
  56598. _classCallCheck(this, AStart);
  56599. this.panos = null;
  56600. } //
  56601. _createClass(AStart, [{
  56602. key: "getPointForPano",
  56603. value: function getPointForPano(paonId) {
  56604. return {
  56605. id: paonId,
  56606. G: 0,
  56607. position: this.panos[paonId].position,
  56608. contact: this.panos[paonId].neighbourUUIDs
  56609. };
  56610. } //返回值是数组
  56611. }, {
  56612. key: "getNeighbourUUIDs",
  56613. value: function getNeighbourUUIDs(pano) {
  56614. return pano.neighbourUUIDs;
  56615. }
  56616. }, {
  56617. key: "searchRoad",
  56618. value: function searchRoad(panos, startPanoId, endPanoId) {
  56619. try {
  56620. this.panos = panos;
  56621. if (startPanoId == endPanoId) {
  56622. console.log('点击的点和当前点是同一个点');
  56623. return null;
  56624. }
  56625. var startPoint = this.getPointForPano(startPanoId); //如果startPano与endPano互为邻居,则返回
  56626. if (startPoint.contact.indexOf(endPanoId) > -1) {
  56627. //return [startPanoId, endPanoId]
  56628. return [endPanoId];
  56629. }
  56630. var endPoint = this.getPointForPano(endPanoId);
  56631. var openList = [],
  56632. //开启列表
  56633. closeList = []; //关闭列表
  56634. var result = []; //结果数组
  56635. var result_index; //结果数组在开启列表中的序号
  56636. //把当前点加入到开启列表中,并且G是0
  56637. openList.push({
  56638. id: startPanoId,
  56639. G: 0,
  56640. position: startPoint.position,
  56641. contact: startPoint.contact
  56642. }); //把当前点加入到开启列表中,并且G是0
  56643. do {
  56644. var currentPoint = openList.pop();
  56645. closeList.push(currentPoint);
  56646. if (closeList.length > 10000) {
  56647. console.log('错误过渡路径:', closeList.length);
  56648. return null;
  56649. }
  56650. var neighPointIds = [];
  56651. var _point = this.getPointForPano(currentPoint.id);
  56652. neighPointIds = _point.contact;
  56653. for (var i = 0; i < neighPointIds.length; ++i) {
  56654. var neighPointId = neighPointIds[i];
  56655. var neighPoint = this.getPointForPano(neighPointId);
  56656. if (this.existList(neighPoint, closeList) != -1) {
  56657. continue;
  56658. }
  56659. neighPoint.id = neighPointId; //g 到父节点的位置
  56660. var g = currentPoint.G + this.getDistance(currentPoint.position, neighPoint.position);
  56661. if (this.existList(neighPoint, openList) == -1) {
  56662. //如果不在开启列表中
  56663. neighPoint['H'] = this.getDistance(endPoint.position, neighPoint.position);
  56664. neighPoint['G'] = g;
  56665. neighPoint['F'] = neighPoint.H + neighPoint.G;
  56666. neighPoint['parent'] = currentPoint;
  56667. openList.push(neighPoint);
  56668. } else {
  56669. //存在在开启列表中,比较目前的g值和之前的g的大小
  56670. var index = this.existList(neighPoint, openList); //如果当前点的g更小
  56671. if (g < openList[index].G) {
  56672. openList[index].parent = currentPoint;
  56673. openList[index].G = g;
  56674. openList[index].F = g + openList[index].H;
  56675. }
  56676. }
  56677. } //如果开启列表空了,没有通路,结果为空
  56678. if (openList.length == 0) {
  56679. break;
  56680. }
  56681. openList.sort(this.sortF); //这一步是为了循环回去的时候,找出 F 值最小的, 将它从 "开启列表" 中移掉
  56682. } while ((result_index = this.existList(endPoint, openList)) == -1); //判断结果列表是否为空
  56683. var currentObj;
  56684. if (typeof result_index == 'undefined' || result_index == -1) {
  56685. result = [];
  56686. } else {
  56687. currentObj = openList[result_index];
  56688. do {
  56689. //把路劲节点添加到result当中
  56690. result.unshift(currentObj.id);
  56691. currentObj = currentObj.parent;
  56692. if (!currentObj) {
  56693. break;
  56694. }
  56695. } while (result.length < 50 && currentObj.contact.indexOf(startPanoId) < 0);
  56696. }
  56697. if (result.length > 50) {
  56698. console.log('错误过渡路径:' + result); // debugger;
  56699. return null;
  56700. }
  56701. if (currentObj) {
  56702. result.unshift(currentObj.id);
  56703. } //result.unshift(startPanoId)
  56704. console.log('path-end' + result);
  56705. return result;
  56706. } catch (error) {
  56707. console.error('searchRoad', error);
  56708. return [];
  56709. }
  56710. } //用F值对数组排序
  56711. }, {
  56712. key: "sortF",
  56713. value: function sortF(a, b) {
  56714. return b.F - a.F;
  56715. } //判断点是否存在在列表中,是的话返回的是序列号
  56716. }, {
  56717. key: "existList",
  56718. value: function existList(point, list) {
  56719. for (var i = 0; i < list.length; ++i) {
  56720. if (point.id == list[i].id) {
  56721. return i;
  56722. }
  56723. }
  56724. return -1;
  56725. }
  56726. }, {
  56727. key: "getDistance",
  56728. value: function getDistance(position1, position2) {
  56729. return Math.sqrt((position1.x - position2.x) * (position1.x - position2.x) + (position1.y - position2.y) * (position1.y - position2.y) + (position1.z - position2.z) * (position1.z - position2.z));
  56730. }
  56731. }]);
  56732. return AStart;
  56733. }();
  56734. var aStart = new AStart();
  56735. //照片制卷 已知热点位置和
  56736. var player$e, tagManager;
  56737. var sideBoundPoints$1 = [[-1, 1], [-0.9, 1], [-0.8, 1], [-0.7, 1], [-0.6, 1], [-0.5, 1], [-0.4, 1], [-0.3, 1], [-0.2, 1], [-0.1, 1], [-0, 1], [0.1, 1], [0.2, 1], [0.3, 1], [0.4, 1], [0.5, 1], [0.6, 1], [0.7, 1], [0.8, 1], [0.9, 1], [1, 1], [1, 0.9], [1, 0.8], [1, 0.7], [1, 0.6], [1, 0.5], [1, 0.4], [1, 0.3], [1, 0.2], [1, 0.1], [1, 0], [1, 0], [1, -0.1], [1, -0.2], [1, -0.3], [1, -0.4], [1, -0.5], [1, -0.6], [1, -0.7], [1, -0.8], [1, -0.9]
  56738. /* [1,-1],
  56739. [0.9,-1],[0.8,-1],[0.7,-1],[0.6,-1],[0.5,-1],[0.4,-1],[0.3,-1],[0.2,-1],[0.1,-1],[0,-1],
  56740. [-0.1,-1] */
  56741. ];
  56742. for (var i$1 = 0, len$1 = sideBoundPoints$1.length; i$1 < len$1; i$1++) {
  56743. sideBoundPoints$1.push([-sideBoundPoints$1[i$1][0], -sideBoundPoints$1[i$1][1]]);
  56744. }
  56745. var canvasRes$1 = new THREE.Vector2(1024, 512); //const snapResolution = new THREE.Vector2(1.78*500, 500) //5671*3186
  56746. var snapAspect$1 = 1.78; //和截图页面实际会有一点偏差
  56747. var imgResolution$1 = new THREE.Vector2(4096, 2048); // (8192,4096)
  56748. var RouteSnap = {
  56749. //deferred : Deferred(),
  56750. init(app) {
  56751. if (this.inited) return true;
  56752. this.app = app;
  56753. player$e = app.core.get('Player');
  56754. tagManager = app.TagManager;
  56755. if (!tagManager.tag3dInited) {
  56756. return;
  56757. }
  56758. this.camera = player$e.camera.clone();
  56759. this.camera.aspect = snapAspect$1;
  56760. this.camera.updateProjectionMatrix();
  56761. window.testSnap = this;
  56762. this.showPanoRenderArea(); //this.deferred.resolve()
  56763. this.inited = true;
  56764. return true;
  56765. },
  56766. generateAll(app) {
  56767. var _this = this;
  56768. /* if(!this.inited){
  56769. return this.deferred.then(()=>{
  56770. this.generateAll( )
  56771. })
  56772. } */
  56773. if (!this.init(app)) return tagManager.on('tag3dInited', function () {
  56774. _this.generateAll(app);
  56775. });
  56776. var sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(0.08, 4, 4), new THREE.MeshBasicMaterial({
  56777. color: '#f11' //depthTest:false, transparent:true
  56778. }));
  56779. sphere.renderOrder = 100;
  56780. app.core.get('SceneRenderer').scene.add(sphere);
  56781. var doorPos = app.store.getValue('metadata').enterDoor;
  56782. if (!doorPos) {
  56783. alert('没有入户门!enterDoor, 使用自定义的');
  56784. var defaultDoor = {
  56785. 'SG-hx-kgqfd2wuVld': {
  56786. "x": 4.430859088897705,
  56787. "y": -0.04475339502096176,
  56788. "z": 1.170697569847107
  56789. },
  56790. 'SG-hx-7R336wSsXwL': {
  56791. "x": -1.8618323213679517,
  56792. "y": -1.5661438582778084,
  56793. "z": 7.593649473830825
  56794. }
  56795. };
  56796. debugger;
  56797. doorPos = new THREE.Vector3().copy(defaultDoor[this.app.config.num] || {
  56798. "x": 0,
  56799. "y": 0,
  56800. "z": 0
  56801. });
  56802. }
  56803. sphere.position.copy(doorPos);
  56804. window.sphere_ = sphere;
  56805. var list = tagManager.tag3ds.map(function (tag) {
  56806. return {
  56807. tag,
  56808. snap: _this.generate(tag, doorPos)
  56809. };
  56810. });
  56811. console.error('snap list---', list);
  56812. },
  56813. generate(tag, doorPos) {
  56814. var panoStart = tagManager.findBestPanoForWatching(tag);
  56815. var panoEnd = player$e.model.panos.findClosest(doorPos);
  56816. var route = this.findRoute(panoStart, panoEnd);
  56817. var list = this.findTurnPanos(route);
  56818. console.log('拐点', list); //let tagSnap = this.getSnapCorners(panoStart, tag.position)
  56819. //let cornerList = [tagSnap]
  56820. var cornerList = [];
  56821. for (var _i = 0, _len = list.length; _i < _len; _i++) {
  56822. cornerList.push(this.getSnapCorners(list[_i], _i == 0 ? tag.position : list[_i - 1].position));
  56823. cornerList.push(this.getSnapCorners(list[_i], _i == _len - 1 ? doorPos : list[_i + 1].position));
  56824. } //console.error('cornerList',cornerList)
  56825. return cornerList;
  56826. },
  56827. findRoute(panoStart, panoEnd) {
  56828. var panos = aStart.searchRoad(player$e.model.panos.index, panoStart.id, panoEnd.id) || [];
  56829. return [panoStart.id].concat(panos);
  56830. },
  56831. findTurnPanos(panos) {
  56832. var turnPanos = [panos[0]];
  56833. for (var _i2 = 0, _len2 = panos.length; _i2 < _len2; _i2++) {
  56834. var last = player$e.model.panos.index[turnPanos[turnPanos.length - 1]]; //上次的拐点
  56835. if (!last.neighbourPanos[panos[_i2]]) {
  56836. turnPanos.push(panos[_i2 - 1]); //前一个是拐点
  56837. }
  56838. }
  56839. if (turnPanos[turnPanos.length - 1] != panos[panos.length - 1]) {
  56840. //加入最后一个点
  56841. turnPanos.push(panos[panos.length - 1]);
  56842. }
  56843. return turnPanos.map(function (e) {
  56844. return player$e.model.panos.get(e);
  56845. });
  56846. /* let list = [], vec1 = new THREE.Vector3, vec2 = new THREE.Vector3
  56847. for(let i=0,len=turnPanos.length; i<len;i++){
  56848. let last = turnPanos[i-1]
  56849. let next = turnPanos[i+1]
  56850. vec1.quaternion
  56851. }
  56852. return list */
  56853. },
  56854. getSnapCorners(pano, target) {
  56855. var _this2 = this;
  56856. //得到四个角在全景图的像素坐标
  56857. //假定相机的aspect刚好等于snapAspect
  56858. //该方法需要先让相机在对应位置,然后得到屏幕所显示的完整截图
  56859. player$e.cameraControls.activeControl.camera;
  56860. this.camera.position.copy(pano.position);
  56861. this.camera.lookAt(target);
  56862. this.camera.updateMatrixWorld();
  56863. var corners_ = [[-1, 1], [1, 1], [1, -1], [-1, -1]]; //从左上开始顺时针的四个角
  56864. var corners = corners_.map(function (mouse) {
  56865. var point = new THREE.Vector3(mouse[0], mouse[1], -1).unproject(_this2.camera); //let dir = new THREE.Vector3().subVectors(point, pano.position)
  56866. var dirInPano = math$2.getNormalDir(point, pano);
  56867. return math$2.getUVfromDir(dirInPano).multiply(imgResolution$1);
  56868. });
  56869. return {
  56870. panoId: pano.id,
  56871. corners
  56872. };
  56873. },
  56874. initPanoVisible() {},
  56875. getImgUrl(id) {
  56876. return "http://192.168.0.125:1804/oss/scene_view_data/SG-hx-fR7Wnyo2lI8/images/pan/high/0.jpg?_=3";
  56877. },
  56878. showPanoRenderArea() {
  56879. var _this3 = this;
  56880. var pano = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : player$e.currentPano;
  56881. //勾勒出当前视口在全景图上的范围
  56882. if (!this.imgReview) {
  56883. var panoImgReview = document.createElement('div');
  56884. panoImgReview.id = 'panoImgReview';
  56885. document.querySelector('body').appendChild(panoImgReview);
  56886. panoImgReview.innerHTML = "\n <img id=\"img\" ></img>\n <button> \u70B9\u51FB\u5237\u65B0 </button>\n <div id=\"upper\" class='full'>\n <canvas class='full'></canvas> \n </div> \n "; //&lt; &gt;
  56887. var style = document.createElement('style');
  56888. style.type = 'text/css';
  56889. style.textContent = "\n #panoImgReview{\n position: fixed;\n z-index: 30000;\n width: 40%;\n min-width: 500px;\n top: 0;\n border: 2px solid white; \n }\n button{ \n width: 41px;\n height: 41px;\n position: absolute;\n background: #ffffff; \n font-size: 12px;\n }\n img{\n width: 100%;\n }\n .full{\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n }\n \n /* div#cursor{\n position: absolute;\n width: 5px;\n height: 5px;\n background: #f00;\n left: 10%;\n top: 100%;\n transform: translate(-50%, -50%);\n } */\n ";
  56890. document.head.appendChild(style);
  56891. this.imgReview = panoImgReview;
  56892. var btn = this.imgReview.querySelector('button');
  56893. btn.addEventListener('click', function () {
  56894. _this3.showPanoRenderArea();
  56895. });
  56896. var _canvasRes = new THREE.Vector2(1024, 512);
  56897. var canvas = this.imgReview.querySelector('canvas');
  56898. canvas.width = _canvasRes.x;
  56899. canvas.height = _canvasRes.y;
  56900. this.ctx = canvas.getContext('2d');
  56901. this.ctx.strokeStyle = 'rgb(255,50,200)';
  56902. this.ctx.fillStyle = 'rgb(50,40,250)';
  56903. var r = imgResolution$1.x / _canvasRes.x;
  56904. this.showCoordPoint = function (coords, clear) {
  56905. //输入给算法的坐标
  56906. clear && _this3.ctx.clearRect(0, 0, _canvasRes.x, _canvasRes.y);
  56907. var pointSize = 14;
  56908. coords.forEach(function (coord) {
  56909. _this3.ctx.fillRect(coord.x / r - pointSize / 2, coord.y / r - pointSize / 2, pointSize, pointSize); // 画一个点
  56910. });
  56911. };
  56912. }
  56913. this.imgReview.querySelector('img').src = pano.getCubemapUrls('high');
  56914. var cameraReal = player$e.cameraControls.activeControl.camera; //创建屏幕四边若干序列点
  56915. var coords = sideBoundPoints$1.map(function (mouse) {
  56916. var point = new THREE.Vector3(mouse[0], mouse[1], -1).unproject(cameraReal); //let dir = new THREE.Vector3().subVectors(point, pano.position)
  56917. var dirInPano = math$2.getNormalDir(point, pano);
  56918. return math$2.getUVfromDir(dirInPano).multiply(canvasRes$1);
  56919. });
  56920. var ctx = this.ctx;
  56921. ctx.clearRect(0, 0, canvasRes$1.x, canvasRes$1.y);
  56922. ctx.lineWidth = 5;
  56923. ctx.beginPath();
  56924. ctx.moveTo(coords[0].x, coords[0].y);
  56925. for (var _i3 = 1, _len3 = coords.length; _i3 < _len3; _i3++) {
  56926. ctx.lineTo(coords[_i3].x, coords[_i3].y);
  56927. }
  56928. ctx.closePath(); // 闭合路径,回到起点
  56929. //ctx.fill();
  56930. ctx.stroke();
  56931. }
  56932. };
  56933. /*
  56934. let math_ = {
  56935. getUVfromDir(dir) {
  56936. //获取UV 同shader里的计算
  56937. var dir = dir.clone()
  56938. dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
  56939. var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
  56940. var ty = Math.acos(dir.y) / Math.PI
  56941. return new THREE.Vector2( tx, ty )
  56942. //理想状态下tx相同
  56943. },
  56944. crossRight(vec3, matrix) {//似乎是只取旋转。当年不知道怎么想到这函数的- -
  56945. var e = matrix.elements
  56946. var v = new THREE.Vector3()
  56947. v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
  56948. v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
  56949. v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
  56950. return v
  56951. },
  56952. getNormalDir(dir, currentPano) {
  56953. if (currentPano.tiled) {
  56954. var matrixWorld = currentPano.rot90Matrix.clone()
  56955. } else {
  56956. var matrixWorld = currentPano.matrixWorld.clone()
  56957. }
  56958. dir = this.crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
  56959. dir.normalize()
  56960. return dir
  56961. },
  56962. getQuaByAim(aim, center = new THREE.Vector3() ) {
  56963. //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
  56964. var _ = (new THREE.Matrix4).lookAt(center, aim, new THREE.Vector3(0,1,0));
  56965. var aimQua = (new THREE.Quaternion).setFromRotationMatrix(_);
  56966. return aimQua
  56967. }
  56968. } */
  56969. //还要对tag截一张图 所以需要我这加载tag,初始化tag, 然后focus
  56970. //入户门可能还要算点位
  56971. /*
  56972. 视图的mouse 左下角是(-1,-1)
  56973. */
  56974. /* 全景图 http://192.168.0.125:1804/oss/scene_view_data/SG-hx-fR7Wnyo2lI8/images/pan/high/0.jpg?_=3
  56975. see getCubemapUrls
  56976. */
  56977. /*
  56978. 在console界面输出当前点位屏幕四个角在全景图上的像素坐标
  56979. let getUVfromDir = function(dir) {
  56980. //获取UV 同shader里的计算
  56981. var dir = dir.clone()
  56982. dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
  56983. var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
  56984. var ty = Math.acos(dir.y) / Math.PI
  56985. return new THREE.Vector2( tx, ty )
  56986. //理想状态下tx相同
  56987. }
  56988. let crossRight = function(vec3, matrix) {
  56989. var e = matrix.elements
  56990. var v = new THREE.Vector3()
  56991. v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
  56992. v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
  56993. v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
  56994. return v
  56995. }
  56996. let getNormalDir = function(point, currentPano) {
  56997. var dir = point.clone().sub(currentPano.position) //OA
  56998. if (supportsTiles) {
  56999. var matrixWorld = currentPano.rot90Matrix.clone() //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
  57000. } else {
  57001. var matrixWorld = currentPano.matrixWorld.clone()
  57002. }
  57003. dir = crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
  57004. dir.normalize()
  57005. return dir
  57006. }
  57007. let player = __sdk.core.get('Player')
  57008. // let dir = player.getDirection()
  57009. //let quaInv = new THREE.Quaternion().copy(player.currentPano.quaternion).invert()
  57010. // dir.applyQuaternion(quaInv)
  57011. //console.log(getUVfromDir(dir))
  57012. let camera = player.camera
  57013. let imgResolution = new THREE.Vector2(8192,4096)
  57014. let corners = [[-1,1],[1,1],[1,-1],[-1,-1]]
  57015. console.log(corners.map(mouse=>{
  57016. var point = new THREE.Vector3(mouse[0],mouse[1],-1).unproject( camera)
  57017. let dir = getNormalDir(point, player.currentPano)
  57018. return getUVfromDir(dir).multiply(imgResolution)
  57019. }))
  57020. //当全景图不旋转时,得到的框 y一样,x不一样
  57021. =====ver2=====
  57022. 根据给定的fov:
  57023. 得到的结果不对! 舍弃
  57024. let getQuaByAim = function(aim, center = new THREE.Vector3() ) {
  57025. //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
  57026. var _ = (new THREE.Matrix4).lookAt(center, aim, new THREE.Vector3(0,1,0));
  57027. aimQua = (new THREE.Quaternion).setFromRotationMatrix(_);
  57028. return aimQua
  57029. }
  57030. let getUVfromDir = function(dir) {
  57031. //获取UV 同shader里的计算
  57032. var dir = dir.clone()
  57033. dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
  57034. var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
  57035. var ty = Math.acos(dir.y) / Math.PI
  57036. return new THREE.Vector2( tx, ty )
  57037. //理想状态下tx相同
  57038. }
  57039. let crossRight = function(vec3, matrix) {
  57040. var e = matrix.elements
  57041. var v = new THREE.Vector3()
  57042. v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
  57043. v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
  57044. v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
  57045. return v
  57046. }
  57047. let getNormalDir = function(dir, currentPano) {
  57048. if (currentPano.tiled) {
  57049. var matrixWorld = currentPano.rot90Matrix.clone() //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
  57050. } else {
  57051. var matrixWorld = currentPano.matrixWorld.clone()
  57052. }
  57053. dir = crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
  57054. dir.normalize()
  57055. return dir
  57056. }
  57057. let player = __sdk.core.get('Player')
  57058. let camera = player.camera
  57059. let cameraReal = player.cameraControls.activeControl.camera
  57060. let imgResolution = new THREE.Vector2(8192,4096)
  57061. let vfov = THREE.MathUtils.degToRad(cameraReal.fov)
  57062. const vFovHalf = vfov / 2
  57063. const hFovHalf = Math.atan(Math.tan(vFovHalf) * cameraReal.aspect)
  57064. let viewQua = getQuaByAim(player.getDirection() )
  57065. console.log('viewQua', viewQua, camera.quaternion)
  57066. let corners = [[-1,1],[1,1],[1,-1],[-1,-1]]
  57067. console.log(corners.map(c=>{
  57068. let dir = new THREE.Vector3(0, 0, -1);
  57069. dir.applyAxisAngle(new THREE.Vector3(1, 0, 0), vFovHalf * c[1]);
  57070. dir.applyAxisAngle(new THREE.Vector3(0, 1, 0), hFovHalf * -c[0]);//得到相机不旋转时该偏移角度的方向
  57071. dir.applyQuaternion(viewQua)
  57072. let dirInPano = getNormalDir(dir, player.currentPano )
  57073. return getUVfromDir(dirInPano).multiply(imgResolution)
  57074. }))
  57075. ========
  57076. 问题:入户门如何指定? 算法是否能给出完全遮挡的漫游点信息,甚至给出了后续还是可能要模型
  57077. 现在加载不了那些包
  57078. */
  57079. 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); }; }
  57080. 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; } }
  57081. var Camera = /*#__PURE__*/function (_Emiter) {
  57082. _inherits(Camera, _Emiter);
  57083. var _super = _createSuper$H(Camera);
  57084. function Camera(app) {
  57085. var _this;
  57086. _classCallCheck(this, Camera);
  57087. _this = _super.call(this);
  57088. _this.adjustControlAngel = function (target, quaternion) {
  57089. var player = this.app.core.get('Player'); //console.log("adjustControlAngel")
  57090. if (player.mode == 'panorama') {
  57091. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion || player.quaternion).add(player.position);
  57092. this.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
  57093. } else {
  57094. //专业录屏需要
  57095. if (!target) return;
  57096. this.cameraControls.activeControl && player.cameraControls.activeControl.target.copy(target);
  57097. }
  57098. };
  57099. _this.app = app;
  57100. _this.app.Scene.on('loaded', function () {
  57101. var player = _this.app.core.get('Player'); // 漫游点选择事件
  57102. player.on(PlayerEvents.PanoChosen, function (pano) {
  57103. _this.emit(PlayerEvents.PanoChosen, pano);
  57104. }); // 漫游点开始过渡事件
  57105. player.on(PlayerEvents.FlyingStarted, function (params) {
  57106. _this.emit(PlayerEvents.FlyingStarted, params);
  57107. }); // 漫游点结束过渡事件
  57108. player.on(PlayerEvents.FlyingEnded, function (params) {
  57109. _this.emit(PlayerEvents.FlyingEnded, params);
  57110. }); // 旋转
  57111. player.on(PlayerEvents.Rotate, function (params) {
  57112. _this.emit(PlayerEvents.Rotate, params);
  57113. }); // 终止旋转
  57114. player.on(PlayerEvents.EndRotation, function (params) {
  57115. _this.emit(PlayerEvents.EndRotation, params);
  57116. }); // 鼠标滚动
  57117. player.on(PlayerEvents.Zoom, function (params) {
  57118. _this.emit(PlayerEvents.Zoom, params);
  57119. }); // 移动模型
  57120. player.on(PlayerEvents.MoveModel, function (params) {
  57121. _this.emit(PlayerEvents.MoveModel, params);
  57122. }); // 模式切换
  57123. player.on(PlayerEvents.ModeChanging, function (fromMode, toMode) {
  57124. return _this.emit(PlayerEvents.ModeChanging, {
  57125. fromMode,
  57126. toMode
  57127. });
  57128. });
  57129. var model = _this.app.core.get('Player').model;
  57130. model.on('floor.changed', function (floor, mode, oldFloor) {
  57131. _this.emit('floor.changed', {
  57132. toMode: mode,
  57133. floorIndex: floor.floorIndex,
  57134. allVisible: model.allFloorsVisible
  57135. });
  57136. });
  57137. }); //if(!app.config.isRouteSnap){
  57138. _this.monitor = new Monitor(app);
  57139. _this.extract = new ViewExtract(app); //}
  57140. return _this;
  57141. }
  57142. _createClass(Camera, [{
  57143. key: "mode",
  57144. get: function get() {
  57145. return this.app.core.get('Player').mode;
  57146. }
  57147. }, {
  57148. key: "locked",
  57149. get: function get() {
  57150. return this.app.core.get('Player').locked;
  57151. }
  57152. /**
  57153. * 判断当时点位是否有球幕视频
  57154. */
  57155. }, {
  57156. key: "isCurrentPanoHasVideo",
  57157. get: function get() {
  57158. return this.app.core.get('Player').currentPano.hasVideo;
  57159. }
  57160. }, {
  57161. key: "panorama",
  57162. value: function panorama() {
  57163. if (!this.app.Scene.ready) {
  57164. return Promise.resolve();
  57165. }
  57166. return this.app.core.get('Player').insideMode();
  57167. }
  57168. }, {
  57169. key: "floorplan",
  57170. value: function floorplan() {
  57171. var deferred = Deferred$1();
  57172. this.app.core.get('Player').flyToNewMode({
  57173. mode: Viewmode$1.FLOORPLAN
  57174. }, deferred);
  57175. return deferred;
  57176. }
  57177. }, {
  57178. key: "dollhouse",
  57179. value: function dollhouse() {
  57180. var deferred = Deferred$1();
  57181. return this.app.core.get('Player').flyToNewMode({
  57182. mode: Viewmode$1.DOLLHOUSE
  57183. }, deferred);
  57184. }
  57185. }, {
  57186. key: "vr",
  57187. value: function vr() {
  57188. var player = this.app.core.get('Player');
  57189. player.vrEnabled = !player.vrEnabled; //提前标记
  57190. return player.flyToMode('panorama', function () {
  57191. return player.vrModeChange();
  57192. });
  57193. }
  57194. }, {
  57195. key: "zoom",
  57196. value: function zoom(zoomLevel) {
  57197. this.app.core.get('Player').zoomTo(zoomLevel);
  57198. }
  57199. }, {
  57200. key: "rotate",
  57201. value: function rotate(data) {
  57202. var _this2 = this;
  57203. //{"quaternion":{"_x":-0.0030889924058959475,"_y":-0.7194824153023747,"_z":-0.003200125539693273,"_w":0.6944964156805331},"mode":"panorama","currentPanoId":"6",rotationSpeed: {x: 59.48871572048137, y: -2.0739152478003122}}
  57204. var player = this.app.core.get('Player');
  57205. function checkSamePano(data, player) {
  57206. if (data.mode == player.mode) {
  57207. //漫游模式情况下,还需要考虑当前漫游点是否对的上
  57208. if (data.mode == Viewmode$1.PANORAMA) {
  57209. if (data.currentPanoId == player.currentPano.id) {
  57210. return true;
  57211. }
  57212. }
  57213. }
  57214. return false;
  57215. }
  57216. var flag = checkSamePano(data, player);
  57217. if (flag) {
  57218. player.cameraControls.activeControl.locked = true;
  57219. player.cameraControls.activeControl.camera.quaternion.set(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  57220. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(player.cameraControls.activeControl.camera.quaternion).add(player.cameraControls.activeControl.camera.position);
  57221. player.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
  57222. if (data.rotationSpeed) {
  57223. setTimeout(function () {
  57224. _this2.rotateEnd(data);
  57225. }, 100);
  57226. }
  57227. }
  57228. }
  57229. }, {
  57230. key: "rotateEnd",
  57231. value: function rotateEnd(data) {
  57232. var player = this.app.core.get('Player');
  57233. player.cameraControls.activeControl.locked = false;
  57234. if (data.rotationSpeed) {
  57235. player.cameraControls.activeControl.rotationSpeed = new THREE.Vector2(data.rotationSpeed.x, data.rotationSpeed.y);
  57236. }
  57237. }
  57238. }, {
  57239. key: "getPose",
  57240. value: function getPose() {
  57241. var player = this.app.core.get('Player');
  57242. return JSON.parse(JSON.stringify({
  57243. mode: player.mode,
  57244. position: player.position,
  57245. quaternion: player.quaternion,
  57246. zoomLevel: player.zoomLevel,
  57247. //or fov, baseFov...
  57248. panoId: player.currentPano && player.currentPano.id,
  57249. currentScale: player.cameraControls.controls.floorplan.currentScale,
  57250. //when floorplan
  57251. modeTran: player.modeTran,
  57252. flying: player.flying,
  57253. nextPano: null
  57254. }));
  57255. }
  57256. /**
  57257. * 获取当前视角,转为URL参数
  57258. * @returns
  57259. */
  57260. }, {
  57261. key: "getPoseUrlParams",
  57262. value: function getPoseUrlParams() {
  57263. var getInfo = function getInfo(info) {
  57264. return "pose=pano:".concat(info.metadata.scan_id, ",qua:").concat(math$2.toPrecision(info.metadata.camera_quaternion.toArray(), 4));
  57265. };
  57266. return getInfo(this.app.core.get('Player').getSnapAngleInfo());
  57267. }
  57268. }, {
  57269. key: "setPose",
  57270. value: function setPose(info) {
  57271. //复刻player、camera的状态(如果要瞬间变化:duration:0)
  57272. var player = this.app.core.get('Player');
  57273. if (player.flying || info.flying) return;
  57274. if (info.position && info.position instanceof THREE.Vector3 === false) {
  57275. info.position = new THREE.Vector3(info.position.x, info.position.y, info.position.z);
  57276. }
  57277. if (info.quaternion && info.quaternion instanceof THREE.Quaternion === false) {
  57278. if (info.quaternion.hasOwnProperty('_x')) {
  57279. info.quaternion = new THREE.Quaternion(info.quaternion._x, info.quaternion._y, info.quaternion._z, info.quaternion._w);
  57280. } else {
  57281. info.quaternion = new THREE.Quaternion(info.quaternion.x, info.quaternion.y, info.quaternion.z, info.quaternion.w);
  57282. }
  57283. }
  57284. var pano = player.model.panos.index[info.panoId];
  57285. var options = {
  57286. mode: info.mode,
  57287. pano: pano,
  57288. quaternion: info.quaternion,
  57289. zoomLevel: info.zoomLevel,
  57290. position: info.position,
  57291. currentScale: info.currentScale,
  57292. duration: info.duration,
  57293. aimDuration: info.duration
  57294. };
  57295. if (player.mode != info.mode) {
  57296. /* if(player.mode == 'panorama' && info.mode == 'dollhouse'){
  57297. }else if(player.mode == 'panorama' && info.mode == 'dollhouse'){
  57298. }else if(info.mode == 'panorama'){
  57299. }else{
  57300. } */
  57301. player.flyToNewMode(options);
  57302. } else {
  57303. if (info.mode == 'panorama') {
  57304. pano && player.flyToPano(options);
  57305. } else {
  57306. var control = player.cameraControls.controls[info.mode];
  57307. var camera = control.camera;
  57308. info.target && control.target.copy(info.target);
  57309. info.position && camera.position.copy(info.position);
  57310. control.offset.copy(camera.position).sub(control.target); //offset才是决定此时camera转向的关键
  57311. if (info.mode == 'floorplan') {
  57312. if (info.zoom) {
  57313. //currentScale如果是要经过convertWorkshopOrthoZoom转换
  57314. info.currentScale = MathLight.convertWorkshopOrthoZoom(info.zoom); //根据屏幕适应性缩放
  57315. }
  57316. if (info.currentScale) {
  57317. control.currentScale = control.absoluteScale = info.currentScale;
  57318. control.updateZoom();
  57319. }
  57320. }
  57321. }
  57322. }
  57323. }
  57324. }, {
  57325. key: "flyToMode",
  57326. value: function flyToMode(func, mode) {
  57327. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  57328. //飞到某个模式,然后执行某函数
  57329. options.mode = mode;
  57330. if (this.mode == mode) {
  57331. func && func();
  57332. } else {
  57333. if (mode == 'panorama' && !options.pano) {
  57334. options.pano = this.currentPano;
  57335. }
  57336. if (this.mode == 'transitioning' && this.modeTran.split('-')[1] != mode) {
  57337. //正飞向其他模式,就要先飞完再飞进来然后执行
  57338. this.afterCModeFuc.unique = function () {
  57339. this.afterCModeFuc.unique = func;
  57340. this.flyToNewMode(options); //这个fuc在trainsitioning状态下传入是无效的,所以后面得用afterCModeFuc。但是执行完afterCModeFuc,afterCModeFuc会变为null,所以里面得用fuc。。orz
  57341. }.bind(this);
  57342. } else {
  57343. this.afterCModeFuc.unique = func; //飞入后执行
  57344. /* try{ //在场景刚开始加载 control还没建好时这句可能会报错所以用try。 不用callback而用 afterCModeFuc也是这个原因,因为会有别的函数可以飞入然后执行它
  57345. this.flyToNewMode(options);
  57346. }catch(e){
  57347. console.log('FlyToMode遇到问题?')
  57348. } */
  57349. this.flyToNewMode(options);
  57350. }
  57351. }
  57352. }
  57353. }, {
  57354. key: "flyToPano",
  57355. value: function flyToPano(panoId, aim, dur) {
  57356. //如果用的是quaternion,直接用setPose更好
  57357. var defe = Deferred$1();
  57358. var pano = this.app.core.get('Player').model.panos.index[panoId];
  57359. if (pano) {
  57360. this.app.core.get('Player').flyToPano({
  57361. mode: 'panorama',
  57362. pano,
  57363. lookAtPoint: aim,
  57364. duration: dur,
  57365. aimDuration: dur,
  57366. callback: function callback() {
  57367. return defe.resolve();
  57368. }
  57369. });
  57370. } else {
  57371. defe.resolve();
  57372. }
  57373. return defe;
  57374. }
  57375. }, {
  57376. key: "flyToTag",
  57377. value: function flyToTag(tag, force) {
  57378. //xzw 飞向热点
  57379. if (objects.tagManager.activeTag && objects.tagManager.activeTag != tag) {
  57380. this.tagManager.dismissActiveTag();
  57381. }
  57382. objects.tagManager.navigatingViaTag = true; //防止在examine时在tagManager.onPanoChange中dismissExaminedTag
  57383. //setTimeout(function(){
  57384. objects.tagManager.activateTag(tag, 'examine'); //"browse"
  57385. tag.updateBoardOrient = true;
  57386. tag.examine(this, force, function () {
  57387. if (this.following) {
  57388. this.play.control.noFly = true;
  57389. }
  57390. }.bind(this)); //}.bind(this),200)
  57391. }
  57392. }, {
  57393. key: "flyToPoint",
  57394. value: function flyToPoint(aim, o) {
  57395. //飞向某一点的近处看它,类同tag.examine
  57396. var pano;
  57397. if (o.dealDistance) {
  57398. if (this.app.core.get('Player').position.distanceTo(aim) < o.dealDistance) {
  57399. pano = this.app.core.get('Player').currentPano;
  57400. }
  57401. }
  57402. if (!pano) {
  57403. pano = this.app.core.get('Player').model.panos.closestPanoTowardPoint({
  57404. point: aim,
  57405. require: o && o.require,
  57406. rank: o && o.rank
  57407. }) || this.currentPano || this.app.core.get('Player').currentPano;
  57408. }
  57409. this.app.core.get('Player').flyToPano({
  57410. pano: pano,
  57411. lookAtPoint: aim,
  57412. duration: o && o.dur,
  57413. aimDuration: o && o.aimDur
  57414. }, o && o.done);
  57415. } //录屏时panorama关键部位的最后一帧设置一下control的lon lat等属性 否则update的时候视角会被恢复
  57416. }, {
  57417. key: "setCompassDisplay",
  57418. value:
  57419. /**
  57420. * 设置指南针是否可见
  57421. */
  57422. function setCompassDisplay(visible, force) {
  57423. this.app.core.get('Player').compass.setDisplay(visible, force);
  57424. }
  57425. /**
  57426. * 获取截图信息
  57427. * @returns
  57428. */
  57429. }, {
  57430. key: "getScreenshotInfo",
  57431. value: function getScreenshotInfo() {
  57432. var getInfo = function getInfo(info) {
  57433. // 转化得到和初始视角相关的所有信息
  57434. return {
  57435. camera: {
  57436. quaternion: math$2.toPrecision(info.metadata.camera_quaternion.toArray(), 4),
  57437. zoom: info.metadata.ortho_zoom || -1
  57438. },
  57439. mode: info.metadata.camera_mode || 0,
  57440. pano: info.metadata.scan_id || '',
  57441. lon: info.metadata.lon,
  57442. //兼容旧版
  57443. lat: info.metadata.lat
  57444. };
  57445. };
  57446. var info = getInfo(this.app.core.get('Player').getSnapAngleInfo());
  57447. this.app.core.get('Scene').firstView.updateByEntry(info, this.app.core.get('Player').model.panos);
  57448. return info;
  57449. }
  57450. }, {
  57451. key: "lock",
  57452. value: function lock() {
  57453. var player = this.app.core.get('Player');
  57454. player.locked = true;
  57455. }
  57456. }, {
  57457. key: "unlock",
  57458. value: function unlock() {
  57459. var player = this.app.core.get('Player');
  57460. player.locked = false;
  57461. }
  57462. }, {
  57463. key: "autoRotate",
  57464. value: function autoRotate(isRotate) {
  57465. var speed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.1;
  57466. var control = this.app.core.get('Player').cameraControls.activeControl;
  57467. var mode = this.app.core.get('Player').mode;
  57468. if (isRotate) {
  57469. // 开始
  57470. mode == 'dollhouse' && (control.autoRotateSpeed = speed * 10, control.autoRotate = true);
  57471. mode == 'panorama' && control.startRotating(speed, 0);
  57472. } else {
  57473. // 暂停
  57474. mode == 'dollhouse' && (control.autoRotate = false);
  57475. mode == 'panorama' && control.stopRotating(true);
  57476. }
  57477. }
  57478. /**
  57479. * 截图
  57480. * @param {*} options
  57481. * @returns
  57482. */
  57483. }, {
  57484. key: "screenshot",
  57485. value: function screenshot() {
  57486. var _this3 = this;
  57487. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  57488. var toBlob = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  57489. var prop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  57490. if (!options.length) {
  57491. options = [{
  57492. width: 2048,
  57493. height: 1024,
  57494. name: '2k'
  57495. }, {
  57496. width: 1024,
  57497. height: 512,
  57498. name: '1k'
  57499. }, {
  57500. width: 128,
  57501. height: 128,
  57502. name: '128'
  57503. }];
  57504. }
  57505. return new Promise(function (resolve) {
  57506. var _done = options.length;
  57507. var result = [];
  57508. var player = _this3.app.core.get('Player');
  57509. var timer = setInterval(function () {
  57510. if (player.path && player.path.currentPanoMarker) {
  57511. clearInterval(timer);
  57512. _this3.app.core.get('Screenshot').capture(Object.assign({
  57513. tasks: {
  57514. unFish: options
  57515. },
  57516. snapshotTopview: true,
  57517. notHideTags: true,
  57518. done: function done(data, name, o) {
  57519. if (toBlob) {
  57520. result.push({
  57521. data: base64ToBlob(data),
  57522. name,
  57523. type: 'blob'
  57524. });
  57525. } else {
  57526. result.push({
  57527. data,
  57528. name,
  57529. type: 'base64'
  57530. });
  57531. }
  57532. if (result.length == _done) {
  57533. result.name = name;
  57534. result.o = o;
  57535. resolve(result);
  57536. }
  57537. }
  57538. }, prop));
  57539. }
  57540. }, 50);
  57541. });
  57542. }
  57543. }, {
  57544. key: "screenshot2",
  57545. value: function screenshot2() {
  57546. var sceneRenderer = this.app.core.get('SceneRenderer');
  57547. var link = document.createElement('a');
  57548. var canvas = sceneRenderer.renderer.domElement;
  57549. sceneRenderer.render();
  57550. link.href = canvas.toDataURL().replace('image/png', 'image/octet-stream');
  57551. link.download = 'screenshot2.png';
  57552. link.click();
  57553. }
  57554. /**
  57555. * 设置无缝过渡
  57556. * @param {*} enabled
  57557. */
  57558. }, {
  57559. key: "setFastTransition",
  57560. value: function setFastTransition(enabled) {
  57561. this.app.core.get('Player').setPanoTaskEnable(enabled);
  57562. }
  57563. }, {
  57564. key: "checkXRSupport",
  57565. value: function checkXRSupport() {
  57566. return VR$1.isSupportXR();
  57567. }
  57568. /**
  57569. * 切换模型显示面
  57570. * @param {number} side 0 => auto || 1 => DoubleSide
  57571. */
  57572. }, {
  57573. key: "setModelSide",
  57574. value: function setModelSide(side, dontFly) {
  57575. var player = this.app.core.get('Player');
  57576. if (side === 0) {
  57577. ModelSide.setSide(null);
  57578. } else if (side === 1) {
  57579. ModelSide.setSide(2);
  57580. } else {
  57581. ModelSide.setSide(side);
  57582. }
  57583. player.model.setMode(player.mode
  57584. /* 'dollhouse' */
  57585. ); //update
  57586. dontFly || this.app.core.get('Player').flyToMode('dollhouse');
  57587. }
  57588. }, {
  57589. key: "routeSnapGenerate",
  57590. value: function routeSnapGenerate() {
  57591. //__sdk.TagManager
  57592. RouteSnap.generateAll(this.app);
  57593. }
  57594. }]);
  57595. return Camera;
  57596. }(tinyEmitter);
  57597. Camera.MODE = Viewmode$1;
  57598. 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); }; }
  57599. 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; } }
  57600. var Decoration = /*#__PURE__*/function (_Emiter) {
  57601. _inherits(Decoration, _Emiter);
  57602. var _super = _createSuper$G(Decoration);
  57603. function Decoration(scene) {
  57604. var _this;
  57605. _classCallCheck(this, Decoration);
  57606. _this = _super.call(this);
  57607. _this.app = scene.app;
  57608. _this.edit = {};
  57609. var player;
  57610. _this.deferred = Deferred$1();
  57611. scene.on('loaded', function () {
  57612. player = _this.app.core.get('Player');
  57613. player.GLTFEditor = new GLTFAddManager(player); // GLTFEditor初始化
  57614. // 初始数据加载
  57615. var init = function init(metadata) {
  57616. metadata.boxModels && metadata.boxModels.forEach(function (data) {
  57617. player.GLTFEditor.add(data);
  57618. });
  57619. };
  57620. var metadata = _this.app.store.getValue('metadata');
  57621. if (metadata) init(metadata);else _this.app.store.on('metadata', init);
  57622. _this.deferred.resolve();
  57623. }); // 进入空间装饰模块
  57624. _this.edit.enterModule = function () {
  57625. _this.waitGLTFEditor(function () {
  57626. player.GLTFEditor.editing = true;
  57627. }, _this.edit.enterModule.bind(_assertThisInitialized(_this)));
  57628. }; // 离开空间装饰模块
  57629. _this.edit.leaveModule = function () {
  57630. player.GLTFEditor.editing = false;
  57631. }; // 仅用于新增模型
  57632. _this.edit.addGLTF = function () {
  57633. player.GLTFEditor.add();
  57634. player.modelSideManager.tempAuto(); //#45013 #45011 产品要求编辑时恢复backside
  57635. player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  57636. }; // 删除
  57637. _this.edit.deleteGLTF = function (sid) {
  57638. var gltf = player.GLTFEditor.group.children.find(function (gltf) {
  57639. return gltf.sid === sid;
  57640. });
  57641. player.GLTFEditor.delete(gltf);
  57642. }; // 选中(isEdit为true时选中加编辑)
  57643. _this.edit.focusGLTF = function (sid, isEdit) {
  57644. var gltf = player.GLTFEditor.group.children.find(function (gltf) {
  57645. return gltf.sid === sid;
  57646. });
  57647. if (isEdit) {
  57648. player.modelSideManager.tempAuto(); //#45013 #45011 产品要求编辑时恢复backside
  57649. player.GLTFEditor.select(gltf);
  57650. player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  57651. }
  57652. player.flyToPano({
  57653. pano: player.model.panos.get(gltf.panoId),
  57654. lookAtPoint: gltf.position,
  57655. checkAlone: true
  57656. });
  57657. }; // 保存(返回data和successCallBack)
  57658. _this.edit.confirmGLTFEdit = function () {
  57659. return player.GLTFEditor.save(function () {
  57660. player.modelSideManager.recover(); //恢复modelside设置
  57661. player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.showCadPlane(); // 显示户型图
  57662. });
  57663. }; // 退出
  57664. _this.edit.cancelGLTFEdit = function () {
  57665. player.GLTFEditor.unselect();
  57666. player.GLTFEditor.group.children.forEach(function (gltf) {
  57667. if (gltf.isNew) {
  57668. player.GLTFEditor.delete(gltf);
  57669. } else {
  57670. gltf.setFromInfo(gltf.info);
  57671. }
  57672. });
  57673. player.modelSideManager.recover();
  57674. player.mode === Viewmode$1.FLOORPLAN && player.model.floorplanCadImg.showCadPlane(); // 显示户型图
  57675. }; // 重置三维变换
  57676. _this.edit.resetGLTFTranform = function () {
  57677. // player.GLTFEditor.selecting.setTransformFromInfo(player.GLTFEditor.selecting.info)
  57678. player.GLTFEditor.selecting.rotation.set(0, 0, 0);
  57679. player.GLTFEditor.selecting.axisAngle = {
  57680. x: 0,
  57681. y: 0,
  57682. z: 0
  57683. };
  57684. player.GLTFEditor.selecting.scale.set(1, 1, 1);
  57685. _this.emit('Decoration.GLTF.select', player.GLTFEditor.selecting.updateInfo());
  57686. }; // 设置新的模型路径
  57687. _this.edit.setGLTFUrl = function (info) {
  57688. player.GLTFEditor.selecting.zipName = info.zipName;
  57689. player.GLTFEditor.selecting.load(info.url);
  57690. }; // 设置坐标
  57691. _this.edit.setGLTFPosition = function (key, value) {
  57692. player.GLTFEditor.selecting.position[key] = value;
  57693. }; // 设置缩放
  57694. _this.edit.setGLTFScale = function (key, value) {
  57695. player.GLTFEditor.selecting.scale[key] = value;
  57696. }; // 设置旋转
  57697. _this.edit.setGLTFRotation = function (key, value) {
  57698. player.GLTFEditor.selecting.setAxisAngle(key, THREE.MathUtils.degToRad(value)); // player.GLTFEditor.selecting.rotation[key] = THREE.MathUtils.degToRad(value)
  57699. }; // 设置模型显隐
  57700. _this.edit.setGLTFVisible = function (visi) {
  57701. player.GLTFEditor.selecting.visible = !!visi;
  57702. if (visi) {
  57703. player.model.transformControls.attach(player.GLTFEditor.selecting);
  57704. } else {
  57705. player.model.transformControls.detach();
  57706. }
  57707. }; // 变换TransformControls(0 移动、1 旋转、2 缩放)
  57708. _this.edit.switchTransformControlsMode = function (mode) {
  57709. if (parseInt(mode) == 0) mode = 'translate';
  57710. if (parseInt(mode) == 1) mode = 'rotate';
  57711. if (parseInt(mode) == 2) mode = 'scale';
  57712. player.model.transformControls.mode = mode;
  57713. };
  57714. return _this;
  57715. }
  57716. _createClass(Decoration, [{
  57717. key: "showAll",
  57718. value: function showAll() {
  57719. var _this2 = this;
  57720. this.waitGLTFEditor(function () {
  57721. var player = _this2.app.core.get('Player');
  57722. common$1.updateVisible(player.GLTFEditor.group, 'decoration', true); //player.GLTFEditor.group.visible = true
  57723. }, this.showAll.bind(this));
  57724. }
  57725. }, {
  57726. key: "hideAll",
  57727. value: function hideAll() {
  57728. var _this3 = this;
  57729. this.waitGLTFEditor(function () {
  57730. var player = _this3.app.core.get('Player');
  57731. common$1.updateVisible(player.GLTFEditor.group, 'decoration', false);
  57732. }, this.hideAll.bind(this));
  57733. } // 等待GLTFEditor
  57734. }, {
  57735. key: "waitGLTFEditor",
  57736. value: function waitGLTFEditor(func, waitFunc) {
  57737. var player = this.app.core.get('Player');
  57738. if (player && player.GLTFEditor) {
  57739. func && func();
  57740. } else {
  57741. this.deferred.then(function () {
  57742. return waitFunc();
  57743. });
  57744. }
  57745. }
  57746. }]);
  57747. return Decoration;
  57748. }(tinyEmitter);
  57749. 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); }; }
  57750. 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; } }
  57751. var global$2 = window; //----------------------复制以下内容---------------------------------
  57752. var player$d,
  57753. skyBoxTight,
  57754. meshGroup$1,
  57755. modelBound$1 = new THREE.Box3(),
  57756. ray$1 = new THREE.Raycaster(),
  57757. groundPlane$1 = new THREE.Plane(),
  57758. groundY$1,
  57759. safeBound$1,
  57760. boundConfirmed$1,
  57761. startTime$1,
  57762. boxesSolid$1 = [];
  57763. var MinBoxInitialScore = 0.68; //找不到匹配时,若box分数低于该值,不createSinglePano
  57764. var colors$1 = {
  57765. yellow: new THREE.Color(238 / 255, 217 / 255, 35 / 255),
  57766. green: new THREE.Color(39 / 255, 160 / 255, 146 / 255),
  57767. labelYellow: {
  57768. r: 238,
  57769. g: 217,
  57770. b: 35,
  57771. a: 0.5
  57772. },
  57773. labelGreen: {
  57774. r: 39,
  57775. g: 160,
  57776. b: 146,
  57777. a: 0.5
  57778. }
  57779. };
  57780. var isExt$1, isDiwei$1;
  57781. var standards$1 = {
  57782. cabinet: {
  57783. widthNormal: {
  57784. min: 0.55,
  57785. max: 1.05
  57786. /* max: 0.65 */
  57787. },
  57788. //widthNormal是不计宽还是厚度的平均宽度 //个别场景如S9yepREK8Jl 宽0.8米
  57789. height: {
  57790. min: 0.3,
  57791. max: 2.5,
  57792. standard: 2
  57793. },
  57794. closeRatio: 0.7 //数值越小越容易findRest。一般在墙上的位置不准要设置大些,扎堆放置的设置小些
  57795. },
  57796. fire: {
  57797. widthNormal: {
  57798. min: 0.12,
  57799. max: 0.16
  57800. },
  57801. height: {
  57802. min: 0.4,
  57803. max: 0.58
  57804. },
  57805. widthSame: true,
  57806. //长宽相等
  57807. closeRatio: 4,
  57808. tinyXZ: true //可以通过它近似确定地面高度
  57809. },
  57810. air: {
  57811. widthNormal: {
  57812. min: 0.35,
  57813. max: 0.7
  57814. },
  57815. width: {
  57816. min: 0.48,
  57817. max: 0.75
  57818. },
  57819. //因为总是斜着放所以范围较大
  57820. thick: {
  57821. min: 0.33,
  57822. max: 0.5
  57823. },
  57824. height: {
  57825. min: 1.2,
  57826. max: 2.2,
  57827. standard: 1.8
  57828. },
  57829. atWall: 0.8,
  57830. closeRatio: 1.1
  57831. },
  57832. airSmart: {
  57833. widthNormal: {
  57834. min: 0.35,
  57835. max: 0.7
  57836. },
  57837. width: {
  57838. min: 0.48,
  57839. max: 0.75
  57840. },
  57841. //因为总是斜着放所以范围较大
  57842. thick: {
  57843. min: 0.33,
  57844. max: 0.5
  57845. },
  57846. height: {
  57847. min: 1.2,
  57848. max: 2.2,
  57849. standard: 1.8
  57850. },
  57851. atWall: 0.8,
  57852. closeRatio: 1.1
  57853. },
  57854. 'air-hanging': {
  57855. widthNormal: {
  57856. min: 0.3,
  57857. max: 1
  57858. },
  57859. width: {
  57860. min: 0.8,
  57861. max: 1.1
  57862. },
  57863. thick: {
  57864. min: 0.2,
  57865. max: 0.3
  57866. },
  57867. height: {
  57868. min: 0.3,
  57869. max: 0.5,
  57870. standard: 0.4
  57871. },
  57872. //standard是通常出现的最高高度. 有这个值的在离地的时候直接使用该高度
  57873. bottom: {
  57874. min: 0.8,
  57875. max: 2.0
  57876. },
  57877. // 不绝对,大部分
  57878. atWall: 1,
  57879. //在墙壁的可能性
  57880. closeRatio: 1.5
  57881. },
  57882. battery: {
  57883. widthNormal: {
  57884. min: 0.45,
  57885. max: 1.35
  57886. },
  57887. width: {
  57888. min: 0.7,
  57889. max: 1.4
  57890. },
  57891. thick: {
  57892. min: 0.35,
  57893. max: 0.5
  57894. },
  57895. height: {
  57896. min: 0.3,
  57897. max: 2.5
  57898. },
  57899. //maxHeight
  57900. //有的电池很小。考虑是否追加battery-little 并且限制大电池的长宽高比例
  57901. atWall: 0.9,
  57902. closeRatio: 0.9
  57903. },
  57904. groundBar: {
  57905. widthNormal: {
  57906. min: 0.06,
  57907. max: 0.4
  57908. },
  57909. width: {
  57910. min: 0.3,
  57911. max: 0.5
  57912. },
  57913. thick: {
  57914. min: 0.05,
  57915. max: 0.08
  57916. },
  57917. height: {
  57918. min: 0.1,
  57919. max: 0.2
  57920. },
  57921. bottom: {
  57922. min: 1.2,
  57923. max: 3
  57924. },
  57925. atWall: 1,
  57926. closeRatio: 2
  57927. },
  57928. hlkcWindow: {
  57929. widthNormal: {
  57930. min: 0.08,
  57931. max: 0.5
  57932. },
  57933. width: {
  57934. min: 0.35,
  57935. max: 0.5
  57936. },
  57937. thick: {
  57938. min: 0.03,
  57939. max: 0.06
  57940. },
  57941. height: {
  57942. min: 0.35,
  57943. max: 0.5
  57944. },
  57945. bottom: {
  57946. min: 1.2,
  57947. max: 3
  57948. },
  57949. atWall: 1,
  57950. closeRatio: 2
  57951. },
  57952. electric: {
  57953. widthNormal: {
  57954. min: 0.2,
  57955. max: 0.7
  57956. },
  57957. width: {
  57958. min: 0.5,
  57959. max: 0.65
  57960. },
  57961. thick: {
  57962. min: 0.2,
  57963. max: 0.3
  57964. },
  57965. height: {
  57966. min: 0.5,
  57967. max: 1
  57968. },
  57969. //maxHeight 4GqaqNdyjGf一米高
  57970. bottom: {
  57971. min: 0.8,
  57972. max: 1.8
  57973. },
  57974. atWall: 1,
  57975. closeRatio: 2
  57976. },
  57977. monitor: {
  57978. widthNormal: {
  57979. min: 0.08,
  57980. max: 0.11
  57981. },
  57982. height: {
  57983. min: 0.1,
  57984. max: 0.2,
  57985. standard: 0.15
  57986. },
  57987. //maxHeight
  57988. bottom: {
  57989. min: 1.2,
  57990. max: 3
  57991. },
  57992. atWall: 1,
  57993. closeRatio: 4,
  57994. tiny: true //因为较小且无方向,所以近似一个点,用射线算出的位置比墙面还准,所以其最终位置可用于expandModelBound
  57995. },
  57996. rowBigBox: {
  57997. widthNormal: {
  57998. min: 0.55,
  57999. max: Infinity
  58000. },
  58001. height: {
  58002. min: 0.7,
  58003. max: 2.4,
  58004. standard: 2
  58005. }
  58006. }
  58007. /*"cabling-wall":{
  58008. },
  58009. "cabling-ceil":{
  58010. atCeil:1
  58011. } */
  58012. };
  58013. /* const typeNames = {
  58014. cabinet : 'cabinet', //标准机柜
  58015. air : 'air', //普通空调柜式
  58016. battery : 'battery', //蓄电池组
  58017. }
  58018. */
  58019. var typeNames$1 = {
  58020. fire: 'extinguisher',
  58021. //灭火器
  58022. monitor: 'surveillance_camera',
  58023. //监控摄像机 放第一个,用于继续确定边界
  58024. hlkcWindow: 'hlkc',
  58025. //馈线窗
  58026. groundBar: 'grounding_bar',
  58027. //接地排
  58028. cabinet: 'equipment_cabinet',
  58029. //标准机柜
  58030. battery: 'accumulator',
  58031. //蓄电池组
  58032. /* ac : 'ac_switchboard', //交流配电柜 //这两种合并,因为差别太小了,见QlJau21WP8G的,在全景图两侧识别的竟然一个ac一个dc
  58033. dc : 'dc_distribution', //直流配电设备 */
  58034. electric: ['ac_switchboard', 'dc_distribution'],
  58035. air: 'sdkt',
  58036. //普通空调柜式
  58037. airSmart: 'ventilation_installation' //智能通风设备
  58038. //cabling : 'cabling_rack', //单层走线架 因为在天花板的走线有点复杂,经常断开,无法确定方向所以放弃
  58039. };
  58040. var addLabel$1 = function addLabel(pos, text) {
  58041. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  58042. bgcolor = _ref.bgcolor,
  58043. a = _ref.a;
  58044. new THREE.Vector3(0, -0.2, 0);
  58045. bgcolor = bgcolor ? new THREE.Color(bgcolor) : {
  58046. r: 1,
  58047. g: 1,
  58048. b: 1
  58049. }; //let endPos = new THREE.Vector3().addVectors(pos,shift);
  58050. text instanceof Array || (text = [text]);
  58051. var lineCount = Math.round(Math.random() * 6) + 1;
  58052. var lines = [];
  58053. while (lineCount-- > 0) {
  58054. lines.push('|');
  58055. }
  58056. text = [].concat(_toConsumableArray(text), lines, ['o']);
  58057. var textMesh = new TextSprite({
  58058. text,
  58059. textColor: {
  58060. r: 0,
  58061. g: 0,
  58062. b: 0,
  58063. a: 1
  58064. },
  58065. backgroundColor: {
  58066. r: bgcolor.r * 255,
  58067. g: bgcolor.g * 255,
  58068. b: bgcolor.b * 250,
  58069. a: a || 0
  58070. },
  58071. textBorderColor: {
  58072. r: bgcolor.r * 255,
  58073. g: bgcolor.g * 255,
  58074. b: bgcolor.b * 250,
  58075. a: a || 0.9
  58076. },
  58077. textBorderThick: 2,
  58078. margin: {
  58079. x: 0,
  58080. y: 0
  58081. },
  58082. borderRadius: 0,
  58083. player: player$d,
  58084. sizeInfo: {
  58085. minSize: 90,
  58086. maxSize: 300,
  58087. nearBound: 1,
  58088. farBound: 7
  58089. }
  58090. });
  58091. textMesh.position.copy(pos); //textMesh.scale.set(0.3, 0.3, 0.3)
  58092. meshGroup$1.add(textMesh);
  58093. textMesh.sprite.position.y += textMesh.sprite.scale.y * 0.4;
  58094. return textMesh;
  58095. };
  58096. var getBoxFinalPos$1 = function getBoxFinalPos(info) {
  58097. //创建solidbox时的position
  58098. var position;
  58099. var center = getBoxPos$1(info);
  58100. if (standards$1[info.boxType].bottom) {
  58101. //悬挂
  58102. position = center;
  58103. } else {
  58104. position = center.clone().setY(groundY$1 + info.size.y / 2); //使着地
  58105. }
  58106. return position;
  58107. };
  58108. var boxGeo$1 = new THREE.BoxBufferGeometry();
  58109. var boxMat$1 = new THREE.MeshBasicMaterial({
  58110. color: colors$1.yellow,
  58111. opacity: 0.3,
  58112. transparent: true,
  58113. depthTest: false
  58114. });
  58115. var axises$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), new THREE.Vector3(-1, -1, 1)];
  58116. var traverse$1 = function traverse(info, fun) {
  58117. //忽略.infos的row 的信息
  58118. fun(info);
  58119. info.list && info.list.forEach(function (a) {
  58120. return traverse(a, fun);
  58121. });
  58122. info.mixedFrom && info.mixedFrom.forEach(function (a) {
  58123. return traverse(a, fun);
  58124. });
  58125. };
  58126. var Box$1 = /*#__PURE__*/function () {
  58127. //结果
  58128. function Box(info) {
  58129. _classCallCheck(this, Box);
  58130. //preDealBox(info)
  58131. this.setFromInfo(info);
  58132. this.buildFromData || (this.name = this.boxType + '-' + this.name);
  58133. if ((this.buildFromData || boundConfirmed$1)) this.draw();
  58134. boxesSolid$1.push(this);
  58135. }
  58136. _createClass(Box, [{
  58137. key: "setFromInfo",
  58138. value: function setFromInfo(info) {
  58139. for (var i in info) {
  58140. this[i] = info[i];
  58141. }
  58142. /* let h = info.size.y
  58143. let standardH = standards[info.boxType].height.standard
  58144. if (h > standardH) {
  58145. h = standardH + Math.log(1 + (h - standardH) / 2) //Math.log2: 以2为底的对数 ,Math.log:自然对数
  58146. info.size.y = h
  58147. } */
  58148. this.position = this.buildFromData ? this.center : getBoxFinalPos$1(this);
  58149. var bound = new THREE.Box3().setFromCenterAndSize(this.position, this.size);
  58150. this.bound = bound;
  58151. }
  58152. }, {
  58153. key: "draw",
  58154. value: function draw() {
  58155. var color = colors$1.yellow; //green //new THREE.Color().setHSL(hue, 0.9, 0.85)
  58156. this.boxHelper = new THREE.Box3Helper(this.bound, color);
  58157. this.boxHelper.material.depthTest = false; //this.boxHelper.material.opacity = 0.5
  58158. this.boxHelper.material.transparent = true;
  58159. this.boxHelper.renderOrder = 30;
  58160. /* let { warnStr, exStr } = this
  58161. warnStr && (exStr += `【${warnStr}】`) */
  58162. //this.label = addLabel(this.position, /* exStr ? [this.name, exStr] : */ this.score ? [this.name, this.score.toFixed(1)] : this.name, { bgcolor: color })
  58163. this.label = new TextSprite({
  58164. text: this.external ? [this.external.eqpName || '', this.external.eqpType || ''] : this.name,
  58165. backgroundColor: Object.assign(colors$1.labelYellow
  58166. /* labelGreen */
  58167. ),
  58168. textColor: {
  58169. r: 255,
  58170. g: 255,
  58171. b: 255,
  58172. a: 1
  58173. },
  58174. borderRadius: 15,
  58175. renderOrder: 10,
  58176. fontSize: 20,
  58177. player: player$d
  58178. });
  58179. meshGroup$1.add(this.label);
  58180. this.label.position.copy(this.position);
  58181. this.label.position.y += 0.3;
  58182. var s = 0.2;
  58183. this.label.scale.set(s, s, s);
  58184. var box = new THREE.Mesh(boxGeo$1, boxMat$1);
  58185. box.position.copy(this.position);
  58186. box.scale.copy(this.size);
  58187. box.masterBox = this;
  58188. box.name = this.name;
  58189. box.renderOrder = 20;
  58190. meshGroup$1.add(box);
  58191. this.boxMesh = box;
  58192. meshGroup$1.add(this.boxHelper);
  58193. isDiwei$1 && this.updateVisible(false, 'unhover');
  58194. }
  58195. }, {
  58196. key: "updateVisible",
  58197. value: function updateVisible(show, reason) {
  58198. common$1.updateVisible(this.boxHelper, reason, show);
  58199. common$1.updateVisible(this.label, reason, show);
  58200. common$1.updateVisible(this.boxMesh, reason, show);
  58201. }
  58202. }, {
  58203. key: "dispose",
  58204. value: function dispose() {
  58205. var index = boxesSolid$1.indexOf(this);
  58206. if (index > -1) {
  58207. boxesSolid$1.splice(index, 1);
  58208. if (boundConfirmed$1) {
  58209. this.label.sprite.material.opacity = 0.3;
  58210. this.boxHelper.material.opacity = 0.2;
  58211. this.boxMesh.removeFromParent();
  58212. }
  58213. }
  58214. }
  58215. }, {
  58216. key: "traversePair",
  58217. value: function traversePair(fun) {
  58218. traverse$1(this, fun);
  58219. }
  58220. }, {
  58221. key: "getDirection",
  58222. value: function getDirection() {
  58223. //获得正面朝向。 需要全部box都创建完再调用
  58224. var xProp = this.xProp;
  58225. var dir; //哪边pano多朝哪边
  58226. if (this.boxType == 'cabinet' && this.name.includes('row')) {
  58227. if (this.infos.rowboxs.length > 1) {
  58228. var k = this.infos.reduce(function (w, c) {
  58229. return w + c.k;
  58230. }, 0);
  58231. xProp = k > 1 ? 'width' : 'thick';
  58232. } else {
  58233. //直接使用别的多box的row的方向 ,大多数都相同(会有例外,无所谓了)
  58234. var rows = boxesSolid$1.filter(function (e) {
  58235. return e.boxType == 'cabinet' && e.name.includes('row') && e.dirQua;
  58236. });
  58237. rows.sort(function (a, b) {
  58238. return b.infos.rowboxs.length - a.infos.rowboxs.length;
  58239. });
  58240. var box = rows[0];
  58241. if (box) {
  58242. return this.dirQua = box.dirQua;
  58243. }
  58244. }
  58245. }
  58246. if (!xProp) {
  58247. //根据房间的长宽 散落的cabinet。 fire monitor
  58248. var _getBoxDirProp = getBoxDirProp$1(this, true);
  58249. _getBoxDirProp.xWidthPossible;
  58250. _getBoxDirProp.yWidthPossible;
  58251. xProp = this.xProp;
  58252. /* if(Math.abs(xWidthPossible - yWidthPossible) < 0.3){
  58253. let size = new THREE.Vector3()
  58254. safeBound.getSize(size)
  58255. xWidthPossible += (size.x - size.z) * 0.5
  58256. if(xWidthPossible > yWidthPossible){
  58257. xProp = 'width'
  58258. }
  58259. } */
  58260. }
  58261. if (xProp) {
  58262. if (!this.panosDir) getPanosDir$1(this);
  58263. if (xProp == 'width') {
  58264. if (Math.abs(this.panosDir['z+']) < Math.abs(this.panosDir['z-'])) {
  58265. //朝-z//也就是新坐标系的y
  58266. //this.dirQua='下'
  58267. dir = new THREE.Vector3(0, 1, 0);
  58268. } else {
  58269. //朝+z
  58270. //this.dirQua='上'
  58271. dir = new THREE.Vector3(0, -1, 0);
  58272. }
  58273. } else {
  58274. if (Math.abs(this.panosDir['x+']) < Math.abs(this.panosDir['x-'])) {
  58275. //朝-x
  58276. //this.dirQua='右'
  58277. dir = new THREE.Vector3(-1, 0, 0);
  58278. } else {
  58279. //朝+x
  58280. //this.dirQua='左'
  58281. dir = new THREE.Vector3(1, 0, 0);
  58282. }
  58283. }
  58284. } //addLabel(this.position, this.dirQua)
  58285. this.dirQua = convertTool.getQuaByAim(dir, new THREE.Vector3(), new THREE.Vector3(0, 0, 1)
  58286. /* new THREE.Vector3(0, 1, 0) */
  58287. );
  58288. return this.dirQua;
  58289. /*飞到俯视图查看(不旋转视图,x朝右,z朝下)。以下四个qua是四个墙壁每个墙壁上的dirQua。
  58290. _x: 0, _y: -0, _z: 1, _w: 0
  58291. _x: 0, _y: 0, _z: -0.707, _w: 0.707 _x: 0, _y: -0, _z: 0.707, _w: 0.707
  58292. x: 0, _y: 0, _z: 0, _w: 1
  58293. */
  58294. }
  58295. }, {
  58296. key: "toJson",
  58297. value: function toJson() {
  58298. var _this = this;
  58299. //转出的坐标系是z朝上的
  58300. var category = typeNames$1[this.boxType];
  58301. if (category instanceof Array) {
  58302. var scoreMap = new Map();
  58303. category = category.slice(0);
  58304. category.forEach(function (e) {
  58305. return scoreMap.set(e, 0);
  58306. }); //初始化
  58307. //判断boxType: 寻找所使用的box总分最高的boxType
  58308. var add = function add(box) {
  58309. if (!box) return;
  58310. var score = scoreMap.get(box.category) + box.score;
  58311. scoreMap.set(box.category, score);
  58312. };
  58313. this.traversePair(function (e) {
  58314. add(e.box0);
  58315. add(e.box1);
  58316. });
  58317. category = category.sort(function (a, b) {
  58318. return scoreMap.get(b) - scoreMap.get(a);
  58319. });
  58320. category = category[0]; //最高分
  58321. }
  58322. this.getDirection();
  58323. var json = {
  58324. points: axises$1.map(function (axis) {
  58325. return math$2.invertVisionVector(new THREE.Vector3().addVectors(_this.position, _this.size.clone().multiply(axis).multiplyScalar(0.5))).toArray();
  58326. }),
  58327. category,
  58328. type: this.boxType,
  58329. sid: this.name,
  58330. quaternion: this.dirQua.toArray()
  58331. };
  58332. return json;
  58333. }
  58334. }]);
  58335. return Box;
  58336. }(); // 2d坐标转3d坐标
  58337. var getDirByUV$2 = function getDirByUV(uv, pano) {
  58338. // 计算方向向量
  58339. var yaw = -uv.x * (Math.PI * 2);
  58340. var pitch = Math.PI / 2 - uv.y * Math.PI;
  58341. var dir = new THREE.Vector3();
  58342. dir.copy(Vectors$1.RIGHT).applyAxisAngle(Vectors$1.BACK, pitch).applyAxisAngle(Vectors$1.UP, yaw).applyQuaternion(pano.quaternion);
  58343. return dir;
  58344. };
  58345. var getCenterDir$2 = function getCenterDir(box) {
  58346. if (box.centerDir) return; //假设不存在在box中间拍摄的情况,所以y不会横跨两边
  58347. var bbox = box.bbox2;
  58348. var center = {
  58349. x: getBbox2center$2(bbox[0], bbox[2]),
  58350. y: (bbox[1] + bbox[3]) / 2
  58351. };
  58352. box.bbox2CenterX = center.x;
  58353. var dir = getDirByUV$2(center, box.pano);
  58354. box.centerDir = dir;
  58355. var centerTop = {
  58356. x: center.x,
  58357. y: bbox[1]
  58358. };
  58359. box.centerTopDir = getDirByUV$2(centerTop, box.pano);
  58360. var centerBtm = {
  58361. x: center.x,
  58362. y: bbox[3]
  58363. };
  58364. box.centerBtmDir = getDirByUV$2(centerBtm, box.pano);
  58365. var leftBtm = {
  58366. x: bbox[0],
  58367. y: bbox[3]
  58368. };
  58369. box.leftBtmDir = getDirByUV$2(leftBtm, box.pano);
  58370. var rightBtm = {
  58371. x: bbox[2],
  58372. y: bbox[3]
  58373. };
  58374. box.rightBtmDir = getDirByUV$2(rightBtm, box.pano);
  58375. };
  58376. var getOtherPos$1 = function getOtherPos(box) {
  58377. if (!box.boxType) return;
  58378. var config = standards$1[box.boxType];
  58379. if (!boundConfirmed$1) {
  58380. if (!config.bottom) {
  58381. ray$1.set(box.pano.position, box.centerBtmDir);
  58382. box.btmPosPredict = ray$1.ray.intersectPlane(groundPlane$1, new THREE.Vector3()); //没有的话就在空中 (部分air-hanging也会有)。 fire的这个值会较大误差,因为groundY还不确定,但不影响,因只用它射线交点的位置。
  58383. if (box.btmPosPredict) {
  58384. var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
  58385. var _standards$box$boxTyp = standards$1[box.boxType].widthNormal,
  58386. min = _standards$box$boxTyp.min,
  58387. max = _standards$box$boxTyp.max;
  58388. min = min * 0.4;
  58389. max = max * 0.4;
  58390. var minA = Math.min(Math.abs(dir2d.x), Math.abs(dir2d.y));
  58391. var depth = math$2.linearClamp(minA, 0, 1, min, max);
  58392. /* const depth = box.category == typeNames.cabinet ? 0.5 : 0.4
  58393. */
  58394. dir2d = dir2d.clone().multiplyScalar(depth);
  58395. box.btmPosPredict.x += dir2d.x;
  58396. box.btmPosPredict.z += dir2d.y; //addLabel(box.btmPosPredict,'b_'+box.category+"_"+box.sid, {bgcolor:'#6ff',a:0.1})
  58397. //box.btmPosPredict.clamp(safeBound.min, safeBound.max)
  58398. }
  58399. }
  58400. return;
  58401. }
  58402. if (!box.posAtWall && config.atWall > 0) {
  58403. //console.log(box.sid, 'getPosWall')
  58404. var shrink = config.thick ? config.thick.min : config.widthNormal.min;
  58405. ray$1.set(box.pano.position, box.centerDir);
  58406. var o = ray$1.intersectObjects([skyBoxTight]);
  58407. if (o[0]) box.posAtWall = new THREE.Vector3().addVectors(box.pano.position, box.centerDir.clone().multiplyScalar(o[0].distance - shrink)); //因墙壁不准确,所以还是尽量不用墙的位置
  58408. /* if(box.btmPos){
  58409. let wallRatio = 0.5;
  58410. if(new THREE.Vector3().subVectors(box.btmPos, box.posAtWall).setY(0).length() > 1 )wallRatio = 0.2 //可能墙壁位置不准,靠后了
  58411. box.predictCenter = new THREE.Vector3().addVectors(box.btmPos.clone().multiplyScalar(1-wallRatio), box.posAtWall.clone().multiplyScalar(wallRatio))
  58412. //box.predictCenter = new THREE.Vector3().addVectors(box.posAtWall, box.btmPos).multiplyScalar(0.5) //也许能当中心点? 虽然y会低一些
  58413. addLabel(box.predictCenter, box.sid+'-preC')
  58414. } */
  58415. }
  58416. if (!box.btmPos) {
  58417. getBoxBtm$1(box);
  58418. }
  58419. if (!box.topPos) {
  58420. getBoxTop$1(box);
  58421. }
  58422. };
  58423. var getUVs$2 = function getUVs(box, imageWidth, imageHeight) {
  58424. if (box.bbox2) return;
  58425. if (!imageWidth) {
  58426. imageWidth = global$2.boxFrame.datas[box.pano.id].imageWidth;
  58427. imageHeight = global$2.boxFrame.datas[box.pano.id].imageHeight;
  58428. }
  58429. if (imageWidth != imageWidth || imageHeight != imageHeight) {
  58430. console.log(imageWidth, imageHeight);
  58431. }
  58432. box.bbox2 = box.bbox.map(function (e, i) {
  58433. //(x1,y1,x2,y2)
  58434. return i % 2 == 0 ? e / imageWidth
  58435. /* + 0.25 */
  58436. : e / imageHeight;
  58437. });
  58438. };
  58439. var getBoxBase$1 = function getBoxBase(box, imageWidth, imageHeight) {
  58440. getBoxType$1(box);
  58441. getUVs$2(box, imageWidth, imageHeight);
  58442. getCenterDir$2(box);
  58443. getOtherPos$1(box);
  58444. };
  58445. var getBbox2Diff$1 = function getBbox2Diff(x1, x2) {
  58446. //获取x1-x2,如果x1在x2右边则为正
  58447. if (Math.abs(x1 - x2) < 0.5) return x1 - x2;else {
  58448. if (x1 > x2) x1 -= 1;else x2 -= 1;
  58449. return x1 - x2;
  58450. }
  58451. };
  58452. var getBbox2center$2 = function getBbox2center(x1, x2) {
  58453. //找中间位置
  58454. if (Math.abs(x1 - x2) > 0.5) {
  58455. //永远找小于180度的那一边
  58456. return (x1 + x2 + 1) / 2; //另外半边
  58457. } else {
  58458. return (x1 + x2) / 2;
  58459. }
  58460. };
  58461. var getBoxTop$1 = function getBoxTop(info) {
  58462. /* if(info.sid == 'pano0-11(mix4,8)'){
  58463. console.log(5)
  58464. } */
  58465. if (info.box1) {
  58466. var o2 = getIntersect2$1(info.box0.pano.position, info.box0.centerTopDir, info.box1.pano.position, info.box1.centerTopDir);
  58467. info.topPos = o2.pos3d;
  58468. info.diffHeight = o2.mid2 ? o2.mid2.distanceTo(o2.mid1) : 1;
  58469. if (info.box0.topPos && info.box1.topPos) {
  58470. info.topPos.y = (info.box0.topPos.y + info.box1.topPos.y) / 2; //原先的不准
  58471. }
  58472. } else {
  58473. //取btm上方对应的位置 ( 因为和skybox的交点会因离墙远而偏上或偏下)
  58474. var box = info.box0 || info;
  58475. var btm = box.btmPos;
  58476. if (!btm) {
  58477. btm = getBoxBtm$1(info);
  58478. }
  58479. box.topPos = btm.clone(); //xz同btm,要求y
  58480. var xDelta = btm.x - box.pano.position.x;
  58481. var zDelta = btm.z - box.pano.position.z;
  58482. var yDelta; //因为pano有旋转所以btm和top的xz其实是不一样的,所以会有误差。 故这里选择delta较大的
  58483. if (Math.abs(xDelta) < Math.abs(zDelta)) {
  58484. yDelta = zDelta * box.centerTopDir.y / box.centerTopDir.z;
  58485. /* console.log('use z', box)
  58486. if(Math.abs(xDelta)<0.1)console.error('!!!!!!!!!!!!!!!!!!!!!!! xDelta',xDelta, box.sid ) */
  58487. } else {
  58488. yDelta = xDelta * box.centerTopDir.y / box.centerTopDir.x; // console.log('use x', box)
  58489. }
  58490. box.topPos.y = yDelta + box.pano.position.y;
  58491. var minHeight =
  58492. /* info.boxType ? standards[info.boxType].height.min : box.category == typeNames.air ? 0.5 : */
  58493. standards$1[getBoxType$1(box)].height.min;
  58494. var diffH = Math.max(box.topPos.y - btm.y, minHeight);
  58495. box.topPos.y = btm.y + diffH;
  58496. info.topPos = box.topPos;
  58497. /* if (box.sid == 'pano2-1') {
  58498. addLabel(box.topPos,'t_'+box.sid,{bgcolor:'#ff4399'})
  58499. addLine(box.pano.position,box.centerTopDir, 20)
  58500. } */
  58501. }
  58502. return info.topPos;
  58503. };
  58504. var getBoxBtm$1 = function getBoxBtm(info) {
  58505. if (info.box1) {
  58506. var o2 = getIntersect2$1(info.box0.pano.position, info.box0.centerBtmDir, info.box1.pano.position, info.box1.centerBtmDir);
  58507. info.btmPos = o2.pos3d; //info.btmPos.y = (info.box0.btmPos.y + info.box1.btmPos.y)/2 //原先的不准
  58508. } else {
  58509. var box = info.box0 || info;
  58510. if (!box.btmPos) {
  58511. /*if (box.sid == 'pano0-7') {
  58512. console.log(3)
  58513. addLine(box.pano.position, box.centerBtmDir, 20)
  58514. }*/
  58515. if (!boundConfirmed$1) {
  58516. return box.btmPosPredict;
  58517. }
  58518. ray$1.set(box.pano.position, box.centerBtmDir);
  58519. var o = ray$1.intersectObjects([skyBoxTight]); //如果skybound有问题,位置就会错
  58520. box.btmPosOri = o[0].point.clone();
  58521. var depth; //缩进 //let depth = Math.abs(o[0].face.normal.y) > 0.9 ? 0.4 : -0.4
  58522. getBoxType$1(box);
  58523. var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
  58524. if (standards$1[box.boxType].thick && standards$1[box.boxType].atWall
  58525. /* box.boxType == 'battery' */
  58526. ) {
  58527. //平贴于墙上,且厚度和宽度相差较大
  58528. //注:air-hanging主要用的是posAtWall
  58529. var _standards$box$boxTyp2 = standards$1[box.boxType].widthNormal,
  58530. min = _standards$box$boxTyp2.min,
  58531. max = _standards$box$boxTyp2.max;
  58532. min = min * 0.3;
  58533. max = max * 0.5;
  58534. if (!box.xProp) getBoxDirProp$1(box);
  58535. if (box.xProp == 'width') {
  58536. depth = math$2.linearClamp(Math.abs(dir2d.x), 0, 1, min, max);
  58537. } else {
  58538. depth = math$2.linearClamp(Math.abs(dir2d.y), 0, 1, min, max);
  58539. }
  58540. } else {
  58541. var w = standards$1[box.boxType].thick || standards$1[box.boxType].widthNormal;
  58542. var w0 = (w.min + w.max) / 2;
  58543. var _min = w0 * 0.5,
  58544. _max = w0 * 0.8;
  58545. var minA = Math.min(Math.abs(box.centerBtmDir.x), Math.abs(box.centerBtmDir.z));
  58546. depth = math$2.linearClamp(minA, 0, 0.707, _min
  58547. /* 0.3 */
  58548. , _max
  58549. /* 0.5 */
  58550. ); //在45度时需要最长的距离。主要针对cabinet
  58551. }
  58552. if (Math.abs(o[0].face.normal.y) < 0.9) {
  58553. if (standards$1[box.boxType].atWall || o[0].point.y - groundY$1 > 0.3) {
  58554. //battery的识别框比较乱,有可能一个电池被识别出好几个,所以
  58555. depth *= -1; //at wall
  58556. }
  58557. }
  58558. var dir2d1 = dir2d.clone().multiplyScalar(depth);
  58559. box.btmPos = o[0].point.clone();
  58560. box.btmPos.x += dir2d1.x;
  58561. box.btmPos.z += dir2d1.y; //addLabel(box.btmPos,'b_'+box.sid,{bgcolor:'#ff4399'})
  58562. }
  58563. info.btmPos = box.btmPos;
  58564. }
  58565. return info.btmPos;
  58566. };
  58567. var getIntersect2$1 = function getIntersect2(pano0Pos, dir0, pano1Pos, dir1) {
  58568. var pos0 = new THREE.Vector3().addVectors(pano0Pos, dir0);
  58569. var pos1 = new THREE.Vector3().addVectors(pano1Pos, dir1);
  58570. var o = math$2.getLineIntersect2({
  58571. A: pano0Pos.clone(),
  58572. B: pano1Pos.clone(),
  58573. p1: pos0,
  58574. p2: pos1,
  58575. dir0,
  58576. dir1
  58577. }); //不用getLineIntersect,因为这个针对热点写的,当无交点时选用的点不是想要的
  58578. if (!o.pos3d) {
  58579. console.error('getIntersect2 no result? ?');
  58580. }
  58581. return o;
  58582. };
  58583. var getBoxPos$1 = function getBoxPos(info) {
  58584. var boxType = getBoxType$1(info);
  58585. return info.preDealRes && info.preDealRes.position || info.center || boxType && (standards$1[boxType].atWall > 0.5 && standards$1[boxType].bottom ? info.posAtWall : info.btmPos || info.btmPosPredict) || info.posAtWall;
  58586. };
  58587. var isType$1 = function isType(category, type) {
  58588. return type == category || typeNames$1[type] instanceof Array ? typeNames$1[type].includes(category) : typeNames$1[type] == category;
  58589. };
  58590. var getBoxType$1 = function getBoxType(info) {
  58591. if (info.boxType) return info.boxType;
  58592. var category = info.category || info.box0.category;
  58593. if (category == 'rowBigBox') info.boxType = 'rowBigBox';else {
  58594. var type;
  58595. if (category == 'ac_switchboard') {
  58596. console.log(1);
  58597. }
  58598. for (var i in typeNames$1) {
  58599. /* if (i == category || typeNames[i] instanceof Array ? typeNames[i].includes(category) : typeNames[i] == category) {
  58600. type = i
  58601. break //type = typeNamesReverse[type]
  58602. } */
  58603. if (isType$1(category, i)) {
  58604. type = i;
  58605. break;
  58606. }
  58607. }
  58608. /* if(type == 'ac' || type == 'dc'){
  58609. type = 'electric' //合并
  58610. } */
  58611. info.boxType = type;
  58612. }
  58613. return info.boxType;
  58614. };
  58615. /* let getBoxType = info => {
  58616. let type = info.category || info.box0.category
  58617. if (type == 'air') {
  58618. let btm = info.btmPos || info.btmPos //btmPosAtWall
  58619. if (!btm) {
  58620. btm = getBoxBtm(info)
  58621. }
  58622. if (!btm) return
  58623. let center = info.posAtWall || (info.preDealRes && info.preDealRes.position) || info.center
  58624. const s = standards['air-hanging']
  58625. if (btm.y - groundY > s.bottom.min) {
  58626. let h0 = btm.y - groundY
  58627. let h1 = (modelBound.max.y - center.y) / (modelBound.max.y - modelBound.min.y)
  58628. let h2 = center.y - btm.y
  58629. let score = h0 * 2 - h1 * 3 - h2 * 3
  58630. if (score > 0) {
  58631. type = 'air-hanging'
  58632. }
  58633. //console.error( score, h0,h1,h2, info.sid||info.name)
  58634. } //注意:如果air被遮住底部,露出的部分只有一点,还是有可能被识别成air-hanging。只能希望
  58635. //console.error( type, info.sid||info.name)
  58636. }
  58637. if (info.box0) {
  58638. info.boxType = type
  58639. //info.box1 && (info.box1.type = type) //因为box0和box1不一定匹配,所以不能直接赋值
  58640. } else {
  58641. info.type = type
  58642. }
  58643. } */
  58644. var getPanosDir$1 = function getPanosDir(info, center) {
  58645. center = center || getBoxPos$1(info);
  58646. var dirs = {
  58647. 'x+': 0,
  58648. 'x-': 0,
  58649. 'z+': 0,
  58650. 'z-': 0,
  58651. got: false
  58652. };
  58653. var getDirs = function getDirs() {
  58654. //靠墙的在它到墙之间是不会有漫游点的
  58655. if (dirs.got || !center) return;
  58656. player$d.model.panos.list.forEach(function (pano) {
  58657. var dir = new THREE.Vector3().subVectors(pano.position, center);
  58658. if (dir.x > 0) {
  58659. dirs['x+'] += dir.x;
  58660. } else {
  58661. dirs['x-'] += dir.x;
  58662. }
  58663. if (dir.z > 0) {
  58664. dirs['z+'] += dir.z;
  58665. } else {
  58666. dirs['z-'] += dir.z;
  58667. }
  58668. });
  58669. dirs.got = true;
  58670. };
  58671. getDirs();
  58672. if (info.panosDir) {
  58673. console.error('already has dir');
  58674. }
  58675. info.panosDir = dirs;
  58676. return dirs;
  58677. };
  58678. var getBoxDirProp$1 = function getBoxDirProp(info, force) {
  58679. //仅适用于方形单个房间房间,不可以是多边形、两个房间
  58680. var xProp, yProp;
  58681. if (info.name == 'pano10-8&pano12-6') {
  58682. console.log(4);
  58683. } //if (info.boxType == 'battery' || info.boxType == 'air-hanging' || info.boxType == 'air' || info.category == 'battery' || info.category == 'air') {
  58684. if (standards$1[info.boxType].atWall && standards$1[info.boxType].thick || force) {
  58685. //根据比例判断
  58686. /* let r1 = Math.abs((center.x - skyBoxTight.position.x) / (center.z - skyBoxTight.position.z))
  58687. let r2 = player.model.size.x / player.model.size.z
  58688. if(!math.closeTo(r1,r2, 0.05)){
  58689. if (r1<r2) {
  58690. ;(xProp = 'width'), (yProp = 'thick') //贴附x(横)墙
  58691. } else {
  58692. ;(xProp = 'thick'), (yProp = 'width') //贴附y(竖)墙
  58693. }
  58694. matchInfo.xProp = xProp
  58695. matchInfo.yProp = yProp
  58696. } */
  58697. //根据距离判断
  58698. var center = getBoxPos$1(info);
  58699. var bound = safeBound$1;
  58700. var minXDiff = Math.min(center.x - bound.min.x, bound.max.x - center.x);
  58701. var minYDiff = Math.min(center.z - bound.min.z, bound.max.z - center.z);
  58702. var dirs = getPanosDir$1(info, center);
  58703. var noX = dirs['x+'] == 0 || dirs['x-'] == 0,
  58704. noZ = dirs['z+'] == 0 || dirs['z-'] == 0; //yi6dsPTWwFM klkcWindow pano0-1&pano2-0
  58705. if (dirs['x+'] == 0 && dirs['x-'] != 0) {
  58706. minXDiff = bound.max.x - center.x;
  58707. } else if (dirs['x-'] == 0 && dirs['x+'] != 0) {
  58708. minXDiff = center.x - bound.min.x;
  58709. }
  58710. if (dirs['z+'] == 0 && dirs['z-'] != 0) {
  58711. minYDiff = bound.max.z - center.z;
  58712. } else if (dirs['z-'] == 0 && dirs['z+'] != 0) {
  58713. minYDiff = center.z - bound.min.z;
  58714. }
  58715. var xWidthPossible = noZ ? 1 : 0,
  58716. yWidthPossible = noX ? 1 : 0;
  58717. xWidthPossible += minXDiff - minYDiff;
  58718. if (!math$2.closeTo(xWidthPossible, yWidthPossible, 0.2) && (minXDiff < 0.7 || minYDiff < 0.7)) {
  58719. if (xWidthPossible < yWidthPossible) {
  58720. xProp = 'thick', yProp = 'width'; //贴附y(竖)墙
  58721. } else {
  58722. xProp = 'width', yProp = 'thick'; //贴附x(横)墙
  58723. }
  58724. }
  58725. if (!xProp) {
  58726. if (!force) {
  58727. //force的话是fire等无方向的类型
  58728. if (info.category) {
  58729. //是box
  58730. info.pose || (info.pose = getBoxPoseByPos$1(info, center));
  58731. xWidthPossible += info.pose.xWidthPossible;
  58732. yWidthPossible += info.pose.yWidthPossible;
  58733. } else {
  58734. traverse$1(info, function (info) {
  58735. if (info.boxposes) {
  58736. //是matchInfo
  58737. info.boxposes.forEach(function (e) {
  58738. xWidthPossible += e.xWidthPossible;
  58739. yWidthPossible += e.yWidthPossible;
  58740. });
  58741. }
  58742. });
  58743. }
  58744. }
  58745. /* if(noX!=noZ){
  58746. if(noX)xWidthPossible
  58747. } */
  58748. if (xWidthPossible > yWidthPossible) {
  58749. xProp = 'width', yProp = 'thick'; //贴附x(横)墙
  58750. } else {
  58751. xProp = 'thick', yProp = 'width'; //贴附y(竖)墙
  58752. }
  58753. }
  58754. xProp && (info.xProp = xProp, info.yProp = yProp);
  58755. return {
  58756. xWidthPossible,
  58757. yWidthPossible
  58758. };
  58759. }
  58760. };
  58761. var preDealBox$1 = function preDealBox(matchInfo) {
  58762. if (matchInfo.preDealRes || !matchInfo.center) return;
  58763. matchInfo.preDealRes = {};
  58764. matchInfo.boxType || getBoxType$1(matchInfo);
  58765. var config = standards$1[matchInfo.boxType];
  58766. config.widthNormal.min;
  58767. var needGetPose;
  58768. var dis = safeBound$1.distanceToPoint(matchInfo.center);
  58769. if (matchInfo.name == 'pano2-5') {
  58770. console.log(4);
  58771. }
  58772. if (dis > 0.3 && !config.tiny && !config.tinyXZ) {
  58773. //Tmo1vLp9Q13: hlkcWindow超出才准确
  58774. //tiny的位置优先级高于bound,因为他们可以确定bound
  58775. /* matchInfo.str && matchInfo.str.includes('outsideBound') */
  58776. //const shrink = minWidth * 0.85
  58777. //addLabel(matchInfo.center, '原')
  58778. var finalPos = matchInfo.center.clone().clamp(safeBound$1.min, safeBound$1.max);
  58779. matchInfo.preDealRes.position = finalPos; //addLabel(finalPos, 'finalPos')
  58780. getBoxType$1(matchInfo);
  58781. needGetPose = true;
  58782. }
  58783. var center = getBoxPos$1(matchInfo);
  58784. if (needGetPose || !matchInfo.boxposes) {
  58785. matchInfo.boxposes = [];
  58786. [matchInfo.box0, matchInfo.box1].forEach(function (box) {
  58787. box && matchInfo.boxposes.push(getBoxPoseByPos$1(box, center));
  58788. });
  58789. } //-----------------
  58790. getBoxDirProp$1(matchInfo);
  58791. };
  58792. var getBoxPoseByPos$1 = function getBoxPoseByPos(box, centerPos) {
  58793. var addDis = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  58794. //当得知box的大概位置时,求box在这个角度上的宽度、朝向
  58795. //在这个方向看的box的宽度
  58796. var config = standards$1[box.boxType];
  58797. var angle = getBbox2Diff$1(box.bbox2[2], box.bbox2[0]) * Math.PI; //角度的一半
  58798. var dis = new THREE.Vector3().subVectors(box.pano.position, centerPos).setY(0).length() + addDis;
  58799. var projectWidth = 2 * Math.tan(angle) * dis; //投影宽度 (准确的投影宽度无法求得,只能近似)
  58800. var camDir =
  58801. /* new THREE.Vector2(centerPos.x-box.pano.position.x, centerPos.z-box.pano.position.z).normalize() */
  58802. box.centerDir.clone().setY(0).normalize();
  58803. var camTangent = math$2.getNormal({
  58804. points: [{
  58805. x: 0,
  58806. y: 0
  58807. },
  58808. /* camDir */
  58809. {
  58810. x: camDir.x,
  58811. y: camDir.z
  58812. }]
  58813. }); //视线切线方向
  58814. camTangent.x = Math.abs(camTangent.x);
  58815. camTangent.y = Math.abs(camTangent.y);
  58816. /* if (box.sid == 'pano4-6') {
  58817. console.log(7)
  58818. } */
  58819. var maxWidth = config.widthNormal.max;
  58820. var minWidth = config.widthNormal.min;
  58821. var minProjectWidth; //= (camTangent.x + camTangent.y) * minWidth
  58822. var maxProjectWidth; //= (camTangent.x + camTangent.y) * maxWidth
  58823. var maxX, maxY, minX, minY;
  58824. if (!standards$1[box.boxType].thick) {
  58825. minProjectWidth = (camTangent.x + camTangent.y) * minWidth;
  58826. maxProjectWidth = (camTangent.x + camTangent.y) * maxWidth; //该角度下该类型允许的最大投影距离
  58827. maxX = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最大值(假设y为最小值)
  58828. maxY = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最大值(假设x为最小值)
  58829. minX = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最小值(假设y为最大值)
  58830. minY = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最小值(假设x为最大值)
  58831. } else {
  58832. var minThick_ = config.thick.min;
  58833. var minWidth_ = config.width.min;
  58834. var maxThick_ = config.thick.max;
  58835. var maxWidth_ = config.width.max;
  58836. var maxProjectWidth1 = camTangent.x * maxWidth_ + camTangent.y * maxThick_;
  58837. var maxProjectWidth2 = camTangent.x * maxThick_ + camTangent.y * maxWidth_;
  58838. var minProjectWidth1 = camTangent.x * minWidth_ + camTangent.y * minThick_;
  58839. var minProjectWidth2 = camTangent.x * minThick_ + camTangent.y * minWidth_;
  58840. minProjectWidth = Math.min(minProjectWidth1, minProjectWidth2);
  58841. maxProjectWidth = Math.max(maxProjectWidth1, maxProjectWidth2);
  58842. (camTangent.x + camTangent.y) * maxWidth; //console.log('diffaaaaaa',maxProjectWidth,a, box.sid)
  58843. maxX = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.y) / camTangent.x, minThick_, maxWidth_); //可得x的最大值(假设y为最小值)
  58844. maxY = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.x) / camTangent.y, minThick_, maxWidth_); //可得y的最大值(假设x为最小值)
  58845. minX = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.y) / camTangent.x, minThick_, maxWidth_);
  58846. minY = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.x) / camTangent.y, minThick_, maxWidth_);
  58847. }
  58848. /*
  58849. let maxX = projectWidth / camTangent.x //可得x的最大值(假设y为0)
  58850. let maxY = projectWidth / camTangent.y //可得y的最大值(假设x为0)
  58851. */
  58852. //判断方向
  58853. var o = {
  58854. box,
  58855. projectWidth,
  58856. camTangent,
  58857. maxProjectWidth,
  58858. minProjectWidth,
  58859. dis,
  58860. maxX,
  58861. maxY,
  58862. minX,
  58863. minY
  58864. };
  58865. if (config.atWall > 0
  58866. /* isType(box.category,battery) || isType(box.category,air) */
  58867. ) {
  58868. //为了获取朝向
  58869. o.xWidthPossible = -Math.abs(projectWidth - camTangent.x * maxWidth - camTangent.y * minWidth);
  58870. o.yWidthPossible = -Math.abs(projectWidth - camTangent.x * minWidth - camTangent.y * maxWidth); //在接近45度时容易不准。另外如果被遮住一部分更会错,因此尽量不让被遮住的匹配
  58871. }
  58872. return o;
  58873. };
  58874. var getPoseScore$1 = function getPoseScore(boxposes, boxType) {
  58875. var score = 0;
  58876. var minDis = 1.5;
  58877. /* if (boxposes[0].box.sid == 'pano12-13' && boxposes[1].box.sid == 'pano8-6') {
  58878. console.log(4)
  58879. } */
  58880. boxposes.forEach(function (pose) {
  58881. //pose.lowR = pose.dis < minDis ? Math.pow(THREE.MathUtils.smoothstep(pose.dis / minDis, 0, 1),2) : 1 //太近的话误差大
  58882. pose.lowR = pose.dis < minDis ? Math.pow(pose.dis / minDis, 1.4) : 1; //太近的话误差大
  58883. if (pose.projectWidth > pose.maxProjectWidth) {
  58884. score += Math.pow((pose.projectWidth / pose.maxProjectWidth - 1) * pose.lowR, 2) * 500; //超过的话数字较大所以乘的数小一些
  58885. } else if (
  58886. /* isSingle && */
  58887. pose.projectWidth < pose.minProjectWidth) {
  58888. score += Math.pow((pose.minProjectWidth / pose.projectWidth - 1) * pose.lowR, 2) * 500;
  58889. }
  58890. var _standards$boxType$wi = standards$1[boxType].widthNormal,
  58891. min = _standards$boxType$wi.min;
  58892. _standards$boxType$wi.max;
  58893. if (standards$1[boxType].atWall == 1 && min < 0.3 || boxposes.length == 2 && boxType == 'battery') {
  58894. var _standards$boxType$wi2 = standards$1[boxType].widthNormal,
  58895. _min2 = _standards$boxType$wi2.min,
  58896. _max2 = _standards$boxType$wi2.max; //let r = Math.max(0.001, (pose.projectWidth - min) / (max - min))
  58897. var diff = _max2 - _min2;
  58898. var r = math$2.linearClamp(pose.projectWidth, _min2, _min2 + diff * 0.5, 600, 0); //if(boxposes.length == 2 && boxType == 'battery'){//由于battery经常出现遮挡,导致方向出错,因此尽量不匹配projectWidth较短的,尽管这本有可能是对的
  58899. score += r; //}
  58900. /* if (min < 0.3 && r < 0.5) {
  58901. //从贴近墙面的位置看侧面的话,容易被挡住,不准,尤其是电箱
  58902. score += ((max - min) / r / min) * 5
  58903. } */
  58904. }
  58905. });
  58906. score = Math.min(score, 1300); //压低一点,因为得的宽度可能不准
  58907. if (boxposes.length == 2) {
  58908. //每一个方向对应有四个方向(每个象限一个)看到的projectWidth应该接近。
  58909. //先把camTangent转化为第一个象限的
  58910. var camTangent0 = new THREE.Vector2(Math.abs(boxposes[0].camTangent.x), Math.abs(boxposes[0].camTangent.y));
  58911. var camTangent1 = new THREE.Vector2(Math.abs(boxposes[1].camTangent.x), Math.abs(boxposes[1].camTangent.y));
  58912. var a = camTangent0.dot(camTangent1);
  58913. if (a > 0.8) {
  58914. //WcLVXvmV9AU
  58915. //0.9: 25度之内. 0.8: 36.8度之内
  58916. var diff = Math.abs(boxposes[0].projectWidth - boxposes[1].projectWidth);
  58917. boxposes.score2 = a * diff * 1300 * boxposes[0].lowR * boxposes[1].lowR;
  58918. score += boxposes.score2; //console.warn('在同一个方向看到的projectWidth应该接近。 ', diff)
  58919. }
  58920. boxposes.camTangentCos = a;
  58921. } //要不要加上minX等的差距?
  58922. score = Math.min(score, 1200);
  58923. return -score;
  58924. };
  58925. var getBoxSize$1 = function getBoxSize(info) {
  58926. if (info.boxType == 'groundBar') {
  58927. console.log(1);
  58928. }
  58929. if (info.size) return; //console.warn('开始算 ' + info.name)
  58930. var exStr = '',
  58931. warnStr = '';
  58932. var x, y; //求对角线的向量 x>0,y>0
  58933. //假设盒子的长宽为x,y (x>0,y>0),视线切线单位向量为(k,m),投影距离:x'k+y'm.(x'是正负x,y'是正负y)
  58934. //由于盒子的对角线有四个可选方向,(类似四个象限) 则需要能使投影距离最长的一个对角线向量。
  58935. //如,当k<0,m>0时,要使xk+ym 最大,必有x<0,y>0. 故 x = -x', y = y', 故 投影距离:x'k+y'm = x(-k)+ym 。
  58936. //故无论km的符号如何,只要变为正数,再去联立方程即可得xy。(相当于切线转到第一象限)
  58937. //注:但是因为无法获取准确的投影距离(角平分线左右两边的端点到角平分线的距离不相等,垂足也无法确定),所以所算的误差非常大。
  58938. if (info.name == 'pano6-13&pano4-13') {
  58939. console.log(6);
  58940. }
  58941. var center = getBoxPos$1(info);
  58942. var oriX, oriY;
  58943. if (info.predictSize) {
  58944. x = oriX = info.predictSize.x, y = oriY = info.predictSize.y;
  58945. } else {
  58946. if (info.box1) {
  58947. var x1 = info.boxposes[0].camTangent.x,
  58948. x2 = info.boxposes[1].camTangent.x,
  58949. y1 = info.boxposes[0].camTangent.y,
  58950. y2 = info.boxposes[1].camTangent.y,
  58951. w1 =
  58952. /* info.boxposes[0].projectWidth, */
  58953. THREE.MathUtils.clamp(info.boxposes[0].projectWidth, info.boxposes[0].minProjectWidth, info.boxposes[0].maxProjectWidth * 1.1),
  58954. //校准。如果projectwidth不准那算出来更不准. 但XswQxwmn2ZC的里侧电池是前者更准
  58955. w2 =
  58956. /* info.boxposes[1].projectWidth */
  58957. THREE.MathUtils.clamp(info.boxposes[1].projectWidth, info.boxposes[1].minProjectWidth, info.boxposes[1].maxProjectWidth * 1.1); //如果识别到柜门上,(柜体被遮住了),整体中心就会在柜门上,且厚度小于真实值。
  58958. if (x1 == 0) {
  58959. y = w1;
  58960. x = (w2 - y2 * y) / x2;
  58961. } else {
  58962. //联立方程得:
  58963. y = (w2 - x2 / x1 * w1) / (y2 - x2 / x1 * y1);
  58964. x = (w1 - y1 * y) / x1;
  58965. } //console.log('xy', { x, y })
  58966. (x < 0.3 || x > 1.4) && (exStr += ' x:' + math$2.toPrecision(x, 2));
  58967. (y < 0.3 || y > 1.4) && (exStr += ' y:' + math$2.toPrecision(y, 2));
  58968. if (y < 0 || x < 0) {
  58969. //console.log('<0 ?????????')
  58970. warnStr = x < 0 ? 'x<0!' : 'y<0!';
  58971. }
  58972. oriX = x, oriY = y;
  58973. } else {
  58974. //single pano data
  58975. //将maxX maxY 限定在标准范围内
  58976. if (info.xProp) {
  58977. var widthValue = standards$1[info.boxType].width;
  58978. var thickValue = standards$1[info.boxType].thick;
  58979. var maxX, maxY, minX, minY;
  58980. if (info.xProp == 'width') {
  58981. /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max)
  58982. y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max)
  58983. */
  58984. maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max); //AG0bi2fhb3 需要将得到的minX等这四项都clamp后再平均
  58985. maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max);
  58986. minX = THREE.MathUtils.clamp(info.boxposes[0].minX, widthValue.min, widthValue.max);
  58987. minY = THREE.MathUtils.clamp(info.boxposes[0].minY, thickValue.min, thickValue.max);
  58988. } else {
  58989. /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max)
  58990. y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max)
  58991. */
  58992. maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max);
  58993. maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max);
  58994. minX = THREE.MathUtils.clamp(info.boxposes[0].minX, thickValue.min, thickValue.max);
  58995. minY = THREE.MathUtils.clamp(info.boxposes[0].minY, widthValue.min, widthValue.max);
  58996. }
  58997. x = oriX = (maxX + minX) / 2;
  58998. y = oriY = (maxY + minY) / 2;
  58999. } else {
  59000. //x = oriX = y = oriY = (min+max)/2
  59001. var standard = standards$1[info.boxType].widthNormal;
  59002. x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, standard.min, standard.max);
  59003. y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, standard.min, standard.max);
  59004. }
  59005. } //按正常来说,得到的x,y都应>0,但是由于箱子会被遮挡,导致投影宽度比真实的小,算出的也不准,可能是负数
  59006. //所以手动将过小的宽度矫正
  59007. }
  59008. /* if(info.name == "pano2-6"){
  59009. console.log(7)
  59010. } */
  59011. var height;
  59012. if (standards$1[info.boxType].bottom) {
  59013. //悬挂的
  59014. //挂式空调最好把长宽固定。 不过极少出错
  59015. //center.y -= 0.1 //很可能过高
  59016. height = standards$1[info.boxType].height.standard;
  59017. getBoxBtm$1(info);
  59018. if (height) {
  59019. var d = center.y - info.btmPos.y;
  59020. center.y -= THREE.MathUtils.clamp((d - height / 2) / 2, -0.1, 0.1); //如果中心点到底部的距离和height的一半不同,中心点移动差值的一半
  59021. } else {
  59022. var btmY = info.btmPos.y;
  59023. /* let ys = [info.btmPos.y]//info.btmPos.y蛮不准的
  59024. if(info.box0){
  59025. ys.push(info.box0.btmPos.y)
  59026. }
  59027. if(info.box1){
  59028. ys.push(info.box1.btmPos.y)
  59029. }
  59030. btmY = ys.reduce((w,c)=>{return w+c},0)
  59031. btmY/=ys.length //平均 */
  59032. height = (center.y - btmY) * 2;
  59033. }
  59034. } else {
  59035. if (!info.topPos) getBoxTop$1(info);
  59036. height = info.topPos.y - groundY$1;
  59037. }
  59038. var o = restrictSize$1(x, height, y, info);
  59039. x = o.x, height = o.y, y = o.z;
  59040. if (standards$1[info.boxType].widthSame) {
  59041. x = y = (x + y) / 2;
  59042. }
  59043. info.size = new THREE.Vector3(x, height, y);
  59044. info.sizeAdjust = Math.pow(Math.abs(x - oriX), 1.3) + Math.pow(Math.abs(y - oriY), 1.3); //计算得到的值和标准值之间的差距,可以反映该info的匹配分值
  59045. if (info.sizeAdjust) info.score = (info.score || 0) - Math.min(info.sizeAdjust * 100, 400);
  59046. info.size.oriX = oriX, info.size.oriY = oriY;
  59047. info.exStr = exStr, info.warnStr = warnStr;
  59048. };
  59049. var restrictSize$1 = function restrictSize(x, y, z, info) {
  59050. var s;
  59051. var xProp = info.xProp,
  59052. yProp = info.yProp;
  59053. if (xProp != void 0) {
  59054. var _standards$info$boxTy = standards$1[info.boxType][xProp],
  59055. min = _standards$info$boxTy.min,
  59056. max = _standards$info$boxTy.max;
  59057. x = THREE.MathUtils.clamp(x, min, max);
  59058. var _standards$info$boxTy2 = standards$1[info.boxType][yProp],
  59059. min = _standards$info$boxTy2.min,
  59060. max = _standards$info$boxTy2.max;
  59061. z = THREE.MathUtils.clamp(z, min, max);
  59062. s = true;
  59063. }
  59064. if (!s) {
  59065. var _standards$info$boxTy3 = standards$1[info.boxType].widthNormal,
  59066. min = _standards$info$boxTy3.min,
  59067. max = _standards$info$boxTy3.max;
  59068. x = THREE.MathUtils.clamp(x, min, max);
  59069. z = THREE.MathUtils.clamp(z, min, max);
  59070. }
  59071. var _standards$info$boxTy4 = standards$1[info.boxType].height,
  59072. min = _standards$info$boxTy4.min,
  59073. max = _standards$info$boxTy4.max;
  59074. y = THREE.MathUtils.clamp(y, min, max);
  59075. return {
  59076. x,
  59077. y,
  59078. z
  59079. };
  59080. };
  59081. var getMixBox$1 = function getMixBox(box0, box1) {
  59082. //重叠部分
  59083. var box = new THREE.Box2();
  59084. box.min.set(Math.max(box0.min.x, box1.min.x), Math.max(box0.min.y, box1.min.y));
  59085. box.max.set(Math.min(box0.max.x, box1.max.x), Math.min(box0.max.y, box1.max.y));
  59086. return box;
  59087. };
  59088. var getLeftRight$1 = function getLeftRight(boxArr) {
  59089. //获取pano的boxes中最左和最右的bbox.x
  59090. var lefts = boxArr.map(function (e) {
  59091. return e.bbox2[0];
  59092. });
  59093. var rights = boxArr.map(function (e) {
  59094. return e.bbox2[2];
  59095. });
  59096. lefts.sort(function (a, b) {
  59097. return getBbox2Diff$1(a, b);
  59098. });
  59099. rights.sort(function (a, b) {
  59100. return getBbox2Diff$1(b, a);
  59101. });
  59102. var leftX = lefts[0]; //最左
  59103. var rightX = rights[0]; //最右
  59104. return {
  59105. leftX,
  59106. rightX
  59107. };
  59108. };
  59109. global$2.searchCount1 = 0, global$2.escapeCount1 = 0;
  59110. var searchPair$1 = function searchPair(beginItem, group0_, group1_, parentPairs, resultPairs, evaluateFun, minScore) {
  59111. //配对结果个数为n!,其中n是每组的元素个数。注意当n=10时,已经有40320个,非常恐怖。
  59112. var pair = [],
  59113. parentExit = !!parentPairs;
  59114. var removeParent = function removeParent() {
  59115. //元结点裂变出多个,来装新的pair
  59116. if (parentExit) {
  59117. var i = resultPairs.indexOf(parentPairs);
  59118. resultPairs.splice(i, 1);
  59119. parentExit = false;
  59120. }
  59121. };
  59122. if (!parentPairs) {
  59123. //首次
  59124. if (group0_.length == 0 || group1_.length == 0) return; //保证第一个的个数<=第二个,否则第一组多出来的永远匹配不上
  59125. if (group0_.length > group1_.length) {
  59126. var t = group0_;
  59127. group0_ = group1_;
  59128. group1_ = t;
  59129. }
  59130. beginItem = group0_[0];
  59131. var complex = Object.keys(global$2.boxFrame.datas).length;
  59132. if (complex < 10) evaluateFun = null;else minScore = math$2.linearClamp(complex, 10, 80, -4000, -500); //console.log('searchPair length',group0_.length,group1_.length)
  59133. }
  59134. searchCount1++;
  59135. for (var j = 0; j < group1_.length; j++) {
  59136. pair = [beginItem, group1_[j]]; //if(pair[0].sid == 'void' || pair[1].sid == 'void')continue
  59137. var evaluate = void 0;
  59138. if (evaluateFun
  59139. /* && !(pair[0].sid == 'void' || pair[1].sid == 'void') */
  59140. ) {
  59141. evaluate = evaluateFun(pair[0], pair[1]);
  59142. if (evaluate == void 0 || evaluate.score <= minScore) {
  59143. //console.log('因为评估出匹配可能性低所以跳过',pair[0],pair[1],evaluate)
  59144. escapeCount1++;
  59145. continue;
  59146. }
  59147. }
  59148. var newPairs = void 0; //用来存放该组pair
  59149. if (parentPairs) {
  59150. removeParent();
  59151. newPairs = parentPairs.slice(0); //复制
  59152. newPairs.push(pair);
  59153. } else {
  59154. newPairs = [pair]; //新的容器
  59155. }
  59156. resultPairs.push(newPairs);
  59157. var newGroup0 = group0_.slice(0);
  59158. var newGroup1 = group1_.slice(0);
  59159. var index = newGroup0.indexOf(pair[0]);
  59160. newGroup0.splice(index, 1);
  59161. index = newGroup1.indexOf(pair[1]);
  59162. newGroup1.splice(index, 1);
  59163. if (newGroup0.length > 0 && newGroup1.length > 0) {
  59164. searchPair(newGroup0[0], newGroup0, newGroup1, newPairs, resultPairs, evaluateFun, minScore);
  59165. }
  59166. }
  59167. }; //如果第一个元素就和后面所有的都不匹配,就直接返回了怎么办?
  59168. var PanoBoxFrame = /*#__PURE__*/function (_THREE$Group) {
  59169. _inherits(PanoBoxFrame, _THREE$Group);
  59170. var _super = _createSuper$F(PanoBoxFrame);
  59171. function PanoBoxFrame(player_, ifAnalyze, dataList) {
  59172. var _this2;
  59173. _classCallCheck(this, PanoBoxFrame);
  59174. _this2 = _super.call(this);
  59175. _this2.clear();
  59176. player$d = player_;
  59177. player$d.model.add(_assertThisInitialized(_this2));
  59178. global$2.boxFrame = _assertThisInitialized(_this2);
  59179. if (browser$1.urlHasValue('ext')) {
  59180. isExt$1 = true;
  59181. isDiwei$1 = isExt$1 && !browser$1.urlHasValue('ctrl');
  59182. }
  59183. _this2.ifAnalyze = ifAnalyze;
  59184. _this2.wireframes = new THREE.Object3D();
  59185. _this2.wireframes.name = 'wireframes';
  59186. _this2.add(_this2.wireframes);
  59187. _this2.matchScoreMap = {};
  59188. _this2.bindEvents();
  59189. meshGroup$1 = new THREE.Object3D();
  59190. meshGroup$1.name = 'testBox';
  59191. _this2.add(meshGroup$1);
  59192. _this2.visiInfos = {};
  59193. _this2.compute(dataList);
  59194. return _this2;
  59195. }
  59196. _createClass(PanoBoxFrame, [{
  59197. key: "compute",
  59198. value: function () {
  59199. var _compute = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3(dataList) {
  59200. var _this3 = this;
  59201. var beginCompute, done, loadAll, _loadAll;
  59202. return regenerator.wrap(function _callee3$(_context3) {
  59203. while (1) {
  59204. switch (_context3.prev = _context3.next) {
  59205. case 0:
  59206. _loadAll = function _loadAll3() {
  59207. _loadAll = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
  59208. var _this5 = this;
  59209. var data, box4;
  59210. return regenerator.wrap(function _callee2$(_context2) {
  59211. while (1) {
  59212. switch (_context2.prev = _context2.next) {
  59213. case 0:
  59214. _context2.next = 2;
  59215. return http.post('/service/shapes/sceneMarkShape/getInfos', {
  59216. num: player$d.$app.config.num
  59217. });
  59218. case 2:
  59219. data = _context2.sent;
  59220. if (!(!data.data || !data.success)) {
  59221. _context2.next = 5;
  59222. break;
  59223. }
  59224. return _context2.abrupt("return");
  59225. case 5:
  59226. if (isExt$1) {
  59227. (data.data.box8.dataSet.boxes || data.data.box8.dataSet).forEach(function (e) {
  59228. // if (e.external && !e.external.show) {
  59229. // return
  59230. // }
  59231. // e.external = {
  59232. // eqpType: 'equipment_cabinet',
  59233. // eqpName: '送变电机房BATS_1',
  59234. // show: true,
  59235. // eqpId: '150035210000000000125288',
  59236. // url: 'http://120.194.14.251:40004/vr_3dWeb/deviceInfo?rackId=7a323f16-ac13-4434-bf97-c44d1783a217',
  59237. // }
  59238. var point1 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[0]));
  59239. var point2 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[1]));
  59240. var point3 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[2]));
  59241. var point4 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[4]));
  59242. var size = new THREE.Vector3(point1.distanceTo(point2), point1.y - point4.y, point3.distanceTo(point2));
  59243. var center = new THREE.Vector3().addVectors(point3, point4).multiplyScalar(0.5); //对角线中点
  59244. //可能需要考虑上rotation,现暂时不需要
  59245. new Box$1({
  59246. buildFromData: true,
  59247. center,
  59248. size,
  59249. boxType: e.type,
  59250. name: e.sid,
  59251. external: e.external
  59252. });
  59253. });
  59254. this.ifAnalyze = false;
  59255. this.visible = false;
  59256. }
  59257. if (!isExt$1 || browser$1.urlHasValue('ctrl')) {
  59258. box4 = Array.isArray(data.data) ? data.data : data.data.box4; // 兼容旧数据
  59259. box4.forEach(function (e) {
  59260. var panoId = e.imagePath.split('.jpg')[0];
  59261. _this5.datas[panoId] = e;
  59262. });
  59263. this.visible = true;
  59264. }
  59265. done();
  59266. case 8:
  59267. case "end":
  59268. return _context2.stop();
  59269. }
  59270. }
  59271. }, _callee2, this);
  59272. }));
  59273. return _loadAll.apply(this, arguments);
  59274. };
  59275. loadAll = function _loadAll2() {
  59276. return _loadAll.apply(this, arguments);
  59277. };
  59278. startTime$1 = Date.now();
  59279. this.datas = {};
  59280. this.datasMixed = {};
  59281. this.boxesSolid = boxesSolid$1;
  59282. beginCompute = function beginCompute() {
  59283. //获取匹配分数
  59284. var getMatchScore = function getMatchScore(box0, box1) {
  59285. var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  59286. isSingle = _ref2.isSingle,
  59287. center = _ref2.center,
  59288. onlyGet = _ref2.onlyGet,
  59289. dontCheckDis = _ref2.dontCheckDis;
  59290. var name0 = box0.sid + '&' + box1.sid;
  59291. var name1 = box1.sid + '&' + box0.sid;
  59292. var boxType = getBoxType$1(box0);
  59293. var matchInfo0 = _this3.matchScoreMap[boxType].get(name0);
  59294. var matchInfo1 = _this3.matchScoreMap[boxType].get(name1);
  59295. var matchInfo = matchInfo0 || matchInfo1;
  59296. if (onlyGet) return matchInfo;
  59297. var name;
  59298. if (!matchInfo) {
  59299. name = name0;
  59300. matchInfo = {
  59301. name,
  59302. box0,
  59303. box1,
  59304. center
  59305. };
  59306. _this3.matchScoreMap[boxType].set(name, matchInfo);
  59307. } else {
  59308. return matchInfo;
  59309. }
  59310. if (name == 'pano120-20&pano130-17') {
  59311. console.log(5);
  59312. }
  59313. getBoxBase$1(box0);
  59314. getBoxBase$1(box1);
  59315. var A = box0.pano.position.clone();
  59316. var B = box1.pano.position.clone();
  59317. var AB = new THREE.Vector3().subVectors(B, A);
  59318. var AB2d = new THREE.Vector2(AB.x, AB.z).normalize();
  59319. 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();
  59320. 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();
  59321. var angleA = Math.acos(AB2d.dot(AP12d));
  59322. var angleB = Math.PI - Math.acos(AB2d.dot(BP22d));
  59323. var score = 100,
  59324. str = [];
  59325. if (angleA + angleB > Math.PI + 0.2) {
  59326. //无交点(比180大是因为中心角度有误差,所以给一定的容错)
  59327. //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因角度大于180度 不匹配`)
  59328. return Object.assign(matchInfo, {
  59329. score: -5000,
  59330. str: ['angle>180']
  59331. });
  59332. }
  59333. if (box0.type != box1.type) {
  59334. return Object.assign(matchInfo, {
  59335. score: -5000,
  59336. str: ['typeNotSame']
  59337. });
  59338. }
  59339. if (matchInfo.dirAngleXZ == void 0) {
  59340. matchInfo.dirAngleXZ = THREE.MathUtils.radToDeg(Math.acos(AP12d.dot(BP22d))); //需要尽量接近90度算出来的交点会比较准
  59341. matchInfo.minAng = Math.min(180 - matchInfo.dirAngleXZ, matchInfo.dirAngleXZ); //角度小的getIntersect2容易算不准
  59342. if (isSingle) {
  59343. var bestDisSquared = 2; //单个匹配单个,而非多个匹配多个(没有固定到两个漫游点),所以可以直接寻找最优角度
  59344. score += Math.sin(THREE.MathUtils.degToRad(matchInfo.dirAngleXZ)) * 300;
  59345. score += matchInfo.dirAngleXZ; //另外角度越大越不容易偏向一边
  59346. score -= Math.abs(getBoxPos$1(box0).distanceToSquared(box0.pano.position) - bestDisSquared) * 10;
  59347. score -= Math.abs(getBoxPos$1(box1).distanceToSquared(box1.pano.position) - bestDisSquared) * 10;
  59348. }
  59349. }
  59350. var shinkRatio = 1;
  59351. var btmPos0 = box0.btmPos || box0.btmPosPredict; //fire类型先用btmPosPredict,测定groundY后才有btmPos
  59352. var btmPos1 = box1.btmPos || box1.btmPosPredict;
  59353. if (!dontCheckDis) {
  59354. //let r = box0.boxType == 'air' ? 1 : box0.boxType == 'cabinet' ? 0.9 : 0.7 //随着宽度增加而降低
  59355. var r = THREE.MathUtils.clamp(0.8 / standards$1[boxType].widthNormal.max, 0.6, 2); //随着宽度增加而降低 UWrshepp0G5的fire
  59356. if (!standards$1[boxType].bottom && btmPos0 && btmPos1) {
  59357. //注:挂空调不应使用btmPosPredict
  59358. var d = btmPos0.distanceToSquared(btmPos1);
  59359. matchInfo.btmPosPreDis = d;
  59360. score -= d * 1300 * r * shinkRatio;
  59361. if (box1.topPos) {
  59362. var a = box0.topPos.distanceToSquared(box1.topPos);
  59363. matchInfo.topPosPreDis = a;
  59364. var u = a * 700 * r * shinkRatio;
  59365. var AP0 = new THREE.Vector2(btmPos0.x - A.x, btmPos0.z - A.z).lengthSq();
  59366. var AP1 = new THREE.Vector2(btmPos1.x - B.x, btmPos1.z - B.z).lengthSq();
  59367. if (AP0 < 0.4 || AP1 < 0.4) u *= 0.3; //太近
  59368. score -= u;
  59369. }
  59370. } else if (box0.posAtWall && box1.posAtWall) {
  59371. //
  59372. var _d = box0.posAtWall.distanceToSquared(box1.posAtWall);
  59373. matchInfo.wallPosPreDis = _d;
  59374. score -= _d * 200 * r; //墙面不准所以分低 ftMTQIrs79
  59375. _d = box0.btmPosOri.distanceToSquared(box1.btmPosOri); //还是加一下
  59376. matchInfo.btmPosPreDis = _d;
  59377. score -= _d * 200 * r * shinkRatio;
  59378. /* let h0 = box0.topPos.y - box0.btmPos.y
  59379. let h1 = box1.topPos.y - box1.btmPos.y
  59380. score -= Math.abs(h0-h1) * 3000 * r * shinkRatio //高度差 倾斜角度大的不准
  59381. */
  59382. }
  59383. }
  59384. if (!matchInfo.center) {
  59385. var o = getIntersect2$1(A, box0.centerDir, B, box1.centerDir);
  59386. matchInfo.center = o.pos3d.clone();
  59387. /* let o2 = math.getLineIntersect({ A, B, p1: A.clone().add(box0.centerDir), p2:B.clone().add(box1.centerDir) })
  59388. matchInfo.center2 = o2.pos3d.clone() */
  59389. /* if (name == "pano16-4&pano18-5") {
  59390. addLine(A, box0.centerBtmDir, 10), addLine(B, box1.centerBtmDir, 10)
  59391. } */
  59392. //验证是否漫游点到中心点的方向和centerDir一样
  59393. var dir0 = new THREE.Vector3().subVectors(o.pos3d, A).normalize();
  59394. var dir1 = new THREE.Vector3().subVectors(o.pos3d, B).normalize();
  59395. var sum = dir0.dot(box0.centerDir) + dir1.dot(box1.centerDir);
  59396. var wrongDir = sum < 1.95;
  59397. score -= (2 - sum) * 10000;
  59398. if (wrongDir) {
  59399. str.push('wrongDir');
  59400. return Object.assign(matchInfo, {
  59401. score: score - 5000,
  59402. str
  59403. });
  59404. }
  59405. if (!dontCheckDis && !standards$1[boxType].bottom && box0.btmPos && box1.btmPos) {
  59406. //墙壁位置不准所以不用 KK-ftMTQIrs79
  59407. var p0 = new THREE.Vector2(box0.btmPos.x, box0.btmPos.z);
  59408. var p1 = new THREE.Vector2(box1.btmPos.x, box1.btmPos.z);
  59409. var p = new THREE.Vector2(matchInfo.center.x, matchInfo.center.z);
  59410. var dis = p0.distanceToSquared(p) + p1.distanceToSquared(p);
  59411. var s = math$2.linearClamp(matchInfo.minAng, 0, 20, 0, 1);
  59412. score -= dis * 1500 * s; //如果距离较远就说明算的center误差大,不可信。可能有一个框不准确
  59413. matchInfo.centerDrift = dis;
  59414. }
  59415. getBoxBtm$1(matchInfo);
  59416. var cr; //getIntersect2结果的权重
  59417. if (standards$1[box0.boxType].atWall == 1) {
  59418. cr = math$2.linearClamp(matchInfo.minAng, 2, 15, 0, 1); //墙壁误差大,所以尽量完全依赖cIntersect。。。后期如果该墙壁校准了可以调整
  59419. } else {
  59420. cr = math$2.linearClamp(matchInfo.minAng, 2, 20, 0, 0.4);
  59421. }
  59422. var predict0 = !standards$1[boxType].bottom && box0.btmPos || box0.posAtWall || matchInfo.topPos; //在墙上的除非角度小,否则不考虑cIntersect
  59423. var predict1 = !standards$1[boxType].bottom && box1.btmPos || box1.posAtWall || matchInfo.topPos; //相对来说btmPos要比center准一点?因为center有在两个维度上的误差
  59424. var btmRatio = 0.5;
  59425. var cIntersect = new THREE.Vector3().addVectors(matchInfo.center.clone().multiplyScalar(1 - btmRatio), matchInfo.btmPos.clone().multiplyScalar(btmRatio)).setY(o.pos3d.y);
  59426. if (predict0 && predict1) {
  59427. matchInfo.center = new THREE.Vector3().addVectors(cIntersect.clone().multiplyScalar(cr), predict0.clone().add(predict1).multiplyScalar(1 / 2 * (1 - cr))).setY(o.pos3d.y);
  59428. } else {
  59429. matchInfo.center = cIntersect;
  59430. }
  59431. matchInfo.cIntersect = cIntersect; //addLabel(matchInfo.center, matchInfo.name + '-c')
  59432. }
  59433. getBoxType$1(matchInfo);
  59434. /* if (matchInfo.boxType != box0.type || matchInfo.boxType != box1.type) {
  59435. ;(score -= 1000), str.push('typeNotSame2')
  59436. } */
  59437. {
  59438. var vec0 = new THREE.Vector3().subVectors(box0.pano.position, matchInfo.center);
  59439. var vec1 = new THREE.Vector3().subVectors(box1.pano.position, matchInfo.center);
  59440. if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0) {
  59441. //同一个象限(center会偏向一侧)
  59442. score -= 200;
  59443. }
  59444. }
  59445. if (!safeBound$1.containsPoint(matchInfo.center)) {
  59446. var _dis = safeBound$1.distanceToPoint(matchInfo.center) //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因中心点在bounding外不匹配`, center, 'dis: ' + dis)
  59447. ;
  59448. score -= 1000 * _dis * _dis, str.push('outsideBound');
  59449. Object.assign(matchInfo, {
  59450. score,
  59451. str,
  59452. center: matchInfo.center,
  59453. disToBound: _dis
  59454. });
  59455. if (_dis > 0.5) return matchInfo;
  59456. } //检查宽度
  59457. var boxposes;
  59458. var checkWidth = function checkWidth() {
  59459. boxposes = [];
  59460. [box0, box1].forEach(function (box) {
  59461. var pose = getBoxPoseByPos$1(box, matchInfo.center);
  59462. boxposes.push(pose); //如果超出标准,基本上这二者不匹配;但过小的话,有可能是被遮挡所以残缺,因此不予过滤
  59463. });
  59464. };
  59465. checkWidth();
  59466. score += getPoseScore$1(boxposes, boxType
  59467. /* isSingle */
  59468. ); //根据投影信息预测的长度再得匹配分数
  59469. return Object.assign(matchInfo, {
  59470. score: score,
  59471. str,
  59472. /* diffHalfHeight, */
  59473. boxposes
  59474. });
  59475. };
  59476. _this3.rows = {};
  59477. /* let getchainNext = (left, end, chain, boxes) => {
  59478. chain.push(left)
  59479. if (left == end) return boxes.chains.push(chain)
  59480. let nodes = boxes.relationships.filter(pair => pair.includes(left))
  59481. let rights = nodes.map(pair => pair.find(e => e != left))
  59482. rights = rights.filter(e => !chain.includes(e) && boxes.indexOf(e) > boxes.indexOf(left))
  59483. rights.forEach(right => {
  59484. getchainNext(right, end, chain.slice(), boxes)
  59485. })
  59486. } */
  59487. var getPanoBigRowBox = function getPanoBigRowBox(panoBoxes) {
  59488. var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  59489. _ref3$reason = _ref3.reason,
  59490. reason = _ref3$reason === void 0 ? 'row' : _ref3$reason;
  59491. //将一个pano中的所有boxes分组,识别哪些是一排的。也可用于识别融合
  59492. var pano = panoBoxes[0].pano;
  59493. var category = panoBoxes[0].category;
  59494. var type = category + '|' + reason;
  59495. _this3.rows[type] || (_this3.rows[type] = {});
  59496. if (_this3.rows[type][pano.id]) return _this3.rows[type][pano.id];
  59497. var bigBoxes;
  59498. var bigBox = {
  59499. sid: 'pano' + pano.id + (reason == 'mix' ? '-mix' : '-row'),
  59500. pano,
  59501. category: reason == 'mix' ? category : 'rowBigBox',
  59502. boxType: reason == 'mix' ? panoBoxes[0].boxType : 'rowBigBox'
  59503. };
  59504. var rows = [];
  59505. for (var i = 0; i < panoBoxes.length; i++) {
  59506. var box0 = panoBoxes[i];
  59507. getBoxBase$1(box0);
  59508. var _ref4 = [box0.bbox2[0], box0.bbox2[2]],
  59509. left0 = _ref4[0],
  59510. right0 = _ref4[1];
  59511. for (var j = i + 1; j < panoBoxes.length; j++) {
  59512. var box1 = panoBoxes[j];
  59513. getBoxBase$1(box1);
  59514. if (box0.boxType != box0.boxType) continue; //类型不同
  59515. var _ref5 = [box1.bbox2[0], box1.bbox2[2]],
  59516. left1 = _ref5[0],
  59517. right1 = _ref5[1];
  59518. var d1 = getBbox2Diff$1(left1, right0),
  59519. d2 = getBbox2Diff$1(left1, left0),
  59520. d3 = getBbox2Diff$1(left0, right1);
  59521. if (box0.sid == 'pano2-4' && box1.sid == 'pano2-5') {
  59522. console.log(9);
  59523. }
  59524. var min = reason == 'mix' ? 0.004 : 0.003; //mix代表寻找分裂的重新融合到一起
  59525. if (d1 <= min && d2 >= min || d3 <= min && d2 <= min) {
  59526. //边框交接
  59527. var atEdgeMight = left1 < 0.002 && right0 > 0.998 ? [left1, right0] : left0 < 0.002 && right1 > 0.998 ? [left0, right1] : null; //有在全景图的边界的可能性
  59528. //if (reason == 'mix' && box0.category == typeNames.cabinet && !atEdgeMight) continue //柜子容易并排,尽量不融合 //再看,啥意思,没懂
  59529. if (reason == 'mix' && !atEdgeMight) continue; //不在边缘
  59530. var max = standards$1[box0.boxType].widthNormal.max; //standards[box0.btmPos ? category : 'air-hanging'].widthNormal
  59531. var tolerate = max * max * (reason == 'mix' ? 0.7 : 1.8); //yDCiaTQvRYn:row不能低于1.5
  59532. var p0 = standards$1[box0.boxType].atWall == 1 ? box0.posAtWall : reason == 'mix' ? box0.btmPosOri || box0.btmPosPredict : box0.btmPos;
  59533. var p1 = standards$1[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
  59534. //let p1 = box1.type == 'air-hanging' ? box1.posAtWall : reason == 'mix' ? box1.btmPosOri : box1.btmPos
  59535. var dis = p0.distanceToSquared(p1);
  59536. if (reason == 'mix') {
  59537. var allY = box0.bbox2[3] - box0.bbox2[1] + (box1.bbox2[3] - box1.bbox2[1]); //各自高度和
  59538. var wholeY = Math.max(box0.bbox2[3], box1.bbox2[3]) - Math.min(box0.bbox2[1], box1.bbox2[1]); //总跨越高度
  59539. var coverY = allY - wholeY; //重合区域的y高度,可为负数
  59540. var disY = (1 - coverY / wholeY + (wholeY - coverY) * 3) * 4 * tolerate; //既要考虑占比也要考虑差值
  59541. dis += disY; //SGyhEzZNGP9案例:虽然是atEdge但并不应该融合,便通过disY来阻挡 ; MW6MEeCOy9Y:pano16-15
  59542. //console.log('disY',disY, box0.sid, box1.sid )
  59543. var atEdgePossib = atEdgeMight ? 0.002 / (atEdgeMight[0] + (1 - atEdgeMight[1])) : 0; // 两条线越接近越可能融合
  59544. atEdgePossib = Math.min(6, atEdgePossib); //原本计算得 min:1, max:Infinity
  59545. dis -= atEdgePossib * tolerate; //给点点优势
  59546. }
  59547. /* if(box0.sid == "pano2-0"){
  59548. console.log('dis',dis,'tolerate',tolerate,[box0, box1],disY)
  59549. }
  59550. if (box0.sid == 'pano2-1' && box1.sid == 'pano2-4') {
  59551. reason == 'mix' && console.log(dis, tolerate, box0.sid, box1.sid)
  59552. }*/
  59553. if (dis < tolerate) {
  59554. //reason == 'mix' && console.log('-------------------')
  59555. common$1.pushToGroupAuto([box0, box1], rows);
  59556. }
  59557. }
  59558. }
  59559. } //一排箱子的角度范围不可超过180度,因为不可能站在箱子上拍,所以超过的话肯定有边缘的不在这一排中。
  59560. //可判断边缘箱子的是否角度偏大,一般中间的被遮挡所以偏小
  59561. rows.forEach(function (boxes) {
  59562. //从左到右排序
  59563. boxes.sort(function (a, b) {
  59564. //但因有的box跨越到别的box区域,所以这个顺序不准确
  59565. return getBbox2Diff$1(a.bbox2CenterX, b.bbox2CenterX);
  59566. });
  59567. }); //去除不在一条直线上的连接. 当bound超出后就断开
  59568. if (reason == 'row') {
  59569. rows.slice(0).forEach(function (boxes) {
  59570. if (boxes.length >= 2) {
  59571. var removes = [],
  59572. bound = new THREE.Box2(),
  59573. size = new THREE.Vector2(),
  59574. maxW = 0.6;
  59575. for (var _i = 0, _j = boxes.length; _i < _j; _i++) {
  59576. var box = boxes[_i];
  59577. var pos2d = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
  59578. bound.expandByPoint(pos2d);
  59579. bound.getSize(size);
  59580. var _min3 = Math.min(size.x, size.y);
  59581. if (_min3 > maxW) {
  59582. removes.push([boxes[_i], boxes[_i - 1]]);
  59583. bound = new THREE.Box2();
  59584. bound.expandByPoint(pos2d); //console.log('removes', size)
  59585. } //console.log('removes',k, box1.sid)
  59586. }
  59587. if (removes.length) {
  59588. /* console.log(
  59589. '去除错误row连接',
  59590. removes.map(e => e.map(a => a.sid))
  59591. ) */
  59592. var _common$disconnectGro = common$1.disconnectGroup(removes, rows);
  59593. _common$disconnectGro.newGroups; //if(newGroups.length>1){//分裂成多组了,重新计算
  59594. // console.log(newGroups)
  59595. //}
  59596. }
  59597. }
  59598. });
  59599. rows.forEach(function (boxes) {
  59600. //从左到右重新排序
  59601. boxes.sort(function (a, b) {
  59602. //但因有的box跨越到别的box区域,所以这个顺序不准确
  59603. return getBbox2Diff$1(a.bbox2CenterX, b.bbox2CenterX);
  59604. });
  59605. });
  59606. }
  59607. rows.sort(function (a, b) {
  59608. return b.length - a.length;
  59609. }); //箱子数量从大到小排序
  59610. bigBoxes = rows.map(function (boxes, i) {
  59611. var _getLeftRight = getLeftRight$1(boxes),
  59612. leftX = _getLeftRight.leftX,
  59613. rightX = _getLeftRight.rightX; //最左
  59614. var topY = boxes.slice().sort(function (a, b) {
  59615. return a.bbox2[1] - b.bbox2[1];
  59616. })[0].bbox2[1];
  59617. var btmY = boxes.slice().sort(function (a, b) {
  59618. return b.bbox2[3] - a.bbox2[3];
  59619. })[0].bbox2[3];
  59620. var rowBigBox = Object.assign({}, bigBox, {
  59621. boxes,
  59622. bbox2: [leftX, topY, rightX, btmY],
  59623. //整排的bbox
  59624. left: boxes.find(function (e) {
  59625. return e.bbox2[0] == leftX;
  59626. }),
  59627. right: boxes.find(function (e) {
  59628. return e.bbox2[2] == rightX;
  59629. })
  59630. });
  59631. var p0 = getBoxPos$1(rowBigBox.left);
  59632. var p1 = getBoxPos$1(rowBigBox.right);
  59633. var vec = new THREE.Vector2(p0.x - p1.x, p0.z - p1.z);
  59634. rowBigBox.k = Math.abs(vec.x / vec.y);
  59635. rowBigBox.predictLen = (rowBigBox.k > 1 ? Math.abs(vec.x) : Math.abs(vec.y)) + 0.6; //加入一个宽度
  59636. /* if(boxes.length <= boxes.relationships.length){//多条链(为了识别一个box嵌套多个的情况。不过后来在开头时处理了一部分)
  59637. boxes.chains = []
  59638. getchainNext(left,right,[], boxes )
  59639. let aveAngle = (getBbox2Diff(left.bbox2[2], left.bbox2[0]) + getBbox2Diff(right.bbox2[2], right.bbox2[0]) ) / 2 -0.01 //首尾的angle平均数。但如果这两个不准那就导致整体出错了
  59640. let middleAngle = getBbox2Diff(right.bbox2[0], left.bbox2[2])
  59641. let counts = boxes.chains.map(e=>e.length)
  59642. counts.sort((a,b)=>a-b)
  59643. let min = counts[0],max = counts[counts.length-1]
  59644. let r = [], cur = min;
  59645. while(cur<=max){
  59646. r.push({cur, diff:Math.abs((middleAngle / (cur-2) - aveAngle)}) //加 0.01是因为增加边缘
  59647. cur++
  59648. }
  59649. r.sort((a,b)=>a.diff-b.diff)
  59650. rowBigBox.predictBoxCount = r[0].cur
  59651. //---------
  59652. let goodCountChains = boxes.chains.filter(e=>e.length == rowBigBox.predictBoxCount)
  59653. if(goodCountChains.length == 1) rowBigBox.bestChain = goodCountChains[0]
  59654. else{
  59655. goodCountChains = goodCountChains.map((chain,i)=>{
  59656. let j = 1, diff=0 //中间的box的angle的方差
  59657. while(j<rowBigBox.predictBoxCount){
  59658. let angle = getBbox2Diff(chain[j].bbox2[2], chain[j].bbox2[0])
  59659. diff += Math.pow(angle - aveAngle, 2)
  59660. j++;
  59661. }
  59662. return {diff, chain}
  59663. })
  59664. goodCountChains.sort((a,b)=>a.diff-b.diff)
  59665. rowBigBox.bestChain = goodCountChains[0].chain
  59666. }
  59667. console.log('getChains',boxes.chains, 'predictBoxCount',rowBigBox.predictBoxCount, r)
  59668. } */
  59669. return rowBigBox;
  59670. });
  59671. if (reason != 'mix') {
  59672. panoBoxes.forEach(function (box) {
  59673. //加入单个的
  59674. if (!rows.some(function (row) {
  59675. return row.includes(box);
  59676. })) {
  59677. var boxBig = Object.assign({}, bigBox, {
  59678. bbox2: box.bbox2,
  59679. boxes: [box],
  59680. left: box,
  59681. right: box
  59682. });
  59683. bigBoxes.push(boxBig);
  59684. }
  59685. });
  59686. } //mix的之前的btm因pose错误而延伸了不对的depth所以不准
  59687. bigBoxes.forEach(function (bigBox) {
  59688. bigBox.sid += '-' + bigBox.boxes.map(function (e) {
  59689. return e.index;
  59690. }).join(',');
  59691. /* if (bigBox.sid == 'pano0-rowBigBox-1,0,2,4') {
  59692. console.log(3)
  59693. } */
  59694. if (reason == 'row') {
  59695. //取平均值
  59696. if (bigBox.boxes[0].btmPos) {
  59697. bigBox.btmPos = bigBox.boxes.reduce(function (w, c) {
  59698. return w.add(c.btmPos);
  59699. }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length); //addLabel(bigBox.btmPos,'b_'+bigBox.sid, {bgcolor:'#f93',a:0.4})
  59700. }
  59701. if (bigBox.boxes[0].topPos) {
  59702. bigBox.topPos = bigBox.boxes.reduce(function (w, c) {
  59703. return w.add(c.topPos);
  59704. }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
  59705. }
  59706. if (bigBox.boxes[0].posAtWall) {
  59707. bigBox.posAtWall = bigBox.boxes.reduce(function (w, c) {
  59708. return w.add(c.posAtWall);
  59709. }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
  59710. }
  59711. } //mix的需要合并后计算才准确
  59712. });
  59713. _this3.rows[type][pano.id] = bigBoxes; //当前pano的所有row
  59714. return bigBoxes;
  59715. };
  59716. /* let getPanoBoxAngleTrend = rowBox => {
  59717. //顺时针方向该pano的box角度范围是越来越大还是越来越小
  59718. let diffs = []
  59719. let angles = rowBox.boxes.map(box => getBbox2Diff(box.bbox2[2], box.bbox2[0]))
  59720. for (let i = 0, j = angles.length; i < j - 1; i++) {
  59721. //得所有相邻之间的差
  59722. let a0 = angles[i],
  59723. a1 = angles[i + 1]
  59724. diffs.push(a1 - a0)
  59725. }
  59726. diffs.sort((a, b) => a - b)
  59727. return diffs[Math.floor(diffs.length / 2)] //中位数
  59728. } */
  59729. /* let getBoxCount = (rowBigBox)=>{
  59730. return rowBigBox.predictBoxCount || rowBigBox.boxes.length
  59731. } */
  59732. var getReverseInfo = function getReverseInfo(rowBigBox0, rowBigBox1) {
  59733. //两个row的方向对应
  59734. var reversed = false;
  59735. var lefts = [rowBigBox0.left, rowBigBox1.left];
  59736. var rights = [rowBigBox0.right, rowBigBox1.right];
  59737. var dis0 = lefts[0].btmPos.distanceToSquared(lefts[1].btmPos);
  59738. var dis1 = rights[0].btmPos.distanceToSquared(rights[1].btmPos);
  59739. var dis2 = lefts[0].btmPos.distanceToSquared(rights[1].btmPos);
  59740. var dis3 = rights[0].btmPos.distanceToSquared(lefts[1].btmPos);
  59741. var posLeft2, posRight2;
  59742. if (dis0 + dis1 > dis2 + dis3) {
  59743. //距离近的代表是同一端
  59744. reversed = true;
  59745. posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
  59746. posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
  59747. } else {
  59748. posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
  59749. posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
  59750. }
  59751. var vec = new THREE.Vector2(posLeft2.x - posRight2.x, posLeft2.z - posRight2.z);
  59752. var k = Math.abs(vec.x / vec.y); //这个算斜率更准,但位置容易偏向一侧(可能用边缘的bbox算会好些?)
  59753. return {
  59754. reversed,
  59755. k
  59756. };
  59757. };
  59758. var searchByRow = function searchByRow(groups, datas) {
  59759. //先查找row,匹配row,再slice row的方法
  59760. _this3.matchScoreMap['rowBigBox'] = new Map();
  59761. var rowInfos = new Map();
  59762. var getRowMatchInfo = function getRowMatchInfo(rowBigBox0, rowBigBox1, ignoreCountMatch) {
  59763. //获取row间的匹配信息
  59764. //获取bigBox位置。由于一排的盒子比较长,中心方向误差大,所以采用先获取两边位置,再求中点的方法
  59765. //if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return //太难了,不算不一样的情况了
  59766. var name = rowBigBox0.sid + '&' + rowBigBox1.sid;
  59767. var row = rowInfos.get(name);
  59768. if (row) {
  59769. return row;
  59770. }
  59771. if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return; //if (getBoxCount(rowBigBox0) != getBoxCount(rowBigBox1) && getBoxCount(rowBigBox0) != 1 && getBoxCount(rowBigBox1) != 1)return
  59772. /* if (rowBigBox0.sid == 'pano0-row-1,2,6' && rowBigBox1.sid == 'pano2-row-0,2,6') {
  59773. console.log(4)
  59774. } */
  59775. var rowInfo;
  59776. if (rowBigBox0.boxes.length > 1 && rowBigBox1.boxes.length > 1) {
  59777. //多对多,可以求两端的位置
  59778. var lefts = [rowBigBox0.left, rowBigBox1.left];
  59779. var rights = [rowBigBox0.right, rowBigBox1.right];
  59780. var leftInfo;
  59781. var rightInfo;
  59782. var info2 = getReverseInfo(rowBigBox0, rowBigBox1);
  59783. var len0 = rowBigBox0.predictLen,
  59784. //长度应该接近
  59785. len1 = rowBigBox1.predictLen;
  59786. var overLen = Math.abs(len0 - len1);
  59787. /* / (rowBigBox0.boxes.length + rowBigBox1.boxes.length) * 5 */
  59788. if (overLen > 1) {
  59789. //console.warn('overLen> 1', overLen, rowBigBox0.sid, '和', rowBigBox1.sid)
  59790. return done();
  59791. }
  59792. if (info2.reversed) {
  59793. leftInfo = getMatchScore(lefts[0], rights[1], {
  59794. isSingle: true
  59795. });
  59796. rightInfo = getMatchScore(rights[0], lefts[1], {
  59797. isSingle: true
  59798. });
  59799. } else {
  59800. leftInfo = getMatchScore(lefts[0], lefts[1], {
  59801. isSingle: true
  59802. });
  59803. rightInfo = getMatchScore(rights[0], rights[1], {
  59804. isSingle: true
  59805. });
  59806. }
  59807. var posLeft = getBoxPos$1(leftInfo);
  59808. var posRight = getBoxPos$1(rightInfo);
  59809. if (!posLeft || !posRight || leftInfo.score < -4000 || rightInfo.score < -4000) {
  59810. return done(); //漫游点重合、>180度会导致此问题
  59811. }
  59812. preDealBox$1(leftInfo); //getBoxSize(leftInfo)
  59813. preDealBox$1(rightInfo); //getBoxSize(rightInfo)
  59814. posLeft = getBoxPos$1(leftInfo);
  59815. posRight = getBoxPos$1(rightInfo); //验证是否是垂直或水平
  59816. var vec = new THREE.Vector2(posLeft.x - posRight.x, posLeft.z - posRight.z);
  59817. var k = Math.abs(vec.x / vec.y);
  59818. if (info2.k > 1 && k < 1 || info2.k < 1 && k > 1) {
  59819. console.error('请检查!info2.k > 1 && k < 1 || info2.k < 1 && k > 1', rowBigBox0.sid, '和', rowBigBox1.sid); //绘制的方向错误,尺寸错误
  59820. return done();
  59821. }
  59822. var wrongK = 0;
  59823. if (rowBigBox0.k > 1 && rowBigBox1.k < 1 || rowBigBox0.k < 1 && rowBigBox1.k > 1) {
  59824. wrongK = rowBigBox0.k / rowBigBox1.k;
  59825. if (wrongK < 1) wrongK = 1 / wrongK;
  59826. }
  59827. /*
  59828. let trend0 = getPanoBoxAngleTrend(rowBigBox0)
  59829. let trend1 = getPanoBoxAngleTrend(rowBigBox1)
  59830. let judgeReverse = () => { //这个方法有时不准
  59831. let disLeftSquared0 = new THREE.Vector2(posLeft.x - rowBigBox0.pano.position.x, posLeft.z - rowBigBox0.pano.position.z).lengthSq()
  59832. let disRightSquared0 = new THREE.Vector2(posRight.x - rowBigBox0.pano.position.x, posRight.z - rowBigBox0.pano.position.z).lengthSq()
  59833. let a = trend0 * (disLeftSquared0 - disRightSquared0)
  59834. if (a < 0 && Math.abs(a) > 0.1) return true
  59835. let posLeft2 = reversed ? posRight : posLeft, //反向过的对第二个漫游点来说左右是反的
  59836. posRight2 = reversed ? posLeft : posRight
  59837. let disLeftSquared1 = new THREE.Vector2(posLeft2.x - rowBigBox1.pano.position.x, posLeft2.z - rowBigBox1.pano.position.z).lengthSq()
  59838. let disRightSquared1 = new THREE.Vector2(posRight2.x - rowBigBox1.pano.position.x, posRight2.z - rowBigBox1.pano.position.z).lengthSq()
  59839. let b = trend1 * (disLeftSquared1 - disRightSquared1)
  59840. if (b < 0 && Math.abs(b) > 0.1) return true
  59841. }
  59842. if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
  59843. //反向试试
  59844. leftInfo = getMatchScore(lefts[0], rights[1], { isSingle: true })
  59845. rightInfo = getMatchScore(rights[0], lefts[1], { isSingle: true })
  59846. posLeft = getBoxPos(leftInfo)
  59847. posRight = getBoxPos(rightInfo)
  59848. reversed = true //rowBigBox1 反向了
  59849. }
  59850. if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
  59851. return console.log('getCenter ;两个方向都不符合', rowBigBox0.sid, rowBigBox1.sid)
  59852. } */
  59853. /*const maxK = Math.max(0.6 / Math.sqrt(rowBigBox0.boxes.length), 0.2) // 最大斜率
  59854. if (k < maxK && k > 1 / maxK) {
  59855. return //console.log('放弃,斜率', k)
  59856. } */
  59857. //横的话,按x从小到大,竖的按z从小到大
  59858. if (k < 1 && posLeft.z > posRight.z || k > 1 && posLeft.x > posRight.x) {
  59859. var temp = posRight;
  59860. posRight = posLeft, posLeft = temp;
  59861. } //addLabel(posLeft, 'left-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
  59862. //addLabel(posRight, 'right-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
  59863. /* if (rowBigBox0.pano.id + '&' + rowBigBox1.pano.id == '22&26') {
  59864. console.log(777)
  59865. } */
  59866. /* var line1 = LineDraw.createLine([posLeft, posRight])
  59867. meshGroup.add(line1) */
  59868. //根据btmPos矫正一下中心位置, 否则容易偏漫游点这一侧
  59869. var center = new THREE.Vector3().addVectors(posLeft, posRight).multiplyScalar(0.5);
  59870. center.add(rowBigBox0.btmPos).add(rowBigBox1.btmPos).multiplyScalar(1 / 3);
  59871. var _match = getMatchScore(rowBigBox0, rowBigBox1, {
  59872. isSingle: true,
  59873. center
  59874. }); //是否预先传送center ?
  59875. //rowInfo.minAngs = [leftInfo.minAng , rightInfo.minAng]
  59876. /* if (match.name == 'pano4-row-6,4,1,3&pano0-row-0,1,4,5') {
  59877. console.log(8)
  59878. } */
  59879. var sc = _match.score - overLen * 1000 - wrongK * 100 + leftInfo.score + rightInfo.score;
  59880. if (sc < -4000) {
  59881. //console.log('放弃,匹配分过低,可能不是一组', rowBigBox0.sid, '和', rowBigBox1.sid, sc)
  59882. return done();
  59883. } //console.log('getcenter', rowBigBox0.sid, '和', rowBigBox1.sid, overLen, match.score + overLen * 1000 + leftInfo.score + rightInfo.score)
  59884. rowInfo = {
  59885. rowBigBox0,
  59886. rowBigBox1,
  59887. match: _match,
  59888. k,
  59889. posLeft,
  59890. posRight,
  59891. score: sc / 3 + 500,
  59892. //700 + match.score*0.7 + (leftInfo.score + rightInfo.score)*0.3 ,
  59893. reversed: info2.reversed
  59894. };
  59895. } else {
  59896. if (rowBigBox0.boxes.length == 1 && rowBigBox1.boxes.length == 1) {
  59897. rowInfo = getMatchScore(rowBigBox0.boxes[0], rowBigBox1.boxes[0]); //直接匹配box
  59898. } else {
  59899. //一对多。getMatchScore计算误差大(长度越长中心误差越大、宽度计算也误差大)所以再写点限制。直接使用btm来预测长度和位置似乎更准
  59900. var mulBoxRow = rowBigBox0.boxes.length > 1 ? rowBigBox0 : rowBigBox1;
  59901. var singleBox = rowBigBox0.boxes.length == 1 ? rowBigBox0 : rowBigBox1;
  59902. /* if(rowBigBox0.sid == "pano12-row-3" && rowBigBox1.sid == "pano0-row-3,1,0" ){
  59903. console.log(5)
  59904. } */
  59905. rowInfo = getMatchScore(rowBigBox0, rowBigBox1, {
  59906. dontCheckDis: true
  59907. }); //一对多 也可以根据方向检查距离,如仅检查z
  59908. rowInfo.k = mulBoxRow.k;
  59909. if (rowInfo.center) {
  59910. rowInfo.center.add(getBoxPos$1(mulBoxRow)).multiplyScalar(0.5);
  59911. }
  59912. if (rowInfo.name == 'pano0-row-14&pano4-row-8,11') {
  59913. addLabel$1(rowInfo.center, 'c');
  59914. }
  59915. rowInfo.predictSize = rowInfo.k > 1 ? {
  59916. x: mulBoxRow.predictLen,
  59917. y: 0.6
  59918. } : {
  59919. y: mulBoxRow.predictLen,
  59920. x: 0.6
  59921. }; //单个的应该和多个的其中一端一样,且是离单个漫游点近的那端(也就是要走到箱子一端看不见其他箱子才行)
  59922. var dis0 = getBoxPos$1(mulBoxRow.left).distanceToSquared(singleBox.pano.position);
  59923. var dis1 = getBoxPos$1(mulBoxRow.right).distanceToSquared(singleBox.pano.position);
  59924. var near = dis0 < dis1 ? mulBoxRow.left : mulBoxRow.right;
  59925. var p0 = getBoxPos$1(singleBox);
  59926. var dis = getBoxPos$1(near).distanceToSquared(p0);
  59927. rowInfo.score -= dis * 1000;
  59928. var p1 = getBoxPos$1(mulBoxRow);
  59929. var vec1 = new THREE.Vector2(p1.x - singleBox.pano.position.x, p1.z - singleBox.pano.position.z).normalize(); //看向中心的方向
  59930. var vec2 = new THREE.Vector2(singleBox.centerDir.x, singleBox.centerDir.z).normalize();
  59931. rowInfo.score += (vec1.dot(vec2) - 1) * 1000; //同一个方向是最好
  59932. }
  59933. }
  59934. function done(rowInfo) {
  59935. //rowInfo && rowInfos.push(rowInfo)
  59936. rowInfos.set(name, rowInfo);
  59937. }
  59938. done(rowInfo);
  59939. return rowInfo;
  59940. };
  59941. var matchGroups = [];
  59942. var getK = function getK(info) {
  59943. var k;
  59944. if (info.left) {
  59945. var vec = new THREE.Vector2(info.left.x - info.right.x, info.left.z - info.right.z);
  59946. k = Math.abs(vec.x / vec.y);
  59947. } else {
  59948. k = Math.abs(Math.max(info.size.x, 0.6) / Math.max(info.size.z, 0.6));
  59949. }
  59950. return k;
  59951. };
  59952. var ignoreCountMatch = groups.filter(function (e) {
  59953. return e.length > 1;
  59954. }).length == 1; //是否不同数量box的row也能匹配
  59955. var minScore = boundConfirmed$1 ? -2000 : -800;
  59956. var match = function match(searchType) {
  59957. if (searchType == 'second') ignoreCountMatch = true;
  59958. for (var i = 0; i < groups.length - 1; i++) {
  59959. var rowBigBoxes_0 = getPanoBigRowBox(groups[i]);
  59960. var pano0 = groups[i][0].pano;
  59961. if (searchType == 'second') rowBigBoxes_0 = rowBigBoxes_0.filter(function (e) {
  59962. return !matchGroups.some(function (u) {
  59963. return u.includes(e);
  59964. });
  59965. });
  59966. var _loop = function _loop(j) {
  59967. var rowBigBoxes_1 = getPanoBigRowBox(groups[j]);
  59968. if (searchType == 'second') rowBigBoxes_1 = rowBigBoxes_1.filter(function (e) {
  59969. return !matchGroups.some(function (u) {
  59970. return u.includes(e);
  59971. });
  59972. });
  59973. var pano1 = groups[j][0].pano;
  59974. if (pano0.id == 54 && pano1.id == 56) {
  59975. console.log(2);
  59976. }
  59977. var resultPairs = [];
  59978. var evaluateFun = function evaluateFun(row0, row1) {
  59979. return getRowMatchInfo(row0, row1, ignoreCountMatch);
  59980. };
  59981. searchPair$1(null
  59982. /* bigBoxes_0[0] */
  59983. , rowBigBoxes_0.slice(), rowBigBoxes_1.slice(), null, resultPairs, evaluateFun);
  59984. resultPairs = resultPairs.map(function (pairs) {
  59985. var infos = pairs.map(function (pair) {
  59986. return pair.some(function (e) {
  59987. return e.sid == 'void';
  59988. }) ? null : getRowMatchInfo(pair[0], pair[1], ignoreCountMatch);
  59989. }); //infos.sort((a,b)=>{return a.score-b.score});
  59990. var score = infos.reduce(function (s, e) {
  59991. return s + (e && e.score > minScore ? e.score : minScore / 2); //只考虑组成功的分数
  59992. }, 0);
  59993. return {
  59994. pairs,
  59995. infos,
  59996. score,
  59997. name: pairs.map(function (pair) {
  59998. return pair.map(function (item) {
  59999. return item.sid;
  60000. }).join(' & ');
  60001. })
  60002. };
  60003. });
  60004. resultPairs.sort(function (a, b) {
  60005. return b.score - a.score;
  60006. });
  60007. /* if (resultPairs[0].name[0].includes('pano8') && resultPairs[0].name[0].includes('pano0')) {
  60008. console.log(111)
  60009. } */
  60010. resultPairs[0] && resultPairs[0].pairs.forEach(function (pair, i) {
  60011. var info = resultPairs[0].infos[i];
  60012. if (info && info.score > minScore) {
  60013. var items = pair.filter(function (e) {
  60014. return e.sid != 'void';
  60015. });
  60016. common$1.pushToGroupAuto(items, matchGroups, null, function (atGroup) {
  60017. //需要朝向一致才行
  60018. if (!info.k) return true; //(box识别的宽高识别不准所以不需要)
  60019. var onePair = atGroup.relationships[0];
  60020. var name = onePair[0].sid + '&' + onePair[1].sid;
  60021. if (!rowInfos.get(name).k) return true; //不过不应该有这种情况,否则匹配不到一起才对
  60022. if (rowInfos.get(name).k < 1 && info.k < 1 || rowInfos.get(name).k > 1 && info.k > 1) {
  60023. return true;
  60024. } else {
  60025. console.log('k不一致无法匹配', info, atGroup);
  60026. }
  60027. }); //根据目前的规则应该是有端点的和有端点的匹配,box和box匹配
  60028. }
  60029. }); //console.log(resultPairs[0])
  60030. };
  60031. for (var j = i + 1; j < groups.length; j++) {
  60032. _loop(j);
  60033. }
  60034. }
  60035. };
  60036. match();
  60037. ignoreCountMatch || match('second'); //再次将剩余的匹配一下,这次允许个数不同的row匹配
  60038. //console.log('matchGroups', matchGroups)
  60039. //识别出来的多组,可能有重复的,因为box个数不同所以才没到一组
  60040. //整理一下,每个组整理出一个info,同时重新检查一下,挑去每组中和其他成员非常不同的
  60041. var groupInfo = [];
  60042. var getGroupInfo = function getGroupInfo(group) {
  60043. var left = new THREE.Vector3(),
  60044. right = new THREE.Vector3(),
  60045. pointsLen = 0;
  60046. var bigBoxes = [];
  60047. var info = {};
  60048. group.relationships.forEach(function (pair) {
  60049. var name = pair[0].sid + '&' + pair[1].sid;
  60050. var matchInfo = rowInfos.get(name); //this.matchScoreMap["rowBigBox"][name] || this.matchScoreMap["cabinet"][name];
  60051. if (matchInfo.posLeft) {
  60052. left.add(matchInfo.posLeft), right.add(matchInfo.posRight), pointsLen++;
  60053. } else {
  60054. bigBoxes.push(matchInfo);
  60055. preDealBox$1(matchInfo);
  60056. getBoxSize$1(matchInfo);
  60057. }
  60058. });
  60059. if (pointsLen > 0) {
  60060. left.multiplyScalar(1 / pointsLen);
  60061. right.multiplyScalar(1 / pointsLen); //addLabel(left, 'Left' + index, { bgcolor: '#F00', a: 0.2 })
  60062. //addLabel(right, 'Right' + index, { bgcolor: '#F00', a: 0.2 })
  60063. var center = new THREE.Vector3().addVectors(left, right).multiplyScalar(0.5) //addLabel(center, 'center' + index, { bgcolor: '#F00', a: 0.3 })
  60064. ;
  60065. info.left = left, info.right = right, info.center = center;
  60066. info.pointsLen = pointsLen;
  60067. }
  60068. if (bigBoxes.length > 0) {
  60069. var getAve = function getAve(bigBoxes) {
  60070. var center1 = new THREE.Vector3(),
  60071. size = new THREE.Vector3();
  60072. bigBoxes.forEach(function (box) {
  60073. var center0 = getBoxPos$1(box);
  60074. center1.add(center0);
  60075. size.add(box.size);
  60076. });
  60077. if (pointsLen > 0) {
  60078. var size0 = new THREE.Vector3(Math.abs(left.x - right.x), size.y, Math.abs(left.z - right.z));
  60079. size.add(size0.multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
  60080. center1.add(info.center.clone().multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
  60081. } else {
  60082. size.multiplyScalar(1 / bigBoxes.length);
  60083. center1.multiplyScalar(1 / bigBoxes.length);
  60084. }
  60085. return {
  60086. center1,
  60087. size
  60088. };
  60089. };
  60090. var getScores = function getScores(center, size) {
  60091. //获得相对于center,size的差别分数
  60092. bigBoxes.forEach(function (box) {
  60093. box.sc = -box.center.distanceToSquared(center1) - size.distanceToSquared(box.size) * 0.5;
  60094. });
  60095. };
  60096. var _getAve = getAve(bigBoxes),
  60097. center1 = _getAve.center1,
  60098. size = _getAve.size; //console.log(center1, size)
  60099. getScores(center1, size);
  60100. bigBoxes.sort(function (a, b) {
  60101. return b.sc - a.sc;
  60102. });
  60103. var midItem = bigBoxes[Math.floor(bigBoxes.length / 2)]; //中位数
  60104. getScores(midItem.center, midItem.size);
  60105. var _minScore = -8;
  60106. var removes = bigBoxes.filter(function (e) {
  60107. return e.sc < _minScore;
  60108. });
  60109. if (removes.length) {
  60110. var _common$disconnectGro2 = common$1.disconnectGroup(removes.map(function (e) {
  60111. return [e.box0, e.box1];
  60112. }), matchGroups),
  60113. newGroups = _common$disconnectGro2.newGroups;
  60114. console.log('去除错误数据', removes);
  60115. if (newGroups.length > 1) {
  60116. //分裂成多组了,重新计算
  60117. newGroups.forEach(function (e) {
  60118. getGroupInfo(e);
  60119. });
  60120. return;
  60121. }
  60122. bigBoxes = bigBoxes.filter(function (e) {
  60123. return e.sc >= _minScore;
  60124. });
  60125. }
  60126. if (bigBoxes.length) {
  60127. var o = getAve(bigBoxes) //again
  60128. ;
  60129. info.center = o.center1, info.size = o.size;
  60130. }
  60131. }
  60132. info.k = getK(info);
  60133. info.bigBoxes = bigBoxes;
  60134. info.group = group;
  60135. groupInfo.push(info);
  60136. };
  60137. matchGroups.slice(0).forEach(function (group) {
  60138. getGroupInfo(group);
  60139. });
  60140. var getLength = function getLength(c) {
  60141. //获取bigbox长度
  60142. 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;
  60143. };
  60144. var getLeft = function getLeft(group, k) {
  60145. var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
  60146. return group.left ? group.left[dirAxis] - 0.3 : group.center[dirAxis] - group.size[dirAxis] / 2; //left和right加减半个宽度
  60147. };
  60148. var getRight = function getRight(group, k) {
  60149. var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
  60150. return group.right ? group.right[dirAxis] + 0.3 : group.center[dirAxis] + group.size[dirAxis] / 2;
  60151. }; //识别是否group之间有一样的, 去重
  60152. {
  60153. var _ret = function () {
  60154. var realGroups = [];
  60155. var getAveWidth = function getAveWidth(infos, len) {
  60156. //获取这些infos最合适的箱子平均宽度和个数
  60157. var boxCounts = [];
  60158. infos.forEach(function (e) {
  60159. boxCounts.push.apply(boxCounts, _toConsumableArray(e.group.map(function (bigBox) {
  60160. return bigBox.boxes.length;
  60161. })));
  60162. });
  60163. boxCounts.sort(function (a, b) {
  60164. return a - b;
  60165. });
  60166. var midCounts = [];
  60167. var r0 = 0.3,
  60168. r1 = 0.7; //取中间这部分的算最适合的个数,结果不一定是中位数
  60169. boxCounts.slice(Math.floor(boxCounts.length * r0), Math.floor(boxCounts.length * r1) + 1).forEach(function (c) {
  60170. if (!midCounts.includes(c)) midCounts.push(c);
  60171. });
  60172. var _standards$cabinet$wi = standards$1.cabinet.widthNormal,
  60173. min = _standards$cabinet$wi.min,
  60174. max = _standards$cabinet$wi.max;
  60175. var standardW = (min + max) / 2;
  60176. var aveWs = midCounts.map(function (e) {
  60177. return {
  60178. aveW: len / e,
  60179. count: e
  60180. };
  60181. });
  60182. aveWs.sort(function (a, b) {
  60183. return Math.abs(a.aveW - standardW) - Math.abs(b.aveW - standardW);
  60184. });
  60185. var aveW = aveWs[0].aveW;
  60186. var count = aveWs[0].count;
  60187. if (aveW > max || aveW < min) {
  60188. var w = THREE.MathUtils.clamp(aveW, min, max); //console.warn(`box aveW宽度不太对,从${aveW}修改到${w}`)
  60189. aveW = w;
  60190. }
  60191. return {
  60192. aveW,
  60193. count
  60194. };
  60195. };
  60196. var getBox2 = function getBox2(center, len, thick, k) {
  60197. var box2 = new THREE.Box2();
  60198. box2.expandByPoint(new THREE.Vector2(center.x, center.z));
  60199. var sizeVec = k > 1 ? new THREE.Vector2(len / 2, thick / 2) : new THREE.Vector2(thick / 2, len / 2);
  60200. box2.expandByVector(sizeVec);
  60201. return box2;
  60202. };
  60203. var standardW = 0.6; //两排之间最小距离
  60204. var _loop2 = function _loop2(m) {
  60205. var group0 = groupInfo[m];
  60206. var _loop3 = function _loop3(n) {
  60207. var _group1$bigBoxes$, _group0$bigBoxes$;
  60208. var group1 = groupInfo[n];
  60209. 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') {
  60210. console.log(4);
  60211. }
  60212. if ((group0.k > 1 && group1.k < 1 || group0.k < 1 && group1.k > 1) && getLength(group0) > 1.5 && getLength(group1) > 1.5) return "continue"; //如果是方块状的无视k
  60213. //间距
  60214. var spaceAxis = (group0.k + group1.k) / 2 > 1 ? 'z' : 'x';
  60215. var spaceDis = Math.abs(group0.center[spaceAxis] - group1.center[spaceAxis]);
  60216. if (spaceDis > standardW * 1.5) return "continue";
  60217. var o0 = getAveWidth([group0], getLength(group0)); //因为有可能长度和箱子个数不匹配,所以需要得到限制后的宽度再比较
  60218. var o1 = getAveWidth([group1], getLength(group1));
  60219. var len0 = group0.predictLen = o0.aveW * o0.count;
  60220. var len1 = group1.predictLen = o1.aveW * o1.count;
  60221. // if( len0 / len1 < minR || len0 / len1 > 1/minR) continue
  60222. var area0 = group0.area = len0 * o0.aveW;
  60223. var area1 = group1.area = len1 * o1.aveW;
  60224. var getBoxMixArea = function getBoxMixArea(expandRatio1, expandRatio2) {
  60225. var box0 = getBox2(group0.center, len0 + expandRatio1, o0.aveW + expandRatio2, group0.k);
  60226. var box1 = getBox2(group1.center, len1 + expandRatio1, o1.aveW + expandRatio2, group1.k);
  60227. var mixBox = getMixBox$1(box0, box1); //重叠部分
  60228. var s = mixBox.getSize(new THREE.Vector2());
  60229. return {
  60230. box0,
  60231. box1,
  60232. areaMix: Math.max(0, s.x) * Math.max(0, s.y)
  60233. }; //可能是0
  60234. };
  60235. var areaMixExpand = getBoxMixArea(0.1, 0.3).areaMix;
  60236. if (areaMixExpand / area0 < 0.65 && areaMixExpand / area1 < 0.65) return "continue"; //包含的可以通过
  60237. /*let areaMix = getBoxMixArea(0, 0).areaMix //实际重合面积
  60238. group0.contains = group0.contains || []
  60239. group1.contains = group1.contains || []
  60240. group0.contains.push({ group: group1, selfPercent: areaMix / area0, percent2: areaMix / area1, areaMix })
  60241. group1.contains.push({ group: group0, selfPercent: areaMix / area1, percent2: areaMix / area0, areaMix })
  60242. */
  60243. //console.log('两个合并', group0, group1)
  60244. common$1.pushToGroupAuto([group0, group1], realGroups); //包含的直接合并吧 - - ,这样会使结果偏移,不过没办法了,多个重叠面积太难算了
  60245. };
  60246. for (var n = m + 1; n < groupInfo.length; n++) {
  60247. var _ret2 = _loop3(n);
  60248. if (_ret2 === "continue") continue;
  60249. }
  60250. };
  60251. for (var m = 0; m < groupInfo.length - 1; m++) {
  60252. _loop2(m);
  60253. } //但没合并前样本数量少,包含关系可能有错 - -
  60254. /*for(let m=0; m<groupInfo.length;m++){
  60255. let group = groupInfo[m]
  60256. let contains = group.contains.filter(e=> e.percent2 > 0.8) //所有包含的
  60257. contains.reduce
  60258. } */
  60259. groupInfo.forEach(function (info) {
  60260. //加入单个的
  60261. if (!realGroups.some(function (groups) {
  60262. return groups.includes(info);
  60263. })) {
  60264. realGroups.push([info]);
  60265. }
  60266. }); //console.log('realGroups', realGroups)
  60267. //get boxes
  60268. realGroups.forEach(function (infos, i) {
  60269. var sampleCount = infos.reduce(function (w, c) {
  60270. return w += c.pointsLen || c.bigBoxes.length;
  60271. }, 0);
  60272. var k;
  60273. /* {
  60274. //const k = infos.reduce((w, c) => (w += c.k), 0) / infos.length
  60275. let ks = infos.map(e => e.k)
  60276. ks.sort((a, b) => a - b)
  60277. let min = ks[0],
  60278. max = ks[ks.length - 1]
  60279. if (min < 1 && max > 1) {
  60280. //比较最小和最大,选取更极端的那个
  60281. let min_ = 1 / min
  60282. if (min_ < max) k = max
  60283. else k = min
  60284. } else k = (min + max) / 2
  60285. } */
  60286. {
  60287. //看>1的和<1的平均数哪个多用哪个
  60288. var ks = {
  60289. '<1': {
  60290. count: 0,
  60291. sum: 0
  60292. },
  60293. '>1': {
  60294. count: 0,
  60295. sum: 0
  60296. }
  60297. };
  60298. infos.forEach(function (e) {
  60299. if (e.k < 1) {
  60300. ks['<1'].count++, ks['<1'].sum += 1 / e.k;
  60301. } else {
  60302. ks['>1'].count++, ks['>1'].sum += e.k;
  60303. }
  60304. });
  60305. ks['<1'].count && (ks['<1'].ave = ks['<1'].sum / ks['<1'].count);
  60306. ks['>1'].count && (ks['>1'].ave = ks['>1'].sum / ks['>1'].count);
  60307. if (ks['<1'].ave > ks['>1'].ave) {
  60308. k = 1 / ks['<1'].ave;
  60309. } else {
  60310. k = ks['>1'].ave;
  60311. }
  60312. }
  60313. var centerPos = infos.reduce(function (w, c) {
  60314. return w.add(c.center.clone().multiplyScalar(c.pointsLen || c.bigBoxes.length));
  60315. }, new THREE.Vector3()).multiplyScalar(1 / sampleCount); //预得中心点
  60316. //获取左右端点(需要排除可能的误差,所以采用最靠近端点的三个点。但无法排除前三个点中万一含有包含box的、或者误差大的端点)
  60317. var lefts = infos.map(function (e) {
  60318. return getLeft(e, k);
  60319. }).sort(function (a, b) {
  60320. return a - b;
  60321. }).filter(function (a) {
  60322. return a < centerPos[k > 1 ? 'x' : 'z'];
  60323. }).slice(0, 3);
  60324. var rights = infos.map(function (e) {
  60325. return getRight(e, k);
  60326. }).sort(function (a, b) {
  60327. return b - a;
  60328. }).filter(function (a) {
  60329. return a > centerPos[k > 1 ? 'x' : 'z'];
  60330. }).slice(0, 3);
  60331. var left = 0,
  60332. right = 0;
  60333. var c0 = (lefts.length + 1) * lefts.length / 2;
  60334. lefts.forEach(function (e, i) {
  60335. //越靠近最外侧权重越高。
  60336. left += e * ((lefts.length - i) / c0);
  60337. });
  60338. c0 = (rights.length + 1) * rights.length / 2;
  60339. rights.forEach(function (e, i) {
  60340. right += e * ((rights.length - i) / c0);
  60341. });
  60342. centerPos[k > 1 ? 'x' : 'z'] = (left + right) / 2;
  60343. var len = right - left; //加一点值是因为之前计算长度,用的是最外box的中心点,会少box一半宽度
  60344. var infos2 = infos.filter(function (e) {
  60345. return !e.predictLen || e.predictLen / len > 0.7;
  60346. });
  60347. if (infos2.length == 0) {
  60348. infos2 = infos.sort(function (a, b) {
  60349. return b.predictLen - a.predictLen;
  60350. }).slice(0, 1);
  60351. }
  60352. var _getAveWidth = getAveWidth(infos2, len),
  60353. aveW = _getAveWidth.aveW,
  60354. count = _getAveWidth.count; //长宽比中心点的误差更大,尤其是box类型的、或样本少的
  60355. //获取高度
  60356. var heights = [];
  60357. {
  60358. var heightss;
  60359. /* infos.forEach(e => {
  60360. pairs.push(...e.group.relationships.filter(pair => pair[0].boxes.length == count && pair[1].boxes.length == count))
  60361. })
  60362. if (pairs.length) {
  60363. heightss = pairs.map(pair => {
  60364. let boxes = pair.map(e => {
  60365. return e.boxes.slice()
  60366. })
  60367. let match = rowInfos[pair[0].sid + '&' + pair[1].sid]
  60368. let ifReverse = match.reversed
  60369. if (match.reversed == void 0 && pair[0].boxes.length > 1 && pair[1].boxes.length > 1) {
  60370. let { reversed } = getReverseInfo(pair[0], pair[1])
  60371. ifReverse = reversed
  60372. }
  60373. if (ifReverse) {
  60374. boxes[1].reverse()
  60375. }
  60376. let heights1 = []
  60377. let topPoss = []
  60378. for (let i = 0; i < count; i++) {
  60379. let match1 = getMatchScore(boxes[0][i], boxes[1][i], { onlyGet: true })
  60380. let topPos = match1 && match1.topPos
  60381. if (!topPos) {
  60382. topPos = getBoxTop({ box0: boxes[0][i], box1: boxes[1][i] })
  60383. }
  60384. heights1.push(topPos.y - groundY)
  60385. if (topPos.y - groundY < 0) {
  60386. console.log('?')
  60387. }
  60388. topPoss.push(topPos)
  60389. }
  60390. if ((k < 1 && topPoss[0].z > topPoss[count - 1].z) || (k > 1 && topPoss[0].x > topPoss[count - 1].x)) {
  60391. heights1.reverse()
  60392. }
  60393. return heights1
  60394. })
  60395. } else { */
  60396. var bigBoxes = [];
  60397. infos.forEach(function (e) {
  60398. bigBoxes.push.apply(bigBoxes, _toConsumableArray(e.group.filter(function (e) {
  60399. return !bigBoxes.includes(e) && e.boxes.length == count;
  60400. })));
  60401. });
  60402. heightss = bigBoxes.map(function (bigBox) {
  60403. var topPoss = bigBox.boxes.map(function (box) {
  60404. var a = {
  60405. box0: box
  60406. };
  60407. getBoxTop$1(a);
  60408. return a.topPos;
  60409. });
  60410. if (k < 1 && topPoss[0].z > topPoss[count - 1].z || k > 1 && topPoss[0].x > topPoss[count - 1].x) {
  60411. topPoss.reverse();
  60412. }
  60413. var heights1 = topPoss.map(function (topPos) {
  60414. return topPos.y - groundY$1;
  60415. });
  60416. return heights1;
  60417. }); //}
  60418. heightss.forEach(function (arr) {
  60419. for (var _i2 = 0; _i2 < count; _i2++) {
  60420. heights[_i2] = (heights[_i2] || 0) + arr[_i2];
  60421. }
  60422. });
  60423. heights = heights.map(function (e) {
  60424. var h = e / heightss.length;
  60425. return h;
  60426. }); //console.log('heightss',heightss, pairs, heights)
  60427. } //拆分成小box
  60428. var size = new THREE.Vector3(aveW, 2, aveW);
  60429. var c = 0;
  60430. infos.rowboxs = [];
  60431. while (c < count) {
  60432. var center = void 0;
  60433. if (k > 1) {
  60434. var startX = centerPos.x - (count - 1) / 2 * aveW;
  60435. center = new THREE.Vector3(startX + c * aveW, centerPos.y, centerPos.z);
  60436. } else {
  60437. var startZ = centerPos.z - (count - 1) / 2 * aveW;
  60438. center = new THREE.Vector3(centerPos.x, centerPos.y, startZ + c * aveW);
  60439. }
  60440. var size1 = heights[c] ? size.clone().setY(heights[c]) : size; //如1*3的是得不到height的
  60441. var box = new Box$1({
  60442. name: 'row' + i + '-' + c,
  60443. center,
  60444. size: size1,
  60445. boxType: 'cabinet',
  60446. infos
  60447. });
  60448. c++;
  60449. infos.rowboxs.push(box);
  60450. }
  60451. });
  60452. return {
  60453. v: realGroups.length > 0
  60454. };
  60455. }();
  60456. if (typeof _ret === "object") return _ret.v;
  60457. }
  60458. };
  60459. var removeContain = function removeContain(arr) {
  60460. //去除嵌套
  60461. var len = arr.length;
  60462. if (len < 2) return;
  60463. for (var i = 0; i < len - 1; i++) {
  60464. var box0 = arr[i];
  60465. getBoxBase$1(box0);
  60466. box0.contains = box0.contains || [];
  60467. for (var j = i + 1; j < len; j++) {
  60468. var box1 = arr[j];
  60469. /* if (box0.sid == 'pano2-1' && box1.sid == 'pano2-7') {
  60470. console.log(6)
  60471. } */
  60472. getBoxBase$1(box1);
  60473. box1.contains = box1.contains || [];
  60474. var d3 = Math.abs(box1.bbox2CenterX - box0.bbox2CenterX); //限制d3是因为在相差180度两端可能也符合
  60475. //d4 = Math.abs(box1.bbox2[3] - box0.bbox2[3])
  60476. if (d3 > 0.4
  60477. /* || d4 > 0.01 */
  60478. ) continue;
  60479. var d0 = getBbox2Diff$1(box1.bbox2[0], box0.bbox2[0]),
  60480. d1 = getBbox2Diff$1(box0.bbox2[2], box1.bbox2[2]),
  60481. w0 = getBbox2Diff$1(box0.bbox2[2], box0.bbox2[0]),
  60482. w1 = getBbox2Diff$1(box1.bbox2[2], box1.bbox2[0]);
  60483. var min = Math.min(0.005, Math.min(w0, w1) * 0.2); //如果本身w0,w1宽度就小,差距更要小
  60484. if (d1 >= 0 && Math.abs(d0) < min || d0 >= 0 && Math.abs(d1) < min || d1 >= 0 && d0 >= 0) {
  60485. box0.contains.push(box1);
  60486. } else if (d0 <= 0 && Math.abs(d1) < min || d1 <= 0 && Math.abs(d0) < min || d1 <= 0 && d0 <= 0) {
  60487. box1.contains.push(box0);
  60488. }
  60489. }
  60490. }
  60491. var getWidthScore = function getWidthScore(box, type) {
  60492. var addDis = 0.1; //因为用的是btm的pos,比中心点近了一些,所以加上一段距离
  60493. var o = getBoxPoseByPos$1(box, getBoxPos$1(box), addDis);
  60494. var boxPjW = o.projectWidth;
  60495. var standardPjW = (o.maxProjectWidth + o.minProjectWidth) / 2;
  60496. var s = type == 'out' ? boxPjW - standardPjW : standardPjW - boxPjW;
  60497. return -Math.pow(s, 2) * 10;
  60498. };
  60499. var minChildCount = arr[0].boxType == 'battery' ? 1 : 2;
  60500. arr.slice().forEach(function (box) {
  60501. if (box.contains.length >= minChildCount) {
  60502. //假设不存在第二层嵌套, 假设每个只能被一个嵌套
  60503. //决定留大还是留小
  60504. //先只去掉包含两个以上的,且角度范围一致
  60505. //尽量保留内层,除非内层太小
  60506. var _getLeftRight2 = getLeftRight$1(box.contains),
  60507. leftX = _getLeftRight2.leftX,
  60508. rightX = _getLeftRight2.rightX;
  60509. if (box.contains.length > 1 && (Math.abs(getBbox2Diff$1(box.bbox2[0], leftX)) > 0.005 || Math.abs(getBbox2Diff$1(box.bbox2[2], rightX)) > 0.005)) return; //范围不一致
  60510. var remainChild = true;
  60511. if (box.contains.length == 1) {
  60512. //cdi6xzNiNdS 电池包含单个 感觉一般都是留大
  60513. remainChild = false;
  60514. } else {
  60515. var outScore = getWidthScore(box, 'out');
  60516. var childrenScores = box.contains.map(function (e) {
  60517. return getWidthScore(e, 'in');
  60518. });
  60519. var childAve = childrenScores.reduce(function (w, c) {
  60520. return w + c;
  60521. }, 0) / childrenScores.length;
  60522. if (childAve < -4) {
  60523. //let outScore = getWidthScore(box, 'out')
  60524. remainChild = childAve > outScore;
  60525. }
  60526. }
  60527. if (!remainChild) {
  60528. box.contains.forEach(function (e) {
  60529. var _console;
  60530. e.state = '因被嵌套被删除', e.containBy = box;
  60531. arr.splice(arr.indexOf(e), 1);
  60532. (_console = console).log.apply(_console, ['因被嵌套被删除'].concat(_toConsumableArray(box.contains)));
  60533. });
  60534. } else {
  60535. box.state = '因嵌套其他被删除';
  60536. console.log('因嵌套其他被删除', box);
  60537. arr.splice(arr.indexOf(box), 1);
  60538. }
  60539. }
  60540. });
  60541. };
  60542. var waitFindRest = [];
  60543. var Search = function Search(type) {
  60544. console.error('开始search', type);
  60545. var matchScoreMap = _this3.matchScoreMap[type] = new Map();
  60546. var datas = {};
  60547. var panoIds = [];
  60548. for (var id in _this3.datas) {
  60549. if (!_this3.datas[id]) continue;
  60550. datas[id] = _this3.datas[id].shapes.filter(function (e) {
  60551. return isType$1(e.category, type);
  60552. });
  60553. datas[id].length && panoIds.push(id);
  60554. }
  60555. var _loop4 = function _loop4(_id) {
  60556. //对data预处理
  60557. //(之后如果还出现不同类型重叠在一起的,需要先识别摘除下。 )4GqaqNdyjGf
  60558. if (!_this3.datas[_id]) return "continue";
  60559. removeContain(datas[_id]); //去除线框中的嵌套,主要是一个嵌套两个的。案例:KK-1Zjm9Rbl47
  60560. if (datas[_id].length) {
  60561. //融合。很多box被一分为二了,基本都是在全景图左右边界处。
  60562. var bigBoxes = getPanoBigRowBox(datas[_id], {
  60563. reason: 'mix'
  60564. });
  60565. bigBoxes.forEach(function (bigBox) {
  60566. if (bigBox.boxes.length > 1) {
  60567. bigBox.boxes.forEach(function (box) {
  60568. box.state = '被删除', box.mixTo = bigBox;
  60569. var i = datas[_id].indexOf(box);
  60570. datas[_id].splice(i, 1);
  60571. {
  60572. i = _this3.datasMixed[_id].shapes.findIndex(function (e) {
  60573. return e.sid == box.sid;
  60574. });
  60575. _this3.datasMixed[_id].shapes.splice(i, 1);
  60576. }
  60577. }); //console.log('因融合而删除', bigBox.boxes)
  60578. datas[_id].push(bigBox);
  60579. {
  60580. _this3.datasMixed[_id].shapes.push(bigBox);
  60581. }
  60582. var shapes = _this3.datas[_id].shapes;
  60583. bigBox.index = shapes.length > 1 ? shapes[shapes.length - 1].index + 1 : 0;
  60584. {
  60585. var a = bigBox.sid.split('mix-');
  60586. bigBox.sid = a[0] + bigBox.index + '(mix' + a[1] + ')'; //"pano20-mix-1,2"
  60587. }
  60588. }
  60589. });
  60590. }
  60591. };
  60592. for (var _id in _this3.datas) {
  60593. var _ret3 = _loop4(_id);
  60594. if (_ret3 === "continue") continue;
  60595. }
  60596. if (panoIds.length == 0) {
  60597. if (standards$1[type].tinyXZ) {
  60598. //fire 调试:nZrBdvRaDuC
  60599. _this3.expandModelBound();
  60600. }
  60601. return;
  60602. }
  60603. panoIds.sort(function (a, b) {
  60604. return datas[b].length - datas[a].length;
  60605. });
  60606. var groups = panoIds.map(function (e) {
  60607. return datas[e];
  60608. }); //console.log('按box个数排序:', groups.slice())
  60609. var group0 = groups[0],
  60610. len0 = group0.length;
  60611. if (groups.length == 1) {
  60612. //只有一个全景里有数据
  60613. if (standards$1[type].tinyXZ) {
  60614. //fire. 无法match以获取groundY, 就取消。 调试: eGhyf5QdVHA
  60615. _this3.expandModelBound(type);
  60616. }
  60617. group0.forEach(function (e) {
  60618. return createSinglePano(e);
  60619. });
  60620. return combines(type);
  60621. }
  60622. var finish = function finish(groups) {
  60623. waitFindRest.push({
  60624. type,
  60625. args: [groups]
  60626. }); //等待最后检查遗漏
  60627. if (standards$1[type].tinyXZ) {
  60628. //fire 调试:nZrBdvRaDuC
  60629. _this3.confirmGroundY(type);
  60630. }
  60631. if (standards$1[type].tiny) {
  60632. //monitor 调试:S9yepREK8Jl
  60633. _this3.expandModelBound2(type);
  60634. }
  60635. };
  60636. if (len0 == 1) {
  60637. //最多的也只有一个box。此情况大部分是空调
  60638. panoIds.forEach(function (e) {
  60639. return getBoxBase$1(datas[e][0]);
  60640. });
  60641. for (var i = 0; i < panoIds.length; i++) {
  60642. var box0 = datas[panoIds[i]][0];
  60643. for (var j = i + 1; j < panoIds.length; j++) {
  60644. var box1 = datas[panoIds[j]][0];
  60645. getMatchScore(box0, box1, {
  60646. isSingle: true
  60647. });
  60648. }
  60649. }
  60650. /* let list = Object.keys(matchScoreMap)
  60651. list.sort((a, b) => {
  60652. return matchScoreMap[b].score - matchScoreMap[a].score
  60653. })
  60654. let match = matchScoreMap[list[0]] */
  60655. var list = Array.from(matchScoreMap).map(function (e) {
  60656. return e[1];
  60657. }).sort(function (a, b) {
  60658. return b.score - a.score;
  60659. });
  60660. var match = list[0];
  60661. preDealBox$1(match);
  60662. if (match.score > -100) {
  60663. getBoxSize$1(match);
  60664. if (match.score > 0 && match.sizeAdjust < 0.1) {
  60665. new Box$1(match); //waitFindRest.push({ type, args: [groups] }) //等待最后检查遗漏
  60666. finish(groups);
  60667. return;
  60668. }
  60669. } //根据分数重排序,前两个已匹配的pano放在第一第二(reMatchLowScores会跳过),获得groups2
  60670. var panoIds2 = [];
  60671. /* list.forEach(e => {
  60672. let info = matchScoreMap[e]
  60673. if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id)
  60674. if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id)
  60675. }) */
  60676. list.forEach(function (info) {
  60677. if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id);
  60678. if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id);
  60679. });
  60680. var groups2 = panoIds2.map(function (e) {
  60681. return datas[e];
  60682. }); //继续match
  60683. reMatchLowScores([match], groups2);
  60684. finish(groups2);
  60685. return;
  60686. }
  60687. {
  60688. //重新根据距离排序,挑选离所有box距离最近的两个pano (远的可能看不到box,或者得到的线框计算的位置不准。不过其实太近也不准-,-)
  60689. var counts = {};
  60690. groups.forEach(function (e) {
  60691. e.forEach(function (a) {
  60692. return getBoxBase$1(a);
  60693. });
  60694. counts[e.length] || (counts[e.length] = []);
  60695. counts[e.length].push(e);
  60696. });
  60697. groups = [];
  60698. standards$1[type].atWall;
  60699. var nums = Object.keys(counts);
  60700. var bestDisSquared = 2;
  60701. nums.reverse();
  60702. nums.forEach(function (count) {
  60703. var _groups;
  60704. var groups_ = counts[count];
  60705. if (groups_.length > 1) {
  60706. groups_.forEach(function (e) {
  60707. e.disSc = e.reduce(function (w, c) {
  60708. var pos = getBoxPos$1(c); //let s = atWall ? Math.pow(Math.abs(c.centerDir.y), 3)*100 : 0 //在墙上的话尽量平视
  60709. //console.log(c.sid,s)
  60710. return w + Math.abs(c.pano.position.distanceToSquared(pos) - bestDisSquared); //+ s
  60711. }, 0);
  60712. });
  60713. groups_.sort(function (a, b) {
  60714. return a.disSc - b.disSc;
  60715. });
  60716. }
  60717. (_groups = groups).push.apply(_groups, _toConsumableArray(groups_));
  60718. }); //console.log('按距离和个数排序:', groups)
  60719. group0 = groups[0];
  60720. len0 = group0.length;
  60721. }
  60722. if (type == 'cabinet') {
  60723. //转化为分组
  60724. if (searchByRow(groups)) {
  60725. waitFindRest.push({
  60726. type,
  60727. args: [groups, 0]
  60728. }); //等待最后检查遗漏
  60729. return;
  60730. }
  60731. } //零散匹配。
  60732. var match2Group = function match2Group(group0, group1) {
  60733. var _ref6 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  60734. fake = _ref6.fake;
  60735. group0.length;
  60736. group1.length;
  60737. /* for (let i = 0; i < len0; i++) {
  60738. //复杂度:n的平方次
  60739. for (let j = 0; j < len1; j++) {
  60740. let box1 = group0[i]
  60741. let box2 = group1[j]
  60742. let result = getMatchScore(box1, box2)
  60743. }
  60744. } */
  60745. //寻找最佳配对 n!种组合(是否要限制个数多的情况?) 超过8个就很恐怖
  60746. //仅先查找选中的两个pano配对
  60747. var resultPairs = [];
  60748. var newGroup0 = group0.slice(0);
  60749. var newGroup1 = group1.slice(0);
  60750. /* while (newGroup1.length < newGroup0.length) {
  60751. newGroup1.push({ sid: 'void' }) //为了使排列正确,补个空,使左右两边个数相等,过后和void匹配的不会计算box
  60752. } */
  60753. var evaluateFun = getMatchScore.bind(_this3);
  60754. searchPair$1(
  60755. /* group0[0] */
  60756. null, newGroup0, newGroup1, null, resultPairs, evaluateFun);
  60757. /* console.log(
  60758. 'resultPairs',
  60759. resultPairs.map(pairs => pairs.map(pair => pair.map(item => item.sid).join(' & ')))
  60760. ) */
  60761. resultPairs = resultPairs.map(function (pairs) {
  60762. var infos = pairs.map(function (pair) {
  60763. return getMatchScore(pair[0], pair[1]);
  60764. }); //matchScoreMap[pair[0].sid + '&' + pair[1].sid])
  60765. var score = infos.reduce(function (s, e) {
  60766. return s + (e ? e.score : 0);
  60767. }, 0);
  60768. var o = {
  60769. infos,
  60770. score,
  60771. pairs,
  60772. name: pairs.map(function (pair) {
  60773. return pair.map(function (item) {
  60774. return item.sid;
  60775. }).join(' & ');
  60776. })
  60777. };
  60778. return o;
  60779. }); //console.log('resultPairs', resultPairs.slice())
  60780. console.log('resultPairs按分数高低', resultPairs.sort(function (a, b) {
  60781. return b.score - a.score;
  60782. })); //console.log('compu',compu)
  60783. var minScore = boundConfirmed$1 ? -2000 : -800;
  60784. var noMatches = []; //和void匹配的,需要和其他pano的重新匹配
  60785. var lowScores = [];
  60786. if (resultPairs[0]) {
  60787. resultPairs[0].infos.forEach(function (info, i) {
  60788. if (!info) {
  60789. noMatches.push(resultPairs[0].pairs[i].find(function (e) {
  60790. return e.sid != 'void';
  60791. }));
  60792. return; //match with void
  60793. }
  60794. if (info.score < minScore || standards$1[info.boxType].bottom && info.minAng < 5) {
  60795. lowScores.push(info);
  60796. return;
  60797. }
  60798. preDealBox$1(info);
  60799. getBoxSize$1(info);
  60800. if (info.sizeAdjust && standards$1[info.boxType].tiny || info.sizeAdjust > 0.2) {
  60801. //或者识别下悬挂的且线的角度较小
  60802. lowScores.push(info);
  60803. return;
  60804. }
  60805. if (info.box0.category == typeNames$1.battery && info.size.x < 1 && info.size.z < 1) {
  60806. //宽度较小
  60807. var vec0 = new THREE.Vector3().subVectors(info.box0.pano.position, getBoxPos$1(info));
  60808. var vec1 = new THREE.Vector3().subVectors(info.box1.pano.position, getBoxPos$1(info));
  60809. /* let k0 = Math.abs(vec0.x / vec0.z), k1 = Math.abs(vec1.x / vec1.z), maxR = 6
  60810. if(info.name == '') */
  60811. if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0
  60812. /* || k0/k1 > maxR || k0/k1 < 1/maxR */
  60813. ) {
  60814. //同一个象限 或 偏向一侧
  60815. lowScores.push(info);
  60816. return;
  60817. }
  60818. }
  60819. info.fake = fake;
  60820. new Box$1(info);
  60821. });
  60822. }
  60823. if (noMatches.length) {
  60824. reMatchLowScores(noMatches.map(function (e) {
  60825. return {
  60826. box0: e
  60827. };
  60828. }), groups, {
  60829. fake
  60830. });
  60831. }
  60832. reMatchLowScores(lowScores, groups, {
  60833. fake
  60834. });
  60835. };
  60836. {
  60837. var disScores = []; //避免两个组之间距离太远 //KJ-iUrPonbhCQo 大的场景有很多柜子时,groups的前两个元素很可能相隔很远,导致匹配不到柜子。
  60838. for (var _i3 = 0; _i3 < groups.length - 1; _i3++) {
  60839. var disSqure = groups[_i3][0].pano.position.distanceToSquared(groups[_i3 + 1][0].pano.position);
  60840. var disScore = math$2.linearClamp(disSqure, [0, 0.4, 2, 6, 100], [-10, 0, 10, 5, -100]);
  60841. var score = disScore + (groups[_i3].length + groups[_i3 + 1].length);
  60842. disScores.push({
  60843. score,
  60844. i: _i3,
  60845. disSqure,
  60846. length1: groups[_i3].length,
  60847. length2: groups[_i3 + 1].length
  60848. });
  60849. }
  60850. disScores.sort(function (a, b) {
  60851. return b.score - a.score;
  60852. });
  60853. for (var _j2 = 0; _j2 < groups.length - 1; _j2++) {
  60854. match2Group(groups[disScores[_j2].i], groups[disScores[_j2].i + 1], {
  60855. fake: _j2 > 0
  60856. });
  60857. if (!standards$1[type].tinyXZ) {
  60858. // 只有tinyXZ的多match几组 (如果场景比较大,最好也多match几组?)
  60859. break;
  60860. }
  60861. }
  60862. }
  60863. finish(groups);
  60864. };
  60865. function blocked(box) {
  60866. //该box是否被实体box遮挡
  60867. //WcLVXvmV9AU:pano2-2 和 pano12-4 ; 5yhlMduTHL8:pano2-10
  60868. /* if (box.sid == 'pano6-7') {
  60869. console.log(1)
  60870. addLine(box.pano.position, box.centerBtmDir, 20)
  60871. } */
  60872. if (!standards$1[box.boxType].bottom) {
  60873. //当底部每个方向都有遮挡物时,其位置很可能不准。但若是部分遮住,还是有可能识别对的
  60874. if (!box.blocked) {
  60875. box.blocked = {
  60876. centerBtmDir: null,
  60877. leftBtmDir: null,
  60878. rightBtmDir: null
  60879. };
  60880. }
  60881. var _loop5 = function _loop5(dir) {
  60882. if (!box.blocked[dir]) {
  60883. var block = boxesSolid$1.find(function (boxSolid) {
  60884. ray$1.set(box.pano.position, box[dir]);
  60885. var o = ray$1.ray.intersectsBox(boxSolid.bound);
  60886. if (o) {
  60887. // 遮挡
  60888. return true;
  60889. }
  60890. });
  60891. if (block) {
  60892. //若不存在,即都遮挡了,就算真的遮挡
  60893. box.blocked[dir] = block;
  60894. } else {
  60895. box.blocked[dir] = false;
  60896. return {
  60897. v: false
  60898. }; //找到一个方向无遮挡则可返回
  60899. }
  60900. }
  60901. };
  60902. for (var dir in box.blocked) {
  60903. var _ret4 = _loop5(dir);
  60904. if (typeof _ret4 === "object") return _ret4.v;
  60905. }
  60906. return true; //暂定,若某个方向已得到遮挡了,就不计算。但若没有,就再搜一遍(如果会重复搜之后再增加一个stamp啥的,比如记录下当前所有solidBoxes的name,如果改变了就重新搜下)
  60907. } else {
  60908. //若中心方向已经有同类型的box,很可能它就是自身(因为挂墙的预测位置很不准,所以需要这一步。越tiny的越能通过此来筛选)
  60909. var block = boxesSolid$1.find(function (boxSolid) {
  60910. if (boxSolid.boxType != box.boxType) return;
  60911. ray$1.set(box.pano.position, box.centerDir);
  60912. var o = ray$1.ray.intersectsBox(boxSolid.bound);
  60913. if (o) {
  60914. // 遮挡
  60915. return true;
  60916. }
  60917. });
  60918. if (block) {
  60919. box.blocked = block;
  60920. return true;
  60921. }
  60922. }
  60923. } //调试 O540aEVF3b7 jQUQlER160 n4z0yd5tQaF WcLVXvmV9AU 8czlwsbSe5 NlUM8yGve9
  60924. function findRest(groups
  60925. /* ,startIndex=2 */
  60926. ) {
  60927. //查找是否有遗漏。
  60928. //1 可能有距离较远的box不在头两个pano的附近导致被漏掉。(概率很小)
  60929. //2 被剩余的 (包括低分匹配中放弃的,这种需要的距离识别度高)
  60930. var tolerateWidth = {
  60931. min: 0.1,
  60932. max: 0.5
  60933. };
  60934. var boxes = [],
  60935. scores = new Map(),
  60936. bestDisSquared = 2;
  60937. groups.forEach(function (g) {
  60938. var _boxes;
  60939. (_boxes = boxes).push.apply(_boxes, _toConsumableArray(g));
  60940. });
  60941. boxes = boxes.filter(function (box) {
  60942. return !used(box);
  60943. });
  60944. boxes.forEach(function (box) {
  60945. getBoxBase$1(box);
  60946. var p1 = new THREE.Vector2(box.pano.position.x, box.pano.position.z);
  60947. var p2 = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
  60948. var dis = p1.distanceToSquared(p2);
  60949. var s1 = -Math.abs(dis - bestDisSquared); //将距离最佳的排前面,距离远的得到的位置不准确,也容易被遮
  60950. if (!box.pose) box.pose = getBoxPoseByPos$1(box, getBoxPos$1(box));
  60951. var s2 = getPoseScore$1([box.pose], box.boxType) + THREE.MathUtils.clamp(box.pose.projectWidth, box.pose.minProjectWidth, box.pose.maxProjectWidth) * 7; //projectWidth长的更安全
  60952. scores.set(box, {
  60953. s1,
  60954. s2,
  60955. sum: s1 + s2
  60956. });
  60957. }); //console.log(boxes[0].boxType,scores)
  60958. boxes = boxes.sort(function (a, b) {
  60959. return scores.get(b).sum - scores.get(a).sum;
  60960. }); //FXcq5PI9QGv
  60961. //console.log(boxes)
  60962. boxes.forEach(function (box) {
  60963. if (box.sid == 'pano0-4') {
  60964. console.log(3);
  60965. }
  60966. if (!used(box) && !blocked(box)) {
  60967. //如果和现有的box的距离都很远,很可能是漏掉的
  60968. var near = boxesSolid$1.find(function (solidBox) {
  60969. if (solidBox.name == 'air-pano16-7&pano14-13') {
  60970. console.log(3);
  60971. }
  60972. if (solidBox.boxType != box.boxType && (solidBox.boxType == 'air-hanging' || box.boxType == 'air-hanging')) return; //挂空调一般不会撞到地面上的
  60973. var p1 = getBoxPos$1(solidBox);
  60974. var p2 = getBoxPos$1(box);
  60975. new THREE.Vector2(p1.x, p1.z);
  60976. new THREE.Vector2(p2.x, p2.z);
  60977. var maxWidth = standards$1[box.boxType].widthNormal.max / 2;
  60978. maxWidth = THREE.MathUtils.clamp(maxWidth, tolerateWidth.min, tolerateWidth.max); //因为场景精度存在较大误差,所以maxWidth不能过小,否则像灭火器摄像头都容易findRest多个
  60979. var dis = solidBox.bound.distanceToPoint(p2); //let r0 = solidBox.boxType == 'air' ? 2 : solidBox.boxType == 'battery' ? 1.1 : 1 //空调最不容易扎堆放置,所以范围设置广一些
  60980. var r0 = standards$1[box.boxType].closeRatio;
  60981. var r1 = math$2.linearClamp(box.pano.position.distanceTo(p2), 3, 20, 1, 5); //距离远的话识别、计算都会更不准确,给一定的容错. 远的尽量不findRest,即尽量>0
  60982. var ra = (solidBox.boxType == box.boxType ? 1 : 0.5) * r0 * r1; //数字越小限制越大
  60983. /* let a = maxWidth * maxWidth * ra - p1_.distanceToSquared(p2_)
  60984. let b = -dis * dis * 0.7
  60985. let c = a + b*/
  60986. var c = maxWidth * ra - dis * 1.3;
  60987. /* if (c > 0) {
  60988. //太近 不创建
  60989. console.log(1)
  60990. } */
  60991. return c > 0;
  60992. });
  60993. if (!near) {
  60994. reMatchLowScores([{
  60995. box0: box,
  60996. log: 'findRest'
  60997. }], groups, {
  60998. startIndex: 0
  60999. });
  61000. }
  61001. }
  61002. });
  61003. }
  61004. function used(box) {
  61005. //是否已经使用过
  61006. var has = function has(e) {
  61007. return e.box0 == box || e.box1 == box;
  61008. };
  61009. var traverse = function traverse(e) {
  61010. return has(e) || e.list && e.list.some(function (a) {
  61011. return traverse(a);
  61012. }) || e.mixedFrom && e.mixedFrom.some(function (a) {
  61013. return traverse(a);
  61014. }) || e.infos && e.infos.some(function (u) {
  61015. return u.group.some(function (r) {
  61016. return r.boxes.some(function (b) {
  61017. return b == box;
  61018. });
  61019. });
  61020. }); //row
  61021. };
  61022. return boxesSolid$1.some(function (e) {
  61023. return traverse(e);
  61024. });
  61025. }
  61026. function reMatchLowScores(lowScores, groups) {
  61027. var _ref7 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  61028. _ref7$startIndex = _ref7.startIndex,
  61029. startIndex = _ref7$startIndex === void 0 ? 2 : _ref7$startIndex,
  61030. fake = _ref7.fake;
  61031. var tooLows = [];
  61032. var minScore = boundConfirmed$1 ? -2000 : -800;
  61033. var isSameMatch = function isSameMatch(match0, match1) {
  61034. //是否对应同一个box实体(不一定准),通过两两box之间是否都match来判断
  61035. //如果是相同pano但不同的box肯定不是对应同一个box实体
  61036. var ifWrong = function ifWrong(box0, box1) {
  61037. if (box0 == box1) return;
  61038. if (box0.pano == box1.pano) return true;
  61039. var match2 = getMatchScore(box0, box1, {
  61040. isSingle: true,
  61041. restMatch: true
  61042. });
  61043. if (match2.score < minScore) return true;
  61044. };
  61045. if (ifWrong(match0.box0, match1.box0) || ifWrong(match0.box1, match1.box1) || ifWrong(match0.box0, match1.box1) || ifWrong(match0.box1, match1.box0)) return;
  61046. return true;
  61047. };
  61048. if (lowScores.length) {
  61049. //console.warn(lowScores[0].log || (lowScores[0].box1 ? '低分重新匹配' : '剩余匹配'), lowScores[0].box0.boxType, ...lowScores)
  61050. if (lowScores[0].box1) {
  61051. lowScores.sort(function (a, b) {
  61052. //低分优先
  61053. return a.score - b.score;
  61054. });
  61055. }
  61056. lowScores.forEach(function (info) {
  61057. //info中的box0和box1分别向后寻找其他的配对。选择分数高的配对。 但box0和box1可能是错误配对,会导致找到了替代的也可能遗漏。
  61058. /* if (info.name == 'pano0-3&pano2-3') {
  61059. console.log(1)
  61060. } */
  61061. var box01 = info.box0;
  61062. var box02 = info.box1;
  61063. var bigGroup = [];
  61064. box02 && bigGroup.push(info);
  61065. var _loop6 = function _loop6(cur) {
  61066. var thirdGroup = groups[cur];
  61067. var scores0 = [],
  61068. scores1 = [];
  61069. thirdGroup.forEach(function (box1) {
  61070. //if (matched.includes(box1.sid)) return
  61071. if (used(box1)) return; //会不会太严格?
  61072. if (box1.pano != box01.pano && box1 != box02) {
  61073. var r1 = getMatchScore(box01, box1, {
  61074. isSingle: true,
  61075. restMatch: true
  61076. });
  61077. r1.score > minScore * 1.5 && scores0.push(r1);
  61078. }
  61079. if (box02 && box1.pano != box02.pano && box1 != box01) {
  61080. var r2 = getMatchScore(box02, box1, {
  61081. isSingle: true,
  61082. restMatch: true
  61083. });
  61084. r2.score > minScore * 1.5 && scores1.push(r2);
  61085. }
  61086. });
  61087. scores0.sort(function (a, b) {
  61088. return b.score - a.score;
  61089. });
  61090. scores1.sort(function (a, b) {
  61091. return b.score - a.score;
  61092. });
  61093. scores0[0] && bigGroup.push(scores0[0]);
  61094. scores1[0] && bigGroup.push(scores1[0]);
  61095. };
  61096. for (var cur = startIndex; cur < groups.length; cur++) {
  61097. _loop6(cur);
  61098. }
  61099. bigGroup.sort(function (a, b) {
  61100. return b.score - a.score;
  61101. });
  61102. var goodList = bigGroup.slice(0, 10).map(function (e) {
  61103. if (!getBoxPos$1(e)) return e;
  61104. preDealBox$1(e);
  61105. getBoxSize$1(e);
  61106. return e;
  61107. });
  61108. var goodList2 = goodList.sort(function (a, b) {
  61109. return b.score - a.score;
  61110. }).slice(0, 3);
  61111. if (goodList2.length == 0) {
  61112. return fake || createSinglePano(box01, 0.6); //minScorePercent原因:剩余匹配时位置不太好的案例: AhMgXXjM15
  61113. }
  61114. if (goodList2[0].score > minScore * 0.65) {
  61115. goodList2 = goodList2.filter(function (e) {
  61116. return e.score > minScore * 0.65;
  61117. });
  61118. } else {
  61119. /* goodList2 = [goodList2[0]] // 最高分已经过小
  61120. if (goodList2[0].score < -1500) { */
  61121. if (!box02) {
  61122. if (info.log == 'findRest' || getBoxPos$1(box01).distanceTo(box01.pano.position) < 2.5) {
  61123. //远距离不准,留到过后findRest
  61124. fake || createSinglePano(box01);
  61125. }
  61126. return;
  61127. } //console.warn('分数过低,是否有匹配错误?', goodList2[0])
  61128. return tooLows.push(goodList2[0]); //}
  61129. }
  61130. if (goodList2.length) {
  61131. //需要确认两两之间是配对的,也就是都对应同一个box
  61132. var subGroups = [],
  61133. boxes = [];
  61134. var _loop7 = function _loop7(i, len) {
  61135. //向后选择队友
  61136. var match0 = goodList2[i];
  61137. if (subGroups.some(function (e) {
  61138. return e.includes(match0);
  61139. })) return "continue"; //被挑选了的没有选择权
  61140. var gr = [match0];
  61141. for (var j = i + 1; j < len; j++) {
  61142. var match1 = goodList2[j];
  61143. if (isSameMatch(match0, match1)) {
  61144. //可能不是同一个,所以需要检验
  61145. gr.push(match1);
  61146. }
  61147. } //if(gr.length>1){
  61148. subGroups.push(gr); //}
  61149. };
  61150. for (var i = 0, len = goodList2.length; i < len; i++) {
  61151. var _ret5 = _loop7(i, len);
  61152. if (_ret5 === "continue") continue;
  61153. } //console.log('lowScores subGroups', subGroups)
  61154. subGroups.forEach(function (pair) {
  61155. boxes.push(mixMatchBox(pair, lowScores[0].log, fake));
  61156. });
  61157. fake || combineBoxes(boxes); //很可能其实还是同一个,需要检验是否要融合
  61158. }
  61159. }); //改为之后 findRest, 因为两者都single的可能性低
  61160. /* let judge = box => {
  61161. if (!used(box)) {
  61162. matched.push(box)
  61163. createSinglePano(box)
  61164. }
  61165. }
  61166. tooLows.forEach(e => {
  61167. judge(e.box0)
  61168. judge(e.box1)
  61169. }) */
  61170. }
  61171. }
  61172. function mixMatchBox(list, log, fake) {
  61173. var center = new THREE.Vector3(),
  61174. size = new THREE.Vector3(),
  61175. bound = new THREE.Box3();
  61176. list.forEach(function (e) {
  61177. var _bound = new THREE.Box3().setFromCenterAndSize(getBoxFinalPos$1(e), e.size);
  61178. bound.union(_bound);
  61179. }); //bound.getCenter(center) //这两种获得center的方法哪个准?
  61180. bound.getSize(size);
  61181. list.forEach(function (e) {
  61182. return center.add(getBoxPos$1(e));
  61183. });
  61184. center.multiplyScalar(1 / list.length);
  61185. var _ref8 = list.find(function (e) {
  61186. return e.xProp;
  61187. }) || {},
  61188. xProp = _ref8.xProp,
  61189. yProp = _ref8.yProp;
  61190. if (xProp && list.find(function (e) {
  61191. return e.xProp && e.xProp != xProp;
  61192. })) {
  61193. //如果有不同的话
  61194. xProp = yProp = null;
  61195. }
  61196. var prefix = log == 'findRest' ? 'rest:' : 'low:';
  61197. var object = {
  61198. name: prefix + list.map(function (e) {
  61199. return e.name;
  61200. }),
  61201. boxType: list[0].boxType,
  61202. center,
  61203. size,
  61204. list,
  61205. xProp,
  61206. yProp
  61207. };
  61208. xProp || getBoxDirProp$1(object);
  61209. var o = restrictSize$1(size.x, size.y, size.z, object);
  61210. size.x = o.x;
  61211. size.y = o.y;
  61212. size.z = o.z;
  61213. object.fake = fake;
  61214. var box = new Box$1(object); //console.log('mixMatchBox', box)
  61215. return box;
  61216. }
  61217. function combineBoxes(boxes, typeCount) {
  61218. //调试 tY4ot33f8vT UWrshepp0G5的一高一低的电箱
  61219. //判断这些实体boxes是否需要合并 主要用于重复识别(重叠面积较大) 电池还可能是拼接
  61220. var group = [];
  61221. if (boxes.length > 1) {
  61222. var boxType = boxes[0].boxType;
  61223. var _standards$boxType$wi3 = standards$1[boxType].widthNormal;
  61224. _standards$boxType$wi3.min;
  61225. var max = _standards$boxType$wi3.max;
  61226. for (var i = 0, len = boxes.length; i < len - 1; i++) {
  61227. var box0 = boxes[i];
  61228. if (box0.fake) continue;
  61229. for (var j = i + 1; j < len; j++) {
  61230. var box1 = boxes[j];
  61231. if (box1.fake) continue;
  61232. var bound = box0.bound.clone().union(box1.bound);
  61233. var size = bound.getSize(new THREE.Vector3());
  61234. var intersect = box0.bound.intersectsBox(box1.bound);
  61235. if (box0.boxType == 'electric') {
  61236. console.log(1);
  61237. }
  61238. var maxX = max,
  61239. maxZ = max,
  61240. maxY = standards$1[boxType].height.max;
  61241. if (box0.xProp && box1.xProp && box0.xProp == box1.xProp) {
  61242. maxX = standards$1[boxType][box0.xProp].max;
  61243. maxZ = standards$1[boxType][box0.yProp].max;
  61244. /* minX = standards[boxType][box0.xProp].min
  61245. minZ = standards[boxType][box0.yProp].min */
  61246. if (box0.boxType != box1.boxType) {
  61247. //air & airSmart
  61248. maxX = Math.max(maxX, standards$1[box1.boxType][box1.xProp].max);
  61249. maxZ = Math.max(maxZ, standards$1[box1.boxType][box1.yProp].max);
  61250. /* minX = Math.min(minX, standards[box1.boxType][box1.xProp].min)
  61251. minZ = Math.min(minZ, standards[box1.boxType][box1.yProp].min) */
  61252. }
  61253. }
  61254. maxX = Math.max(maxX, box0.size.x, box1.size.x); //必须大于各自的size,否则无法去除本身就oversize的box中包含的
  61255. maxZ = Math.max(maxZ, box0.size.z, box1.size.z);
  61256. maxY = Math.max(maxY, box0.size.y, box1.size.y);
  61257. var r = intersect ? 1.5 : 1.3;
  61258. /* / standards[box1.boxType].closeRatio */
  61259. //如果是没有交集,限制更大些
  61260. //若需要更精确的结果,可以getMixBox算出重叠面积,重叠少,且各自都不太小,就不合并。但考虑到电池边界很模糊,合并了也无大碍。
  61261. if (box0.boxType == 'battery') {
  61262. r *= 1.3; //比较可能扎堆
  61263. }
  61264. var maxDiff = 0.4,
  61265. maxDiffX = maxDiff,
  61266. maxDiffZ = maxDiff,
  61267. rx = r,
  61268. rz = r;
  61269. if (standards$1[box0.boxType].atWall == 1) {
  61270. //在墙面上不可能叠放,所以厚度限制可放宽
  61271. var s = 4;
  61272. if (box0.yProp == 'width') {
  61273. maxDiffX *= s;
  61274. rx *= s;
  61275. } else if (box0.xProp == 'width') {
  61276. maxDiffZ *= s;
  61277. rz *= s;
  61278. }
  61279. } //如果某个点位含有类似和这俩相近的box: A9rCPzp2UD9两个fire合并了。好难写,算了
  61280. /* if(box0.boxType){
  61281. this.datasMixed
  61282. rx = rz = 1.1
  61283. } */
  61284. 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) {
  61285. //总size不会太大
  61286. common$1.pushToGroupAuto([box0, box1], group);
  61287. }
  61288. }
  61289. }
  61290. if (group.length) {
  61291. //虽然如果三个以上可能会超出maxWidth。 不过3个的概率很低,且可以限制宽度
  61292. group.forEach(function (pair) {
  61293. var boxTypes = [];
  61294. var bound = new THREE.Box3();
  61295. pair.forEach(function (e) {
  61296. bound.union(e.bound);
  61297. e.dispose();
  61298. if (typeCount > 1) {
  61299. //判断boxType: 寻找所使用的box总分最高的boxType
  61300. var a = boxTypes.find(function (a) {
  61301. return a.boxType == e.boxType;
  61302. });
  61303. var score = 0;
  61304. var add = function add(box) {
  61305. box && (score += box.score);
  61306. };
  61307. e.traversePair(function (e) {
  61308. add(e.box0);
  61309. add(e.box1);
  61310. });
  61311. if (a) {
  61312. a.score += score;
  61313. } else {
  61314. boxTypes.push({
  61315. score,
  61316. boxType: e.boxType
  61317. });
  61318. }
  61319. }
  61320. });
  61321. if (typeCount > 1) {
  61322. boxTypes.sort(function (a, b) {
  61323. return b.score - a.score;
  61324. });
  61325. boxType = boxTypes[0].boxType;
  61326. }
  61327. var size = bound.getSize(new THREE.Vector3());
  61328. var center = bound.getCenter(new THREE.Vector3());
  61329. var _ref9 = pair.find(function (e) {
  61330. return e.xProp;
  61331. }) || {},
  61332. xProp = _ref9.xProp,
  61333. yProp = _ref9.yProp;
  61334. if (xProp && pair.find(function (e) {
  61335. return e.xProp && e.xProp != xProp;
  61336. })) {
  61337. //如果有不同的话
  61338. xProp = yProp = null;
  61339. }
  61340. var info = {
  61341. name: 'mix:' + pair.map(function (e) {
  61342. return ' ' + e.name;
  61343. }),
  61344. mixedFrom: pair,
  61345. boxType,
  61346. center,
  61347. size,
  61348. xProp,
  61349. yProp
  61350. };
  61351. xProp || getBoxDirProp$1(info);
  61352. var o = restrictSize$1(size.x, size.y, size.z, info);
  61353. size.x = o.x;
  61354. size.y = o.y;
  61355. size.z = o.z;
  61356. var box = new Box$1(info);
  61357. console.error('混合', boxType, pair, box);
  61358. });
  61359. }
  61360. }
  61361. }
  61362. function combines(types) {
  61363. //合并boxSolids . battery经常嵌套
  61364. if (!(types instanceof Array)) types = [types];
  61365. var boxes = boxesSolid$1.filter(function (e) {
  61366. return types.includes(e.boxType);
  61367. });
  61368. combineBoxes(boxes, types.length);
  61369. }
  61370. var createSinglePano = function createSinglePano(box) {
  61371. var minScorePercent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  61372. //仅用一个pano中的data来创建。 悬挂于墙上的准确性依赖于墙的准确性。
  61373. if (box.score < MinBoxInitialScore) {
  61374. //如Xszq2fv03b的电池pano8-0其实是纸箱、 WZQoMbNmNTu的pano14-0分数0.649
  61375. return console.error('取消createSinglePano: 线框识别分数低,可能错误', box.sid, box);
  61376. }
  61377. getBoxBase$1(box);
  61378. var center = getBoxPos$1(box);
  61379. if (safeBound$1.distanceToPoint(center) > 0) {
  61380. return console.log('取消createSinglePano:超出safebound', box); //可能是错误的线框,如H7pg1tO9oeJ pano8-1
  61381. }
  61382. var info = {
  61383. name: box.sid,
  61384. box0: box,
  61385. center,
  61386. topPos: box.topPos,
  61387. btmPos: box.btmPos
  61388. };
  61389. preDealBox$1(info);
  61390. var minScore = -500 * minScorePercent; //调试 3MnIWabM6ne Tmo1vLp9Q13
  61391. var a = getPoseScore$1(info.boxposes, box.boxType
  61392. /* true */
  61393. );
  61394. if (!standards$1[box.boxType].bottom && box.btmPos) {
  61395. a -= (box.btmPos.y - groundY$1) * 3000; //底部被遮住一部分(但是像vHC1GfkdKtD在户外,容易底部变高到bound外去怎么办)
  61396. }
  61397. var failed = a < minScore;
  61398. console.log('createSinglePano', failed ? '失败' : '成功', 'pose score:', a, box.sid, box);
  61399. if (failed) return; //addLabel(center, 'center', { a: 0.3 })
  61400. //info.topPos && addLabel(info.topPos, 'topPos', { a: 0.3 })
  61401. info.score = a;
  61402. getBoxSize$1(info);
  61403. new Box$1(info);
  61404. }; //去除挨得很近的漫游点,因为两个接近的点match出的值误差很大
  61405. {
  61406. _this3.removedDatas = {};
  61407. var panoIds = Object.keys(_this3.datas).filter(function (id) {
  61408. if (!player$d.model.panos.index[id]) {
  61409. //排除数据错误
  61410. _this3.removedDatas[id] = _this3.datas[id];
  61411. delete _this3.datas[id];
  61412. console.log('???', id);
  61413. return;
  61414. }
  61415. return true;
  61416. });
  61417. var len = panoIds.length;
  61418. for (var i = 0; i < len; i++) {
  61419. var pano0 = player$d.model.panos.index[panoIds[i]];
  61420. for (var j = i + 1; j < len; j++) {
  61421. var pano1 = player$d.model.panos.index[panoIds[j]];
  61422. if (pano0.position.distanceToSquared(pano1.position) < 0.01) {
  61423. //离的很近。保留shape多的那个data
  61424. var remove = void 0;
  61425. if (_this3.datas[panoIds[i]].shapes.length > _this3.datas[panoIds[j]].shapes.length) {
  61426. remove = panoIds[j];
  61427. } else {
  61428. remove = panoIds[i];
  61429. }
  61430. console.log("\u5220\u9664pano".concat(remove, "\u7684data\uFF0C\u56E0pano").concat(panoIds[i], "\u548Cpano").concat(panoIds[j], "\u5F88\u8FD1"));
  61431. _this3.removedDatas[remove] = _this3.datas[remove];
  61432. delete _this3.datas[remove];
  61433. }
  61434. }
  61435. }
  61436. } //this.expandModelBound()
  61437. // if (version == 'vision') this.datasMixed = common.CloneObject(this.datas, null, [player.model.panos.list[0].constructor])
  61438. _this3.datasMixed = common$1.CloneObject(_this3.datas, null, undefined, function (data) {
  61439. return data['category'];
  61440. });
  61441. /* Search('cabinet')
  61442. Search('air')
  61443. Search('battery') */
  61444. for (var _i4 in typeNames$1) {
  61445. Search(_i4);
  61446. }
  61447. console.log('----FindRest----');
  61448. waitFindRest.forEach(function (e) {
  61449. findRest.apply(void 0, _toConsumableArray(e.args));
  61450. if (e.type != 'air' && e.type != 'airSmart' && e.type != 'cabinet') combines(e.type);
  61451. });
  61452. combines(['air', 'airSmart']); //这两种合在一起combine,因为太像了容易识别出多个 nZrBdvRaDuC
  61453. console.log('cost:', Date.now() - startTime$1, 'ms, boxSolid:', _this3.boxesSolid, '共' + _this3.boxesSolid.length + '个');
  61454. };
  61455. /* let getSid = (function(){
  61456. let sid = 0
  61457. return function(){
  61458. return sid++
  61459. }
  61460. })() */
  61461. done = function done() {
  61462. var _loop8 = function _loop8(panoId) {
  61463. if (!_this3.datas[panoId]) return "continue";
  61464. _this3.datas[panoId].shapes = _this3.datas[panoId].shapes.map(function (shape, i) {
  61465. return Object.assign({
  61466. sid: 'pano' + panoId + '-' + i,
  61467. category: shape.category,
  61468. //提前 便于调试
  61469. pano: player$d.model.panos.index[panoId],
  61470. index: i
  61471. }, shape);
  61472. });
  61473. };
  61474. for (var panoId in _this3.datas) {
  61475. var _ret6 = _loop8(panoId);
  61476. if (_ret6 === "continue") continue;
  61477. }
  61478. _this3.panoBound = new THREE.Box3();
  61479. player$d.model.chunks.forEach(function (e) {
  61480. modelBound$1.union(e.geometry.boundingBox); //注:不用model.boundingBox是 因为union了pano的position的
  61481. }); //针对部分模型错误,只有底面的,union一下pano.position
  61482. var minY = Infinity,
  61483. minYs = [];
  61484. var panos = player$d.model.panos.list.filter(function (e) {
  61485. return e.isAligned();
  61486. });
  61487. panos.forEach(function (e) {
  61488. var bound = new THREE.Box3().setFromCenterAndSize(e.position, new THREE.Vector3(0.1, 0.1, 0.1));
  61489. modelBound$1.union(bound);
  61490. _this3.panoBound.union(bound);
  61491. minY = Math.min(e.floorPosition.y, minY); //avePanoFY += e.floorPosition.y
  61492. minYs.push(e.floorPosition.y);
  61493. });
  61494. groundY$1 = modelBound$1.min.y;
  61495. minYs.sort(function (a, b) {
  61496. return a - b;
  61497. }); //console.log(minYs)
  61498. var midFloorY = minYs[Math.floor(minYs.length / 2)];
  61499. console.error('minY', minY, 'midFloorY', midFloorY, '原groundY', groundY$1);
  61500. _this3.minY = minY; //部分模型底部高度错误
  61501. /* if (minY > groundY) {
  61502. console.error('minY > groundY', minY, groundY)
  61503. groundY = modelBound.min.y = midFloorY //案例nZrBdvRaDuC
  61504. } else {
  61505. if (groundY - minY > 0.05) console.warn('minY', minY, 'groundY', groundY)
  61506. groundY = modelBound.min.y = midFloorY , document.title += ' new' //修改以后未必更好所以暂时不修改 变更好的:eGhyf5QdVHA
  61507. } */
  61508. groundY$1 = modelBound$1.min.y = midFloorY; //这个y可能不准。需要通过fire的btmPos.y来确定
  61509. safeBound$1 = _this3.safeBound = modelBound$1;
  61510. groundPlane$1.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY$1, 0));
  61511. if (_this3.ifAnalyze) {
  61512. beginCompute();
  61513. }
  61514. {
  61515. _this3.load(player$d.currentPano.id);
  61516. _this3.updateBoxVisiInPano();
  61517. }
  61518. };
  61519. if (!dataList) {
  61520. /* player.model.panos.list.forEach(e => {
  61521. if (!e.isAligned()) return
  61522. panosCount++
  61523. load.bind(this)(e.id)
  61524. }) */
  61525. loadAll.bind(this)(); //测试环境
  61526. } else {
  61527. //when version == 'output'
  61528. dataList.forEach(function (e) {
  61529. var panoId = e.imagePath.split('.jpg')[0];
  61530. _this3.datas[panoId] = e;
  61531. });
  61532. done();
  61533. }
  61534. case 13:
  61535. case "end":
  61536. return _context3.stop();
  61537. }
  61538. }
  61539. }, _callee3, this);
  61540. }));
  61541. function compute(_x) {
  61542. return _compute.apply(this, arguments);
  61543. }
  61544. return compute;
  61545. }()
  61546. }, {
  61547. key: "expandModelBound",
  61548. value: function expandModelBound() {
  61549. var _this6 = this;
  61550. //有的模型太窄,容易将一排的柜体当做墙壁。所以可以根据box位置扩展bound. (如果因为点位太少,导致内部的电池远超模型范围,就不管了。R7xZsmm9FsG)
  61551. var maxDis0 = 1,
  61552. //最终位置不会超过这个距离
  61553. maxDis1 = 3; //搜寻范围。不可扩展太宽,否则不准确的框会飘很远,甚至多画多个box,如R7xZsmm9FsG
  61554. var newBound = modelBound$1.clone();
  61555. var list = [];
  61556. var _loop9 = function _loop9(panoId) {
  61557. if (!_this6.datas[panoId]) return "continue";
  61558. var _this6$datas$panoId = _this6.datas[panoId],
  61559. imageWidth = _this6$datas$panoId.imageWidth,
  61560. imageHeight = _this6$datas$panoId.imageHeight;
  61561. _this6.datas[panoId].shapes.forEach(function (box) {
  61562. getBoxBase$1(box, imageWidth, imageHeight);
  61563. if (box.sid == 'pano2-10') {
  61564. console.log(4);
  61565. }
  61566. if (box.btmPosPredict) {
  61567. var far = box.pano.position.distanceToSquared(box.btmPosPredict);
  61568. if (far > 20) return; //太远不准
  61569. var dis = modelBound$1.distanceToPoint(box.btmPosPredict);
  61570. if (dis > 0 && dis < maxDis1) {
  61571. //maxDis1用来防air-hanging和一些错误的框
  61572. list.push({
  61573. box,
  61574. dis
  61575. });
  61576. }
  61577. }
  61578. });
  61579. };
  61580. for (var panoId in this.datas) {
  61581. var _ret7 = _loop9(panoId);
  61582. if (_ret7 === "continue") continue;
  61583. }
  61584. list.sort(function (a, b) {
  61585. return a.dis - b.dis;
  61586. }); //let mid = list[Math.floor(list.length/2)]
  61587. var mid = list.length; // /2
  61588. for (var i = 0; i < mid; i++) {
  61589. var box = list[i].box;
  61590. var pos = box.btmPosPredict;
  61591. if (list[i].dis > maxDis0) {
  61592. var p1 = pos.clone().clamp(modelBound$1.min, modelBound$1.max);
  61593. var vec = new THREE.Vector3().subVectors(pos, p1).normalize().multiplyScalar(maxDis0);
  61594. pos = new THREE.Vector3().addVectors(p1, vec);
  61595. }
  61596. var marginBound = new THREE.Box3().setFromCenterAndSize(pos, new THREE.Vector3(0.2, 0, 0.2));
  61597. newBound.union(marginBound);
  61598. }
  61599. skyBoxTight = new BoundingMesh(newBound, new THREE.MeshBasicMaterial({
  61600. side: THREE.DoubleSide,
  61601. wireframe: true,
  61602. transparent: true,
  61603. opacity: 0.05
  61604. }), 0); //skyBoxTight.visible = false
  61605. skyBoxTight.updateMatrixWorld(); //不update的话raycaster是错的
  61606. meshGroup$1.add(skyBoxTight);
  61607. this.skyBoxTight = skyBoxTight;
  61608. this.safeBound = this.safeBoundFirstVer = safeBound$1 = newBound;
  61609. boundConfirmed$1 = true;
  61610. console.log('bound1:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
  61611. }
  61612. }, {
  61613. key: "expandModelBound2",
  61614. value: function expandModelBound2(type) {
  61615. var _this7 = this;
  61616. var material = skyBoxTight.material;
  61617. skyBoxTight.geometry.dispose();
  61618. boxesSolid$1.forEach(function (e) {
  61619. if (e.boxType != type) return;
  61620. _this7.safeBound.union(e.bound);
  61621. });
  61622. skyBoxTight = new BoundingMesh(this.safeBound, material, 0); //skyBoxTight.visible = false
  61623. skyBoxTight.updateMatrixWorld(); //不update的话raycaster是错的
  61624. meshGroup$1.add(skyBoxTight);
  61625. this.skyBoxTight = skyBoxTight;
  61626. console.log('bound2:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
  61627. }
  61628. /* adjustModelBound(type){
  61629. if(standards[type].atWall != 1)return //必须是挂墙的
  61630. this.lastSafeBound = this.safeBound.clone()
  61631. let list = []
  61632. let add = e => {
  61633. if (e.btmPos && e.box1 && e.minAng>10 ) {
  61634. //有 box1才能确定是getIntersect得到的pos
  61635. list.includes(e) || e.push(e)
  61636. }
  61637. }
  61638. this.boxesSolid.forEach((solidBox)=>{
  61639. if(solidBox.boxType != type)return
  61640. solidBox.traversePair(add)
  61641. })
  61642. let wallSides = {'x+': 0, 'x-': 0, 'z+': 0, 'z-': 0}
  61643. let getBoxSide = (e)=>{
  61644. for(let i in e.panosDir){
  61645. if(e.panosDir[i] != 0){
  61646. wallSides[i] += 1
  61647. }
  61648. }
  61649. }
  61650. if(list.length){
  61651. this.safeBound = this.panoBound.clone()
  61652. list.forEach((e)=>{
  61653. this.safeBound.union(e.bound)//还是说使用cIntersect来expand?
  61654. getBoxSide()
  61655. })
  61656. }
  61657. skyBoxTight = new BoundingMesh(this.safeBound, material, 0)
  61658. //skyBoxTight.visible = false
  61659. skyBoxTight.updateMatrixWorld() //不update的话raycaster是错的
  61660. meshGroup.add(skyBoxTight)
  61661. this.skyBoxTight = skyBoxTight
  61662. //主要目的,针对那些模型比room大得多的情况,比如多了门外的部分,造成墙面不准。
  61663. //monitor的可以完全决定位置。其他的只能收缩(但是不能收缩超过panos和第一次expand的那些btm的bound里)
  61664. //太麻烦了,且考虑到即使墙面完全准确也可能反倒把它变的不准的风险。
  61665. } */
  61666. /* 最低点使用fire的吗
  61667. MW6MEeCOy9Y 只有最近三个点和fire接近
  61668. 3MnIWabM6ne fire combine了
  61669. ov5NTEImzhW fire多个
  61670. n4z0yd5tQaF fire多两个错位离谱的。。 位置和显示的不一样。。
  61671. 5BaiXkK6Ag1 fire算的不太准 低了0.1 样本数仅两个
  61672. */
  61673. }, {
  61674. key: "updateBoxVisiInPano",
  61675. value: function updateBoxVisiInPano() {
  61676. if (!isDiwei$1) return;
  61677. if (player$d.mode != 'panorama') {
  61678. this.boxesSolid.forEach(function (e) {
  61679. return e.updateVisible(true, 'panoVisi');
  61680. });
  61681. return;
  61682. }
  61683. var data = this.datasMixed[player$d.currentPano.id] || this.datas[player$d.currentPano.id];
  61684. if (!data) return;
  61685. var visiBoxes = this.visiInfos[player$d.currentPano.id];
  61686. if (!visiBoxes) {
  61687. visiBoxes = [];
  61688. this.boxesSolid.forEach(function (box) {
  61689. var sizeXZ = new THREE.Vector2(box.size.x, box.size.z);
  61690. var extLen = -sizeXZ.length() / 2 - 0.5;
  61691. var intersect = convertTool.ifIntersectChunks(player$d.position, box.position, player$d.model, {
  61692. extLen
  61693. });
  61694. if (!intersect) {
  61695. //是否和当前pano的box框位置接近
  61696. var pos2d1 = new THREE.Vector2(box.position.x, box.position.z); //return visiBoxes.push(box)
  61697. var shape = data.shapes.find(function (e) {
  61698. //getBoxBtm(e)
  61699. //return true
  61700. if (isExt$1) {
  61701. var imageWidth = data.imageWidth,
  61702. imageHeight = data.imageHeight;
  61703. getBoxBase$1(e, imageWidth, imageHeight);
  61704. getOtherPos$1(e);
  61705. }
  61706. var pos = getBoxPos$1(e);
  61707. if (!pos) return;
  61708. var pos2d2 = new THREE.Vector2(pos.x, pos.z);
  61709. if (pos2d1.distanceToSquared(pos2d2) < 3) return true; //效果:有一些一排中2d框稀疏的可能会不显示
  61710. });
  61711. if (shape) {
  61712. visiBoxes.push(box);
  61713. }
  61714. }
  61715. });
  61716. this.visiInfos[player$d.currentPano.id] = visiBoxes;
  61717. }
  61718. this.boxesSolid.forEach(function (e) {
  61719. e.updateVisible(visiBoxes.includes(e), 'panoVisi');
  61720. });
  61721. }
  61722. }, {
  61723. key: "confirmGroundY",
  61724. value: function confirmGroundY(type) {
  61725. //利用fire来确定地面高度(会稍低于地板,但box框不打滑且xz更准,估计因box框比box大)。调试:3MnIWabM6ne up9PPZkx1px 4GqaqNdyjGfs GFbQi1LiSij
  61726. if (boundConfirmed$1) return;
  61727. var btmYs = [],
  61728. pairs = [],
  61729. needCount = 5,
  61730. maxDis = 3,
  61731. btmY = 0;
  61732. var add = function add(e) {
  61733. if (e.btmPos && e.box1
  61734. /* && e.score >= minScore */
  61735. ) {
  61736. //有 box1才能确定是getIntersect得到的pos
  61737. pairs.push(e);
  61738. }
  61739. };
  61740. boxesSolid$1.forEach(function (e) {
  61741. if (e.boxType != type) return;
  61742. e.traversePair(add);
  61743. });
  61744. var usePairs = pairs;
  61745. if (pairs.length > needCount) {
  61746. //调试:Y8czF2Z3h9m
  61747. var disMap = new Map();
  61748. pairs.forEach(function (e) {
  61749. disMap.set(e, Math.max(e.box0.pano.position.distanceTo(e.box0.btmPosPredict), e.box1.pano.position.distanceTo(e.box1.btmPosPredict)));
  61750. });
  61751. pairs.sort(function (a, b) {
  61752. return disMap.get(a) - disMap.get(b);
  61753. }); //距离从近到远 . 远处的高度可能偏离严重,就不管了,而且框也不一定准
  61754. usePairs = pairs.slice(0, needCount);
  61755. for (var i = needCount; i < pairs.length; i++) {
  61756. if (disMap.get(pairs[i]) < maxDis) {
  61757. usePairs.push(pairs[i]);
  61758. }
  61759. }
  61760. }
  61761. usePairs.forEach(function (e) {
  61762. //有 box1才能确定是getIntersect得到的pos
  61763. var btmY_ = e.btmPos.y;
  61764. var width = e.size.x / 2;
  61765. var h0 = width / Math.tan(Math.acos(-e.box0.centerBtmDir.y)); //|centerBtmDir.y| 即俯视角度的cos
  61766. var h1 = width / Math.tan(Math.acos(-e.box1.centerBtmDir.y));
  61767. var h = Math.min(h0, h1); //选个小的吧,因浅的会更快接触到中心,虽然交点是两条射线最近点 不一定在fire中心
  61768. //如果毫无误差,且centerBtmDir.y相同,只要两条线centerBtmDir的xz相同,交点就是和地面的交点,而只要不同,交点就是和地面的交点,而只要不同,交点必然是在fire中心之下。随着minAng和centerBtmDir.y 交点在这中间变化
  61769. var r = math$2.linearClamp(e.minAng, 0, 90, 0, 1);
  61770. btmY_ += h * r;
  61771. btmYs.push(btmY_);
  61772. btmY += btmY_;
  61773. });
  61774. btmY /= btmYs.length;
  61775. if (btmYs.length) {
  61776. console.error('confirmGroundY', btmY,
  61777. /* '样本数', btmYs.length, */
  61778. btmYs, usePairs.map(function (e) {
  61779. return e.name;
  61780. }), pairs);
  61781. /* if(btmYs.length == 1 && pairs[0].minAngle<12 && ){
  61782. } */
  61783. groundY$1 = this.safeBound.min.y = this.panoBound.min.y = btmY; // = -1.1
  61784. groundPlane$1.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY$1, 0));
  61785. }
  61786. var _standards$type$heigh = standards$1[type].height,
  61787. min = _standards$type$heigh.min,
  61788. max = _standards$type$heigh.max;
  61789. boxesSolid$1.slice().forEach(function (e) {
  61790. if (e.boxType != type) return;
  61791. if (e.fake) {
  61792. e.dispose();
  61793. return;
  61794. }
  61795. var topY = e.topPos ? e.topPos.y : e.list.reduce(function (w, c) {
  61796. return w + c.topPos.y;
  61797. }, 0) / e.list.length;
  61798. e.size.y = THREE.MathUtils.clamp(topY - groundY$1, min, max);
  61799. e.setFromInfo(e);
  61800. e.draw();
  61801. });
  61802. this.panoBound;
  61803. this.expandModelBound();
  61804. }
  61805. }, {
  61806. key: "bindEvents",
  61807. value: function bindEvents() {
  61808. var _this8 = this;
  61809. player$d.on(PlayerEvents.FlyingStarted, function (e) {
  61810. //if(e.mode == 'dollhouse')return
  61811. // 点位跳转前清除已有线框
  61812. _this8.traverse(function (obj) {
  61813. if (obj.isMesh) {
  61814. obj.geometry.dispose();
  61815. obj.material.dispose();
  61816. }
  61817. });
  61818. _this8.wireframes.clear();
  61819. _this8.currentId = null;
  61820. });
  61821. player$d.on(PlayerEvents.FlyingEnded, function () {
  61822. // 点位跳转后加载线框
  61823. _this8.updateBoxVisiInPano();
  61824. if (player$d.mode != Viewmode$1.PANORAMA) return; // 只有PANORAMA模式下需要加载
  61825. _this8.load(player$d.currentPano.id);
  61826. });
  61827. var allBoxMesh = [];
  61828. player$d.on('collectIntersectMesh', function (meshes, e) {
  61829. if (!isDiwei$1) return; //allBoxMesh = this.boxesSolid.filter(e => e.label.visible).map(e => e.boxMesh) //过滤掉隐藏的
  61830. allBoxMesh = _this8.boxesSolid.filter(function (e) {
  61831. return common$1.getObjVisiByReason(e.label, 'panoVisi');
  61832. }).map(function (e) {
  61833. return e.boxMesh;
  61834. }); //过滤掉隐藏的
  61835. //meshes.push(...allBoxMesh)
  61836. });
  61837. player$d.on('judgeIntersect', function (intersect_, e) {
  61838. if (e.getConsumed() || !isDiwei$1) return;
  61839. var intersect = player$d.getMouseIntersect(null, allBoxMesh, {});
  61840. var hoveredBox = intersect && allBoxMesh.includes(intersect.object) ? intersect.object.masterBox : null;
  61841. if (hoveredBox != _this8.hoveredBox) {
  61842. if (_this8.hoveredBox) ;
  61843. if (hoveredBox) {
  61844. // hoveredBox.updateVisible(true, 'unhover')
  61845. /* hoveredBox.boxMesh.visible = true
  61846. hoveredBox.boxHelper.material.opacity = 1
  61847. hoveredBox.boxHelper.material.color.copy(colors.yellow)
  61848. hoveredBox.label.setBackgroundColor(Object.assign(colors.labelYellow)) //text
  61849. */
  61850. CursorDeal.add('hoverMonitor');
  61851. } else {
  61852. CursorDeal.remove('hoverMonitor');
  61853. }
  61854. _this8.hoveredBox = hoveredBox;
  61855. }
  61856. hoveredBox && e.consume();
  61857. });
  61858. player$d.on('click', function (e) {
  61859. if (e.getConsumed() || !isDiwei$1) return;
  61860. if (_this8.hoveredBox) {
  61861. player$d.$app.Scene.emit('box-frame-click', _this8.hoveredBox);
  61862. e.consume();
  61863. }
  61864. });
  61865. /*let allBoxMesh = []
  61866. player.on('collectIntersectMesh', (meshes, e) => {
  61867. allBoxMesh = this.boxesSolid.filter(e => e.label.visible).map(e => e.boxMesh) //过滤掉隐藏的
  61868. meshes.push(...allBoxMesh)
  61869. })
  61870. player.on('judgeIntersect', (intersect, e) => {
  61871. if (e.getConsumed()) return
  61872. let hoveredBox = intersect && allBoxMesh.includes(intersect.object) ? intersect.object.masterBox : null
  61873. if (hoveredBox != this.hoveredBox) {
  61874. if (this.hoveredBox) {
  61875. this.hoveredBox.boxMesh.visible = false
  61876. this.hoveredBox.boxHelper.material.opacity = 0.5
  61877. this.hoveredBox.boxHelper.material.color.copy(colors.green)
  61878. this.hoveredBox.label.setBackgroundColor( Object.assign(colors.labelGreen) )//text
  61879. }
  61880. if (hoveredBox) {
  61881. hoveredBox.boxMesh.visible = true
  61882. hoveredBox.boxHelper.material.opacity = 1
  61883. hoveredBox.boxHelper.material.color.copy(colors.yellow)
  61884. hoveredBox.label.setBackgroundColor( Object.assign(colors.labelYellow ))//text
  61885. CursorDeal.add('hoverMonitor')
  61886. } else {
  61887. CursorDeal.remove('hoverMonitor')
  61888. }
  61889. this.hoveredBox = hoveredBox
  61890. }
  61891. hoveredBox && e.consume()
  61892. })
  61893. player.on('click', e => {
  61894. if (e.getConsumed()) return
  61895. if (this.hoveredBox) {
  61896. player.$app.Scene.emit('box-frame-click', this.hoveredBox)
  61897. e.consume()
  61898. }
  61899. }) */
  61900. /* let allRectMesh
  61901. player.on('collectIntersectMesh', (meshes, e) => {
  61902. if(!this.wireframes || !this.wireframes.visible)return
  61903. allRectMesh = this.wireframes.children.filter(e=>e.name == 'rectInPano').map(e => e.plane) //plane
  61904. meshes.push(...allRectMesh)
  61905. })
  61906. player.on('judgeIntersect', (intersect, e) => {
  61907. if (e.getConsumed() || !this.wireframes || !this.wireframes.visible) return
  61908. let hoveredRect = intersect && allRectMesh.includes(intersect.object) ? intersect.object.parent.parent : null
  61909. if (hoveredRect != this.hoveredRect) {
  61910. if (this.hoveredRect) {
  61911. this.hoveredRect.wireframe.material.color.copy(colors.green)//框
  61912. this.hoveredRect.label.setBackgroundColor( colors.labelGreen )//text
  61913. this.hoveredRect.plane.visible = false //plane
  61914. }
  61915. if (hoveredRect) {
  61916. hoveredRect.wireframe.material.color.copy(colors.yellow)//框
  61917. hoveredRect.label.setBackgroundColor(colors.labelYellow )//text
  61918. hoveredRect.plane.visible = true //plane
  61919. CursorDeal.add('hoverMonitor')
  61920. } else {
  61921. CursorDeal.remove('hoverMonitor')
  61922. }
  61923. this.hoveredRect = hoveredRect
  61924. }
  61925. hoveredRect && e.consume()
  61926. })
  61927. player.on('click', e => {
  61928. if (e.getConsumed() || !this.wireframes || !this.wireframes.visible) return
  61929. if (this.hoveredRect) {
  61930. console.log(this.hoveredRect.data)
  61931. e.consume()
  61932. }
  61933. }) */
  61934. if (this.ifAnalyze && !isDiwei$1) {
  61935. setTimeout(function () {
  61936. {
  61937. var btn = document.createElement('button');
  61938. btn.innerHTML = '点击切换box显示';
  61939. var visi;
  61940. btn.onclick = function () {
  61941. visi = !visi; //this.boxesSolid.forEach(e => ((e.boxHelper.visible = visi), (e.label.visible = visi), (e.boxMesh.visible = false)))
  61942. _this8.boxesSolid.forEach(function (e) {
  61943. return e.updateVisible(visi, 'whole');
  61944. });
  61945. _this8.showBoxes = visi;
  61946. };
  61947. document.querySelector('#app').appendChild(btn);
  61948. btn.id = 'boxWire';
  61949. btn.style.position = 'fixed';
  61950. btn.style['z-index'] = '100';
  61951. btn.style.background = '#e00472';
  61952. btn.style.padding = '10px';
  61953. btn.style.bottom = '80px';
  61954. }
  61955. {
  61956. var _btn = document.createElement('button');
  61957. _btn.innerHTML = '点击切换矩形框显示';
  61958. _btn.onclick = function () {
  61959. _this8.wireframes.visible = !_this8.wireframes.visible;
  61960. };
  61961. document.querySelector('#app').appendChild(_btn);
  61962. _btn.id = 'wireframes';
  61963. _btn.style.position = 'fixed';
  61964. _btn.style['z-index'] = '100';
  61965. _btn.style.background = '#419aff';
  61966. _btn.style.padding = '10px';
  61967. _btn.style.bottom = '130px';
  61968. }
  61969. }, 1000);
  61970. }
  61971. }
  61972. /**
  61973. * 加载点位标记数据
  61974. * @param {*} panoId
  61975. */
  61976. }, {
  61977. key: "load",
  61978. value: function load(panoId) {
  61979. var _this9 = this;
  61980. var data = this.datasMixed[panoId] || this.datas[panoId];
  61981. if (!data) {
  61982. if (!(panoId in this.datas)) setTimeout(function () {
  61983. _this9.load(panoId);
  61984. }, 100); //否则无数据
  61985. return;
  61986. }
  61987. if (player$d.currentPano.id != panoId || player$d.flying || this.currentId == panoId) return; // 防止连续跳转点位时,clear后才load好上一点位的数据,导致出现之前的标记
  61988. this.currentId = panoId;
  61989. var shapes = data.shapes,
  61990. imageHeight = data.imageHeight,
  61991. imageWidth = data.imageWidth; //data.data
  61992. var allShapes = shapes.slice();
  61993. shapes.forEach(function (e) {
  61994. if (e.boxes) allShapes.push.apply(allShapes, _toConsumableArray(e.boxes));
  61995. });
  61996. allShapes.forEach(function (shape) {
  61997. // 填充色和线框色
  61998. // let { fill_color, line_color } = shape
  61999. getUVs$2(shape);
  62000. getCenterDir$2(shape, player$d.currentPano);
  62001. var fill_color = shape.fill_color,
  62002. _shape$color = shape.color,
  62003. color = _shape$color === void 0 ? [56, 56, 255] : _shape$color;
  62004. var line_color = [].concat(_toConsumableArray(color), [255]);
  62005. if (!fill_color) fill_color = [255, 255, 255, 0];
  62006. if (!line_color) line_color = [255, 0, 0, 255];
  62007. if (shape.boxes) {
  62008. line_color = [20, 205, 255, 255];
  62009. }
  62010. var pos = getBoxPos$1(shape);
  62011. var dis = pos ? shape.pano.position.distanceTo(getBoxPos$1(shape)) : 1;
  62012. var labelShift = (shape.boxType == 'fire' ? 0 : -0.2) / dis;
  62013. var name = shape.category + '-' + shape.sid; //if(shape.score < MinBoxInitialScore){
  62014. name = [name, 'sc: ' + math$2.toPrecision(shape.score, 3)]; //}
  62015. _this9.showSignalFrom2d(name, shape.bbox2, imageWidth, imageHeight, {
  62016. fill: {
  62017. color:
  62018. /* colors.yellow, // */
  62019. new THREE.Color().setRGB(fill_color[0] / 255, fill_color[1] / 255, fill_color[2] / 255),
  62020. opacity:
  62021. /* 0.2, */
  62022. fill_color[3] / 255
  62023. },
  62024. line: {
  62025. color:
  62026. /* colors.green,// */
  62027. new THREE.Color().setRGB(line_color[0] / 255, line_color[1] / 255, line_color[2] / 255),
  62028. opacity: shape.category == 'cabling_rack' ? 0.4 : line_color[3] / 255 //走线架太绕,扰乱视线
  62029. }
  62030. }, shape.centerDir, labelShift, shape.state == '被删除', shape);
  62031. }); // })
  62032. // .catch(err => console.log(`点位${panoId}无标记数据或数据出错:`, err))
  62033. }
  62034. /**
  62035. * 根据坐标标记全景图
  62036. *
  62037. * 存在的问题:如果要准确复现全景图上的线框,上下边框会变为弧形。而按顶点连直线的话,180度以上会出bug。
  62038. * 解决方式:目前150度以下只画出4个顶点然后连直线,150度以上准确画出全景图线框。
  62039. */
  62040. }, {
  62041. key: "showSignalFrom2d",
  62042. value: function showSignalFrom2d(name, rect, w, h, options, centerDir, labelShift, removed, data) {
  62043. // 目前rect给的是矩形对角的两个点坐标,将它扩展成四个顶点
  62044. 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])]; // 根据四个顶点,填充中间点
  62045. var pointArr = [];
  62046. for (var i = 0; i < cornerArr.length; i++) {
  62047. var corner1 = cornerArr[i];
  62048. pointArr.push(corner1);
  62049. /* // 横向角度超过150度时,3d中边框的弧线已经不太明显,准确画出全景图线框
  62050. if ((rect[2] - rect[0]) / w < 5 / 12 && i % 2 == 0) continue
  62051. const vec = [corner2[0] - corner1[0], corner2[1] - corner1[1]]
  62052. let length = Math.sqrt(vec[0] * vec[0] + vec[1] * vec[1])
  62053. let num = length / 150
  62054. for (let j = 1; j <= num; j++) {
  62055. pointArr.push([corner1[0] + (vec[0] / num) * j, corner1[1] + (vec[1] / num) * j])
  62056. } */
  62057. } //pointArr.push(cornerArr[0], cornerArr[2], cornerArr[1], cornerArr[3]) //对角线
  62058. var points = [];
  62059. pointArr.forEach(function (uv) {
  62060. var dir = getDirByUV$2(uv, player$d.currentPano); // points.push(dir.sub(centerVec)) // 计算其他点相对于中点的坐标,方便旋转平移等
  62061. points.push(dir);
  62062. }); // 线框
  62063. var lineGeometry = new THREE.BufferGeometry().setFromPoints(points);
  62064. var lineMaterial = new THREE.LineBasicMaterial({
  62065. color: options.line.color,
  62066. opacity: options.line.opacity,
  62067. transparent: true,
  62068. depthTest: false
  62069. });
  62070. var wireframe = new THREE.LineLoop(lineGeometry, lineMaterial); // wireframe.position.copy(centerVec) // 将中点作为线框坐标
  62071. wireframe.renderOrder = 100; // 填充颜色
  62072. var fillGeometry = lineGeometry.clone().setIndex(new THREE.BufferAttribute(new Uint16Array([0, 1, 3, 2, 3, 1]), 1));
  62073. var fillMaterial = new THREE.MeshBasicMaterial({
  62074. color: options.fill.color,
  62075. opacity: options.fill.opacity,
  62076. transparent: true,
  62077. side: THREE.DoubleSide,
  62078. depthTest: false
  62079. });
  62080. var plane = new THREE.Mesh(fillGeometry, fillMaterial);
  62081. plane.renderOrder = wireframe.renderOrder - 1;
  62082. wireframe.add(plane);
  62083. plane.visible = false; // 名称
  62084. var textMesh = new TextSprite({
  62085. text: name,
  62086. backgroundColor: {
  62087. r: options.line.color.r * 255,
  62088. g: options.line.color.g * 255,
  62089. b: options.line.color.b * 255,
  62090. a: options.line.opacity * 0.5
  62091. },
  62092. textColor: {
  62093. r: 255,
  62094. g: 255,
  62095. b: 255,
  62096. a: options.line.opacity * 1.1
  62097. },
  62098. borderRadius: 15,
  62099. renderOrder: wireframe.renderOrder + 1,
  62100. player: player$d
  62101. }); //const shift = new THREE.Vector3(0, labelShift , 0)
  62102. textMesh.position.copy(centerDir
  62103. /* .clone().add(shift).normalize() */
  62104. );
  62105. textMesh.lookAt(0, 0, 0); // 看向相机
  62106. textMesh.scale.set(0.12, 0.12, 0.12);
  62107. /* let line = addLine(centerDir, shift, null, options.line.color)
  62108. line.material.opacity = options.line.opacity */
  62109. var group = new THREE.Group();
  62110. group.name = 'rectInPano';
  62111. group.position.copy(player$d.currentPano.position);
  62112. group.add(wireframe);
  62113. group.add(textMesh); //group.add(line)
  62114. this.wireframes.add(group);
  62115. group.label = textMesh;
  62116. group.wireframe = wireframe;
  62117. group.plane = plane;
  62118. if (removed) {
  62119. textMesh.sprite.material.opacity = 0.4;
  62120. lineMaterial.opacity *= 0.6;
  62121. lineMaterial.color.set('#efe');
  62122. }
  62123. group.data = data;
  62124. }
  62125. }, {
  62126. key: "clear",
  62127. value: function clear() {
  62128. skyBoxTight = null, meshGroup$1 = null, modelBound$1 = new THREE.Box3(), groundY$1 = null, safeBound$1 = null, boundConfirmed$1 = null, boxesSolid$1 = [];
  62129. }
  62130. }]);
  62131. return PanoBoxFrame;
  62132. }(THREE.Group);
  62133. 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); }; }
  62134. 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; } }
  62135. var global$1 = window; //----------------------复制以下内容---------------------------------
  62136. var fineModelLevel = 1; //如果模型准的话 可能多楼层。另外暂时不用expandMound
  62137. //1级: 有分房间,但模型不精细 KK-t-QzlzQoim4P0
  62138. //2级: 一般是3dTiles 家具有模型,墙壁不光滑 SG-t-N6no657Kuze SG-t-g3kcZ3tcaVG
  62139. var player$c,
  62140. skyboxTight,
  62141. meshGroup,
  62142. modelBound = new THREE.Box3(),
  62143. ray = new THREE.Raycaster(),
  62144. groundPlane = new THREE.Plane(),
  62145. groundY,
  62146. safeBound,
  62147. boundConfirmed = true,
  62148. startTime,
  62149. boxesSolid = [],
  62150. isExt,
  62151. isDiwei,
  62152. shelterFilterEnable = true,
  62153. shelterByModel = false,
  62154. isLocalTest = location.href.includes('192.168.0.59:') || location.href.includes('localhost:'); //my pc
  62155. var colors = {
  62156. yellow: new THREE.Color(238 / 255, 217 / 255, 35 / 255),
  62157. green: new THREE.Color(39 / 255, 160 / 255, 146 / 255),
  62158. labelYellow: {
  62159. r: 238,
  62160. g: 217,
  62161. b: 35,
  62162. a: 0.5
  62163. },
  62164. labelGreen: {
  62165. r: 39,
  62166. g: 160,
  62167. b: 146,
  62168. a: 0.5
  62169. }
  62170. };
  62171. /* const typeNames = {
  62172. fire: 'extinguisher', //灭火器
  62173. monitor: 'surveillance_camera', //监控摄像机 放第一个,用于继续确定边界
  62174. hlkcWindow: 'hlkc', //馈线窗
  62175. groundBar: 'grounding_bar', //接地排
  62176. cabinet: 'equipment_cabinet', //标准机柜
  62177. battery: 'accumulator', //蓄电池组
  62178. electric: ['ac_switchboard', 'dc_distribution'],
  62179. air: 'sdkt', //普通空调柜式
  62180. airSmart: 'ventilation_installation', //智能通风设备
  62181. //cabling : 'cabling_rack', //单层走线架 因为在天花板的走线有点复杂,经常断开,无法确定方向所以放弃
  62182. } */
  62183. //注意:为了让getBoxPoseByPos的长宽更准确,thick最大值尽量小于width最小值
  62184. var standards = {
  62185. cabinet: {
  62186. widthNormal: {
  62187. min: 0.55,
  62188. max: 1.05
  62189. },
  62190. //widthNormal是不计宽还是厚度的平均宽度 //个别场景如S9yepREK8Jl 宽0.8米
  62191. height: {
  62192. min: 0.3,
  62193. max: 2.5,
  62194. standard: 2
  62195. },
  62196. closeRatio: 0.7 //数值越小越容易findRest。一般在墙上的位置不准要设置大些,扎堆放置的设置小些
  62197. },
  62198. sofa: {
  62199. widthNormal: {
  62200. min: 0.8,
  62201. max: 3
  62202. },
  62203. width: {
  62204. min: 1.2,
  62205. max: 3
  62206. },
  62207. thick: {
  62208. min: 0.6,
  62209. max: 1.19
  62210. },
  62211. height: {
  62212. min: 0.5,
  62213. max: 1.2,
  62214. standard: 1
  62215. },
  62216. closeRatio: 0.1,
  62217. atWall: 0.3
  62218. },
  62219. desk: {
  62220. widthNormal: {
  62221. min: 0.55,
  62222. max: 3
  62223. },
  62224. width: {
  62225. min: 1.0,
  62226. max: 3
  62227. },
  62228. thick: {
  62229. min: 0.5,
  62230. max: 0.9
  62231. },
  62232. height: {
  62233. min: 0.7,
  62234. max: 1.2,
  62235. standard: 1
  62236. },
  62237. closeRatio: 2
  62238. },
  62239. bed: {
  62240. widthNormal: {
  62241. min: 0.9,
  62242. max: 2
  62243. },
  62244. width: {
  62245. min: 1.85,
  62246. max: 2.1
  62247. },
  62248. thick: {
  62249. min: 0.8,
  62250. max: 1.5
  62251. },
  62252. height: {
  62253. min: 0.3,
  62254. max: 0.9,
  62255. standard: 0.4
  62256. },
  62257. closeRatio: 2
  62258. },
  62259. tv: {
  62260. //假设是比较大而薄的放电视柜上的电视
  62261. widthNormal: {
  62262. min: 0.2,
  62263. max: 1.2
  62264. },
  62265. width: {
  62266. min: 0.5,
  62267. max: 1.1
  62268. },
  62269. thick: {
  62270. min: 0.05,
  62271. max: 0.2
  62272. },
  62273. height: {
  62274. min: 0.5,
  62275. max: 1.2,
  62276. standard: 0.7
  62277. },
  62278. bottom: {
  62279. min: 0.3,
  62280. max: 0.7
  62281. },
  62282. atWall: 0.8 ,
  62283. closeRatio: 2
  62284. }
  62285. };
  62286. var typeNames = {
  62287. sofa: 'CombinationSofa',
  62288. //组合沙发
  62289. desk: 'Desk',
  62290. bed: 'DoubleBed',
  62291. tv: 'TV'
  62292. };
  62293. var getChName$1 = {
  62294. sofa: '组合沙发',
  62295. desk: '书桌',
  62296. bed: '双人床',
  62297. tv: '电视'
  62298. };
  62299. var addLine = function addLine(origin, dir, len, color) {
  62300. return;
  62301. };
  62302. var addLabel = function addLabel(pos, text) {
  62303. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  62304. bgcolor = _ref.bgcolor,
  62305. a = _ref.a;
  62306. new THREE.Vector3(0, -0.2, 0);
  62307. bgcolor = bgcolor ? new THREE.Color(bgcolor) : {
  62308. r: 1,
  62309. g: 1,
  62310. b: 1
  62311. }; //let endPos = new THREE.Vector3().addVectors(pos,shift);
  62312. text instanceof Array || (text = [text]);
  62313. var lineCount = Math.round(Math.random() * 6) + 1;
  62314. var lines = [];
  62315. while (lineCount-- > 0) {
  62316. lines.push('|');
  62317. }
  62318. text = [].concat(_toConsumableArray(text), lines, ['o']);
  62319. var textMesh = new TextSprite({
  62320. text,
  62321. textColor: {
  62322. r: 0,
  62323. g: 0,
  62324. b: 0,
  62325. a: 1
  62326. },
  62327. backgroundColor: {
  62328. r: bgcolor.r * 255,
  62329. g: bgcolor.g * 255,
  62330. b: bgcolor.b * 250,
  62331. a: a || 0
  62332. },
  62333. textBorderColor: {
  62334. r: bgcolor.r * 255,
  62335. g: bgcolor.g * 255,
  62336. b: bgcolor.b * 250,
  62337. a: a || 0.9
  62338. },
  62339. textBorderThick: 2,
  62340. margin: {
  62341. x: 0,
  62342. y: 0
  62343. },
  62344. borderRadius: 0,
  62345. player: player$c,
  62346. sizeInfo: {
  62347. minSize: 90,
  62348. maxSize: 300,
  62349. nearBound: 1,
  62350. farBound: 7
  62351. }
  62352. });
  62353. textMesh.position.copy(pos); //textMesh.scale.set(0.3, 0.3, 0.3)
  62354. meshGroup.add(textMesh);
  62355. textMesh.sprite.position.y += textMesh.sprite.scale.y * 0.4;
  62356. return textMesh;
  62357. };
  62358. var getBoxFinalPos = function getBoxFinalPos(info) {
  62359. //创建solidbox时的position
  62360. var position;
  62361. var center = getBoxPos(info);
  62362. if (standards[info.boxType].bottom) {
  62363. //悬挂
  62364. position = center;
  62365. } else {
  62366. //fineModelLevel不用这个因为可能有楼梯
  62367. var groundY_ = groundY;
  62368. {
  62369. var samplers = [];
  62370. traverse(info, function (e) {
  62371. if (!e.btmPos) return;
  62372. samplers.push(e.btmPos.y);
  62373. });
  62374. groundY_ = samplers.reduce(function (w, y) {
  62375. return w += y;
  62376. }, 0);
  62377. groundY_ /= samplers.length; //平均值
  62378. }
  62379. position = center.clone().setY(groundY_ + info.size.y / 2); //使着地
  62380. }
  62381. return position;
  62382. };
  62383. var boxGeo = new THREE.BoxBufferGeometry();
  62384. var boxMat = new THREE.MeshBasicMaterial({
  62385. color: colors.yellow,
  62386. opacity: 0.3,
  62387. transparent: true,
  62388. depthTest: !!shelterByModel
  62389. });
  62390. 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)];
  62391. var traverse = function traverse(info, fun) {
  62392. //忽略.infos的row 的信息
  62393. fun(info);
  62394. info.list && info.list.forEach(function (a) {
  62395. return traverse(a, fun);
  62396. });
  62397. info.mixedFrom && info.mixedFrom.forEach(function (a) {
  62398. return traverse(a, fun);
  62399. });
  62400. };
  62401. var Box = /*#__PURE__*/function () {
  62402. //结果
  62403. function Box(info) {
  62404. _classCallCheck(this, Box);
  62405. //preDealBox(info)
  62406. this.setFromInfo(info);
  62407. this.buildFromData || (this.name = this.boxType + '-' + this.name);
  62408. if ((this.buildFromData || boundConfirmed)) this.draw();
  62409. boxesSolid.push(this);
  62410. }
  62411. _createClass(Box, [{
  62412. key: "setFromInfo",
  62413. value: function setFromInfo(info) {
  62414. for (var i in info) {
  62415. this[i] = info[i];
  62416. }
  62417. /* let h = info.size.y
  62418. let standardH = standards[info.boxType].height.standard
  62419. if (h > standardH) {
  62420. h = standardH + Math.log(1 + (h - standardH) / 2) //Math.log2: 以2为底的对数 ,Math.log:自然对数
  62421. info.size.y = h
  62422. } */
  62423. this.position = this.buildFromData ? this.center : getBoxFinalPos(this);
  62424. var bound = new THREE.Box3().setFromCenterAndSize(this.position, this.size);
  62425. this.bound = bound;
  62426. }
  62427. }, {
  62428. key: "draw",
  62429. value: function draw() {
  62430. var color = colors.yellow; //green //new THREE.Color().setHSL(hue, 0.9, 0.85)
  62431. this.boxHelper = new THREE.Box3Helper(this.bound, color);
  62432. (this.boxHelper.material.depthTest = false); //this.boxHelper.material.opacity = 0.5
  62433. this.boxHelper.material.transparent = true;
  62434. this.boxHelper.renderOrder = 10;
  62435. /* let { warnStr, exStr } = this
  62436. warnStr && (exStr += `【${warnStr}】`) */
  62437. //this.label = addLabel(this.position, /* exStr ? [this.name, exStr] : */ this.score ? [this.name, this.score.toFixed(1)] : this.name, { bgcolor: color })
  62438. this.label = new TextSprite({
  62439. text: (player$c.$app.config.lang == 'zh' ? getChName$1[this.boxType] : typeNames[this.boxType]) + '-' + (boxesSolid.length + 1),
  62440. //this.external ? [this.external.eqpName || '', this.external.eqpType || ''] : this.name,
  62441. backgroundColor: Object.assign(colors.labelYellow
  62442. /* labelGreen */
  62443. ),
  62444. textColor: {
  62445. r: 255,
  62446. g: 255,
  62447. b: 255,
  62448. a: 1
  62449. },
  62450. borderRadius: 15,
  62451. renderOrder: 10,
  62452. fontSize: 20,
  62453. player: player$c,
  62454. sizeInfo: {
  62455. minSize: 50,
  62456. maxSize: 200,
  62457. nearBound: 1,
  62458. farBound: 20
  62459. }
  62460. });
  62461. meshGroup.add(this.label);
  62462. this.label.position.copy(this.position);
  62463. this.label.position.y += 0.3;
  62464. var s = 0.2;
  62465. this.label.scale.set(s, s, s);
  62466. var box = new THREE.Mesh(boxGeo, boxMat);
  62467. box.position.copy(this.position);
  62468. box.scale.copy(this.size);
  62469. box.masterBox = this;
  62470. box.name = this.name;
  62471. box.renderOrder = 20;
  62472. meshGroup.add(box);
  62473. this.boxMesh = box;
  62474. meshGroup.add(this.boxHelper);
  62475. isDiwei && this.updateVisible(false, 'unhover');
  62476. }
  62477. }, {
  62478. key: "updateVisible",
  62479. value: function updateVisible(show, reason) {
  62480. common$1.updateVisible(this.boxHelper, reason, show);
  62481. common$1.updateVisible(this.label, reason, show);
  62482. common$1.updateVisible(this.boxMesh, reason, show);
  62483. }
  62484. }, {
  62485. key: "dispose",
  62486. value: function dispose() {
  62487. var index = boxesSolid.indexOf(this);
  62488. if (index > -1) {
  62489. boxesSolid.splice(index, 1);
  62490. if (boundConfirmed) {
  62491. if (isLocalTest) {
  62492. this.label.sprite.material.opacity = 0.3;
  62493. this.boxHelper.material.opacity = 0.2;
  62494. } else {
  62495. this.boxHelper.removeFromParent();
  62496. this.label.removeFromParent();
  62497. }
  62498. this.boxMesh.removeFromParent();
  62499. }
  62500. }
  62501. }
  62502. }, {
  62503. key: "traversePair",
  62504. value: function traversePair(fun) {
  62505. traverse(this, fun);
  62506. }
  62507. }, {
  62508. key: "getDirection",
  62509. value: function getDirection() {
  62510. //获得正面朝向。 需要全部box都创建完再调用
  62511. var xProp = this.xProp;
  62512. var dir; //哪边pano多朝哪边
  62513. if (this.boxType == 'cabinet' && this.name.includes('row')) {
  62514. if (this.infos.rowboxs.length > 1) {
  62515. var k = this.infos.reduce(function (w, c) {
  62516. return w + c.k;
  62517. }, 0);
  62518. xProp = k > 1 ? 'width' : 'thick';
  62519. } else {
  62520. //直接使用别的多box的row的方向 ,大多数都相同(会有例外,无所谓了)
  62521. var rows = boxesSolid.filter(function (e) {
  62522. return e.boxType == 'cabinet' && e.name.includes('row') && e.dirQua;
  62523. });
  62524. rows.sort(function (a, b) {
  62525. return b.infos.rowboxs.length - a.infos.rowboxs.length;
  62526. });
  62527. var box = rows[0];
  62528. if (box) {
  62529. return this.dirQua = box.dirQua;
  62530. }
  62531. }
  62532. }
  62533. if (!xProp) {
  62534. //根据房间的长宽 散落的cabinet。 fire monitor
  62535. var _getBoxDirProp = getBoxDirProp();
  62536. _getBoxDirProp.xWidthPossible;
  62537. _getBoxDirProp.yWidthPossible;
  62538. xProp = this.xProp;
  62539. /* if(Math.abs(xWidthPossible - yWidthPossible) < 0.3){
  62540. let size = new THREE.Vector3()
  62541. safeBound.getSize(size)
  62542. xWidthPossible += (size.x - size.z) * 0.5
  62543. if(xWidthPossible > yWidthPossible){
  62544. xProp = 'width'
  62545. }
  62546. } */
  62547. }
  62548. if (xProp) {
  62549. if (!this.panosDir) getPanosDir(this);
  62550. if (xProp == 'width') {
  62551. if (Math.abs(this.panosDir['z+']) < Math.abs(this.panosDir['z-'])) {
  62552. //朝-z//也就是新坐标系的y
  62553. //this.dirQua='下'
  62554. dir = new THREE.Vector3(0, 1, 0);
  62555. } else {
  62556. //朝+z
  62557. //this.dirQua='上'
  62558. dir = new THREE.Vector3(0, -1, 0);
  62559. }
  62560. } else {
  62561. if (Math.abs(this.panosDir['x+']) < Math.abs(this.panosDir['x-'])) {
  62562. //朝-x
  62563. //this.dirQua='右'
  62564. dir = new THREE.Vector3(-1, 0, 0);
  62565. } else {
  62566. //朝+x
  62567. //this.dirQua='左'
  62568. dir = new THREE.Vector3(1, 0, 0);
  62569. }
  62570. }
  62571. } //addLabel(this.position, this.dirQua)
  62572. this.dirQua = convertTool.getQuaByAim(dir, new THREE.Vector3(), new THREE.Vector3(0, 0, 1));
  62573. return this.dirQua;
  62574. /*飞到俯视图查看(不旋转视图,x朝右,z朝下)。以下四个qua是四个墙壁每个墙壁上的dirQua。
  62575. _x: 0, _y: -0, _z: 1, _w: 0
  62576. _x: 0, _y: 0, _z: -0.707, _w: 0.707 _x: 0, _y: -0, _z: 0.707, _w: 0.707
  62577. x: 0, _y: 0, _z: 0, _w: 1
  62578. */
  62579. }
  62580. }, {
  62581. key: "toJson",
  62582. value: function toJson() {
  62583. var _this = this;
  62584. //转出的坐标系是z朝上的
  62585. var category = typeNames[this.boxType];
  62586. if (category instanceof Array) {
  62587. var scoreMap = new Map();
  62588. category = category.slice(0);
  62589. category.forEach(function (e) {
  62590. return scoreMap.set(e, 0);
  62591. }); //初始化
  62592. //判断boxType: 寻找所使用的box总分最高的boxType
  62593. var add = function add(box) {
  62594. if (!box) return;
  62595. var score = scoreMap.get(box.category) + box.score;
  62596. scoreMap.set(box.category, score);
  62597. };
  62598. this.traversePair(function (e) {
  62599. add(e.box0);
  62600. add(e.box1);
  62601. });
  62602. category = category.sort(function (a, b) {
  62603. return scoreMap.get(b) - scoreMap.get(a);
  62604. });
  62605. category = category[0]; //最高分
  62606. }
  62607. this.getDirection();
  62608. var json = {
  62609. points: axises.map(function (axis) {
  62610. return math$2.toPrecision(convert.invertVisionVector(new THREE.Vector3().addVectors(_this.position, _this.size.clone().multiply(axis).multiplyScalar(0.5))).toArray(), 4);
  62611. }),
  62612. category,
  62613. type: this.boxType,
  62614. sid: this.name,
  62615. quaternion: this.dirQua.toArray()
  62616. };
  62617. return json;
  62618. }
  62619. }, {
  62620. key: "getClosetPano",
  62621. value: function getClosetPano() {
  62622. var _this2 = this;
  62623. if (this.closetPano) return this.closetPano;
  62624. this.visiPanos = player$c.model.panos.list.filter(function (pano) {
  62625. if (global$1.aiBox.visiInfos[pano.id]) return global$1.aiBox.visiInfos[pano.id].includes(_this2);else return _this2.cptVisiAtPano(pano);
  62626. });
  62627. var bestDisSquared = this.size.length();
  62628. var nearestPanos = common$1.sortByScore(this.visiPanos, [Panorama.filters.isPanoAligned()], [function (pano) {
  62629. return -Math.abs(bestDisSquared - _this2.position.distanceToSquared(pano.position));
  62630. }]).map(function (e) {
  62631. return e.item;
  62632. });
  62633. this.closetPano = nearestPanos[0];
  62634. if (!this.closetPano) {
  62635. this.traversePair(function (e) {
  62636. var _e$box;
  62637. if (!_this2.closetPano) _this2.closetPano = (_e$box = e.box0) === null || _e$box === void 0 ? void 0 : _e$box.pano;
  62638. });
  62639. console.log('box没找到可见的closetPano,使用了自身的一个pano', this.closetPano.id); //加入可见列表:
  62640. if (global$1.aiBox.visiInfos[this.closetPano.id]) global$1.aiBox.visiInfos[this.closetPano.id].push(this);else this.visiPanos.push(this.closetPano);
  62641. }
  62642. return this.closetPano;
  62643. }
  62644. }, {
  62645. key: "cptVisiAtPano",
  62646. value: function cptVisiAtPano(pano) {
  62647. var _this3 = this;
  62648. if (pano.id == 6
  62649. /* this.label.text[0].includes('8') */
  62650. ) {
  62651. console.log(1);
  62652. }
  62653. var bound = this.bound;
  62654. var ifNoShelterByBox = function ifNoShelterByBox() {
  62655. var box2 = new THREE.Box2(new THREE.Vector2(bound.min.x, bound.min.z), new THREE.Vector2(_this3.bound.max.x, _this3.bound.max.z));
  62656. var standInBox = box2.containsPoint(new THREE.Vector2(pano.position.x, pano.position.z));
  62657. return [new THREE.Vector3(-_this3.size.x / 2, 0, 0), new THREE.Vector3(_this3.size.x / 2, 0, 0), new THREE.Vector3(0, 0, _this3.size.z / 2), new THREE.Vector3(0, 0, -_this3.size.z / 2), new THREE.Vector3(0, 0, _this3.size.y / 2)].some(function (dir) {
  62658. var faceCenter = new THREE.Vector3().addVectors(_this3.position, dir); //在box前后左右上 面上的中心点
  62659. var camDir = new THREE.Vector3().subVectors(faceCenter, pano.position).normalize();
  62660. if (!standInBox) {
  62661. if (camDir.dot(dir) >= 0) return false; //在背面
  62662. }
  62663. ray.set(pano.position, camDir);
  62664. var far = pano.position.distanceTo(faceCenter);
  62665. ray.far = far;
  62666. var o = ray.intersectObjects(global$1.aiBox.boxesSolid.filter(function (e) {
  62667. return e != _this3;
  62668. }).map(function (e) {
  62669. return e.boxMesh;
  62670. })); //加了个true遍历子集//ray.ray.intersectsBox(box2.bound)
  62671. return !(o && o.length);
  62672. });
  62673. };
  62674. var ifNoShelterByWall = function ifNoShelterByWall() {
  62675. var boundPoints = [new THREE.Vector3(bound.min.x, bound.min.y, bound.min.z), new THREE.Vector3(bound.min.x, bound.min.y, bound.max.z), new THREE.Vector3(bound.max.x, bound.min.y, bound.max.z), new THREE.Vector3(bound.max.x, bound.min.y, bound.min.z), new THREE.Vector3(bound.max.x, bound.max.y, bound.min.z), new THREE.Vector3(bound.min.x, bound.max.y, bound.min.z), new THREE.Vector3(bound.min.x, bound.max.y, bound.max.z), new THREE.Vector3(bound.max.x, bound.max.y, bound.max.z)];
  62676. var noIntersect = boundPoints.some(function (p) {
  62677. var intersect = convertTool.ifIntersectChunks(pano.position, p, player$c.model, {
  62678. extLen: 0
  62679. });
  62680. return !intersect;
  62681. });
  62682. if (noIntersect) {
  62683. var _player$$app$store$ge;
  62684. //模型墙面缺失时用cad代替
  62685. var floors = (_player$$app$store$ge = player$c.$app.store.getValue('flooruser')) === null || _player$$app$store$ge === void 0 ? void 0 : _player$$app$store$ge.floors;
  62686. var curFloorJson = floors === null || floors === void 0 ? void 0 : floors.find(function (floorData0, index) {
  62687. //参见labelManager
  62688. index = player$c.model.floors.list.length > 1 ? floorData0.subgroup != void 0 ? floorData0.subgroup : floorData0.id : index; //旧版单层model的id和json不对应,使用model的
  62689. return index == pano.floorIndex;
  62690. });
  62691. if (curFloorJson) {
  62692. noIntersect = boundPoints.slice(0, 4).some(function (p) {
  62693. return !player$c.labelManager.isShelter(curFloorJson, p, pano.position, false, true);
  62694. });
  62695. }
  62696. }
  62697. return noIntersect;
  62698. };
  62699. return ifNoShelterByBox() && ifNoShelterByWall();
  62700. }
  62701. }]);
  62702. return Box;
  62703. }(); // 2d坐标转3d坐标
  62704. var getDirByUV$1 = function getDirByUV(uv, pano) {
  62705. // 计算方向向量
  62706. var yaw = -uv.x * (Math.PI * 2);
  62707. var pitch = Math.PI / 2 - uv.y * Math.PI;
  62708. var dir = new THREE.Vector3();
  62709. dir.copy(Vectors$1.RIGHT).applyAxisAngle(Vectors$1.BACK, pitch).applyAxisAngle(Vectors$1.UP, yaw).applyQuaternion(pano.quaternion);
  62710. return dir;
  62711. };
  62712. var getCenterDir$1 = function getCenterDir(box) {
  62713. if (box.centerDir) return; //假设不存在在box中间拍摄的情况,所以y不会横跨两边
  62714. var bbox = box.bbox2;
  62715. var center = {
  62716. x: getBbox2center$1(bbox[0], bbox[2]),
  62717. y: (bbox[1] + bbox[3]) / 2
  62718. };
  62719. box.bbox2CenterX = center.x;
  62720. var dir = getDirByUV$1(center, box.pano);
  62721. box.centerDir = dir;
  62722. var centerTop = {
  62723. x: center.x,
  62724. y: bbox[1]
  62725. };
  62726. box.centerTopDir = getDirByUV$1(centerTop, box.pano);
  62727. var centerBtm = {
  62728. x: center.x,
  62729. y: bbox[3]
  62730. };
  62731. box.centerBtmDir = getDirByUV$1(centerBtm, box.pano);
  62732. var leftBtm = {
  62733. x: bbox[0],
  62734. y: bbox[3]
  62735. };
  62736. box.leftBtmDir = getDirByUV$1(leftBtm, box.pano);
  62737. var rightBtm = {
  62738. x: bbox[2],
  62739. y: bbox[3]
  62740. };
  62741. box.rightBtmDir = getDirByUV$1(rightBtm, box.pano);
  62742. };
  62743. var getOtherPos = function getOtherPos(box) {
  62744. if (!box.boxType) return;
  62745. var config = standards[box.boxType];
  62746. if (!boundConfirmed) {
  62747. if (!config.bottom) {
  62748. ray.set(box.pano.position, box.centerBtmDir);
  62749. box.btmPosPredict = ray.ray.intersectPlane(groundPlane, new THREE.Vector3()); //没有的话就在空中 (部分air-hanging也会有)。 fire的这个值会较大误差,因为groundY还不确定,但不影响,因只用它射线交点的位置。
  62750. if (box.btmPosPredict) {
  62751. var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
  62752. var _standards$box$boxTyp = standards[box.boxType].widthNormal,
  62753. min = _standards$box$boxTyp.min,
  62754. max = _standards$box$boxTyp.max;
  62755. min = min * 0.4;
  62756. max = max * 0.4;
  62757. var minA = Math.min(Math.abs(dir2d.x), Math.abs(dir2d.y));
  62758. var depth = math$2.linearClamp(minA, 0, 1, min, max);
  62759. /* const depth = box.category == typeNames.cabinet ? 0.5 : 0.4
  62760. */
  62761. dir2d = dir2d.clone().multiplyScalar(depth);
  62762. box.btmPosPredict.x += dir2d.x;
  62763. box.btmPosPredict.z += dir2d.y; //addLabel(box.btmPosPredict,'b_'+box.category+"_"+box.sid, {bgcolor:'#6ff',a:0.1})
  62764. //box.btmPosPredict.clamp(safeBound.min, safeBound.max)
  62765. }
  62766. }
  62767. return;
  62768. }
  62769. if (!box.posAtWall && config.atWall > 0) {
  62770. //console.log(box.sid, 'getPosWall')
  62771. var shrink = config.thick ? (config.thick.min + config.thick.max) / 2 : config.widthNormal.min; //尽量多shrink些,box别到墙另一边去,用于中和相交得到的center
  62772. ray.set(box.pano.position, box.centerDir);
  62773. var o = ray.intersectObjects(player$c.model.colliders );
  62774. if (o[0] && config.atWall > 0.6) {
  62775. box.posAtWall = new THREE.Vector3().addVectors(box.pano.position, box.centerDir.clone().multiplyScalar(o[0].distance - shrink));
  62776. {
  62777. var _o$0$face$normal;
  62778. var nor = (_o$0$face$normal = o[0].face.normal) === null || _o$0$face$normal === void 0 ? void 0 : _o$0$face$normal.clone().applyMatrix4(o[0].object.matrixWorld);
  62779. if (nor) {
  62780. if (Math.abs(nor.z) > 0.8) {
  62781. box.xProp = 'width', box.yProp = 'thick';
  62782. } else if (Math.abs(nor.x) > 0.8) {
  62783. box.xProp = 'thick', box.yProp = 'width';
  62784. }
  62785. }
  62786. }
  62787. } //因墙壁不准确,所以还是尽量不用墙的位置
  62788. /* if(box.btmPos){
  62789. let wallRatio = 0.5;
  62790. if(new THREE.Vector3().subVectors(box.btmPos, box.posAtWall).setY(0).length() > 1 )wallRatio = 0.2 //可能墙壁位置不准,靠后了
  62791. box.predictCenter = new THREE.Vector3().addVectors(box.btmPos.clone().multiplyScalar(1-wallRatio), box.posAtWall.clone().multiplyScalar(wallRatio))
  62792. //box.predictCenter = new THREE.Vector3().addVectors(box.posAtWall, box.btmPos).multiplyScalar(0.5) //也许能当中心点? 虽然y会低一些
  62793. addLabel(box.predictCenter, box.sid+'-preC')
  62794. } */
  62795. }
  62796. if (!box.btmPos) {
  62797. getBoxBtm(box);
  62798. }
  62799. if (!box.topPos) {
  62800. getBoxTop(box);
  62801. }
  62802. };
  62803. var getUVs$1 = function getUVs(box, imageWidth, imageHeight) {
  62804. if (box.bbox2) return;
  62805. if (!imageWidth) {
  62806. imageWidth = global$1.aiBox.datas[box.pano.id].imageWidth;
  62807. imageHeight = global$1.aiBox.datas[box.pano.id].imageHeight;
  62808. }
  62809. if (imageWidth != imageWidth || imageHeight != imageHeight) {
  62810. console.log(imageWidth, imageHeight);
  62811. }
  62812. box.bbox2 = box.bbox.map(function (e, i) {
  62813. //(x1,y1,x2,y2)
  62814. return i % 2 == 0 ? e / imageWidth
  62815. /* + 0.25 */
  62816. : e / imageHeight;
  62817. });
  62818. };
  62819. var getBoxBase = function getBoxBase(box, imageWidth, imageHeight) {
  62820. getBoxType(box);
  62821. getUVs$1(box, imageWidth, imageHeight);
  62822. getCenterDir$1(box);
  62823. getOtherPos(box);
  62824. };
  62825. var getBbox2Diff = function getBbox2Diff(x1, x2) {
  62826. //获取x1-x2,如果x1在x2右边则为正
  62827. if (Math.abs(x1 - x2) < 0.5) return x1 - x2;else {
  62828. if (x1 > x2) x1 -= 1;else x2 -= 1;
  62829. return x1 - x2;
  62830. }
  62831. };
  62832. var getBbox2center$1 = function getBbox2center(x1, x2) {
  62833. //找中间位置
  62834. if (Math.abs(x1 - x2) > 0.5) {
  62835. //永远找小于180度的那一边
  62836. return (x1 + x2 + 1) / 2; //另外半边
  62837. } else {
  62838. return (x1 + x2) / 2;
  62839. }
  62840. };
  62841. var getBoxTop = function getBoxTop(info) {
  62842. /* if(info.sid == 'pano0-11(mix4,8)'){
  62843. console.log(5)
  62844. } */
  62845. if (info.box1) {
  62846. var o2 = getIntersect2(info.box0.pano.position, info.box0.centerTopDir, info.box1.pano.position, info.box1.centerTopDir);
  62847. info.topPos = o2.pos3d;
  62848. info.diffHeight = o2.mid2 ? o2.mid2.distanceTo(o2.mid1) : 1;
  62849. if (info.box0.topPos && info.box1.topPos) {
  62850. info.topPos.y = (info.box0.topPos.y + info.box1.topPos.y) / 2; //原先的不准
  62851. }
  62852. } else {
  62853. //取btm上方对应的位置 ( 因为和skybox的交点会因离墙远而偏上或偏下)
  62854. var box = info.box0 || info;
  62855. var btm = box.btmPos;
  62856. if (!btm) {
  62857. btm = getBoxBtm(info);
  62858. }
  62859. box.topPos = btm.clone(); //xz同btm,要求y
  62860. var xDelta = btm.x - box.pano.position.x;
  62861. var zDelta = btm.z - box.pano.position.z;
  62862. var yDelta; //因为pano有旋转所以btm和top的xz其实是不一样的,所以会有误差。 故这里选择delta较大的
  62863. if (Math.abs(xDelta) < Math.abs(zDelta)) {
  62864. yDelta = zDelta * box.centerTopDir.y / box.centerTopDir.z;
  62865. /* console.log('use z', box)
  62866. if(Math.abs(xDelta)<0.1)console.error('!!!!!!!!!!!!!!!!!!!!!!! xDelta',xDelta, box.sid ) */
  62867. } else {
  62868. yDelta = xDelta * box.centerTopDir.y / box.centerTopDir.x; // console.log('use x', box)
  62869. }
  62870. box.topPos.y = yDelta + box.pano.position.y;
  62871. var minHeight =
  62872. /* info.boxType ? standards[info.boxType].height.min : box.category == typeNames.air ? 0.5 : */
  62873. standards[getBoxType(box)].height.min;
  62874. var diffH = Math.max(box.topPos.y - btm.y, minHeight);
  62875. box.topPos.y = btm.y + diffH;
  62876. info.topPos = box.topPos;
  62877. /* if (box.sid == 'pano2-1') {
  62878. addLabel(box.topPos,'t_'+box.sid,{bgcolor:'#ff4399'})
  62879. addLine(box.pano.position,box.centerTopDir, 20)
  62880. } */
  62881. }
  62882. return info.topPos;
  62883. };
  62884. var getBoxBtm = function getBoxBtm(info) {
  62885. if (info.box1) {
  62886. {
  62887. info.btmPos = new THREE.Vector3().addVectors(info.box0.btmPos, info.box1.btmPos).multiplyScalar(0.5);
  62888. }
  62889. } else {
  62890. var box = info.box0 || info;
  62891. if (!box.btmPos) {
  62892. if (box.sid == 'pano23-0') {
  62893. console.log(3);
  62894. addLine(box.pano.position, box.centerBtmDir);
  62895. }
  62896. if (!boundConfirmed) {
  62897. return box.btmPosPredict;
  62898. }
  62899. var dirs = [box.centerBtmDir];
  62900. dirs.push(box.leftBtmDir, box.rightBtmDir);
  62901. var model = player$c.model.colliders.concat([skyboxTight]) ;
  62902. var minY = Infinity;
  62903. dirs.forEach(function (dir, i) {
  62904. ray.set(box.pano.position, dir);
  62905. var o = ray.intersectObjects(model); // //如果skybound有问题,位置就会错
  62906. if (i == 0) {
  62907. box.btmPosOri = o[0].point.clone();
  62908. }
  62909. minY = Math.min(o[0].point.y, minY); //类似vr校准地面,取最低就行。为了防止某个方向被家具遮挡
  62910. });
  62911. if (box.btmPosOri.y - minY > 0.01) {
  62912. //如果中心线没有intersect到地板,而到其他家具上了
  62913. var O = box.pano.position;
  62914. var r = (O.y - minY) / (O.y - box.btmPosOri.y);
  62915. var OA = new THREE.Vector3().subVectors(box.btmPosOri, O);
  62916. var OP = OA.multiplyScalar(r); //延长到地板
  62917. box.btmPosOri = new THREE.Vector3().addVectors(O, OP); //新终点
  62918. }
  62919. box.btmPosOri.y = minY; //边缘位置
  62920. //如果三个点都不在地板怎么办?
  62921. box.pose = getBoxPoseByPos(box, box.btmPosOri); //立即用边缘位置获取方向
  62922. var depth = 0; //缩进 //let depth = Math.abs(o[0].face.normal.y) > 0.9 ? 0.4 : -0.4
  62923. getBoxType(box);
  62924. var dir2d = new THREE.Vector2(box.centerBtmDir.x, box.centerBtmDir.z).normalize();
  62925. var shrinkVec;
  62926. if (standards[box.boxType].thick && (box.pose.predict)) {
  62927. //平贴于墙上,且厚度和宽度相差较大
  62928. //注:air-hanging主要用的是posAtWall
  62929. /* if(box.sid.includes('pano4-0') ){
  62930. console.log(1)
  62931. } */
  62932. var _standards$box$boxTyp2 = standards[box.boxType].widthNormal,
  62933. min = _standards$box$boxTyp2.min,
  62934. max = _standards$box$boxTyp2.max;
  62935. min = min * 0.24;
  62936. max = max * 0.4;
  62937. if (box.pose.predict && !box.xProp) {
  62938. box.xProp = box.pose.predict.x >= box.pose.predict.y ? 'width' : 'thick';
  62939. box.yProp = box.pose.predict.x < box.pose.predict.y ? 'width' : 'thick';
  62940. } else {
  62941. if (!box.xProp) ;
  62942. }
  62943. if (box.xProp) {
  62944. if (box.xProp == 'width') {
  62945. depth = math$2.linearClamp(Math.abs(dir2d.x), 0, 1, min, max);
  62946. } else {
  62947. depth = math$2.linearClamp(Math.abs(dir2d.y), 0, 1, min, max);
  62948. }
  62949. }
  62950. } else {
  62951. var w = standards[box.boxType].thick || standards[box.boxType].widthNormal;
  62952. var w0 = (w.min + w.max) / 2;
  62953. var _min = w0 * 0.5,
  62954. _max = w0 * 0.8;
  62955. var minA = Math.min(Math.abs(box.centerBtmDir.x), Math.abs(box.centerBtmDir.z));
  62956. depth = math$2.linearClamp(minA, 0, 0.707, _min
  62957. /* 0.3 */
  62958. , _max
  62959. /* 0.5 */
  62960. ); //在45度时需要最长的距离。主要针对cabinet
  62961. }
  62962. /* if (Math.abs(o[0].face.normal.y) < 0.9) {
  62963. if (standards[box.boxType].atWall || minY - groundY > 0.3) {
  62964. //battery的识别框比较乱,有可能一个电池被识别出好几个,所以
  62965. depth *= -1 //at wall
  62966. }
  62967. } */
  62968. if (!shrinkVec) {
  62969. shrinkVec = dir2d.clone().multiplyScalar(depth);
  62970. }
  62971. box.btmPos = box.btmPosOri.clone();
  62972. box.btmPos.x += shrinkVec.x;
  62973. box.btmPos.z += shrinkVec.y; //addLabel(box.btmPos,'b_'+box.sid,{bgcolor:'#ff4399'})
  62974. }
  62975. info.btmPos = box.btmPos;
  62976. }
  62977. return info.btmPos;
  62978. };
  62979. var getIntersect2 = function getIntersect2(pano0Pos, dir0, pano1Pos, dir1) {
  62980. var pos0 = new THREE.Vector3().addVectors(pano0Pos, dir0);
  62981. var pos1 = new THREE.Vector3().addVectors(pano1Pos, dir1);
  62982. var o = math$2.getLineIntersect2({
  62983. A: pano0Pos.clone(),
  62984. B: pano1Pos.clone(),
  62985. p1: pos0,
  62986. p2: pos1,
  62987. dir0,
  62988. dir1
  62989. }); //不用getLineIntersect,因为这个针对热点写的,当无交点时选用的点不是想要的
  62990. if (!o.pos3d) {
  62991. console.error('getIntersect2 no result? ?');
  62992. }
  62993. return o;
  62994. };
  62995. var getBoxPos = function getBoxPos(info) {
  62996. var boxType = getBoxType(info);
  62997. var pos = info.preDealRes && info.preDealRes.position || info.center;
  62998. if (!pos && boxType) {
  62999. info.category && getOtherPos(info);
  63000. if (standards[boxType].atWall > 0.5 && standards[boxType].bottom) {
  63001. pos = info.posAtWall;
  63002. }
  63003. if (!pos) {
  63004. pos = info.btmPos || info.btmPosPredict || info.posAtWall;
  63005. }
  63006. }
  63007. /* if(!pos) {
  63008. console.log('getBoxPos failed ',info)
  63009. } */
  63010. return pos;
  63011. };
  63012. var isType = function isType(category, type) {
  63013. return type == category || typeNames[type] instanceof Array ? typeNames[type].includes(category) : typeNames[type] == category;
  63014. };
  63015. var getBoxType = function getBoxType(info) {
  63016. if (info.boxType) return info.boxType;
  63017. var category = info.category || info.box0.category;
  63018. if (category == 'rowBigBox') info.boxType = 'rowBigBox';else {
  63019. var type;
  63020. if (category == 'ac_switchboard') {
  63021. console.log(1);
  63022. }
  63023. for (var i in typeNames) {
  63024. /* if (i == category || typeNames[i] instanceof Array ? typeNames[i].includes(category) : typeNames[i] == category) {
  63025. type = i
  63026. break //type = typeNamesReverse[type]
  63027. } */
  63028. if (isType(category, i)) {
  63029. type = i;
  63030. break;
  63031. }
  63032. }
  63033. /* if(type == 'ac' || type == 'dc'){
  63034. type = 'electric' //合并
  63035. } */
  63036. info.boxType = type;
  63037. }
  63038. return info.boxType;
  63039. };
  63040. /* let getBoxType = info => {
  63041. let type = info.category || info.box0.category
  63042. if (type == 'air') {
  63043. let btm = info.btmPos || info.btmPos //btmPosAtWall
  63044. if (!btm) {
  63045. btm = getBoxBtm(info)
  63046. }
  63047. if (!btm) return
  63048. let center = info.posAtWall || (info.preDealRes && info.preDealRes.position) || info.center
  63049. const s = standards['air-hanging']
  63050. if (btm.y - groundY > s.bottom.min) {
  63051. let h0 = btm.y - groundY
  63052. let h1 = (modelBound.max.y - center.y) / (modelBound.max.y - modelBound.min.y)
  63053. let h2 = center.y - btm.y
  63054. let score = h0 * 2 - h1 * 3 - h2 * 3
  63055. if (score > 0) {
  63056. type = 'air-hanging'
  63057. }
  63058. //console.error( score, h0,h1,h2, info.sid||info.name)
  63059. } //注意:如果air被遮住底部,露出的部分只有一点,还是有可能被识别成air-hanging。只能希望
  63060. //console.error( type, info.sid||info.name)
  63061. }
  63062. if (info.box0) {
  63063. info.boxType = type
  63064. //info.box1 && (info.box1.type = type) //因为box0和box1不一定匹配,所以不能直接赋值
  63065. } else {
  63066. info.type = type
  63067. }
  63068. } */
  63069. var getPanosDir = function getPanosDir(info, center) {
  63070. center = center || getBoxPos(info);
  63071. var dirs = {
  63072. 'x+': 0,
  63073. 'x-': 0,
  63074. 'z+': 0,
  63075. 'z-': 0,
  63076. got: false
  63077. };
  63078. var getDirs = function getDirs() {
  63079. //靠墙的在它到墙之间是不会有漫游点的
  63080. if (dirs.got || !center) return;
  63081. player$c.model.panos.list.forEach(function (pano) {
  63082. var dir = new THREE.Vector3().subVectors(pano.position, center);
  63083. if (dir.x > 0) {
  63084. dirs['x+'] += dir.x;
  63085. } else {
  63086. dirs['x-'] += dir.x;
  63087. }
  63088. if (dir.z > 0) {
  63089. dirs['z+'] += dir.z;
  63090. } else {
  63091. dirs['z-'] += dir.z;
  63092. }
  63093. });
  63094. dirs.got = true;
  63095. };
  63096. getDirs();
  63097. if (info.panosDir) {
  63098. console.error('already has dir');
  63099. }
  63100. info.panosDir = dirs;
  63101. return dirs;
  63102. };
  63103. var getBoxDirProp = function getBoxDirProp(info, force) {
  63104. return;
  63105. };
  63106. var preDealBox = function preDealBox(matchInfo) {
  63107. if (matchInfo.preDealRes || !matchInfo.center) return;
  63108. matchInfo.preDealRes = {};
  63109. matchInfo.boxType || getBoxType(matchInfo);
  63110. var config = standards[matchInfo.boxType];
  63111. config.widthNormal.min;
  63112. var needGetPose;
  63113. var dis = safeBound.distanceToPoint(matchInfo.center);
  63114. if (matchInfo.name == 'pano2-5') {
  63115. console.log(4);
  63116. }
  63117. if (dis > 0.3 && !config.tiny && !config.tinyXZ) {
  63118. //Tmo1vLp9Q13: hlkcWindow超出才准确
  63119. //tiny的位置优先级高于bound,因为他们可以确定bound
  63120. /* matchInfo.str && matchInfo.str.includes('outsideBound') */
  63121. //const shrink = minWidth * 0.85
  63122. //addLabel(matchInfo.center, '原')
  63123. var finalPos = matchInfo.center.clone().clamp(safeBound.min, safeBound.max);
  63124. matchInfo.preDealRes.position = finalPos; //addLabel(finalPos, 'finalPos')
  63125. getBoxType(matchInfo);
  63126. needGetPose = true;
  63127. }
  63128. var center = getBoxPos(matchInfo);
  63129. if (needGetPose || !matchInfo.boxposes) {
  63130. matchInfo.boxposes = [];
  63131. [matchInfo.box0, matchInfo.box1].forEach(function (box) {
  63132. box && matchInfo.boxposes.push(getBoxPoseByPos(box, center));
  63133. });
  63134. } //-----------------
  63135. };
  63136. var getBoxPoseByPos = function getBoxPoseByPos(box, centerPos) {
  63137. var addDis = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
  63138. //当得知box的大概位置时,求box在这个角度上的宽度、朝向
  63139. //在这个方向看的box的宽度
  63140. var config = standards[box.boxType];
  63141. var angle = getBbox2Diff(box.bbox2[2], box.bbox2[0]) * Math.PI; //角度的一半
  63142. var dis = new THREE.Vector3().subVectors(box.pano.position, centerPos).setY(0).length() + addDis;
  63143. var projectWidth = 2 * Math.tan(angle) * dis; //投影宽度 (准确的投影宽度无法求得,只能近似)
  63144. var camDir =
  63145. /* new THREE.Vector2(centerPos.x-box.pano.position.x, centerPos.z-box.pano.position.z).normalize() */
  63146. box.centerDir.clone().setY(0).normalize();
  63147. var camTangent = math$2.getNormal({
  63148. points: [{
  63149. x: 0,
  63150. y: 0
  63151. },
  63152. /* camDir */
  63153. {
  63154. x: camDir.x,
  63155. y: camDir.z
  63156. }]
  63157. }); //视线切线方向
  63158. camTangent.x = Math.abs(camTangent.x);
  63159. camTangent.y = Math.abs(camTangent.y);
  63160. if (box.sid == 'pano27-0') {
  63161. console.log(7);
  63162. }
  63163. var maxWidth = config.widthNormal.max;
  63164. var minWidth = config.widthNormal.min;
  63165. var minProjectWidth; //= (camTangent.x + camTangent.y) * minWidth
  63166. var maxProjectWidth; //= (camTangent.x + camTangent.y) * maxWidth
  63167. var maxX, maxY, minX, minY; //获取该类型standard在该角度的长宽可能范围
  63168. var predict;
  63169. if (!standards[box.boxType].thick) {
  63170. minProjectWidth = (camTangent.x + camTangent.y) * minWidth;
  63171. maxProjectWidth = (camTangent.x + camTangent.y) * maxWidth; //该角度下该类型允许的最大投影距离
  63172. maxX = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最大值(假设y为最小值)
  63173. maxY = THREE.MathUtils.clamp((projectWidth - minWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最大值(假设x为最小值)
  63174. minX = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.y) / camTangent.x, minWidth, maxWidth); //可得x的最小值(假设y为最大值)
  63175. minY = THREE.MathUtils.clamp((projectWidth - maxWidth * camTangent.x) / camTangent.y, minWidth, maxWidth); //可得y的最小值(假设x为最大值)
  63176. } else {
  63177. var minThick_ = config.thick.min;
  63178. var minWidth_ = config.width.min;
  63179. var maxThick_ = config.thick.max;
  63180. var maxWidth_ = config.width.max;
  63181. var maxTangent = Math.max(camTangent.x, camTangent.y);
  63182. Math.min(camTangent.x, camTangent.y);
  63183. if (maxTangent > 0.8) {
  63184. predict = {};
  63185. var axiss = ['x', 'y'];
  63186. var axis = camTangent.x > camTangent.y ? 0 : 1;
  63187. var sideWidth = THREE.MathUtils.clamp(projectWidth, minThick_, maxWidth_); //若该边占据全部视野
  63188. var r = (sideWidth - minThick_) / (maxWidth_ - minThick_); //占比
  63189. //就当靠近一边,看不到另一边
  63190. var anotherWidth = math$2.linearClamp(1 - r, 0, 1, minThick_, maxWidth_); //如果这边能确定是长还是宽,另一边也能确定(注意:长和宽的范围可能重叠)
  63191. if (sideWidth < maxThick_ && sideWidth < minWidth_) anotherWidth = Math.max(minWidth_, anotherWidth); //确定另一边只能是长
  63192. else if (sideWidth > minWidth_ && sideWidth > maxThick_) anotherWidth = Math.min(maxThick_, anotherWidth); //确定另一边只能是宽
  63193. predict[axiss[axis]] = sideWidth;
  63194. predict[axiss[(axis + 1) % 2]] = anotherWidth;
  63195. }
  63196. var maxProjectWidth1 = camTangent.x * maxWidth_ + camTangent.y * maxThick_;
  63197. var maxProjectWidth2 = camTangent.x * maxThick_ + camTangent.y * maxWidth_;
  63198. var minProjectWidth1 = camTangent.x * minWidth_ + camTangent.y * minThick_;
  63199. var minProjectWidth2 = camTangent.x * minThick_ + camTangent.y * minWidth_;
  63200. minProjectWidth = Math.min(minProjectWidth1, minProjectWidth2);
  63201. maxProjectWidth = Math.max(maxProjectWidth1, maxProjectWidth2);
  63202. (camTangent.x + camTangent.y) * maxWidth; //console.log('diffaaaaaa',maxProjectWidth,a, box.sid)
  63203. maxX = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.y) / camTangent.x, minThick_, maxWidth_); //可得x的最大值(假设y为最小值)
  63204. maxY = THREE.MathUtils.clamp((projectWidth - minThick_ * camTangent.x) / camTangent.y, minThick_, maxWidth_); //可得y的最大值(假设x为最小值)
  63205. minX = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.y) / camTangent.x, minThick_, maxWidth_);
  63206. minY = THREE.MathUtils.clamp((projectWidth - maxWidth_ * camTangent.x) / camTangent.y, minThick_, maxWidth_);
  63207. }
  63208. /*
  63209. let maxX = projectWidth / camTangent.x //可得x的最大值(假设y为0)
  63210. let maxY = projectWidth / camTangent.y //可得y的最大值(假设x为0)
  63211. */
  63212. //判断方向
  63213. var o = {
  63214. predict,
  63215. box,
  63216. projectWidth,
  63217. camTangent,
  63218. maxProjectWidth,
  63219. minProjectWidth,
  63220. dis,
  63221. maxX,
  63222. maxY,
  63223. minX,
  63224. minY
  63225. };
  63226. if (config.atWall > 0 && !fineModelLevel
  63227. /* isType(box.category,battery) || isType(box.category,air) */
  63228. ) {
  63229. //为了获取朝向
  63230. o.xWidthPossible = -Math.abs(projectWidth - camTangent.x * maxWidth - camTangent.y * minWidth);
  63231. o.yWidthPossible = -Math.abs(projectWidth - camTangent.x * minWidth - camTangent.y * maxWidth); //在接近45度时容易不准。另外如果被遮住一部分更会错,因此尽量不让被遮住的匹配
  63232. }
  63233. return o;
  63234. };
  63235. var getPoseScore = function getPoseScore(boxposes, boxType) {
  63236. var score = 0;
  63237. var minDis = 1.5;
  63238. /* if (boxposes[0].box.sid == 'pano12-13' && boxposes[1].box.sid == 'pano8-6') {
  63239. console.log(4)
  63240. } */
  63241. if (boxposes.length == 2 && boxposes[0].predict && boxposes[1].predict) {
  63242. score = Math.abs(boxposes[0].predict.x - boxposes[1].predict.x) + Math.abs(boxposes[0].predict.y - boxposes[1].predict.y);
  63243. return -score * 100;
  63244. }
  63245. boxposes.forEach(function (pose) {
  63246. //pose.lowR = pose.dis < minDis ? Math.pow(THREE.MathUtils.smoothstep(pose.dis / minDis, 0, 1),2) : 1 //太近的话误差大
  63247. pose.lowR = pose.dis < minDis ? Math.pow(pose.dis / minDis, 1.4) : 1; //太近的话误差大
  63248. if (pose.projectWidth > pose.maxProjectWidth) {
  63249. score += Math.pow((pose.projectWidth / pose.maxProjectWidth - 1) * pose.lowR, 2) * 500; //超过的话数字较大所以乘的数小一些
  63250. } else if (
  63251. /* isSingle && */
  63252. pose.projectWidth < pose.minProjectWidth) {
  63253. score += Math.pow((pose.minProjectWidth / pose.projectWidth - 1) * pose.lowR, 2) * 500;
  63254. }
  63255. var _standards$boxType$wi = standards[boxType].widthNormal,
  63256. min = _standards$boxType$wi.min;
  63257. _standards$boxType$wi.max;
  63258. if (standards[boxType].atWall == 1 && min < 0.3 || boxposes.length == 2 && boxType == 'battery') {
  63259. var _standards$boxType$wi2 = standards[boxType].widthNormal,
  63260. _min2 = _standards$boxType$wi2.min,
  63261. _max2 = _standards$boxType$wi2.max; //let r = Math.max(0.001, (pose.projectWidth - min) / (max - min))
  63262. var diff = _max2 - _min2;
  63263. var r = math$2.linearClamp(pose.projectWidth, _min2, _min2 + diff * 0.5, 600, 0);
  63264. score += r;
  63265. }
  63266. });
  63267. score = Math.min(score, 1300); //压低一点,因为得的宽度可能不准
  63268. if (boxposes.length == 2) {
  63269. //每一个方向对应有四个方向(每个象限一个)看到的projectWidth应该接近。
  63270. //先把camTangent转化为第一个象限的
  63271. var camTangent0 = new THREE.Vector2(Math.abs(boxposes[0].camTangent.x), Math.abs(boxposes[0].camTangent.y));
  63272. var camTangent1 = new THREE.Vector2(Math.abs(boxposes[1].camTangent.x), Math.abs(boxposes[1].camTangent.y));
  63273. var a = camTangent0.dot(camTangent1);
  63274. if (a > 0.8) {
  63275. //WcLVXvmV9AU
  63276. //0.9: 25度之内. 0.8: 36.8度之内
  63277. var diff = Math.abs(boxposes[0].projectWidth - boxposes[1].projectWidth);
  63278. boxposes.score2 = a * diff * 1300 * boxposes[0].lowR * boxposes[1].lowR;
  63279. score += boxposes.score2; //console.warn('在同一个方向看到的projectWidth应该接近。 ', diff)
  63280. }
  63281. boxposes.camTangentCos = a;
  63282. } //要不要加上minX等的差距?
  63283. score = Math.min(score, 1200);
  63284. return -score;
  63285. };
  63286. var getBoxSize = function getBoxSize(info) {
  63287. if (info.size) return; //console.warn('开始算 ' + info.name)
  63288. var exStr = '',
  63289. warnStr = '';
  63290. var x, y; //求对角线的向量 x>0,y>0
  63291. //假设盒子的长宽为x,y (x>0,y>0),视线切线单位向量为(k,m),投影距离:x'k+y'm.(x'是正负x,y'是正负y)
  63292. //由于盒子的对角线有四个可选方向,(类似四个象限) 则需要能使投影距离最长的一个对角线向量。
  63293. //如,当k<0,m>0时,要使xk+ym 最大,必有x<0,y>0. 故 x = -x', y = y', 故 投影距离:x'k+y'm = x(-k)+ym 。
  63294. //故无论km的符号如何,只要变为正数,再去联立方程即可得xy。(相当于切线转到第一象限)
  63295. //注:但是因为无法获取准确的投影距离(角平分线左右两边的端点到角平分线的距离不相等,垂足也无法确定),所以所算的误差非常大。
  63296. if (info.name == 'pano6-0&pano5-0') {
  63297. console.log(6);
  63298. }
  63299. var center = getBoxPos(info);
  63300. var oriX, oriY;
  63301. if (info.predictSize) {
  63302. x = oriX = info.predictSize.x, y = oriY = info.predictSize.y;
  63303. } else {
  63304. var getOneBoxSize = function getOneBoxSize(box) {
  63305. var x, y;
  63306. var widthValue = standards[info.boxType].width;
  63307. var thickValue = standards[info.boxType].thick;
  63308. var maxX, maxY, minX, minY;
  63309. if (info.xProp == 'width') {
  63310. /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max)
  63311. y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max)
  63312. */
  63313. maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, widthValue.min, widthValue.max); //AG0bi2fhb3 需要将得到的minX等这四项都clamp后再平均
  63314. maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, thickValue.min, thickValue.max);
  63315. minX = THREE.MathUtils.clamp(info.boxposes[0].minX, widthValue.min, widthValue.max);
  63316. minY = THREE.MathUtils.clamp(info.boxposes[0].minY, thickValue.min, thickValue.max);
  63317. } else {
  63318. /* x = oriX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max)
  63319. y = oriY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max)
  63320. */
  63321. maxX = THREE.MathUtils.clamp(info.boxposes[0].maxX, thickValue.min, thickValue.max);
  63322. maxY = THREE.MathUtils.clamp(info.boxposes[0].maxY, widthValue.min, widthValue.max);
  63323. minX = THREE.MathUtils.clamp(info.boxposes[0].minX, thickValue.min, thickValue.max);
  63324. minY = THREE.MathUtils.clamp(info.boxposes[0].minY, widthValue.min, widthValue.max);
  63325. }
  63326. x = oriX = (maxX + minX) / 2;
  63327. y = oriY = (maxY + minY) / 2;
  63328. return {
  63329. x,
  63330. y
  63331. };
  63332. };
  63333. if (info.box1) {
  63334. if (info.box0.xProp && info.box0.xProp == info.box1.xProp) {
  63335. info.xProp = info.box0.xProp;
  63336. info.yProp = info.box0.yProp;
  63337. var size0 = getOneBoxSize(info.box0),
  63338. size1 = getOneBoxSize(info.box1);
  63339. x = (size0.x + size1.x) / 2;
  63340. y = (size0.y + size1.y) / 2;
  63341. } else {
  63342. //这算的很不准,因为二维框的中心方向本就不一定指向三维的中心点
  63343. var x1 = info.boxposes[0].camTangent.x,
  63344. x2 = info.boxposes[1].camTangent.x,
  63345. y1 = info.boxposes[0].camTangent.y,
  63346. y2 = info.boxposes[1].camTangent.y,
  63347. w1 =
  63348. /* info.boxposes[0].projectWidth, */
  63349. THREE.MathUtils.clamp(info.boxposes[0].projectWidth, info.boxposes[0].minProjectWidth, info.boxposes[0].maxProjectWidth * 1.1),
  63350. //校准。如果projectwidth不准那算出来更不准. 但XswQxwmn2ZC的里侧电池是前者更准
  63351. w2 =
  63352. /* info.boxposes[1].projectWidth */
  63353. THREE.MathUtils.clamp(info.boxposes[1].projectWidth, info.boxposes[1].minProjectWidth, info.boxposes[1].maxProjectWidth * 1.1); //如果识别到柜门上,(柜体被遮住了),整体中心就会在柜门上,且厚度小于真实值。
  63354. if (x1 == 0) {
  63355. y = w1;
  63356. x = (w2 - y2 * y) / x2;
  63357. } else {
  63358. //联立方程得:
  63359. y = (w2 - x2 / x1 * w1) / (y2 - x2 / x1 * y1);
  63360. x = (w1 - y1 * y) / x1;
  63361. } //console.log('xy', { x, y })
  63362. (x < 0.3 || x > 1.4) && (exStr += ' x:' + math$2.toPrecision(x, 2));
  63363. (y < 0.3 || y > 1.4) && (exStr += ' y:' + math$2.toPrecision(y, 2));
  63364. if (y < 0 || x < 0) {
  63365. //console.log('<0 ?????????')
  63366. warnStr = x < 0 ? 'x<0!' : 'y<0!';
  63367. }
  63368. oriX = x, oriY = y;
  63369. }
  63370. } else {
  63371. //single pano data
  63372. //将maxX maxY 限定在标准范围内
  63373. if (info.xProp) {
  63374. var size = getOneBoxSize(info);
  63375. x = size.x, y = size.y;
  63376. } else if (info.boxposes[0].predict) {
  63377. x = info.boxposes[0].predict.x;
  63378. y = info.boxposes[0].predict.y;
  63379. } else {
  63380. //x = oriX = y = oriY = (min+max)/2
  63381. var standard = standards[info.boxType].widthNormal;
  63382. x = oriX = THREE.MathUtils.clamp((info.boxposes[0].maxX + info.boxposes[0].minX) / 2, standard.min, standard.max);
  63383. y = oriY = THREE.MathUtils.clamp((info.boxposes[0].maxY + info.boxposes[0].minY) / 2, standard.min, standard.max);
  63384. }
  63385. } //按正常来说,得到的x,y都应>0,但是由于箱子会被遮挡,导致投影宽度比真实的小,算出的也不准,可能是负数
  63386. //所以手动将过小的宽度矫正
  63387. }
  63388. /* if(info.name == "pano2-6"){
  63389. console.log(7)
  63390. } */
  63391. var height;
  63392. if (standards[info.boxType].bottom) {
  63393. //悬挂的
  63394. //挂式空调最好把长宽固定。 不过极少出错
  63395. //center.y -= 0.1 //很可能过高
  63396. height = standards[info.boxType].height.standard;
  63397. getBoxBtm(info);
  63398. if (height) {
  63399. var d = center.y - info.btmPos.y;
  63400. center.y -= THREE.MathUtils.clamp((d - height / 2) / 2, -0.1, 0.1); //如果中心点到底部的距离和height的一半不同,中心点移动差值的一半
  63401. } else {
  63402. var btmY = info.btmPos.y;
  63403. height = (center.y - btmY) * 2;
  63404. }
  63405. } else {
  63406. if (!info.topPos) getBoxTop(info);
  63407. if (!info.btmPos) getBoxBtm(info);
  63408. var groundY_ = info.btmPos.y ;
  63409. height = info.topPos.y - groundY_;
  63410. }
  63411. var o = restrictSize(x, height, y, info);
  63412. x = o.x, height = o.y, y = o.z;
  63413. if (standards[info.boxType].widthSame) {
  63414. x = y = (x + y) / 2;
  63415. }
  63416. info.size = new THREE.Vector3(x, height, y);
  63417. info.sizeAdjust = Math.pow(Math.abs(x - oriX), 1.3) + Math.pow(Math.abs(y - oriY), 1.3); //计算得到的值和标准值之间的差距,可以反映该info的匹配分值
  63418. if (info.sizeAdjust) info.score = (info.score || 0) - Math.min(info.sizeAdjust * 100, 400);
  63419. info.size.oriX = oriX, info.size.oriY = oriY;
  63420. info.exStr = exStr, info.warnStr = warnStr;
  63421. };
  63422. var restrictSize = function restrictSize(x, y, z, info) {
  63423. var s;
  63424. var xProp = info.xProp,
  63425. yProp = info.yProp;
  63426. if (xProp != void 0) {
  63427. var _standards$info$boxTy = standards[info.boxType][xProp],
  63428. min = _standards$info$boxTy.min,
  63429. max = _standards$info$boxTy.max;
  63430. x = THREE.MathUtils.clamp(x, min, max);
  63431. var _standards$info$boxTy2 = standards[info.boxType][yProp],
  63432. min = _standards$info$boxTy2.min,
  63433. max = _standards$info$boxTy2.max;
  63434. z = THREE.MathUtils.clamp(z, min, max);
  63435. s = true;
  63436. }
  63437. if (!s) {
  63438. var _standards$info$boxTy3 = standards[info.boxType].widthNormal,
  63439. min = _standards$info$boxTy3.min,
  63440. max = _standards$info$boxTy3.max;
  63441. x = THREE.MathUtils.clamp(x, min, max);
  63442. z = THREE.MathUtils.clamp(z, min, max);
  63443. }
  63444. var _standards$info$boxTy4 = standards[info.boxType].height,
  63445. min = _standards$info$boxTy4.min,
  63446. max = _standards$info$boxTy4.max;
  63447. y = THREE.MathUtils.clamp(y, min, max);
  63448. return {
  63449. x,
  63450. y,
  63451. z
  63452. };
  63453. };
  63454. var getMixBox = function getMixBox(box0, box1) {
  63455. //重叠部分
  63456. var box = new THREE.Box2();
  63457. box.min.set(Math.max(box0.min.x, box1.min.x), Math.max(box0.min.y, box1.min.y));
  63458. box.max.set(Math.min(box0.max.x, box1.max.x), Math.min(box0.max.y, box1.max.y));
  63459. return box;
  63460. };
  63461. var getLeftRight = function getLeftRight(boxArr) {
  63462. //获取pano的boxes中最左和最右的bbox.x
  63463. var lefts = boxArr.map(function (e) {
  63464. return e.bbox2[0];
  63465. });
  63466. var rights = boxArr.map(function (e) {
  63467. return e.bbox2[2];
  63468. });
  63469. lefts.sort(function (a, b) {
  63470. return getBbox2Diff(a, b);
  63471. });
  63472. rights.sort(function (a, b) {
  63473. return getBbox2Diff(b, a);
  63474. });
  63475. var leftX = lefts[0]; //最左
  63476. var rightX = rights[0]; //最右
  63477. return {
  63478. leftX,
  63479. rightX
  63480. };
  63481. };
  63482. global$1.searchCount1 = 0, global$1.escapeCount1 = 0;
  63483. var searchPair = function searchPair(beginItem, group0_, group1_, parentPairs, resultPairs, evaluateFun, minScore) {
  63484. //配对结果个数为n!,其中n是每组的元素个数。注意当n=10时,已经有40320个,非常恐怖。
  63485. var pair = [],
  63486. parentExit = !!parentPairs;
  63487. var removeParent = function removeParent() {
  63488. //元结点裂变出多个,来装新的pair
  63489. if (parentExit) {
  63490. var i = resultPairs.indexOf(parentPairs);
  63491. resultPairs.splice(i, 1);
  63492. parentExit = false;
  63493. }
  63494. };
  63495. if (!parentPairs) {
  63496. //首次
  63497. if (group0_.length == 0 || group1_.length == 0) return; //保证第一个的个数<=第二个,否则第一组多出来的永远匹配不上
  63498. if (group0_.length > group1_.length) {
  63499. var t = group0_;
  63500. group0_ = group1_;
  63501. group1_ = t;
  63502. }
  63503. beginItem = group0_[0];
  63504. var complex = Object.keys(global$1.aiBox.datas).length;
  63505. if (complex < 10) evaluateFun = null;else minScore = math$2.linearClamp(complex, 10, 80, -4000, -500); //console.log('searchPair length',group0_.length,group1_.length)
  63506. }
  63507. searchCount1++;
  63508. for (var j = 0; j < group1_.length; j++) {
  63509. pair = [beginItem, group1_[j]]; //if(pair[0].sid == 'void' || pair[1].sid == 'void')continue
  63510. var evaluate = void 0;
  63511. if (evaluateFun
  63512. /* && !(pair[0].sid == 'void' || pair[1].sid == 'void') */
  63513. ) {
  63514. evaluate = evaluateFun(pair[0], pair[1]);
  63515. if (evaluate == void 0 || evaluate.score <= minScore) {
  63516. //console.log('因为评估出匹配可能性低所以跳过',pair[0],pair[1],evaluate)
  63517. escapeCount1++;
  63518. continue;
  63519. }
  63520. }
  63521. var newPairs = void 0; //用来存放该组pair
  63522. if (parentPairs) {
  63523. removeParent();
  63524. newPairs = parentPairs.slice(0); //复制
  63525. newPairs.push(pair);
  63526. } else {
  63527. newPairs = [pair]; //新的容器
  63528. }
  63529. resultPairs.push(newPairs);
  63530. var newGroup0 = group0_.slice(0);
  63531. var newGroup1 = group1_.slice(0);
  63532. var index = newGroup0.indexOf(pair[0]);
  63533. newGroup0.splice(index, 1);
  63534. index = newGroup1.indexOf(pair[1]);
  63535. newGroup1.splice(index, 1);
  63536. if (newGroup0.length > 0 && newGroup1.length > 0) {
  63537. searchPair(newGroup0[0], newGroup0, newGroup1, newPairs, resultPairs, evaluateFun, minScore);
  63538. }
  63539. }
  63540. }; //如果第一个元素就和后面所有的都不匹配,就直接返回了怎么办?
  63541. /*#__PURE__*/(function (_THREE$Group) {
  63542. _inherits(PanoBoxFrame, _THREE$Group);
  63543. var _super = _createSuper$E(PanoBoxFrame);
  63544. function PanoBoxFrame(player_) {
  63545. var _this4;
  63546. var compute = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  63547. var showBox = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  63548. var dataList = arguments.length > 3 ? arguments[3] : undefined;
  63549. _classCallCheck(this, PanoBoxFrame);
  63550. _this4 = _super.call(this);
  63551. _this4.clear();
  63552. player$c = player_;
  63553. player$c.model.add(_assertThisInitialized(_this4));
  63554. if (browser$1.urlHasValue('ext')) {
  63555. isExt = true;
  63556. isDiwei = isExt && !browser$1.urlHasValue('ctrl');
  63557. }
  63558. _this4.ifAnalyze = true; //ifAnalyze
  63559. _this4.wireframes = new THREE.Object3D();
  63560. _this4.wireframes.name = 'wireframes';
  63561. _this4.add(_this4.wireframes);
  63562. _this4.matchScoreMap = {};
  63563. _this4.bindEvents();
  63564. meshGroup = new THREE.Object3D();
  63565. meshGroup.name = 'testBox';
  63566. _this4.add(meshGroup);
  63567. _this4.visiInfos = {};
  63568. compute && _this4.compute(dataList);
  63569. global$1.aiBox = _assertThisInitialized(_this4);
  63570. if (!showBox) {
  63571. _this4.switchOnOff(false);
  63572. }
  63573. return _this4;
  63574. }
  63575. _createClass(PanoBoxFrame, [{
  63576. key: "switchOnOff",
  63577. value: function () {
  63578. var _switchOnOff = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(display) {
  63579. return regenerator.wrap(function _callee$(_context) {
  63580. while (1) {
  63581. switch (_context.prev = _context.next) {
  63582. case 0:
  63583. //开关
  63584. console.log('switchOnOff', display);
  63585. if (!(!this.startToCompute && display)) {
  63586. _context.next = 4;
  63587. break;
  63588. }
  63589. _context.next = 4;
  63590. return this.compute();
  63591. case 4:
  63592. common$1.updateVisible(this, 'whole', display); //this.boxesSolid.forEach(e => e.updateVisible(display, 'whole'))
  63593. case 5:
  63594. case "end":
  63595. return _context.stop();
  63596. }
  63597. }
  63598. }, _callee, this);
  63599. }));
  63600. function switchOnOff(_x) {
  63601. return _switchOnOff.apply(this, arguments);
  63602. }
  63603. return switchOnOff;
  63604. }()
  63605. /* setDisplay(visible, reason='whole', level=0){
  63606. common.updateVisible(this, reason, visible, level)
  63607. } */
  63608. }, {
  63609. key: "compute",
  63610. value: function () {
  63611. var _compute = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee4(dataList) {
  63612. var _this5 = this;
  63613. var beginCompute, done, loadAll, _loadAll;
  63614. return regenerator.wrap(function _callee4$(_context4) {
  63615. while (1) {
  63616. switch (_context4.prev = _context4.next) {
  63617. case 0:
  63618. _loadAll = function _loadAll3() {
  63619. _loadAll = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {
  63620. var _this7 = this;
  63621. var data, aiBoxUrl, box4;
  63622. return regenerator.wrap(function _callee3$(_context3) {
  63623. while (1) {
  63624. switch (_context3.prev = _context3.next) {
  63625. case 0:
  63626. if (!(player$c.$app.config.deploy == 'local' && !player$c.$app.config.server)) {
  63627. _context3.next = 7;
  63628. break;
  63629. }
  63630. _context3.next = 3;
  63631. return http.get(player$c.$app.resource.getViewResourceURL("images/ai.json?".concat(new Date().getTime())));
  63632. case 3:
  63633. data = _context3.sent;
  63634. data = {
  63635. data,
  63636. success: true
  63637. };
  63638. _context3.next = 12;
  63639. break;
  63640. case 7:
  63641. aiBoxUrl = '/service/shapes/sceneMarkShape/box4/getInfos';
  63642. if (player$c.$app.config.deploy == 'local') {
  63643. aiBoxUrl = '/service/scene/edit/ai/box4/getInfos';
  63644. }
  63645. _context3.next = 11;
  63646. return http.post(aiBoxUrl, {
  63647. num: player$c.$app.config.num,
  63648. type: 1
  63649. });
  63650. case 11:
  63651. data = _context3.sent;
  63652. case 12:
  63653. if (!(!data.data || !data.success)) {
  63654. _context3.next = 14;
  63655. break;
  63656. }
  63657. return _context3.abrupt("return");
  63658. case 14:
  63659. if (isExt) {
  63660. (data.data.box8.dataSet.boxes || data.data.box8.dataSet).forEach(function (e) {
  63661. // if (e.external && !e.external.show) {
  63662. // return
  63663. // }
  63664. // e.external = {
  63665. // eqpType: 'equipment_cabinet',
  63666. // eqpName: '送变电机房BATS_1',
  63667. // show: true,
  63668. // eqpId: '150035210000000000125288',
  63669. // url: 'http://120.194.14.251:40004/vr_3dWeb/deviceInfo?rackId=7a323f16-ac13-4434-bf97-c44d1783a217',
  63670. // }
  63671. var point1 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[0]));
  63672. var point2 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[1]));
  63673. var point3 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[2]));
  63674. var point4 = math$2.convertVisionVector(new THREE.Vector3().fromArray(e.points[4]));
  63675. var size = new THREE.Vector3(point1.distanceTo(point2), point1.y - point4.y, point3.distanceTo(point2));
  63676. var center = new THREE.Vector3().addVectors(point3, point4).multiplyScalar(0.5); //对角线中点
  63677. //可能需要考虑上rotation,现暂时不需要
  63678. new Box({
  63679. buildFromData: true,
  63680. center,
  63681. size,
  63682. boxType: e.type,
  63683. name: e.sid,
  63684. external: e.external
  63685. });
  63686. });
  63687. this.ifAnalyze = false; //common.updateVisible(this, '!isExt', false ) //这之前写的visible=false,忘了为啥,要的话就在开头show传false
  63688. }
  63689. if (!isExt || browser$1.urlHasValue('ctrl')) {
  63690. box4 = Array.isArray(data.data) ? data.data : data.data.box4; // 兼容旧数据
  63691. box4.forEach(function (e) {
  63692. var panoId = e.imagePath.split('.jpg')[0];
  63693. _this7.datas[panoId] = e;
  63694. }); //common.updateVisible(this, '!isExt', true )
  63695. }
  63696. done();
  63697. case 17:
  63698. case "end":
  63699. return _context3.stop();
  63700. }
  63701. }
  63702. }, _callee3, this);
  63703. }));
  63704. return _loadAll.apply(this, arguments);
  63705. };
  63706. loadAll = function _loadAll2() {
  63707. return _loadAll.apply(this, arguments);
  63708. };
  63709. startTime = Date.now();
  63710. this.startToCompute = true;
  63711. this.datas = {};
  63712. this.datasMixed = {};
  63713. this.boxesSolid = boxesSolid;
  63714. beginCompute = function beginCompute() {
  63715. //获取匹配分数
  63716. var getMatchScore = function getMatchScore(box0, box1) {
  63717. var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  63718. isSingle = _ref2.isSingle,
  63719. center = _ref2.center,
  63720. onlyGet = _ref2.onlyGet,
  63721. dontCheckDis = _ref2.dontCheckDis;
  63722. var name0 = box0.sid + '&' + box1.sid;
  63723. var name1 = box1.sid + '&' + box0.sid;
  63724. var boxType = getBoxType(box0);
  63725. var matchInfo0 = _this5.matchScoreMap[boxType].get(name0);
  63726. var matchInfo1 = _this5.matchScoreMap[boxType].get(name1);
  63727. var matchInfo = matchInfo0 || matchInfo1;
  63728. if (onlyGet) return matchInfo;
  63729. var name;
  63730. if (!matchInfo) {
  63731. name = name0;
  63732. matchInfo = {
  63733. name,
  63734. box0,
  63735. box1,
  63736. center
  63737. };
  63738. _this5.matchScoreMap[boxType].set(name, matchInfo);
  63739. } else {
  63740. return matchInfo;
  63741. }
  63742. if (name.includes('pano6-2&pano5-3')) {
  63743. console.log(5);
  63744. }
  63745. getBoxBase(box0);
  63746. getBoxBase(box1);
  63747. var A = box0.pano.position.clone();
  63748. var B = box1.pano.position.clone();
  63749. var AB = new THREE.Vector3().subVectors(B, A);
  63750. var AB2d = new THREE.Vector2(AB.x, AB.z).normalize();
  63751. 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();
  63752. 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();
  63753. var angleA = Math.acos(AB2d.dot(AP12d));
  63754. var angleB = Math.PI - Math.acos(AB2d.dot(BP22d));
  63755. var score = 100,
  63756. str = [];
  63757. if (angleA + angleB > Math.PI + 0.2) {
  63758. //无交点(比180大是因为中心角度有误差,所以给一定的容错)
  63759. //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因角度大于180度 不匹配`)
  63760. return Object.assign(matchInfo, {
  63761. score: -5000,
  63762. str: ['angle>180']
  63763. });
  63764. }
  63765. if (box0.type != box1.type) {
  63766. return Object.assign(matchInfo, {
  63767. score: -5000,
  63768. str: ['typeNotSame']
  63769. });
  63770. }
  63771. if (matchInfo.dirAngleXZ == void 0) {
  63772. matchInfo.dirAngleXZ = THREE.MathUtils.radToDeg(Math.acos(AP12d.dot(BP22d))); //需要尽量接近90度算出来的交点会比较准
  63773. matchInfo.minAng = Math.min(180 - matchInfo.dirAngleXZ, matchInfo.dirAngleXZ); //角度小的getIntersect2容易算不准
  63774. if (isSingle) {
  63775. var bestDisSquared = 2; //单个匹配单个,而非多个匹配多个(没有固定到两个漫游点),所以可以直接寻找最优角度
  63776. score += Math.sin(THREE.MathUtils.degToRad(matchInfo.dirAngleXZ)) * 300;
  63777. score += matchInfo.dirAngleXZ; //另外角度越大越不容易偏向一边
  63778. score -= Math.abs(getBoxPos(box0).distanceToSquared(box0.pano.position) - bestDisSquared) * 10;
  63779. score -= Math.abs(getBoxPos(box1).distanceToSquared(box1.pano.position) - bestDisSquared) * 10;
  63780. }
  63781. }
  63782. var shinkRatio = 1;
  63783. var btmPos0 = box0.btmPos || box0.btmPosPredict; //fire类型先用btmPosPredict,测定groundY后才有btmPos
  63784. var btmPos1 = box1.btmPos || box1.btmPosPredict;
  63785. if (!dontCheckDis) {
  63786. //let r = box0.boxType == 'air' ? 1 : box0.boxType == 'cabinet' ? 0.9 : 0.7 //随着宽度增加而降低
  63787. var r = THREE.MathUtils.clamp(0.8 / standards[boxType].widthNormal.max, 0.6, 2); //随着宽度增加而降低 UWrshepp0G5的fire
  63788. if (!standards[boxType].bottom && btmPos0 && btmPos1) {
  63789. //注:挂空调不应使用btmPosPredict
  63790. var d = btmPos0.distanceToSquared(btmPos1);
  63791. matchInfo.btmPosPreDis = d;
  63792. score -= d * 1300 * r * shinkRatio;
  63793. if (box1.topPos) {
  63794. var a = box0.topPos.distanceToSquared(box1.topPos);
  63795. matchInfo.topPosPreDis = a;
  63796. var u = a * 700 * r * shinkRatio;
  63797. var AP0 = new THREE.Vector2(btmPos0.x - A.x, btmPos0.z - A.z).lengthSq();
  63798. var AP1 = new THREE.Vector2(btmPos1.x - B.x, btmPos1.z - B.z).lengthSq();
  63799. if (AP0 < 0.4 || AP1 < 0.4) u *= 0.3; //太近
  63800. score -= u;
  63801. }
  63802. } else if (box0.posAtWall && box1.posAtWall) {
  63803. //
  63804. var _d = box0.posAtWall.distanceToSquared(box1.posAtWall);
  63805. matchInfo.wallPosPreDis = _d;
  63806. score -= _d * 200 * r; //墙面不准所以分低 ftMTQIrs79
  63807. _d = box0.btmPosOri.distanceToSquared(box1.btmPosOri); //还是加一下
  63808. matchInfo.btmPosPreDis = _d;
  63809. score -= _d * 200 * r * shinkRatio;
  63810. /* let h0 = box0.topPos.y - box0.btmPos.y
  63811. let h1 = box1.topPos.y - box1.btmPos.y
  63812. score -= Math.abs(h0-h1) * 3000 * r * shinkRatio //高度差 倾斜角度大的不准
  63813. */
  63814. }
  63815. }
  63816. if (!matchInfo.center) {
  63817. var o = getIntersect2(A, box0.centerDir, B, box1.centerDir);
  63818. matchInfo.center = o.pos3d.clone();
  63819. /* let o2 = math.getLineIntersect({ A, B, p1: A.clone().add(box0.centerDir), p2:B.clone().add(box1.centerDir) })
  63820. matchInfo.center2 = o2.pos3d.clone() */
  63821. /* if (name == "pano16-4&pano18-5") {
  63822. addLine(A, box0.centerBtmDir, 10), addLine(B, box1.centerBtmDir, 10)
  63823. } */
  63824. //验证是否漫游点到中心点的方向和centerDir一样
  63825. var dir0 = new THREE.Vector3().subVectors(o.pos3d, A).normalize();
  63826. var dir1 = new THREE.Vector3().subVectors(o.pos3d, B).normalize();
  63827. var sum = dir0.dot(box0.centerDir) + dir1.dot(box1.centerDir);
  63828. var wrongDir = sum < 1.95;
  63829. score -= (2 - sum) * 10000;
  63830. if (wrongDir) {
  63831. str.push('wrongDir');
  63832. return Object.assign(matchInfo, {
  63833. score: score - 5000,
  63834. str
  63835. });
  63836. }
  63837. if (!dontCheckDis && !standards[boxType].bottom && box0.btmPos && box1.btmPos) {
  63838. //墙壁位置不准所以不用 KK-ftMTQIrs79
  63839. var p0 = new THREE.Vector2(box0.btmPos.x, box0.btmPos.z);
  63840. var p1 = new THREE.Vector2(box1.btmPos.x, box1.btmPos.z);
  63841. var p = new THREE.Vector2(matchInfo.center.x, matchInfo.center.z);
  63842. var dis = p0.distanceToSquared(p) + p1.distanceToSquared(p);
  63843. var s = math$2.linearClamp(matchInfo.minAng, 0, 20, 0, 1);
  63844. score -= dis * 1500 * s; //如果距离较远就说明算的center误差大,不可信。可能有一个框不准确
  63845. matchInfo.centerDrift = dis;
  63846. }
  63847. getBoxBtm(matchInfo);
  63848. var cr; //getIntersect2结果的权重
  63849. var atWall = standards[box0.boxType].atWall;
  63850. if (atWall) {
  63851. //fineModelLevel更多利用墙壁
  63852. cr = math$2.linearClamp(matchInfo.minAng, 2, 15, 0, Math.min(1, 0.1 / atWall));
  63853. } else {
  63854. if (atWall == 1) {
  63855. cr = math$2.linearClamp(matchInfo.minAng, 2, 15, 0, 1); //墙壁误差大,所以尽量完全依赖cIntersect。。。后期如果该墙壁校准了可以调整
  63856. } else {
  63857. cr = math$2.linearClamp(matchInfo.minAng, 2, 20, 0, 0.4);
  63858. }
  63859. }
  63860. var predict0 = !standards[boxType].bottom && box0.btmPos || box0.posAtWall || matchInfo.topPos; //在墙上的除非角度小,否则不考虑cIntersect
  63861. var predict1 = !standards[boxType].bottom && box1.btmPos || box1.posAtWall || matchInfo.topPos; //相对来说btmPos要比center准一点?因为center有在两个维度上的误差
  63862. var btmRatio = 0.5;
  63863. var cIntersect = new THREE.Vector3().addVectors(matchInfo.center.clone().multiplyScalar(1 - btmRatio), matchInfo.btmPos.clone().multiplyScalar(btmRatio)).setY(o.pos3d.y);
  63864. if (predict0 && predict1) {
  63865. matchInfo.center = new THREE.Vector3().addVectors(cIntersect.clone().multiplyScalar(cr), predict0.clone().add(predict1).multiplyScalar(1 / 2 * (1 - cr))).setY(o.pos3d.y);
  63866. } else {
  63867. matchInfo.center = cIntersect;
  63868. }
  63869. matchInfo.cIntersect = cIntersect; //addLabel(matchInfo.center, matchInfo.name + '-c')
  63870. }
  63871. getBoxType(matchInfo);
  63872. /* if (matchInfo.boxType != box0.type || matchInfo.boxType != box1.type) {
  63873. ;(score -= 1000), str.push('typeNotSame2')
  63874. } */
  63875. {
  63876. var vec0 = new THREE.Vector3().subVectors(box0.pano.position, matchInfo.center);
  63877. var vec1 = new THREE.Vector3().subVectors(box1.pano.position, matchInfo.center);
  63878. if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0) {
  63879. //同一个象限(center会偏向一侧)
  63880. score -= 200;
  63881. }
  63882. }
  63883. if (!safeBound.containsPoint(matchInfo.center)) {
  63884. var _dis = safeBound.distanceToPoint(matchInfo.center) //console.log(`${panoId0}的第${box0.index}个与${panoId1}的第${box1.index}个因中心点在bounding外不匹配`, center, 'dis: ' + dis)
  63885. ;
  63886. score -= 1000 * _dis * _dis, str.push('outsideBound');
  63887. Object.assign(matchInfo, {
  63888. score,
  63889. str,
  63890. center: matchInfo.center,
  63891. disToBound: _dis
  63892. });
  63893. if (_dis > 0.5) return matchInfo;
  63894. } //检查宽度
  63895. var boxposes;
  63896. var checkWidth = function checkWidth() {
  63897. boxposes = [];
  63898. [box0, box1].forEach(function (box) {
  63899. var pose = getBoxPoseByPos(box, matchInfo.center);
  63900. boxposes.push(pose); //如果超出标准,基本上这二者不匹配;但过小的话,有可能是被遮挡所以残缺,因此不予过滤
  63901. });
  63902. };
  63903. checkWidth();
  63904. score += getPoseScore(boxposes, boxType
  63905. /* isSingle */
  63906. ); //根据投影信息预测的长度再得匹配分数
  63907. return Object.assign(matchInfo, {
  63908. score: score,
  63909. str,
  63910. /* diffHalfHeight, */
  63911. boxposes
  63912. });
  63913. };
  63914. _this5.rows = {};
  63915. /* let getchainNext = (left, end, chain, boxes) => {
  63916. chain.push(left)
  63917. if (left == end) return boxes.chains.push(chain)
  63918. let nodes = boxes.relationships.filter(pair => pair.includes(left))
  63919. let rights = nodes.map(pair => pair.find(e => e != left))
  63920. rights = rights.filter(e => !chain.includes(e) && boxes.indexOf(e) > boxes.indexOf(left))
  63921. rights.forEach(right => {
  63922. getchainNext(right, end, chain.slice(), boxes)
  63923. })
  63924. } */
  63925. var getPanoBigRowBox = function getPanoBigRowBox(panoBoxes) {
  63926. var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  63927. _ref3$reason = _ref3.reason,
  63928. reason = _ref3$reason === void 0 ? 'row' : _ref3$reason;
  63929. //将一个pano中的所有boxes分组,识别哪些是一排的。也可用于识别融合
  63930. var pano = panoBoxes[0].pano;
  63931. var category = panoBoxes[0].category;
  63932. var type = category + '|' + reason;
  63933. _this5.rows[type] || (_this5.rows[type] = {});
  63934. if (_this5.rows[type][pano.id]) return _this5.rows[type][pano.id];
  63935. var bigBoxes;
  63936. var bigBox = {
  63937. sid: 'pano' + pano.id + (reason == 'mix' ? '-mix' : '-row'),
  63938. pano,
  63939. category: reason == 'mix' ? category : 'rowBigBox',
  63940. boxType: reason == 'mix' ? panoBoxes[0].boxType : 'rowBigBox'
  63941. };
  63942. var rows = [];
  63943. for (var i = 0; i < panoBoxes.length; i++) {
  63944. var box0 = panoBoxes[i];
  63945. getBoxBase(box0);
  63946. var _ref4 = [box0.bbox2[0], box0.bbox2[2]],
  63947. left0 = _ref4[0],
  63948. right0 = _ref4[1];
  63949. for (var j = i + 1; j < panoBoxes.length; j++) {
  63950. var box1 = panoBoxes[j];
  63951. getBoxBase(box1);
  63952. if (box0.boxType != box0.boxType) continue; //类型不同
  63953. var _ref5 = [box1.bbox2[0], box1.bbox2[2]],
  63954. left1 = _ref5[0],
  63955. right1 = _ref5[1];
  63956. var d1 = getBbox2Diff(left1, right0),
  63957. d2 = getBbox2Diff(left1, left0),
  63958. d3 = getBbox2Diff(left0, right1);
  63959. if (box0.sid == 'pano2-4' && box1.sid == 'pano2-5') {
  63960. console.log(9);
  63961. }
  63962. var min = reason == 'mix' ? 0.004 : 0.003; //mix代表寻找分裂的重新融合到一起
  63963. if (d1 <= min && d2 >= min || d3 <= min && d2 <= min) {
  63964. //边框交接
  63965. var atEdgeMight = left1 < 0.002 && right0 > 0.998 ? [left1, right0] : left0 < 0.002 && right1 > 0.998 ? [left0, right1] : null; //有在全景图的边界的可能性
  63966. //if (reason == 'mix' && box0.category == typeNames.cabinet && !atEdgeMight) continue //柜子容易并排,尽量不融合 //再看,啥意思,没懂
  63967. if (reason == 'mix' && !atEdgeMight) continue; //不在边缘
  63968. var max = standards[box0.boxType].widthNormal.max; //standards[box0.btmPos ? category : 'air-hanging'].widthNormal
  63969. var tolerate = max * max * (reason == 'mix' ? 0.7 : 1.8); //yDCiaTQvRYn:row不能低于1.5
  63970. var p0 = standards[box0.boxType].atWall == 1 ? box0.posAtWall : reason == 'mix' ? box0.btmPosOri || box0.btmPosPredict : box0.btmPos;
  63971. 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
  63972. //let p1 = box1.type == 'air-hanging' ? box1.posAtWall : reason == 'mix' ? box1.btmPosOri : box1.btmPos
  63973. var dis = p0.distanceToSquared(p1);
  63974. if (reason == 'mix') {
  63975. var allY = box0.bbox2[3] - box0.bbox2[1] + (box1.bbox2[3] - box1.bbox2[1]); //各自高度和
  63976. var wholeY = Math.max(box0.bbox2[3], box1.bbox2[3]) - Math.min(box0.bbox2[1], box1.bbox2[1]); //总跨越高度
  63977. var coverY = allY - wholeY; //重合区域的y高度,可为负数
  63978. var disY = (1 - coverY / wholeY + (wholeY - coverY) * 3) * 4 * tolerate; //既要考虑占比也要考虑差值
  63979. dis += disY; //SGyhEzZNGP9案例:虽然是atEdge但并不应该融合,便通过disY来阻挡 ; MW6MEeCOy9Y:pano16-15
  63980. //console.log('disY',disY, box0.sid, box1.sid )
  63981. var atEdgePossib = atEdgeMight ? 0.002 / (atEdgeMight[0] + (1 - atEdgeMight[1])) : 0; // 两条线越接近越可能融合
  63982. atEdgePossib = Math.min(6, atEdgePossib); //原本计算得 min:1, max:Infinity
  63983. dis -= atEdgePossib * tolerate; //给点点优势
  63984. }
  63985. /* if(box0.sid == "pano2-0"){
  63986. console.log('dis',dis,'tolerate',tolerate,[box0, box1],disY)
  63987. }
  63988. if (box0.sid == 'pano2-1' && box1.sid == 'pano2-4') {
  63989. reason == 'mix' && console.log(dis, tolerate, box0.sid, box1.sid)
  63990. }*/
  63991. if (dis < tolerate) {
  63992. //reason == 'mix' && console.log('-------------------')
  63993. common$1.pushToGroupAuto([box0, box1], rows);
  63994. }
  63995. }
  63996. }
  63997. } //一排箱子的角度范围不可超过180度,因为不可能站在箱子上拍,所以超过的话肯定有边缘的不在这一排中。
  63998. //可判断边缘箱子的是否角度偏大,一般中间的被遮挡所以偏小
  63999. rows.forEach(function (boxes) {
  64000. //从左到右排序
  64001. boxes.sort(function (a, b) {
  64002. //但因有的box跨越到别的box区域,所以这个顺序不准确
  64003. return getBbox2Diff(a.bbox2CenterX, b.bbox2CenterX);
  64004. });
  64005. }); //去除不在一条直线上的连接. 当bound超出后就断开
  64006. if (reason == 'row') {
  64007. rows.slice(0).forEach(function (boxes) {
  64008. if (boxes.length >= 2) {
  64009. var removes = [],
  64010. bound = new THREE.Box2(),
  64011. size = new THREE.Vector2(),
  64012. maxW = 0.6;
  64013. for (var _i = 0, _j = boxes.length; _i < _j; _i++) {
  64014. var box = boxes[_i];
  64015. var pos2d = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
  64016. bound.expandByPoint(pos2d);
  64017. bound.getSize(size);
  64018. var _min3 = Math.min(size.x, size.y);
  64019. if (_min3 > maxW) {
  64020. removes.push([boxes[_i], boxes[_i - 1]]);
  64021. bound = new THREE.Box2();
  64022. bound.expandByPoint(pos2d); //console.log('removes', size)
  64023. } //console.log('removes',k, box1.sid)
  64024. }
  64025. if (removes.length) {
  64026. /* console.log(
  64027. '去除错误row连接',
  64028. removes.map(e => e.map(a => a.sid))
  64029. ) */
  64030. var _common$disconnectGro = common$1.disconnectGroup(removes, rows);
  64031. _common$disconnectGro.newGroups; //if(newGroups.length>1){//分裂成多组了,重新计算
  64032. // console.log(newGroups)
  64033. //}
  64034. }
  64035. }
  64036. });
  64037. rows.forEach(function (boxes) {
  64038. //从左到右重新排序
  64039. boxes.sort(function (a, b) {
  64040. //但因有的box跨越到别的box区域,所以这个顺序不准确
  64041. return getBbox2Diff(a.bbox2CenterX, b.bbox2CenterX);
  64042. });
  64043. });
  64044. }
  64045. rows.sort(function (a, b) {
  64046. return b.length - a.length;
  64047. }); //箱子数量从大到小排序
  64048. bigBoxes = rows.map(function (boxes, i) {
  64049. var _getLeftRight = getLeftRight(boxes),
  64050. leftX = _getLeftRight.leftX,
  64051. rightX = _getLeftRight.rightX; //最左
  64052. var topY = boxes.slice().sort(function (a, b) {
  64053. return a.bbox2[1] - b.bbox2[1];
  64054. })[0].bbox2[1];
  64055. var btmY = boxes.slice().sort(function (a, b) {
  64056. return b.bbox2[3] - a.bbox2[3];
  64057. })[0].bbox2[3];
  64058. var rowBigBox = Object.assign({}, bigBox, {
  64059. boxes,
  64060. bbox2: [leftX, topY, rightX, btmY],
  64061. //整排的bbox
  64062. left: boxes.find(function (e) {
  64063. return e.bbox2[0] == leftX;
  64064. }),
  64065. right: boxes.find(function (e) {
  64066. return e.bbox2[2] == rightX;
  64067. })
  64068. });
  64069. var p0 = getBoxPos(rowBigBox.left);
  64070. var p1 = getBoxPos(rowBigBox.right);
  64071. var vec = new THREE.Vector2(p0.x - p1.x, p0.z - p1.z);
  64072. rowBigBox.k = Math.abs(vec.x / vec.y);
  64073. rowBigBox.predictLen = (rowBigBox.k > 1 ? Math.abs(vec.x) : Math.abs(vec.y)) + 0.6; //加入一个宽度
  64074. /* if(boxes.length <= boxes.relationships.length){//多条链(为了识别一个box嵌套多个的情况。不过后来在开头时处理了一部分)
  64075. boxes.chains = []
  64076. getchainNext(left,right,[], boxes )
  64077. let aveAngle = (getBbox2Diff(left.bbox2[2], left.bbox2[0]) + getBbox2Diff(right.bbox2[2], right.bbox2[0]) ) / 2 -0.01 //首尾的angle平均数。但如果这两个不准那就导致整体出错了
  64078. let middleAngle = getBbox2Diff(right.bbox2[0], left.bbox2[2])
  64079. let counts = boxes.chains.map(e=>e.length)
  64080. counts.sort((a,b)=>a-b)
  64081. let min = counts[0],max = counts[counts.length-1]
  64082. let r = [], cur = min;
  64083. while(cur<=max){
  64084. r.push({cur, diff:Math.abs((middleAngle / (cur-2) - aveAngle)}) //加 0.01是因为增加边缘
  64085. cur++
  64086. }
  64087. r.sort((a,b)=>a.diff-b.diff)
  64088. rowBigBox.predictBoxCount = r[0].cur
  64089. //---------
  64090. let goodCountChains = boxes.chains.filter(e=>e.length == rowBigBox.predictBoxCount)
  64091. if(goodCountChains.length == 1) rowBigBox.bestChain = goodCountChains[0]
  64092. else{
  64093. goodCountChains = goodCountChains.map((chain,i)=>{
  64094. let j = 1, diff=0 //中间的box的angle的方差
  64095. while(j<rowBigBox.predictBoxCount){
  64096. let angle = getBbox2Diff(chain[j].bbox2[2], chain[j].bbox2[0])
  64097. diff += Math.pow(angle - aveAngle, 2)
  64098. j++;
  64099. }
  64100. return {diff, chain}
  64101. })
  64102. goodCountChains.sort((a,b)=>a.diff-b.diff)
  64103. rowBigBox.bestChain = goodCountChains[0].chain
  64104. }
  64105. console.log('getChains',boxes.chains, 'predictBoxCount',rowBigBox.predictBoxCount, r)
  64106. } */
  64107. return rowBigBox;
  64108. });
  64109. if (reason != 'mix') {
  64110. panoBoxes.forEach(function (box) {
  64111. //加入单个的
  64112. if (!rows.some(function (row) {
  64113. return row.includes(box);
  64114. })) {
  64115. var boxBig = Object.assign({}, bigBox, {
  64116. bbox2: box.bbox2,
  64117. boxes: [box],
  64118. left: box,
  64119. right: box
  64120. });
  64121. bigBoxes.push(boxBig);
  64122. }
  64123. });
  64124. } //mix的之前的btm因pose错误而延伸了不对的depth所以不准
  64125. bigBoxes.forEach(function (bigBox) {
  64126. bigBox.sid += '-' + bigBox.boxes.map(function (e) {
  64127. return e.index;
  64128. }).join(',');
  64129. /* if (bigBox.sid == 'pano0-rowBigBox-1,0,2,4') {
  64130. console.log(3)
  64131. } */
  64132. if (reason == 'row') {
  64133. //取平均值
  64134. if (bigBox.boxes[0].btmPos) {
  64135. bigBox.btmPos = bigBox.boxes.reduce(function (w, c) {
  64136. return w.add(c.btmPos);
  64137. }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length); //addLabel(bigBox.btmPos,'b_'+bigBox.sid, {bgcolor:'#f93',a:0.4})
  64138. }
  64139. if (bigBox.boxes[0].topPos) {
  64140. bigBox.topPos = bigBox.boxes.reduce(function (w, c) {
  64141. return w.add(c.topPos);
  64142. }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
  64143. }
  64144. if (bigBox.boxes[0].posAtWall) {
  64145. bigBox.posAtWall = bigBox.boxes.reduce(function (w, c) {
  64146. return w.add(c.posAtWall);
  64147. }, new THREE.Vector3()).multiplyScalar(1 / bigBox.boxes.length);
  64148. }
  64149. } //mix的需要合并后计算才准确
  64150. });
  64151. _this5.rows[type][pano.id] = bigBoxes; //当前pano的所有row
  64152. return bigBoxes;
  64153. };
  64154. /* let getPanoBoxAngleTrend = rowBox => {
  64155. //顺时针方向该pano的box角度范围是越来越大还是越来越小
  64156. let diffs = []
  64157. let angles = rowBox.boxes.map(box => getBbox2Diff(box.bbox2[2], box.bbox2[0]))
  64158. for (let i = 0, j = angles.length; i < j - 1; i++) {
  64159. //得所有相邻之间的差
  64160. let a0 = angles[i],
  64161. a1 = angles[i + 1]
  64162. diffs.push(a1 - a0)
  64163. }
  64164. diffs.sort((a, b) => a - b)
  64165. return diffs[Math.floor(diffs.length / 2)] //中位数
  64166. } */
  64167. /* let getBoxCount = (rowBigBox)=>{
  64168. return rowBigBox.predictBoxCount || rowBigBox.boxes.length
  64169. } */
  64170. var getReverseInfo = function getReverseInfo(rowBigBox0, rowBigBox1) {
  64171. //两个row的方向对应
  64172. var reversed = false;
  64173. var lefts = [rowBigBox0.left, rowBigBox1.left];
  64174. var rights = [rowBigBox0.right, rowBigBox1.right];
  64175. var dis0 = lefts[0].btmPos.distanceToSquared(lefts[1].btmPos);
  64176. var dis1 = rights[0].btmPos.distanceToSquared(rights[1].btmPos);
  64177. var dis2 = lefts[0].btmPos.distanceToSquared(rights[1].btmPos);
  64178. var dis3 = rights[0].btmPos.distanceToSquared(lefts[1].btmPos);
  64179. var posLeft2, posRight2;
  64180. if (dis0 + dis1 > dis2 + dis3) {
  64181. //距离近的代表是同一端
  64182. reversed = true;
  64183. posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
  64184. posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
  64185. } else {
  64186. posLeft2 = new THREE.Vector3().addVectors(lefts[0].btmPos, lefts[1].btmPos).multiplyScalar(0.5);
  64187. posRight2 = new THREE.Vector3().addVectors(rights[0].btmPos, rights[1].btmPos).multiplyScalar(0.5);
  64188. }
  64189. var vec = new THREE.Vector2(posLeft2.x - posRight2.x, posLeft2.z - posRight2.z);
  64190. var k = Math.abs(vec.x / vec.y); //这个算斜率更准,但位置容易偏向一侧(可能用边缘的bbox算会好些?)
  64191. return {
  64192. reversed,
  64193. k
  64194. };
  64195. };
  64196. var searchByRow = function searchByRow(groups, datas) {
  64197. //先查找row,匹配row,再slice row的方法
  64198. _this5.matchScoreMap['rowBigBox'] = new Map();
  64199. var rowInfos = new Map();
  64200. var getRowMatchInfo = function getRowMatchInfo(rowBigBox0, rowBigBox1, ignoreCountMatch) {
  64201. //获取row间的匹配信息
  64202. //获取bigBox位置。由于一排的盒子比较长,中心方向误差大,所以采用先获取两边位置,再求中点的方法
  64203. //if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return //太难了,不算不一样的情况了
  64204. var name = rowBigBox0.sid + '&' + rowBigBox1.sid;
  64205. var row = rowInfos.get(name);
  64206. if (row) {
  64207. return row;
  64208. }
  64209. if (rowBigBox0.boxes.length != rowBigBox1.boxes.length && !ignoreCountMatch) return; //if (getBoxCount(rowBigBox0) != getBoxCount(rowBigBox1) && getBoxCount(rowBigBox0) != 1 && getBoxCount(rowBigBox1) != 1)return
  64210. /* if (rowBigBox0.sid == 'pano0-row-1,2,6' && rowBigBox1.sid == 'pano2-row-0,2,6') {
  64211. console.log(4)
  64212. } */
  64213. var rowInfo;
  64214. if (rowBigBox0.boxes.length > 1 && rowBigBox1.boxes.length > 1) {
  64215. //多对多,可以求两端的位置
  64216. var lefts = [rowBigBox0.left, rowBigBox1.left];
  64217. var rights = [rowBigBox0.right, rowBigBox1.right];
  64218. var leftInfo;
  64219. var rightInfo;
  64220. var info2 = getReverseInfo(rowBigBox0, rowBigBox1);
  64221. var len0 = rowBigBox0.predictLen,
  64222. //长度应该接近
  64223. len1 = rowBigBox1.predictLen;
  64224. var overLen = Math.abs(len0 - len1);
  64225. /* / (rowBigBox0.boxes.length + rowBigBox1.boxes.length) * 5 */
  64226. if (overLen > 1) {
  64227. //console.warn('overLen> 1', overLen, rowBigBox0.sid, '和', rowBigBox1.sid)
  64228. return done();
  64229. }
  64230. if (info2.reversed) {
  64231. leftInfo = getMatchScore(lefts[0], rights[1], {
  64232. isSingle: true
  64233. });
  64234. rightInfo = getMatchScore(rights[0], lefts[1], {
  64235. isSingle: true
  64236. });
  64237. } else {
  64238. leftInfo = getMatchScore(lefts[0], lefts[1], {
  64239. isSingle: true
  64240. });
  64241. rightInfo = getMatchScore(rights[0], rights[1], {
  64242. isSingle: true
  64243. });
  64244. }
  64245. var posLeft = getBoxPos(leftInfo);
  64246. var posRight = getBoxPos(rightInfo);
  64247. if (!posLeft || !posRight || leftInfo.score < -4000 || rightInfo.score < -4000) {
  64248. return done(); //漫游点重合、>180度会导致此问题
  64249. }
  64250. preDealBox(leftInfo); //getBoxSize(leftInfo)
  64251. preDealBox(rightInfo); //getBoxSize(rightInfo)
  64252. posLeft = getBoxPos(leftInfo);
  64253. posRight = getBoxPos(rightInfo); //验证是否是垂直或水平
  64254. var vec = new THREE.Vector2(posLeft.x - posRight.x, posLeft.z - posRight.z);
  64255. var k = Math.abs(vec.x / vec.y);
  64256. if (info2.k > 1 && k < 1 || info2.k < 1 && k > 1) {
  64257. console.error('请检查!info2.k > 1 && k < 1 || info2.k < 1 && k > 1', rowBigBox0.sid, '和', rowBigBox1.sid); //绘制的方向错误,尺寸错误
  64258. return done();
  64259. }
  64260. var wrongK = 0;
  64261. if (rowBigBox0.k > 1 && rowBigBox1.k < 1 || rowBigBox0.k < 1 && rowBigBox1.k > 1) {
  64262. wrongK = rowBigBox0.k / rowBigBox1.k;
  64263. if (wrongK < 1) wrongK = 1 / wrongK;
  64264. }
  64265. /*
  64266. let trend0 = getPanoBoxAngleTrend(rowBigBox0)
  64267. let trend1 = getPanoBoxAngleTrend(rowBigBox1)
  64268. let judgeReverse = () => { //这个方法有时不准
  64269. let disLeftSquared0 = new THREE.Vector2(posLeft.x - rowBigBox0.pano.position.x, posLeft.z - rowBigBox0.pano.position.z).lengthSq()
  64270. let disRightSquared0 = new THREE.Vector2(posRight.x - rowBigBox0.pano.position.x, posRight.z - rowBigBox0.pano.position.z).lengthSq()
  64271. let a = trend0 * (disLeftSquared0 - disRightSquared0)
  64272. if (a < 0 && Math.abs(a) > 0.1) return true
  64273. let posLeft2 = reversed ? posRight : posLeft, //反向过的对第二个漫游点来说左右是反的
  64274. posRight2 = reversed ? posLeft : posRight
  64275. let disLeftSquared1 = new THREE.Vector2(posLeft2.x - rowBigBox1.pano.position.x, posLeft2.z - rowBigBox1.pano.position.z).lengthSq()
  64276. let disRightSquared1 = new THREE.Vector2(posRight2.x - rowBigBox1.pano.position.x, posRight2.z - rowBigBox1.pano.position.z).lengthSq()
  64277. let b = trend1 * (disLeftSquared1 - disRightSquared1)
  64278. if (b < 0 && Math.abs(b) > 0.1) return true
  64279. }
  64280. if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
  64281. //反向试试
  64282. leftInfo = getMatchScore(lefts[0], rights[1], { isSingle: true })
  64283. rightInfo = getMatchScore(rights[0], lefts[1], { isSingle: true })
  64284. posLeft = getBoxPos(leftInfo)
  64285. posRight = getBoxPos(rightInfo)
  64286. reversed = true //rowBigBox1 反向了
  64287. }
  64288. if (leftInfo.score < -2000 || rightInfo.score < -2000 || judgeReverse()) {
  64289. return console.log('getCenter ;两个方向都不符合', rowBigBox0.sid, rowBigBox1.sid)
  64290. } */
  64291. /*const maxK = Math.max(0.6 / Math.sqrt(rowBigBox0.boxes.length), 0.2) // 最大斜率
  64292. if (k < maxK && k > 1 / maxK) {
  64293. return //console.log('放弃,斜率', k)
  64294. } */
  64295. //横的话,按x从小到大,竖的按z从小到大
  64296. if (k < 1 && posLeft.z > posRight.z || k > 1 && posLeft.x > posRight.x) {
  64297. var temp = posRight;
  64298. posRight = posLeft, posLeft = temp;
  64299. } //addLabel(posLeft, 'left-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
  64300. //addLabel(posRight, 'right-' + rowBigBox0.pano.id + '&' + rowBigBox1.pano.id, { a: 0.1 })
  64301. /* if (rowBigBox0.pano.id + '&' + rowBigBox1.pano.id == '22&26') {
  64302. console.log(777)
  64303. } */
  64304. /* var line1 = LineDraw.createLine([posLeft, posRight])
  64305. meshGroup.add(line1) */
  64306. //根据btmPos矫正一下中心位置, 否则容易偏漫游点这一侧
  64307. var center = new THREE.Vector3().addVectors(posLeft, posRight).multiplyScalar(0.5);
  64308. center.add(rowBigBox0.btmPos).add(rowBigBox1.btmPos).multiplyScalar(1 / 3);
  64309. var _match = getMatchScore(rowBigBox0, rowBigBox1, {
  64310. isSingle: true,
  64311. center
  64312. }); //是否预先传送center ?
  64313. //rowInfo.minAngs = [leftInfo.minAng , rightInfo.minAng]
  64314. /* if (match.name == 'pano4-row-6,4,1,3&pano0-row-0,1,4,5') {
  64315. console.log(8)
  64316. } */
  64317. var sc = _match.score - overLen * 1000 - wrongK * 100 + leftInfo.score + rightInfo.score;
  64318. if (sc < -4000) {
  64319. //console.log('放弃,匹配分过低,可能不是一组', rowBigBox0.sid, '和', rowBigBox1.sid, sc)
  64320. return done();
  64321. } //console.log('getcenter', rowBigBox0.sid, '和', rowBigBox1.sid, overLen, match.score + overLen * 1000 + leftInfo.score + rightInfo.score)
  64322. rowInfo = {
  64323. rowBigBox0,
  64324. rowBigBox1,
  64325. match: _match,
  64326. k,
  64327. posLeft,
  64328. posRight,
  64329. score: sc / 3 + 500,
  64330. //700 + match.score*0.7 + (leftInfo.score + rightInfo.score)*0.3 ,
  64331. reversed: info2.reversed
  64332. };
  64333. } else {
  64334. if (rowBigBox0.boxes.length == 1 && rowBigBox1.boxes.length == 1) {
  64335. rowInfo = getMatchScore(rowBigBox0.boxes[0], rowBigBox1.boxes[0]); //直接匹配box
  64336. } else {
  64337. //一对多。getMatchScore计算误差大(长度越长中心误差越大、宽度计算也误差大)所以再写点限制。直接使用btm来预测长度和位置似乎更准
  64338. var mulBoxRow = rowBigBox0.boxes.length > 1 ? rowBigBox0 : rowBigBox1;
  64339. var singleBox = rowBigBox0.boxes.length == 1 ? rowBigBox0 : rowBigBox1;
  64340. /* if(rowBigBox0.sid == "pano12-row-3" && rowBigBox1.sid == "pano0-row-3,1,0" ){
  64341. console.log(5)
  64342. } */
  64343. rowInfo = getMatchScore(rowBigBox0, rowBigBox1, {
  64344. dontCheckDis: true
  64345. }); //一对多 也可以根据方向检查距离,如仅检查z
  64346. rowInfo.k = mulBoxRow.k;
  64347. if (rowInfo.center) {
  64348. rowInfo.center.add(getBoxPos(mulBoxRow)).multiplyScalar(0.5);
  64349. }
  64350. if (rowInfo.name == 'pano0-row-14&pano4-row-8,11') {
  64351. addLabel(rowInfo.center, 'c');
  64352. }
  64353. rowInfo.predictSize = rowInfo.k > 1 ? {
  64354. x: mulBoxRow.predictLen,
  64355. y: 0.6
  64356. } : {
  64357. y: mulBoxRow.predictLen,
  64358. x: 0.6
  64359. }; //单个的应该和多个的其中一端一样,且是离单个漫游点近的那端(也就是要走到箱子一端看不见其他箱子才行)
  64360. var dis0 = getBoxPos(mulBoxRow.left).distanceToSquared(singleBox.pano.position);
  64361. var dis1 = getBoxPos(mulBoxRow.right).distanceToSquared(singleBox.pano.position);
  64362. var near = dis0 < dis1 ? mulBoxRow.left : mulBoxRow.right;
  64363. var p0 = getBoxPos(singleBox);
  64364. var dis = getBoxPos(near).distanceToSquared(p0);
  64365. rowInfo.score -= dis * 1000;
  64366. var p1 = getBoxPos(mulBoxRow);
  64367. var vec1 = new THREE.Vector2(p1.x - singleBox.pano.position.x, p1.z - singleBox.pano.position.z).normalize(); //看向中心的方向
  64368. var vec2 = new THREE.Vector2(singleBox.centerDir.x, singleBox.centerDir.z).normalize();
  64369. rowInfo.score += (vec1.dot(vec2) - 1) * 1000; //同一个方向是最好
  64370. }
  64371. }
  64372. function done(rowInfo) {
  64373. //rowInfo && rowInfos.push(rowInfo)
  64374. rowInfos.set(name, rowInfo);
  64375. }
  64376. done(rowInfo);
  64377. return rowInfo;
  64378. };
  64379. var matchGroups = [];
  64380. var getK = function getK(info) {
  64381. var k;
  64382. if (info.left) {
  64383. var vec = new THREE.Vector2(info.left.x - info.right.x, info.left.z - info.right.z);
  64384. k = Math.abs(vec.x / vec.y);
  64385. } else {
  64386. k = Math.abs(Math.max(info.size.x, 0.6) / Math.max(info.size.z, 0.6));
  64387. }
  64388. return k;
  64389. };
  64390. var ignoreCountMatch = groups.filter(function (e) {
  64391. return e.length > 1;
  64392. }).length == 1; //是否不同数量box的row也能匹配
  64393. var minScore = boundConfirmed ? -2000 : -800;
  64394. var match = function match(searchType) {
  64395. if (searchType == 'second') ignoreCountMatch = true;
  64396. for (var i = 0; i < groups.length - 1; i++) {
  64397. var rowBigBoxes_0 = getPanoBigRowBox(groups[i]);
  64398. var pano0 = groups[i][0].pano;
  64399. if (searchType == 'second') rowBigBoxes_0 = rowBigBoxes_0.filter(function (e) {
  64400. return !matchGroups.some(function (u) {
  64401. return u.includes(e);
  64402. });
  64403. });
  64404. var _loop = function _loop(j) {
  64405. var rowBigBoxes_1 = getPanoBigRowBox(groups[j]);
  64406. if (searchType == 'second') rowBigBoxes_1 = rowBigBoxes_1.filter(function (e) {
  64407. return !matchGroups.some(function (u) {
  64408. return u.includes(e);
  64409. });
  64410. });
  64411. var pano1 = groups[j][0].pano;
  64412. if (pano0.id == 54 && pano1.id == 56) {
  64413. console.log(2);
  64414. }
  64415. var resultPairs = [];
  64416. var evaluateFun = function evaluateFun(row0, row1) {
  64417. return getRowMatchInfo(row0, row1, ignoreCountMatch);
  64418. };
  64419. searchPair(null
  64420. /* bigBoxes_0[0] */
  64421. , rowBigBoxes_0.slice(), rowBigBoxes_1.slice(), null, resultPairs, evaluateFun);
  64422. resultPairs = resultPairs.map(function (pairs) {
  64423. var infos = pairs.map(function (pair) {
  64424. return pair.some(function (e) {
  64425. return e.sid == 'void';
  64426. }) ? null : getRowMatchInfo(pair[0], pair[1], ignoreCountMatch);
  64427. }); //infos.sort((a,b)=>{return a.score-b.score});
  64428. var score = infos.reduce(function (s, e) {
  64429. return s + (e && e.score > minScore ? e.score : minScore / 2); //只考虑组成功的分数
  64430. }, 0);
  64431. return {
  64432. pairs,
  64433. infos,
  64434. score,
  64435. name: pairs.map(function (pair) {
  64436. return pair.map(function (item) {
  64437. return item.sid;
  64438. }).join(' & ');
  64439. })
  64440. };
  64441. });
  64442. resultPairs.sort(function (a, b) {
  64443. return b.score - a.score;
  64444. });
  64445. /* if (resultPairs[0].name[0].includes('pano8') && resultPairs[0].name[0].includes('pano0')) {
  64446. console.log(111)
  64447. } */
  64448. resultPairs[0] && resultPairs[0].pairs.forEach(function (pair, i) {
  64449. var info = resultPairs[0].infos[i];
  64450. if (info && info.score > minScore) {
  64451. var items = pair.filter(function (e) {
  64452. return e.sid != 'void';
  64453. });
  64454. common$1.pushToGroupAuto(items, matchGroups, null, function (atGroup) {
  64455. //需要朝向一致才行
  64456. if (!info.k) return true; //(box识别的宽高识别不准所以不需要)
  64457. var onePair = atGroup.relationships[0];
  64458. var name = onePair[0].sid + '&' + onePair[1].sid;
  64459. if (!rowInfos.get(name).k) return true; //不过不应该有这种情况,否则匹配不到一起才对
  64460. if (rowInfos.get(name).k < 1 && info.k < 1 || rowInfos.get(name).k > 1 && info.k > 1) {
  64461. return true;
  64462. } else {
  64463. console.log('k不一致无法匹配', info, atGroup);
  64464. }
  64465. }); //根据目前的规则应该是有端点的和有端点的匹配,box和box匹配
  64466. }
  64467. }); //console.log(resultPairs[0])
  64468. };
  64469. for (var j = i + 1; j < groups.length; j++) {
  64470. _loop(j);
  64471. }
  64472. }
  64473. };
  64474. match();
  64475. ignoreCountMatch || match('second'); //再次将剩余的匹配一下,这次允许个数不同的row匹配
  64476. //console.log('matchGroups', matchGroups)
  64477. //识别出来的多组,可能有重复的,因为box个数不同所以才没到一组
  64478. //整理一下,每个组整理出一个info,同时重新检查一下,挑去每组中和其他成员非常不同的
  64479. var groupInfo = [];
  64480. var getGroupInfo = function getGroupInfo(group) {
  64481. var left = new THREE.Vector3(),
  64482. right = new THREE.Vector3(),
  64483. pointsLen = 0;
  64484. var bigBoxes = [];
  64485. var info = {};
  64486. group.relationships.forEach(function (pair) {
  64487. var name = pair[0].sid + '&' + pair[1].sid;
  64488. var matchInfo = rowInfos.get(name); //this.matchScoreMap["rowBigBox"][name] || this.matchScoreMap["cabinet"][name];
  64489. if (matchInfo.posLeft) {
  64490. left.add(matchInfo.posLeft), right.add(matchInfo.posRight), pointsLen++;
  64491. } else {
  64492. bigBoxes.push(matchInfo);
  64493. preDealBox(matchInfo);
  64494. getBoxSize(matchInfo);
  64495. }
  64496. });
  64497. if (pointsLen > 0) {
  64498. left.multiplyScalar(1 / pointsLen);
  64499. right.multiplyScalar(1 / pointsLen); //addLabel(left, 'Left' + index, { bgcolor: '#F00', a: 0.2 })
  64500. //addLabel(right, 'Right' + index, { bgcolor: '#F00', a: 0.2 })
  64501. var center = new THREE.Vector3().addVectors(left, right).multiplyScalar(0.5) //addLabel(center, 'center' + index, { bgcolor: '#F00', a: 0.3 })
  64502. ;
  64503. info.left = left, info.right = right, info.center = center;
  64504. info.pointsLen = pointsLen;
  64505. }
  64506. if (bigBoxes.length > 0) {
  64507. var getAve = function getAve(bigBoxes) {
  64508. var center1 = new THREE.Vector3(),
  64509. size = new THREE.Vector3();
  64510. bigBoxes.forEach(function (box) {
  64511. var center0 = getBoxPos(box);
  64512. center1.add(center0);
  64513. size.add(box.size);
  64514. });
  64515. if (pointsLen > 0) {
  64516. var size0 = new THREE.Vector3(Math.abs(left.x - right.x), size.y, Math.abs(left.z - right.z));
  64517. size.add(size0.multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
  64518. center1.add(info.center.clone().multiplyScalar(pointsLen)).multiplyScalar(1 / (pointsLen + bigBoxes.length));
  64519. } else {
  64520. size.multiplyScalar(1 / bigBoxes.length);
  64521. center1.multiplyScalar(1 / bigBoxes.length);
  64522. }
  64523. return {
  64524. center1,
  64525. size
  64526. };
  64527. };
  64528. var getScores = function getScores(center, size) {
  64529. //获得相对于center,size的差别分数
  64530. bigBoxes.forEach(function (box) {
  64531. box.sc = -box.center.distanceToSquared(center1) - size.distanceToSquared(box.size) * 0.5;
  64532. });
  64533. };
  64534. var _getAve = getAve(bigBoxes),
  64535. center1 = _getAve.center1,
  64536. size = _getAve.size; //console.log(center1, size)
  64537. getScores(center1, size);
  64538. bigBoxes.sort(function (a, b) {
  64539. return b.sc - a.sc;
  64540. });
  64541. var midItem = bigBoxes[Math.floor(bigBoxes.length / 2)]; //中位数
  64542. getScores(midItem.center, midItem.size);
  64543. var _minScore = -8;
  64544. var removes = bigBoxes.filter(function (e) {
  64545. return e.sc < _minScore;
  64546. });
  64547. if (removes.length) {
  64548. var _common$disconnectGro2 = common$1.disconnectGroup(removes.map(function (e) {
  64549. return [e.box0, e.box1];
  64550. }), matchGroups),
  64551. newGroups = _common$disconnectGro2.newGroups;
  64552. console.log('去除错误数据', removes);
  64553. if (newGroups.length > 1) {
  64554. //分裂成多组了,重新计算
  64555. newGroups.forEach(function (e) {
  64556. getGroupInfo(e);
  64557. });
  64558. return;
  64559. }
  64560. bigBoxes = bigBoxes.filter(function (e) {
  64561. return e.sc >= _minScore;
  64562. });
  64563. }
  64564. if (bigBoxes.length) {
  64565. var o = getAve(bigBoxes) //again
  64566. ;
  64567. info.center = o.center1, info.size = o.size;
  64568. }
  64569. }
  64570. info.k = getK(info);
  64571. info.bigBoxes = bigBoxes;
  64572. info.group = group;
  64573. groupInfo.push(info);
  64574. };
  64575. matchGroups.slice(0).forEach(function (group) {
  64576. getGroupInfo(group);
  64577. });
  64578. var getLength = function getLength(c) {
  64579. //获取bigbox长度
  64580. 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;
  64581. };
  64582. var getLeft = function getLeft(group, k) {
  64583. var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
  64584. return group.left ? group.left[dirAxis] - 0.3 : group.center[dirAxis] - group.size[dirAxis] / 2; //left和right加减半个宽度
  64585. };
  64586. var getRight = function getRight(group, k) {
  64587. var dirAxis = (k || group.k) > 1 ? 'x' : 'z';
  64588. return group.right ? group.right[dirAxis] + 0.3 : group.center[dirAxis] + group.size[dirAxis] / 2;
  64589. }; //识别是否group之间有一样的, 去重
  64590. {
  64591. var _ret = function () {
  64592. var realGroups = [];
  64593. var getAveWidth = function getAveWidth(infos, len) {
  64594. //获取这些infos最合适的箱子平均宽度和个数
  64595. var boxCounts = [];
  64596. infos.forEach(function (e) {
  64597. boxCounts.push.apply(boxCounts, _toConsumableArray(e.group.map(function (bigBox) {
  64598. return bigBox.boxes.length;
  64599. })));
  64600. });
  64601. boxCounts.sort(function (a, b) {
  64602. return a - b;
  64603. });
  64604. var midCounts = [];
  64605. var r0 = 0.3,
  64606. r1 = 0.7; //取中间这部分的算最适合的个数,结果不一定是中位数
  64607. boxCounts.slice(Math.floor(boxCounts.length * r0), Math.floor(boxCounts.length * r1) + 1).forEach(function (c) {
  64608. if (!midCounts.includes(c)) midCounts.push(c);
  64609. });
  64610. var _standards$cabinet$wi = standards.cabinet.widthNormal,
  64611. min = _standards$cabinet$wi.min,
  64612. max = _standards$cabinet$wi.max;
  64613. var standardW = (min + max) / 2;
  64614. var aveWs = midCounts.map(function (e) {
  64615. return {
  64616. aveW: len / e,
  64617. count: e
  64618. };
  64619. });
  64620. aveWs.sort(function (a, b) {
  64621. return Math.abs(a.aveW - standardW) - Math.abs(b.aveW - standardW);
  64622. });
  64623. var aveW = aveWs[0].aveW;
  64624. var count = aveWs[0].count;
  64625. if (aveW > max || aveW < min) {
  64626. var w = THREE.MathUtils.clamp(aveW, min, max); //console.warn(`box aveW宽度不太对,从${aveW}修改到${w}`)
  64627. aveW = w;
  64628. }
  64629. return {
  64630. aveW,
  64631. count
  64632. };
  64633. };
  64634. var getBox2 = function getBox2(center, len, thick, k) {
  64635. var box2 = new THREE.Box2();
  64636. box2.expandByPoint(new THREE.Vector2(center.x, center.z));
  64637. var sizeVec = k > 1 ? new THREE.Vector2(len / 2, thick / 2) : new THREE.Vector2(thick / 2, len / 2);
  64638. box2.expandByVector(sizeVec);
  64639. return box2;
  64640. };
  64641. var standardW = 0.6; //两排之间最小距离
  64642. var _loop2 = function _loop2(m) {
  64643. var group0 = groupInfo[m];
  64644. var _loop3 = function _loop3(n) {
  64645. var _group1$bigBoxes$, _group0$bigBoxes$;
  64646. var group1 = groupInfo[n];
  64647. 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') {
  64648. console.log(4);
  64649. }
  64650. if ((group0.k > 1 && group1.k < 1 || group0.k < 1 && group1.k > 1) && getLength(group0) > 1.5 && getLength(group1) > 1.5) return "continue"; //如果是方块状的无视k
  64651. //间距
  64652. var spaceAxis = (group0.k + group1.k) / 2 > 1 ? 'z' : 'x';
  64653. var spaceDis = Math.abs(group0.center[spaceAxis] - group1.center[spaceAxis]);
  64654. if (spaceDis > standardW * 1.5) return "continue";
  64655. var o0 = getAveWidth([group0], getLength(group0)); //因为有可能长度和箱子个数不匹配,所以需要得到限制后的宽度再比较
  64656. var o1 = getAveWidth([group1], getLength(group1));
  64657. var len0 = group0.predictLen = o0.aveW * o0.count;
  64658. var len1 = group1.predictLen = o1.aveW * o1.count;
  64659. // if( len0 / len1 < minR || len0 / len1 > 1/minR) continue
  64660. var area0 = group0.area = len0 * o0.aveW;
  64661. var area1 = group1.area = len1 * o1.aveW;
  64662. var getBoxMixArea = function getBoxMixArea(expandRatio1, expandRatio2) {
  64663. var box0 = getBox2(group0.center, len0 + expandRatio1, o0.aveW + expandRatio2, group0.k);
  64664. var box1 = getBox2(group1.center, len1 + expandRatio1, o1.aveW + expandRatio2, group1.k);
  64665. var mixBox = getMixBox(box0, box1); //重叠部分
  64666. var s = mixBox.getSize(new THREE.Vector2());
  64667. return {
  64668. box0,
  64669. box1,
  64670. areaMix: Math.max(0, s.x) * Math.max(0, s.y)
  64671. }; //可能是0
  64672. };
  64673. var areaMixExpand = getBoxMixArea(0.1, 0.3).areaMix;
  64674. if (areaMixExpand / area0 < 0.65 && areaMixExpand / area1 < 0.65) return "continue"; //包含的可以通过
  64675. /*let areaMix = getBoxMixArea(0, 0).areaMix //实际重合面积
  64676. group0.contains = group0.contains || []
  64677. group1.contains = group1.contains || []
  64678. group0.contains.push({ group: group1, selfPercent: areaMix / area0, percent2: areaMix / area1, areaMix })
  64679. group1.contains.push({ group: group0, selfPercent: areaMix / area1, percent2: areaMix / area0, areaMix })
  64680. */
  64681. //console.log('两个合并', group0, group1)
  64682. common$1.pushToGroupAuto([group0, group1], realGroups); //包含的直接合并吧 - - ,这样会使结果偏移,不过没办法了,多个重叠面积太难算了
  64683. };
  64684. for (var n = m + 1; n < groupInfo.length; n++) {
  64685. var _ret2 = _loop3(n);
  64686. if (_ret2 === "continue") continue;
  64687. }
  64688. };
  64689. for (var m = 0; m < groupInfo.length - 1; m++) {
  64690. _loop2(m);
  64691. } //但没合并前样本数量少,包含关系可能有错 - -
  64692. /*for(let m=0; m<groupInfo.length;m++){
  64693. let group = groupInfo[m]
  64694. let contains = group.contains.filter(e=> e.percent2 > 0.8) //所有包含的
  64695. contains.reduce
  64696. } */
  64697. groupInfo.forEach(function (info) {
  64698. //加入单个的
  64699. if (!realGroups.some(function (groups) {
  64700. return groups.includes(info);
  64701. })) {
  64702. realGroups.push([info]);
  64703. }
  64704. }); //console.log('realGroups', realGroups)
  64705. //get boxes
  64706. realGroups.forEach(function (infos, i) {
  64707. var sampleCount = infos.reduce(function (w, c) {
  64708. return w += c.pointsLen || c.bigBoxes.length;
  64709. }, 0);
  64710. var k;
  64711. /* {
  64712. //const k = infos.reduce((w, c) => (w += c.k), 0) / infos.length
  64713. let ks = infos.map(e => e.k)
  64714. ks.sort((a, b) => a - b)
  64715. let min = ks[0],
  64716. max = ks[ks.length - 1]
  64717. if (min < 1 && max > 1) {
  64718. //比较最小和最大,选取更极端的那个
  64719. let min_ = 1 / min
  64720. if (min_ < max) k = max
  64721. else k = min
  64722. } else k = (min + max) / 2
  64723. } */
  64724. {
  64725. //看>1的和<1的平均数哪个多用哪个
  64726. var ks = {
  64727. '<1': {
  64728. count: 0,
  64729. sum: 0
  64730. },
  64731. '>1': {
  64732. count: 0,
  64733. sum: 0
  64734. }
  64735. };
  64736. infos.forEach(function (e) {
  64737. if (e.k < 1) {
  64738. ks['<1'].count++, ks['<1'].sum += 1 / e.k;
  64739. } else {
  64740. ks['>1'].count++, ks['>1'].sum += e.k;
  64741. }
  64742. });
  64743. ks['<1'].count && (ks['<1'].ave = ks['<1'].sum / ks['<1'].count);
  64744. ks['>1'].count && (ks['>1'].ave = ks['>1'].sum / ks['>1'].count);
  64745. if (ks['<1'].ave > ks['>1'].ave) {
  64746. k = 1 / ks['<1'].ave;
  64747. } else {
  64748. k = ks['>1'].ave;
  64749. }
  64750. }
  64751. var centerPos = infos.reduce(function (w, c) {
  64752. return w.add(c.center.clone().multiplyScalar(c.pointsLen || c.bigBoxes.length));
  64753. }, new THREE.Vector3()).multiplyScalar(1 / sampleCount); //预得中心点
  64754. //获取左右端点(需要排除可能的误差,所以采用最靠近端点的三个点。但无法排除前三个点中万一含有包含box的、或者误差大的端点)
  64755. var lefts = infos.map(function (e) {
  64756. return getLeft(e, k);
  64757. }).sort(function (a, b) {
  64758. return a - b;
  64759. }).filter(function (a) {
  64760. return a < centerPos[k > 1 ? 'x' : 'z'];
  64761. }).slice(0, 3);
  64762. var rights = infos.map(function (e) {
  64763. return getRight(e, k);
  64764. }).sort(function (a, b) {
  64765. return b - a;
  64766. }).filter(function (a) {
  64767. return a > centerPos[k > 1 ? 'x' : 'z'];
  64768. }).slice(0, 3);
  64769. var left = 0,
  64770. right = 0;
  64771. var c0 = (lefts.length + 1) * lefts.length / 2;
  64772. lefts.forEach(function (e, i) {
  64773. //越靠近最外侧权重越高。
  64774. left += e * ((lefts.length - i) / c0);
  64775. });
  64776. c0 = (rights.length + 1) * rights.length / 2;
  64777. rights.forEach(function (e, i) {
  64778. right += e * ((rights.length - i) / c0);
  64779. });
  64780. centerPos[k > 1 ? 'x' : 'z'] = (left + right) / 2;
  64781. var len = right - left; //加一点值是因为之前计算长度,用的是最外box的中心点,会少box一半宽度
  64782. var infos2 = infos.filter(function (e) {
  64783. return !e.predictLen || e.predictLen / len > 0.7;
  64784. });
  64785. if (infos2.length == 0) {
  64786. infos2 = infos.sort(function (a, b) {
  64787. return b.predictLen - a.predictLen;
  64788. }).slice(0, 1);
  64789. }
  64790. var _getAveWidth = getAveWidth(infos2, len),
  64791. aveW = _getAveWidth.aveW,
  64792. count = _getAveWidth.count; //长宽比中心点的误差更大,尤其是box类型的、或样本少的
  64793. //获取高度
  64794. var heights = [];
  64795. {
  64796. var heightss;
  64797. /* infos.forEach(e => {
  64798. pairs.push(...e.group.relationships.filter(pair => pair[0].boxes.length == count && pair[1].boxes.length == count))
  64799. })
  64800. if (pairs.length) {
  64801. heightss = pairs.map(pair => {
  64802. let boxes = pair.map(e => {
  64803. return e.boxes.slice()
  64804. })
  64805. let match = rowInfos[pair[0].sid + '&' + pair[1].sid]
  64806. let ifReverse = match.reversed
  64807. if (match.reversed == void 0 && pair[0].boxes.length > 1 && pair[1].boxes.length > 1) {
  64808. let { reversed } = getReverseInfo(pair[0], pair[1])
  64809. ifReverse = reversed
  64810. }
  64811. if (ifReverse) {
  64812. boxes[1].reverse()
  64813. }
  64814. let heights1 = []
  64815. let topPoss = []
  64816. for (let i = 0; i < count; i++) {
  64817. let match1 = getMatchScore(boxes[0][i], boxes[1][i], { onlyGet: true })
  64818. let topPos = match1 && match1.topPos
  64819. if (!topPos) {
  64820. topPos = getBoxTop({ box0: boxes[0][i], box1: boxes[1][i] })
  64821. }
  64822. heights1.push(topPos.y - groundY)
  64823. if (topPos.y - groundY < 0) {
  64824. console.log('?')
  64825. }
  64826. topPoss.push(topPos)
  64827. }
  64828. if ((k < 1 && topPoss[0].z > topPoss[count - 1].z) || (k > 1 && topPoss[0].x > topPoss[count - 1].x)) {
  64829. heights1.reverse()
  64830. }
  64831. return heights1
  64832. })
  64833. } else { */
  64834. var bigBoxes = [];
  64835. infos.forEach(function (e) {
  64836. bigBoxes.push.apply(bigBoxes, _toConsumableArray(e.group.filter(function (e) {
  64837. return !bigBoxes.includes(e) && e.boxes.length == count;
  64838. })));
  64839. });
  64840. heightss = bigBoxes.map(function (bigBox) {
  64841. var topPoss = bigBox.boxes.map(function (box) {
  64842. var a = {
  64843. box0: box
  64844. };
  64845. getBoxTop(a);
  64846. return a.topPos;
  64847. });
  64848. if (k < 1 && topPoss[0].z > topPoss[count - 1].z || k > 1 && topPoss[0].x > topPoss[count - 1].x) {
  64849. topPoss.reverse();
  64850. }
  64851. var heights1 = topPoss.map(function (topPos) {
  64852. return topPos.y - groundY;
  64853. });
  64854. return heights1;
  64855. }); //}
  64856. heightss.forEach(function (arr) {
  64857. for (var _i2 = 0; _i2 < count; _i2++) {
  64858. heights[_i2] = (heights[_i2] || 0) + arr[_i2];
  64859. }
  64860. });
  64861. heights = heights.map(function (e) {
  64862. var h = e / heightss.length;
  64863. return h;
  64864. }); //console.log('heightss',heightss, pairs, heights)
  64865. } //拆分成小box
  64866. var size = new THREE.Vector3(aveW, 2, aveW);
  64867. var c = 0;
  64868. infos.rowboxs = [];
  64869. while (c < count) {
  64870. var center = void 0;
  64871. if (k > 1) {
  64872. var startX = centerPos.x - (count - 1) / 2 * aveW;
  64873. center = new THREE.Vector3(startX + c * aveW, centerPos.y, centerPos.z);
  64874. } else {
  64875. var startZ = centerPos.z - (count - 1) / 2 * aveW;
  64876. center = new THREE.Vector3(centerPos.x, centerPos.y, startZ + c * aveW);
  64877. }
  64878. var size1 = heights[c] ? size.clone().setY(heights[c]) : size; //如1*3的是得不到height的
  64879. var box = new Box({
  64880. name: 'row' + i + '-' + c,
  64881. center,
  64882. size: size1,
  64883. boxType: 'cabinet',
  64884. infos
  64885. });
  64886. c++;
  64887. infos.rowboxs.push(box);
  64888. }
  64889. });
  64890. return {
  64891. v: realGroups.length > 0
  64892. };
  64893. }();
  64894. if (typeof _ret === "object") return _ret.v;
  64895. }
  64896. };
  64897. var removeContain = function removeContain(arr) {
  64898. //去除嵌套
  64899. var len = arr.length;
  64900. if (len < 2) return;
  64901. for (var i = 0; i < len - 1; i++) {
  64902. var box0 = arr[i];
  64903. getBoxBase(box0);
  64904. box0.contains = box0.contains || [];
  64905. for (var j = i + 1; j < len; j++) {
  64906. var box1 = arr[j];
  64907. /* if (box0.sid == 'pano2-1' && box1.sid == 'pano2-7') {
  64908. console.log(6)
  64909. } */
  64910. getBoxBase(box1);
  64911. box1.contains = box1.contains || [];
  64912. var d3 = Math.abs(box1.bbox2CenterX - box0.bbox2CenterX); //限制d3是因为在相差180度两端可能也符合
  64913. //d4 = Math.abs(box1.bbox2[3] - box0.bbox2[3])
  64914. if (d3 > 0.4
  64915. /* || d4 > 0.01 */
  64916. ) continue;
  64917. var d0 = getBbox2Diff(box1.bbox2[0], box0.bbox2[0]),
  64918. d1 = getBbox2Diff(box0.bbox2[2], box1.bbox2[2]),
  64919. w0 = getBbox2Diff(box0.bbox2[2], box0.bbox2[0]),
  64920. w1 = getBbox2Diff(box1.bbox2[2], box1.bbox2[0]);
  64921. var min = Math.min(0.005, Math.min(w0, w1) * 0.2); //如果本身w0,w1宽度就小,差距更要小
  64922. if (d1 >= 0 && Math.abs(d0) < min || d0 >= 0 && Math.abs(d1) < min || d1 >= 0 && d0 >= 0) {
  64923. box0.contains.push(box1);
  64924. } else if (d0 <= 0 && Math.abs(d1) < min || d1 <= 0 && Math.abs(d0) < min || d1 <= 0 && d0 <= 0) {
  64925. box1.contains.push(box0);
  64926. }
  64927. }
  64928. }
  64929. var getWidthScore = function getWidthScore(box, type) {
  64930. var addDis = 0.1; //因为用的是btm的pos,比中心点近了一些,所以加上一段距离
  64931. var o = getBoxPoseByPos(box, getBoxPos(box), addDis);
  64932. var boxPjW = o.projectWidth;
  64933. var standardPjW = (o.maxProjectWidth + o.minProjectWidth) / 2;
  64934. var s = type == 'out' ? boxPjW - standardPjW : standardPjW - boxPjW;
  64935. return -Math.pow(s, 2) * 10;
  64936. };
  64937. var minChildCount = arr[0].boxType == 'battery' || arr[0].boxType == 'tv' ? 1 : 2;
  64938. arr.slice().forEach(function (box) {
  64939. if (box.contains.length >= minChildCount) {
  64940. //假设不存在第二层嵌套, 假设每个只能被一个嵌套
  64941. //决定留大还是留小
  64942. //先只去掉包含两个以上的,且角度范围一致
  64943. //尽量保留内层,除非内层太小
  64944. var _getLeftRight2 = getLeftRight(box.contains),
  64945. leftX = _getLeftRight2.leftX,
  64946. rightX = _getLeftRight2.rightX;
  64947. if (box.contains.length > 1 && (Math.abs(getBbox2Diff(box.bbox2[0], leftX)) > 0.005 || Math.abs(getBbox2Diff(box.bbox2[2], rightX)) > 0.005)) return; //范围不一致
  64948. var remainChild = true;
  64949. if (box.contains.length == 1) {
  64950. //cdi6xzNiNdS 电池包含单个 感觉一般都是留大
  64951. remainChild = false;
  64952. } else {
  64953. var outScore = getWidthScore(box, 'out');
  64954. var childrenScores = box.contains.map(function (e) {
  64955. return getWidthScore(e, 'in');
  64956. });
  64957. var childAve = childrenScores.reduce(function (w, c) {
  64958. return w + c;
  64959. }, 0) / childrenScores.length;
  64960. if (childAve < -4) {
  64961. //let outScore = getWidthScore(box, 'out')
  64962. remainChild = childAve > outScore;
  64963. }
  64964. }
  64965. if (!remainChild) {
  64966. box.contains.forEach(function (e) {
  64967. var _console;
  64968. e.state = '因被嵌套被删除', e.containBy = box;
  64969. arr.splice(arr.indexOf(e), 1);
  64970. (_console = console).log.apply(_console, ['因被嵌套被删除'].concat(_toConsumableArray(box.contains)));
  64971. });
  64972. } else {
  64973. box.state = '因嵌套其他被删除';
  64974. console.log('因嵌套其他被删除', box);
  64975. arr.splice(arr.indexOf(box), 1);
  64976. }
  64977. }
  64978. });
  64979. };
  64980. var waitFindRest = [];
  64981. var Search = function Search(type) {
  64982. console.error('开始search', type);
  64983. var matchScoreMap = _this5.matchScoreMap[type] = new Map();
  64984. var datas = {};
  64985. var panoIds = [];
  64986. for (var id in _this5.datas) {
  64987. if (!_this5.datas[id]) continue;
  64988. datas[id] = _this5.datas[id].shapes.filter(function (e) {
  64989. return isType(e.category, type);
  64990. });
  64991. datas[id].length && panoIds.push(id);
  64992. }
  64993. var _loop4 = function _loop4(_id) {
  64994. //对data预处理
  64995. //(之后如果还出现不同类型重叠在一起的,需要先识别摘除下。 )4GqaqNdyjGf
  64996. if (!_this5.datas[_id]) return "continue";
  64997. removeContain(datas[_id]); //去除线框中的嵌套,主要是一个嵌套两个的。案例:KK-1Zjm9Rbl47
  64998. if (datas[_id].length) {
  64999. //融合。很多box被一分为二了,基本都是在全景图左右边界处。
  65000. var bigBoxes = getPanoBigRowBox(datas[_id], {
  65001. reason: 'mix'
  65002. });
  65003. bigBoxes.forEach(function (bigBox) {
  65004. if (bigBox.boxes.length > 1) {
  65005. bigBox.boxes.forEach(function (box) {
  65006. box.state = '被删除', box.mixTo = bigBox;
  65007. var i = datas[_id].indexOf(box);
  65008. datas[_id].splice(i, 1);
  65009. {
  65010. i = _this5.datasMixed[_id].shapes.findIndex(function (e) {
  65011. return e.sid == box.sid;
  65012. });
  65013. _this5.datasMixed[_id].shapes.splice(i, 1);
  65014. }
  65015. });
  65016. console.log('因融合而删除', bigBox.boxes);
  65017. datas[_id].push(bigBox);
  65018. {
  65019. _this5.datasMixed[_id].shapes.push(bigBox);
  65020. }
  65021. var shapes = _this5.datas[_id].shapes;
  65022. bigBox.index = shapes.length > 1 ? shapes[shapes.length - 1].index + 1 : 0;
  65023. {
  65024. var a = bigBox.sid.split('mix-');
  65025. bigBox.sid = a[0] + bigBox.index + '(mix' + a[1] + ')'; //"pano20-mix-1,2"
  65026. }
  65027. }
  65028. });
  65029. }
  65030. };
  65031. for (var _id in _this5.datas) {
  65032. var _ret3 = _loop4(_id);
  65033. if (_ret3 === "continue") continue;
  65034. }
  65035. if (panoIds.length == 0) {
  65036. if (standards[type].tinyXZ) {
  65037. //fire 调试:nZrBdvRaDuC
  65038. _this5.expandModelBound();
  65039. }
  65040. return;
  65041. }
  65042. panoIds.sort(function (a, b) {
  65043. return datas[b].length - datas[a].length;
  65044. });
  65045. var groups = panoIds.map(function (e) {
  65046. return datas[e];
  65047. }); //console.log('按box个数排序:', groups.slice())
  65048. var group0 = groups[0],
  65049. len0 = group0.length;
  65050. if (groups.length == 1) {
  65051. //只有一个全景里有数据
  65052. if (standards[type].tinyXZ) {
  65053. //fire. 无法match以获取groundY, 就取消。 调试: eGhyf5QdVHA
  65054. _this5.expandModelBound(type);
  65055. }
  65056. group0.forEach(function (e) {
  65057. return createSinglePano(e);
  65058. });
  65059. return combines(type);
  65060. }
  65061. var finish = function finish(groups) {
  65062. waitFindRest.push({
  65063. type,
  65064. args: [groups]
  65065. }); //等待最后检查遗漏
  65066. if (standards[type].tinyXZ) {
  65067. //fire 调试:nZrBdvRaDuC
  65068. _this5.confirmGroundY(type);
  65069. }
  65070. if (standards[type].tiny) {
  65071. //monitor 调试:S9yepREK8Jl
  65072. _this5.expandModelBound2(type);
  65073. }
  65074. };
  65075. if (len0 == 1) {
  65076. //最多的也只有一个box。此情况大部分是空调
  65077. panoIds.forEach(function (e) {
  65078. return getBoxBase(datas[e][0]);
  65079. });
  65080. for (var i = 0; i < panoIds.length; i++) {
  65081. var box0 = datas[panoIds[i]][0];
  65082. for (var j = i + 1; j < panoIds.length; j++) {
  65083. var box1 = datas[panoIds[j]][0];
  65084. getMatchScore(box0, box1, {
  65085. isSingle: true
  65086. });
  65087. }
  65088. }
  65089. /* let list = Object.keys(matchScoreMap)
  65090. list.sort((a, b) => {
  65091. return matchScoreMap[b].score - matchScoreMap[a].score
  65092. })
  65093. let match = matchScoreMap[list[0]] */
  65094. var list = Array.from(matchScoreMap).map(function (e) {
  65095. return e[1];
  65096. }).sort(function (a, b) {
  65097. return b.score - a.score;
  65098. });
  65099. var match = list[0];
  65100. preDealBox(match);
  65101. if (match.score > -100) {
  65102. getBoxSize(match);
  65103. if (match.score > 0 && match.sizeAdjust < 0.1) {
  65104. new Box(match); //waitFindRest.push({ type, args: [groups] }) //等待最后检查遗漏
  65105. finish(groups);
  65106. return;
  65107. }
  65108. } //根据分数重排序,前两个已匹配的pano放在第一第二(reMatchLowScores会跳过),获得groups2
  65109. var panoIds2 = [];
  65110. /* list.forEach(e => {
  65111. let info = matchScoreMap[e]
  65112. if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id)
  65113. if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id)
  65114. }) */
  65115. list.forEach(function (info) {
  65116. if (!panoIds2.includes(info.box0.pano.id)) panoIds2.push(info.box0.pano.id);
  65117. if (!panoIds2.includes(info.box1.pano.id)) panoIds2.push(info.box1.pano.id);
  65118. });
  65119. var groups2 = panoIds2.map(function (e) {
  65120. return datas[e];
  65121. }); //继续match
  65122. reMatchLowScores([match], groups2);
  65123. finish(groups2);
  65124. return;
  65125. }
  65126. {
  65127. //重新根据距离排序,挑选离所有box距离最近的两个pano (远的可能看不到box,或者得到的线框计算的位置不准。不过其实太近也不准-,-)
  65128. var counts = {};
  65129. groups.forEach(function (e) {
  65130. e.forEach(function (a) {
  65131. return getBoxBase(a);
  65132. });
  65133. counts[e.length] || (counts[e.length] = []);
  65134. counts[e.length].push(e);
  65135. });
  65136. groups = [];
  65137. standards[type].atWall;
  65138. var nums = Object.keys(counts);
  65139. var bestDisSquared = 2;
  65140. nums.reverse();
  65141. nums.forEach(function (count) {
  65142. var _groups;
  65143. var groups_ = counts[count];
  65144. if (groups_.length > 1) {
  65145. groups_.forEach(function (e) {
  65146. e.disSc = e.reduce(function (w, c) {
  65147. var pos = getBoxPos(c); //let s = atWall ? Math.pow(Math.abs(c.centerDir.y), 3)*100 : 0 //在墙上的话尽量平视
  65148. //console.log(c.sid,s)
  65149. if (!pos) {
  65150. getBoxPos(c);
  65151. }
  65152. return w + Math.abs(c.pano.position.distanceToSquared(pos) - bestDisSquared); //+ s
  65153. }, 0);
  65154. });
  65155. groups_.sort(function (a, b) {
  65156. return a.disSc - b.disSc;
  65157. });
  65158. }
  65159. (_groups = groups).push.apply(_groups, _toConsumableArray(groups_));
  65160. }); //console.log('按距离和个数排序:', groups)
  65161. group0 = groups[0];
  65162. len0 = group0.length;
  65163. }
  65164. if (type == 'cabinet') {
  65165. //转化为分组
  65166. if (searchByRow(groups)) {
  65167. waitFindRest.push({
  65168. type,
  65169. args: [groups, 0]
  65170. }); //等待最后检查遗漏
  65171. return;
  65172. }
  65173. } //零散匹配。
  65174. var match2Group = function match2Group(group0, group1) {
  65175. var _ref6 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  65176. fake = _ref6.fake;
  65177. group0.length;
  65178. group1.length;
  65179. /* for (let i = 0; i < len0; i++) {
  65180. //复杂度:n的平方次
  65181. for (let j = 0; j < len1; j++) {
  65182. let box1 = group0[i]
  65183. let box2 = group1[j]
  65184. let result = getMatchScore(box1, box2)
  65185. }
  65186. } */
  65187. //寻找最佳配对 n!种组合(是否要限制个数多的情况?) 超过8个就很恐怖
  65188. //仅先查找选中的两个pano配对
  65189. var resultPairs = [];
  65190. var newGroup0 = group0.slice(0);
  65191. var newGroup1 = group1.slice(0);
  65192. /* while (newGroup1.length < newGroup0.length) {
  65193. newGroup1.push({ sid: 'void' }) //为了使排列正确,补个空,使左右两边个数相等,过后和void匹配的不会计算box
  65194. } */
  65195. var evaluateFun = getMatchScore.bind(_this5);
  65196. searchPair(
  65197. /* group0[0] */
  65198. null, newGroup0, newGroup1, null, resultPairs, evaluateFun);
  65199. /* console.log(
  65200. 'resultPairs',
  65201. resultPairs.map(pairs => pairs.map(pair => pair.map(item => item.sid).join(' & ')))
  65202. ) */
  65203. resultPairs = resultPairs.map(function (pairs) {
  65204. var infos = pairs.map(function (pair) {
  65205. return getMatchScore(pair[0], pair[1]);
  65206. }); //matchScoreMap[pair[0].sid + '&' + pair[1].sid])
  65207. var score = infos.reduce(function (s, e) {
  65208. return s + (e ? e.score : 0);
  65209. }, 0);
  65210. var o = {
  65211. infos,
  65212. score,
  65213. pairs,
  65214. name: pairs.map(function (pair) {
  65215. return pair.map(function (item) {
  65216. return item.sid;
  65217. }).join(' & ');
  65218. })
  65219. };
  65220. return o;
  65221. }); //console.log('resultPairs', resultPairs.slice())
  65222. console.log('resultPairs按分数高低', resultPairs.sort(function (a, b) {
  65223. return b.score - a.score;
  65224. })); //console.log('compu',compu)
  65225. var minScore = boundConfirmed ? -2000 : -800;
  65226. var noMatches = []; //和void匹配的,需要和其他pano的重新匹配
  65227. var lowScores = [];
  65228. if (resultPairs[0]) {
  65229. resultPairs[0].infos.forEach(function (info, i) {
  65230. if (!info) {
  65231. noMatches.push(resultPairs[0].pairs[i].find(function (e) {
  65232. return e.sid != 'void';
  65233. }));
  65234. return; //match with void
  65235. }
  65236. if (info.score < minScore || standards[info.boxType].bottom && info.minAng < 5) {
  65237. lowScores.push(info);
  65238. return;
  65239. }
  65240. preDealBox(info);
  65241. getBoxSize(info);
  65242. if (info.sizeAdjust && standards[info.boxType].tiny || info.sizeAdjust > 0.2) {
  65243. //或者识别下悬挂的且线的角度较小
  65244. lowScores.push(info);
  65245. return;
  65246. }
  65247. if (info.box0.category == typeNames.battery && info.size.x < 1 && info.size.z < 1) {
  65248. //宽度较小
  65249. var vec0 = new THREE.Vector3().subVectors(info.box0.pano.position, getBoxPos(info));
  65250. var vec1 = new THREE.Vector3().subVectors(info.box1.pano.position, getBoxPos(info));
  65251. /* let k0 = Math.abs(vec0.x / vec0.z), k1 = Math.abs(vec1.x / vec1.z), maxR = 6
  65252. if(info.name == '') */
  65253. if (vec0.x * vec1.x > 0 && vec0.z * vec1.z > 0
  65254. /* || k0/k1 > maxR || k0/k1 < 1/maxR */
  65255. ) {
  65256. //同一个象限 或 偏向一侧
  65257. lowScores.push(info);
  65258. return;
  65259. }
  65260. }
  65261. info.fake = fake;
  65262. new Box(info);
  65263. });
  65264. }
  65265. if (noMatches.length) {
  65266. reMatchLowScores(noMatches.map(function (e) {
  65267. return {
  65268. box0: e
  65269. };
  65270. }), groups, {
  65271. fake
  65272. });
  65273. }
  65274. reMatchLowScores(lowScores, groups, {
  65275. fake
  65276. });
  65277. };
  65278. {
  65279. if (!standards[type].tinyXZ
  65280. /* && !browser.urlHasValue('many') */
  65281. ) {
  65282. var disScores = []; //KJ-iUrPonbhCQo 大的场景有很多柜子时,groups的前两个元素很可能相隔很远,导致匹配不到柜子。
  65283. for (var _i3 = 0; _i3 < groups.length - 1; _i3++) {
  65284. var disSqure = groups[_i3][0].pano.position.distanceToSquared(groups[_i3 + 1][0].pano.position);
  65285. var disScore = math$2.linearClamp(disSqure, [0, 0.4, 2, 6, 100], [-10, 0, 10, 5, -100]);
  65286. var score = disScore + (groups[_i3].length + groups[_i3 + 1].length);
  65287. disScores.push({
  65288. score,
  65289. i: _i3,
  65290. disSqure,
  65291. length1: groups[_i3].length,
  65292. length2: groups[_i3 + 1].length
  65293. });
  65294. }
  65295. disScores.sort(function (a, b) {
  65296. return b.score - a.score;
  65297. });
  65298. match2Group(groups[disScores[0].i], groups[disScores[0].i + 1]); //只匹配前两个
  65299. } else {
  65300. for (var _i4 = 0; _i4 < groups.length - 1; _i4++) {
  65301. //fire 全部匹配
  65302. match2Group(groups[_i4], groups[_i4 + 1], {
  65303. fake: _i4 > 0
  65304. });
  65305. if (groups[_i4 + 1].length < 2) break;
  65306. }
  65307. }
  65308. }
  65309. finish(groups);
  65310. };
  65311. function blocked(box) {
  65312. //该box是否被实体box遮挡
  65313. //WcLVXvmV9AU:pano2-2 和 pano12-4 ; 5yhlMduTHL8:pano2-10
  65314. /* if (box.sid == 'pano6-7') {
  65315. console.log(1)
  65316. addLine(box.pano.position, box.centerBtmDir, 20)
  65317. } */
  65318. if (!standards[box.boxType].bottom) {
  65319. //当底部每个方向都有遮挡物时,其位置很可能不准。但若是部分遮住,还是有可能识别对的
  65320. if (!box.blocked) {
  65321. box.blocked = {
  65322. centerBtmDir: null,
  65323. leftBtmDir: null,
  65324. rightBtmDir: null
  65325. };
  65326. }
  65327. var _loop5 = function _loop5(dir) {
  65328. if (!box.blocked[dir]) {
  65329. var block = boxesSolid.find(function (boxSolid) {
  65330. ray.set(box.pano.position, box[dir]); //这里不用判断距离吗?已经忘了当初怎么想的了。发现大多数block的都是自身
  65331. var o = ray.ray.intersectsBox(boxSolid.bound);
  65332. if (o) {
  65333. // 遮挡
  65334. return true;
  65335. }
  65336. });
  65337. if (block) {
  65338. //若不存在,即都遮挡了,就算真的遮挡
  65339. box.blocked[dir] = block;
  65340. } else {
  65341. box.blocked[dir] = false;
  65342. return {
  65343. v: false
  65344. }; //找到一个方向无遮挡则可返回
  65345. }
  65346. }
  65347. };
  65348. for (var dir in box.blocked) {
  65349. var _ret4 = _loop5(dir);
  65350. if (typeof _ret4 === "object") return _ret4.v;
  65351. }
  65352. return true; //暂定,若某个方向已得到遮挡了,就不计算。但若没有,就再搜一遍(如果会重复搜之后再增加一个stamp啥的,比如记录下当前所有solidBoxes的name,如果改变了就重新搜下)
  65353. } else {
  65354. //若中心方向已经有同类型的box,很可能它就是自身(因为挂墙的预测位置很不准,所以需要这一步。越tiny的越能通过此来筛选)
  65355. var block = boxesSolid.find(function (boxSolid) {
  65356. if (boxSolid.boxType != box.boxType) return;
  65357. ray.set(box.pano.position, box.centerDir);
  65358. var o = ray.ray.intersectsBox(boxSolid.bound);
  65359. if (o) {
  65360. // 遮挡
  65361. return true;
  65362. }
  65363. });
  65364. if (block) {
  65365. box.blocked = block;
  65366. return true;
  65367. }
  65368. }
  65369. } //调试 O540aEVF3b7 jQUQlER160 n4z0yd5tQaF WcLVXvmV9AU 8czlwsbSe5 NlUM8yGve9
  65370. function findRest(groups
  65371. /* ,startIndex=2 */
  65372. ) {
  65373. //查找是否有遗漏。
  65374. //1 可能有距离较远的box不在头两个pano的附近导致被漏掉。(概率很小)
  65375. //2 被剩余的 (包括低分匹配中放弃的,这种需要的距离识别度高)
  65376. var tolerateWidth = {
  65377. min: 0.1,
  65378. max: 0.5
  65379. };
  65380. var boxes = [],
  65381. scores = new Map(),
  65382. bestDisSquared = 2;
  65383. groups.forEach(function (g) {
  65384. var _boxes;
  65385. (_boxes = boxes).push.apply(_boxes, _toConsumableArray(g));
  65386. });
  65387. boxes = boxes.filter(function (box) {
  65388. return !used(box);
  65389. });
  65390. boxes.forEach(function (box) {
  65391. if (box.sid == 'pano2-0') {
  65392. console.log(4);
  65393. }
  65394. getBoxBase(box);
  65395. var p1 = new THREE.Vector2(box.pano.position.x, box.pano.position.z);
  65396. var p2 = new THREE.Vector2(box.btmPos.x, box.btmPos.z);
  65397. var dis = p1.distanceToSquared(p2);
  65398. var s1 = -Math.abs(dis - bestDisSquared); //将距离最佳的排前面,距离远的得到的位置不准确,也容易被遮
  65399. if (!box.pose) box.pose = getBoxPoseByPos(box, getBoxPos(box));
  65400. var s2 = getPoseScore([box.pose], box.boxType) + THREE.MathUtils.clamp(box.pose.projectWidth, box.pose.minProjectWidth, box.pose.maxProjectWidth) * 7; //projectWidth长的更安全
  65401. scores.set(box, {
  65402. s1,
  65403. s2,
  65404. sum: s1 + s2
  65405. });
  65406. }); //console.log(boxes[0].boxType,scores)
  65407. boxes = boxes.sort(function (a, b) {
  65408. return scores.get(b).sum - scores.get(a).sum;
  65409. }); //FXcq5PI9QGv
  65410. //console.log(boxes)
  65411. boxes.forEach(function (box) {
  65412. if (box.sid == 'pano0-4') {
  65413. console.log(3);
  65414. }
  65415. if (!used(box) && !blocked(box)) {
  65416. //如果和现有的box的距离都很远,很可能是漏掉的
  65417. var near = boxesSolid.find(function (solidBox) {
  65418. if (solidBox.name == 'air-pano16-7&pano14-13') {
  65419. console.log(3);
  65420. }
  65421. if (solidBox.boxType != box.boxType && (solidBox.boxType == 'air-hanging' || box.boxType == 'air-hanging')) return; //挂空调一般不会撞到地面上的
  65422. var p1 = getBoxPos(solidBox);
  65423. var p2 = getBoxPos(box);
  65424. new THREE.Vector2(p1.x, p1.z);
  65425. new THREE.Vector2(p2.x, p2.z);
  65426. var maxWidth = standards[box.boxType].widthNormal.max / 2;
  65427. maxWidth = THREE.MathUtils.clamp(maxWidth, tolerateWidth.min, tolerateWidth.max); //因为场景精度存在较大误差,所以maxWidth不能过小,否则像灭火器摄像头都容易findRest多个
  65428. var dis = solidBox.bound.distanceToPoint(p2); //let r0 = solidBox.boxType == 'air' ? 2 : solidBox.boxType == 'battery' ? 1.1 : 1 //空调最不容易扎堆放置,所以范围设置广一些
  65429. var r0 = standards[box.boxType].closeRatio;
  65430. var r1 = math$2.linearClamp(box.pano.position.distanceTo(p2), 3, 20, 1, 5); //距离远的话识别、计算都会更不准确,给一定的容错. 远的尽量不findRest,即尽量>0
  65431. var ra = (solidBox.boxType == box.boxType ? 1 : 0.5) * r0 * r1; //数字越小限制越大
  65432. /* let a = maxWidth * maxWidth * ra - p1_.distanceToSquared(p2_)
  65433. let b = -dis * dis * 0.7
  65434. let c = a + b*/
  65435. var c = maxWidth * ra - dis * 1.3;
  65436. /* if (c > 0) {
  65437. //太近 不创建
  65438. console.log(1)
  65439. } */
  65440. return c > 0;
  65441. });
  65442. if (!near) {
  65443. reMatchLowScores([{
  65444. box0: box,
  65445. log: 'findRest'
  65446. }], groups, {
  65447. startIndex: 0
  65448. });
  65449. }
  65450. }
  65451. });
  65452. }
  65453. function used(box) {
  65454. //是否已经使用过
  65455. var has = function has(e) {
  65456. return e.box0 == box || e.box1 == box;
  65457. };
  65458. var traverse = function traverse(e) {
  65459. return has(e) || e.list && e.list.some(function (a) {
  65460. return traverse(a);
  65461. }) || e.mixedFrom && e.mixedFrom.some(function (a) {
  65462. return traverse(a);
  65463. }) || e.infos && e.infos.some(function (u) {
  65464. return u.group.some(function (r) {
  65465. return r.boxes.some(function (b) {
  65466. return b == box;
  65467. });
  65468. });
  65469. }); //row
  65470. };
  65471. return boxesSolid.some(function (e) {
  65472. return traverse(e);
  65473. });
  65474. }
  65475. function reMatchLowScores(lowScores, groups) {
  65476. var _ref7 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  65477. _ref7$startIndex = _ref7.startIndex,
  65478. startIndex = _ref7$startIndex === void 0 ? 2 : _ref7$startIndex,
  65479. fake = _ref7.fake;
  65480. var tooLows = [];
  65481. var minScore = boundConfirmed ? -2000 : -800;
  65482. var isSameMatch = function isSameMatch(match0, match1) {
  65483. //是否对应同一个box实体(不一定准),通过两两box之间是否都match来判断
  65484. //如果是相同pano但不同的box肯定不是对应同一个box实体
  65485. var ifWrong = function ifWrong(box0, box1) {
  65486. if (box0 == box1) return;
  65487. if (box0.pano == box1.pano) return true;
  65488. var match2 = getMatchScore(box0, box1, {
  65489. isSingle: true,
  65490. restMatch: true
  65491. });
  65492. if (match2.score < minScore) return true;
  65493. };
  65494. if (ifWrong(match0.box0, match1.box0) || ifWrong(match0.box1, match1.box1) || ifWrong(match0.box0, match1.box1) || ifWrong(match0.box1, match1.box0)) return;
  65495. return true;
  65496. };
  65497. if (lowScores.length) {
  65498. //console.warn(lowScores[0].log || (lowScores[0].box1 ? '低分重新匹配' : '剩余匹配'), lowScores[0].box0.boxType, ...lowScores)
  65499. if (lowScores[0].box1) {
  65500. lowScores.sort(function (a, b) {
  65501. //低分优先
  65502. return a.score - b.score;
  65503. });
  65504. }
  65505. lowScores.forEach(function (info) {
  65506. //info中的box0和box1分别向后寻找其他的配对。选择分数高的配对。 但box0和box1可能是错误配对,会导致找到了替代的也可能遗漏。
  65507. /* if (info.name == 'pano0-3&pano2-3') {
  65508. console.log(1)
  65509. } */
  65510. var box01 = info.box0;
  65511. var box02 = info.box1;
  65512. var bigGroup = [];
  65513. box02 && bigGroup.push(info);
  65514. var _loop6 = function _loop6(cur) {
  65515. var thirdGroup = groups[cur];
  65516. var scores0 = [],
  65517. scores1 = [];
  65518. thirdGroup.forEach(function (box1) {
  65519. //if (matched.includes(box1.sid)) return
  65520. if (used(box1)) return; //会不会太严格?
  65521. if (box1.pano != box01.pano && box1 != box02) {
  65522. var r1 = getMatchScore(box01, box1, {
  65523. isSingle: true,
  65524. restMatch: true
  65525. });
  65526. r1.score > minScore * 1.5 && scores0.push(r1);
  65527. }
  65528. if (box02 && box1.pano != box02.pano && box1 != box01) {
  65529. var r2 = getMatchScore(box02, box1, {
  65530. isSingle: true,
  65531. restMatch: true
  65532. });
  65533. r2.score > minScore * 1.5 && scores1.push(r2);
  65534. }
  65535. });
  65536. scores0.sort(function (a, b) {
  65537. return b.score - a.score;
  65538. });
  65539. scores1.sort(function (a, b) {
  65540. return b.score - a.score;
  65541. });
  65542. scores0[0] && bigGroup.push(scores0[0]);
  65543. scores1[0] && bigGroup.push(scores1[0]);
  65544. };
  65545. for (var cur = startIndex; cur < groups.length; cur++) {
  65546. _loop6(cur);
  65547. }
  65548. bigGroup.sort(function (a, b) {
  65549. return b.score - a.score;
  65550. });
  65551. var goodList = bigGroup.slice(0, 10).map(function (e) {
  65552. if (!getBoxPos(e)) return e;
  65553. preDealBox(e);
  65554. getBoxSize(e);
  65555. return e;
  65556. });
  65557. var goodList2 = goodList.sort(function (a, b) {
  65558. return b.score - a.score;
  65559. }).slice(0, 3);
  65560. if (goodList2.length == 0) {
  65561. return fake || createSinglePano(box01, 0.6); //minScorePercent原因:剩余匹配时位置不太好的案例: AhMgXXjM15
  65562. }
  65563. if (goodList2[0].score > minScore * 0.65) {
  65564. goodList2 = goodList2.filter(function (e) {
  65565. return e.score > minScore * 0.65;
  65566. });
  65567. } else {
  65568. /* goodList2 = [goodList2[0]] // 最高分已经过小
  65569. if (goodList2[0].score < -1500) { */
  65570. if (!box02) {
  65571. if (info.log == 'findRest' || getBoxPos(box01).distanceTo(box01.pano.position) < 2.5) {
  65572. //远距离不准,留到过后findRest
  65573. fake || createSinglePano(box01);
  65574. }
  65575. return;
  65576. } //console.warn('分数过低,是否有匹配错误?', goodList2[0])
  65577. return tooLows.push(goodList2[0]); //}
  65578. }
  65579. if (goodList2.length) {
  65580. //需要确认两两之间是配对的,也就是都对应同一个box
  65581. var subGroups = [],
  65582. boxes = [];
  65583. var _loop7 = function _loop7(i, len) {
  65584. //向后选择队友
  65585. var match0 = goodList2[i];
  65586. if (subGroups.some(function (e) {
  65587. return e.includes(match0);
  65588. })) return "continue"; //被挑选了的没有选择权
  65589. var gr = [match0];
  65590. for (var j = i + 1; j < len; j++) {
  65591. var match1 = goodList2[j];
  65592. if (isSameMatch(match0, match1)) {
  65593. //可能不是同一个,所以需要检验
  65594. gr.push(match1);
  65595. }
  65596. } //if(gr.length>1){
  65597. subGroups.push(gr); //}
  65598. };
  65599. for (var i = 0, len = goodList2.length; i < len; i++) {
  65600. var _ret5 = _loop7(i, len);
  65601. if (_ret5 === "continue") continue;
  65602. } //console.log('lowScores subGroups', subGroups)
  65603. subGroups.forEach(function (pair) {
  65604. boxes.push(mixMatchBox(pair, lowScores[0].log, fake));
  65605. });
  65606. fake || combineBoxes(boxes); //很可能其实还是同一个,需要检验是否要融合
  65607. }
  65608. }); //改为之后 findRest, 因为两者都single的可能性低
  65609. /* let judge = box => {
  65610. if (!used(box)) {
  65611. matched.push(box)
  65612. createSinglePano(box)
  65613. }
  65614. }
  65615. tooLows.forEach(e => {
  65616. judge(e.box0)
  65617. judge(e.box1)
  65618. }) */
  65619. }
  65620. }
  65621. function mixMatchBox(list, log, fake) {
  65622. var center = new THREE.Vector3(),
  65623. size = new THREE.Vector3(),
  65624. bound = new THREE.Box3();
  65625. list.forEach(function (e) {
  65626. var _bound = new THREE.Box3().setFromCenterAndSize(getBoxFinalPos(e), e.size);
  65627. bound.union(_bound);
  65628. }); //bound.getCenter(center) //这两种获得center的方法哪个准?
  65629. bound.getSize(size);
  65630. list.forEach(function (e) {
  65631. return center.add(e.center
  65632. /* getBoxPos(e) */
  65633. );
  65634. });
  65635. center.multiplyScalar(1 / list.length);
  65636. var _ref8 = list.find(function (e) {
  65637. return e.xProp;
  65638. }) || {},
  65639. xProp = _ref8.xProp,
  65640. yProp = _ref8.yProp;
  65641. if (xProp && list.find(function (e) {
  65642. return e.xProp && e.xProp != xProp;
  65643. })) {
  65644. //如果有不同的话
  65645. xProp = yProp = null;
  65646. }
  65647. var prefix = log == 'findRest' ? 'rest:' : 'low:';
  65648. var object = {
  65649. name: prefix + list.map(function (e) {
  65650. return e.name;
  65651. }),
  65652. boxType: list[0].boxType,
  65653. center,
  65654. size,
  65655. list,
  65656. xProp,
  65657. yProp
  65658. };
  65659. var o = restrictSize(size.x, size.y, size.z, object);
  65660. size.x = o.x;
  65661. size.y = o.y;
  65662. size.z = o.z;
  65663. object.fake = fake;
  65664. var box = new Box(object); //console.log('mixMatchBox', box)
  65665. return box;
  65666. }
  65667. function combineBoxes(boxes, typeCount) {
  65668. //调试 tY4ot33f8vT UWrshepp0G5的一高一低的电箱
  65669. //判断这些实体boxes是否需要合并 主要用于重复识别(重叠面积较大)
  65670. var group = [];
  65671. if (boxes.length > 1) {
  65672. var boxType = boxes[0].boxType;
  65673. var _standards$boxType$wi3 = standards[boxType].widthNormal;
  65674. _standards$boxType$wi3.min;
  65675. var max = _standards$boxType$wi3.max; //let aveSize = ( min + max ) / 2
  65676. var maxX = max,
  65677. maxZ = max,
  65678. maxY = standards[boxType].height.max;
  65679. standards[boxType].height.min; //aveSizeY = (maxY + minY) / 2
  65680. for (var i = 0, len = boxes.length; i < len - 1; i++) {
  65681. var box0 = boxes[i];
  65682. if (box0.fake) continue;
  65683. for (var j = i + 1; j < len; j++) {
  65684. var box1 = boxes[j];
  65685. if (box1.fake) continue;
  65686. var bound = box0.bound.clone().union(box1.bound);
  65687. var size = bound.getSize(new THREE.Vector3());
  65688. var intersect = box0.bound.intersectsBox(box1.bound);
  65689. if (box0.name == 'desk-pano21-0' && box1.name == 'desk-pano20-0') {
  65690. console.log(1);
  65691. }
  65692. var maxR = intersect ? 1.5 : 1.3,
  65693. rX = size.x / maxX,
  65694. rY = size.y / maxY,
  65695. rZ = size.z / maxZ;
  65696. if (rX < maxR && rY < maxR && rZ < maxR) {
  65697. common$1.pushToGroupAuto([box0, box1], group);
  65698. }
  65699. /* if (box0.xProp && box1.xProp && box0.xProp == box1.xProp) {
  65700. maxX = standards[boxType][box0.xProp].max
  65701. maxZ = standards[boxType][box0.yProp].max
  65702. if (box0.boxType != box1.boxType) {
  65703. //air & airSmart
  65704. maxX = Math.max(maxX, standards[box1.boxType][box1.xProp].max)
  65705. maxZ = Math.max(maxZ, standards[box1.boxType][box1.yProp].max)
  65706. }
  65707. }
  65708. maxX = Math.max(maxX, box0.size.x, box1.size.x) //必须大于各自的size,否则无法去除本身就oversize的box中包含的
  65709. maxZ = Math.max(maxZ, box0.size.z, box1.size.z)
  65710. maxY = Math.max(maxY, box0.size.y, box1.size.y)*/
  65711. /*let r = intersect ? 1.5 : 1.3 /* //如果是没有交集,限制更大些
  65712. //若需要更精确的结果,可以getMixBox算出重叠面积,重叠少,且各自都不太小,就不合并。但考虑到电池边界很模糊,合并了也无大碍。
  65713. if (box0.boxType == 'battery') {
  65714. r *= 1.3 //比较可能扎堆
  65715. }
  65716. let maxDiff = 0.4,
  65717. maxDiffX = maxDiff,
  65718. maxDiffZ = maxDiff,
  65719. rx = r,
  65720. rz = r
  65721. if (standards[box0.boxType].atWall == 1) {
  65722. //在墙面上不可能叠放,所以厚度限制可放宽
  65723. let s = 4
  65724. if (box0.yProp == 'width') {
  65725. maxDiffX *= s
  65726. rx *= s
  65727. } else if (box0.xProp == 'width') {
  65728. maxDiffZ *= s
  65729. rz *= s
  65730. }
  65731. } */
  65732. /* 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) {
  65733. //总size不会太大
  65734. common.pushToGroupAuto([box0, box1], group)
  65735. } */
  65736. //改为如果两者的mixbound 比最小的width大不了多少,尤其是重合率高的
  65737. /* let maxDiff = intersect ? 0.5 : 0.3
  65738. let maxR = intersect ? 1.5 : 1.3
  65739. let diffX = size.x - minX,
  65740. diffY = size.y - minY,
  65741. diffZ = size.z - minZ,
  65742. rX = size.x / minX,
  65743. rY = size.y / minY,
  65744. rZ = size.z / minZ
  65745. if (diffX < maxDiff && diffY < maxDiff && diffZ < maxDiff && rX < maxR && rY < maxR && rZ < maxR) {
  65746. common.pushToGroupAuto([box0, box1], group)
  65747. } */
  65748. }
  65749. }
  65750. if (group.length) {
  65751. //虽然如果三个以上可能会超出maxWidth。 不过3个的概率很低,且可以限制宽度
  65752. group.forEach(function (pair) {
  65753. var boxTypes = [];
  65754. var bound = new THREE.Box3();
  65755. pair.forEach(function (e) {
  65756. bound.union(e.bound);
  65757. e.dispose();
  65758. if (typeCount > 1) {
  65759. //判断boxType: 寻找所使用的box总分最高的boxType
  65760. var a = boxTypes.find(function (a) {
  65761. return a.boxType == e.boxType;
  65762. });
  65763. var score = 0;
  65764. var add = function add(box) {
  65765. box && (score += box.score);
  65766. };
  65767. e.traversePair(function (e) {
  65768. add(e.box0);
  65769. add(e.box1);
  65770. });
  65771. if (a) {
  65772. a.score += score;
  65773. } else {
  65774. boxTypes.push({
  65775. score,
  65776. boxType: e.boxType
  65777. });
  65778. }
  65779. }
  65780. });
  65781. if (typeCount > 1) {
  65782. boxTypes.sort(function (a, b) {
  65783. return b.score - a.score;
  65784. });
  65785. boxType = boxTypes[0].boxType;
  65786. }
  65787. var size = bound.getSize(new THREE.Vector3());
  65788. var center = bound.getCenter(new THREE.Vector3());
  65789. var _ref9 = pair.find(function (e) {
  65790. return e.xProp;
  65791. }) || {},
  65792. xProp = _ref9.xProp,
  65793. yProp = _ref9.yProp;
  65794. if (xProp && pair.find(function (e) {
  65795. return e.xProp && e.xProp != xProp;
  65796. })) {
  65797. //如果有不同的话
  65798. xProp = yProp = null;
  65799. }
  65800. var info = {
  65801. name: 'mix:' + pair.map(function (e) {
  65802. return ' ' + e.name;
  65803. }),
  65804. mixedFrom: pair,
  65805. boxType,
  65806. center,
  65807. size,
  65808. xProp,
  65809. yProp
  65810. };
  65811. var o = restrictSize(size.x, size.y, size.z, info);
  65812. size.x = o.x;
  65813. size.y = o.y;
  65814. size.z = o.z;
  65815. var box = new Box(info);
  65816. console.error('混合', boxType, pair, box);
  65817. });
  65818. }
  65819. }
  65820. }
  65821. function combines(types) {
  65822. //合并boxSolids . battery经常嵌套
  65823. if (!(types instanceof Array)) types = [types];
  65824. var boxes = boxesSolid.filter(function (e) {
  65825. return types.includes(e.boxType);
  65826. });
  65827. combineBoxes(boxes, types.length);
  65828. }
  65829. var createSinglePano = function createSinglePano(box) {
  65830. var minScorePercent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  65831. //仅用一个pano中的data来创建。 悬挂于墙上的准确性依赖于墙的准确性。
  65832. /* if (box.score < MinBoxInitialScore) {
  65833. //如Xszq2fv03b的电池pano8-0其实是纸箱、 WZQoMbNmNTu的pano14-0分数0.649
  65834. return console.error('取消createSinglePano: 线框识别分数低,可能错误', box.sid, box)
  65835. } */
  65836. getBoxBase(box);
  65837. var center = getBoxPos(box);
  65838. if (safeBound.distanceToPoint(center) > 0) {
  65839. return console.log('取消createSinglePano:超出safebound', box); //可能是错误的线框,如H7pg1tO9oeJ pano8-1
  65840. }
  65841. var info = {
  65842. name: box.sid,
  65843. box0: box,
  65844. center,
  65845. topPos: box.topPos,
  65846. btmPos: box.btmPos,
  65847. xProp: box.xProp,
  65848. yProp: box.yProp
  65849. };
  65850. preDealBox(info);
  65851. var minScore = -500 * minScorePercent; //调试 3MnIWabM6ne Tmo1vLp9Q13
  65852. var a = getPoseScore(info.boxposes, box.boxType);
  65853. /* if (!standards[box.boxType].bottom && box.btmPos) {
  65854. a -= (box.btmPos.y - groundY) * 3000 //底部被遮住一部分(但是像vHC1GfkdKtD在户外,容易底部变高到bound外去怎么办)
  65855. } */
  65856. var failed = a < minScore;
  65857. console.log('createSinglePano', failed ? '失败' : '成功', 'pose score:', a, box.sid, box);
  65858. if (failed) return; //addLabel(center, 'center', { a: 0.3 })
  65859. //info.topPos && addLabel(info.topPos, 'topPos', { a: 0.3 })
  65860. info.score = a;
  65861. if (box.sid == 'pano10-1') {
  65862. console.log(7);
  65863. }
  65864. getBoxSize(info);
  65865. new Box(info);
  65866. }; //去除挨得很近的漫游点,因为两个接近的点match出的值误差很大
  65867. {
  65868. _this5.removedDatas = {};
  65869. var panoIds = Object.keys(_this5.datas).filter(function (id) {
  65870. if (!player$c.model.panos.index[id]) {
  65871. //排除数据错误
  65872. _this5.removedDatas[id] = _this5.datas[id];
  65873. delete _this5.datas[id]; //console.log('???', id)
  65874. return;
  65875. }
  65876. return true;
  65877. });
  65878. var len = panoIds.length;
  65879. for (var i = 0; i < len; i++) {
  65880. var pano0 = player$c.model.panos.index[panoIds[i]];
  65881. for (var j = i + 1; j < len; j++) {
  65882. var pano1 = player$c.model.panos.index[panoIds[j]];
  65883. if (pano0.position.distanceToSquared(pano1.position) < 0.01) {
  65884. //离的很近。保留shape多的那个data
  65885. var remove = void 0;
  65886. if (_this5.datas[panoIds[i]].shapes.length > _this5.datas[panoIds[j]].shapes.length) {
  65887. remove = panoIds[j];
  65888. } else {
  65889. remove = panoIds[i];
  65890. }
  65891. console.log("\u5220\u9664pano".concat(remove, "\u7684data\uFF0C\u56E0pano").concat(panoIds[i], "\u548Cpano").concat(panoIds[j], "\u5F88\u8FD1"));
  65892. _this5.removedDatas[remove] = _this5.datas[remove];
  65893. delete _this5.datas[remove];
  65894. }
  65895. }
  65896. }
  65897. } //this.expandModelBound()
  65898. // if (version == 'vision') this.datasMixed = common.CloneObject(this.datas, null, [player.model.panos.list[0].constructor])
  65899. _this5.datasMixed = common$1.CloneObject(_this5.datas, null, undefined, function (data) {
  65900. return data['category'];
  65901. });
  65902. /* Search('cabinet')
  65903. Search('air')
  65904. Search('battery') */
  65905. for (var _i5 in typeNames) {
  65906. Search(_i5);
  65907. }
  65908. console.log('----FindRest----');
  65909. waitFindRest.forEach(function (e) {
  65910. findRest.apply(void 0, _toConsumableArray(e.args));
  65911. if (e.type != 'air' && e.type != 'airSmart' && e.type != 'cabinet') combines(e.type);
  65912. });
  65913. combines(['air', 'airSmart']); //这两种合在一起combine,因为太像了容易识别出多个 nZrBdvRaDuC
  65914. console.log('cost:', Date.now() - startTime, 'ms, boxSolid:', _this5.boxesSolid, '共' + _this5.boxesSolid.length + '个');
  65915. };
  65916. done = function done() {
  65917. var _loop8 = function _loop8(panoId) {
  65918. if (!_this5.datas[panoId]) return "continue";
  65919. _this5.datas[panoId].shapes = _this5.datas[panoId].shapes.map(function (shape, i) {
  65920. return Object.assign({
  65921. sid: 'pano' + panoId + '-' + i,
  65922. category: shape.category,
  65923. //提前 便于调试
  65924. pano: player$c.model.panos.index[panoId],
  65925. index: i
  65926. }, shape);
  65927. });
  65928. };
  65929. for (var panoId in _this5.datas) {
  65930. var _ret6 = _loop8(panoId);
  65931. if (_ret6 === "continue") continue;
  65932. }
  65933. _this5.findOutAllTypes();
  65934. _this5.panoBound = new THREE.Box3();
  65935. player$c.model.chunks.forEach(function (e) {
  65936. modelBound.union(e.geometry.boundingBox); //注:不用model.boundingBox是 因为union了pano的position的
  65937. }); //针对部分模型错误,只有底面的,union一下pano.position
  65938. var minY = Infinity,
  65939. minYs = [];
  65940. var panos = player$c.model.panos.list.filter(function (e) {
  65941. return e.isAligned();
  65942. });
  65943. panos.forEach(function (e) {
  65944. var bound = new THREE.Box3().setFromCenterAndSize(e.position, new THREE.Vector3(0.1, 0.1, 0.1));
  65945. modelBound.union(bound);
  65946. _this5.panoBound.union(bound);
  65947. minY = Math.min(e.floorPosition.y, minY); //avePanoFY += e.floorPosition.y
  65948. minYs.push(e.floorPosition.y);
  65949. });
  65950. safeBound = _this5.safeBound = modelBound;
  65951. {
  65952. skyboxTight = new BoundingMesh(modelBound, new THREE.MeshBasicMaterial({
  65953. side: THREE.DoubleSide,
  65954. wireframe: true,
  65955. transparent: true,
  65956. opacity: 0.05,
  65957. visible: false
  65958. }), 0); //skyboxTight.visible = false
  65959. skyboxTight.updateMatrixWorld(); //不update的话raycaster是错的
  65960. meshGroup.add(skyboxTight);
  65961. _this5.skyboxTight = skyboxTight;
  65962. }
  65963. groundPlane.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY, 0));
  65964. if (_this5.ifAnalyze) {
  65965. beginCompute();
  65966. }
  65967. {
  65968. _this5.load(player$c.currentPano.id);
  65969. _this5.boxesSolid.forEach(function (e) {
  65970. return e.boxMesh.updateMatrixWorld();
  65971. }); //for updateBoxVisiInPano raycaster
  65972. _this5.updateBoxVisiInPano();
  65973. }
  65974. };
  65975. if (!dataList) {
  65976. /* player.model.panos.list.forEach(e => {
  65977. if (!e.isAligned()) return
  65978. panosCount++
  65979. load.bind(this)(e.id)
  65980. }) */
  65981. loadAll.bind(this)(); //测试环境
  65982. } else {
  65983. //when version == 'output'
  65984. dataList.forEach(function (e) {
  65985. var panoId = e.imagePath.split('.jpg')[0];
  65986. _this5.datas[panoId] = e;
  65987. });
  65988. done();
  65989. }
  65990. case 14:
  65991. case "end":
  65992. return _context4.stop();
  65993. }
  65994. }
  65995. }, _callee4, this);
  65996. }));
  65997. function compute(_x2) {
  65998. return _compute.apply(this, arguments);
  65999. }
  66000. return compute;
  66001. }()
  66002. }, {
  66003. key: "expandModelBound",
  66004. value: function expandModelBound() {
  66005. var _this8 = this;
  66006. //有的模型太窄,容易将一排的柜体当做墙壁。所以可以根据box位置扩展bound. (如果因为点位太少,导致内部的电池远超模型范围,就不管了。R7xZsmm9FsG)
  66007. var maxDis0 = 1,
  66008. //最终位置不会超过这个距离
  66009. maxDis1 = 3; //搜寻范围。不可扩展太宽,否则不准确的框会飘很远,甚至多画多个box,如R7xZsmm9FsG
  66010. var newBound = modelBound.clone();
  66011. var list = [];
  66012. var _loop9 = function _loop9(panoId) {
  66013. if (!_this8.datas[panoId]) return "continue";
  66014. var _this8$datas$panoId = _this8.datas[panoId],
  66015. imageWidth = _this8$datas$panoId.imageWidth,
  66016. imageHeight = _this8$datas$panoId.imageHeight;
  66017. _this8.datas[panoId].shapes.forEach(function (box) {
  66018. getBoxBase(box, imageWidth, imageHeight);
  66019. if (box.sid == 'pano2-10') {
  66020. console.log(4);
  66021. }
  66022. if (box.btmPosPredict) {
  66023. var far = box.pano.position.distanceToSquared(box.btmPosPredict);
  66024. if (far > 20) return; //太远不准
  66025. var dis = modelBound.distanceToPoint(box.btmPosPredict);
  66026. if (dis > 0 && dis < maxDis1) {
  66027. //maxDis1用来防air-hanging和一些错误的框
  66028. list.push({
  66029. box,
  66030. dis
  66031. });
  66032. }
  66033. }
  66034. });
  66035. };
  66036. for (var panoId in this.datas) {
  66037. var _ret7 = _loop9(panoId);
  66038. if (_ret7 === "continue") continue;
  66039. }
  66040. list.sort(function (a, b) {
  66041. return a.dis - b.dis;
  66042. }); //let mid = list[Math.floor(list.length/2)]
  66043. var mid = list.length; // /2
  66044. for (var i = 0; i < mid; i++) {
  66045. var box = list[i].box;
  66046. var pos = box.btmPosPredict;
  66047. if (list[i].dis > maxDis0) {
  66048. var p1 = pos.clone().clamp(modelBound.min, modelBound.max);
  66049. var vec = new THREE.Vector3().subVectors(pos, p1).normalize().multiplyScalar(maxDis0);
  66050. pos = new THREE.Vector3().addVectors(p1, vec);
  66051. }
  66052. var marginBound = new THREE.Box3().setFromCenterAndSize(pos, new THREE.Vector3(0.2, 0, 0.2));
  66053. newBound.union(marginBound);
  66054. }
  66055. skyboxTight = new BoundingMesh(newBound, new THREE.MeshBasicMaterial({
  66056. side: THREE.DoubleSide,
  66057. wireframe: true,
  66058. transparent: true,
  66059. opacity: 0.05
  66060. }), 0); //skyboxTight.visible = false
  66061. skyboxTight.updateMatrixWorld(); //不update的话raycaster是错的
  66062. meshGroup.add(skyboxTight);
  66063. this.skyboxTight = skyboxTight;
  66064. this.safeBound = this.safeBoundFirstVer = safeBound = newBound;
  66065. boundConfirmed = true;
  66066. console.log('bound1:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
  66067. }
  66068. }, {
  66069. key: "expandModelBound2",
  66070. value: function expandModelBound2(type) {
  66071. var _this9 = this;
  66072. var material = skyboxTight.material;
  66073. skyboxTight.geometry.dispose();
  66074. boxesSolid.forEach(function (e) {
  66075. if (e.boxType != type) return;
  66076. _this9.safeBound.union(e.bound);
  66077. });
  66078. skyboxTight = new BoundingMesh(this.safeBound, material, 0); //skyboxTight.visible = false
  66079. skyboxTight.updateMatrixWorld(); //不update的话raycaster是错的
  66080. meshGroup.add(skyboxTight);
  66081. this.skyboxTight = skyboxTight;
  66082. console.log('bound2:', this.safeBound.min.toArray(), this.safeBound.max.toArray());
  66083. }
  66084. /* adjustModelBound(type){
  66085. if(standards[type].atWall != 1)return //必须是挂墙的
  66086. this.lastSafeBound = this.safeBound.clone()
  66087. let list = []
  66088. let add = e => {
  66089. if (e.btmPos && e.box1 && e.minAng>10 ) {
  66090. //有 box1才能确定是getIntersect得到的pos
  66091. list.includes(e) || e.push(e)
  66092. }
  66093. }
  66094. this.boxesSolid.forEach((solidBox)=>{
  66095. if(solidBox.boxType != type)return
  66096. solidBox.traversePair(add)
  66097. })
  66098. let wallSides = {'x+': 0, 'x-': 0, 'z+': 0, 'z-': 0}
  66099. let getBoxSide = (e)=>{
  66100. for(let i in e.panosDir){
  66101. if(e.panosDir[i] != 0){
  66102. wallSides[i] += 1
  66103. }
  66104. }
  66105. }
  66106. if(list.length){
  66107. this.safeBound = this.panoBound.clone()
  66108. list.forEach((e)=>{
  66109. this.safeBound.union(e.bound)//还是说使用cIntersect来expand?
  66110. getBoxSide()
  66111. })
  66112. }
  66113. skyboxTight = new BoundingMesh(this.safeBound, material, 0)
  66114. //skyboxTight.visible = false
  66115. skyboxTight.updateMatrixWorld() //不update的话raycaster是错的
  66116. meshGroup.add(skyboxTight)
  66117. this.skyboxTight = skyboxTight
  66118. //主要目的,针对那些模型比room大得多的情况,比如多了门外的部分,造成墙面不准。
  66119. //monitor的可以完全决定位置。其他的只能收缩(但是不能收缩超过panos和第一次expand的那些btm的bound里)
  66120. //太麻烦了,且考虑到即使墙面完全准确也可能反倒把它变的不准的风险。
  66121. } */
  66122. /* 最低点使用fire的吗
  66123. MW6MEeCOy9Y 只有最近三个点和fire接近
  66124. 3MnIWabM6ne fire combine了
  66125. ov5NTEImzhW fire多个
  66126. n4z0yd5tQaF fire多两个错位离谱的。。 位置和显示的不一样。。
  66127. 5BaiXkK6Ag1 fire算的不太准 低了0.1 样本数仅两个
  66128. */
  66129. }, {
  66130. key: "updateBoxVisiInPano",
  66131. value: function updateBoxVisiInPano() {
  66132. //if (!isDiwei) return
  66133. if (player$c.mode != 'panorama' || !shelterFilterEnable) {
  66134. this.boxesSolid.forEach(function (e) {
  66135. return e.updateVisible(true, 'panoVisi');
  66136. });
  66137. return;
  66138. } //粗略排除遮挡
  66139. /* let data = this.datasMixed[player.currentPano.id] || this.datas[player.currentPano.id]
  66140. if (!data) return
  66141. let visiBoxes = this.visiInfos[player.currentPano.id]
  66142. if (!visiBoxes) {
  66143. visiBoxes = []
  66144. this.boxesSolid.forEach(box => {
  66145. let sizeXZ = new THREE.Vector2(box.size.x, box.size.z)
  66146. let extLen = -sizeXZ.length() / 2 - 0.5
  66147. let intersect = convertTool.ifIntersectChunks(player.position, box.position, player.model, { extLen })
  66148. if (!intersect) {
  66149. //是否和当前pano的box框位置接近
  66150. let pos2d1 = new THREE.Vector2(box.position.x, box.position.z)
  66151. //return visiBoxes.push(box)
  66152. let shape = data.shapes.find(e => {
  66153. //getBoxBtm(e)
  66154. //return true
  66155. if (isExt) {
  66156. let { imageWidth, imageHeight } = data
  66157. getBoxBase(e, imageWidth, imageHeight)
  66158. getOtherPos(e)
  66159. }
  66160. let pos = getBoxPos(e)
  66161. if (!pos) return
  66162. let pos2d2 = new THREE.Vector2(pos.x, pos.z)
  66163. if (pos2d1.distanceToSquared(pos2d2) < 3) return true //效果:有一些一排中2d框稀疏的可能会不显示
  66164. })
  66165. if (shape) {
  66166. visiBoxes.push(box)
  66167. } else {
  66168. //console.log('ohhhh')
  66169. }
  66170. }
  66171. })
  66172. this.visiInfos[player.currentPano.id] = visiBoxes
  66173. } */
  66174. var visiBoxes = this.visiInfos[player$c.currentPano.id];
  66175. if (!visiBoxes) {
  66176. visiBoxes = this.boxesSolid.filter(function (box) {
  66177. if (box.visiPanos) {
  66178. //已经先从box端计算好了
  66179. return box.visiPanos.includes(player$c.currentPano);
  66180. }
  66181. return box.cptVisiAtPano(player$c.currentPano);
  66182. });
  66183. this.visiInfos[player$c.currentPano.id] = visiBoxes; //此方法相比之前利用data中的数据,不同点是只要没有被其他box遮挡即可显示,所以可以穿墙显示。另外遮挡更精细
  66184. }
  66185. this.boxesSolid.forEach(function (e) {
  66186. e.updateVisible(visiBoxes.includes(e), 'panoVisi');
  66187. });
  66188. }
  66189. }, {
  66190. key: "confirmGroundY",
  66191. value: function confirmGroundY(type) {
  66192. //利用fire来确定地面高度(会稍低于地板,但box框不打滑且xz更准,估计因box框比box大)。调试:3MnIWabM6ne up9PPZkx1px 4GqaqNdyjGfs GFbQi1LiSij
  66193. if (boundConfirmed) return;
  66194. var btmYs = [],
  66195. pairs = [],
  66196. needCount = 5,
  66197. maxDis = 3,
  66198. btmY = 0;
  66199. var add = function add(e) {
  66200. if (e.btmPos && e.box1
  66201. /* && e.score >= minScore */
  66202. ) {
  66203. //有 box1才能确定是getIntersect得到的pos
  66204. pairs.push(e);
  66205. }
  66206. };
  66207. boxesSolid.forEach(function (e) {
  66208. if (e.boxType != type) return;
  66209. e.traversePair(add);
  66210. });
  66211. var usePairs = pairs;
  66212. if (pairs.length > needCount) {
  66213. //调试:Y8czF2Z3h9m
  66214. var disMap = new Map();
  66215. pairs.forEach(function (e) {
  66216. disMap.set(e, Math.max(e.box0.pano.position.distanceTo(e.box0.btmPosPredict), e.box1.pano.position.distanceTo(e.box1.btmPosPredict)));
  66217. });
  66218. pairs.sort(function (a, b) {
  66219. return disMap.get(a) - disMap.get(b);
  66220. }); //距离从近到远 . 远处的高度可能偏离严重,就不管了,而且框也不一定准
  66221. usePairs = pairs.slice(0, needCount);
  66222. for (var i = needCount; i < pairs.length; i++) {
  66223. if (disMap.get(pairs[i]) < maxDis) {
  66224. usePairs.push(pairs[i]);
  66225. }
  66226. }
  66227. }
  66228. usePairs.forEach(function (e) {
  66229. //有 box1才能确定是getIntersect得到的pos
  66230. var btmY_ = e.btmPos.y;
  66231. var width = e.size.x / 2;
  66232. var h0 = width / Math.tan(Math.acos(-e.box0.centerBtmDir.y)); //|centerBtmDir.y| 即俯视角度的cos
  66233. var h1 = width / Math.tan(Math.acos(-e.box1.centerBtmDir.y));
  66234. var h = Math.min(h0, h1); //选个小的吧,因浅的会更快接触到中心,虽然交点是两条射线最近点 不一定在fire中心
  66235. //如果毫无误差,且centerBtmDir.y相同,只要两条线centerBtmDir的xz相同,交点就是和地面的交点,而只要不同,交点就是和地面的交点,而只要不同,交点必然是在fire中心之下。随着minAng和centerBtmDir.y 交点在这中间变化
  66236. var r = math$2.linearClamp(e.minAng, 0, 90, 0, 1);
  66237. btmY_ += h * r;
  66238. btmYs.push(btmY_);
  66239. btmY += btmY_;
  66240. });
  66241. btmY /= btmYs.length;
  66242. if (btmYs.length) {
  66243. console.error('confirmGroundY', btmY,
  66244. /* '样本数', btmYs.length, */
  66245. btmYs, usePairs.map(function (e) {
  66246. return e.name;
  66247. }), pairs);
  66248. /* if(btmYs.length == 1 && pairs[0].minAngle<12 && ){
  66249. } */
  66250. groundY = this.safeBound.min.y = this.panoBound.min.y = btmY; // = -1.1
  66251. groundPlane.setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), new THREE.Vector3(0, groundY, 0));
  66252. }
  66253. var _standards$type$heigh = standards[type].height,
  66254. min = _standards$type$heigh.min,
  66255. max = _standards$type$heigh.max;
  66256. boxesSolid.slice().forEach(function (e) {
  66257. if (e.boxType != type) return;
  66258. if (e.fake) {
  66259. e.dispose();
  66260. return;
  66261. }
  66262. var topY = e.topPos ? e.topPos.y : e.list.reduce(function (w, c) {
  66263. return w + c.topPos.y;
  66264. }, 0) / e.list.length;
  66265. e.size.y = THREE.MathUtils.clamp(topY - groundY, min, max);
  66266. e.setFromInfo(e);
  66267. e.draw();
  66268. });
  66269. this.panoBound;
  66270. this.expandModelBound();
  66271. }
  66272. }, {
  66273. key: "bindEvents",
  66274. value: function bindEvents() {
  66275. var _this10 = this;
  66276. player$c.on(PlayerEvents.FlyingStarted, function (e) {
  66277. //if(e.mode == 'dollhouse')return
  66278. // 点位跳转前清除已有线框
  66279. _this10.traverse(function (obj) {
  66280. if (obj.isMesh) {
  66281. obj.geometry.dispose();
  66282. obj.material.dispose();
  66283. }
  66284. });
  66285. _this10.wireframes.clear();
  66286. _this10.currentId = null;
  66287. });
  66288. player$c.on(PlayerEvents.FlyingEnded, function () {
  66289. // 点位跳转后加载线框
  66290. _this10.updateBoxVisiInPano();
  66291. if (player$c.mode != Viewmode$1.PANORAMA) return; // 只有PANORAMA模式下需要加载
  66292. _this10.load(player$c.currentPano.id);
  66293. });
  66294. var allBoxMesh = [];
  66295. player$c.on('collectIntersectMesh', function (meshes, e) {
  66296. if (!isDiwei) return;
  66297. allBoxMesh = _this10.boxesSolid.filter(function (e) {
  66298. return common$1.getObjVisiByReason(e.label, 'panoVisi');
  66299. }).map(function (e) {
  66300. return e.boxMesh;
  66301. }); //过滤掉隐藏的
  66302. });
  66303. player$c.on('judgeIntersect', function (intersect_, e) {
  66304. if (e.getConsumed() || !isDiwei) return;
  66305. var intersect = player$c.getMouseIntersect(null, allBoxMesh, {});
  66306. var hoveredBox = intersect && allBoxMesh.includes(intersect.object) ? intersect.object.masterBox : null;
  66307. if (hoveredBox != _this10.hoveredBox) {
  66308. if (hoveredBox) {
  66309. CursorDeal.add('hoverMonitor');
  66310. } else {
  66311. CursorDeal.remove('hoverMonitor');
  66312. }
  66313. _this10.hoveredBox = hoveredBox;
  66314. }
  66315. hoveredBox && e.consume();
  66316. });
  66317. player$c.on('click', function (e) {
  66318. if (e.getConsumed() || !isDiwei) return;
  66319. if (_this10.hoveredBox) {
  66320. player$c.$app.Scene.emit('box-frame-click', _this10.hoveredBox);
  66321. e.consume();
  66322. }
  66323. });
  66324. setTimeout(function () {
  66325. _this10.wireframes.visible = false;
  66326. player$c.$app.Scene.on('ai-box.set-display', /*#__PURE__*/function () {
  66327. var _ref10 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee5(display) {
  66328. return regenerator.wrap(function _callee5$(_context5) {
  66329. while (1) {
  66330. switch (_context5.prev = _context5.next) {
  66331. case 0:
  66332. //开关
  66333. _this10.switchOnOff(display);
  66334. case 1:
  66335. case "end":
  66336. return _context5.stop();
  66337. }
  66338. }
  66339. }, _callee5);
  66340. }));
  66341. return function (_x4) {
  66342. return _ref10.apply(this, arguments);
  66343. };
  66344. }());
  66345. if (_this10.ifAnalyze && !isDiwei) {
  66346. player$c.$app.Scene.on('ai-box.fetch-list', function () {
  66347. //列表
  66348. var list = [];
  66349. for (var i = 0; i < boxesSolid.length; i++) {
  66350. var box = boxesSolid[i];
  66351. var name = player$c.$app.config.lang == 'zh' ? getChName$1[box.boxType] : typeNames[box.boxType];
  66352. if (name) {
  66353. list.push({
  66354. name: name + '-' + (i + 1),
  66355. position: box.position,
  66356. getClosetPano: box.getClosetPano.bind(box)
  66357. });
  66358. }
  66359. }
  66360. player$c.$app.Scene.emit('ai-box.list', list); //如果没有一条数据,编辑页面的AI选框就不会显示
  66361. });
  66362. player$c.$app.Scene.emit('ai-box.loaded');
  66363. }
  66364. }, 1000);
  66365. }
  66366. /**
  66367. * 加载点位标记数据
  66368. * @param {*} panoId
  66369. */
  66370. }, {
  66371. key: "load",
  66372. value: function load(panoId) {
  66373. var _this11 = this;
  66374. var data = this.datasMixed[panoId] || this.datas[panoId];
  66375. if (!data) {
  66376. if (!(panoId in this.datas)) setTimeout(function () {
  66377. _this11.load(panoId);
  66378. }, 100); //否则无数据
  66379. return;
  66380. }
  66381. if (player$c.currentPano.id != panoId || player$c.flying || this.currentId == panoId) return; // 防止连续跳转点位时,clear后才load好上一点位的数据,导致出现之前的标记
  66382. this.currentId = panoId;
  66383. var shapes = data.shapes,
  66384. imageHeight = data.imageHeight,
  66385. imageWidth = data.imageWidth; //data.data
  66386. var allShapes = shapes.slice();
  66387. shapes.forEach(function (e) {
  66388. if (e.boxes) allShapes.push.apply(allShapes, _toConsumableArray(e.boxes));
  66389. });
  66390. allShapes.forEach(function (shape) {
  66391. // 填充色和线框色
  66392. // let { fill_color, line_color } = shape
  66393. getUVs$1(shape);
  66394. getCenterDir$1(shape, player$c.currentPano);
  66395. var fill_color = shape.fill_color,
  66396. _shape$color = shape.color,
  66397. color = _shape$color === void 0 ? [56, 56, 255] : _shape$color;
  66398. var line_color = [].concat(_toConsumableArray(color), [255]);
  66399. if (!fill_color) fill_color = [255, 255, 255, 0];
  66400. if (!line_color) line_color = [255, 0, 0, 255];
  66401. if (shape.boxes) {
  66402. line_color = [20, 205, 255, 255];
  66403. }
  66404. var pos = getBoxPos(shape);
  66405. var dis = pos ? shape.pano.position.distanceTo(getBoxPos(shape)) : 1;
  66406. var labelShift = (shape.boxType == 'fire' ? 0 : -0.2) / dis;
  66407. var name = shape.category + '-' + shape.sid; //if(shape.score < MinBoxInitialScore){
  66408. name = [name];
  66409. shape.score && name.push('sc: ' + math$2.toPrecision(shape.score, 3)); //}
  66410. _this11.showSignalFrom2d(name, shape.bbox2, imageWidth, imageHeight, {
  66411. fill: {
  66412. color:
  66413. /* colors.yellow, // */
  66414. new THREE.Color().setRGB(fill_color[0] / 255, fill_color[1] / 255, fill_color[2] / 255),
  66415. opacity:
  66416. /* 0.2, */
  66417. fill_color[3] / 255
  66418. },
  66419. line: {
  66420. color:
  66421. /* colors.green,// */
  66422. new THREE.Color().setRGB(line_color[0] / 255, line_color[1] / 255, line_color[2] / 255),
  66423. opacity: shape.category == 'cabling_rack' ? 0.4 : line_color[3] / 255 //走线架太绕,扰乱视线
  66424. }
  66425. }, shape.centerDir, labelShift, shape.state == '被删除', shape);
  66426. }); // })
  66427. // .catch(err => console.log(`点位${panoId}无标记数据或数据出错:`, err))
  66428. }
  66429. /**
  66430. * 根据坐标标记全景图
  66431. *
  66432. * 存在的问题:如果要准确复现全景图上的线框,上下边框会变为弧形。而按顶点连直线的话,180度以上会出bug。
  66433. * 解决方式:目前150度以下只画出4个顶点然后连直线,150度以上准确画出全景图线框。
  66434. */
  66435. }, {
  66436. key: "showSignalFrom2d",
  66437. value: function showSignalFrom2d(name, rect, w, h, options, centerDir, labelShift, removed, data) {
  66438. // 目前rect给的是矩形对角的两个点坐标,将它扩展成四个顶点
  66439. 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])]; // 根据四个顶点,填充中间点
  66440. var pointArr = [];
  66441. for (var i = 0; i < cornerArr.length; i++) {
  66442. var corner1 = cornerArr[i];
  66443. pointArr.push(corner1);
  66444. /* // 横向角度超过150度时,3d中边框的弧线已经不太明显,准确画出全景图线框
  66445. if ((rect[2] - rect[0]) / w < 5 / 12 && i % 2 == 0) continue
  66446. const vec = [corner2[0] - corner1[0], corner2[1] - corner1[1]]
  66447. let length = Math.sqrt(vec[0] * vec[0] + vec[1] * vec[1])
  66448. let num = length / 150
  66449. for (let j = 1; j <= num; j++) {
  66450. pointArr.push([corner1[0] + (vec[0] / num) * j, corner1[1] + (vec[1] / num) * j])
  66451. } */
  66452. } //pointArr.push(cornerArr[0], cornerArr[2], cornerArr[1], cornerArr[3]) //对角线
  66453. var points = [];
  66454. pointArr.forEach(function (uv) {
  66455. var dir = getDirByUV$1(uv, player$c.currentPano); // points.push(dir.sub(centerVec)) // 计算其他点相对于中点的坐标,方便旋转平移等
  66456. points.push(dir);
  66457. }); // 线框
  66458. var lineGeometry = new THREE.BufferGeometry().setFromPoints(points);
  66459. var lineMaterial = new THREE.LineBasicMaterial({
  66460. color: options.line.color,
  66461. opacity: options.line.opacity,
  66462. transparent: true,
  66463. depthTest: false
  66464. });
  66465. var wireframe = new THREE.LineLoop(lineGeometry, lineMaterial); // wireframe.position.copy(centerVec) // 将中点作为线框坐标
  66466. wireframe.renderOrder = 100; // 填充颜色
  66467. var fillGeometry = lineGeometry.clone().setIndex(new THREE.BufferAttribute(new Uint16Array([0, 1, 3, 2, 3, 1]), 1));
  66468. var fillMaterial = new THREE.MeshBasicMaterial({
  66469. color: options.fill.color,
  66470. opacity: options.fill.opacity,
  66471. transparent: true,
  66472. side: THREE.DoubleSide,
  66473. depthTest: false
  66474. });
  66475. var plane = new THREE.Mesh(fillGeometry, fillMaterial);
  66476. plane.renderOrder = wireframe.renderOrder - 1;
  66477. wireframe.add(plane);
  66478. plane.visible = false; // 名称
  66479. var textMesh = new TextSprite({
  66480. text: name,
  66481. backgroundColor: {
  66482. r: options.line.color.r * 255,
  66483. g: options.line.color.g * 255,
  66484. b: options.line.color.b * 255,
  66485. a: options.line.opacity * 0.5
  66486. },
  66487. textColor: {
  66488. r: 255,
  66489. g: 255,
  66490. b: 255,
  66491. a: options.line.opacity * 1.1
  66492. },
  66493. borderRadius: 2,
  66494. renderOrder: wireframe.renderOrder + 1,
  66495. player: player$c
  66496. }); //const shift = new THREE.Vector3(0, labelShift , 0)
  66497. textMesh.position.copy(centerDir
  66498. /* .clone().add(shift).normalize() */
  66499. );
  66500. textMesh.lookAt(0, 0, 0); // 看向相机
  66501. textMesh.scale.set(0.12, 0.12, 0.12);
  66502. /* let line = addLine(centerDir, shift, null, options.line.color)
  66503. line.material.opacity = options.line.opacity */
  66504. var group = new THREE.Group();
  66505. group.name = 'rectInPano';
  66506. group.position.copy(player$c.currentPano.position);
  66507. group.add(wireframe);
  66508. group.add(textMesh); //group.add(line)
  66509. this.wireframes.visible = false;
  66510. this.wireframes.add(group);
  66511. group.label = textMesh;
  66512. group.wireframe = wireframe;
  66513. group.plane = plane;
  66514. if (removed) {
  66515. textMesh.sprite.material.opacity = 0.4;
  66516. lineMaterial.opacity *= 0.6;
  66517. lineMaterial.color.set('#efe');
  66518. }
  66519. group.data = data;
  66520. }
  66521. }, {
  66522. key: "findOutAllTypes",
  66523. value: function findOutAllTypes() {
  66524. var types = {};
  66525. for (var i in this.datas) {
  66526. this.datas[i].shapes.forEach(function (shape) {
  66527. if (!types[shape.category]) {
  66528. types[shape.category] = shape.name;
  66529. }
  66530. });
  66531. }
  66532. console.log('allTypes:', types);
  66533. }
  66534. }, {
  66535. key: "clear",
  66536. value: function clear() {
  66537. skyboxTight = null, meshGroup = null, modelBound = new THREE.Box3(), groundY = null, safeBound = null, boxesSolid = [];
  66538. }
  66539. }]);
  66540. return PanoBoxFrame;
  66541. })(THREE.Group);
  66542. var player$b;
  66543. var getChName = {
  66544. CombinationSofa: '组合沙发',
  66545. Desk: '书桌',
  66546. DoubleBed: '双人床',
  66547. TV: '电视'
  66548. };
  66549. var Shape$1 = /*#__PURE__*/function () {
  66550. function Shape(shape, i, panoId, imageWidth, imageHeight) {
  66551. _classCallCheck(this, Shape);
  66552. Object.assign(this, {
  66553. sid: 'pano' + panoId + '-' + i,
  66554. name: getChName[shape.category],
  66555. category: shape.category,
  66556. //提前 便于调试
  66557. pano: player$b.model.panos.index[panoId],
  66558. index: i
  66559. }, shape);
  66560. getUVs(this, imageWidth, imageHeight);
  66561. this.drawData = turnToDraw(this);
  66562. shape.centerPoint = this.drawData.labelPoint;
  66563. }
  66564. _createClass(Shape, [{
  66565. key: "getClosetPano",
  66566. value: function getClosetPano() {
  66567. //点击列表后获取
  66568. return this.pano;
  66569. }
  66570. }, {
  66571. key: "position",
  66572. get: function get() {
  66573. return this.centerPoint;
  66574. }
  66575. }]);
  66576. return Shape;
  66577. }();
  66578. var PanoBoxDrawAI = /*#__PURE__*/function () {
  66579. function PanoBoxDrawAI(app, player_) {
  66580. _classCallCheck(this, PanoBoxDrawAI);
  66581. this.app = void 0;
  66582. player$b = player_;
  66583. this.datas = {};
  66584. this.app = app;
  66585. }
  66586. _createClass(PanoBoxDrawAI, [{
  66587. key: "loadAll",
  66588. value: function () {
  66589. var _loadAll = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  66590. var _this = this;
  66591. var data, box4, list, _loop, panoId, _ret;
  66592. return regenerator.wrap(function _callee$(_context) {
  66593. while (1) {
  66594. switch (_context.prev = _context.next) {
  66595. case 0:
  66596. _context.next = 2;
  66597. return this.app.store.get('sceneDraw');
  66598. case 2:
  66599. _context.t0 = _context.sent;
  66600. data = {
  66601. data: _context.t0,
  66602. success: true
  66603. };
  66604. // 只绘制ai数据
  66605. console.log('--raw', data);
  66606. data.data = data.data ? data.data.filter(function (item) {
  66607. if (item.sourceType !== 'ai') return false;
  66608. var panoId = item.imagePath.split('.jpg')[0];
  66609. return !!player$b.model.panos.index[panoId];
  66610. }) : [];
  66611. console.log('--filter', data); // if (player.$app.config.deploy == 'local' && !player.$app.config.server) {
  66612. // data = await http.get(player.$app.resource.getViewResourceURL(`images/ai.json?${new Date().getTime()}`))
  66613. // data = {
  66614. // data,
  66615. // success: true,
  66616. // }
  66617. // } else {
  66618. // let aiBoxUrl = '/service/shapes/sceneMarkShape/box4/getInfos'
  66619. // if (player.$app.config.deploy == 'local') {
  66620. // aiBoxUrl = '/service/scene/edit/ai/box4/getInfos'
  66621. // }
  66622. // data = await http.post(aiBoxUrl, { num: player.$app.config.num, type: 1 })
  66623. // }
  66624. // let data = await http.post('/service/shapes/sceneMarkShape/box4/getInfos', { num: player.$app.config.num, type: 1 })
  66625. if (!(!data.data || !data.success)) {
  66626. _context.next = 9;
  66627. break;
  66628. }
  66629. return _context.abrupt("return");
  66630. case 9:
  66631. box4 = data.data; // 兼容旧数据
  66632. box4.forEach(function (e) {
  66633. var panoId = e.imagePath.split('.jpg')[0];
  66634. if (panoId in _this.datas) {
  66635. _this.datas[panoId].shapes.push(e);
  66636. } else {
  66637. _this.datas[panoId] = {
  66638. shapes: [e]
  66639. };
  66640. }
  66641. });
  66642. list = [];
  66643. _loop = function _loop(panoId) {
  66644. if (!_this.datas[panoId]) return "continue";
  66645. _this.datas[panoId].shapes = _this.datas[panoId].shapes.map(function (shape, i) {
  66646. var _this$datas$panoId = _this.datas[panoId];
  66647. _this$datas$panoId.imageWidth;
  66648. _this$datas$panoId.imageHeight;
  66649. var shape_ = new Shape$1(shape, i, panoId, 4096, 2048);
  66650. list.push(shape_);
  66651. return shape_;
  66652. });
  66653. };
  66654. _context.t1 = regenerator.keys(this.datas);
  66655. case 14:
  66656. if ((_context.t2 = _context.t1()).done) {
  66657. _context.next = 21;
  66658. break;
  66659. }
  66660. panoId = _context.t2.value;
  66661. _ret = _loop(panoId);
  66662. if (!(_ret === "continue")) {
  66663. _context.next = 19;
  66664. break;
  66665. }
  66666. return _context.abrupt("continue", 14);
  66667. case 19:
  66668. _context.next = 14;
  66669. break;
  66670. case 21:
  66671. player$b.$app.Scene.emit('ai-box.list', list); //如果没有一条数据,编辑页面的AI选框就不会显示
  66672. player$b.$app.Scene.emit('ai-box.loaded'); //player.$app.Scene.emit('AIDrawGot', this.datas)
  66673. return _context.abrupt("return", this.datas);
  66674. case 24:
  66675. case "end":
  66676. return _context.stop();
  66677. }
  66678. }
  66679. }, _callee, this);
  66680. }));
  66681. function loadAll() {
  66682. return _loadAll.apply(this, arguments);
  66683. }
  66684. return loadAll;
  66685. }()
  66686. }]);
  66687. return PanoBoxDrawAI;
  66688. }();
  66689. function getUVs(box, imageWidth, imageHeight) {
  66690. if (box.bbox2) return;
  66691. if (!imageWidth) {
  66692. imageWidth = global.aiBox.datas[box.pano.id].imageWidth;
  66693. imageHeight = global.aiBox.datas[box.pano.id].imageHeight;
  66694. }
  66695. box.bbox2 = box.bbox.map(function (e, i) {
  66696. //(x1,y1,x2,y2)
  66697. return i % 2 == 0 ? e / imageWidth
  66698. /* + 0.25 */
  66699. : e / imageHeight;
  66700. });
  66701. }
  66702. function getBbox2center(x1, x2) {
  66703. //找中间位置
  66704. if (Math.abs(x1 - x2) > 0.5) {
  66705. //永远找小于180度的那一边
  66706. return (x1 + x2 + 1) / 2; //另外半边
  66707. } else {
  66708. return (x1 + x2) / 2;
  66709. }
  66710. }
  66711. function getCenterDir(box) {
  66712. //假设不存在在box中间拍摄的情况,所以y不会横跨两边
  66713. var bbox = box.bbox2;
  66714. var y = bbox.length >= 5 ? (bbox[1] + bbox[5]) / 2 : bbox[1];
  66715. var center = {
  66716. x: getBbox2center(bbox[0], bbox[2]),
  66717. y
  66718. };
  66719. return getDirByUV(center, box.pano);
  66720. } // 2d坐标转3d坐标
  66721. function getDirByUV(uv, pano) {
  66722. // 计算方向向量
  66723. var yaw = -uv.x * (Math.PI * 2);
  66724. var pitch = Math.PI / 2 - uv.y * Math.PI;
  66725. try {
  66726. var dir = new THREE.Vector3();
  66727. dir.copy(Vectors$1.RIGHT).applyAxisAngle(Vectors$1.BACK, pitch).applyAxisAngle(Vectors$1.UP, yaw).applyQuaternion(pano.quaternion);
  66728. return dir;
  66729. } catch (e) {
  66730. debugger;
  66731. throw e;
  66732. }
  66733. }
  66734. function turnToDraw(shape) {
  66735. var _shape$editJson, _shape$editJson2;
  66736. var name = shape.category + '-' + shape.sid; //if(shape.score < MinBoxInitialScore){
  66737. name = [name];
  66738. shape.score && name.push('sc: ' + math$2.toPrecision(shape.score, 3));
  66739. var points;
  66740. var labelPoint;
  66741. var color;
  66742. if (!shape.editJson) {
  66743. var centerDir = getCenterDir(shape);
  66744. labelPoint = centerDir.add(shape.pano.position); //}
  66745. var rect = shape.bbox2;
  66746. var cornerArr = [];
  66747. for (var i = 0; i < rect.length; i += 2) {
  66748. cornerArr.push(new THREE.Vector2(rect[i], rect[i + 1]));
  66749. } // let 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])]
  66750. points = cornerArr.map(function (uv) {
  66751. var dir = getDirByUV(uv, shape.pano);
  66752. return dir.add(shape.pano.position);
  66753. });
  66754. color = "#".concat(_construct(THREE.Color, _toConsumableArray(shape.color.map(function (t) {
  66755. return t / 255;
  66756. }))).getHexString());
  66757. } else {
  66758. labelPoint = shape.editJson.labelPoint;
  66759. points = shape.editJson.list[0].points;
  66760. color = shape.editJson.color;
  66761. }
  66762. var drawData = {
  66763. color,
  66764. panoId: shape.pano.id,
  66765. labelPoint,
  66766. name: ((_shape$editJson = shape.editJson) === null || _shape$editJson === void 0 ? void 0 : _shape$editJson.name) || shape.name,
  66767. type: ((_shape$editJson2 = shape.editJson) === null || _shape$editJson2 === void 0 ? void 0 : _shape$editJson2.type) || '',
  66768. list: [{
  66769. /* "shapeIndexes": [ 4, 0, 1, ], */
  66770. points: points
  66771. }],
  66772. sid: shape.sid,
  66773. //‘pano0-’ ----以后修改后直接保存这个数据,加载的AI每个shape需要有一个sid,能和这个一一对应,否则修改一个就要保存全部画笔数据,下次不加载AI
  66774. isLose: 0
  66775. };
  66776. return drawData;
  66777. }
  66778. 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); }; }
  66779. 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; } }
  66780. var Scene = /*#__PURE__*/function (_Emiter) {
  66781. _inherits(Scene, _Emiter);
  66782. var _super = _createSuper$D(Scene);
  66783. function Scene(app) {
  66784. var _this;
  66785. _classCallCheck(this, Scene);
  66786. _this = _super.call(this);
  66787. _this.app = app;
  66788. _this.ready = false;
  66789. _this.loaded = false;
  66790. _this.locked = null;
  66791. _this.lastAiBoxState = [];
  66792. _this.Decoration = new Decoration(_assertThisInitialized(_this));
  66793. _this.on('ready', function () {
  66794. return _this.ready = true;
  66795. });
  66796. _this.on('loaded', function () {
  66797. _this.loaded = true;
  66798. var videoRenderer = _this.app.core.get('PanoVideoRenderer');
  66799. videoRenderer.on(PanoRendererEvents.CanPlayVideo, function () {
  66800. return _this.emit(PanoRendererEvents.CanPlayVideo);
  66801. });
  66802. videoRenderer.on(PanoRendererEvents.StartPlay, function () {
  66803. return _this.emit(PanoRendererEvents.StartPlay);
  66804. });
  66805. videoRenderer.on(PanoRendererEvents.SuspendRender, function () {
  66806. return _this.emit(PanoRendererEvents.SuspendRender);
  66807. });
  66808. videoRenderer.on(PanoRendererEvents.ResumeRender, function () {
  66809. return _this.emit(PanoRendererEvents.ResumeRender);
  66810. });
  66811. _this.app.store.getValue('metadata');
  66812. if (browser$1.valueFromUrl('ai') == 'ids') {
  66813. _this.aiBox = new PanoBoxFrame(_this.app.core.get('Player'));
  66814. } else if (browser$1.valueFromUrl('ai') == 'sds') {
  66815. _this.aiBox = new PanoBoxFrame(_this.app.core.get('Player'), true);
  66816. } else if (browser$1.valueFromUrl('ai') == 'toDraw') {
  66817. _this.aiBox = new PanoBoxDrawAI(_this.app, _this.app.core.get('Player'), true);
  66818. } else {
  66819. // const metadata = this.app.store.getValue('metadata')
  66820. // let create = metadata.hasRecognition && (!this.app.config.view || metadata.controls.showAi)
  66821. // if (create) {
  66822. // //展示页要点击按钮才显示,编辑页面如果勾选了就显示
  66823. // let show = !this.app.config.view && metadata.controls.showAi
  66824. // this.aiBox = new PanoBoxFrameAI(this.app.core.get('Player'), true, show) //ai-box.set-display切换显示
  66825. // }
  66826. _this.aiBox = new PanoBoxDrawAI(_this.app, _this.app.core.get('Player'), true);
  66827. }
  66828. _this.lastAiBoxState.forEach(function (e) {
  66829. var _this2;
  66830. return (_this2 = _this).setAiBoxShow.apply(_this2, _toConsumableArray(e));
  66831. }); //update
  66832. _this.lastAiBoxState.length = 0;
  66833. if (!_this.app.config.view) {
  66834. var atVSetting = function atVSetting(e) {
  66835. //进出设置-可视化设置
  66836. app.TagManager.switchLabels({
  66837. type: 'aiList',
  66838. visible: !!e
  66839. }, null, 'atVSetting');
  66840. };
  66841. _this.on('aiTagEvent', atVSetting);
  66842. atVSetting(false);
  66843. }
  66844. });
  66845. return _this;
  66846. }
  66847. _createClass(Scene, [{
  66848. key: "setAiBoxShow",
  66849. value: function setAiBoxShow(visible, reason, level) {
  66850. //编辑页,只在设置页面展示AIBox. 比开关优先级高
  66851. //console.log('setAiBoxShow',visible, reason, level,this.loaded)
  66852. if (!this.loaded) {
  66853. return this.lastAiBoxState.push([visible, reason, level]);
  66854. }
  66855. this.aiBox && common$1.updateVisible(this.aiBox, reason, visible, level);
  66856. }
  66857. /**
  66858. * 获取所有点位信息
  66859. */
  66860. }, {
  66861. key: "panos",
  66862. get: function get() {
  66863. return this.app.core.get('Player').model.panos;
  66864. }
  66865. /**
  66866. * 获取当前点位id
  66867. */
  66868. }, {
  66869. key: "panoId",
  66870. get: function get() {
  66871. return this.app.core.get('Player').currentPano.id;
  66872. }
  66873. }, {
  66874. key: "floors",
  66875. get: function get() {
  66876. return this.app.core.get('Player').model.floors;
  66877. }
  66878. /**
  66879. * 获取当前点位楼层id
  66880. */
  66881. }, {
  66882. key: "floorId",
  66883. get: function get() {
  66884. return this.app.core.get('Player').currentPano.floorIndex;
  66885. }
  66886. /**
  66887. * 获取当前楼层id
  66888. */
  66889. }, {
  66890. key: "currentFloorId",
  66891. get: function get() {
  66892. return this.app.core.get('Player').model.currentFloor.floorIndex;
  66893. }
  66894. /**
  66895. * 获取点位数量
  66896. */
  66897. }, {
  66898. key: "panoCount",
  66899. get: function get() {
  66900. return this.app.core.get('Player').model.panos.list.length;
  66901. }
  66902. /**
  66903. * 获取球幕视频数量
  66904. */
  66905. }, {
  66906. key: "videoCount",
  66907. get: function get() {
  66908. var videos = this.app.store.getValue('metadata').videos;
  66909. if (!videos || !videos.data || !videos.data.length) {
  66910. return 0;
  66911. }
  66912. return videos.data.length;
  66913. }
  66914. /**
  66915. * 获取球幕视频列表
  66916. */
  66917. }, {
  66918. key: "videoList",
  66919. get: function get() {
  66920. var videos = this.app.store.getValue('metadata').videos;
  66921. if (!videos || !videos.data || !videos.data.length) {
  66922. return [];
  66923. }
  66924. return videos.data.map(function (item) {
  66925. return item.id;
  66926. });
  66927. }
  66928. /**
  66929. * 判断当时点位是否有球幕视频
  66930. */
  66931. }, {
  66932. key: "isCurrentPanoHasVideo",
  66933. get: function get() {
  66934. return this.app.core.get('Player').currentPano.hasVideo;
  66935. }
  66936. }, {
  66937. key: "whenReady",
  66938. value: function whenReady(callback) {
  66939. var _this3 = this;
  66940. var func = function func(resolve) {
  66941. resolve();
  66942. if (typeof callback === 'function') {
  66943. callback();
  66944. }
  66945. };
  66946. return new Promise(function (resolve) {
  66947. if (_this3.ready) {
  66948. func(resolve);
  66949. } else {
  66950. _this3.once('ready', function () {
  66951. return func(resolve);
  66952. });
  66953. }
  66954. });
  66955. }
  66956. }, {
  66957. key: "whenLoaded",
  66958. value: function whenLoaded(callback) {
  66959. var _this4 = this;
  66960. var func = function func(resolve) {
  66961. resolve();
  66962. if (typeof callback === 'function') {
  66963. callback();
  66964. }
  66965. };
  66966. return new Promise(function (resolve) {
  66967. if (_this4.loaded) {
  66968. func(resolve);
  66969. } else {
  66970. _this4.once('loaded', function () {
  66971. return func(resolve);
  66972. });
  66973. }
  66974. });
  66975. }
  66976. /**
  66977. * 显示俯视图
  66978. */
  66979. }, {
  66980. key: "showFloorCadImage",
  66981. value: function showFloorCadImage() {
  66982. this.app.core.get('Player').model.floorplanCadImg.displayCadPlane(true);
  66983. }
  66984. /**
  66985. * 隐藏俯视图
  66986. */
  66987. }, {
  66988. key: "hideFloorCadImage",
  66989. value: function hideFloorCadImage() {
  66990. var _this5 = this;
  66991. if (this.app.core.get('Player')) {
  66992. this.app.core.get('Player').model.floorplanCadImg.displayCadPlane(false);
  66993. } else {
  66994. setTimeout(function () {
  66995. _this5.hideFloorCadImage();
  66996. }, 100);
  66997. }
  66998. }
  66999. /**
  67000. * 设置地面logo大小
  67001. */
  67002. }, {
  67003. key: "setFloorLogo",
  67004. value: function setFloorLogo() {
  67005. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  67006. if (!this.ready) {
  67007. return;
  67008. }
  67009. this.app.core.get('Player').model.floorLogos.changeFloorLogo(options);
  67010. }
  67011. /**
  67012. * 跳转楼层
  67013. * @param {*} id 楼层Id
  67014. *
  67015. */
  67016. }, {
  67017. key: "gotoFloor",
  67018. value: function gotoFloor(id) {
  67019. if (id == 'all') {
  67020. this.app.core.get('Player').model.toggleAllFloors(!0);
  67021. } else {
  67022. var t = parseInt(id) - this.app.core.get('Player').model.currentFloor.floorIndex;
  67023. this.app.core.get('Player').changeFloor(t);
  67024. }
  67025. this.app.core.get('Player').model.currentFloorId = id;
  67026. }
  67027. /**
  67028. * 暂停加载资源
  67029. */
  67030. }, {
  67031. key: "lock",
  67032. value: function lock() {
  67033. this.locked = Deferred$1();
  67034. }
  67035. /**
  67036. * 恢复加载资源
  67037. */
  67038. }, {
  67039. key: "unlock",
  67040. value: function unlock() {
  67041. if (this.locked) {
  67042. this.locked.resolve();
  67043. this.locked = null;
  67044. }
  67045. }
  67046. /**
  67047. * 显示标尺
  67048. */
  67049. }, {
  67050. key: "showRule",
  67051. value: function showRule() {
  67052. this.app.core.get('Player').model.wallManager.switchDisplay(true);
  67053. }
  67054. /**
  67055. * 隐藏标尺
  67056. */
  67057. }, {
  67058. key: "hideRule",
  67059. value: function hideRule() {
  67060. this.app.core.get('Player').model.wallManager.switchDisplay(false);
  67061. }
  67062. }]);
  67063. return Scene;
  67064. }(tinyEmitter);
  67065. var MinMap = /*#__PURE__*/function () {
  67066. function MinMap(app) {
  67067. _classCallCheck(this, MinMap);
  67068. this.app = app;
  67069. this.plugin = null;
  67070. this.display = null;
  67071. this.hidden = false;
  67072. this.deferred = Deferred$1();
  67073. }
  67074. _createClass(MinMap, [{
  67075. key: "install",
  67076. value: function install(plugin) {
  67077. this.plugin = plugin;
  67078. this.deferred.resolve(this.plugin);
  67079. }
  67080. }, {
  67081. key: "use",
  67082. value: function use() {
  67083. if (this.plugin) {
  67084. return Promise.resolve(this.plugin);
  67085. } else {
  67086. return this.deferred;
  67087. }
  67088. }
  67089. }, {
  67090. key: "show",
  67091. value: function show(force) {
  67092. var _this = this;
  67093. this.display = true;
  67094. if (force) {
  67095. this.hidden = false;
  67096. }
  67097. if (this.hidden) {
  67098. return Promise.resolve();
  67099. }
  67100. return this.use().then(function () {
  67101. return _this.plugin.show();
  67102. });
  67103. }
  67104. }, {
  67105. key: "hide",
  67106. value: function hide(force) {
  67107. var _this2 = this;
  67108. this.display = false;
  67109. if (force) {
  67110. this.hidden = true;
  67111. }
  67112. return this.use().then(function () {
  67113. return _this2.plugin.hide();
  67114. });
  67115. }
  67116. }, {
  67117. key: "reload",
  67118. value: function reload() {
  67119. var _this3 = this;
  67120. return this.use().then(function () {
  67121. return _this3.plugin.data(true);
  67122. });
  67123. }
  67124. }]);
  67125. return MinMap;
  67126. }();
  67127. var DataSYNC = /*#__PURE__*/function () {
  67128. function DataSYNC(app) {
  67129. _classCallCheck(this, DataSYNC);
  67130. this.app = app;
  67131. }
  67132. _createClass(DataSYNC, [{
  67133. key: "use",
  67134. value: function () {
  67135. var _use = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee(name, data) {
  67136. var cad;
  67137. return regenerator.wrap(function _callee$(_context) {
  67138. while (1) {
  67139. switch (_context.prev = _context.next) {
  67140. case 0:
  67141. _context.next = 2;
  67142. return this.app.CadManager.use();
  67143. case 2:
  67144. cad = _context.sent;
  67145. cad.sync.use(name, data);
  67146. case 4:
  67147. case "end":
  67148. return _context.stop();
  67149. }
  67150. }
  67151. }, _callee, this);
  67152. }));
  67153. function use(_x, _x2) {
  67154. return _use.apply(this, arguments);
  67155. }
  67156. return use;
  67157. }()
  67158. }]);
  67159. return DataSYNC;
  67160. }();
  67161. 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); }; }
  67162. 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; } }
  67163. var _render = /*#__PURE__*/_classPrivateFieldKey("render");
  67164. var ObjectManager = /*#__PURE__*/function (_Emiter) {
  67165. _inherits(ObjectManager, _Emiter);
  67166. var _super = _createSuper$C(ObjectManager);
  67167. function ObjectManager(app) {
  67168. var _this;
  67169. _classCallCheck(this, ObjectManager);
  67170. _this = _super.call(this);
  67171. Object.defineProperty(_assertThisInitialized(_this), _render, {
  67172. value: _render2
  67173. });
  67174. _this.app = app;
  67175. _this.marks = [];
  67176. _this.player = null;
  67177. _this.enable = true;
  67178. _this.app.Scene.on('ready', function () {
  67179. _this.player = _this.app.core.get('Player');
  67180. _this.player.on(PlayerEvents.ViewChanged, _classPrivateFieldBase(_assertThisInitialized(_this), _render)[_render].bind(_assertThisInitialized(_this)));
  67181. });
  67182. return _this;
  67183. }
  67184. _createClass(ObjectManager, [{
  67185. key: "add",
  67186. value: function add(mark) {
  67187. if (!mark || !mark.position) {
  67188. return;
  67189. }
  67190. mark.position = new THREE.Vector3(mark.position.x, mark.position.y, mark.position.z);
  67191. mark.position.y = -1;
  67192. this.marks.push(mark);
  67193. }
  67194. }, {
  67195. key: "filter",
  67196. value: function filter(func) {}
  67197. }]);
  67198. return ObjectManager;
  67199. }(tinyEmitter);
  67200. function _render2() {
  67201. var _this2 = this;
  67202. var marks = this.marks || [];
  67203. if (marks.length) {
  67204. var mode = this.player.mode;
  67205. var floorId = this.player.model.currentFloor.floorIndex;
  67206. marks.forEach(function (item) {
  67207. if (!item.position) {
  67208. return;
  67209. }
  67210. var result = convertTool.getPos2d(item.position, _this2.player);
  67211. if (!result.trueSide) {
  67212. item.visible = false;
  67213. return;
  67214. }
  67215. if (convertTool.ifShelter(item.position, _this2.player, {
  67216. x: result.vector.x,
  67217. y: result.vector.y
  67218. }, null, _this2.player.model.allFloorsVisible ? null : floorId)) {
  67219. item.visible = false;
  67220. return;
  67221. }
  67222. if (item.mode && item.mode != mode) {
  67223. item.visible = false;
  67224. return;
  67225. }
  67226. if (item.floorId != void 0 && item.floorId != floorId) {
  67227. item.visible = false;
  67228. return;
  67229. } // let scale = (this.player.domElement.clientWidth * (1 / 50)) / Math.abs(this.player.cameraControls.activeControl.camera.left)
  67230. // item.scale = THREE.MathUtils.clamp(scale, 0.4, 3)
  67231. item.x = result.pos.x;
  67232. item.y = result.pos.y;
  67233. item.visible = true;
  67234. });
  67235. this.emit('render', {
  67236. marks,
  67237. mode,
  67238. floorId
  67239. });
  67240. }
  67241. }
  67242. 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); }; }
  67243. 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; } }
  67244. var BoxVideo = /*#__PURE__*/function () {
  67245. function BoxVideo(app) {
  67246. var _this = this;
  67247. _classCallCheck(this, BoxVideo);
  67248. this.getOverlayBySid = function (sid) {
  67249. var player = _this.app.core.get('Player');
  67250. var overlay = player.OverlayManager.list.find(function (overlay) {
  67251. return overlay.sid == sid;
  67252. });
  67253. if (!overlay) overlay = player.OverlayManager.list[0], console.warn('无效sid:', sid, overlay);
  67254. return overlay;
  67255. };
  67256. this.app = app;
  67257. this.edit = {};
  67258. this.deferred = Deferred$1();
  67259. var _player = null;
  67260. this.app.Scene.on('loaded', function () {
  67261. _player = _this.app.core.get('Player');
  67262. _player.EditOverlay = new EditOverlay(_player);
  67263. _player.OverlayManager = new OverlayManager(_player); // player.model.createTranControl(player)
  67264. _this.deferred.resolve();
  67265. _this.app.Scene.emit('BoxVideo.loaded');
  67266. }); // 进入“添加视频”时执行
  67267. this.edit.enter = function () {
  67268. // 等到EditOverlay初始化才能enter
  67269. _this.waitOverlayManager(function () {
  67270. var init = function init() {
  67271. if (!_player.EditOverlay.transformControls) {
  67272. _player.EditOverlay.init();
  67273. } else {
  67274. _player.EditOverlay.enter();
  67275. }
  67276. setTimeout(function () {
  67277. // 进入添加视频后,自动跳转向boxvideo(需要setTimeout一下,否则刷新后从floorplan切换过来会卡在checkAndWaitForPanoLoad)
  67278. var overlay = _player.OverlayManager.decoratePlaneGroup.children.filter(function (overlay) {
  67279. return overlay.overlayType == 'video';
  67280. })[0];
  67281. overlay && _player.OverlayManager.clickOverlay(overlay, {
  67282. dontEmit: true
  67283. });
  67284. }, 0);
  67285. };
  67286. if (_player.model.mode == 'panorama') init();else _this.app.Camera.once('mode.afterChange', init);
  67287. }, _this.edit.enter.bind(_this));
  67288. }; // 离开“添加视频”时执行
  67289. this.edit.exit = function () {
  67290. _player && _player.EditOverlay.leave();
  67291. }; // 保存数据(info:{data: VideoInfoJson, done(): 保存成功时执行,更新可撤销数据})
  67292. this.edit.save = function (type, done) {
  67293. var info;
  67294. try {
  67295. info = _player.EditOverlay.getOverlaySavingInfo();
  67296. } catch (error) {
  67297. console.error(error);
  67298. }
  67299. if (type === 'save') {
  67300. _player.modelSideManager.recover();
  67301. }
  67302. return info;
  67303. }; // 撤销未保存的数据
  67304. this.edit.undoEdit = function () {
  67305. _player.EditOverlay.undoEdit();
  67306. _player.modelSideManager.recover();
  67307. }; // 开始视频位置的选择
  67308. this.edit.add = function () {
  67309. _player.EditOverlay.beginToAddPlane();
  67310. _player.mode === Viewmode$1.FLOORPLAN && _player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  67311. _player.modelSideManager.tempAuto(); //#45013 #45011 产品要求编辑时恢复backside
  67312. }; // 上传视频(file:VueComponent,media:HTMLVideoElement | HTMLImageElement)
  67313. this.edit.upload = function (file, media) {
  67314. if (media.videoWidth || media.width) {
  67315. _player.EditOverlay.overlayUploaded(file, media);
  67316. } else {
  67317. media.onloadedmetadata = function () {
  67318. _player.EditOverlay.overlayUploaded(file, media);
  67319. };
  67320. }
  67321. }; // 删除视频(delFunc:删除成功时执行,从3d中删除视频)
  67322. this.edit.delete = function (sid, delFunc) {
  67323. var overlay = _this.getOverlayBySid(sid);
  67324. _player.EditOverlay.DeleteOverlay(overlay, delFunc);
  67325. }; // 看向3d视频
  67326. this.edit.lookAt = function (sid) {
  67327. var overlay = _this.getOverlayBySid(sid);
  67328. _player.OverlayManager.clickOverlay(overlay, {
  67329. dontEmit: true
  67330. });
  67331. }; // 看向并选中3d视频
  67332. this.edit.select = function (sid) {
  67333. var overlay = _this.getOverlayBySid(sid);
  67334. _player.OverlayManager.clickOverlay(overlay);
  67335. _player.mode === Viewmode$1.FLOORPLAN && _player.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  67336. _player.modelSideManager.tempAuto();
  67337. }; // 取消选中(隐藏控制柄)
  67338. this.edit.unselect = function () {
  67339. var overlay = _player.EditOverlay.editPlane;
  67340. if (overlay) {
  67341. overlay.raycastToFindFloor();
  67342. overlay.updateVisibleOnFloor();
  67343. _player.EditOverlay.controlSelectOverlay(null);
  67344. _player.EditOverlay.editPlane = null;
  67345. }
  67346. _player.mode === Viewmode$1.FLOORPLAN && _player.model.floorplanCadImg.showCadPlane(); // 显示户型图
  67347. _player.emit('endEditOverlay');
  67348. }; // 设置显隐(isShow:true / false)
  67349. this.edit.setVisible = function (sid, isShow) {
  67350. var overlay = _this.getOverlayBySid(sid);
  67351. isShow ? overlay.show('forceHide') : overlay.hide('forceHide');
  67352. if (!_player.EditOverlay.editPlane) return;
  67353. _player.EditOverlay.controlSelectOverlay(overlay.visible ? overlay : null);
  67354. }; // 左右翻转
  67355. this.edit.reverse = function (isReverse) {
  67356. var overlay = _player.EditOverlay.editPlane;
  67357. overlay.scale.x = Math.abs(overlay.scale.x) * (isReverse ? -1 : 1); // 需要更新visible 虽然不知道为什么,但不更新的话可见按钮就失效
  67358. //overlay.info.reverse = !overlay.info.reverse
  67359. /* let infoCopy = JSON.parse(JSON.stringify(overlay.info))
  67360. infoCopy.sid = overlay.sid
  67361. infoCopy.hide = overlay.isHidden //!common.getObjVisiByReason(overlay, 'forceHide')
  67362. this.app.VideoManager.emit('videos/panel/display', infoCopy) */
  67363. }; // 切换控制柄的类型(index:0(平移) / 1(缩放) / 2(旋转))
  67364. this.edit.transfrom = function (index) {
  67365. if (!_player.EditOverlay.editing) return;
  67366. var transformControls = _player.EditOverlay.transformControls;
  67367. setTimeout(function () {
  67368. transformControls.mode = index == 0 ? 'translate' : index == 1 ? 'scale' : 'rotate';
  67369. var overlay = _player.EditOverlay.editPlane;
  67370. overlay.visible && overlay.frame.switchTranformControls(transformControls);
  67371. }, 0);
  67372. }; // 设置视频的宽高(type:'W' / 'H')
  67373. this.edit.setPlaneWH = function (type, newData) {
  67374. var overlay = _player.EditOverlay.editPlane;
  67375. newData.value = THREE.MathUtils.clamp(newData.value, newData.min, newData.max);
  67376. if (type == 'W') {
  67377. overlay.scale.x *= newData.value / overlay.width;
  67378. overlay.width = newData.value;
  67379. }
  67380. if (type == 'H') {
  67381. overlay.scale.y *= newData.value / overlay.height;
  67382. overlay.height = newData.value;
  67383. } // player.EditOverlay.useImgRatio() //自适应比例
  67384. overlay.frame && overlay.frame.update({
  67385. mode: 'scale'
  67386. });
  67387. return newData.value;
  67388. }; // 设置视频的厚度(data:{value, min, max})
  67389. this.edit.setThinkness = function (data) {
  67390. var overlay = _player.EditOverlay.editPlane;
  67391. data.value = THREE.MathUtils.clamp(data.value, data.min, data.max);
  67392. if (overlay.frame) {
  67393. overlay.depth = data.value / 100;
  67394. overlay.frame.setFrameThickness(overlay.depth);
  67395. } else {
  67396. if (data.value == 0) {
  67397. overlay.addBox(false);
  67398. overlay.depth = 0.001;
  67399. overlay.scale.z = 0.001;
  67400. } else {
  67401. overlay.addBox(true);
  67402. overlay.depth = data.value / 100;
  67403. overlay.scale.z = data.value / 100 / settings$3.overlay.depth;
  67404. }
  67405. return data.value;
  67406. }
  67407. }; // 仅恢复视频的原始宽高比例和厚度
  67408. this.edit.resetRatio = function () {
  67409. var overlay = _player.EditOverlay.editPlane;
  67410. if (overlay.overlayType) {
  67411. // this.edit.setThinkness({ value: overlay.info.depth, min: 0, max: overlay.info.depth })
  67412. overlay.width /= overlay.scale.x;
  67413. overlay.height /= overlay.scale.y;
  67414. overlay.scale.setX(1);
  67415. overlay.scale.setY(1);
  67416. _player.EditOverlay.updateOverlayScaleDisplay(); // player.EditOverlay.VideoManager.emit('videos/panel/changeDepth', 0)
  67417. _player.EditOverlay.useImgRatio();
  67418. overlay.frame && overlay.frame.update({
  67419. mode: 'scale'
  67420. });
  67421. }
  67422. };
  67423. this.edit.getCurentPanoVisi = function () {
  67424. return _player.OverlayManager.list.filter(function (overlay) {
  67425. return overlay.visiblePanos.find(function (pano) {
  67426. return pano == _player.currentPano;
  67427. });
  67428. });
  67429. }; // 设置空间视频边框
  67430. this.edit.setOverlayFrame = function (frameData) {
  67431. var overlay = _player.EditOverlay.editPlane;
  67432. overlay.addFrame(frameData.type);
  67433. if (overlay.visible) {
  67434. // 更新transformControls
  67435. var transformControls = _player.EditOverlay.transformControls;
  67436. if (overlay.frame) overlay.frame.switchTranformControls(transformControls);else transformControls.attach(overlay);
  67437. }
  67438. /* // 需要更新visible、depth、frameType
  67439. let infoCopy = JSON.parse(JSON.stringify(overlay.info))
  67440. infoCopy.sid = overlay.sid
  67441. infoCopy.hide = overlay.isHidden //!common.getObjVisiByReason(overlay, 'forceHide') //infoCopy.hide = !overlay.visible
  67442. infoCopy.depth = overlay.depth
  67443. infoCopy.frameType = overlay.frame.type
  67444. this.app.VideoManager.emit('videos/panel/display', infoCopy) */
  67445. }; // 限制仅当前pano可视
  67446. this.edit.limitToCurrentPano = function (shouldLimit) {
  67447. var overlay = _player.EditOverlay.editPlane;
  67448. /*overlay.limitToOnlyPano = !!shouldLimit // 先标识为true,等保存时确定pano */
  67449. overlay.limitToOnlyPano = shouldLimit ? _player.currentPano : false;
  67450. overlay.show('limitToOnlyPano'); //无论开关,当前点都是可见的
  67451. };
  67452. }
  67453. _createClass(BoxVideo, [{
  67454. key: "showAll",
  67455. value: function showAll() {
  67456. var _this2 = this;
  67457. this.waitOverlayManager(function () {
  67458. var player = _this2.app.core.get('Player');
  67459. player.OverlayManager.setGroupVisible(true);
  67460. }, this.showAll.bind(this));
  67461. }
  67462. }, {
  67463. key: "hideAll",
  67464. value: function hideAll() {
  67465. var _this3 = this;
  67466. this.waitOverlayManager(function () {
  67467. var player = _this3.app.core.get('Player');
  67468. player.OverlayManager.setGroupVisible(false);
  67469. }, this.hideAll.bind(this));
  67470. }
  67471. }, {
  67472. key: "waitOverlayManager",
  67473. value: function waitOverlayManager(func, waitFunc) {
  67474. var player = this.app.core.get('Player');
  67475. if (player && player.OverlayManager && player.EditOverlay) {
  67476. func && func();
  67477. } else {
  67478. this.deferred.then(function () {
  67479. return waitFunc();
  67480. });
  67481. }
  67482. }
  67483. /**
  67484. * 是否可操作
  67485. * @param {boolean} enable 标识参数
  67486. */
  67487. }, {
  67488. key: "operable",
  67489. value: function operable(enable) {
  67490. var player = this.app.core.get('Player');
  67491. if (player.OverlayManager) {
  67492. player.OverlayManager.list.forEach(function (overlay) {
  67493. var layer = enable ? RenderLayers.DEFAULT : RenderLayers.RETICULE;
  67494. overlay.layers.set(layer);
  67495. overlay.children.forEach(function (mesh) {
  67496. return mesh.layers.set(layer);
  67497. });
  67498. });
  67499. }
  67500. }
  67501. }]);
  67502. return BoxVideo;
  67503. }();
  67504. var VideoManager = /*#__PURE__*/function (_Emiter) {
  67505. _inherits(VideoManager, _Emiter);
  67506. var _super = _createSuper$B(VideoManager);
  67507. function VideoManager(app) {
  67508. var _this4;
  67509. _classCallCheck(this, VideoManager);
  67510. _this4 = _super.call(this);
  67511. _this4.BoxVideo = new BoxVideo(app);
  67512. return _this4;
  67513. }
  67514. return VideoManager;
  67515. }(tinyEmitter);
  67516. 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); }; }
  67517. 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; } }
  67518. var RepairManager = /*#__PURE__*/function (_Emiter) {
  67519. _inherits(RepairManager, _Emiter);
  67520. var _super = _createSuper$A(RepairManager);
  67521. function RepairManager(app) {
  67522. var _this;
  67523. _classCallCheck(this, RepairManager);
  67524. _this = _super.call(this);
  67525. _this.app = app;
  67526. _this.edit = {};
  67527. _this.mosaic = Deferred$1();
  67528. _this.mosaics = [];
  67529. var player;
  67530. var deferred = Deferred$1();
  67531. _this.app.Scene.on('loaded', function () {
  67532. _this.mosaics = _this.app.store.getValue('metadata').mosaicList || [];
  67533. player = _this.app.core.get('Player');
  67534. deferred.resolve();
  67535. }); // 看向球幕视频
  67536. _this.edit.focusVideo = function (panoId) {
  67537. var pano = player.model.panos.index[panoId];
  67538. if (player.flying) {
  67539. //player.waitFlytoItemFuc = () => {}
  67540. player.once('flying.ended', function () {
  67541. _this.edit.focusVideo(panoId);
  67542. });
  67543. return;
  67544. }
  67545. player.flyToPano({
  67546. pano
  67547. }, function () {});
  67548. };
  67549. /**
  67550. * 涂抹效果
  67551. */
  67552. // 开始涂抹
  67553. _this.edit.startPaint = function () {
  67554. player.flyToNewMode({
  67555. mode: 'panorama',
  67556. pano: player.currentPano,
  67557. callback: function callback() {
  67558. player.paintEditor.start();
  67559. player.OverlayManager.hide('all'); //box视频
  67560. player.viewLinkManager.hideAllViews(); //场景关联
  67561. }
  67562. });
  67563. }; // 退出涂抹
  67564. _this.edit.cancelPaint = function () {
  67565. player.paintEditor.cancel();
  67566. player.OverlayManager.show('all');
  67567. player.viewLinkManager.showAllViews();
  67568. }; // 选择笔刷 0:橡皮 1:马赛克 2:高斯模糊
  67569. _this.edit.selectBrush = function (type) {
  67570. player.paintEditor.changeBrush(type);
  67571. }; // 设置笔刷大小
  67572. _this.edit.setBrushSize = function (size) {
  67573. player.paintEditor.setBrushSize(size);
  67574. }; // 保存涂抹
  67575. _this.edit.savePaint = function () {
  67576. return player.paintEditor.save();
  67577. }; // 删除涂抹
  67578. _this.edit.deletePaint = function (panoId) {
  67579. player.paintEditor.paintData = player.paintEditor.paintData.filter(function (data) {
  67580. return data.panoId != panoId;
  67581. });
  67582. if (player.currentPano.id == panoId) {
  67583. player.paintEditor.updatePanoPaint(panoId, panoId);
  67584. }
  67585. }; // 检查是否涂抹过
  67586. _this.edit.checkPaintEdit = function () {
  67587. return player.paintEditor.hasEdit;
  67588. };
  67589. return _this;
  67590. }
  67591. _createClass(RepairManager, [{
  67592. key: "install",
  67593. value: function install(name, plugin) {
  67594. if (this[name]) {
  67595. this[name].resolve(plugin);
  67596. }
  67597. }
  67598. }]);
  67599. return RepairManager;
  67600. }(tinyEmitter);
  67601. var MeshDraw = {
  67602. getShape: function getShape(shapes, holes) {
  67603. //不一定闭合 暂时所有shapes共享holes。如果要单独的话, shapes改为[{shape:[],holes:[]},{}]的形式
  67604. if (shapes[0] && !(shapes[0] instanceof Array)) {
  67605. //仅是一个shape的点
  67606. shapes = [shapes];
  67607. }
  67608. var holesArr = [];
  67609. if (holes) {
  67610. //挖空
  67611. holes.forEach(function (points) {
  67612. var holePath = new THREE.Path();
  67613. holePath.moveTo(points[0].x, points[0].y);
  67614. for (var i = 1, len = points.length; i < len; i++) {
  67615. holePath.lineTo(points[i].x, points[i].y);
  67616. }
  67617. holesArr.push(holePath);
  67618. });
  67619. }
  67620. var shapesArr = shapes.map(function (points) {
  67621. var _shape$holes;
  67622. var shape = new THREE.Shape();
  67623. shape.moveTo(points[0].x, points[0].y);
  67624. for (var i = 1, len = points.length; i < len; i++) {
  67625. shape.lineTo(points[i].x, points[i].y);
  67626. }
  67627. (_shape$holes = shape.holes).push.apply(_shape$holes, holesArr);
  67628. shape.dontClose = points.dontClose; //add 有的shape不需要闭合
  67629. return shape;
  67630. });
  67631. return shapesArr;
  67632. },
  67633. getShapeGeo: function getShapeGeo(shapes, holes) {
  67634. //获取任意形状(多边形或弧形)的形状面 //quadraticCurveTo() 这是弧形的含函数
  67635. var geometry = new THREE.ShapeBufferGeometry(this.getShape(shapes, holes)); //ShapeGeometry
  67636. /* var matrix = new THREE.Matrix4();//将竖直的面变为水平
  67637. matrix.set(//z = y
  67638. 1, 0, 0, 0,
  67639. 0, 0, 0, 0,
  67640. 0, 1, 0, 0,
  67641. 0, 0, 0, 1
  67642. )
  67643. geometry.applyMatrix(matrix) */
  67644. //geometry.computeVertexNormals();//对于光照需要的是点法线
  67645. return geometry;
  67646. },
  67647. lessCurvePoints: function lessCurvePoints(points, oldCount) {
  67648. var minRad = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.03;
  67649. var UtoTMapArr = arguments.length > 3 ? arguments[3] : undefined;
  67650. //减少点数(拐弯的部分紧凑些,直线部分宽松些):
  67651. var count = points.length;
  67652. var newUtoTMapArr = [];
  67653. var newPoints = [];
  67654. var lastVec;
  67655. performance.now();
  67656. /* if(UtoTMapArr){
  67657. for(let n=1;n<oldCount-1;n++){
  67658. pointIndexs.push( UtoTMapArr.findIndex(e=>e>= n / (oldCount-1) ) )
  67659. }
  67660. } */
  67661. //console.log('cost dur:', performance.now() - startTime )
  67662. var nextUtoTIndex = 1;
  67663. for (var i = 0; i < count; i++) {
  67664. var point = points[i];
  67665. points[i - 1];
  67666. var next = points[i + 1];
  67667. if (i == 0 || i == count - 1) {
  67668. newPoints.push(point); //直接加入
  67669. UtoTMapArr && newUtoTMapArr.push(i == 0 ? 0 : 1);
  67670. } else {
  67671. var curVec = new THREE.Vector3().subVectors(next, point);
  67672. if (!lastVec) lastVec = curVec;
  67673. if (i > 1) {
  67674. // 和上一个加入点的vec之间的夹角如果过大就加入
  67675. var reachNextUToT = void 0; //找出新点中对应原先控制点的index,这些点必须加入拐点,否则会出现控制点偏移path(当它所在部分接近直线时)
  67676. if (UtoTMapArr) {
  67677. while (UtoTMapArr[i] > nextUtoTIndex / (oldCount - 1)) {
  67678. //可能多个控制点对应一个点,当控制点很近时
  67679. reachNextUToT = true;
  67680. nextUtoTIndex++;
  67681. }
  67682. }
  67683. if (
  67684. /* pointIndexs.includes(i) || */
  67685. reachNextUToT || curVec.angleTo(lastVec) > minRad) {
  67686. //最小角度 (注意原始点不能太稀疏)
  67687. newPoints.push(point);
  67688. UtoTMapArr && newUtoTMapArr.push(UtoTMapArr[i]);
  67689. lastVec = curVec;
  67690. }
  67691. }
  67692. }
  67693. }
  67694. return {
  67695. newUtoTMapArr,
  67696. newPoints
  67697. };
  67698. },
  67699. getExtrudeGeo: function getExtrudeGeo(shapes, holes) {
  67700. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
  67701. openEnded: false,
  67702. shapeDontClose: false
  67703. };
  67704. //获得挤出棱柱,可以选择传递height,或者extrudePath
  67705. var shape = this.getShape(shapes, holes); //points是横截面 [vector2,...]
  67706. if (options.extrudePath) {
  67707. // 路径 :[vector3,...]
  67708. var length = options.extrudePath.reduce(function (total, currentValue, currentIndex, arr) {
  67709. if (currentIndex == 0) return 0;
  67710. return total + currentValue.distanceTo(arr[currentIndex - 1]);
  67711. }, 0); //options.extrudePath = new THREE.CatmullRomCurve3(options.extrudePath)
  67712. if (options.extrudePath.length == 2) {
  67713. options.tension = 0; //否则一端扭曲
  67714. options.steps = 1;
  67715. }
  67716. {
  67717. //去掉重复的点
  67718. var path = [];
  67719. var minDis = options.dontSmooth ? 0 : 0.2; //CatmullRomCurve3 经常扭曲,如果两个点靠得很近可能会扭曲,这里去除靠的太近的点。但去除后依旧会出现一定扭曲.
  67720. options.extrudePath.forEach(function (p, i) {
  67721. if (i == 0 || i == options.extrudePath.length - 1) return path.push(p); //首尾直接加入
  67722. var last = path[path.length - 1]; //和上一个比
  67723. var dis = last.distanceTo(p);
  67724. if (dis <= minDis) {
  67725. console.log("\u7B2C".concat(i, "\u4E2A\u70B9(").concat(p.toArray(), ")\u56E0\u4E3A\u548C\u4E0A\u4E00\u4E2A\u6570\u636E(").concat(last.toArray(), ")\u592A\u63A5\u8FD1(dis:").concat(dis, ")\u6240\u4EE5\u5220\u9664"));
  67726. } else if (i == options.extrudePath.length - 2) {
  67727. //因为最后一个必定加入,所以倒数第二个还也不能太靠近最后一个
  67728. last = options.extrudePath[options.extrudePath.length - 1]; //和下一个(最后一个比)
  67729. if (dis <= minDis) {
  67730. console.log("\u7B2C".concat(i, "\u4E2A\u70B9(").concat(p.toArray(), ")\u56E0\u4E3A\u548C\u4E0B\u4E00\u4E2A\u6570\u636E(").concat(last.toArray(), ")\u592A\u63A5\u8FD1(dis:").concat(dis, ")\u6240\u4EE5\u5220\u9664"));
  67731. } else {
  67732. path.push(p);
  67733. }
  67734. } else {
  67735. path.push(p);
  67736. }
  67737. });
  67738. options.extrudePath = path;
  67739. }
  67740. if (!options.dontSmooth) {
  67741. //平滑连续的曲线(但经常会有扭曲的问题,tension:0能缓解, 另外shape和path都最好在原点附近,也就是点需减去bound.min )
  67742. options.extrudePath = new THREE.CatmullRomCurve3(options.extrudePath, options.closed, 'catmullrom'
  67743. /* 'centripetal' */
  67744. , options.tension); //tension:张力, 越大弯曲越大。 随着长度增长,该值需要减小,否则会扭曲
  67745. if (options.lessPoints !== false) {
  67746. //曲线但压缩直线部分点数量
  67747. options.extrudePath.UtoTMapArr = []; //用于存储 getSpacedPoints得到的点对应points的百分比对应
  67748. var count = Math.max(2, Math.round(length * (options.lessSpace || 200))); //为了防止有大拐弯才设置这么高
  67749. var points = options.extrudePath.getSpacedPoints(count - 1); //拆分为更密集的点
  67750. var result = this.lessCurvePoints(points, options.extrudePath.points.length, options.minRad, options.extrudePath.UtoTMapArr); //传UtoTMapArr的话点太多了卡住了
  67751. //options.extrudePath = points
  67752. options.extrudePath = result.newPoints;
  67753. options.dontSmooth = true;
  67754. }
  67755. }
  67756. if (options.dontSmooth) {
  67757. var curvePath = new THREE.CurvePath(); //通用的曲线路径对象,它可以包含直线段和曲线段。在这里只做折线
  67758. curvePath.points = options.extrudePath; //add
  67759. for (var i = 0; i < options.extrudePath.length - 1; i++) {
  67760. var curve3 = new THREE.LineCurve3(options.extrudePath[i], options.extrudePath[i + 1]); //添加线段
  67761. curvePath.add(curve3);
  67762. }
  67763. options.steps = options.extrudePath.length - 1;
  67764. options.extrudePath = curvePath;
  67765. options.tension = 0; //已修改过three,原本会平分细分,现在dontSmooth时会直接按照控制点来分段
  67766. }
  67767. }
  67768. var extrudeSettings = $.extend(options, {
  67769. steps: options.steps != void 0 ? options.steps : options.extrudePath ? Math.round(length / (options.spaceDis || 0.2)) : 1,
  67770. //分成几段 spaceDis每段长度
  67771. bevelEnabled: false //不加的话,height为0时会有圆弧高度
  67772. //openEnded默认false
  67773. });
  67774. var geometry = new THREE.ExtrudeBufferGeometry(shape, extrudeSettings); //修改了three.js文件, buildLidFaces处,创建顶底面加了选项,可以选择开口。
  67775. return geometry;
  67776. /* tension = 0:曲线会变成一条直线,没有弯曲。
  67777. tension = 0.5:曲线会经过所有控制点,并保持自然的弯曲。
  67778. tension > 0.5:曲线会更平滑,远离控制点之间的路径。
  67779. tension < 0.5:曲线会更贴近控制点之间的路径,弯曲更明显。 */
  67780. },
  67781. getUnPosPlaneGeo: function () {
  67782. //获取还没有赋值位置的plane geometry
  67783. var e = new Uint16Array([0, 1, 2, 0, 2, 3]),
  67784. // , t = new Float32Array([-.5, -.5, 0, .5, -.5, 0, .5, .5, 0, -.5, .5, 0])
  67785. i = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]),
  67786. g = new THREE.BufferGeometry();
  67787. g.setIndex(new THREE.BufferAttribute(e, 1)), //g.addAttribute("position", new n.BufferAttribute(t, 3)),
  67788. g.setAttribute('uv', new THREE.BufferAttribute(i, 2));
  67789. return function () {
  67790. return g;
  67791. };
  67792. }(),
  67793. getPlaneGeo: function getPlaneGeo(A, B, C, D) {
  67794. var geo = this.getUnPosPlaneGeo().clone();
  67795. var pos = [A.x, A.y, A.z, B.x, B.y, B.z, C.x, C.y, C.z, D.x, D.y, D.z]; //geo.addAttribute("position", new THREE.BufferAttribute(pos, 3))
  67796. geo.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3));
  67797. geo.computeVertexNormals();
  67798. geo.computeBoundingSphere(); //for raycaster
  67799. return geo;
  67800. },
  67801. drawPlane: function drawPlane(A, B, C, D, material) {
  67802. var wall = new THREE.Mesh(this.getPlaneGeo(A, B, C, D), material);
  67803. return wall;
  67804. },
  67805. movePlane: function movePlane(mesh, A, B, C, D) {
  67806. 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]);
  67807. mesh.geometry.addAttribute('position', new THREE.BufferAttribute(pos, 3));
  67808. mesh.geometry.computeBoundingSphere(); //for checkIntersect
  67809. },
  67810. createGeometry: function createGeometry(posArr, faceArr, uvArr, normalArr) {
  67811. //创建复杂mesh. faceArr:[[0,1,2],[0,2,3]]
  67812. var geo = new THREE.BufferGeometry();
  67813. var positions = [];
  67814. posArr.forEach(function (p) {
  67815. return positions.push(p.x, p.y, p.z);
  67816. });
  67817. geo.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
  67818. if (faceArr) {
  67819. var indice = [];
  67820. faceArr.forEach(function (f) {
  67821. return indice.push.apply(indice, _toConsumableArray(f));
  67822. });
  67823. geo.setIndex(indice); // auto set Uint16BufferAttribute or Uint32BufferAttribute
  67824. }
  67825. if (uvArr) {
  67826. var uvs = [];
  67827. uvArr.forEach(function (uv) {
  67828. return uvs.push(uv.x, uv.y);
  67829. });
  67830. geo.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));
  67831. }
  67832. if (normalArr) {
  67833. var normals = [];
  67834. normalArr.forEach(function (n) {
  67835. return normals.push(n.x, n.y, n.z);
  67836. });
  67837. geo.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));
  67838. }
  67839. /*
  67840. geo.computeVertexNormals()
  67841. geo.computeBoundingSphere() //for raycaster
  67842. */
  67843. return geo;
  67844. },
  67845. updateGeometry: function updateGeometry(geo, posArr, faceArr, uvArr, normalArr) {
  67846. //创建复杂mesh. faceArr:[[0,1,2],[0,2,3]]
  67847. var positions = [];
  67848. posArr.forEach(function (p) {
  67849. return positions.push(p.x, p.y, p.z);
  67850. });
  67851. geo.setAttribute('position', new THREE.Float32BufferAttribute(positions, 3));
  67852. geo.attributes.position.needsUpdate = true;
  67853. if (faceArr) {
  67854. var indice = [];
  67855. faceArr.forEach(function (f) {
  67856. return indice.push.apply(indice, _toConsumableArray(f));
  67857. });
  67858. geo.setIndex(indice); // auto set Uint16BufferAttribute or Uint32BufferAttribute
  67859. }
  67860. if (uvArr) {
  67861. var uvs = [];
  67862. uvArr.forEach(function (uv) {
  67863. return uvs.push(uv.x, uv.y);
  67864. });
  67865. geo.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));
  67866. }
  67867. if (normalArr) {
  67868. var normals = [];
  67869. normalArr.forEach(function (n) {
  67870. return normals.push(n.x, n.y, n.z);
  67871. });
  67872. geo.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));
  67873. }
  67874. /*
  67875. geo.computeVertexNormals()
  67876. */
  67877. geo.computeBoundingSphere(); //for raycaster and visi
  67878. return geo;
  67879. }
  67880. };
  67881. 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); }; }
  67882. 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; } }
  67883. var getMeshQuaInPath = function getMeshQuaInPath(lineDir) {
  67884. /* const quaBase = new THREE.Quaternion().setFromEuler(new THREE.Euler(-Math.PI/2, 0, 0 ))
  67885. return convertTool.getQuaByAim(lineDir, new THREE.Vector3, new THREE.Vector3(1,0,0)).multiply(quaBase) */
  67886. //怎么改都会有时不贴合
  67887. var pitch = math$2.getPitchByDir(lineDir);
  67888. var yaw = math$2.getYawByDir(lineDir);
  67889. var rotation = new THREE.Euler();
  67890. rotation.order = 'YXZ';
  67891. rotation.z = pitch;
  67892. rotation.y = yaw; // + Math.PI / 2
  67893. return new THREE.Quaternion().setFromEuler(rotation);
  67894. };
  67895. var textureLoader = new THREE.TextureLoader();
  67896. var getEndCaps = function () {
  67897. var endCap, map;
  67898. return function (path) {
  67899. if (!endCap) {
  67900. map = textureLoader.load(texture.getImageURL('images/whiteCircle.png'));
  67901. map.anisotropy = 3;
  67902. map.repeat.set(0.5, 1);
  67903. var mesh = new THREE.Mesh(planeGeo$1);
  67904. mesh.scale.x = 0.5;
  67905. mesh.position.x = -0.25;
  67906. mesh.rotation.set(-Math.PI / 2, 0, 0);
  67907. endCap = new THREE.Object3D();
  67908. endCap.add(mesh);
  67909. mesh.renderOrder = RenderOrder.ribbon + 1;
  67910. }
  67911. var endCaps = [];
  67912. var material = new THREE.MeshBasicMaterial({
  67913. transparent: true,
  67914. /* depthTest: false, */
  67915. color: path.edgeColor,
  67916. opacity: path.opacity,
  67917. side: 0
  67918. });
  67919. material.map = map;
  67920. material.wireframe = false;
  67921. for (var i = 0; i < 2; i++) {
  67922. var cap = endCap.clone();
  67923. cap.children[0].material = material;
  67924. path.add(cap);
  67925. endCaps.push(cap);
  67926. }
  67927. return endCaps;
  67928. };
  67929. }();
  67930. var planeGeo$1 = new THREE.PlaneBufferGeometry(1, 1);
  67931. var voidGeometry = new THREE.BufferGeometry();
  67932. var Path = /*#__PURE__*/function (_THREE$Object3D) {
  67933. _inherits(Path, _THREE$Object3D);
  67934. var _super = _createSuper$z(Path);
  67935. function Path() {
  67936. var _this;
  67937. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  67938. arrowColor = _ref.arrowColor,
  67939. edgeColor = _ref.edgeColor,
  67940. _ref$opacity = _ref.opacity,
  67941. opacity = _ref$opacity === void 0 ? 0.5 : _ref$opacity;
  67942. _classCallCheck(this, Path);
  67943. _this = _super.call(this);
  67944. _this.edgeColor = edgeColor, _this.opacity = opacity;
  67945. var arrow_map = common$1.loadTextureFromCache(texture.getImageURL('images/arrow.png'));
  67946. arrow_map.anisotropy = 2;
  67947. arrow_map.wrapS = THREE.RepeatWrapping;
  67948. arrow_map.repeat.set(10, 1.3);
  67949. arrow_map.offset.set(0, -0.15);
  67950. _this.edge = new THREE.Mesh(voidGeometry, new THREE.ShaderMaterial({
  67951. uniforms: {
  67952. map: {
  67953. type: 't',
  67954. value: arrow_map
  67955. },
  67956. opacity: {
  67957. type: 'float',
  67958. value: opacity
  67959. },
  67960. baseColor: {
  67961. type: 'v3',
  67962. value: edgeColor
  67963. },
  67964. mapColor: {
  67965. type: 'v3',
  67966. value: arrowColor
  67967. }
  67968. },
  67969. defines: {
  67970. UV_Transform: '',
  67971. mapOverlay: ''
  67972. },
  67973. vertexShader: shaders.basicTextured.vertexShader,
  67974. fragmentShader: shaders.basicTextured.fragmentShader,
  67975. //depthWrite: !1,
  67976. //depthTest: !1,
  67977. transparent: true //side: THREE.DoubleSide,
  67978. }));
  67979. _this.add(_this.edge);
  67980. _this.edge.renderOrder = RenderOrder.ribbon;
  67981. _this.edge.name = 'pathEdge';
  67982. _this.panos = [];
  67983. _this.halfPathWidth = 0.15;
  67984. _this.visible = false;
  67985. return _this;
  67986. }
  67987. _createClass(Path, [{
  67988. key: "setPanos",
  67989. value: function setPanos(panos) {
  67990. console.log('setPanos', panos.map(function (e) {
  67991. return e.id;
  67992. }));
  67993. if (common$1.ifSame(this.panos, panos, [Panorama])) return;
  67994. var geo;
  67995. this.panos = panos;
  67996. var points = panos.map(function (e) {
  67997. return e.floorPosition.clone().add(new THREE.Vector3(0, 0.29 + 0.01 * Math.random(), 0));
  67998. } //避免被地板遮住, 高度随机避免重叠
  67999. );
  68000. points = this.getDifferentPoint(points);
  68001. var count = points.length;
  68002. this.edge.geometry.dispose();
  68003. this.points = points;
  68004. if (count <= 1) {
  68005. geo = voidGeometry;
  68006. this.geoPoints = [];
  68007. this.curve = null;
  68008. this.visible = false;
  68009. } else {
  68010. this.visible = true;
  68011. var curve = this.curve = new THREE.CatmullRomCurve3(points, false); //curve.UtoTMapArr = [] //用于存储 getSpacedPoints得到的点对应points的百分比对应
  68012. var oldCount = count;
  68013. count = Math.max(2, Math.round(this.getTotalDistance(points) * 200)), points = curve.getSpacedPoints(count - 1); //拆分为更密集的点
  68014. var result = MeshDraw.lessCurvePoints(points, oldCount, 0.05
  68015. /* , curve.UtoTMapArr */
  68016. ); //this.UtoTMapArr = result.newUtoTMapArr
  68017. points = result.newPoints;
  68018. count = points.length;
  68019. var posArr = [],
  68020. faceArr = [],
  68021. uvArr = [];
  68022. var gatherLen = 0; //累加长度
  68023. this.geoPoints = points; //根据点序列计算geometry
  68024. for (var i = 0; i < count; i++) {
  68025. var O = points[i]; //该点
  68026. var A = points[i - 1]; //上一个点
  68027. var B = points[i + 1]; //下一个点
  68028. var O_ = new THREE.Vector2(O.x, O.z);
  68029. var A_ = A && new THREE.Vector2(A.x, A.z);
  68030. var B_ = B && new THREE.Vector2(B.x, B.z);
  68031. var sideVec = void 0; //该点两边对应的向量
  68032. var uvX = void 0;
  68033. if (i == 0 || i == count - 1) {
  68034. var nor = math$2.getNormal({
  68035. points: [i == 0 ? B_ : O_, i == 0 ? O_ : A_]
  68036. }) || new THREE.Vector3(1, 0, 0);
  68037. sideVec = new THREE.Vector3(nor.x, 0, nor.y).multiplyScalar(this.halfPathWidth); //垂线
  68038. uvX = i == 0 ? 0 : 1; //percent of length
  68039. } else {
  68040. var OA = new THREE.Vector3().subVectors(A, O).setY(0).normalize(); //只保证俯视角度正确。(如果两点有高度差,该段四个点不会在同一平面,看起来有扭转,有的地方会肥大,但从俯视角度看是正确的。)
  68041. var OB = new THREE.Vector3().subVectors(B, O).setY(0).normalize();
  68042. var angle = math$2.getAngle(OA, OB, 'y');
  68043. if (math$2.closeTo(angle, 0, 1e-4) || math$2.closeTo(angle, Math.PI, 1e-4) || math$2.closeTo(angle, -Math.PI, 1e-4)) {
  68044. //这时候直接加两个向量算出的平分线不准,故直接找垂线
  68045. var _nor = math$2.getNormal({
  68046. points: [O_, A_]
  68047. }) || new THREE.Vector3(1, 0, 0);
  68048. sideVec = new THREE.Vector3(_nor.x, 0, _nor.y).multiplyScalar(this.halfPathWidth); //垂线
  68049. //console.log('接近0或180',angle, sideVec)
  68050. } else {
  68051. var midVecLength = this.halfPathWidth / Math.sin(angle / 2);
  68052. sideVec = new THREE.Vector3().addVectors(OA, OB).normalize().multiplyScalar(midVecLength); //角平分线 ( 和上一个方向保持在同一侧,故而顺时针和逆时针方向不同 )
  68053. }
  68054. gatherLen += O.distanceTo(A);
  68055. uvX = gatherLen / this.totalLength; //目前为止的长度占比
  68056. }
  68057. var P1 = new THREE.Vector3().addVectors(O, sideVec);
  68058. var P2 = new THREE.Vector3().subVectors(O, sideVec);
  68059. posArr.push(P1, P2);
  68060. uvArr.push({
  68061. x: uvX,
  68062. y: 0
  68063. }, {
  68064. x: uvX,
  68065. y: 1
  68066. });
  68067. if (i < count - 1) {
  68068. faceArr.push([i * 2, i * 2 + 3, i * 2 + 1], [i * 2, i * 2 + 2, i * 2 + 3]); //每一段两个三角形 013 032
  68069. }
  68070. }
  68071. geo = MeshDraw.createGeometry(posArr, faceArr, uvArr);
  68072. this.updateArrowRepeat();
  68073. this.updateEndCaps();
  68074. }
  68075. this.edge.geometry = geo; //this.lastHalfPathWidth = this.halfPathWidth
  68076. //this.lastUpdatePoints_ = this.points.map(e=>e.clone())
  68077. }
  68078. }, {
  68079. key: "getDifferentPoint",
  68080. value: function getDifferentPoint(points) {
  68081. //把连续一样的点去除
  68082. var result = [];
  68083. for (var i = 0; i < points.length; i++) {
  68084. var _result;
  68085. var p = points[i];
  68086. if ((_result = result[result.length - 1]) !== null && _result !== void 0 && _result.equals(p)) continue;else result.push(p);
  68087. }
  68088. return result;
  68089. }
  68090. }, {
  68091. key: "updateEndCaps",
  68092. value: function updateEndCaps() {
  68093. var _this2 = this;
  68094. var len = this.points.length;
  68095. var pts = this.geoPoints.length > 0 ? this.geoPoints : this.points;
  68096. var len2 = pts.length;
  68097. this.endCaps || (this.endCaps = getEndCaps(this)); //端点处的半圆
  68098. this.endCaps.forEach(function (e, i) {
  68099. //common.updateVisible(e, 'hasPoints', len>0)
  68100. if (len) {
  68101. if (len > 1) {
  68102. var dir = i == 0 ? new THREE.Vector3().subVectors(pts[1], pts[0]) : new THREE.Vector3().subVectors(pts[len2 - 2], pts[len2 - 1]);
  68103. e.quaternion.copy(getMeshQuaInPath(dir));
  68104. } else {
  68105. i == 0 ? e.quaternion.set(0, 0, 0, 1) : e.quaternion.set(0, 0, 1, 0); //两个半圆拼成一个圆点
  68106. }
  68107. e.position.copy(_this2.points[i == 0 ? 0 : len - 1]);
  68108. var s = _this2.halfPathWidth * 2.15;
  68109. e.scale.set(s, s, s);
  68110. }
  68111. });
  68112. }
  68113. }, {
  68114. key: "updateArrowRepeat",
  68115. value: function updateArrowRepeat() {
  68116. var map = this.edge.material.uniforms.map.value;
  68117. map.repeat.x = Math.round(this.totalLength / this.halfPathWidth * 0.5) * (this.reverse ? -1 : 1);
  68118. map.needsUpdate = true; //this.edge.material.setUV():
  68119. map.updateMatrix();
  68120. this.edge.material.uniforms.uvTransform = {
  68121. value: map.matrix.clone()
  68122. };
  68123. }
  68124. }, {
  68125. key: "getTotalDistance",
  68126. value: function getTotalDistance(points) {
  68127. if (this.panos.length === 0) {
  68128. return 0;
  68129. }
  68130. var distance = 0;
  68131. for (var i = 1; i < points.length; i++) {
  68132. var prev = points[i - 1];
  68133. var curr = points[i];
  68134. var d = prev.distanceTo(curr);
  68135. distance += d;
  68136. }
  68137. this.totalLength = distance;
  68138. return distance;
  68139. }
  68140. }, {
  68141. key: "dispose",
  68142. value: function dispose() {
  68143. this.parent.remove(this);
  68144. this.edge.geometry.dispose();
  68145. this.edge.material.dispose();
  68146. this.dispatchEvent('disposed');
  68147. }
  68148. }]);
  68149. return Path;
  68150. }(THREE.Object3D);
  68151. 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); }; }
  68152. 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; } }
  68153. var UA = window.navigator.userAgent;
  68154. var AudioPlayer = /*#__PURE__*/function () {
  68155. function AudioPlayer(app) {
  68156. _classCallCheck(this, AudioPlayer);
  68157. this.app = app;
  68158. }
  68159. _createClass(AudioPlayer, [{
  68160. key: "add",
  68161. value: function add(part, screencap) {
  68162. if (part.audio) {
  68163. this.remove(part);
  68164. }
  68165. var url = part.music;
  68166. if (!part.music) {
  68167. if (!screencap) {
  68168. return;
  68169. } else {
  68170. //录制屏幕的时候即使没有音乐也要创建
  68171. url = '';
  68172. }
  68173. }
  68174. part.audio = new Howl({
  68175. preload: true,
  68176. src: [this.app.resource.getUserResourceURL(url, true)],
  68177. loop: false,
  68178. html5: screencap ? false : UA.indexOf('VivoBrowser') != -1 ? false : true,
  68179. //兼容vivo原生浏览器导览音乐不能播放
  68180. format: ['mp3'],
  68181. onloaderror(id, err) {
  68182. console.log(id, err);
  68183. },
  68184. onplayerror: function onplayerror(e) {
  68185. console.log(e);
  68186. },
  68187. onload() {}
  68188. });
  68189. part.audio.on('play', function () {});
  68190. part.audio.on('end', function () {
  68191. if (screencap) {
  68192. part.audio.play();
  68193. part.audio.pause();
  68194. }
  68195. });
  68196. }
  68197. }, {
  68198. key: "remove",
  68199. value: function remove(part) {
  68200. if (part.audio) {
  68201. part.audio.unload();
  68202. part.audio = null;
  68203. delete part.audio;
  68204. }
  68205. }
  68206. }, {
  68207. key: "play",
  68208. value: function play() {}
  68209. }]);
  68210. return AudioPlayer;
  68211. }();
  68212. var TourManager = /*#__PURE__*/function (_Emiter) {
  68213. _inherits(TourManager, _Emiter);
  68214. var _super = _createSuper$y(TourManager);
  68215. function TourManager(app) {
  68216. var _this;
  68217. _classCallCheck(this, TourManager);
  68218. _this = _super.call(this);
  68219. _this.app = app;
  68220. _this.partId = 0;
  68221. _this.frameId = 0;
  68222. _this.playing = false;
  68223. _this.tours = [];
  68224. _this.paths = [];
  68225. _this.player = Deferred$1();
  68226. _this.recorder = Deferred$1();
  68227. _this.audioPlayer = new AudioPlayer(app);
  68228. _this.app.store.on('tours', function (tours) {
  68229. // 过滤掉无效点位对应的导览数据
  68230. //test:
  68231. //tours[0].showPanoRoute = 1
  68232. tours.forEach(function (frag) {
  68233. frag.list = frag.list.filter(function (frame) {
  68234. return frame.enter.mode !== 'panorama' || _this.app.core.get('Player').model.panos.get(frame.enter.panoId);
  68235. }); //frag.list.forEach(frame => (frame.showPath = frag.showPanoRoute)) //xzw add
  68236. });
  68237. console.log('tours', tours);
  68238. for (var i = tours.length; i--; i >= 0) {
  68239. if (tours[i].list.length == 0) {
  68240. tours.splice(i, 1);
  68241. }
  68242. }
  68243. _this.tours = tours;
  68244. _this.load();
  68245. _this.emit('loaded', _this.tours);
  68246. _this.needsUpdatePath = true;
  68247. });
  68248. _this.edit = {};
  68249. _this.edit.enterModule = function () {
  68250. _this.editing = true;
  68251. };
  68252. _this.edit.leaveModule = function () {
  68253. _this.editing = false;
  68254. };
  68255. _this.edit.setShowPath = function (sid, show) {
  68256. //点击保存时生效
  68257. console.log('setShowPath');
  68258. var frag = _this.tours.find(function (e) {
  68259. return e.sid == sid;
  68260. });
  68261. frag.showPanoRoute = show; //frag.list.forEach(frame => (frame.showPath = frag.showPanoRoute))
  68262. _this.needsUpdatePath = true;
  68263. };
  68264. _this.recorder.then(function (recorder) {
  68265. ////修改了
  68266. recorder.on('change', function (e) {
  68267. console.log('change', e);
  68268. if (e.action == 'delete' || e.action == 'add' || e.type == 'clear') {
  68269. _this.needsUpdatePath = true;
  68270. }
  68271. });
  68272. });
  68273. _this.player.then(function (player) {
  68274. app.core.get('SceneRenderer').on('render', function () {
  68275. if (_this.needsUpdatePath) {
  68276. _this.updatePathMesh();
  68277. _this.needsUpdatePath = false;
  68278. }
  68279. });
  68280. });
  68281. return _this;
  68282. }
  68283. _createClass(TourManager, [{
  68284. key: "updatePathMesh",
  68285. value: function updatePathMesh() {
  68286. var _this2 = this;
  68287. //要显示的路径,全都展示出来
  68288. console.log('updatePathMesh');
  68289. var player = this.app.core.get('Player');
  68290. this.paths.forEach(function (e) {
  68291. return e.dispose();
  68292. });
  68293. this.paths.length = 0;
  68294. var collect = [];
  68295. var makePath = function makePath() {
  68296. //遇到不显示的片段和飞出的就截断
  68297. var panos = collect.slice();
  68298. collect.length = 0;
  68299. if (panos.length <= 1) return; //如果飞入又飞出再飞入,飞入的两个pano不连,即必须大于两个点才画线
  68300. console.log('origin panos', panos.map(function (e) {
  68301. return e.id;
  68302. })); //pano之间插入自动寻路的漫游点
  68303. var panoIds = [panos[0].id];
  68304. for (var i = 0, len = panos.length; i < len - 1; i++) {
  68305. var pano1 = panos[i];
  68306. var pano2 = panos[i + 1];
  68307. if (pano1 == pano2) continue; //重复
  68308. var panoIds_ = aStart.searchRoad(player.model.panos.index, pano1.id, pano2.id); // 应该不会和走导览时不一样吧
  68309. panoIds.push.apply(panoIds, _toConsumableArray(panoIds_));
  68310. }
  68311. var pathPanos = panoIds.map(function (e) {
  68312. return player.model.panos.get(e);
  68313. });
  68314. if (pathPanos.length <= 1) return;
  68315. var path = new Path({
  68316. arrowColor: new THREE.Color('#fffdb2'),
  68317. edgeColor: new THREE.Color('#fff')
  68318. }); //add
  68319. path.setPanos(pathPanos);
  68320. player.model.paths.add(path);
  68321. _this2.paths.push(path);
  68322. };
  68323. this.tours.forEach(function (frag) {
  68324. if (frag.showPanoRoute) {
  68325. frag.list.forEach(function (frame) {
  68326. if (frame.enter.mode !== 'panorama') {
  68327. makePath();
  68328. } else {
  68329. collect.push(player.model.panos.get(frame.enter.panoId));
  68330. }
  68331. });
  68332. } else {
  68333. makePath(); //截断
  68334. }
  68335. });
  68336. makePath(); //余下的
  68337. }
  68338. }, {
  68339. key: "uuid",
  68340. value: function uuid() {
  68341. return common$1.getRandomSid();
  68342. }
  68343. }, {
  68344. key: "load",
  68345. value: function load(data, screencap) {
  68346. var _this3 = this;
  68347. var prev = null;
  68348. if (data) {
  68349. this.tours = data;
  68350. }
  68351. this.tours.forEach(function (item) {
  68352. _this3.audioPlayer.add(item, screencap);
  68353. item.list.forEach(function (frame) {
  68354. delete frame._trans; // if (frame.enter.cover && frame.enter.cover.indexOf('.jpg') != -1) {
  68355. // frame.enter.cover = this.app.resource.getUserResourceURL(frame.enter.cover)
  68356. // }
  68357. if (prev == null) {
  68358. prev = frame;
  68359. } else {
  68360. if (prev.enter.mode != 'panorama' || frame.enter.mode != 'panorama' || prev.enter.panoId == frame.enter.panoId) {
  68361. prev._notrans = true;
  68362. }
  68363. prev = frame;
  68364. }
  68365. });
  68366. });
  68367. }
  68368. /**
  68369. * @returns {Promise<void>}
  68370. */
  68371. }, {
  68372. key: "reload",
  68373. value: function () {
  68374. var _reload = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  68375. return regenerator.wrap(function _callee$(_context) {
  68376. while (1) {
  68377. switch (_context.prev = _context.next) {
  68378. case 0:
  68379. //退出编辑时
  68380. console.log('reload');
  68381. this.partId = 0;
  68382. this.frameId = 0;
  68383. this.playing = false;
  68384. _context.next = 6;
  68385. return this.app.store.get('tours', true);
  68386. case 6:
  68387. case "end":
  68388. return _context.stop();
  68389. }
  68390. }
  68391. }, _callee, this);
  68392. }));
  68393. function reload() {
  68394. return _reload.apply(this, arguments);
  68395. }
  68396. return reload;
  68397. }()
  68398. }, {
  68399. key: "install",
  68400. value: function install(name, plugin) {
  68401. if (this[name]) {
  68402. this[name].resolve(plugin);
  68403. }
  68404. }
  68405. }, {
  68406. key: "toJSON",
  68407. value: function toJSON() {
  68408. var files = [];
  68409. var tours = JSON.parse(JSON.stringify(this.tours, function (key, val) {
  68410. if (key === 'audio') {
  68411. return null;
  68412. } else {
  68413. return val;
  68414. }
  68415. }));
  68416. for (var i = tours.length - 1; i >= 0; i--) {
  68417. var part = tours[i];
  68418. if (!part.list || !part.list.length) {
  68419. tours.splice(i, 1);
  68420. } else {
  68421. delete part.audio;
  68422. delete part._uploaded;
  68423. if (part.music && part.music.indexOf('blob:') === 0) {
  68424. part.music = part.musicName.replace(/(.+)\.(.+)/, "tour-audio-".concat(part.sid, ".$2"));
  68425. }
  68426. part.list.forEach(function (frame, j) {
  68427. delete frame._notrans;
  68428. delete frame.enter._uploaded;
  68429. delete frame.exit._uploaded;
  68430. if (frame.enter && frame.enter.cover && frame.enter.cover.indexOf('data:image') === 0) {
  68431. frame.enter.cover = "tour-enter-".concat(frame.sid, ".jpg");
  68432. }
  68433. if (frame.exit && frame.exit.cover && frame.exit.cover.indexOf('data:image') === 0) {
  68434. frame.exit.cover = "tour-exit-".concat(frame.sid, ".jpg");
  68435. }
  68436. });
  68437. }
  68438. }
  68439. this.tours.forEach(function (part, i) {
  68440. part.list.forEach(function (frame, j) {
  68441. if (frame.enter && frame.enter.cover && frame.enter.cover.indexOf('data:image') === 0) {
  68442. files.push(convertBlob2File(base64ToBlob(frame.enter.cover), "tour-enter-".concat(frame.sid, ".jpg")));
  68443. }
  68444. if (frame.exit && frame.exit.cover && frame.exit.cover.indexOf('data:image') === 0) {
  68445. files.push(convertBlob2File(base64ToBlob(frame.enter.cover), "tour-exit-".concat(frame.sid, ".jpg")));
  68446. }
  68447. });
  68448. });
  68449. return {
  68450. tours,
  68451. files
  68452. };
  68453. }
  68454. }]);
  68455. return TourManager;
  68456. }(tinyEmitter);
  68457. 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); }; }
  68458. 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; } }
  68459. var player$a;
  68460. var range = {
  68461. min: 0.7,
  68462. max: 3
  68463. }; //缩放滑动条范围
  68464. var whPercent = 1.78; //固定输出的图长宽比
  68465. var Screenshot = /*#__PURE__*/function (_Emiter) {
  68466. _inherits(Screenshot, _Emiter);
  68467. var _super = _createSuper$x(Screenshot);
  68468. //场景修复中的截图功能
  68469. function Screenshot(app) {
  68470. var _this;
  68471. _classCallCheck(this, Screenshot);
  68472. _this = _super.call(this);
  68473. _this.app = app;
  68474. _this.editing = false;
  68475. _this.temp = {
  68476. onRangeChange: 0
  68477. };
  68478. return _this;
  68479. }
  68480. _createClass(Screenshot, [{
  68481. key: "enter",
  68482. value: function enter(listenZoomFun) {
  68483. var _this2 = this;
  68484. //console.log('activated')
  68485. if (this.editing) return;
  68486. this.editing = true;
  68487. player$a = this.app.core.get('Player');
  68488. if (!player$a) {
  68489. return this.app.Scene.on('loaded', function () {
  68490. if (_this2.editing) _this2.enter(listenZoomFun);
  68491. });
  68492. }
  68493. this.setPlayerSize(true);
  68494. this.oldStates = {
  68495. zoomMax: settings$3.zoom.max,
  68496. zoomMin: settings$3.zoom.min,
  68497. zoomEnabled: settings$3.zoom.enabled,
  68498. zoomToDefaultWhenToPano: settings$3.zoom.zoomToDefaultWhenToPano
  68499. };
  68500. settings$3.zoom.max = 3;
  68501. settings$3.zoom.min = 0.7;
  68502. settings$3.zoom.enabled = true;
  68503. settings$3.zoom.zoomToDefaultWhenToPano = false; //window.addEventListener('resize', this.resizeFun, true);
  68504. this.eventList = {
  68505. zoomTo: function zoomTo(e) {
  68506. listenZoomFun(e.zoomLevel == void 0 ? e : e.zoomLevel);
  68507. },
  68508. //,listenZoomFun.bind(this),
  68509. setSize: this.setPlayerSize.bind(this),
  68510. update: function update() {
  68511. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  68512. _ref$hasChanged = _ref.hasChanged,
  68513. hasChanged = _ref$hasChanged === void 0 ? false : _ref$hasChanged;
  68514. var force = arguments.length > 1 ? arguments[1] : undefined;
  68515. //监听outside模式下的zoom
  68516. if (!player$a.lastFrameChanged && !force) return;
  68517. var control = player$a.cameraControls.activeControl;
  68518. if (player$a.mode == 'dollhouse') {
  68519. var dis = control.camera.position.distanceTo(control.target);
  68520. var zoomlevel = math$2.linearClamp(dis, control.minDistance, Math.max(control.maxDistance / 2, control.minDistance + 3), range.max, range.min);
  68521. listenZoomFun(zoomlevel);
  68522. } else if (player$a.mode == 'floorplan' && hasChanged.cameraProjectionChanged) {
  68523. var absoluteScale = control.getDefaultAbsoluteScale(player$a.model.size); //改
  68524. var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
  68525. var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
  68526. var _zoomlevel = math$2.linearClamp(control.absoluteScale, minS, maxS, range.max, range.min);
  68527. listenZoomFun(_zoomlevel);
  68528. }
  68529. }
  68530. }; //player.on('zoomTo', this.eventList.zoomTo)
  68531. player$a.on(PlayerEvents.Zoom, this.eventList.zoomTo);
  68532. player$a.on('setSize', this.eventList.setSize);
  68533. player$a.on('update', this.eventList.update);
  68534. this.eventList.zoomTo(player$a.zoomLevel);
  68535. this.eventList.update(0, true); //加载最高清晰度
  68536. settings$3.highestQualityTile = true; // this.app.TagManager.switchAllDisplay(false, 'screenshot', { links: true })
  68537. this.app.TagManager.switchAllDisplay(false, 'screenshot', {}); //this.cameras = {'dollhouse':{}, 'floorplan':{}}
  68538. }
  68539. /* highRes(s){
  68540. settings.highestQualityTile = s
  68541. player.updateZoomPano()
  68542. } */
  68543. }, {
  68544. key: "leave",
  68545. value: function leave() {
  68546. //退出,恢复
  68547. this.editing = false;
  68548. console.log('退出,恢复');
  68549. if (!player$a) return;
  68550. player$a.zoomTo(1);
  68551. settings$3.zoom.enabled = this.oldStates.zoomEnabled;
  68552. settings$3.zoom.max = this.oldStates.zoomMax;
  68553. settings$3.zoom.min = this.oldStates.zoomMin;
  68554. settings$3.zoom.zoomToDefaultWhenToPano = this.oldStates.zoomToDefaultWhenToPano;
  68555. player$a.off(PlayerEvents.Zoom, this.eventList.zoomTo);
  68556. player$a.off('setSize', this.eventList.setSize);
  68557. player$a.off('update', this.eventList.update);
  68558. settings$3.highestQualityTile = false; //canvas高度恢复
  68559. this.setPlayerSize(false);
  68560. this.app.TagManager.switchAllDisplay(true, 'screenshot');
  68561. } //canvas去掉页眉部分,为了适应框
  68562. }, {
  68563. key: "setPlayerSize",
  68564. value: function setPlayerSize(state) {
  68565. if (state) {
  68566. var offsetHeight = document.querySelector('.ui-editor-head').offsetHeight;
  68567. var winHeight = window.innerHeight - offsetHeight;
  68568. var winWidth = window.innerWidth;
  68569. if (winWidth / winHeight < whPercent) {
  68570. //为了保证图片输出的fovH和画布上的一样,只能压缩一下高度了,否则要改截图的canvas的fov
  68571. var height = winWidth / whPercent;
  68572. player$a.domElement.style.height = "".concat(height, "px");
  68573. player$a.domElement.style.top = (winHeight - height) / 2 + offsetHeight + 'px';
  68574. } else {
  68575. player$a.domElement.style.top = "".concat(offsetHeight, "px");
  68576. player$a.domElement.style.height = "calc(100% - ".concat(offsetHeight, "px)");
  68577. }
  68578. } else {
  68579. //exit
  68580. player$a.domElement.style.top = 0;
  68581. player$a.domElement.style.height = '100%';
  68582. }
  68583. }
  68584. }, {
  68585. key: "waitTexLoaded",
  68586. value: function waitTexLoaded(waitDeferred) {
  68587. var _this3 = this;
  68588. if (player$a.mode == 'panorama') {
  68589. if (!player$a.currentPano || player$a.flying) {
  68590. //刚打开时没有currentPano, 就加一个promise, 完成时记得这个promise也resolve
  68591. console.log('延迟');
  68592. if (!waitDeferred) {
  68593. waitDeferred = Deferred$1();
  68594. }
  68595. setTimeout(function () {
  68596. _this3.waitTexLoaded(waitDeferred);
  68597. }, 100);
  68598. return waitDeferred.promise();
  68599. }
  68600. var tileSize = this.getTileSize();
  68601. var vec = new THREE.Vector3(0, 0, -1).applyQuaternion(player$a.quaternion);
  68602. var camera = player$a.cameraControls.activeControl.camera;
  68603. var vFov = camera.fov;
  68604. var hFov = cameraLight.getHFOVForCamera(camera, camera.aspect, 1);
  68605. var promise = player$a.currentPano.loadTiledPano(tileSize, vec, {
  68606. hFov,
  68607. vFov
  68608. }, !1, !1, !0);
  68609. promise.done(function () {
  68610. console.log('加载完成');
  68611. waitDeferred && waitDeferred.resolve();
  68612. });
  68613. return promise;
  68614. } else {
  68615. var d = Deferred$1();
  68616. return d.resolve().promise();
  68617. }
  68618. }
  68619. }, {
  68620. key: "getMaxHeight",
  68621. value: function getMaxHeight() {
  68622. //全景图高度
  68623. return this.app.core.get('QualityManager').tileClass == '2k' ? 4096 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 * 2 : 1024;
  68624. }
  68625. }, {
  68626. key: "getTileSize",
  68627. value: function getTileSize() {
  68628. // 获取单个面的大小
  68629. return this.app.core.get('QualityManager').tileClass == '2k' ? 2048 : this.app.core.get('QualityManager').tileClass == '4k' ? 4096 : 512;
  68630. }
  68631. }, {
  68632. key: "getPicSize",
  68633. value: function getPicSize() {
  68634. if (player$a.mode != 'panorama') {
  68635. return {
  68636. width: 1780,
  68637. height: 1000
  68638. };
  68639. }
  68640. var maxHeight = this.getMaxHeight();
  68641. var height = player$a.cameraControls.activeControl.camera.fov / 180 * maxHeight;
  68642. var width = height * whPercent;
  68643. var size = {
  68644. width: Math.round(width),
  68645. height: Math.round(height)
  68646. };
  68647. return size; // matterport: 4dkk: (4k)
  68648. //0.7: 8101*4551 3.35M
  68649. //1 : 6068*3413 h 8778.29218106 不是 8192?? 5671*3186
  68650. //3: 2023*1138 1890*1062
  68651. //(2k减半) 如1890*1062 --> 945*531
  68652. } //需要渲染最高清晰度的图片
  68653. }, {
  68654. key: "listenZoomLevel",
  68655. value: function listenZoomLevel(zoomLevel) {//console.log('listenZoomLevel',zoomLevel)
  68656. //this.range.value = zoomLevel * 100;
  68657. }
  68658. }, {
  68659. key: "onResetCamera",
  68660. value: function onResetCamera() {
  68661. //console.log('使相机水平');
  68662. if (player$a.mode == 'panorama') {
  68663. player$a.cameraControls.activeControl.lat = 0;
  68664. }
  68665. }
  68666. }, {
  68667. key: "onResumeSize",
  68668. value: function onResumeSize() {
  68669. var _this4 = this;
  68670. //1:1按钮
  68671. //this.range.value = 100;
  68672. if (!player$a) return;
  68673. var control = player$a.cameraControls.activeControl;
  68674. if (player$a.mode == 'transitioning') {
  68675. return player$a.once('mode.changed', function (fromMode, toMode) {
  68676. if (!_this4.editing) return;
  68677. _this4.onResumeSize();
  68678. });
  68679. } else if (player$a.mode == 'panorama') {
  68680. player$a.zoomTo(1);
  68681. } else if (player$a.mode == 'dollhouse') {
  68682. //自己定一个target
  68683. control.target.copy(player$a.model.center);
  68684. this.onRangeChange({
  68685. value: 100
  68686. });
  68687. } else if (player$a.mode == 'floorplan') {
  68688. //自己定一个target
  68689. control.target.setX(player$a.model.center.x);
  68690. control.target.setZ(player$a.model.center.z);
  68691. control.camera.position.setX(player$a.model.center.x); //使角度归零
  68692. control.camera.position.setZ(player$a.model.center.z);
  68693. control.rotateToView(player$a.model.size, player$a.getDirection()); //再旋转
  68694. control.zoomToContain(player$a.model.size);
  68695. }
  68696. }
  68697. }, {
  68698. key: "onRangeChange",
  68699. value: function onRangeChange(res) {
  68700. var _this5 = this;
  68701. //响应滑动条
  68702. //setFovRatio
  68703. this.temp.onRangeChange = res;
  68704. var control = player$a.cameraControls.activeControl;
  68705. var zoomLevel = Math.round(res.value) / 100;
  68706. if (zoomLevel < range.min) {
  68707. zoomLevel = range.min;
  68708. this.eventList.zoomTo(zoomLevel);
  68709. } else if (zoomLevel > range.max) {
  68710. zoomLevel = range.max;
  68711. this.eventList.zoomTo(zoomLevel);
  68712. }
  68713. if (player$a.mode == 'transitioning') {
  68714. return player$a.once('mode.changed', function (fromMode, toMode) {
  68715. if (!_this5.editing) return;
  68716. _this5.onRangeChange(_this5.temp.onRangeChange);
  68717. });
  68718. } else if (player$a.mode == 'panorama') {
  68719. settings$3.zoom.enabled = true;
  68720. player$a.zoomTo(zoomLevel);
  68721. } else if (player$a.mode == 'dollhouse') {
  68722. var disWanted = math$2.linearClamp(zoomLevel, range.min, range.max, Math.max(control.maxDistance / 2, control.minDistance + 3), control.minDistance); //control.minDistance + (control.maxDistance - control.minDistance) * ratio
  68723. control.camera.position.copy(control.target).add(player$a.getDirection().multiplyScalar(-disWanted));
  68724. } else if (player$a.mode == 'floorplan') {
  68725. var absoluteScale = control.getDefaultAbsoluteScale(player$a.model.size); //改
  68726. var minS = Math.max(settings$3.zoomNearLimit, absoluteScale * 0.5);
  68727. var maxS = Math.min(settings$3.zoomFarLimit, absoluteScale * 2.5);
  68728. control.absoluteScale = math$2.linearClamp(zoomLevel, range.min, range.max, maxS, minS); // 不按照这个,因范围太大
  68729. //zoomNearLimit: 0.1,
  68730. //zoomFarLimit: 10,
  68731. }
  68732. }
  68733. }, {
  68734. key: "imgAddLabel",
  68735. value: function () {
  68736. var _imgAddLabel = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2(imgsrc, labelImgSrc, labelInfo, lonlatInfo) {
  68737. var img, labelImg, loaded, waitCount, needAddLabel;
  68738. return regenerator.wrap(function _callee2$(_context2) {
  68739. while (1) {
  68740. switch (_context2.prev = _context2.next) {
  68741. case 0:
  68742. //水印
  68743. img = new Image();
  68744. img.setAttribute('crossOrigin', 'Anonymous');
  68745. img.src = imgsrc;
  68746. loaded = 0;
  68747. waitCount = labelImgSrc ? 2 : 1;
  68748. needAddLabel = !!labelImgSrc;
  68749. return _context2.abrupt("return", new Promise(function (resolve, reject) {
  68750. var onload = /*#__PURE__*/function () {
  68751. var _ref2 = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  68752. var src, predictWidth, scale, result;
  68753. return regenerator.wrap(function _callee$(_context) {
  68754. while (1) {
  68755. switch (_context.prev = _context.next) {
  68756. case 0:
  68757. loaded++;
  68758. if (!(loaded >= waitCount)) {
  68759. _context.next = 27;
  68760. break;
  68761. }
  68762. if (!needAddLabel) {
  68763. _context.next = 13;
  68764. break;
  68765. }
  68766. console.log('labelInfo', labelInfo);
  68767. labelInfo.opacity /= 100;
  68768. src = common$1.imgAddLabel(img, labelImg, labelInfo); //先加个水印
  68769. if (!lonlatInfo) {
  68770. _context.next = 12;
  68771. break;
  68772. }
  68773. img.src = src;
  68774. needAddLabel = false;
  68775. return _context.abrupt("return");
  68776. case 12:
  68777. resolve(src);
  68778. case 13:
  68779. if (!lonlatInfo) {
  68780. _context.next = 27;
  68781. break;
  68782. }
  68783. lonlatInfo.player = player$a;
  68784. console.log('lonlatInfo', lonlatInfo); //delete lonlatInfo.widthRatioToImg // 只按照原来的大小
  68785. //不变比例的话
  68786. //delete lonlatInfo.widthRatioToImg // 只按照原来的大小
  68787. //不变比例的话
  68788. predictWidth = 201; //不放大的话当前label的宽度大概是
  68789. //不放大的话当前label的宽度大概是
  68790. scale = img.width * lonlatInfo.widthRatioToImg / predictWidth;
  68791. lonlatInfo.textAlign = 'left';
  68792. lonlatInfo.fontsize && (lonlatInfo.fontsize *= scale);
  68793. lonlatInfo.margin && (lonlatInfo.margin.x *= scale, lonlatInfo.margin.y *= scale);
  68794. lonlatInfo.borderRadius && (lonlatInfo.borderRadius *= scale);
  68795. lonlatInfo.lineSpace = 7 * scale; //add
  68796. //let text = ['经度:' + lonlatInfo.location.lon, '纬度:' + lonlatInfo.location.lat]
  68797. _context.next = 25;
  68798. return common$1.imgAddText(img, lonlatInfo.location.text, lonlatInfo);
  68799. case 25:
  68800. result = _context.sent;
  68801. resolve(result);
  68802. case 27:
  68803. case "end":
  68804. return _context.stop();
  68805. }
  68806. }
  68807. }, _callee);
  68808. }));
  68809. return function onload() {
  68810. return _ref2.apply(this, arguments);
  68811. };
  68812. }();
  68813. if (labelImgSrc) {
  68814. labelImg = new Image();
  68815. labelImg.src = labelImgSrc;
  68816. labelImg.setAttribute('crossOrigin', 'Anonymous');
  68817. labelImg.onload = onload;
  68818. }
  68819. img.onload = onload;
  68820. }));
  68821. case 7:
  68822. case "end":
  68823. return _context2.stop();
  68824. }
  68825. }
  68826. }, _callee2);
  68827. }));
  68828. function imgAddLabel(_x, _x2, _x3, _x4) {
  68829. return _imgAddLabel.apply(this, arguments);
  68830. }
  68831. return imgAddLabel;
  68832. }()
  68833. }, {
  68834. key: "getOrientation",
  68835. value: function getOrientation() {
  68836. //"cameraOrientation": "01-东;02-南;03-西;04-北;05-东北;06-东南;07-西北;08-西南" // 拍摄镜头朝向代码 FXLBDM,方位照片和概貌照片需要传;01-东;02-南;03-西;04-北;05-东北;06-东南;07-西北;08-西南
  68837. var compassAngle = THREE.MathUtils.degToRad(this.app.core.get('Player').compass.angle || 0);
  68838. var yaw = this.app.core.get('Player').yaw || 0;
  68839. var angle = -yaw + 5 * Math.PI / 2 - compassAngle + Math.PI / 8;
  68840. var text = ['北', '东北', '东', '东南', '南', '西南', '西', '西北'];
  68841. var num = ['04', '05', '01', '06', '02', '08', '03', '07'];
  68842. var index = Math.floor(angle % (2 * Math.PI) / (Math.PI / 4));
  68843. console.log(text[index]);
  68844. var r = num[index];
  68845. return r;
  68846. }
  68847. }]);
  68848. return Screenshot;
  68849. }(tinyEmitter);
  68850. var Editor = /*#__PURE__*/function () {
  68851. function Editor(app) {
  68852. _classCallCheck(this, Editor);
  68853. this.app = app;
  68854. this.num = this.app.config.num;
  68855. }
  68856. /**
  68857. * 设置当面画面为初始画面
  68858. */
  68859. _createClass(Editor, [{
  68860. key: "setEntry",
  68861. value: function () {
  68862. var _setEntry = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  68863. var payload;
  68864. return regenerator.wrap(function _callee$(_context) {
  68865. while (1) {
  68866. switch (_context.prev = _context.next) {
  68867. case 0:
  68868. payload = {}; // 初始画面截图
  68869. payload.entry = this.app.Camera.getScreenshotInfo();
  68870. _context.next = 4;
  68871. return this.app.Camera.screenshot();
  68872. case 4:
  68873. payload.thumbs = _context.sent;
  68874. // 更新初始点
  68875. this.app.core.get('Scene').firstView.updateByEntry(payload.entry, this.app.core.get('Player').model.panos);
  68876. return _context.abrupt("return", payload);
  68877. case 7:
  68878. case "end":
  68879. return _context.stop();
  68880. }
  68881. }
  68882. }, _callee, this);
  68883. }));
  68884. function setEntry() {
  68885. return _setEntry.apply(this, arguments);
  68886. }
  68887. return setEntry;
  68888. }()
  68889. /**
  68890. * 保存初始画面
  68891. */
  68892. }, {
  68893. key: "saveEntry",
  68894. value: function () {
  68895. var _saveEntry = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee2() {
  68896. var thumbFilename,
  68897. data,
  68898. thumbs,
  68899. response,
  68900. _args2 = arguments;
  68901. return regenerator.wrap(function _callee2$(_context2) {
  68902. while (1) {
  68903. switch (_context2.prev = _context2.next) {
  68904. case 0:
  68905. thumbFilename = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : 'thumb-1k.jpg';
  68906. _context2.next = 3;
  68907. return this.setEntry();
  68908. case 3:
  68909. data = _context2.sent;
  68910. thumbs = {
  68911. num: this.num,
  68912. bizType: 'settings-thumb',
  68913. files: data.thumbs.map(function (item) {
  68914. return convertBlob2File(item.data, "thumb-".concat(item.name, ".jpg"));
  68915. })
  68916. };
  68917. response = null;
  68918. _context2.prev = 6;
  68919. _context2.next = 9;
  68920. return this.app.remote_editor.upload_files(thumbs);
  68921. case 9:
  68922. response = _context2.sent;
  68923. _context2.next = 15;
  68924. break;
  68925. case 12:
  68926. _context2.prev = 12;
  68927. _context2.t0 = _context2["catch"](6);
  68928. return _context2.abrupt("return", Promise.reject(_context2.t0));
  68929. case 15:
  68930. if (response.success) {
  68931. _context2.next = 17;
  68932. break;
  68933. }
  68934. return _context2.abrupt("return", Promise.reject(response));
  68935. case 17:
  68936. _context2.prev = 17;
  68937. _context2.next = 20;
  68938. return this.app.remote_editor.saveInitialPage({
  68939. num: this.num,
  68940. fileName: thumbFilename,
  68941. data: JSON.stringify(data.entry)
  68942. });
  68943. case 20:
  68944. response = _context2.sent;
  68945. return _context2.abrupt("return", response);
  68946. case 24:
  68947. _context2.prev = 24;
  68948. _context2.t1 = _context2["catch"](17);
  68949. return _context2.abrupt("return", Promise.reject(_context2.t1));
  68950. case 27:
  68951. case "end":
  68952. return _context2.stop();
  68953. }
  68954. }
  68955. }, _callee2, this, [[6, 12], [17, 24]]);
  68956. }));
  68957. function saveEntry() {
  68958. return _saveEntry.apply(this, arguments);
  68959. }
  68960. return saveEntry;
  68961. }()
  68962. /**
  68963. * 发布
  68964. * @returns
  68965. */
  68966. }, {
  68967. key: "publish",
  68968. value: function () {
  68969. var _publish = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee3() {
  68970. return regenerator.wrap(function _callee3$(_context3) {
  68971. while (1) {
  68972. switch (_context3.prev = _context3.next) {
  68973. case 0:
  68974. _context3.next = 2;
  68975. return this.app.remote_editor.publicScene({
  68976. num: this.num
  68977. });
  68978. case 2:
  68979. return _context3.abrupt("return", _context3.sent);
  68980. case 3:
  68981. case "end":
  68982. return _context3.stop();
  68983. }
  68984. }
  68985. }, _callee3, this);
  68986. }));
  68987. function publish() {
  68988. return _publish.apply(this, arguments);
  68989. }
  68990. return publish;
  68991. }()
  68992. }]);
  68993. return Editor;
  68994. }();
  68995. 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); }; }
  68996. 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; } }
  68997. var Paint = /*#__PURE__*/function (_Emiter) {
  68998. _inherits(Paint, _Emiter);
  68999. var _super = _createSuper$w(Paint);
  69000. function Paint(app) {
  69001. var _this;
  69002. _classCallCheck(this, Paint);
  69003. _this = _super.call(this);
  69004. _this.app = app;
  69005. _this.records = [];
  69006. _this.paints = [];
  69007. _this.isPaint = true;
  69008. _this.isPainting = false;
  69009. _this.isUndo = false;
  69010. _this.role = 'leader';
  69011. _this.colors = {
  69012. leader: '#00c8af',
  69013. follow: '#3A78E7'
  69014. };
  69015. return _this;
  69016. }
  69017. _createClass(Paint, [{
  69018. key: "show",
  69019. value: function show() {
  69020. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  69021. role = _ref.role,
  69022. colors = _ref.colors,
  69023. paint = _ref.paint,
  69024. ele = _ref.ele;
  69025. this.player = this.app.core.get('Player');
  69026. this.$paint = this.elem(ele);
  69027. this.$paint.style.display = '';
  69028. this.isPainting = true;
  69029. this.role = role == 'leader' ? 'leader' : 'follow';
  69030. if (colors) {
  69031. Object.assign(this.colors, colors);
  69032. }
  69033. this.isPaint = paint !== false;
  69034. this.onStart();
  69035. }
  69036. }, {
  69037. key: "hide",
  69038. value: function hide() {
  69039. this.isPainting = false;
  69040. this.isUndo = false;
  69041. this.paints = [];
  69042. this.records = [];
  69043. if (this.$paint) {
  69044. this.$paint.style.display = 'none';
  69045. this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  69046. }
  69047. var currentPano = this.app.core.get('Player').currentPano;
  69048. if (currentPano && currentPano.hasVideo) {
  69049. this.app.core.get('PanoVideoRenderer').activatePanorama(currentPano);
  69050. }
  69051. }
  69052. }, {
  69053. key: "elem",
  69054. value: function elem(ele) {
  69055. var $paint = this.app.$plugins.querySelector('[xui_sync_paint]');
  69056. if ($paint == null) {
  69057. 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 ";
  69058. if (ele) {
  69059. // 存在ele,则自定义插入到该元素的第一个子节点
  69060. // console.log(document.querySelector(ele))
  69061. document.querySelector(ele).insertAdjacentHTML('afterbegin', html);
  69062. $paint = document.querySelector(ele).querySelector('[xui_sync_paint]');
  69063. } else {
  69064. this.app.$plugins.insertAdjacentHTML('beforeend', html);
  69065. $paint = this.app.$plugins.querySelector('[xui_sync_paint]');
  69066. }
  69067. this.bind($paint);
  69068. }
  69069. return $paint;
  69070. }
  69071. }, {
  69072. key: "bind",
  69073. value: function bind($paint) {
  69074. var _this2 = this;
  69075. var touch;
  69076. this.mouse = new THREE.Vector2();
  69077. this.canvas = $paint.querySelector('canvas');
  69078. this.context = this.canvas.getContext('2d');
  69079. this.canvas.onmousedown = function (e) {
  69080. if (!_this2.isPaint) {
  69081. return;
  69082. }
  69083. e.preventDefault();
  69084. _this2.beginStroke({
  69085. x: e.clientX,
  69086. y: e.clientY
  69087. });
  69088. };
  69089. this.canvas.onmouseup = function (e) {
  69090. if (!_this2.isPaint) {
  69091. return;
  69092. }
  69093. e.preventDefault();
  69094. _this2.endStroke();
  69095. };
  69096. this.canvas.onmousemove = function (e) {
  69097. if (!_this2.isPaint) {
  69098. return;
  69099. }
  69100. e.preventDefault();
  69101. if (_this2._mouseDown) {
  69102. _this2.moveStroke({
  69103. x: e.clientX,
  69104. y: e.clientY
  69105. });
  69106. }
  69107. }; // 移动端触控
  69108. this.canvas.addEventListener('touchstart', function (e) {
  69109. if (!_this2.isPaint) {
  69110. return;
  69111. }
  69112. e.preventDefault();
  69113. touch = e.touches[0];
  69114. _this2.beginStroke({
  69115. x: touch.pageX,
  69116. y: touch.pageY
  69117. });
  69118. });
  69119. this.canvas.addEventListener('touchmove', function (e) {
  69120. if (!_this2.isPaint) {
  69121. return;
  69122. }
  69123. e.preventDefault();
  69124. if (_this2._mouseDown) {
  69125. touch = e.touches[0];
  69126. _this2.moveStroke({
  69127. x: touch.pageX,
  69128. y: touch.pageY
  69129. });
  69130. }
  69131. });
  69132. this.canvas.addEventListener('touchend', function (e) {
  69133. if (!_this2.isPaint) {
  69134. return;
  69135. }
  69136. e.preventDefault();
  69137. _this2.endStroke();
  69138. });
  69139. }
  69140. }, {
  69141. key: "onStart",
  69142. value: function onStart() {
  69143. var dpr = window.devicePixelRatio || 1;
  69144. var rect = this.canvas.getBoundingClientRect();
  69145. this.ratio = 1; // window.innerWidth / 375;
  69146. this.canvas.width = rect.width * dpr;
  69147. this.canvas.height = rect.height * dpr;
  69148. this.context.scale(dpr, dpr);
  69149. this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  69150. this._endTime = 0;
  69151. this._mouseDown = false;
  69152. this._lastTimestamp = 0;
  69153. this._lastLineWidth = -1;
  69154. this._lastPosition = {
  69155. x: 0,
  69156. y: 0
  69157. };
  69158. math$2.convertScreenPositionToNDC(0, 0, this.mouse, this.app.dom); //取屏幕中点
  69159. var intersect = convertTool.getMouseIntersect(this.player.camera, [this.player.model.skybox], this.mouse);
  69160. this.placeIntersectPlane(intersect && intersect.point);
  69161. }
  69162. }, {
  69163. key: "onRecord",
  69164. value: function onRecord(data) {
  69165. this.transformTo3d(data);
  69166. this.records.push(data);
  69167. this.emit('data', {
  69168. type: 'paint',
  69169. data
  69170. });
  69171. }
  69172. }, {
  69173. key: "beginStroke",
  69174. value: function beginStroke(point) {
  69175. this._mouseDown = true;
  69176. this._lastTimestamp = Date.now();
  69177. this._lastPosition = this.windowToCanvas(point.x, point.y);
  69178. this.paints.push({
  69179. width: 0,
  69180. x: this._lastPosition.x,
  69181. y: this._lastPosition.y,
  69182. t: 5 //this._lastTimestamp - this._endTime
  69183. });
  69184. }
  69185. }, {
  69186. key: "moveStroke",
  69187. value: function moveStroke(point) {
  69188. var timestamp = Date.now();
  69189. var position = this.windowToCanvas(point.x, point.y);
  69190. var s = this.calcDistance(position, this._lastPosition);
  69191. var t = timestamp - this._lastTimestamp;
  69192. var lineWidth = this.calcLineWidth(t, s); //draw
  69193. this.context.beginPath();
  69194. this.context.moveTo(this._lastPosition.x, this._lastPosition.y);
  69195. this.context.lineTo(position.x, position.y);
  69196. this.paints.push({
  69197. color: this.colors[this.role] || '#00c8af',
  69198. width: lineWidth,
  69199. x: position.x,
  69200. y: position.y,
  69201. t: 5 //t
  69202. });
  69203. this.context.strokeStyle = this.colors[this.role] || '#00c8af';
  69204. this.context.lineWidth = lineWidth;
  69205. this.context.lineCap = 'round';
  69206. this.context.linJoin = 'round';
  69207. this.context.stroke(); //每次过程结束时,将结束值赋给初始值,一直延续
  69208. this._lastPosition = position;
  69209. this._lastTimestamp = timestamp;
  69210. this._lastLineWidth = lineWidth;
  69211. }
  69212. }, {
  69213. key: "endStroke",
  69214. value: function endStroke() {
  69215. this.paints.push({
  69216. width: 0,
  69217. x: this._lastPosition.x,
  69218. y: this._lastPosition.y,
  69219. t: 0
  69220. });
  69221. this.onRecord(this.paints);
  69222. this.paints = [];
  69223. this.isUndo = true;
  69224. this._mouseDown = false;
  69225. this._lastTimestamp = 0;
  69226. this._endTime = Date.now();
  69227. }
  69228. }, {
  69229. key: "calcDistance",
  69230. value: function calcDistance(pos1, pos2) {
  69231. return Math.sqrt((pos1.x - pos2.x) * (pos1.x - pos2.x) + (pos1.y - pos2.y) * (pos1.y - pos2.y)); //通过起始结束坐标x,y值计算路程长度
  69232. }
  69233. }, {
  69234. key: "calcLineWidth",
  69235. value: function calcLineWidth(t, s) {
  69236. var v = s / t;
  69237. var resultLineWidth;
  69238. if (v <= 0.1) {
  69239. resultLineWidth = 6;
  69240. } else if (v >= 3) {
  69241. resultLineWidth = 2;
  69242. } else {
  69243. resultLineWidth = 6 - (v - 0.1) / (3 - 0.1) * (6 - 4);
  69244. }
  69245. if (this._lastLineWidth == -1) {
  69246. return resultLineWidth;
  69247. }
  69248. return this._lastLineWidth * 2 / 3 + resultLineWidth * 1 / 3;
  69249. }
  69250. }, {
  69251. key: "windowToCanvas",
  69252. value: function windowToCanvas(x, y) {
  69253. var bbox = this.canvas.getBoundingClientRect(); //获取canvas的位置信息
  69254. return {
  69255. x: Math.round(x - bbox.left),
  69256. y: Math.round(y - bbox.top)
  69257. }; //返回当前鼠标相对于canvas的位置
  69258. }
  69259. }, {
  69260. key: "placeIntersectPlane",
  69261. value: function placeIntersectPlane(pos) {
  69262. //用于判断mesh拖拽移动距离的平面 需要和视线垂直,以保证遮住视野范围
  69263. if (!this.intersectPlane) {
  69264. var geo = new THREE.PlaneGeometry(8000, 80000, 1, 1); //var geo = new THREE.PlaneGeometry(3,3,1,1);
  69265. this.intersectPlane = new THREE.Mesh(geo, new THREE.MeshBasicMaterial({
  69266. transparent: true,
  69267. wireframe: false,
  69268. opacity: 0,
  69269. side: THREE.DoubleSide,
  69270. depthTest: false
  69271. }));
  69272. this.intersectPlane.lookAt(new THREE.Vector3(0, 1, 0));
  69273. this.intersectPlane.name = 'intersectPlane';
  69274. this.player.model.add(this.intersectPlane);
  69275. }
  69276. if (pos) {
  69277. this.intersectPlane.position.copy(pos);
  69278. var cameraDir = this.player.getDirection(null, this.player.camera); //向里
  69279. this.intersectPlane.lookAt(pos.clone().add(cameraDir)); //看向相机
  69280. }
  69281. }
  69282. /**
  69283. * 2d数据转3d数据
  69284. */
  69285. }, {
  69286. key: "transformTo3d",
  69287. value: function transformTo3d(paints) {
  69288. var _this3 = this;
  69289. if (paints.length == 0) {
  69290. return;
  69291. }
  69292. paints.forEach(function (item) {
  69293. math$2.convertScreenPositionToNDC(item.x, item.y, _this3.mouse, _this3.app.dom);
  69294. var intersect = convertTool.getMouseIntersect(_this3.player.camera, [_this3.intersectPlane], _this3.mouse);
  69295. if (!intersect) {
  69296. console.error('no intersect ??');
  69297. } else {
  69298. item.pos3d = intersect.point;
  69299. }
  69300. });
  69301. }
  69302. /**
  69303. * 3d数据转2d数据
  69304. */
  69305. }, {
  69306. key: "transformTo2d",
  69307. value: function transformTo2d(paints) {
  69308. var _this4 = this;
  69309. paints.forEach(function (item) {
  69310. var pos3d = new THREE.Vector3(item.pos3d.x, item.pos3d.y, item.pos3d.z);
  69311. var pos2d = convertTool.getPos2d(pos3d, _this4.player, _this4.player.camera);
  69312. item.x = pos2d.pos.x;
  69313. item.y = pos2d.pos.y;
  69314. });
  69315. }
  69316. }, {
  69317. key: "undo",
  69318. value: function undo() {
  69319. this.records.pop();
  69320. this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  69321. for (var i = 0; i < this.records.length; i++) {
  69322. this.paint(this.records[i], 0);
  69323. }
  69324. this.emit('data', {
  69325. type: 'undo'
  69326. });
  69327. }
  69328. }, {
  69329. key: "paint",
  69330. value: function paint(data) {
  69331. var _this5 = this;
  69332. var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5;
  69333. var _loop = function _loop(i) {
  69334. if (delay) {
  69335. if (data[i].t) {
  69336. setTimeout(function () {
  69337. _this5.context.beginPath();
  69338. _this5.context.strokeStyle = data[i].color;
  69339. _this5.context.moveTo(data[i].x * _this5.ratio, data[i].y * _this5.ratio);
  69340. _this5.context.lineTo(data[i + 1].x * _this5.ratio, data[i + 1].y * _this5.ratio);
  69341. _this5.context.lineWidth = data[i].width * _this5.ratio;
  69342. _this5.context.lineCap = 'round';
  69343. _this5.context.linJoin = 'round';
  69344. _this5.context.stroke();
  69345. }, delay);
  69346. }
  69347. } else {
  69348. if (data[i].t) {
  69349. _this5.context.beginPath();
  69350. _this5.context.strokeStyle = data[i].color;
  69351. _this5.context.moveTo(data[i].x * _this5.ratio, data[i].y * _this5.ratio);
  69352. _this5.context.lineTo(data[i + 1].x * _this5.ratio, data[i + 1].y * _this5.ratio);
  69353. _this5.context.lineWidth = data[i].width * _this5.ratio;
  69354. _this5.context.lineCap = 'round';
  69355. _this5.context.linJoin = 'round';
  69356. _this5.context.stroke();
  69357. }
  69358. }
  69359. };
  69360. for (var i = 0; i < data.length - 1; i++) {
  69361. _loop(i);
  69362. }
  69363. }
  69364. }, {
  69365. key: "receive",
  69366. value: function receive(data) {
  69367. if (data.type == 'undo') {
  69368. this.records.pop();
  69369. this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  69370. for (var i = 0; i < this.records.length; i++) {
  69371. this.paint(this.records[i], 0);
  69372. }
  69373. } else {
  69374. this.transformTo2d(data.data);
  69375. this.paint(data.data);
  69376. this.records.push(data.data);
  69377. }
  69378. }
  69379. }]);
  69380. return Paint;
  69381. }(tinyEmitter);
  69382. 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; }
  69383. 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; }
  69384. 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); }; }
  69385. 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; } }
  69386. var ScreenEvents = {
  69387. Move: 'move',
  69388. Rotate: 'rotate',
  69389. Zoom: 'zoom',
  69390. EndRotation: 'endRotation',
  69391. MoveModel: 'moveModel',
  69392. MoveComplete: 'move.complete',
  69393. ModeChanged: 'mode.changed',
  69394. ModeChanging: 'mode.changing',
  69395. PanoChosen: 'pano.chosen',
  69396. ClosestPanoChanging: 'closest.pano.changing',
  69397. WarpStarted: 'warp.started',
  69398. WarpInterrupted: 'warp.interrupted',
  69399. WarpEnded: 'warp.ended',
  69400. FlyinFinished: 'flyin.finished',
  69401. FlyingStarted: 'flying.started',
  69402. FlyingInterrupted: 'flying.interrupted',
  69403. FlyingEnded: 'flying.ended',
  69404. Ready: 'ready',
  69405. StartInside: 'start.inside',
  69406. StartOutside: 'start.outside',
  69407. ViewChanged: 'view.changed',
  69408. WarpInterruptedWithFlyTo: 'warp.interrupted.flyto',
  69409. InputStart: 'input.start'
  69410. };
  69411. var index = 0;
  69412. var Screen = /*#__PURE__*/function (_Emiter) {
  69413. _inherits(Screen, _Emiter);
  69414. var _super = _createSuper$v(Screen);
  69415. function Screen(app) {
  69416. var _this;
  69417. _classCallCheck(this, Screen);
  69418. _this = _super.call(this);
  69419. _this.index = index++;
  69420. _this.app = app;
  69421. _this.inited = false;
  69422. _this.started = false;
  69423. return _this;
  69424. }
  69425. /**
  69426. * 初始化,这里是否需要这么写,还是直接在业务使用Camera事件
  69427. */
  69428. _createClass(Screen, [{
  69429. key: "init",
  69430. value: function init() {
  69431. var _this2 = this;
  69432. this.inited = true;
  69433. var player = this.app.core.get('Player');
  69434. if (this.role == 'leader' || !this.role) {
  69435. this.app.Camera.on(ScreenEvents.FlyingStarted, function (params) {
  69436. return _this2.emitData(params);
  69437. });
  69438. this.app.Camera.on(ScreenEvents.Zoom, function (params) {
  69439. return _this2.emitData(params);
  69440. });
  69441. this.app.Camera.on(ScreenEvents.MoveModel, function (params) {
  69442. return _this2.emitData(params);
  69443. });
  69444. player.viewLinkManager.addEventListener('loaded', function () {
  69445. if (_this2.started) {
  69446. //this.app.core.get('Player').viewLinkManager.setViewsVisible('url', false)
  69447. player.viewLinkManager.hideAllViews();
  69448. }
  69449. });
  69450. var _interval;
  69451. this.app.Camera.on(ScreenEvents.Rotate, function (params) {
  69452. _this2.emitData(params);
  69453. clearTimeout(_interval);
  69454. _interval = null;
  69455. });
  69456. this.app.Camera.on(ScreenEvents.EndRotation, function (params) {
  69457. _this2.emitData(params);
  69458. if (_this2.role == 'leader') {
  69459. //xzw add 旋转完后,每隔一段时间发送一下当前朝向
  69460. var count = 0,
  69461. deltaTime = 20;
  69462. _interval = function interval() {
  69463. _this2.emitData({
  69464. type: 'syncRotContinue',
  69465. quaternion: player.quaternion
  69466. });
  69467. if (count++ < 10 && _interval && player.mode == 'panorama') {
  69468. setTimeout(_interval, deltaTime += 20);
  69469. }
  69470. };
  69471. setTimeout(_interval, deltaTime);
  69472. }
  69473. });
  69474. }
  69475. if (this.role == 'follow') {
  69476. //被带看
  69477. this.app.Camera.on(ScreenEvents.FlyingEnded, this.requestSync.bind(this)); //player.on('flytopano.rotateEnd', requestSync)
  69478. }
  69479. }
  69480. /**
  69481. * 开始同步
  69482. */
  69483. }, {
  69484. key: "start",
  69485. value: function start() {
  69486. this.started = true;
  69487. if (this.inited) {
  69488. return;
  69489. }
  69490. this.init();
  69491. this.app.core.get('Player').setPanoTaskEnable(false); //this.app.core.get('Player').cameraControls.controls.panorama.speed = 0.1
  69492. if (this.app.configSync) ; else {
  69493. this.app.VRScreenSYNC = true;
  69494. settings$3.zoom.enabled = false;
  69495. } // 隐藏全景关联
  69496. if (this.app.core.get('Player').viewLinkManager.loaded) {
  69497. this.app.core.get('Player').viewLinkManager.hideAllViews();
  69498. }
  69499. }
  69500. /**
  69501. * 退出
  69502. */
  69503. }, {
  69504. key: "exit",
  69505. value: function exit() {
  69506. this.started = false;
  69507. this.app.core.get('Player').setPanoTaskEnable(true);
  69508. this.app.core.get('Player').locked = false; //this.app.core.get('Player').cameraControls.controls.panorama.speed = 1
  69509. this.app.VRScreenSYNC = false;
  69510. settings$3.zoom.enabled = true; // 显示全景关联
  69511. if (this.app.core.get('Player').viewLinkManager.loaded) {
  69512. this.app.core.get('Player').viewLinkManager.showAllViews();
  69513. }
  69514. }
  69515. /**
  69516. * 同步视角
  69517. */
  69518. }, {
  69519. key: "sync",
  69520. value: function sync() {
  69521. var player = this.app.core.get('Player');
  69522. var mode = player.modeTran.split('-')[1]; //console.log('同步画面',mode)
  69523. if (mode === Viewmode$1.PANORAMA) {
  69524. var panoId = null;
  69525. if (player.mode == Viewmode$1.PANORAMA && player.nextPano != void 0) {
  69526. //正在flytoPano
  69527. panoId = player.nextPano.id;
  69528. } else if (player.currentPano) {
  69529. panoId = player.currentPano.id;
  69530. } //console.log('panoId', panoId)
  69531. this.emitData({
  69532. panoId: panoId,
  69533. //leader
  69534. quaternion: player.quaternion,
  69535. mode,
  69536. type: 'flyToPano'
  69537. });
  69538. } else {
  69539. var data = {
  69540. quaternion: player.quaternion,
  69541. position: player.position,
  69542. currentScale: player.cameraControls.controls.floorplan.currentScale,
  69543. mode,
  69544. type: 'flyToNewMode'
  69545. };
  69546. if (player.cameraControls.activeControl) {
  69547. data.target = {
  69548. x: player.cameraControls.activeControl.target.x,
  69549. y: player.cameraControls.activeControl.target.y,
  69550. z: player.cameraControls.activeControl.target.z
  69551. };
  69552. }
  69553. this.emitData(data);
  69554. }
  69555. }
  69556. }, {
  69557. key: "requestSync",
  69558. value: function requestSync(params) {
  69559. var _this3 = this;
  69560. setTimeout(function () {
  69561. //console.log('requestSync')
  69562. _this3.emitData({
  69563. //飞完后请求同步一下,因为可能在飞期间leader又改变了
  69564. type: 'requestSync'
  69565. });
  69566. }, 1); //可能panosTaskList还没清空所以延迟
  69567. }
  69568. }, {
  69569. key: "emitData",
  69570. value: function emitData(params) {
  69571. // 防止无限循环
  69572. var player = this.app.core.get('Player'); //console.warn(this.index, params, player.syncType)
  69573. if (player.syncType == 'receive') {
  69574. player.syncType = null;
  69575. return;
  69576. }
  69577. if (!this.started
  69578. /* || this.role == 'follow' */
  69579. ) {
  69580. return;
  69581. }
  69582. if (params) {
  69583. for (var key in params) {
  69584. var value = params[key];
  69585. if (value instanceof THREE.Vector2) {
  69586. params[key] = new THREE.Vector2(value.x, value.y);
  69587. } else if (value instanceof THREE.Vector3) {
  69588. params[key] = new THREE.Vector3(value.x, value.y, value.z);
  69589. }
  69590. }
  69591. }
  69592. this.emit('data', _objectSpread$2({}, params));
  69593. }
  69594. /**
  69595. * 数据转换
  69596. * @param {Object} data
  69597. */
  69598. }, {
  69599. key: "transform",
  69600. value: function transform(data) {
  69601. if (data.target && data.target instanceof THREE.Vector3 === false) {
  69602. data.target = new THREE.Vector3(data.target.x, data.target.y, data.target.z);
  69603. }
  69604. if (data.position && data.position instanceof THREE.Vector3 === false) {
  69605. data.position = new THREE.Vector3(data.position.x, data.position.y, data.position.z);
  69606. }
  69607. if (data.quaternion && data.quaternion instanceof THREE.Quaternion === false) {
  69608. if (data.quaternion.hasOwnProperty('_x')) {
  69609. data.quaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  69610. } else {
  69611. data.quaternion = new THREE.Quaternion(data.quaternion.x, data.quaternion.y, data.quaternion.z, data.quaternion.w);
  69612. }
  69613. }
  69614. if (data.rotationSpeed && data.rotationSpeed instanceof THREE.Vector2 === false) {
  69615. data.rotationSpeed = new THREE.Vector2(data.rotationSpeed.x, data.rotationSpeed.y);
  69616. }
  69617. if (data.info) {
  69618. this.transform(data.info);
  69619. }
  69620. if (data.modelInfo) {
  69621. this.transform(data.modelInfo);
  69622. }
  69623. }
  69624. }]);
  69625. return Screen;
  69626. }(tinyEmitter);
  69627. 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); }; }
  69628. 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; } }
  69629. /**
  69630. * 同屏带看
  69631. */
  69632. var SyncScreen = /*#__PURE__*/function (_Screen) {
  69633. _inherits(SyncScreen, _Screen);
  69634. var _super = _createSuper$u(SyncScreen);
  69635. function SyncScreen(app) {
  69636. var _this;
  69637. _classCallCheck(this, SyncScreen);
  69638. _this = _super.call(this, app);
  69639. _this.toSame = function (data, player, func) {
  69640. if (data.mode == player.mode) {
  69641. //漫游模式情况下,还需要考虑当前漫游点是否对的上
  69642. if (data.mode == Viewmode$1.PANORAMA) {
  69643. if (data.currentPanoId == player.currentPano.id) {
  69644. return true;
  69645. } else {
  69646. var targetPano = player.model.panos.index[parseInt(data.currentPanoId)];
  69647. player.flyToPano({
  69648. pano: targetPano
  69649. }, func);
  69650. return false;
  69651. }
  69652. } else {
  69653. return true;
  69654. }
  69655. } else {
  69656. // console.log('mode:' + player.mode)
  69657. if (player.mode == Viewmode$1.TRANSITIONING) {
  69658. return null;
  69659. }
  69660. if (data.mode == Viewmode$1.FLOORPLAN) {
  69661. player.flyToNewMode({
  69662. mode: Viewmode$1.FLOORPLAN,
  69663. callback: func
  69664. });
  69665. return false;
  69666. } else if (data.mode == Viewmode$1.DOLLHOUSE) {
  69667. player.flyToNewMode({
  69668. mode: Viewmode$1.DOLLHOUSE,
  69669. target: data.info.target,
  69670. position: data.info.position,
  69671. 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,
  69672. panoId: null,
  69673. callback: func
  69674. });
  69675. return false;
  69676. }
  69677. return true;
  69678. }
  69679. };
  69680. _this.syncRotate = function (data, player) {
  69681. //漫游模式下的旋转同步
  69682. //player.cameraControls.activeControl.lockedForce = true
  69683. var quaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w); //注意不能直接赋值quaternion,因为手机上fov不一样,上下角度有限制,会导致角度闪烁。
  69684. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(player.cameraControls.activeControl.camera.position);
  69685. player.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
  69686. };
  69687. _this.copyCameraProp = function (player, info) {
  69688. //复制录屏的数据给camera或control
  69689. //options = options || {}
  69690. var ctrl = player.cameraControls.activeControl;
  69691. var camera = ctrl.camera;
  69692. if (info.position) {
  69693. camera.position.copy(info.position);
  69694. } // else{
  69695. // camera.position.copy(this.currentPano.position);//fly in时需要赋值
  69696. // }
  69697. if (info.quaternion) {
  69698. /*
  69699. if(options.transitionQua){//需要渐变quaternion
  69700. var _qua = new THREE.Quaternion().set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
  69701. this.setQuaternionTransition(_qua)
  69702. }else{
  69703. camera.quaternion.set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
  69704. this.setQuaternionTransition(null)//当需要瞬间变化时终止渐变
  69705. }
  69706. //camera.quaternion.copy(item.qua);
  69707. */
  69708. camera.quaternion.set(info.quaternion._x, info.quaternion._y, info.quaternion._z, info.quaternion._w);
  69709. } //if(item.zoomLevel) this.zoomTo(item.zoomLevel)
  69710. info.target && ctrl.target.copy(info.target); //outside 其实只要最后一针较真就好(防止位移) ,但是麻烦所以。。
  69711. //俯视图情况
  69712. if (info.scale) {
  69713. ctrl.absoluteScale = info.scale;
  69714. ctrl.updateZoom();
  69715. } // if(item.zoom){//floorplan
  69716. // ctrl.currentScale = MathLight.convertWorkshopOrthoZoom(item.zoom), //根据屏幕适应性缩放
  69717. // ctrl.absoluteScale = ctrl.currentScale;
  69718. // ctrl.offset.copy(camera.position).sub(ctrl.target);//offset才是决定此时camera转向的关键
  69719. // ctrl.updateZoom()
  69720. // }
  69721. //console.log("copyCameraProp")
  69722. };
  69723. return _this;
  69724. }
  69725. /**
  69726. * 接收同步数据
  69727. * @param {*} data
  69728. */
  69729. _createClass(SyncScreen, [{
  69730. key: "receive",
  69731. value: function receive(data) {
  69732. // console.log('接受')
  69733. var player = this.app.core.get('Player');
  69734. var flag = true;
  69735. this.transform(data);
  69736. switch (data.type) {
  69737. case 'flyToPano':
  69738. // console.log('漫游')
  69739. player.syncType = 'receive';
  69740. var targetPano = player.model.panos.index[parseInt(data.panoId)];
  69741. var target = {};
  69742. target.pano = targetPano;
  69743. if (data.quaternion) {
  69744. target.quaternion = new THREE.Quaternion().set(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  69745. }
  69746. player.flyToPano(target);
  69747. break;
  69748. case 'flyToNewMode':
  69749. // console.log('飞入飞出')
  69750. player.syncType = 'receive';
  69751. if (data && data.panoId) {
  69752. data.pano = player.model.panos.index[parseInt(data.panoId)];
  69753. }
  69754. if (player.model.mode == 'panorama' && this.app.configSync) {
  69755. // 变为单屏
  69756. this.app.dom.parentElement.style.width = '100%';
  69757. this.app.configSync.dom.style.width = '0';
  69758. this.app.dom.parentElement.style.height = '100%';
  69759. this.app.configSync.dom.style.height = '0';
  69760. }
  69761. setTimeout(function () {
  69762. return player.flyToNewMode(data);
  69763. }, 50);
  69764. break;
  69765. case 'rotate':
  69766. //console.log('旋转')
  69767. if (player.model.mode == Viewmode$1.PANORAMA) {
  69768. flag = this.toSame(data, player, function () {
  69769. this.syncRotate(data, player);
  69770. }.bind(this));
  69771. if (flag) {
  69772. this.syncRotate(data, player);
  69773. }
  69774. }
  69775. break;
  69776. case 'endRotation':
  69777. //console.log('停止旋转')
  69778. if (player.cameraControls && player.cameraControls.activeControl) {
  69779. player.cameraControls.activeControl.lockedForce = false; //console.log('endRotation:' + JSON.stringify(data.rotationSpeed))
  69780. player.cameraControls.activeControl.rotationSpeed = data.rotationSpeed || new THREE.Vector2();
  69781. }
  69782. break;
  69783. case 'zoom':
  69784. // console.log('缩放')
  69785. /*player.syncType = 'receive'
  69786. flag = this.toSame(
  69787. data,
  69788. player,
  69789. function () {
  69790. player.handleControlScroll(data.zoom,true)
  69791. }.bind(this)
  69792. )
  69793. if (flag == null) {
  69794. //正在过渡
  69795. } else if (flag) {
  69796. player.handleControlScroll(data.zoom,true)
  69797. }*/
  69798. player.zoomTo(data.zoomLevel);
  69799. break;
  69800. case 'moveModel':
  69801. // console.log('移动模型')
  69802. flag = this.toSame(data, player, function () {
  69803. this.copyCameraProp(player, data.info);
  69804. }.bind(this));
  69805. if (flag == null) ; else if (flag) {
  69806. this.copyCameraProp(player, data.info);
  69807. }
  69808. break;
  69809. }
  69810. } //初始情况,可能两者状态不一致,这时候需要调整一致
  69811. //通过data里的元素与player进行比较来判断
  69812. }]);
  69813. return SyncScreen;
  69814. }(Screen);
  69815. 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); }; }
  69816. 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; } }
  69817. /**
  69818. * 一起逛
  69819. */
  69820. var FollowScreen = /*#__PURE__*/function (_Screen) {
  69821. _inherits(FollowScreen, _Screen);
  69822. var _super = _createSuper$t(FollowScreen);
  69823. function FollowScreen(app) {
  69824. var _this;
  69825. _classCallCheck(this, FollowScreen);
  69826. _this = _super.call(this, app);
  69827. _this.toSame = function (data, player, func) {
  69828. if (data.mode == player.mode) {
  69829. //漫游模式情况下,还需要考虑当前漫游点是否对的上
  69830. if (data.mode == Viewmode$1.PANORAMA) {
  69831. if (data.currentPanoId == player.currentPano.id) {
  69832. return true;
  69833. } else {
  69834. var targetPano = player.model.panos.index[parseInt(data.currentPanoId)];
  69835. var oldLock = player.locked;
  69836. player.locked = false;
  69837. player.flyToPano({
  69838. pano: targetPano
  69839. }, func);
  69840. player.locked = oldLock;
  69841. return false;
  69842. }
  69843. } else {
  69844. return true;
  69845. }
  69846. } else {
  69847. //console.log('mode:' + player.mode)
  69848. if (player.mode == Viewmode$1.TRANSITIONING) {
  69849. return null;
  69850. }
  69851. if (data.mode == Viewmode$1.FLOORPLAN) {
  69852. player.flyToNewMode({
  69853. mode: Viewmode$1.FLOORPLAN,
  69854. callback: func
  69855. });
  69856. return false;
  69857. } else if (data.mode == Viewmode$1.DOLLHOUSE) {
  69858. player.flyToNewMode({
  69859. mode: Viewmode$1.DOLLHOUSE,
  69860. target: data.info.target,
  69861. position: data.info.position,
  69862. 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,
  69863. panoId: null,
  69864. callback: func
  69865. });
  69866. return false;
  69867. }
  69868. return true;
  69869. }
  69870. };
  69871. _this.syncRotate = function (data, player) {
  69872. //漫游模式下的旋转同步
  69873. this.stopLerpQua(player);
  69874. this.pauseSyncRot = false;
  69875. var quaternion = player.cameraControls.activeControl.camera.quaternion.clone();
  69876. var endQuaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w); //注意不能直接赋值quaternion,因为手机上fov不一样,上下角度有限制,会导致角度闪烁。
  69877. this.endQuaternion = endQuaternion; //目标朝向
  69878. var time = Date.now();
  69879. if (time - this.lastUpdateTime > 100) {
  69880. //主控端开始拖拽,客户端和主控端位置有偏差(操作过快导致syncRotate2没有校对完),为了防止旋转突变,采用渐变。
  69881. this.lerpRatio = 0.1;
  69882. } else {
  69883. this.lerpRatio += 0.15;
  69884. this.lerpRatio = Math.min(1, this.lerpRatio);
  69885. } //console.log('this.lerpRatio',this.lerpRatio)
  69886. lerp.quaternion(quaternion, endQuaternion)(this.lerpRatio);
  69887. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(player.cameraControls.activeControl.camera.position);
  69888. player.cameraControls.activeControl.lookAt(lookAtPoint) //更新一下lat和lon
  69889. ;
  69890. player.cameraControls.activeControl.locked = false, player.cameraControls.activeControl.update(0);
  69891. player.cameraControls.activeControl.lockedForce = true; //禁止移动
  69892. this.lastUpdateTime = time;
  69893. };
  69894. _this.copyCameraProp = function (player, info) {
  69895. //复制录屏的数据给camera或control
  69896. //options = options || {}
  69897. var ctrl = player.cameraControls.activeControl;
  69898. var camera = ctrl.camera;
  69899. if (info.position) {
  69900. camera.position.copy(info.position);
  69901. } // else{
  69902. // camera.position.copy(this.currentPano.position);//fly in时需要赋值
  69903. // }
  69904. if (info.quaternion) {
  69905. /*
  69906. if(options.transitionQua){//需要渐变quaternion
  69907. var _qua = new THREE.Quaternion().set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
  69908. this.setQuaternionTransition(_qua)
  69909. }else{
  69910. camera.quaternion.set(item.qua._x,item.qua._y,item.qua._z,item.qua._w);
  69911. this.setQuaternionTransition(null)//当需要瞬间变化时终止渐变
  69912. }
  69913. //camera.quaternion.copy(item.qua);
  69914. */
  69915. camera.quaternion.set(info.quaternion._x, info.quaternion._y, info.quaternion._z, info.quaternion._w);
  69916. } //if(item.zoomLevel) this.zoomTo(item.zoomLevel)
  69917. info.target && ctrl.target.copy(info.target); //outside 其实只要最后一针较真就好(防止位移) ,但是麻烦所以。。
  69918. //console.log('同屏数据', info)
  69919. //俯视图情况
  69920. if (info.scale) {
  69921. ctrl.absoluteScale = info.scale;
  69922. ctrl.updateZoom();
  69923. } // if(item.zoom){//floorplan
  69924. // ctrl.currentScale = MathLight.convertWorkshopOrthoZoom(item.zoom), //根据屏幕适应性缩放
  69925. // ctrl.absoluteScale = ctrl.currentScale;
  69926. // ctrl.offset.copy(camera.position).sub(ctrl.target);//offset才是决定此时camera转向的关键
  69927. // ctrl.updateZoom()
  69928. // }
  69929. //console.log("copyCameraProp")
  69930. };
  69931. _this.role = 'leader';
  69932. _this.lastUpdateTime = 0;
  69933. _this.lerpRatio = 1;
  69934. return _this;
  69935. }
  69936. _createClass(FollowScreen, [{
  69937. key: "start",
  69938. value: function start() {
  69939. var _this2 = this;
  69940. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  69941. this.role = options.follow ? 'follow' : 'leader';
  69942. _get(_getPrototypeOf(FollowScreen.prototype), "start", this).call(this);
  69943. if (options.follow) {
  69944. var player = this.app.core.get('Player');
  69945. player.locked = true;
  69946. if (!this.inited) {
  69947. player.on(PlayerEvents.Rotate, function (params) {
  69948. //客户端滑动屏幕,暂停被保持同步,直到主控端又对屏幕进行操作
  69949. _this2.pauseSyncRot = true;
  69950. _this2.stopLerpQua(player);
  69951. });
  69952. this.inited = true;
  69953. }
  69954. }
  69955. }
  69956. }, {
  69957. key: "exit",
  69958. value: function exit() {
  69959. _get(_getPrototypeOf(FollowScreen.prototype), "exit", this).call(this);
  69960. this.role = 'leader';
  69961. var player = this.app.core.get('Player');
  69962. if (player.locked) {
  69963. player.locked = false;
  69964. }
  69965. }
  69966. /**
  69967. * 接收同步数据
  69968. * @param {*} data
  69969. */
  69970. }, {
  69971. key: "receive",
  69972. value: function receive(data) {
  69973. var _this3 = this;
  69974. var player = this.app.core.get('Player');
  69975. var flag = true;
  69976. this.transform(data);
  69977. if (this.role == 'leader') {
  69978. switch (data.type) {
  69979. case 'requestSync':
  69980. this.sync();
  69981. }
  69982. } else {
  69983. switch (data.type) {
  69984. case 'flyToPano':
  69985. if (player.panosTaskList.length > 0) {
  69986. //console.log('因panosTaskList延迟')
  69987. return setTimeout(function () {
  69988. //之后不一定会触发 flying.ended 故用setTimeout
  69989. _this3.requestSync(); //直接请求同步,因为可能有变动所以不能直接使用旧消息
  69990. }, 500);
  69991. } //console.log('flyToPano ', data.panoId )
  69992. var targetPano = player.model.panos.index[parseInt(data.panoId)];
  69993. player.locked = false;
  69994. var target = {
  69995. pano: targetPano
  69996. };
  69997. if (data.quaternion) {
  69998. target.quaternion = new THREE.Quaternion().set(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  69999. }
  70000. if (player.mode == 'panorama' && player.currentPano.id == data.panoId) {
  70001. //如果在当前点位,迅速转向,否则容易使panosTaskList.length非0而无法飞向下一点
  70002. target.aimDuration = 0;
  70003. }
  70004. player.flyToPano(target, function () {
  70005. player.locked = true;
  70006. });
  70007. break;
  70008. case 'flyToNewMode':
  70009. console.log('flyToNewMode', data.mode); //飞出的两种模式
  70010. if (data.mode == player.mode) {
  70011. //如果mode相同,转为moveModel使角度相同
  70012. data.type = 'moveModel';
  70013. data.info = {
  70014. scale: data.currentScale,
  70015. target: data.target,
  70016. position: data.position,
  70017. quaternion: data.quaternion
  70018. };
  70019. return this.receive(data);
  70020. } else {
  70021. if (data.panoId) {
  70022. data.pano = player.model.panos.index[parseInt(data.panoId)];
  70023. }
  70024. player.locked = false;
  70025. data.callback = function () {
  70026. player.locked = true;
  70027. };
  70028. player.flyToNewMode(data); // if (data.modelInfo) {
  70029. // if (data.modelInfo.panoId) {
  70030. // data.modelInfo.pano = player.model.panos.index[parseInt(data.modelInfo.panoId)]
  70031. // }
  70032. // player.locked = false
  70033. // data.modelInfo.callback = function () {
  70034. // player.locked = true
  70035. // }
  70036. // } else {
  70037. // if (data.panoId) {
  70038. // data.pano = player.model.panos.index[parseInt(data.panoId)]
  70039. // }
  70040. // player.locked = false
  70041. // data.callback = function () {
  70042. // player.locked = true
  70043. // }
  70044. // }
  70045. // player.flyToNewMode(data.modelInfo || data)
  70046. break;
  70047. }
  70048. case 'rotate':
  70049. // console.log('旋转', data)
  70050. if (player.model.mode == Viewmode$1.PANORAMA) {
  70051. flag = this.toSame(data, player, function () {
  70052. this.syncRotate(data, player);
  70053. }.bind(this));
  70054. if (flag) {
  70055. this.syncRotate(data, player);
  70056. }
  70057. }
  70058. break;
  70059. case 'endRotation':
  70060. if (player.cameraControls && player.cameraControls.activeControl) {
  70061. //console.log('停止旋转')
  70062. player.cameraControls.activeControl.lockedForce = false; //console.log('endRotation:' + JSON.stringify(data.rotationSpeed)) //旋转速度之后和主控端难以一致,所以不用
  70063. //player.cameraControls.activeControl.rotationSpeed = data.rotationSpeed || new THREE.Vector2()
  70064. /*
  70065. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(player.cameraControls.activeControl.camera.quaternion).add(player.cameraControls.activeControl.camera.position)
  70066. player.cameraControls.activeControl.lookAt(lookAtPoint) //更新一下lat和lon
  70067. */
  70068. }
  70069. break;
  70070. case 'syncRotContinue':
  70071. if (player.cameraControls && player.cameraControls.activeControl) {
  70072. this.syncRotate2(data, player);
  70073. }
  70074. break;
  70075. case 'zoom':
  70076. //console.log('缩放')
  70077. flag = this.toSame(data, player, function () {
  70078. player.handleControlScroll(data.zoom);
  70079. }.bind(this));
  70080. if (flag == null) ; else if (flag) {
  70081. player.handleControlScroll(data.zoom);
  70082. }
  70083. break;
  70084. case 'moveModel':
  70085. //console.log('移动模型')
  70086. flag = this.toSame(data, player, function () {
  70087. this.copyCameraProp(player, data.info);
  70088. }.bind(this));
  70089. if (flag == null) ; else if (flag) {
  70090. player.cameraControls.activeControl.lockedForce = true;
  70091. player.locked = true;
  70092. this.copyCameraProp(player, data.info);
  70093. player.cameraControls.activeControl.locked = false;
  70094. if (player.mode == Viewmode$1.PANORAMA) {
  70095. player.locked = false;
  70096. }
  70097. }
  70098. break;
  70099. }
  70100. }
  70101. } //初始情况,可能两者状态不一致,这时候需要调整一致
  70102. //通过data里的元素与player进行比较来判断
  70103. }, {
  70104. key: "syncRotate2",
  70105. value: function syncRotate2(data, player) {
  70106. var _this4 = this;
  70107. //主控端停止滑动屏幕后,进行后续的旋转校对
  70108. if (this.pauseSyncRot || player.mode != 'panorama') return; //客户端滑动了屏幕
  70109. var endQuaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w);
  70110. var maxTime = 500;
  70111. var startTime = Date.now(); //console.error('endQuaternion', endQuaternion)
  70112. if (this.lerpQuaFun) {
  70113. this.stopLerpQua(player);
  70114. }
  70115. this.lerpQuaFun = function () {
  70116. if (!player.cameraControls.activeControl) return _this4.stopLerpQua(player);
  70117. var quaternion = player.quaternion.clone();
  70118. lerp.quaternion(quaternion, endQuaternion)(0.1); //console.log('quaternion',quaternion)
  70119. var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(player.cameraControls.activeControl.camera.position);
  70120. player.cameraControls.activeControl.lookAt(lookAtPoint); //更新一下lat和lon
  70121. if (Date.now() - startTime > maxTime) {
  70122. //一段时间后停止同步
  70123. _this4.stopLerpQua(player);
  70124. }
  70125. };
  70126. player.on('update', this.lerpQuaFun);
  70127. }
  70128. }, {
  70129. key: "stopLerpQua",
  70130. value: function stopLerpQua(player) {
  70131. player.off('update', this.lerpQuaFun), this.lerpQuaFun = null; //, console.log('pause syncRot2')
  70132. }
  70133. /* syncRotate = function (data, player) {
  70134. //漫游模式下的旋转同步--另一个版本,使quaternion完全一样,但拖拽完毕后手机客户端会回到限制的lat,有个画面跳跃。好处是客户端在主控端移动画面时无法改变旋转
  70135. player.cameraControls.activeControl.lockedForce = true
  70136. let quaternion = new THREE.Quaternion(data.quaternion._x, data.quaternion._y, data.quaternion._z, data.quaternion._w) //注意不能直接赋值quaternion,因为手机上fov不一样,上下角度有限制,会导致角度闪烁。
  70137. player.cameraControls.activeControl.camera.quaternion.copy(quaternion)
  70138. } */
  70139. }]);
  70140. return FollowScreen;
  70141. }(Screen);
  70142. var Broadcast = function Broadcast(app) {
  70143. _classCallCheck(this, Broadcast);
  70144. this.sync = new SyncScreen(app);
  70145. this.follow = new FollowScreen(app);
  70146. this.paint = new Paint(app);
  70147. };
  70148. 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); }; }
  70149. 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; } }
  70150. var player$9, sceneRenderer$1;
  70151. var viewHeights = {}; //balloon统一高度
  70152. var posMaxRadius; //限制balloon到center的距离
  70153. var ViewLinkEdit = /*#__PURE__*/function (_THREE$EventDispatche) {
  70154. _inherits(ViewLinkEdit, _THREE$EventDispatche);
  70155. var _super = _createSuper$s(ViewLinkEdit);
  70156. function ViewLinkEdit(app) {
  70157. var _this;
  70158. _classCallCheck(this, ViewLinkEdit);
  70159. _this = _super.call(this);
  70160. _this.app = app; //let deferred = Deferred()
  70161. _this.app.Scene.on('loaded', function () {
  70162. //if(app.config.isRouteSnap)return
  70163. player$9 = _this.app.core.get('Player');
  70164. sceneRenderer$1 = _this.app.core.get('SceneRenderer');
  70165. _this.init();
  70166. if (_this.editing) {
  70167. _this.enter();
  70168. } //deferred.resolve()
  70169. });
  70170. window.editView = _assertThisInitialized(_this);
  70171. return _this;
  70172. }
  70173. _createClass(ViewLinkEdit, [{
  70174. key: "init",
  70175. value: function init() {
  70176. var _this2 = this;
  70177. //根据模型大小来确定balloon距心最大距离
  70178. posMaxRadius = Math.max(Math.sqrt(player$9.model.size.x * player$9.model.size.x + player$9.model.size.y * player$9.model.size.y) * 2, 30);
  70179. player$9.model.floors.list.forEach(function (floor) {
  70180. var height = 0;
  70181. floor.panos.forEach(function (pano) {
  70182. height += pano.position.y;
  70183. });
  70184. height /= floor.panos.length;
  70185. viewHeights[floor.floorIndex] = height;
  70186. }); //用来获取鼠标的三维位置的intersectPlane
  70187. this.ground = new THREE.Mesh(new THREE.PlaneGeometry(80000, 80000, 1, 1), new THREE.MeshBasicMaterial({
  70188. transparent: true,
  70189. wireframe: true,
  70190. opacity: 0,
  70191. side: THREE.DoubleSide,
  70192. depthTest: false
  70193. }));
  70194. this.ground.lookAt(new THREE.Vector3(0, 1, 0));
  70195. this.ground.name = 'editviewLink-ground'; //player.model.add(this.ground) //调试时再加
  70196. this.ground.position.setY(player$9.model.center.y); //balloon和circle之间的虚线
  70197. var points = [{
  70198. x: 0,
  70199. y: 0,
  70200. z: 0
  70201. }, {
  70202. x: 10,
  70203. y: 0,
  70204. z: 0
  70205. }]; //虚线分段似乎一开始就根据长度算好了,如果不重算则分段数不变。
  70206. this.linkLine = LineDraw.createFatLine(points, {
  70207. material: LineDraw.createFatLineMat({
  70208. lineWidth: 3,
  70209. color: Colors.mainColor,
  70210. dashed: true,
  70211. gapSize: 0.2,
  70212. dashSize: 0.3
  70213. })
  70214. });
  70215. player$9.model.add(this.linkLine); //balloon或circle到pano之间的连线
  70216. this.linkLine2 = LineDraw.createFatLine(points, {
  70217. material: LineDraw.createFatLineMat({
  70218. lineWidth: 3,
  70219. opacity: 0.2,
  70220. color: Colors.mainColor
  70221. })
  70222. });
  70223. player$9.model.add(this.linkLine2);
  70224. this.linkLine.visible = this.linkLine2.visible = false;
  70225. this.events = {
  70226. changeFloor: function changeFloor(toFloor, mode) {
  70227. if (_this2.settingPos) {
  70228. //正在设置可视
  70229. _this2.fadeMarkerByFloor(true);
  70230. }
  70231. },
  70232. movePos: function movePos() {
  70233. _this2.movePos();
  70234. },
  70235. confirmPos: function confirmPos(e) {
  70236. e.consume();
  70237. _this2.confirmPos();
  70238. },
  70239. dragStart: function dragStart() {
  70240. if (_this2.markView && !player$9.enteringView) {
  70241. if (player$9.viewLinkManager.hoverBalloon && _this2.markView.balloon == player$9.viewLinkManager.hoverBalloon) _this2.dragBalloonStart();
  70242. if (player$9.viewLinkManager.hoverExit) _this2.dragExitStart();else if (player$9.viewLinkManager.hoverCircle) _this2.dragViewStart(player$9.viewLinkManager.hoverCircle.mesh);
  70243. }
  70244. },
  70245. dragEnd: function dragEnd(e) {
  70246. _this2.handelDragEnd(e);
  70247. },
  70248. lookAim: function lookAim() {
  70249. //转向circle
  70250. player$9.on('ifFocusPoint', function (askAim) {
  70251. if (_this2.editing && _this2.markView) {
  70252. var importance = 3; //设置当前的importance级别。如果askAim已高于该级别 就不操作
  70253. if (askAim.importance < importance) {
  70254. askAim.importance = importance;
  70255. askAim.aim = _this2.markView.circle.mesh.position.clone();
  70256. }
  70257. }
  70258. });
  70259. }
  70260. };
  70261. player$9.viewLinkManager.dispatchEvent({
  70262. type: 'getViewLinkEdit',
  70263. v: this
  70264. });
  70265. player$9.viewLinkManager.addEventListener('changeIntersect', function (e) {
  70266. _this2.dispatchEvent({
  70267. type: 'changeIntersect',
  70268. hovered: e.hovered
  70269. });
  70270. });
  70271. this.inited = true;
  70272. }
  70273. }, {
  70274. key: "enter",
  70275. value: function enter() {
  70276. this.editing = true;
  70277. if (!sceneRenderer$1) return; //sceneRenderer.addComponent(this)
  70278. player$9.model.on('floor.changed', this.events.changeFloor);
  70279. player$9.on('pointerStart', this.events.dragStart); //this.setSize(sceneRenderer.renderer.domElement.width, sceneRenderer.renderer.domElement.height)
  70280. player$9.on('pointerMove', this.events.movePos);
  70281. player$9.on('pointerUp', this.events.dragEnd);
  70282. player$9.on('ifFocusPoint', this.events.lookAim);
  70283. }
  70284. }, {
  70285. key: "leave",
  70286. value: function leave() {
  70287. this.editing = false;
  70288. if (!sceneRenderer$1) return;
  70289. sceneRenderer$1.removeComponent(this);
  70290. player$9.model.off('floor.changed', this.events.changeFloor);
  70291. player$9.off('pointerStart', this.events.dragStart);
  70292. player$9.off('pointerUp', this.events.dragEnd);
  70293. player$9.off('pointerMove', this.events.movePos);
  70294. player$9.off('ifFocusPoint', this.events.lookAim);
  70295. }
  70296. }, {
  70297. key: "setSize",
  70298. value: function setSize(x, y) {
  70299. //更新屏幕大小后
  70300. if (!this.inited) return;
  70301. /* this.linkLine.material.resolution.set(x, y)
  70302. this.linkLine2.material.resolution.set(x, y) */
  70303. }
  70304. }, {
  70305. key: "checkCanAddView",
  70306. value: function checkCanAddView() {
  70307. return this.inited && !player$9.flying && player$9.viewLinkManager.inited;
  70308. }
  70309. }, {
  70310. key: "addView",
  70311. value: function addView() {
  70312. var _this3 = this;
  70313. // zeg 如果此时正在观看监控,应该要先退出来
  70314. if (this.app.Camera.monitor.control && this.app.Camera.monitor.control.watchingCamera) {
  70315. this.app.Camera.monitor.control.stopWatch();
  70316. var control = player$9.cameraControls.controls.dollhouse;
  70317. control.target.set(0, 0, 0);
  70318. control.camera.position.setY(50);
  70319. control.resetRanges();
  70320. } //添加
  70321. if (!this.checkCanAddView()) {
  70322. //$waiting.show()
  70323. var timer = setInterval(function () {
  70324. if (_this3.checkCanAddView()) {
  70325. _this3.addView();
  70326. clearInterval(timer);
  70327. }
  70328. }, 50);
  70329. return;
  70330. } // zeg markView作为开始编辑的标识被我从begin()里提出来了
  70331. this.markView = new ViewLink({
  70332. sid: 'view360_' + common$1.getRandomSid()
  70333. }, this.app);
  70334. player$9.viewLinkManager.addView(this.markView);
  70335. var begin = function begin() {
  70336. _this3.markView.balloon.showOrHide(true, 0);
  70337. player$9.updateFromControls(); //刚飞到floorplan先更新下camera
  70338. _this3.beginSetPos();
  70339. _this3.setEditState(true);
  70340. CursorDeal.add('viewChoosePos');
  70341. };
  70342. if (!player$9.isOutsideMode()) {
  70343. player$9.flyToMode('floorplan', begin);
  70344. } else begin();
  70345. player$9.mode === Viewmode$1.FLOORPLAN && player$9.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  70346. player$9.modelSideManager.tempAuto();
  70347. }
  70348. }, {
  70349. key: "reEditView",
  70350. value: function reEditView(sid) {
  70351. //点击列表编辑view
  70352. this.markView = player$9.viewLinkManager.views[sid];
  70353. this.oldData = this.getData();
  70354. this.reEdit = true;
  70355. this.setEditState(true);
  70356. this.markView.circle.mesh.visible = true;
  70357. player$9.viewLinkManager.focusOn(this.markView);
  70358. if (player$9.mode == 'dollhouse' || player$9.mode == 'floorplan') {
  70359. this.markView.balloon.showOrHide(true, 0);
  70360. }
  70361. player$9.mode === Viewmode$1.FLOORPLAN && player$9.model.floorplanCadImg.hideCadPlane(); // 隐藏户型图
  70362. player$9.modelSideManager.tempAuto();
  70363. }
  70364. }, {
  70365. key: "setEditState",
  70366. value: function setEditState(state) {
  70367. state = !!state;
  70368. /* this.markView.balloon.setSelect(state)
  70369. this.markView.circle.setSelect(state) */
  70370. this.markView.setSelect(state);
  70371. this.markView.balloon.setStrictScale(state);
  70372. if (!state) {
  70373. this.reEdit = false;
  70374. this.markView = null; //这个是是否在编辑的标志
  70375. }
  70376. this.app.TagManager.switchAllDisplay(!state, 'editView', {
  70377. links: true
  70378. });
  70379. player$9.model.setModelDisplay(state, 'editView', 2, state ? 'add' : 'cancel');
  70380. common$1.updateVisible(player$9.viewLinkManager.group, 'edit', state, 10, state ? 'add' : 'cancel');
  70381. player$9.viewLinkManager.enabled = state;
  70382. player$9.emit('editViewStateChange', state);
  70383. } //退出某个view的编辑
  70384. }, {
  70385. key: "exit",
  70386. value: function exit() {
  70387. if (!this.markView) return;
  70388. this.stopSetPos();
  70389. this.cancelSetExit();
  70390. this.cancelSetEntry();
  70391. this.markView.circle.setSelect(false);
  70392. if (player$9.modeTran.split('-')[1] != 'panorama') this.markView.circle.mesh.visible = false;
  70393. this.markView.balloon.showOrHide(null, 50, 'auto');
  70394. this.setEditState(false);
  70395. player$9.mode === Viewmode$1.FLOORPLAN && player$9.model.floorplanCadImg.showCadPlane(); // 显示户型图
  70396. player$9.modelSideManager.recover();
  70397. }
  70398. /*
  70399. 点击退出(取消)
  70400. */
  70401. }, {
  70402. key: "cancelEdit",
  70403. value: function cancelEdit() {
  70404. if (!this.markView) return;
  70405. if (!this.reEdit) {
  70406. player$9.viewLinkManager.removeView(this.markView);
  70407. this.markView.dispose();
  70408. } else {
  70409. this.markView.titleLabel.setText(this.oldData.title);
  70410. this.markView.circle.mesh.scale.set(this.oldData.circle.scale, this.oldData.circle.scale, this.oldData.circle.scale);
  70411. this.markView.balloon.mesh.position.copy(this.oldData.balloon.pos);
  70412. this.markView.circle.updatePos('normal', {
  70413. position: this.oldData.circle.pos,
  70414. quaternion: this.oldData.circle.qua
  70415. });
  70416. this.markView.nearestPano = this.oldData.nearestPano;
  70417. this.markView.linkType = this.oldData.linkType;
  70418. this.markView.url = this.oldData.url;
  70419. this.changeType(this.markView.linkType); //全景图还原
  70420. this.markView.panoImgVersion = this.oldData.panoImgVersion;
  70421. this.markView.setPano({
  70422. thumbPanoTex: this.markView.thumbPanoTex != this.oldData.thumbPanoTex && this.oldData.thumbPanoTex
  70423. });
  70424. this.markView.circle.setMapOut(this.oldData.circle.mapOut);
  70425. this.markView.exitDoor.setMapOut(this.oldData.exit.mapOut);
  70426. if (!this.markView.enterQuaternion.equals(this.oldData.enterQuaternion)) {
  70427. this.markView.enterQuaternion = this.oldData.enterQuaternion.clone();
  70428. this.markView.linkType == 'pano' && this.markView.mapChangeRot();
  70429. }
  70430. this.markView.exitDirection = this.oldData.exitDirection.clone();
  70431. this.cancelSetExit(); //应用到mesh
  70432. }
  70433. this.exit();
  70434. }
  70435. /*
  70436. 点击保存(确定)
  70437. */
  70438. }, {
  70439. key: "confirmEdit",
  70440. value: function confirmEdit() {
  70441. console.log('confirmEdit');
  70442. if (this.markView.floor != this.markView.nearestPano.floor) {
  70443. if (this.markView.pano) {
  70444. this.markView.pano.floorIndex = this.markView.nearestPano.floorIndex;
  70445. this.markView.pano.floor.removePano(this.markView.pano);
  70446. this.markView.pano.floor = this.markView.nearestPano.floor;
  70447. this.markView.pano.floor.addPano(this.markView.pano);
  70448. }
  70449. this.markView.floor && this.markView.floor.removeView(this.markView);
  70450. this.markView.floor = this.markView.nearestPano.floor;
  70451. this.markView.floor.addView(this.markView);
  70452. }
  70453. this.exit();
  70454. }
  70455. }, {
  70456. key: "fadeMarkerByFloor",
  70457. value: function fadeMarkerByFloor(state) {
  70458. player$9.model.panos.forEach(function (pano) {
  70459. if (!pano.isAligned()) return;
  70460. var visi = state && (player$9.model.allFloorsVisible || !pano.floor.hidden);
  70461. /* if(visi){
  70462. pano.marker.updateStyle(null,'normal')//去掉videoTag
  70463. }else{
  70464. pano.updateMakerStyle() //恢复
  70465. } */
  70466. pano.marker.material.opacity = visi ? 1 : 0;
  70467. });
  70468. }
  70469. }, {
  70470. key: "beginSetPos",
  70471. value: function beginSetPos(type) {
  70472. this.settingPos = true;
  70473. this.markView.circle.state = 'sprite';
  70474. this.fadeMarkerByFloor(true); //this.markView.circle.mesh.material.depthTest = false
  70475. this.markView.circle.mesh.visible = true;
  70476. this.markView.update(player$9.camera, true);
  70477. this.markView.circle.mesh.visible = false; //因为位置还没计算好
  70478. this.placeGround();
  70479. if (type != 'reset') {
  70480. this.movePos('init'); //为了防止 直接confirmPos导致缺少数据 nearestPano
  70481. }
  70482. player$9.on('click', this.events.confirmPos);
  70483. }
  70484. }, {
  70485. key: "stopSetPos",
  70486. value: function stopSetPos() {
  70487. if (this.settingPos) {
  70488. this.settingPos = false;
  70489. this.linkLine.visible = false;
  70490. this.linkLine2.visible = false; //this.markView.circle.mesh.visible = false;
  70491. this.markView.circle.state = '3D';
  70492. this.markView.circle.quaternion && this.markView.circle.mesh.quaternion.copy(this.markView.circle.quaternion); //this.markView.circle.mesh.material.depthTest = true
  70493. this.fadeMarkerByFloor(false);
  70494. player$9.off('click', this.events.confirmPos);
  70495. CursorDeal.remove('viewChoosePos');
  70496. }
  70497. }
  70498. }, {
  70499. key: "confirmPos",
  70500. value: function confirmPos() {
  70501. this.stopSetPos();
  70502. this.dispatchEvent({
  70503. type: 'confirm',
  70504. info: {
  70505. sid: this.markView.sid,
  70506. balloon: {
  70507. pos: this.markView.balloon.mesh.position.toArray()
  70508. },
  70509. circle: {
  70510. pos: this.markView.circle.position.toArray(),
  70511. qua: this.markView.circle.quaternion.toArray(),
  70512. scale: Math.round(this.markView.circle.mesh.scale.x * 100)
  70513. },
  70514. nearestPano: this.markView.nearestPano.id,
  70515. enterQuaternion: this.markView.enterQuaternion.toArray(),
  70516. exitDirection: this.markView.exitDirection.toArray()
  70517. }
  70518. });
  70519. }
  70520. }, {
  70521. key: "cancelPos",
  70522. value: function cancelPos() {
  70523. this.dispatchEvent({
  70524. type: 'cancelPos'
  70525. });
  70526. }
  70527. }, {
  70528. key: "reSetPos",
  70529. value: function reSetPos() {
  70530. //修改关联点位置
  70531. this.markView.balloon.setSelect(true);
  70532. player$9.viewLinkManager.focusOn(this.markView);
  70533. }
  70534. }, {
  70535. key: "focusView",
  70536. value: function focusView(sid) {
  70537. var view = player$9.viewLinkManager.views[sid];
  70538. player$9.viewLinkManager.focusOn(view);
  70539. }
  70540. }, {
  70541. key: "changeScale",
  70542. value: function changeScale(s) {
  70543. //大小
  70544. console.log('changeScale', s);
  70545. this.markView.circle.mesh.scale.set(s, s, s);
  70546. this.markView.titleLabel.updatePos(); //this.confirmPos()
  70547. }
  70548. /*
  70549. 设置位置时计算位置
  70550. 设置balloon位置:
  70551. 类同编辑户型时的拖拽点的方法,找到balloon在地面上的位置。 但是如果鼠标朝上,只能在天空找到交点,(在编辑页面是不做处理不会响应,在此希望能随着鼠标方向改变balloon,所以)将天空上的balloon投射到地面即可。
  70552. circle的位置确定方法: 先找到和balloon最近的漫游点pano,然后过pano向balloon作一条射线, 结果有两种情况:1是和模型有交点,则位置就是交点位置(贴墙); 2是无交点,则位置定为线上到pano一定距离的一点(面朝pano)。
  70553. 其中1也分为两种情况:circle在pano和balloon之间、以及balloon在circle和交点之间。这影响到linkLine的表现。
  70554. */
  70555. }, {
  70556. key: "movePos",
  70557. value: function movePos(type) {
  70558. if (this.settingPos) {
  70559. var center = player$9.model.center.clone();
  70560. var intersect = player$9.getMouseIntersect(null, [this.ground]);
  70561. if (!intersect) {
  70562. console.error('no intersect'); //console.log(player.mode)
  70563. return;
  70564. }
  70565. if (player$9.model.allFloorsVisible) {
  70566. if (type != 'init') center.setY(this.markView.balloon.mesh.position.y); //不改变原先的高度
  70567. } else {
  70568. if (player$9.model.currentFloor.panos.length == 0) {
  70569. console.warn('该层无漫游点!');
  70570. this.stopSetPos();
  70571. return;
  70572. }
  70573. center.setY(viewHeights[player$9.model.currentFloor.floorIndex]);
  70574. }
  70575. var pos = convertTool.getPosAtPlane(intersect.point, player$9, {
  70576. y: center.y
  70577. });
  70578. if (!pos) {
  70579. //交点在center所在高度的地平线以上,向上再求一次交点,然后把y值改为相机无法达到的高度100,然后再降下来
  70580. pos = convertTool.getPosAtPlane(intersect.point, player$9, {
  70581. y: 100
  70582. });
  70583. pos.y = center.y;
  70584. }
  70585. if (pos && pos.distanceTo(center) > posMaxRadius) {
  70586. //限制到center的距离
  70587. pos = center.clone().add(pos.clone().sub(center).normalize().multiplyScalar(posMaxRadius));
  70588. } //-------circle pos-------------------
  70589. var pos2;
  70590. var _qua = this.markView.circle.mesh.quaternion.clone();
  70591. var nearestPanos = common$1.sortByScore(player$9.model.panos.list, [Panorama.filters.isPanoAligned(), function (pano) {
  70592. return player$9.model.allFloorsVisible || pano.floor == player$9.model.currentFloor;
  70593. }], [function (pano) {
  70594. return -pos.distanceTo(pano.position);
  70595. }]).map(function (e) {
  70596. return e.item;
  70597. }); //不要在视频区域的
  70598. var nearestPano = nearestPanos.find(function (pano) {
  70599. var panoVideoFilter = pano.getVideoFilter();
  70600. var pos_ = new THREE.Vector3().copy(pos).setY(pano.position.y);
  70601. return !panoVideoFilter || !panoVideoFilter(pos_);
  70602. });
  70603. if (!nearestPano) nearestPano = nearestPanos[0];
  70604. var panoPos = nearestPano.position.clone(); //.setY(pos.y);
  70605. this.markView.nearestPano = nearestPano;
  70606. pos.setY(panoPos.y);
  70607. this.markView.balloon.mesh.position.copy(pos);
  70608. this.markView.balloon.update();
  70609. var intersect = convertTool.ifIntersectChunks(panoPos, pos, player$9.model, {
  70610. InfinityLen: true
  70611. });
  70612. if (!intersect) {
  70613. //没有可以贴边的mesh就限制到pano的距离
  70614. var dir = pos.clone().sub(nearestPano.position).setY(0).normalize().multiplyScalar(settings$3.boundExpandLength); //不能超出boundExpandLength,否则可能在skybox外
  70615. pos2 = panoPos.clone().add(dir);
  70616. this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().sub(dir));
  70617. } else {
  70618. var normal = intersect[0].face.normal.applyQuaternion(intersect[0].object.quaternion);
  70619. /* var point = this.position.clone().sub(object3d.point);
  70620. if (point.dot(object3d.normal) < 0) {
  70621. //x,y,z全部反向
  70622. object3d.normal.negate();
  70623. } */
  70624. pos2 = intersect[0].point.add(normal.multiplyScalar(0.01 * (1 + Math.random()))); //Math.random()是为了防止互相重叠造成闪烁,但是透明仍旧有问题,很多角度无法完全透明。用renderOrder虽能都透明但是也有层叠顺序
  70625. this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().add(normal));
  70626. }
  70627. this.markView.circle.mesh.visible = true;
  70628. this.markView.circle.updatePos('normal', {
  70629. position: pos2,
  70630. quaternion: this.markView.circle.mesh.quaternion.clone()
  70631. });
  70632. this.markView.circle.mesh.quaternion.copy(_qua); //-------link line ------------
  70633. //为了让线不穿过balloon显示在白色圈内
  70634. var vec = pos.clone().sub(pos2);
  70635. var len = vec.length();
  70636. var pos3 = pos2.clone().add(vec.multiplyScalar(Math.max(0, (len - 0.4) / len))); //multiplyScalar是为了线不遮挡到balloon中心区域
  70637. pos3.y -= 0.01; //for floorplan
  70638. var points = [pos3, pos2];
  70639. LineDraw.moveFatLine(this.linkLine, points); //lineGeometry.computeLineDistances()
  70640. if (panoPos.distanceTo(pos2) < panoPos.distanceTo(pos3)) {
  70641. var points = [panoPos, pos2];
  70642. } else {
  70643. var points = [panoPos, pos3];
  70644. }
  70645. LineDraw.moveFatLine(this.linkLine2, points);
  70646. this.linkLine.visible = true;
  70647. this.linkLine2.visible = true;
  70648. } else if (this.draggingExit) {
  70649. var intersect = player$9.getMouseIntersect(null, [player$9.model.skybox]);
  70650. this.markView.exitDoor.mesh.position.copy(intersect.point.clone().normalize().multiplyScalar(settings$3.view360.circleDisToCenter));
  70651. } else if (this.draggingCircleAtView) {
  70652. if (this.settingVisibles) {
  70653. var intersect = player$9.getMouseIntersect(null, [player$9.model.skybox]);
  70654. this.draggingMesh.position.copy(intersect.point.clone().normalize().multiplyScalar(settings$3.view360.circleDisToCenter));
  70655. this.saveVisibleViews();
  70656. } else {
  70657. //拖拽circle修改位置
  70658. var pos2;
  70659. var panoPos = player$9.position.clone();
  70660. var intersect = convertTool.getMouseIntersect(player$9.camera, player$9.model.colliders.concat(player$9.model.skybox), player$9.mouse);
  70661. if (intersect.object == player$9.model.skybox) {
  70662. //没有可以贴边的mesh就限制到pano的距离
  70663. var dir = intersect.point.clone().sub(panoPos).normalize().multiplyScalar(settings$3.boundExpandLength); //不能超出boundExpandLength,否则可能在skybox外
  70664. pos2 = panoPos.clone().add(dir);
  70665. this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().sub(dir));
  70666. } else {
  70667. var normal = intersect.face.normal.applyQuaternion(intersect.object.quaternion);
  70668. if (player$9.getMouseDirection().angleTo(intersect.face.normal) < Math.PI / 2) {
  70669. normal = normal.negate();
  70670. }
  70671. pos2 = intersect.point.add(normal.multiplyScalar(0.01 * (1 + Math.random()))); //Math.random()是为了防止互相重叠造成闪烁,但是透明仍旧有问题,很多角度无法完全透明。用renderOrder虽能都透明但是也有层叠顺序
  70672. this.markView.circle.mesh.lookAt(this.markView.circle.mesh.position.clone().add(normal));
  70673. } //this.markView.circle.mesh.visible = true
  70674. this.markView.circle.updatePos('normal', {
  70675. position: pos2,
  70676. quaternion: this.markView.circle.mesh.quaternion.clone()
  70677. });
  70678. this.markView.nearestPano = player$9.currentPano;
  70679. }
  70680. }
  70681. } //同编辑户型中的placeIntersectPlane
  70682. }, {
  70683. key: "placeGround",
  70684. value: function placeGround() {
  70685. this.ground.position.copy(this.markView.balloon.mesh.position);
  70686. this.ground.lookAt(this.ground.position.clone().add(player$9.getDirection(null, player$9.camera)));
  70687. }
  70688. }, {
  70689. key: "changeType",
  70690. value: function changeType(type) {
  70691. //切换类型 'url' || 'pano'
  70692. console.log('changeType', type);
  70693. this.markView.linkType = type;
  70694. this.markView.setPano();
  70695. }
  70696. }, {
  70697. key: "changeTitle",
  70698. value: function changeTitle(text) {
  70699. this.markView.titleLabel.setText(text);
  70700. }
  70701. }, {
  70702. key: "uploadedPanoMap",
  70703. value: function uploadedPanoMap(data) {
  70704. //添加全景图片后
  70705. console.log('uploadedPanoMap ', data);
  70706. data.mapSrc = data.thumb;
  70707. this.changeType('pano');
  70708. this.markView.pano;
  70709. this.markView.setPano({
  70710. reloadTex: true,
  70711. mapSrc: data.mapSrc,
  70712. thumb: data.thumb
  70713. /* version: Date.now() */
  70714. }); //mapSrc临时的全景blob src , thumb:小张的封面src
  70715. }
  70716. /* deletePanoMap(){
  70717. } */
  70718. }, {
  70719. key: "setLinkUrl",
  70720. value: function setLinkUrl(url) {
  70721. //修改跳转链接
  70722. this.markView.url = url;
  70723. }
  70724. }, {
  70725. key: "setCircleMap",
  70726. value: function setCircleMap(sid, src) {
  70727. //设置关联点样式(circle的map)
  70728. console.log('setCircleMap', sid, src);
  70729. if (typeof src == 'object') {
  70730. src = {
  70731. style: {
  70732. enter: src
  70733. }
  70734. };
  70735. }
  70736. player$9.viewLinkManager.views[sid].circle.setMapOut(src);
  70737. }
  70738. }, {
  70739. key: "setExitMap",
  70740. value: function setExitMap(sid, src) {
  70741. //设置跳出点样式
  70742. console.log('setExitMap', sid, src);
  70743. if (typeof src == 'object') {
  70744. src = {
  70745. style: {
  70746. exit: src
  70747. }
  70748. };
  70749. }
  70750. player$9.viewLinkManager.views[sid].exitDoor.setMapOut(src);
  70751. }
  70752. }, {
  70753. key: "deleteView",
  70754. value: function deleteView(sid) {
  70755. //点击删除
  70756. try {
  70757. player$9.viewLinkManager.views[sid].dispose();
  70758. player$9.viewLinkManager.removeView(player$9.viewLinkManager.views[sid]);
  70759. } catch (e) {
  70760. console.log(e);
  70761. }
  70762. }
  70763. }, {
  70764. key: "enterView",
  70765. value: function enterView(fun) {
  70766. var _this4 = this;
  70767. var done = function done() {
  70768. //$waiting.hide()
  70769. fun && fun();
  70770. }; //$waiting.show()
  70771. if (player$9.flying) {
  70772. //player.waitFlytoItemFuc = enterView.bind(this, fun);
  70773. player$9.once('flying.ended', function () {
  70774. _this4.enterView(fun);
  70775. });
  70776. return;
  70777. }
  70778. if (player$9.currentPano == this.markView.pano && player$9.mode == 'panorama') {
  70779. done();
  70780. } else {
  70781. this.markView.enter360Pano(done);
  70782. }
  70783. }
  70784. }, {
  70785. key: "exitView",
  70786. value: function exitView() {
  70787. return new Promise(function (resolve, reject) {
  70788. player$9.viewLinkManager.exitView().then(function () {
  70789. resolve('success');
  70790. });
  70791. });
  70792. } //-----------------------
  70793. }, {
  70794. key: "beginSetEntry",
  70795. value: function beginSetEntry() {
  70796. var _this5 = this;
  70797. //开始设置进入画面(进入的朝向)
  70798. var deferred = new Deferred$1();
  70799. console.log('beginSetEntry');
  70800. this.settingEntry = true;
  70801. this.enterView(function () {
  70802. /* var lookAtPoint = new THREE.Vector3(0, 0, -1).applyQuaternion(this.markView.enterQuaternion).add(player.cameraControls.activeControl.camera.position)
  70803. player.flyToPano({pano:player.currentPano, lookAtPoint, rotSpeed:2 }) */
  70804. deferred.resolve();
  70805. player$9.flyToPano({
  70806. pano: player$9.currentPano,
  70807. quaternion: _this5.markView.enterQuaternion,
  70808. rotSpeed: 2
  70809. });
  70810. });
  70811. return deferred.promise();
  70812. }
  70813. }, {
  70814. key: "confirmEntry",
  70815. value: function confirmEntry() {
  70816. //确定进入画面
  70817. if (player$9.currentPano != this.markView.pano) return;
  70818. this.markView.pano.quaternion.copy(player$9.quaternion);
  70819. this.markView.enterQuaternion.copy(player$9.quaternion);
  70820. this.markView.mapChangeRot();
  70821. this.dispatchEvent({
  70822. type: 'confirmEntry',
  70823. sid: this.markView.sid,
  70824. enterQuaternion: player$9.quaternion.toArray()
  70825. });
  70826. this.cancelSetEntry();
  70827. }
  70828. }, {
  70829. key: "cancelSetEntry",
  70830. value: function cancelSetEntry() {
  70831. //取消进入画面
  70832. if (!this.settingEntry) return;
  70833. this.settingEntry = false;
  70834. this.markView.backToPanorama();
  70835. } //-----------------------
  70836. }, {
  70837. key: "beginSetExit",
  70838. value: function beginSetExit() {
  70839. var _this6 = this;
  70840. //开始设置跳出点位置
  70841. console.log('beginSetExit');
  70842. var deferred = new Deferred$1();
  70843. this.settingExit = true;
  70844. this.enterView(function () {
  70845. deferred.resolve();
  70846. player$9.flyToPano({
  70847. pano: player$9.currentPano,
  70848. lookAtPoint: _this6.markView.exitDoor.mesh.position,
  70849. rotSpeed: 2
  70850. });
  70851. }); //this.tempExitPos = this.markView.exitDirection.clone();
  70852. return deferred.promise();
  70853. }
  70854. }, {
  70855. key: "confirmExit",
  70856. value: function confirmExit() {
  70857. //确定跳出点位置
  70858. this.markView.exitDirection = this.markView.exitDoor.mesh.position.clone();
  70859. this.dispatchEvent({
  70860. type: 'confirmExit',
  70861. sid: this.markView.sid,
  70862. exitDirection: this.markView.exitDirection.toArray()
  70863. });
  70864. if (this.markView.linkType != 'pano') {
  70865. //清空
  70866. this.markView.thumbPanoTex && this.markView.thumbPanoTex.dispose();
  70867. this.markView.thumbPanoTex = null;
  70868. }
  70869. this.cancelSetExit(true);
  70870. }
  70871. }, {
  70872. key: "cancelSetExit",
  70873. value: function cancelSetExit(makeit) {
  70874. //取消跳出点位置
  70875. if (!this.settingExit) return;
  70876. this.settingExit = false;
  70877. makeit || this.markView.exitDoor.mesh.position.copy(this.markView.exitDirection);
  70878. this.markView.backToPanorama();
  70879. } //-----------------------
  70880. }, {
  70881. key: "beginSetVisibleViews",
  70882. value: function beginSetVisibleViews(sid) {
  70883. //开始设置可见的view
  70884. this.markView = player$9.viewLinkManager.views[sid];
  70885. enterView(function () {});
  70886. this.settingVisibles = true;
  70887. this.oldVisibleData = JSON.parse(JSON.stringify(this.markView.visibleViews));
  70888. }
  70889. }, {
  70890. key: "addVisibleView",
  70891. value: function addVisibleView(sid, event) {
  70892. console.log('addVisibleView ' + sid);
  70893. var view = player$9.viewLinkManager.views[sid]; //this.markView.visibleViews[sid] = {}
  70894. view.circle.mesh.visible = true;
  70895. player$9.handleInputStart(event.offsetX, event.offsetY, true, true); //更新mouse
  70896. var intersect = player$9.getMouseIntersect(null, [player$9.model.skybox]);
  70897. view.circle.updatePos('at360View', {
  70898. viewDir: intersect.point.clone()
  70899. }); // sub(center)
  70900. view.circle.update(player$9.camera); //player.mouseDown = false; //移动端这个不会归零 所以手动
  70901. //view.circle.updatePos("at360View",{viewDir: view.circle.position.clone().sub(this.markView.circle.position)})
  70902. //player.lookAtPos(view.circle.mesh.position, null, {speed:0.2})
  70903. this.saveVisibleViews();
  70904. }
  70905. }, {
  70906. key: "delVisibleView",
  70907. value: function delVisibleView(sid) {
  70908. delete this.markView.visibleViews[sid];
  70909. var view = player$9.viewLinkManager.views[sid];
  70910. view.circle.mesh.visible = false;
  70911. this.saveVisibleViews();
  70912. }
  70913. }, {
  70914. key: "saveVisibleViews",
  70915. value: function saveVisibleViews() {
  70916. var data = {};
  70917. for (var i in player$9.viewLinkManager.views) {
  70918. if (player$9.viewLinkManager.views[i].circle.mesh.visible) {
  70919. data[i] = player$9.viewLinkManager.views[i].circle.mesh.position.toArray();
  70920. }
  70921. }
  70922. this.markView.visibleViews = data; //this.finishVisibleViews()//???
  70923. }
  70924. }, {
  70925. key: "cancelVisibleViews",
  70926. value: function cancelVisibleViews(sid) {
  70927. //取消
  70928. this.markView.visibleViews = this.oldVisibleData;
  70929. this.markView.backToPanorama(); //直接退出全景
  70930. bus.emit('link/tag/links', {
  70931. sid: this.markView.sid,
  70932. visibleViews: this.markView.visibleViews
  70933. });
  70934. this.finishVisibleViews();
  70935. }
  70936. }, {
  70937. key: "finishVisibleViews",
  70938. value: function finishVisibleViews() {
  70939. this.settingVisibles = false;
  70940. this.markView = null;
  70941. } //----------事件--------
  70942. }, {
  70943. key: "handelClickView",
  70944. value: function handelClickView() {
  70945. if (this.settingPos) {
  70946. this.confirmPos();
  70947. return true;
  70948. }
  70949. }
  70950. }, {
  70951. key: "dragBalloonStart",
  70952. value: function dragBalloonStart() {
  70953. if (this.settingPos) return;
  70954. this.beginSetPos('reset'); //console.log("draggingBall")
  70955. this.draggingBall = true;
  70956. player$9.cameraControls.activeControl.enabled = false;
  70957. }
  70958. }, {
  70959. key: "dragExitStart",
  70960. value: function dragExitStart() {
  70961. //拖动Exit
  70962. if (!this.settingExit) return;
  70963. this.draggingExit = true;
  70964. player$9.cameraControls.activeControl.enabled = false;
  70965. }
  70966. }, {
  70967. key: "dragViewStart",
  70968. value: function dragViewStart(mesh) {
  70969. //拖动
  70970. //if(!this.settingVisibles)return;
  70971. if (this.settingVisibles || this.markView && mesh == this.markView.circle.mesh) {
  70972. this.draggingCircleAtView = true;
  70973. this.draggingMesh = mesh;
  70974. player$9.cameraControls.activeControl.enabled = false;
  70975. }
  70976. }
  70977. }, {
  70978. key: "handelDragEnd",
  70979. value: function handelDragEnd() {
  70980. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  70981. if (player$9.flying) return;
  70982. if (!this.draggingBall && !this.draggingExit && !this.draggingCircleAtView) return; // zeg 做个限制,防止设置activeControl影响到其它模块
  70983. if (this.draggingBall) {
  70984. this.draggingBall = false; //handelClickView()
  70985. if (this.settingPos) {
  70986. e.cancel || this.confirmPos();
  70987. }
  70988. e.consume && e.consume();
  70989. } else if (this.draggingExit) {
  70990. this.draggingExit = false;
  70991. player$9.cameraControls.activeControl.pointerDragOn = false;
  70992. e.consume && e.consume();
  70993. } else if (this.draggingCircleAtView) {
  70994. this.draggingCircleAtView = false;
  70995. player$9.cameraControls.activeControl.pointerDragOn = false;
  70996. e.cancel || this.confirmPos();
  70997. e.consume && e.consume();
  70998. }
  70999. this.draggingMesh = null; //console.log("handelDragEnd")
  71000. player$9.cameraControls.activeControl.enabled = true;
  71001. }
  71002. }, {
  71003. key: "getData",
  71004. value: function getData(type) {
  71005. return {
  71006. sid: this.markView.sid,
  71007. title: this.markView.titleLabel.text,
  71008. balloon: {
  71009. pos: this.markView.balloon.mesh.position.clone()
  71010. },
  71011. circle: {
  71012. pos: this.markView.circle.position.clone(),
  71013. qua: this.markView.circle.quaternion.clone(),
  71014. mapOut: this.markView.circle.mesh.material.uniforms.mapOut.value,
  71015. scale: this.markView.circle.mesh.scale.x
  71016. },
  71017. exit: {
  71018. mapOut: this.markView.exitDoor.mesh.material.uniforms.mapOut.value
  71019. },
  71020. exitDirection: this.markView.exitDirection.clone(),
  71021. enterQuaternion: this.markView.enterQuaternion.clone(),
  71022. //quaternion : this.markView.quaternion,
  71023. panoImgVersion: this.markView.panoImgVersion,
  71024. url: this.markView.url,
  71025. thumbPanoTex: this.markView.thumbPanoTex,
  71026. linkType: this.markView.linkType,
  71027. nearestPano: this.markView.nearestPano
  71028. };
  71029. }
  71030. }, {
  71031. key: "showAll",
  71032. value: function showAll() {
  71033. var _this7 = this;
  71034. if (!this.inited) {
  71035. setTimeout(function () {
  71036. _this7.showAll();
  71037. }, 200);
  71038. return;
  71039. }
  71040. player$9.viewLinkManager.showAllViews();
  71041. }
  71042. }, {
  71043. key: "hideAll",
  71044. value: function hideAll() {
  71045. var _this8 = this;
  71046. if (!this.inited) {
  71047. setTimeout(function () {
  71048. _this8.hideAll();
  71049. }, 200);
  71050. return;
  71051. }
  71052. player$9.viewLinkManager.hideAllViews();
  71053. }
  71054. }, {
  71055. key: "highlight",
  71056. value: function highlight(sid) {
  71057. var views = player$9.viewLinkManager.views;
  71058. var view = views[sid];
  71059. if (this.markView && !view) return; //持续高亮,不允许修改
  71060. if (view) view.setSelect(true);else {
  71061. for (var i in views) {
  71062. views[i].setSelect(false);
  71063. }
  71064. }
  71065. }
  71066. }]);
  71067. return ViewLinkEdit;
  71068. }(THREE.EventDispatcher);
  71069. 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); }; }
  71070. 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; } }
  71071. var FilterManager = /*#__PURE__*/function (_Emiter) {
  71072. _inherits(FilterManager, _Emiter);
  71073. var _super = _createSuper$r(FilterManager);
  71074. function FilterManager(app) {
  71075. var _this;
  71076. _classCallCheck(this, FilterManager);
  71077. _this = _super.call(this);
  71078. _this.app = app;
  71079. _this.edit = {};
  71080. var player;
  71081. var deferred = Deferred$1();
  71082. _this.filterTemp = {}; // 用于暂存多个点位的调节数据
  71083. _this.app.Scene.on('loaded', function () {
  71084. player = _this.app.core.get('Player');
  71085. player.on(PlayerEvents.PanoChosen, function (pano0, pano1) {
  71086. // 点位跳转时,传给UI调节数据
  71087. _this.emit('FilterManager.updateCurrentFilter', JSON.parse(JSON.stringify(_this.filterTemp[pano1.id] || pano1.filterEffect)));
  71088. });
  71089. deferred.resolve();
  71090. });
  71091. _this.edit.enter = function () {
  71092. if (player) {
  71093. // 初始化时,传给UI调节数据
  71094. _this.emit('FilterManager.updateCurrentFilter', JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  71095. } else {
  71096. deferred.then(function () {
  71097. return _this.edit.enter();
  71098. });
  71099. }
  71100. }; // 开始设置调节
  71101. _this.edit.startFilter = function () {
  71102. // 调节仅限于panorama模式下修改
  71103. player.flyToNewMode({
  71104. mode: 'panorama',
  71105. pano: player.currentPano
  71106. });
  71107. }; // 亮度 [-1 ~ 1]
  71108. _this.edit.brightness = function (num) {
  71109. _this.getPanoMaterials().forEach(function (material) {
  71110. material.uniforms['filterBase0'].value.setX(num);
  71111. material.uniforms['filterBase1'].value.setX(num);
  71112. material.defines['hasFilter'] = true; // 必须设置hasFilter,否则调节相关shader将失效
  71113. material.needsUpdate = true;
  71114. });
  71115. _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  71116. _this.filterTemp[player.currentPano.id].brightness = num;
  71117. }; // 对比度 [-1 ~ 1]
  71118. _this.edit.contrast = function (num) {
  71119. _this.getPanoMaterials().forEach(function (material) {
  71120. material.uniforms['filterBase0'].value.setY(num);
  71121. material.uniforms['filterBase1'].value.setY(num);
  71122. material.defines['hasFilter'] = true;
  71123. material.needsUpdate = true;
  71124. });
  71125. _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  71126. _this.filterTemp[player.currentPano.id].contrast = num;
  71127. }; // 饱和度 [-1 ~ 1]
  71128. _this.edit.saturation = function (num) {
  71129. _this.getPanoMaterials().forEach(function (material) {
  71130. material.uniforms['filterBase0'].value.setZ(num);
  71131. material.uniforms['filterBase1'].value.setZ(num);
  71132. material.defines['hasFilter'] = true;
  71133. material.needsUpdate = true;
  71134. });
  71135. _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  71136. _this.filterTemp[player.currentPano.id].saturation = num;
  71137. }; // 色温 [-1 ~ 1]
  71138. _this.edit.temperature = function (num) {
  71139. _this.getPanoMaterials().forEach(function (material) {
  71140. material.uniforms['filterTemperature0'].value = num;
  71141. material.uniforms['filterTemperature1'].value = num;
  71142. material.defines['hasFilter'] = true;
  71143. material.needsUpdate = true;
  71144. });
  71145. _this.filterTemp[player.currentPano.id] || (_this.filterTemp[player.currentPano.id] = JSON.parse(JSON.stringify(player.currentPano.filterEffect)));
  71146. _this.filterTemp[player.currentPano.id].temperature = num;
  71147. }; // 清除当前调节效果
  71148. _this.edit.clearCurrent = function () {
  71149. _this.edit.brightness(0);
  71150. _this.edit.contrast(0);
  71151. _this.edit.saturation(0);
  71152. _this.edit.temperature(0);
  71153. }; // 应用当前调节效果至所有点位
  71154. _this.edit.applyCurrent2All = function () {
  71155. var currentFilterEffect = _this.filterTemp[player.currentPano.id] || player.currentPano.filterEffect;
  71156. player.model.panos.list.forEach(function (pano) {
  71157. if (pano.panoType) return;
  71158. _this.filterTemp[pano.id] = JSON.parse(JSON.stringify(currentFilterEffect));
  71159. });
  71160. }; // 保存调解数据
  71161. _this.edit.save = function () {
  71162. var saveInfo = [];
  71163. player.model.panos.list.forEach(function (pano) {
  71164. // 当temp有数据的话,保存temp里的数据
  71165. if (_this.filterTemp[pano.id]) {
  71166. saveInfo.push(Object.assign({
  71167. id: pano.id
  71168. }, _this.filterTemp[pano.id]));
  71169. } // 当temp没有数据的话,保存原有的值
  71170. else if (pano.filterEffect.brightness != 0 || pano.filterEffect.contrast != 0 || pano.filterEffect.saturation != 0 || pano.filterEffect.temperature != 0) {
  71171. saveInfo.push(Object.assign({
  71172. id: pano.id
  71173. }, pano.filterEffect));
  71174. }
  71175. });
  71176. var self = _assertThisInitialized(_this);
  71177. return {
  71178. data: saveInfo,
  71179. successCallBack: function successCallBack() {
  71180. Object.keys(self.filterTemp).forEach(function (panoId) {
  71181. // 将temp里的数据保存在pano.filterEffect里面
  71182. player.model.panos.index[panoId].filterEffect = self.filterTemp[panoId];
  71183. });
  71184. _this.getPanoMaterials().forEach(function (material) {
  71185. // 更新hasFilter
  71186. player.currentPano.hasFilter ? material.defines['hasFilter'] = true : delete material.defines['hasFilter'];
  71187. material.needsUpdate = true;
  71188. });
  71189. self.filterTemp = {};
  71190. }
  71191. };
  71192. }; // 撤销已有修改
  71193. _this.edit.undoEdit = function () {
  71194. _this.filterTemp = {};
  71195. var filterEffect = player.currentPano.filterEffect;
  71196. _this.getPanoMaterials().forEach(function (material) {
  71197. material.uniforms['filterBase0'].value.set(filterEffect.brightness, filterEffect.contrast, filterEffect.saturation);
  71198. material.uniforms['filterBase1'].value.set(filterEffect.brightness, filterEffect.contrast, filterEffect.saturation);
  71199. material.uniforms['filterTemperature0'].value = filterEffect.temperature;
  71200. material.uniforms['filterTemperature1'].value = filterEffect.temperature; // 更新hasFilter
  71201. player.currentPano.hasFilter ? material.defines['hasFilter'] = true : delete material.defines['hasFilter'];
  71202. material.needsUpdate = true;
  71203. }); // 撤销时,传给UI调节数据
  71204. _this.emit('FilterManager.updateCurrentFilter', JSON.parse(JSON.stringify(filterEffect)));
  71205. };
  71206. return _this;
  71207. }
  71208. _createClass(FilterManager, [{
  71209. key: "initFilters",
  71210. value: function initFilters() {
  71211. var _this2 = this;
  71212. // 初始数据
  71213. var initData = function initData(filterList) {
  71214. filterList.forEach(function (data) {
  71215. var panoId = data.id;
  71216. var pano = _this2.app.core.get('Player').model.panos.index[panoId];
  71217. if (pano) {
  71218. // 判断一下pano是否仍然存在
  71219. delete data.id;
  71220. pano.filterEffect = data;
  71221. }
  71222. });
  71223. };
  71224. var filterList = this.app.store.getValue('filters');
  71225. if (filterList) initData(filterList);else this.app.store.on('filters', function (data) {
  71226. initData(data);
  71227. var player = _this2.app.core.get('Player');
  71228. _this2.updatePanoFilters(player.currentPano, player.currentPano);
  71229. });
  71230. } // 根据pano更新调节效果
  71231. }, {
  71232. key: "updatePanoFilters",
  71233. value: function updatePanoFilters(pano0, pano1) {
  71234. var filterEffect0 = this.filterTemp[pano0.id] || pano0.filterEffect;
  71235. var filterEffect1 = this.filterTemp[pano1.id] || pano1.filterEffect;
  71236. this.getPanoMaterials().forEach(function (material) {
  71237. material.uniforms['filterBase0'].value.set(filterEffect0.brightness, filterEffect0.contrast, filterEffect0.saturation);
  71238. material.uniforms['filterTemperature0'].value = filterEffect0.temperature;
  71239. material.uniforms['filterBase1'].value.set(filterEffect1.brightness, filterEffect1.contrast, filterEffect1.saturation);
  71240. material.uniforms['filterTemperature1'].value = filterEffect1.temperature; // 更新hasFilter 考虑到过渡效果,pano1和pano0都要判断
  71241. pano0.hasFilter || pano1.hasFilter ? material.defines['hasFilter'] = true : delete material.defines['hasFilter'];
  71242. material.needsUpdate = true;
  71243. });
  71244. } // 获得与全景贴图有关的所有material
  71245. }, {
  71246. key: "getPanoMaterials",
  71247. value: function getPanoMaterials() {
  71248. var player = this.app.core.get('Player');
  71249. var mats = [this.app.core.get('QuickstartManager').skybox.material].concat(_toConsumableArray(player.model.chunks.map(function (chunk) {
  71250. return chunk.materialInside;
  71251. })));
  71252. player.model.skybox && mats.push(player.model.skybox.material);
  71253. player.model.highMapCube && mats.push.apply(mats, _toConsumableArray(player.model.highMapCube.tiles.map(function (e) {
  71254. return e.material;
  71255. })));
  71256. return mats;
  71257. }
  71258. }]);
  71259. return FilterManager;
  71260. }(tinyEmitter);
  71261. 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); }; }
  71262. 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; } }
  71263. var ConvertViews = /*#__PURE__*/function (_Emiter) {
  71264. _inherits(ConvertViews, _Emiter);
  71265. var _super = _createSuper$q(ConvertViews);
  71266. function ConvertViews() {
  71267. var _this;
  71268. _classCallCheck(this, ConvertViews);
  71269. _this = _super.call(this);
  71270. _this.sourceApp = null;
  71271. _this.targetApp = null;
  71272. _this.player1 = null;
  71273. _this.player2 = null;
  71274. return _this;
  71275. }
  71276. _createClass(ConvertViews, [{
  71277. key: "bind",
  71278. value: function bind() {
  71279. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
  71280. sourceApp: null,
  71281. targetApp: null
  71282. };
  71283. if (options.sourceApp) {
  71284. this.sourceApp = options.sourceApp;
  71285. this.player1 = this.sourceApp.core.get('Player'); //this.player1.model.addEventListener('gotPanos', this.init.bind(this))
  71286. } else if (options.targetApp) {
  71287. this.targetApp = options.targetApp;
  71288. this.player2 = this.targetApp.core.get('Player'); //this.player2.model.addEventListener('gotPanos', this.init.bind(this))
  71289. }
  71290. if (this.sourceApp && this.targetApp) {
  71291. // 两个实例都加载完了,可以进行特性处理
  71292. this.init();
  71293. }
  71294. }
  71295. }, {
  71296. key: "init",
  71297. value: function init() {
  71298. if (!this.player1.model.panos.list.length || !this.player2.model.panos.list.length) return;
  71299. this.diffLon = this.computeAveDiffLon();
  71300. this.diffQuaternion = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), this.diffLon);
  71301. this.diffQuaternionInvert = this.diffQuaternion.clone().invert();
  71302. }
  71303. }, {
  71304. key: "computeAveDiffLon",
  71305. value: function computeAveDiffLon() {
  71306. var _this2 = this;
  71307. //获取两个场景的lon偏差值
  71308. //需要点的个数>1, 且两个场景点一一对应,位置接近且顺序一致
  71309. var diffLonAve = 0,
  71310. diffLons = [];
  71311. /* let panoPos1 = this.player1.model.panos.list.map(e => e.position)
  71312. let panoPos2 = this.player2.model.panos.list.map(e => e.position)
  71313. let length = panoPos1.length */
  71314. var keys = Object.keys(this.panoMapping.mapping);
  71315. var panoPos1 = keys.map(function (id) {
  71316. var pano = _this2.player1.model.panos.index[id];
  71317. return pano.position;
  71318. });
  71319. var panoPos2 = keys.map(function (id) {
  71320. var matchId = _this2.panoMapping.mapping[id];
  71321. var pano = _this2.player2.model.panos.index[matchId];
  71322. return pano.position;
  71323. });
  71324. var length = keys.length; //挑选连续的两个点为向量来计算,如有123个漫游点,则选取12 23 31作为向量
  71325. var index = 0;
  71326. while (index < length) {
  71327. var pos11 = new THREE.Vector3().copy([index]);
  71328. var pos12 = new THREE.Vector3().copy(panoPos1[(index + 1) % length]);
  71329. var pos21 = new THREE.Vector3().copy(panoPos2[index]);
  71330. var pos22 = new THREE.Vector3().copy(panoPos2[(index + 1) % length]);
  71331. var vec1 = new THREE.Vector3().subVectors(pos11, pos12).setY(0);
  71332. var vec2 = new THREE.Vector3().subVectors(pos21, pos22).setY(0);
  71333. var diffLon = math$2.getAngle(vec1, vec2, 'z');
  71334. diffLons.push(diffLon);
  71335. diffLonAve += diffLon;
  71336. index++;
  71337. }
  71338. console.log('diffLons', diffLons);
  71339. diffLonAve /= length;
  71340. console.log('diffLonAve', diffLonAve);
  71341. return (
  71342. /* THREE.MathUtils.radToDeg( */
  71343. diffLonAve
  71344. );
  71345. /* ) */
  71346. }
  71347. }, {
  71348. key: "applyDiff",
  71349. value: function applyDiff(app) {
  71350. //sourcePlayer -> targetPlayer
  71351. if (!this.player1 || !this.player2 || this.targetApp.config.num == this.sourceApp.config.num) return; //场景码相同的话返回
  71352. if (this.player1.mode != this.player2.mode) return;
  71353. var player1, player2, quaternion; //player1为要改变的, player2是参照
  71354. if (app == this.sourceApp) {
  71355. player1 = this.player1;
  71356. player2 = this.player2;
  71357. quaternion = this.diffQuaternion;
  71358. } else {
  71359. player1 = this.player2;
  71360. player2 = this.player1;
  71361. quaternion = this.diffQuaternionInvert;
  71362. }
  71363. var control1 = player1.cameraControls.activeControl;
  71364. var control2 = player2.cameraControls.activeControl; //if(!control1 || !control2)return
  71365. player1.quaternion.copy(player2.quaternion).premultiply(quaternion);
  71366. if (player1.mode == 'panorama') {
  71367. //平移
  71368. var dir = new THREE.Vector3().subVectors(control2.target, player2.position);
  71369. dir.applyQuaternion(quaternion);
  71370. var target1 = new THREE.Vector3().addVectors(player1.position, dir);
  71371. control1.lookAt(target1);
  71372. control1.target.copy(target1);
  71373. } else if (control2) {
  71374. //修改target,保证target在panos之间的相对位置一样
  71375. //console.log('target', control2.target.clone())
  71376. //console.log('position', control2.target.clone())
  71377. var vec = new THREE.Vector3().subVectors(control2.target,
  71378. /* this.getPanoPos(2, 0) */
  71379. player2.model.panos.list[0].position);
  71380. vec.applyQuaternion(quaternion);
  71381. control1.target.addVectors(
  71382. /* this.getPanoPos(1, 0) */
  71383. player1.model.panos.list[0].position, vec);
  71384. player1.target.copy(control1.target); //修改position,保证方向一样
  71385. var _dir = new THREE.Vector3().subVectors(control2.camera.position, control2.target);
  71386. _dir.applyQuaternion(quaternion);
  71387. player1.position = new THREE.Vector3().addVectors(control1.target, _dir);
  71388. control1.camera.position.copy(player1.position);
  71389. }
  71390. control1.camera.quaternion.copy(player1.quaternion);
  71391. }
  71392. /* applyDiff(app) {
  71393. //sourcePlayer -> targetPlayer
  71394. let player1, player2, quaternion
  71395. if (app == this.targetApp) {
  71396. player1 = this.player1
  71397. player2 = this.player2
  71398. quaternion = this.diffQuaternion
  71399. } else {
  71400. player1 = this.player2
  71401. player2 = this.player1
  71402. quaternion = this.diffQuaternionInvert
  71403. }
  71404. this.player1.quaternion.premultiply(quaternion)
  71405. let control = player1.cameraControls.activeControl
  71406. if (player1.mode == 'panorama') {
  71407. //平移
  71408. let dir = new THREE.Vector3().subVectors(control.target, player1.position)
  71409. dir.applyQuaternion(quaternion)
  71410. let target = new THREE.Vector3().addVectors(player1.position, dir)
  71411. control.lookAt(target)
  71412. } else if (control) {
  71413. let dir = new THREE.Vector3().subVectors(player1.position, control.target)
  71414. dir.applyQuaternion(quaternion)
  71415. player1.position = new THREE.Vector3().addVectors(control.target, dir)
  71416. }
  71417. //先不管飞出后的位置平移
  71418. //位置参照第一个漫游点。保持相机相对第一个漫游点的位移和
  71419. } */
  71420. }]);
  71421. return ConvertViews;
  71422. }(tinyEmitter);
  71423. 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); }; }
  71424. 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; } }
  71425. var player$8;
  71426. var lastIntersect;
  71427. var BillboardManager = /*#__PURE__*/function (_EventEmitter) {
  71428. _inherits(BillboardManager, _EventEmitter);
  71429. var _super = _createSuper$p(BillboardManager);
  71430. function BillboardManager(ctx) {
  71431. var _this;
  71432. _classCallCheck(this, BillboardManager);
  71433. _this = _super.call(this);
  71434. _this.ctx = ctx;
  71435. _this.app = ctx.app;
  71436. _this.player = null;
  71437. _this.events = {
  71438. movePos: function movePos(_ref) {
  71439. var reCompute = _ref.reCompute;
  71440. if (reCompute) {
  71441. //重新再算一遍,为了获取当前朝向的镜头
  71442. var intersect = lastIntersect;
  71443. } else {
  71444. if (!_this.dragging) return;
  71445. var intersect = player$8.getMouseIntersect(null, player$8.getColliders({
  71446. noSkybox: true,
  71447. checkChunk: true
  71448. }));
  71449. if (!intersect) {
  71450. return;
  71451. }
  71452. }
  71453. var _this$getPoseByInters = _this.getPoseByIntersect(intersect),
  71454. position = _this$getPoseByInters.position,
  71455. quaternion = _this$getPoseByInters.quaternion,
  71456. faceAngle2 = _this$getPoseByInters.faceAngle2,
  71457. subgroup = _this$getPoseByInters.subgroup;
  71458. _this.editPlane.position.copy(position);
  71459. _this.editPlane.quaternion.copy(quaternion);
  71460. _this.editPlane.faceAngle2 = faceAngle2; //this.editPlane.setRotation(/* quaternion, */this.editPlane.rotAngle)
  71461. _this.editPlane.getIsLieDown() && _this.editPlane.updateLabelPose(); //console.log('movePos', position, quaternion )
  71462. _this.editPlane.homePanoId = player$8.currentPano.id;
  71463. _this.editPlane.subgroup = subgroup;
  71464. /* reCompute || */
  71465. _this.emit('dragPos', {
  71466. panoId: player$8.currentPano.id
  71467. });
  71468. },
  71469. confirmPos: function confirmPos(e) {
  71470. e.consume();
  71471. _this.confirmPos();
  71472. },
  71473. dragStart: function dragStart(e) {
  71474. if (_this.editPlane && player$8.OverlayManager.hoveringPlane == _this.editPlane) {
  71475. player$8.cameraControls.activeControl.enabled = false;
  71476. player$8.cameraControls.activeControl.pointerDragOn = false;
  71477. _this.dragging = true;
  71478. e.consume(); //console.log('dragStart')
  71479. }
  71480. },
  71481. dragEnd: function dragEnd(e) {
  71482. if (!_this.dragging) return;
  71483. _this.dragging = false;
  71484. e.consume();
  71485. player$8.cameraControls.activeControl.enabled = true; //console.log('dragEnd')
  71486. }
  71487. };
  71488. return _this;
  71489. }
  71490. _createClass(BillboardManager, [{
  71491. key: "waitReady",
  71492. value: function waitReady(fuc) {
  71493. if (player$8) {
  71494. fuc();
  71495. } else {
  71496. this.once('ready', fuc);
  71497. }
  71498. }
  71499. }, {
  71500. key: "enter",
  71501. value: function enter(fun) {
  71502. var _this2 = this;
  71503. if (this.entered) return;
  71504. this.entered = true;
  71505. this.waitReady(function () {
  71506. fun && fun();
  71507. if (!_this2.entered) return;
  71508. player$8.$app.TagManager.switchAllDisplay(false, 'editBillboards', {
  71509. billboards: true
  71510. });
  71511. player$8.on('pointerStart', _this2.events.dragStart);
  71512. player$8.on('pointerMove', _this2.events.movePos);
  71513. player$8.on('pointerUp', _this2.events.dragEnd);
  71514. });
  71515. }
  71516. }, {
  71517. key: "leave",
  71518. value: function leave() {
  71519. //console.log('leave')
  71520. this.endAddPlane();
  71521. this.undoEdit();
  71522. this.editPlane && (this.editPlane.isEditing = false, player$8.OverlayManager.highlight(null));
  71523. this.editPlane = null;
  71524. this.entered = false;
  71525. player$8.$app.TagManager.switchAllDisplay(true, 'editBillboards', {
  71526. billboards: true
  71527. });
  71528. player$8.off('pointerStart', this.events.dragStart);
  71529. player$8.off('pointerUp', this.events.dragEnd);
  71530. player$8.off('pointerMove', this.events.movePos);
  71531. }
  71532. }, {
  71533. key: "reEdit",
  71534. value: function reEdit(sid) {
  71535. var _this3 = this;
  71536. this.enter(function () {
  71537. var bill = _this3.ctx.get(sid);
  71538. _this3.updateEditPlane(bill);
  71539. player$8.OverlayManager.clickOverlay(bill, {
  71540. dontEmit: true,
  71541. forceFlyToPlane: true
  71542. }); //自动点击
  71543. player$8.modelSideManager.tempAuto();
  71544. });
  71545. }
  71546. }, {
  71547. key: "undoEdit",
  71548. value: function undoEdit() {
  71549. // 恢复
  71550. if (!this.editPlane) return;
  71551. var bill = this.editPlane;
  71552. if (bill.info.modified == 'new') {
  71553. // 未保存过的video直接删除
  71554. this.dispose(bill.sid);
  71555. } else {
  71556. bill.setFromInfo(bill.info);
  71557. }
  71558. player$8.modelSideManager.recover();
  71559. }
  71560. }, {
  71561. key: "save",
  71562. value: function save() {
  71563. var _this4 = this;
  71564. console.log('save');
  71565. var bill = this.editPlane;
  71566. return {
  71567. done: function done() {
  71568. bill.info.modified = 'old';
  71569. bill.info.width = bill.width;
  71570. bill.info.height = bill.height;
  71571. bill.info.pos = bill.position.clone();
  71572. bill.info.qua = bill.quaternion.clone(); //baseQuaternion.clone()
  71573. bill.info.faceAngle = bill.faceAngle;
  71574. bill.info.scaleRatio = bill.scaleRatio;
  71575. bill.info.title = bill.titleLabel.text;
  71576. bill.info.media = bill.plane.material.map.image;
  71577. bill.info.targetPano = bill.targetPano;
  71578. bill.info.icon = bill.getMapName();
  71579. bill.info.panoId = bill.homePanoId;
  71580. bill.info.subgroup = bill.subgroup; //--暂时同overlay一样 在hidden的楼层要隐藏----
  71581. bill.raycastToFindFloor();
  71582. bill.updateVisibleOnFloor(); //------------------------------ ---- ----
  71583. _this4.leave();
  71584. },
  71585. info: {
  71586. width: math$2.toPrecision(bill.width, 4),
  71587. height: math$2.toPrecision(bill.height, 4),
  71588. pos: math$2.toPrecision(bill.position.toArray(), 4),
  71589. qua: math$2.toPrecision(bill.quaternion.toArray()
  71590. /* bill.baseQuaternion.toArray() */
  71591. , 4),
  71592. subgroup: bill.subgroup == void 0 ? null : bill.subgroup //楼层
  71593. }
  71594. };
  71595. }
  71596. /**
  71597. * 添加指示牌
  71598. * @param {*} billboardItem
  71599. * @returns
  71600. */
  71601. }, {
  71602. key: "add",
  71603. value: function add(billboardItem) {
  71604. if (!billboardItem || !billboardItem.sid) {
  71605. return;
  71606. }
  71607. this.ctx.list.push(billboardItem);
  71608. common$1.updateVisible(billboardItem.titleLabel, 'onShow', !!this.showTitles);
  71609. }
  71610. /**
  71611. * 清除所有
  71612. */
  71613. }, {
  71614. key: "clear",
  71615. value: function clear() {
  71616. this.ctx.list = [];
  71617. }
  71618. /**
  71619. * 删除
  71620. * @param {*} sid
  71621. */
  71622. }, {
  71623. key: "dispose",
  71624. value: function dispose(sid) {
  71625. var plane = this.ctx.get(sid);
  71626. if (plane) {
  71627. plane.titleLabel.dispose();
  71628. plane.dispose();
  71629. var index = this.ctx.list.indexOf(plane);
  71630. this.ctx.list.splice(index, 1);
  71631. }
  71632. }
  71633. /**
  71634. * ui控制整体titles是否显示
  71635. * @param {*} state
  71636. */
  71637. }, {
  71638. key: "changeTitlesShow",
  71639. value: function changeTitlesShow(state) {
  71640. this.showTitles = !!state;
  71641. this.ctx.list.forEach(function (e) {
  71642. common$1.updateVisible(e.titleLabel, 'onShow', state);
  71643. });
  71644. }
  71645. }, {
  71646. key: "highlight",
  71647. value: function highlight(sid) {
  71648. var bill = this.ctx.get(sid);
  71649. player$8.OverlayManager.highlight(bill);
  71650. }
  71651. }, {
  71652. key: "beginToAddPlane",
  71653. value: function beginToAddPlane() {
  71654. var _this5 = this;
  71655. //开始添加
  71656. this.enter(function () {
  71657. player$8.viewLinkManager.exitView();
  71658. player$8.reticule.visible = false;
  71659. _this5.isAdding = true;
  71660. player$8.modelSideManager.tempAuto();
  71661. CursorDeal.add('addOverlay');
  71662. });
  71663. }
  71664. }, {
  71665. key: "endAddPlane",
  71666. value: function endAddPlane() {
  71667. //结束添加状态
  71668. this.isAdding = false; //this.player.domElement.style.cursor = ''
  71669. CursorDeal.remove('addOverlay');
  71670. player$8.reticule.visible = true;
  71671. }
  71672. }, {
  71673. key: "updateEditPlane",
  71674. value: function updateEditPlane(editPlane) {
  71675. this.editPlane = editPlane;
  71676. editPlane.isEditing = true;
  71677. player$8.OverlayManager.highlight(editPlane);
  71678. }
  71679. }, {
  71680. key: "getPoseByIntersect",
  71681. value: function getPoseByIntersect(intersect) {
  71682. var normal = intersect.face.normal.clone();
  71683. if (player$8.getMouseDirection().angleTo(intersect.face.normal) < Math.PI / 2) {
  71684. normal.negate();
  71685. } //console.log('normal',normal)
  71686. var quaternion = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().lookAt(normal, Vectors$1.ZERO, Vectors$1.UP));
  71687. var position = intersect.point.clone().add(normal.multiplyScalar(0.02)); //在墙上刚好是上下方向,但在地面却会各种朝向
  71688. var faceAngle2;
  71689. if (isLieDown(quaternion)) {
  71690. //在地面上时调整方向,使固定朝向镜头前方或某个方向。否则会因为法线不规则而朝向不固定
  71691. var normalDir = intersect.face.normal.clone().setY(0);
  71692. var camDir = new THREE.Vector3().subVectors(position, player$8.position).setY(0).normalize(); //箭头对准相机 //player.getDirection().setY(0)
  71693. if (normalDir.x == 0 && normalDir.z == 0) {
  71694. //若为0,0,0,改为默认的方向
  71695. normalDir.z = 1;
  71696. }
  71697. faceAngle2 = math$2.getAngle(normalDir, camDir, 'y') - Math.PI / 2;
  71698. var faceRot = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), faceAngle2); //console.log('faceAngle2', faceAngle2, normal, faceRot /* , camDir */)
  71699. quaternion.multiply(faceRot); //右乘子级,子级是自身,绕着面片的中心轴z轴转
  71700. }
  71701. var subgroup = intersect.object.parent.floor.floorIndex;
  71702. return {
  71703. position,
  71704. quaternion,
  71705. faceAngle2,
  71706. subgroup
  71707. };
  71708. }
  71709. }, {
  71710. key: "startInsertion",
  71711. value: function startInsertion(_ref2) {
  71712. var _this6 = this;
  71713. var intersect = _ref2.intersect;
  71714. //调整旋转值,使贴合墙壁,且不重叠。
  71715. var _this$getPoseByInters2 = this.getPoseByIntersect(intersect),
  71716. position = _this$getPoseByInters2.position,
  71717. quaternion = _this$getPoseByInters2.quaternion,
  71718. faceAngle2 = _this$getPoseByInters2.faceAngle2,
  71719. subgroup = _this$getPoseByInters2.subgroup; //添加
  71720. var bill = new BillboardItem(player$8, {
  71721. sid: common$1.getRandomSid(),
  71722. pos: position,
  71723. qua: quaternion,
  71724. modified: 'new',
  71725. subgroup
  71726. }); //bill.info.baseQuaternion = bill.quaternion.clone()
  71727. //bill.baseQuaternion = bill.quaternion.clone()
  71728. bill.faceAngle = 0;
  71729. bill.faceAngle2 = faceAngle2;
  71730. bill.updateMatrixWorld();
  71731. this.emit('createBill', {
  71732. sid: bill.sid,
  71733. panoId: player$8.currentPano.id
  71734. });
  71735. player$8.OverlayManager.clickOverlay(bill, {
  71736. dontEmit: true,
  71737. forceFlyToPlane: true,
  71738. afterFly: function afterFly(makeit) {
  71739. //重新调整下箭头角度 且保存pano
  71740. setTimeout(function () {
  71741. _this6.events.movePos({
  71742. reCompute: true
  71743. });
  71744. }, 1); //延迟是为了防止 afterFly立即执行
  71745. }
  71746. }); //bill.focus() //自动点击
  71747. lastIntersect = intersect;
  71748. this.updateEditPlane(bill);
  71749. this.add(bill);
  71750. this.endAddPlane(); //自动结束添加
  71751. } //假设默认大小为图片像素 / 100 ?
  71752. }, {
  71753. key: "setScale",
  71754. value: function setScale(s) {
  71755. //大小
  71756. //console.log('setScale', s)
  71757. this.editPlane.setScale(s);
  71758. }
  71759. }, {
  71760. key: "setRotation",
  71761. value: function setRotation(r) {
  71762. //console.log('setRotation', r)
  71763. this.editPlane.setRotation(
  71764. /* this.editPlane.baseQuaternion, */
  71765. r);
  71766. }
  71767. }, {
  71768. key: "setJumpPano",
  71769. value: function setJumpPano(id) {
  71770. console.log('setJumpPano', id);
  71771. this.editPlane.targetPano = id;
  71772. }
  71773. }, {
  71774. key: "setMap",
  71775. value: function setMap(src, sid) {
  71776. //console.log('setMap', src, sid)
  71777. var bill = sid ? this.ctx.get(sid) : this.editPlane;
  71778. bill.setMap(src);
  71779. if (!this.editPlane || this.editPlane != bill) {
  71780. //非编辑状态的话,直接保存到info里
  71781. bill.info.icon = bill.getMapName();
  71782. }
  71783. }
  71784. }, {
  71785. key: "setTitle",
  71786. value: function setTitle(title) {
  71787. this.editPlane.setTitle(title);
  71788. }
  71789. }, {
  71790. key: "cancel",
  71791. value: function cancel() {
  71792. //console.log('cancel')
  71793. this.leave();
  71794. }
  71795. }, {
  71796. key: "flyToBillBoard",
  71797. value: function flyToBillBoard(sid) {
  71798. var bill = sid ? this.ctx.get(sid) : this.editPlane;
  71799. player$8.OverlayManager.clickOverlay(bill, {
  71800. dontEmit: true,
  71801. forceFlyToPlane: true
  71802. });
  71803. }
  71804. }]);
  71805. return BillboardManager;
  71806. }(EventEmitter);
  71807. var mapNames = ['style-1', 'style-2', 'style-3']; //贴图默认名称
  71808. var BillboardItem = /*#__PURE__*/function (_Overlay) {
  71809. _inherits(BillboardItem, _Overlay);
  71810. var _super2 = _createSuper$p(BillboardItem);
  71811. function BillboardItem(player) {
  71812. var _this7;
  71813. var info = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  71814. _classCallCheck(this, BillboardItem);
  71815. //转化一下属性
  71816. info.media = ['photo']; //info.poster: "tCledf2544111.png"
  71817. info.isBillboard = true;
  71818. info.faceAngle = info.faceAngle || 0; //表面旋转度数 (0-360)。所以info.qua不是最终旋转值
  71819. info.scaleRatio = info.scaleRatio || 100;
  71820. _this7 = _super2.call(this, player, info);
  71821. _this7.plane.material.side = THREE.DoubleSide;
  71822. _this7.titleLabel = new TextSprite({
  71823. text: info.title,
  71824. backgroundColor: {
  71825. r: 255,
  71826. g: 255,
  71827. b: 255,
  71828. a: 0
  71829. },
  71830. textColor: {
  71831. r: 255,
  71832. g: 255,
  71833. b: 255,
  71834. a: 1
  71835. },
  71836. /* textBorderColor: { r: 150, g: 150, b: 150, a: 0.5 },
  71837. textBorderThick: 1, */
  71838. textshadowColor: '#888',
  71839. borderRadius: 2,
  71840. fontsize: 34,
  71841. renderOrder: RenderOrder.overlay - 1,
  71842. //为了不被别的billboard的透明区域覆盖
  71843. margin: {
  71844. x: 12,
  71845. y: 10
  71846. },
  71847. player,
  71848. fixOrient: true
  71849. });
  71850. _this7.titleLabel.sprite.material.depthTest = true; //需要和plane一起被遮挡
  71851. var s = 0.3;
  71852. _this7.titleLabel.scale.set(s, s, s);
  71853. _this7.add(_this7.titleLabel);
  71854. common$1.updateVisible(_assertThisInitialized(_this7), 'waitMapForResize', false);
  71855. _this7.addEventListener('mapLoaded', function () {
  71856. //console.log('img.onloaded')
  71857. var map = _this7.plane.material.map;
  71858. map.needsUpdate = true;
  71859. _this7.setScale();
  71860. common$1.updateVisible(_assertThisInitialized(_this7), 'waitMapForResize', true);
  71861. /* player.$app.core.get('SceneRenderer').once(SceneRendererEvents.AfterRender, () => {
  71862. this.plane.material.map.anisotropy = 4 //等下一次渲染后才能变回anisotropy
  71863. this.plane.material.map.needsUpdate = true
  71864. console.log('anisotropy 4', this.plane.material.map.uuid, this.sid)
  71865. }) */
  71866. map.dispose();
  71867. var recover = function recover() {
  71868. if (map._listeners && map._listeners.dispose && map._listeners.dispose.length) {
  71869. //已经渲染了。(必须出现在视野中才会渲染)
  71870. map.anisotropy = 4; //等下一次渲染后才能变回anisotropy
  71871. map.needsUpdate = true;
  71872. player.$app.core.get('SceneRenderer').off(SceneRendererEvents.AfterRender, recover);
  71873. }
  71874. };
  71875. player.$app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, recover);
  71876. });
  71877. _this7.addEventListener('lieDownChanged', function () {
  71878. _this7.updateLabelPose();
  71879. });
  71880. return _this7;
  71881. }
  71882. _createClass(BillboardItem, [{
  71883. key: "setFromInfo",
  71884. value: function setFromInfo(info) {
  71885. _get(_getPrototypeOf(BillboardItem.prototype), "setFromInfo", this).call(this, info);
  71886. this.plane.scale.copy(this.scale);
  71887. this.scale.set(1, 1, 1); //把加载整体的scale换成加载plane上
  71888. this.setTitle(info.title);
  71889. this.targetPano = info.targetPano; //跳转到的点
  71890. this.homePanoId = info.panoId; //回到指示牌的点位,为设置指示牌的位置时所在点位。
  71891. this.scaleRatio = info.scaleRatio;
  71892. this.setRotation(
  71893. /* this.quaternion, */
  71894. info.faceAngle);
  71895. this.setMap(info.icon);
  71896. this.subgroup = info.subgroup;
  71897. }
  71898. }, {
  71899. key: "setRotation",
  71900. value: function setRotation() {
  71901. var faceAngle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  71902. //this.baseQuaternion = quaternion.clone()
  71903. this.faceAngle = faceAngle;
  71904. /* let faceRot = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(faceAngle))
  71905. this.quaternion.copy(faceRot) //子级是自身,绕着面片的中心轴z轴转
  71906. this.quaternion.premultiply(this.baseQuaternion) //左乘父级 */
  71907. this.plane.quaternion.setFromAxisAngle(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(-faceAngle));
  71908. this.updateLabelPose();
  71909. }
  71910. }, {
  71911. key: "setScale",
  71912. value: function setScale(s) {
  71913. if (s == void 0) s = this.scaleRatio;
  71914. this.scaleRatio = s;
  71915. if (this.plane.material.map.image.width) {
  71916. var _this$plane$material$ = this.plane.material.map.image,
  71917. width = _this$plane$material$.width,
  71918. height = _this$plane$material$.height; //图尺寸越大,对应在三维中的尺寸也越大
  71919. this.width = width / 512 * s / 100;
  71920. this.height = height / 512 * s / 100;
  71921. this.plane.scale.set(this.width / settings$3.overlay.width, this.height / settings$3.overlay.height);
  71922. this.updateLabelPose();
  71923. }
  71924. }
  71925. }, {
  71926. key: "getFaceAngle2",
  71927. value: function getFaceAngle2(normal) {
  71928. if (this.faceAngle2 != void 0) return this.faceAngle2;
  71929. if (!normal) normal = new THREE.Vector3(0, 0, 1).applyQuaternion(this.quaternion); //还原出normal
  71930. var quaternionOri = new THREE.Quaternion().setFromRotationMatrix(new THREE.Matrix4().lookAt(normal, Vectors$1.ZERO, Vectors$1.UP)); //最初根据normal获得的quaterinion
  71931. var faceRotQua = this.quaternion.clone().premultiply(quaternionOri.invert()); //反向求出 当初为了使朝向相机方向时先旋转的角度
  71932. //let dir2 = new THREE.Vector3(0, 0, 1).applyQuaternion(faceRotQua) //为什么这样得到的都是0?
  71933. //this.faceAngle2 = Math.atan2(dir2.x, dir2.z)
  71934. this.faceAngle2 = new THREE.Euler().setFromQuaternion(faceRotQua).z; //只好用rotation了 希望不会有x y不为0的时候出现
  71935. }
  71936. }, {
  71937. key: "updateLabelPose",
  71938. value: function updateLabelPose() {
  71939. if (!this.titleLabel) return;
  71940. var marginTop = 0.1; //label到图顶部的空隙
  71941. this.titleLabel.rotation.z = 0; // 恢复
  71942. if (this.getIsLieDown()) {
  71943. //当牌子在地板时需要根据视线转动,保持文字在bill的下方正中。
  71944. var angle = THREE.MathUtils.degToRad(-this.faceAngle); //this.plane的旋转角度
  71945. var eyeDir = player$8.getDirection().negate(); // new THREE.Vector3().subVectors(player.position, this.position)
  71946. var eyeAngle = Math.atan2(eyeDir.x, eyeDir.z); //视线夹角
  71947. //视线夹角还要扣除最外层的this.quaternion造成的旋转(因为是整体的所以扣在整体世界的视线夹角里)
  71948. var planeDir = new THREE.Vector3(0, 0, 1).applyQuaternion(this.quaternion); //normal
  71949. var faceAngle2 = this.getFaceAngle2(planeDir); //创建时为了转向镜头方向而自身先转动的角度
  71950. var planeAngle = Math.atan2(planeDir.x, planeDir.z) + faceAngle2; //console.log('planeAngle',planeAngle, planeDir, 'faceAngle2', faceAngle2)
  71951. eyeAngle -= planeAngle;
  71952. angle -= eyeAngle; //把视线的角度叠加到bill上。可以假设将画布旋转到视线方向
  71953. var height = (this.height * Math.abs(Math.cos(angle)) + this.width * Math.abs(Math.sin(angle))) / 2 + marginTop; //计算bill中心到文字底部的距离(类同当视线角度为0时,仅转动bill时,也就是把视线的角度叠加到bill上)
  71954. //转回正常画布方向后求xy
  71955. var x = -height * Math.sin(-eyeAngle);
  71956. var y = -height * Math.cos(-eyeAngle);
  71957. this.titleLabel.position.set(x, y, 0);
  71958. this.titleLabel.rotation.z = eyeAngle; //计算见笔记
  71959. //console.log('updatePose', x, y, angle)
  71960. } else {
  71961. var _angle = THREE.MathUtils.degToRad(-this.faceAngle);
  71962. var _height = (this.height * Math.abs(Math.cos(_angle)) + this.width * Math.abs(Math.sin(_angle))) / 2 + marginTop; //整个bill在垂直方向的高度的一半加上marginTop就是label的高度
  71963. this.titleLabel.position.set(0, -_height, 0);
  71964. }
  71965. }
  71966. }, {
  71967. key: "setTitle",
  71968. value: function setTitle(title) {
  71969. this.titleLabel && this.titleLabel.setText(title);
  71970. }
  71971. }, {
  71972. key: "setMap",
  71973. value: function setMap(src) {
  71974. //this.plane.material.map.image = new Image
  71975. this.plane.material.map.image.src = this.getMapSrc(src); //为什么有时候会警告Parameter outside of bounds.
  71976. this.plane.material.map.anisotropy = 0; //需要先设置为0,否则新的小图会叠加在原先的大图上,很奇怪。即使是new一个image也是。
  71977. //console.log('anisotropy 0', this.plane.material.map.uuid, this.sid)
  71978. }
  71979. }, {
  71980. key: "getMapSrc",
  71981. value: function getMapSrc(icon) {
  71982. if (icon && icon.slice(0, 5) == 'blob:') {
  71983. return icon;
  71984. }
  71985. var name = icon || this.info.icon || mapNames[0]; //this.player.$app.resource.getUserResourceURL(info.poster)
  71986. if (
  71987. /* mapNames.includes(name) */
  71988. name.slice(0, 6) == 'style-' && name.slice(6) < 20) {
  71989. return player$8.$app.resource.getAppURL("images/billboard/".concat(name, ".png"));
  71990. } else {
  71991. if (name.split('.').length == 1) name += '.png';
  71992. return player$8.$app.resource.getUserResourceURL(name);
  71993. }
  71994. }
  71995. }, {
  71996. key: "getMapName",
  71997. value: function getMapName() {
  71998. var src = this.plane.material.map.image.src;
  71999. if (src.slice(0, 5) == 'blob:') {
  72000. return src;
  72001. }
  72002. var a = src.split('/').pop();
  72003. return a.split('.')[0];
  72004. }
  72005. }, {
  72006. key: "getIsLieDown",
  72007. value: function getIsLieDown() {
  72008. var isLie = this.lieDown;
  72009. this.lieDown = isLieDown(this.quaternion);
  72010. if (this.lieDown != isLie) {
  72011. this.dispatchEvent({
  72012. type: 'lieDownChanged'
  72013. });
  72014. }
  72015. return this.lieDown;
  72016. }
  72017. /* get info(){
  72018. return this._info
  72019. }
  72020. set info(i){
  72021. this._info = i
  72022. } */
  72023. }]);
  72024. return BillboardItem;
  72025. }(Overlay);
  72026. var _list = /*#__PURE__*/_classPrivateFieldKey("list");
  72027. var Billboard = /*#__PURE__*/function () {
  72028. function Billboard(app) {
  72029. var _this8 = this;
  72030. _classCallCheck(this, Billboard);
  72031. Object.defineProperty(this, _list, {
  72032. writable: true,
  72033. value: []
  72034. });
  72035. this.app = app;
  72036. this.app.store.on('billboards', function (data) {
  72037. (data.tags || data).forEach(function (info) {
  72038. if (!(info.panoId in player$8.model.panos.index)) {
  72039. return; //点被删除,失效
  72040. }
  72041. info = common$1.CloneJson(info);
  72042. _this8.manager.add(new BillboardItem(player$8, info));
  72043. });
  72044. });
  72045. this.manager = new BillboardManager(this);
  72046. this.app.Scene.on('loaded', function () {
  72047. player$8 = _this8.app.core.get('Player');
  72048. player$8.billboardManager = _this8.manager;
  72049. _this8.manager.emit('ready');
  72050. if (_this8.app.store.getValue('metadata').controls.showBillboardTitle) {
  72051. _this8.manager.changeTitlesShow(true);
  72052. }
  72053. player$8.on('view.changed', function (e) {
  72054. if ((player$8.mode == 'panorama' || player$8.mode == 'floorplan') &&
  72055. /* e.moved */
  72056. e.cameraWorldMatrixChanged) {
  72057. _this8.list.forEach(function (e) {
  72058. e.lieDown && e.updateLabelPose();
  72059. });
  72060. }
  72061. });
  72062. });
  72063. }
  72064. /**
  72065. * 指示牌数据列表
  72066. * @returns
  72067. */
  72068. _createClass(Billboard, [{
  72069. key: "list",
  72070. get: function get() {
  72071. return _classPrivateFieldBase(this, _list)[_list];
  72072. }
  72073. /**
  72074. * 获取指定指示牌数据
  72075. * @param {*} sid
  72076. * @returns
  72077. */
  72078. }, {
  72079. key: "get",
  72080. value: function get(sid) {
  72081. return _classPrivateFieldBase(this, _list)[_list].find(function (c) {
  72082. return c.sid == sid;
  72083. });
  72084. }
  72085. }]);
  72086. return Billboard;
  72087. }();
  72088. function isLieDown(quaternion) {
  72089. var direction = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion);
  72090. return Math.abs(direction.y) > 0.9;
  72091. }
  72092. 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); }; }
  72093. 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; } }
  72094. var outLineMaterial0 = LineDraw.createFatLineMat({
  72095. lineWidth: 2,
  72096. color: 0xffc23b,
  72097. transparent: false,
  72098. depthWrite: true,
  72099. depthTest: true
  72100. });
  72101. var outLineMaterial1 = LineDraw.createFatLineMat({
  72102. lineWidth: 2,
  72103. color: Colors.mainColor
  72104. /* 0x2ee4ce */
  72105. ,
  72106. transparent: false,
  72107. depthWrite: true,
  72108. depthTest: true
  72109. });
  72110. var lineMat0 = new THREE.LineBasicMaterial({
  72111. color: 0xffc23b
  72112. });
  72113. var lineMat1 = new THREE.LineBasicMaterial({
  72114. color: Colors.mainColor
  72115. });
  72116. var geometry = new THREE.BoxGeometry(1, 1, 1);
  72117. var ClipBox = /*#__PURE__*/function (_THREE$Mesh) {
  72118. _inherits(ClipBox, _THREE$Mesh);
  72119. var _super = _createSuper$o(ClipBox);
  72120. function ClipBox(type
  72121. /* , boxSize */
  72122. ) {
  72123. var _this;
  72124. _classCallCheck(this, ClipBox);
  72125. // const geometry = new THREE.BoxGeometry(boxSize, boxSize, boxSize)
  72126. // geometry.translate(boxSize/2, boxSize/2, boxSize/2)// 将geometry中心点移动至(0,0,0)
  72127. var material0 = new THREE.MeshBasicMaterial({
  72128. color: 0xb47e2c,
  72129. transparent: true,
  72130. depthWrite: false,
  72131. opacity: 0.1,
  72132. side: THREE.DoubleSide
  72133. });
  72134. var material1 = new THREE.MeshBasicMaterial({
  72135. color: Colors.mainColor,
  72136. transparent: true,
  72137. depthWrite: false,
  72138. opacity: 0.1,
  72139. side: THREE.DoubleSide
  72140. });
  72141. if (type === 0) {
  72142. _this = _super.call(this, geometry, material0);
  72143. _this.lowLight = function () {
  72144. if (_this.status === 1) return;
  72145. _this.outLines.visible = false;
  72146. _this.line.visible = true;
  72147. _this.material.opacity = 0;
  72148. };
  72149. _this.midLight = function () {
  72150. if (_this.status === 1) return;
  72151. _this.outLines.visible = false;
  72152. _this.line.visible = true;
  72153. _this.material.opacity = 0.1;
  72154. };
  72155. _this.highLight = function () {
  72156. if (_this.status === 1) return;
  72157. _this.outLines.visible = true;
  72158. _this.line.visible = true;
  72159. _this.material.opacity = 0.3;
  72160. _this.status = 1;
  72161. };
  72162. _this.switchBoxType = function () {
  72163. _this.clipType = Number(!_this.clipType);
  72164. console.log(!_this.clipType);
  72165. var templeMat = _this.clipType === 0 ? _this.material0 : _this.material1;
  72166. var templeLineMat = _this.clipType === 0 ? lineMat0 : lineMat1;
  72167. var templeFatLineMat = _this.clipType === 0 ? outLineMaterial0 : outLineMaterial1;
  72168. _this.material = templeMat;
  72169. _this.line.material = templeLineMat;
  72170. _this.outLines.material = templeFatLineMat;
  72171. console.log(_this.clipType);
  72172. };
  72173. } else {
  72174. _this = _super.call(this, geometry, material1);
  72175. _this.lowLight = function () {
  72176. if (_this.status === 1) return;
  72177. _this.outLines.visible = false;
  72178. _this.line.visible = true;
  72179. _this.material.opacity = 0;
  72180. };
  72181. _this.midLight = function () {
  72182. if (_this.status === 1) return;
  72183. _this.outLines.visible = false;
  72184. _this.line.visible = true;
  72185. _this.material.opacity = 0.1;
  72186. };
  72187. _this.highLight = function () {
  72188. if (_this.status === 1) return;
  72189. _this.outLines.visible = true;
  72190. _this.line.visible = true;
  72191. _this.material.opacity = 0.3;
  72192. _this.status = 1;
  72193. };
  72194. _this.switchBoxType = function () {
  72195. _this.clipType = Number(!_this.clipType);
  72196. console.log(!_this.clipType);
  72197. var templeMat = _this.clipType === 0 ? _this.material0 : _this.material1;
  72198. var templeLineMat = _this.clipType === 0 ? lineMat0 : lineMat1;
  72199. var templeFatLineMat = _this.clipType === 0 ? outLineMaterial0 : outLineMaterial1;
  72200. _this.material = templeMat;
  72201. _this.line.material = templeLineMat;
  72202. _this.outLines.material = templeFatLineMat;
  72203. console.log(_this.clipType);
  72204. };
  72205. } //line
  72206. var edges = new THREE.EdgesGeometry(geometry);
  72207. var _templeLineMat, _templeFatLineMat;
  72208. if (type === 0) {
  72209. _templeLineMat = lineMat0;
  72210. _templeFatLineMat = outLineMaterial0;
  72211. } else {
  72212. _templeLineMat = lineMat1;
  72213. _templeFatLineMat = outLineMaterial1;
  72214. }
  72215. _this.line = new THREE.LineSegments(edges, _templeLineMat); //outLines
  72216. var p = [];
  72217. p.push(new THREE.Vector3(-0.5, 0.5, -0.5));
  72218. p.push(new THREE.Vector3(-0.5, 0.5, 0.5));
  72219. p.push(new THREE.Vector3(0.5, 0.5, 0.5));
  72220. p.push(new THREE.Vector3(0.5, 0.5, -0.5));
  72221. p.push(new THREE.Vector3(-0.5, 0.5, -0.5));
  72222. p.push(new THREE.Vector3(-0.5, -0.5, -0.5));
  72223. p.push(new THREE.Vector3(-0.5, -0.5, 0.5));
  72224. p.push(new THREE.Vector3(0.5, -0.5, 0.5));
  72225. p.push(new THREE.Vector3(0.5, -0.5, -0.5));
  72226. p.push(new THREE.Vector3(-0.5, -0.5, -0.5));
  72227. p.push(new THREE.Vector3(0.5, -0.5, -0.5));
  72228. p.push(new THREE.Vector3(0.5, 0.5, -0.5));
  72229. p.push(new THREE.Vector3(0.5, 0.5, 0.5));
  72230. p.push(new THREE.Vector3(0.5, -0.5, 0.5));
  72231. p.push(new THREE.Vector3(-0.5, -0.5, 0.5));
  72232. p.push(new THREE.Vector3(-0.5, 0.5, 0.5));
  72233. _this.outLines = LineDraw.createFatLine(p, {
  72234. material: _templeFatLineMat
  72235. });
  72236. _this.outLines.visible = false;
  72237. _this.add(_this.line);
  72238. _this.add(_this.outLines);
  72239. /* this.scale.set(boxSize, boxSize, boxSize)
  72240. this.boxSize = boxSize */
  72241. _this.name = 'clipBox';
  72242. _this.status = 0;
  72243. _this.clipType = type;
  72244. _this.isClipBox = true;
  72245. _this.renderOrder = RenderOrder.entryArrow;
  72246. _this.material0 = material0;
  72247. _this.material1 = material1;
  72248. _this.boundingBox = new THREE.Box3(new THREE.Vector3(-0.5, -0.5, -0.5), new THREE.Vector3(0.5, 0.5, 0.5));
  72249. return _possibleConstructorReturn(_this);
  72250. }
  72251. return ClipBox;
  72252. }(THREE.Mesh);
  72253. 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); }; }
  72254. 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; } }
  72255. // 求vPosition是否在裁剪盒子内
  72256. //
  72257. // G
  72258. // |
  72259. // O —— C
  72260. // /
  72261. // A
  72262. //
  72263. // 需要clipBox的CGOA点和vPosition用于求点是否在clipBox内,决定是否discard
  72264. var ClipBoxManager = /*#__PURE__*/function (_Emiter) {
  72265. _inherits(ClipBoxManager, _Emiter);
  72266. var _super = _createSuper$n(ClipBoxManager);
  72267. function ClipBoxManager(app) {
  72268. var _this;
  72269. _classCallCheck(this, ClipBoxManager);
  72270. _this = _super.call(this);
  72271. _this.updateMaterials = function () {
  72272. if (_this.player.model._3dTilesRuntime || _this.materials.length === 0) {
  72273. _this.materials.length = 0;
  72274. _this.player.model.chunks.forEach(function (chunk) {
  72275. return _this.materials.push(chunk.materialOutside);
  72276. });
  72277. _this.player.model.chunks.forEach(function (chunk) {
  72278. return _this.materials.push(chunk.materialInside);
  72279. });
  72280. }
  72281. _this.materials.forEach(function (mat) {
  72282. mat.uniforms.clipBoxType.value = _this.clipBoxType;
  72283. mat.uniforms.clipBoxPoints.value = _this.clipBoxPoints;
  72284. });
  72285. _this.boxCountChanged();
  72286. };
  72287. _this.bindEvents = function () {
  72288. _this.player.on('pointerMove', _this.onMouseMove);
  72289. _this.player.on('pointerUp', _this.onMouseUp);
  72290. _this.player.on('moveModel', _this.onZoom);
  72291. _this.player.model.transformTool.addEventListener('transformed', _this.updateClipBox);
  72292. _this.player.model.transformTool.addEventListener('stopDrag', _this.finishUpdateClipBox);
  72293. _this.player.model.transformTool.addEventListener('changeByHistory', _this.changeByHistory);
  72294. };
  72295. _this.unBindEvents = function () {
  72296. _this.player.off('pointerMove', _this.onMouseMove);
  72297. _this.player.off('pointerUp', _this.onMouseUp);
  72298. _this.player.off('moveModel', _this.onZoom);
  72299. _this.player.model.transformTool.removeEventListener('transformed', _this.updateClipBox);
  72300. _this.player.model.transformTool.removeEventListener('stopDrag', _this.finishUpdateClipBox);
  72301. _this.player.model.transformTool.removeEventListener('changeByHistory', _this.changeByHistory);
  72302. };
  72303. _this.changeByHistory = function (e) {
  72304. var index = _this.clipBoxs.indexOf(e.data.object);
  72305. e.data.object.updateMatrixWorld();
  72306. _this.updateClipBox({
  72307. activeBoxIndex: index
  72308. });
  72309. _this.updateMaterials();
  72310. _this.emit('clipBoxManager.update', {
  72311. list: _this.clipBoxs
  72312. });
  72313. };
  72314. _this.onMouseUp = function (e) {
  72315. if (!_this.player.mouseCouldBeClickToMove) return;
  72316. if (_this.adding) {
  72317. // 确认摆放位置
  72318. _this.adding = false;
  72319. if (_this.activeBox) {
  72320. _this.activeBox.status = 0;
  72321. _this.activeBox.lowLight();
  72322. }
  72323. _this.activeBoxIndex = _this.clipBoxs.length - 1;
  72324. _this.activeBox = _this.clipBoxs[_this.activeBoxIndex];
  72325. _this.activeBox.highLight();
  72326. _this.player.model.transformTool.attach(_this.activeBox);
  72327. _this.emit('clipBoxManager.active', {
  72328. status: true,
  72329. list: _this.clipBoxs
  72330. });
  72331. _this.emit('clipBoxManager.update', {
  72332. list: _this.clipBoxs
  72333. });
  72334. _this.clipBoxType[_this.clipBoxs.length - 1] = _this.activeBox.clipType; //记录裁剪盒子类型
  72335. _this.updateClipBox(); // this.defineHasClip(true)
  72336. if (_this.clipBoxs.length === 1) {
  72337. //isBind3dTile
  72338. _this.clipInit();
  72339. }
  72340. } else {
  72341. // 选中box (直接点击)
  72342. if (_this.activeBox) {
  72343. _this.activeBox.status = 0;
  72344. _this.activeBox.lowLight();
  72345. }
  72346. var intersect = _this.player.getMouseIntersect(null, _this.clipBoxs);
  72347. if (intersect) {
  72348. _this.player.model.transformTool.attach(intersect.object);
  72349. _this.emit('clipBoxManager.active', {
  72350. status: true,
  72351. list: _this.clipBoxs
  72352. }); //激活删除按钮
  72353. _this.activeBox = intersect.object;
  72354. for (var i = 0; i < _this.clipBoxs.length; i++) {
  72355. if (_this.activeBox === _this.clipBoxs[i]) {
  72356. _this.activeBoxIndex = i;
  72357. break;
  72358. }
  72359. }
  72360. _this.activeBox.highLight();
  72361. } else {
  72362. //点击空白取消选择
  72363. _this.cancelActive();
  72364. }
  72365. }
  72366. };
  72367. _this.onMouseMove = function () {
  72368. if (_this.adding) {
  72369. //box随鼠标移动
  72370. _this.clipBoxs[_this.clipBoxs.length - 1].position.copy(_this.player.reticule.position);
  72371. } else {
  72372. //触碰到的box高亮
  72373. var intersect = _this.player.getMouseIntersect(null, _this.clipBoxs);
  72374. if (intersect) {
  72375. if (_this.touchBox === null) {
  72376. //首次touch
  72377. _this.touchBox = intersect.object;
  72378. _this.touchBox.midLight();
  72379. } else if (intersect.object !== _this.touchBox) {
  72380. //touch到新box
  72381. _this.touchBox.lowLight();
  72382. _this.touchBox = intersect.object;
  72383. _this.touchBox.midLight();
  72384. }
  72385. } else {
  72386. if (_this.touchBox) {
  72387. //去除高亮
  72388. _this.touchBox.lowLight();
  72389. _this.touchBox = null;
  72390. }
  72391. }
  72392. }
  72393. };
  72394. _this.onZoom = function () {
  72395. if (_this.adding) {
  72396. //根据相机距离原点的距离缩放box
  72397. var box = _this.clipBoxs[_this.clipBoxs.length - 1];
  72398. var scale = _this.player.camera.position.distanceTo(box.position) / 5;
  72399. _this.clipBoxs[_this.clipBoxs.length - 1].scale.set(scale, scale, scale);
  72400. }
  72401. };
  72402. _this.app = app;
  72403. _this.player = null; //this.boxSize = 1
  72404. _this.deferred = Deferred$1();
  72405. _this.clipBoxs = []; //裁剪盒子数组用于raycaster
  72406. _this.clipBoxGroup = new THREE.Group(); //裁剪盒子组
  72407. _this.clipBoxType = []; //new Array(10).fill(-1) //裁剪盒子类型 0=内切/1=外切/-1=空。 length必须和shader里定义的个数一样
  72408. _this.clipBoxPoints = []; //记录每个裁剪盒子数据(用于shader)
  72409. _this.oriObj = {
  72410. clipBoxType: [],
  72411. clipMatrixs: []
  72412. }; //用于不保存退出的数据恢复
  72413. _this.activeBoxIndex = null;
  72414. _this.activeBox = null;
  72415. _this.touchBox = null;
  72416. _this.adding = false; //true=未放置
  72417. _this.materials = []; //裁剪材质数组
  72418. _this.mousedown = new THREE.Vector3();
  72419. _this.mouseup = new THREE.Vector3();
  72420. _this.isBind3dTile = false;
  72421. _this.initFinish = false;
  72422. _this.init = function (metadata) {
  72423. var reload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  72424. //根据场景大小初始化boxSize
  72425. new THREE.Vector3();
  72426. if (metadata) {
  72427. metadata[0] && (metadata = metadata[0].modelData);
  72428. _this.clipBoxType = metadata.clipBoxType;
  72429. var clipMatrixs = metadata.clipMatrixs;
  72430. for (var i = 0; i < clipMatrixs.length; i++) {
  72431. var clipBox = new ClipBox(_this.clipBoxType[i], 1);
  72432. var mat4 = new THREE.Matrix4();
  72433. mat4.fromArray(clipMatrixs[i]);
  72434. clipBox.applyMatrix4(mat4);
  72435. _this.clipBoxPoints[i * 4] = new THREE.Vector3(1 / 2, -1 / 2, -1 / 2).applyMatrix4(mat4);
  72436. _this.clipBoxPoints[i * 4 + 1] = new THREE.Vector3(-1 / 2, 1 / 2, -1 / 2).applyMatrix4(mat4);
  72437. _this.clipBoxPoints[i * 4 + 2] = new THREE.Vector3(-1 / 2, -1 / 2, -1 / 2).applyMatrix4(mat4);
  72438. _this.clipBoxPoints[i * 4 + 3] = new THREE.Vector3(-1 / 2, -1 / 2, 1 / 2).applyMatrix4(mat4);
  72439. _this.clipBoxs.push(clipBox);
  72440. _this.clipBoxGroup.add(clipBox);
  72441. }
  72442. _this.oriObj = {
  72443. clipBoxType: JSON.parse(JSON.stringify(_this.clipBoxType)),
  72444. clipMatrixs
  72445. };
  72446. }
  72447. if (!reload) {
  72448. //初次加载
  72449. _this.setAllClipBoxVisible(false); //隐藏所有裁剪盒子
  72450. _this.player.model.add(_this.clipBoxGroup); // this.clipInit()
  72451. }
  72452. _this.clipInit();
  72453. /* if (this.clipBoxs.length === 0) {
  72454. this.defineHasClip(false)
  72455. } */
  72456. _this.deferred.resolve();
  72457. };
  72458. _this.app.Scene.on('loaded', function () {
  72459. setTimeout(function () {
  72460. _this.player = _this.app.core.get('Player'); //获取metadata
  72461. var metadata = _this.app.store.getValue('cutModel'); // console.log(metadata)
  72462. // if (metadata) this.init(metadata)
  72463. // else this.app.store.on('metadata', this.init)
  72464. _this.init(metadata);
  72465. }, 50); //setTimeout为了在transformControls初始化完成后再初始化ClipBoxManager
  72466. }); // 进入裁剪模块
  72467. _this.enterModule = function () {
  72468. _this.waitInit(function () {
  72469. if (_this.app.Camera.monitor.control.watchingCamera) {
  72470. _this.app.Camera.monitor.control.stopWatch();
  72471. _this.player.dollhouseMode();
  72472. }
  72473. var deal = function deal() {
  72474. _this.player.model.panos.forEach(function (pano) {
  72475. return pano.hasVideo && common$1.updateVisible(pano.marker, 'clipBox', false, 10);
  72476. }); //this.player.OverlayManager.list.forEach(child => child.hide('clipBox'))
  72477. //this.app.Camera.monitor.control.hideAll(undefined, 'clipBox', 10, undefined)
  72478. //this.app.Scene.Decoration.hideAll()
  72479. _this.player.labelManager.hide();
  72480. _this.player.linkEditor.hideFootIcons();
  72481. _this.player.linkEditor.delVisibleLines();
  72482. _this.emit('clipBoxManager.enter');
  72483. _this.player.model.floors.show(); //this.app.TagManager.switchLabels({ type: 'traces', visible: false }, null, 'clipModel')
  72484. _this.app.TagManager.switchAllDisplay(false, 'clipModel');
  72485. };
  72486. _this.player.flyToMode(Viewmode$1.DOLLHOUSE, deal);
  72487. _this.setAllClipBoxVisible(true); //显示所有裁剪盒子
  72488. //绑定事件
  72489. _this.bindEvents();
  72490. _this.player.locked = true;
  72491. _this.player.model.transformTool.frame.material.visible = false;
  72492. }, _this.enterModule.bind(_assertThisInitialized(_this)));
  72493. }; //离开裁剪模块
  72494. _this.leaveModule = function () {
  72495. _this.setAllClipBoxVisible(false); //隐藏所有裁剪盒子
  72496. _this.player.model.transformTool.frame.material.visible = true;
  72497. _this.player.model.transformTool.history.clear();
  72498. _this.player.model.transformTool.detach(); //this.player.model.transformControls.detach()
  72499. _this.emit('clipBoxManager.active', {
  72500. status: false,
  72501. list: _this.clipBoxs
  72502. });
  72503. if (_this.adding) _this.cancelAddClipBox(); //解绑事件
  72504. _this.unBindEvents();
  72505. _this.player.locked = false; //恢复显示
  72506. _this.player.model.panos.forEach(function (pano) {
  72507. return pano.hasVideo && common$1.updateVisible(pano.marker, 'clipBox', true, 10);
  72508. }); //this.player.OverlayManager.group.children.forEach(child => child.show('clipBox'))
  72509. //this.app.Camera.monitor.control.showAll(undefined, 'clipBox', 10, undefined)
  72510. //this.app.Scene.Decoration.showAll()
  72511. _this.player.labelManager.show(); //this.app.TagManager.switchLabels({ type: 'traces', visible: true }, null, 'clipModel')
  72512. _this.app.TagManager.switchAllDisplay(true, 'clipModel'); //this.player.model.transformControls.visible = false
  72513. }; //添加裁剪盒子
  72514. _this.addClipBox = function (type) {
  72515. _this.waitInit(function () {
  72516. console.log('add');
  72517. if (_this.adding && type === _this.clipBoxs[_this.clipBoxs.length - 1].clipType) {
  72518. //连点
  72519. return;
  72520. } else if (_this.adding && type !== _this.clipBoxs[_this.clipBoxs.length - 1].clipType) {
  72521. //切换新增类型
  72522. _this.changeClipBoxType();
  72523. return;
  72524. } //if (this.clipBoxs.length < 10) {
  72525. //数量到达10 禁止新建
  72526. var clipBox = new ClipBox(type
  72527. /* , this.boxSize */
  72528. );
  72529. _this.clipBoxs.push(clipBox);
  72530. _this.clipBoxGroup.add(clipBox);
  72531. _this.adding = true;
  72532. _this.onZoom(); //this.player.model.transformControls.visible = false
  72533. //}
  72534. }, _this.addClipBox.bind(_assertThisInitialized(_this), type));
  72535. }; //取消添加裁剪盒子
  72536. _this.cancelAddClipBox = function () {
  72537. if (_this.adding) {
  72538. console.log(_this.clipBoxs[_this.clipBoxs.length - 1]);
  72539. _this.clipBoxGroup.remove(_this.clipBoxs[_this.clipBoxs.length - 1]);
  72540. _this.clipBoxs.pop();
  72541. _this.adding = false;
  72542. _this.boxCountChanged(); //this.player.model.transformControls.visible = true
  72543. if (_this.activeBoxIndex !== null) {
  72544. _this.emit('clipBoxManager.active', {
  72545. status: false,
  72546. list: _this.clipBoxs
  72547. }); //发送选中事件
  72548. }
  72549. }
  72550. }; //删除裁剪盒子
  72551. _this.deleteClipBox = function (index) {
  72552. if (index === undefined && _this.activeBoxIndex === null) {
  72553. return;
  72554. } else if (index === undefined) {
  72555. index = _this.activeBoxIndex;
  72556. }
  72557. if (index === _this.activeBoxIndex) {
  72558. _this.activeBox = null;
  72559. _this.activeBoxIndex = null;
  72560. }
  72561. _this.player.model.transformTool.detach();
  72562. _this.emit('clipBoxManager.active', {
  72563. status: false,
  72564. list: _this.clipBoxs
  72565. }); //发送选中事件
  72566. _this.emit('clipBoxManager.update', {
  72567. list: _this.clipBoxs
  72568. }); //发送选中事件
  72569. _this.clipBoxGroup.remove(_this.clipBoxGroup.children[index]);
  72570. _this.clipBoxs.splice(index, 1);
  72571. _this.clipBoxType.splice(index, 1);
  72572. _this.clipBoxPoints.splice(index * 4, 4);
  72573. _this.boxCountChanged();
  72574. }; //清空裁剪盒子
  72575. _this.clearClipBoxs = function () {
  72576. var length = _this.clipBoxs.length;
  72577. for (var i = 0; i < length; i++) {
  72578. _this.deleteClipBox(0);
  72579. }
  72580. _this.clipBoxGroup.children = [];
  72581. _this.emit('clipBoxManager.active', {
  72582. status: false,
  72583. list: _this.clipBoxs
  72584. }); //发送选中事件
  72585. _this.emit('clipBoxManager.update', {
  72586. list: _this.clipBoxs
  72587. }); //发送选中事件
  72588. _this.boxCountChanged(); //this.defineHasClip(false)
  72589. _this.cancelAddClipBox();
  72590. }; //修改盒子类型
  72591. _this.changeClipBoxType = function (index) {
  72592. index === void 0 && (index = _this.clipBoxs.length - 1);
  72593. if (_this.adding) {
  72594. _this.clipBoxs[index].switchBoxType();
  72595. } else {
  72596. _this.clipBoxs[index].switchBoxType();
  72597. _this.clipBoxType[index] = _this.clipBoxs[index].clipType;
  72598. }
  72599. }; //选中裁剪盒子 (列表选择)
  72600. _this.focusClipBox = function (index) {
  72601. _this.activeBoxIndex = index;
  72602. _this.activeBox = _this.clipBoxs[index];
  72603. _this.player.model.transformTool.attach(_this.activeBox);
  72604. _this.emit('clipBoxManager.active', {
  72605. status: true,
  72606. list: _this.clipBoxs
  72607. }); //发送选中事件
  72608. }; //取消选中
  72609. _this.cancelActive = function () {
  72610. _this.player.model.transformTool.detach();
  72611. _this.emit('clipBoxManager.active', {
  72612. status: false,
  72613. list: _this.clipBoxs
  72614. }); //发送选中事件
  72615. if (_this.activeBox) {
  72616. _this.activeBox.status = 0;
  72617. _this.activeBox.lowLight();
  72618. }
  72619. _this.activeBox = null;
  72620. _this.activeBoxIndex = null;
  72621. };
  72622. _this.finishUpdateClipBox = function () {
  72623. //mouseup时调用,确保裁剪准确
  72624. _this.updateClipBox();
  72625. _this.emit('clipBoxManager.update', {
  72626. list: _this.clipBoxs
  72627. }); //发送选中事件
  72628. }; //更新裁剪盒子变化
  72629. _this.updateClipBox = function () {
  72630. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  72631. var index = e.activeBoxIndex != void 0 ? e.activeBoxIndex : _this.activeBoxIndex;
  72632. if (index != void 0) {
  72633. var mat4 = _this.clipBoxs[index].matrix; //获取所选box的四维矩阵
  72634. _this.clipBoxPoints[index * 4] = new THREE.Vector3(1 / 2, -1 / 2, -1 / 2).applyMatrix4(mat4);
  72635. _this.clipBoxPoints[index * 4 + 1] = new THREE.Vector3(-1 / 2, 1 / 2, -1 / 2).applyMatrix4(mat4);
  72636. _this.clipBoxPoints[index * 4 + 2] = new THREE.Vector3(-1 / 2, -1 / 2, -1 / 2).applyMatrix4(mat4);
  72637. _this.clipBoxPoints[index * 4 + 3] = new THREE.Vector3(-1 / 2, -1 / 2, 1 / 2).applyMatrix4(mat4);
  72638. _this.boxCountChanged();
  72639. }
  72640. }; //保存编辑
  72641. _this.saveEdit = function () {
  72642. //保存clipBoxType 和 clipBoxs内每个box的matrix到服务器
  72643. var clipMatrixs = [];
  72644. for (var i = 0; i < _this.clipBoxs.length; i++) {
  72645. clipMatrixs.push(_this.clipBoxs[i].matrix.toArray());
  72646. }
  72647. var obj = {
  72648. clipBoxType: JSON.parse(JSON.stringify(_this.clipBoxType)),
  72649. clipMatrixs
  72650. };
  72651. _this.oriObj = obj;
  72652. console.log('save', obj);
  72653. _this.player.model.transformTool.history.clear();
  72654. _this.cancelActive();
  72655. return obj;
  72656. }; //退出编辑
  72657. _this.cancelEdit = function () {
  72658. if (_this.adding) _this.cancelAddClipBox();
  72659. _this.clipBoxs = [];
  72660. _this.clipBoxGroup.children = [];
  72661. _this.clipBoxPoints = [];
  72662. _this.clipBoxType = [];
  72663. _this.player.model.transformTool.detach();
  72664. _this.player.model.transformTool.history.clear();
  72665. _this.activeBox = null;
  72666. _this.emit('clipBoxManager.active', {
  72667. status: false,
  72668. list: _this.clipBoxs
  72669. });
  72670. _this.init(_this.oriObj, true); //重新加载数据
  72671. }; //设置所有裁剪盒子显隐
  72672. _this.setAllClipBoxVisible = function (visi) {
  72673. _this.clipBoxGroup.visible = visi;
  72674. }; // 变换TransformControls(0 移动、1 旋转、2 缩放)
  72675. _this.switchTransformControlsMode = function (mode) {
  72676. if (parseInt(mode) == 0) mode = 'translation';
  72677. if (parseInt(mode) == 1) mode = 'rotation';
  72678. if (parseInt(mode) == 2) mode = 'scale';
  72679. _this.player.model.transformTool.setModeEnable([mode]);
  72680. };
  72681. return _this;
  72682. }
  72683. /* defineHasClip(isDefine) {
  72684. this.waitInit(() => {
  72685. if (isDefine) {
  72686. this.materials.forEach(mat => ((mat.defines['HasClip'] = true), (mat.needsUpdate = true)))
  72687. } else {
  72688. this.materials.forEach(mat => (delete mat.defines['HasClip'], (mat.needsUpdate = true)))
  72689. }
  72690. }, this.defineHasClip.bind(this, isDefine))
  72691. } */
  72692. _createClass(ClipBoxManager, [{
  72693. key: "enableClip",
  72694. value: function enableClip(state) {
  72695. //外部调用 临时控制
  72696. var enable = !state;
  72697. if (this.unableClip != enable) {
  72698. this.unableClip = enable;
  72699. this.player && this.updateMaterials();
  72700. }
  72701. }
  72702. }, {
  72703. key: "boxCountChanged",
  72704. value: function boxCountChanged() {
  72705. var activeBoxCount = this.clipBoxPoints.length / 4; //console.log('boxCountChanged', this.clipBoxPoints.length, this.clipBoxs.length )
  72706. var shouldClip = this.clipBoxs.length > 0 && !this.unableClip;
  72707. this.materials.forEach(function (mat) {
  72708. var oldHasClip = ('HasClip' in mat.defines);
  72709. if (shouldClip) {
  72710. mat.defines['HasClip'] = true;
  72711. } else {
  72712. delete mat.defines['HasClip'];
  72713. }
  72714. if (oldHasClip != shouldClip || mat.defines.clipBoxCount != activeBoxCount) mat.needsUpdate = true;
  72715. mat.defines.clipBoxCount = activeBoxCount;
  72716. });
  72717. } //事件绑定
  72718. }, {
  72719. key: "clipInit",
  72720. value: function clipInit() {
  72721. if (this.player.model._3dTilesRuntime && !this.isBind3dTile && this.clipBoxs.length !== 0) {
  72722. this.player.model._3dTilesRuntime.getTileset().on('endTileLoading', this.updateMaterials); //监测3dtiles更新
  72723. this.isBind3dTile = true;
  72724. }
  72725. this.updateMaterials();
  72726. this.initFinish = true;
  72727. console.log('clipBox init finish');
  72728. }
  72729. }, {
  72730. key: "waitInit",
  72731. value: function waitInit(func, waitFunc) {
  72732. if (this.initFinish) {
  72733. func && func();
  72734. } else {
  72735. this.deferred.then(function () {
  72736. return waitFunc();
  72737. });
  72738. }
  72739. }
  72740. }]);
  72741. return ClipBoxManager;
  72742. }(tinyEmitter);
  72743. 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); }; }
  72744. 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; } }
  72745. /**
  72746. * Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs
  72747. */
  72748. var _position = new THREE$1.Vector3();
  72749. var _quaternion = new THREE$1.Quaternion();
  72750. var _scale = new THREE$1.Vector3();
  72751. var CSS3DObject = /*#__PURE__*/function (_Object3D) {
  72752. _inherits(CSS3DObject, _Object3D);
  72753. var _super = _createSuper$m(CSS3DObject);
  72754. function CSS3DObject() {
  72755. var _this2;
  72756. var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document.createElement('div');
  72757. _classCallCheck(this, CSS3DObject);
  72758. _this2 = _super.call(this);
  72759. _this2.isCSS3DObject = true;
  72760. _this2.element = element;
  72761. _this2.element.style.position = 'absolute';
  72762. _this2.element.style.pointerEvents = 'auto';
  72763. _this2.element.style.userSelect = 'none';
  72764. _this2.element.setAttribute('draggable', false);
  72765. _this2.addEventListener('removed', function () {
  72766. this.traverse(function (object) {
  72767. if (object.element instanceof Element && object.element.parentNode !== null) {
  72768. object.element.parentNode.removeChild(object.element);
  72769. }
  72770. });
  72771. });
  72772. return _this2;
  72773. }
  72774. _createClass(CSS3DObject, [{
  72775. key: "copy",
  72776. value: function copy(source, recursive) {
  72777. _get(_getPrototypeOf(CSS3DObject.prototype), "copy", this).call(this, source, recursive);
  72778. this.element = source.element.cloneNode(true);
  72779. return this;
  72780. }
  72781. }]);
  72782. return CSS3DObject;
  72783. }(THREE$1.Object3D);
  72784. var _matrix = new THREE$1.Matrix4();
  72785. var _matrix2 = new THREE$1.Matrix4();
  72786. var CSS3DRenderer = function CSS3DRenderer() {
  72787. var parameters = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  72788. _classCallCheck(this, CSS3DRenderer);
  72789. var _this = this;
  72790. var _width, _height;
  72791. var _widthHalf, _heightHalf;
  72792. var cache = {
  72793. camera: {
  72794. style: ''
  72795. },
  72796. objects: new WeakMap()
  72797. };
  72798. var domElement = parameters.element !== undefined ? parameters.element : document.createElement('div');
  72799. domElement.style.overflow = 'hidden';
  72800. this.domElement = domElement;
  72801. var viewElement = document.createElement('div');
  72802. viewElement.style.transformOrigin = '0 0';
  72803. viewElement.style.pointerEvents = 'none';
  72804. domElement.appendChild(viewElement);
  72805. var cameraElement = document.createElement('div');
  72806. cameraElement.style.transformStyle = 'preserve-3d';
  72807. viewElement.appendChild(cameraElement);
  72808. this.getSize = function () {
  72809. return {
  72810. width: _width,
  72811. height: _height
  72812. };
  72813. };
  72814. this.render = function (scene, camera) {
  72815. var fov = camera.projectionMatrix.elements[5] * _heightHalf;
  72816. if (camera.view && camera.view.enabled) {
  72817. // view offset
  72818. 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
  72819. viewElement.style.transform += "scale( ".concat(camera.view.fullWidth / camera.view.width, ", ").concat(camera.view.fullHeight / camera.view.height, " )");
  72820. } else {
  72821. viewElement.style.transform = '';
  72822. }
  72823. if (scene.matrixWorldAutoUpdate === true) scene.updateMatrixWorld();
  72824. if (camera.parent === null && camera.matrixWorldAutoUpdate === true) camera.updateMatrixWorld();
  72825. var tx, ty;
  72826. if (camera.isOrthographicCamera) {
  72827. tx = -(camera.right + camera.left) / 2;
  72828. ty = (camera.top + camera.bottom) / 2;
  72829. }
  72830. var scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1;
  72831. 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);
  72832. var perspective = camera.isPerspectiveCamera ? 'perspective(' + fov + 'px) ' : '';
  72833. var style = perspective + cameraCSSMatrix + 'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)';
  72834. if (cache.camera.style !== style) {
  72835. cameraElement.style.transform = style;
  72836. cache.camera.style = style;
  72837. }
  72838. renderObject(scene, scene, camera);
  72839. };
  72840. this.setSize = function (width, height) {
  72841. _width = width;
  72842. _height = height;
  72843. _widthHalf = _width / 2;
  72844. _heightHalf = _height / 2;
  72845. domElement.style.width = width + 'px';
  72846. domElement.style.height = height + 'px';
  72847. viewElement.style.width = width + 'px';
  72848. viewElement.style.height = height + 'px';
  72849. cameraElement.style.width = width + 'px';
  72850. cameraElement.style.height = height + 'px';
  72851. };
  72852. function epsilon(value) {
  72853. return Math.abs(value) < 1e-10 ? 0 : value;
  72854. }
  72855. function getCameraCSSMatrix(matrix) {
  72856. var elements = matrix.elements;
  72857. 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]) + ')';
  72858. }
  72859. function getObjectCSSMatrix(matrix) {
  72860. var elements = matrix.elements;
  72861. 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]) + ')';
  72862. return 'translate(-50%,-50%)' + matrix3d;
  72863. }
  72864. function renderObject(object, scene, camera, cameraCSSMatrix) {
  72865. if (object.isCSS3DObject) {
  72866. var visible = object.visible === true && object.layers.test(camera.layers) === true;
  72867. object.element.style.display = visible === true ? '' : 'none';
  72868. if (visible === true) {
  72869. object.onBeforeRender(_this, scene, camera);
  72870. var style;
  72871. if (object.isCSS3DSprite) {
  72872. // http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/
  72873. _matrix.copy(camera.matrixWorldInverse);
  72874. _matrix.transpose();
  72875. if (object.rotation2D !== 0) _matrix.multiply(_matrix2.makeRotationZ(object.rotation2D));
  72876. object.matrixWorld.decompose(_position, _quaternion, _scale);
  72877. _matrix.setPosition(_position);
  72878. _matrix.scale(_scale);
  72879. _matrix.elements[3] = 0;
  72880. _matrix.elements[7] = 0;
  72881. _matrix.elements[11] = 0;
  72882. _matrix.elements[15] = 1;
  72883. style = getObjectCSSMatrix(_matrix);
  72884. } else {
  72885. style = getObjectCSSMatrix(object.matrixWorld);
  72886. }
  72887. var element = object.element;
  72888. var cachedObject = cache.objects.get(object);
  72889. if (cachedObject === undefined || cachedObject.style !== style) {
  72890. element.style.transform = style;
  72891. var objectData = {
  72892. style: style
  72893. };
  72894. cache.objects.set(object, objectData);
  72895. }
  72896. if (element.parentNode !== cameraElement) {
  72897. cameraElement.appendChild(element);
  72898. }
  72899. object.onAfterRender(_this, scene, camera);
  72900. }
  72901. }
  72902. for (var i = 0, l = object.children.length; i < l; i++) {
  72903. renderObject(object.children[i], scene, camera);
  72904. }
  72905. }
  72906. };
  72907. 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); }; }
  72908. 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; } }
  72909. var CSS3DEleObj = /*#__PURE__*/function (_CSS3DObject) {
  72910. _inherits(CSS3DEleObj, _CSS3DObject);
  72911. var _super = _createSuper$l(CSS3DEleObj);
  72912. function CSS3DEleObj(elem, option) {
  72913. var _this;
  72914. _classCallCheck(this, CSS3DEleObj);
  72915. _this = _super.call(this, elem);
  72916. _this.player = option.player;
  72917. _this.manager = option.manager; // this.sid = option.sid !== undefined ? option.sid : common.getRandomSid()
  72918. // this.sid = option.sid !== undefined ? option.sid : '123123123'
  72919. _this.sid = option.sid;
  72920. _this.text = option.text !== undefined ? option.text : '';
  72921. _this.widthHeight = option.widthHeight;
  72922. _this.renderRes = option.renderRes !== undefined ? option.renderRes : 1;
  72923. _this.panoId = option.panoId;
  72924. elem.children[0].style.zoom = _this.renderRes;
  72925. _this.scaleRes = option.scaleRes !== undefined ? option.scaleRes / _this.renderRes : 1 / _this.renderRes;
  72926. _this.scale.set(_this.scaleRes, _this.scaleRes, _this.scaleRes);
  72927. _this.enabled = option.visible !== undefined ? option.visible : true;
  72928. _this.visible = option.visible !== undefined ? option.visible : true;
  72929. _this.plane = new THREE.Mesh(new THREE.PlaneGeometry(0.25, 0.25), new THREE.MeshBasicMaterial({
  72930. wireframe: true,
  72931. side: 2
  72932. })); // console.log()
  72933. if (_this.widthHeight) _this.plane.scale.set(_this.widthHeight.x / 100, _this.widthHeight.y / 100, 1);
  72934. option.position !== undefined && _this.plane.position.copy(option.position);
  72935. option.rotation !== undefined && _this.plane.rotation.copy(option.rotation);
  72936. _this.plane.css3dObj = _assertThisInitialized(_this); // this.player.domElement.addEventListener('pointerdown', e => {
  72937. // console.log('player down')
  72938. // })
  72939. elem.addEventListener('pointerdown', function (e) {
  72940. e.stopPropagation();
  72941. });
  72942. elem.addEventListener('pointermove', function (e) {
  72943. e.stopPropagation();
  72944. });
  72945. elem.addEventListener('pointerup', function (e) {
  72946. e.stopPropagation();
  72947. _this.manager.flyAndLookAt(_assertThisInitialized(_this));
  72948. });
  72949. elem.addEventListener('mousewheel', function (e) {
  72950. e.stopPropagation();
  72951. });
  72952. elem.addEventListener('mousedown', function (e) {
  72953. e.stopPropagation();
  72954. });
  72955. elem.addEventListener('mousemove', function (e) {
  72956. e.stopPropagation();
  72957. });
  72958. elem.addEventListener('mouseup', function (e) {
  72959. e.stopPropagation();
  72960. });
  72961. _this.visible = false;
  72962. _this.tempHide = false;
  72963. _this.plane.visible = false;
  72964. return _this;
  72965. }
  72966. _createClass(CSS3DEleObj, [{
  72967. key: "update",
  72968. value: function update() {
  72969. this.position.copy(this.plane.position);
  72970. this.rotation.copy(this.plane.rotation);
  72971. if (!this.widthHeight || this.widthHeight.x === 0 || this.widthHeight.y === 0) {
  72972. this.widthHeight = {
  72973. x: 0,
  72974. y: 0
  72975. };
  72976. this.widthHeight.x = this.element.firstChild.offsetWidth;
  72977. this.widthHeight.y = this.element.firstChild.offsetHeight;
  72978. this.plane.scale.set(this.widthHeight.x / 100, this.widthHeight.y / 100, 1);
  72979. } else {
  72980. var w = Math.floor(this.plane.scale.x * 100);
  72981. var h = Math.floor(this.plane.scale.y * 100);
  72982. this.element.firstChild.style.width = w + 'px';
  72983. this.element.firstChild.style.height = h + 'px';
  72984. this.widthHeight.x = w;
  72985. this.widthHeight.y = h;
  72986. } // if (this.manager.isEdit) {
  72987. // } else if (!this.enabled || (this.player.mode === 'panorama' && this.player.currentPano.id !== this.panoId)) {
  72988. // this.visible = false
  72989. // return
  72990. // }
  72991. //三维模式不显示
  72992. if (this.manager.isEdit) ; else if (!this.enabled || this.player.mode !== 'panorama' || this.player.currentPano.id !== this.panoId) {
  72993. this.visible = false;
  72994. return;
  72995. } // 墙体遮挡
  72996. // var p = convertTool.getPos2d(this.position, this.player)
  72997. // if (convertTool.ifShelter(this.position, this.player, { x: p.vector.x, y: p.vector.y }, null, null)) {
  72998. // console.log('hide')
  72999. // this.visible = false
  73000. // return
  73001. // } else if (this.enabled && !this.tempHide) {
  73002. // this.visible = true
  73003. // }
  73004. if (this.enabled && !this.tempHide) {
  73005. this.visible = true;
  73006. }
  73007. }
  73008. }, {
  73009. key: "updatePlane",
  73010. value: function updatePlane() {
  73011. this.plane.position.copy(this.position);
  73012. this.plane.rotation.copy(this.rotation);
  73013. var w = this.widthHeight.x / 100;
  73014. var h = this.widthHeight.y / 100;
  73015. this.plane.scale.set(w, h, 1);
  73016. }
  73017. }]);
  73018. return CSS3DEleObj;
  73019. }(CSS3DObject);
  73020. var css$1 = ".domBox {\r\n max-width: 500px;\r\n max-height: 500px;\r\n background-color: #292929;\r\n border-radius: 5px;\r\n padding: 20px;\r\n font-size: 30px;\r\n overflow: auto;\r\n /* overflow-x: hidden; */\r\n /* overflow-y: auto; */\r\n\r\n font-family: Microsoft YaHei;\r\n font-weight: 400;\r\n font-size: 14px;\r\n color: #FFFFFF;\r\n line-height: 22px;\r\n text-align: left;\r\n font-style: normal;\r\n text-transform: none;\r\n word-wrap:break-word;\r\n\r\n pointer-events: auto;\r\n cursor: pointer;\r\n}\r\n\r\n/* .domBox :first-child{ */\r\n /* width: 400px; */\r\n /* height: 418px; */\r\n/* } */";
  73021. n$4(css$1,{});
  73022. 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); }; }
  73023. 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; } }
  73024. var settings = {
  73025. maxWidth: 500,
  73026. maxHeight: 500,
  73027. scale: 0.0025,
  73028. renderRes: 2
  73029. };
  73030. function degToRad(degrees) {
  73031. return degrees * (Math.PI / 180);
  73032. }
  73033. function RadTodeg(radians) {
  73034. return Math.floor(radians * (180 / Math.PI));
  73035. }
  73036. function roundToDecimalPlace(number, decimalPlaces) {
  73037. var factor = Math.pow(10, decimalPlaces);
  73038. return Math.round(number * factor) / factor;
  73039. }
  73040. var CSS3DManager = /*#__PURE__*/function (_Emiter) {
  73041. _inherits(CSS3DManager, _Emiter);
  73042. var _super = _createSuper$k(CSS3DManager);
  73043. function CSS3DManager(app) {
  73044. var _this;
  73045. _classCallCheck(this, CSS3DManager);
  73046. _this = _super.call(this);
  73047. _this.bindEvents = function () {
  73048. // this.player.on('pointerStart', this.onMouseDown)
  73049. // this.player.on('pointerMove', this.onMouseMove)
  73050. // this.player.on('pointerUp', this.onMouseUp)
  73051. if (_this.isBind) return;
  73052. _this.player.on(PlayerEvents.ViewChanged, _this.update);
  73053. _this.player.on('flying.start', _this.onFlyStart.bind(_assertThisInitialized(_this)));
  73054. _this.player.on('flying.ended', _this.onFlyEnd.bind(_assertThisInitialized(_this))); // this.player.model.transformControls.addEventListener('mouseUp', this.finishUpdateClipBox)
  73055. _this.isBind = true;
  73056. };
  73057. _this.unBindEvents = function () {
  73058. // this.player.off('pointerStart', this.onMouseDown)
  73059. // this.player.off('pointerMove', this.onMouseMove)
  73060. // this.player.off('pointerUp', this.onMouseUp)
  73061. if (!_this.isBind) return;
  73062. _this.player.off(PlayerEvents.ViewChanged, _this.update);
  73063. _this.isBind = false;
  73064. };
  73065. _this.onFlyStart = function () {
  73066. _this.update();
  73067. };
  73068. _this.onFlyEnd = function () {
  73069. if (_this.isEdit) {
  73070. if (_this.player.mode === Viewmode$1.PANORAMA) {
  73071. _this.player.locked = true;
  73072. } else {
  73073. _this.player.locked = false;
  73074. }
  73075. }
  73076. _this.update();
  73077. };
  73078. _this.switchTransformControlsMode = function (mode) {
  73079. if (parseInt(mode) == 0) mode = 'translate';
  73080. if (parseInt(mode) == 1) mode = 'rotate';
  73081. if (parseInt(mode) == 2) mode = 'scale';
  73082. _this.player.model.transformControls.mode = mode;
  73083. };
  73084. _this.update = function () {
  73085. // console.log('update')
  73086. _this.list.forEach(function (i) {
  73087. i.update();
  73088. });
  73089. };
  73090. _this.show = function (sid) {
  73091. _this.waitInit(function () {
  73092. var obj = _this.getObjBySid(sid);
  73093. if (!obj) {
  73094. console.error('cssObject no found sid=' + sid);
  73095. return;
  73096. }
  73097. obj.enabled = true;
  73098. obj.visible = true;
  73099. if (_this.isEdit) {
  73100. _this.player.model.transformControls.visible = true;
  73101. }
  73102. }, _this.show.bind(_assertThisInitialized(_this), sid));
  73103. };
  73104. _this.hide = function (sid) {
  73105. _this.waitInit(function () {
  73106. var obj = _this.getObjBySid(sid);
  73107. if (!obj) {
  73108. console.error('cssObject no found sid=' + sid);
  73109. return;
  73110. }
  73111. obj.enabled = false;
  73112. obj.visible = false;
  73113. if (_this.isEdit) {
  73114. // this.player.model.transformControls.enabled = false
  73115. _this.player.model.transformControls.visible = false;
  73116. }
  73117. }, _this.hide.bind(_assertThisInitialized(_this), sid));
  73118. };
  73119. _this.showAll = function (current) {
  73120. var currentPano;
  73121. if (current) currentPano = _this.player.currentPano;
  73122. _this.list.forEach(function (i) {
  73123. if (current && currentPano) {
  73124. i.panoId === currentPano.id && (i.visible = true);
  73125. } else {
  73126. i.tempHide = false;
  73127. i.visible = true;
  73128. }
  73129. });
  73130. _this.update();
  73131. };
  73132. _this.hideAll = function () {
  73133. // this.group.visible = false //无效
  73134. _this.list.forEach(function (i) {
  73135. i.tempHide = true;
  73136. i.visible = false;
  73137. });
  73138. console.log('hideAll');
  73139. _this.update();
  73140. };
  73141. _this.sendData = function () {
  73142. if (!_this.isEdit) return;
  73143. var plane = _this.player.model.transformControls.object;
  73144. var obj = plane.css3dObj;
  73145. plane.scale.x = Math.min(settings.maxWidth / 100, plane.scale.x);
  73146. plane.scale.y = Math.min(settings.maxHeight / 100, plane.scale.y);
  73147. plane.scale.x = Math.max(40 / 100, plane.scale.x);
  73148. plane.scale.y = Math.max(40 / 100, plane.scale.y);
  73149. var data = {
  73150. sid: obj.sid,
  73151. position: {
  73152. x: roundToDecimalPlace(obj.position.x, 2),
  73153. y: roundToDecimalPlace(obj.position.y, 2),
  73154. z: roundToDecimalPlace(obj.position.z, 2)
  73155. },
  73156. scale: {
  73157. x: obj.widthHeight.x,
  73158. y: obj.widthHeight.y
  73159. },
  73160. rotation: {
  73161. x: RadTodeg(obj.rotation.x),
  73162. y: RadTodeg(obj.rotation.y),
  73163. z: RadTodeg(obj.rotation.z)
  73164. },
  73165. panoId: obj.panoId,
  73166. visible: obj.enabled,
  73167. text: obj.text
  73168. };
  73169. _this.emit('css3dmanager_sendData', data);
  73170. };
  73171. _this.setEditStyle = function (obj, isEnter) {
  73172. if (isEnter) {
  73173. _this.player.model.transformControls.attach(obj.plane);
  73174. if (!obj.enabled) {
  73175. _this.player.model.transformControls.visible = false;
  73176. }
  73177. obj.element.style.opacity = 0.5;
  73178. obj.element.style.pointerEvents = 'none';
  73179. obj.element.firstChild.style.pointerEvents = 'none';
  73180. } else {
  73181. _this.player.model.transformControls.detach();
  73182. obj.element.style.opacity = 1;
  73183. obj.element.style.pointerEvents = 'auto';
  73184. obj.element.firstChild.style.pointerEvents = 'auto';
  73185. }
  73186. };
  73187. _this.app = app;
  73188. _this.player = null;
  73189. _this.deferred = Deferred$1();
  73190. _this.renderer = new CSS3DRenderer();
  73191. _this.group = new THREE.Group();
  73192. _this.group.name = 'css3D_Object_Group';
  73193. _this.list = [];
  73194. _this.intrArr = [];
  73195. _this.mouse = new THREE.Vector3();
  73196. _this.mousedown = new THREE.Vector3();
  73197. _this.mouseup = new THREE.Vector3();
  73198. _this.inited = false;
  73199. _this.isBind = false;
  73200. _this.isEdit = false;
  73201. _this.renderInited = false;
  73202. _this.recoverStack = null; // 初始化
  73203. _this.init = function (metadata) {
  73204. if (metadata) {
  73205. metadata.forEach(function (i) {
  73206. _this.build(i);
  73207. });
  73208. }
  73209. _this.inited = true;
  73210. _this.deferred.resolve(); // this.enterModule()
  73211. };
  73212. _this.addRenderer = function () {
  73213. _this.player.model.add(_this.group);
  73214. var sceneRenderer = _this.app.core.get('SceneRenderer');
  73215. sceneRenderer.css3dRenderer = _this.renderer;
  73216. _this.renderer.domElement.style.position = 'absolute';
  73217. _this.renderer.domElement.style.top = 0;
  73218. _this.renderer.domElement.style.zIndex = 10000;
  73219. _this.renderer.domElement.style.pointerEvents = 'none';
  73220. _this.renderer.setSize(sceneRenderer.renderWidth, sceneRenderer.renderHeight);
  73221. var domElement = _this.app.dom.querySelector('.player'); // let domElement = this.app.dom
  73222. domElement.appendChild(_this.renderer.domElement); // console.log(this.renderer.domElement)
  73223. _this.bindEvents();
  73224. _this.renderInited = true;
  73225. };
  73226. _this.removeRenderer = function () {
  73227. _this.recoverStack.obj.removeFromParent();
  73228. _this.recoverStack.obj.plane.removeFromParent();
  73229. var index = _this.list.indexOf(_this.recoverStack.obj);
  73230. _this.list.splice(index, 1);
  73231. index = _this.intrArr.indexOf(_this.recoverStack.obj.plane);
  73232. _this.intrArr.splice(index, 1);
  73233. };
  73234. _this.app.Scene.on('loaded', function () {
  73235. setTimeout(function () {
  73236. _this.player = _this.app.core.get('Player'); //获取metadata
  73237. var metadata = null; // let metadata = [
  73238. // {
  73239. // sid: '123123123',
  73240. // position: { x: -16, y: 0, z: 5 },
  73241. // rotation: { x: 0, y: -90, z: 0 },
  73242. // scale: { x: 233, y: 233 },
  73243. // text: '你好',
  73244. // },
  73245. // ]
  73246. _this.init(metadata);
  73247. console.log('css3dManager init finish');
  73248. }, 50);
  73249. }); // 进入编辑
  73250. _this.enterEdit = function (sid) {
  73251. var isNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  73252. _this.waitInit(function () {
  73253. var obj = _this.getObjBySid(sid);
  73254. if (!obj) {
  73255. console.error('cssObject no found sid=' + sid);
  73256. return;
  73257. }
  73258. _this.setEditStyle(obj, true); //transformControls
  73259. _this.player.model.transformControls.switchEditState('css3dpanel');
  73260. _this.player.model.transformControls.addEventListener('mousing', _this.sendData);
  73261. _this.isEdit = true;
  73262. _this.flyAndLookAt(obj, true);
  73263. if (sid.isCSS3DObject) sid = sid.sid;
  73264. var data = {
  73265. sid,
  73266. position: {
  73267. x: obj.position.x,
  73268. y: obj.position.y,
  73269. z: obj.position.z
  73270. },
  73271. scale: {
  73272. x: obj.widthHeight.x,
  73273. y: obj.widthHeight.y
  73274. },
  73275. rotation: {
  73276. x: RadTodeg(obj.rotation.x),
  73277. y: RadTodeg(obj.rotation.y),
  73278. z: RadTodeg(obj.rotation.z)
  73279. },
  73280. visible: obj.enabled,
  73281. text: obj.text,
  73282. panoId: obj.panoId
  73283. };
  73284. _this.emit('css3dmanager_sendData', data);
  73285. _this.recoverStack = {
  73286. obj,
  73287. isNew,
  73288. position: {
  73289. x: obj.position.x,
  73290. y: obj.position.y,
  73291. z: obj.position.z
  73292. },
  73293. scale: {
  73294. x: obj.widthHeight.x,
  73295. y: obj.widthHeight.y
  73296. },
  73297. rotation: {
  73298. x: RadTodeg(obj.rotation.x),
  73299. y: RadTodeg(obj.rotation.y),
  73300. z: RadTodeg(obj.rotation.z)
  73301. },
  73302. enabled: obj.enabled,
  73303. panoId: obj.panoId
  73304. };
  73305. console.log('recoverStack =>', _this.recoverStack);
  73306. }, _this.enterEdit.bind(_assertThisInitialized(_this), sid));
  73307. }; // //离开模块
  73308. _this.leaveEdit = function (obj) {
  73309. _this.setEditStyle(obj, false);
  73310. _this.player.model.transformControls.removeEventListener('mousing', _this.sendData);
  73311. };
  73312. _this.build = function (data, isNew) {
  73313. if (data.panoId === undefined || data.panoId === null) return;
  73314. _this.waitInit(function () {
  73315. console.log('--------------build----------------');
  73316. console.log(data);
  73317. if (!_this.renderInited) _this.addRenderer();
  73318. var position = data.position.isVector3 ? data.position : new THREE.Vector3(data.position.x, data.position.y, data.position.z);
  73319. var scale = data.scale;
  73320. var rotation = data.position.isEuler ? data.rotation : new THREE.Euler(degToRad(data.rotation.x), degToRad(data.rotation.y), degToRad(data.rotation.z));
  73321. var text = data.text;
  73322. var domEle = document.createElement('div');
  73323. var domBox = document.createElement('div');
  73324. domBox.classList.add('domBox');
  73325. domBox.innerText = text;
  73326. domEle.append(domBox);
  73327. var domEleObj = new CSS3DEleObj(domEle, {
  73328. player: _this.player,
  73329. manager: _assertThisInitialized(_this),
  73330. sid: data.sid,
  73331. text: text,
  73332. position: position,
  73333. rotation: rotation,
  73334. renderRes: settings.renderRes,
  73335. scaleRes: settings.scale,
  73336. widthHeight: scale,
  73337. visible: data.visible,
  73338. panoId: data.panoId
  73339. });
  73340. _this.group.add(domEleObj);
  73341. _this.group.add(domEleObj.plane);
  73342. _this.list.push(domEleObj);
  73343. _this.intrArr.push(domEleObj.plane);
  73344. if (data.cameraPos) {
  73345. domEleObj.plane.lookAt(data.cameraPos);
  73346. }
  73347. domEleObj.update();
  73348. if (isNew) {
  73349. _this.waitCSS3DObjInit(domEleObj);
  73350. } // setTimeout(() => {
  73351. // if (scale) {
  73352. // domBox.style.width = scale.x + 'px'
  73353. // domBox.style.height = scale.y + 'px'
  73354. // } else {
  73355. // let x = domBox.offsetWidth
  73356. // let y = domBox.offsetHeight
  73357. // x = x === settings.maxWidth ? x : x - 40
  73358. // y = y === settings.maxHeight ? y : y - 40
  73359. // scale = { x, y }
  73360. // }
  73361. // domEleObj.widthHeight = scale
  73362. // }, 100)
  73363. }, _this.build.bind(_assertThisInitialized(_this), data));
  73364. };
  73365. _this.add = function (data) {
  73366. var camera = _this.player.cameraControls.cameras['panorama'];
  73367. var cameraPos = camera.position;
  73368. var lookAt = new THREE.Vector3();
  73369. camera.getWorldDirection(lookAt);
  73370. var position = cameraPos.clone().add(lookAt);
  73371. position.x = roundToDecimalPlace(position.x, 2);
  73372. position.y = roundToDecimalPlace(position.y, 2);
  73373. position.z = roundToDecimalPlace(position.z, 2);
  73374. var rotation = new THREE.Euler(0, -Math.PI / 2, 0);
  73375. _this.build({
  73376. sid: data.sid,
  73377. position,
  73378. rotation,
  73379. text: data.text,
  73380. visible: true,
  73381. cameraPos,
  73382. panoId: _this.player.currentPano.id
  73383. }, true);
  73384. };
  73385. _this.resetOption = function (sid) {
  73386. _this.waitInit(function () {
  73387. var func = function func() {
  73388. var obj = _this.getObjBySid(sid);
  73389. if (!obj) {
  73390. console.error('cssObject no found sid=' + sid);
  73391. return;
  73392. }
  73393. _this.recoverStack = {
  73394. obj,
  73395. isNew: false,
  73396. position: {
  73397. x: obj.position.x,
  73398. y: obj.position.y,
  73399. z: obj.position.z
  73400. },
  73401. scale: {
  73402. x: obj.widthHeight.x,
  73403. y: obj.widthHeight.y
  73404. },
  73405. rotation: {
  73406. x: RadTodeg(obj.rotation.x),
  73407. y: RadTodeg(obj.rotation.y),
  73408. z: RadTodeg(obj.rotation.z)
  73409. },
  73410. panoId: obj.panoId,
  73411. enabled: obj.enabled
  73412. };
  73413. _this.isEdit = true;
  73414. _this.setEditStyle(obj, true);
  73415. _this.player.model.transformControls.switchEditState('css3dpanel');
  73416. _this.player.model.transformControls.addEventListener('mousing', _this.sendData);
  73417. _this.player.locked = true;
  73418. var camera = _this.player.cameraControls.cameras['panorama'];
  73419. var cameraPos = camera.position;
  73420. var lookAt = new THREE.Vector3();
  73421. camera.getWorldDirection(lookAt);
  73422. var position = cameraPos.clone().add(lookAt);
  73423. position.x = roundToDecimalPlace(position.x, 2);
  73424. position.y = roundToDecimalPlace(position.y, 2);
  73425. position.z = roundToDecimalPlace(position.z, 2);
  73426. var panoId = _this.player.currentPano.id;
  73427. obj.position.copy(position);
  73428. obj.panoId = panoId;
  73429. obj.lookAt(camera.position);
  73430. obj.updatePlane();
  73431. obj.update();
  73432. var data = {
  73433. sid,
  73434. position: {
  73435. x: obj.position.x,
  73436. y: obj.position.y,
  73437. z: obj.position.z
  73438. },
  73439. scale: {
  73440. x: obj.widthHeight.x,
  73441. y: obj.widthHeight.y
  73442. },
  73443. rotation: {
  73444. x: RadTodeg(obj.rotation.x),
  73445. y: RadTodeg(obj.rotation.y),
  73446. z: RadTodeg(obj.rotation.z)
  73447. },
  73448. panoId: obj.panoId,
  73449. visible: obj.enabled,
  73450. text: obj.text
  73451. };
  73452. _this.emit('css3dmanager_sendData', data);
  73453. };
  73454. if (_this.player.mode !== Viewmode$1.PANORAMA) {
  73455. _this.player.insideMode();
  73456. _this.player.once('flying.ended', func.bind(_assertThisInitialized(_this)));
  73457. } else {
  73458. func();
  73459. }
  73460. }, _this.resetOption.bind(_assertThisInitialized(_this), sid));
  73461. };
  73462. _this.updateList = function (list) {
  73463. _this.waitInit(function () {
  73464. if (_this.isEdit) return;
  73465. if (!list || list.length <= 0) return;
  73466. list.forEach(function (data) {
  73467. var obj = _this.getObjBySid(data.sid);
  73468. if (!obj) {
  73469. _this.build(data);
  73470. } else {
  73471. if (obj.text !== data.text) {
  73472. console.log(obj.sid + '=> text udpate');
  73473. _this.setText(obj, data.text);
  73474. }
  73475. if (obj.position.x !== data.position.x || obj.position.y !== data.position.y || obj.position.z !== data.position.z) {
  73476. console.log(obj.sid + '=> position udpate');
  73477. _this.setPosition(obj, data.position);
  73478. }
  73479. 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) {
  73480. console.log(obj.sid + '=> rotation udpate');
  73481. _this.setRotation(obj, data.rotation);
  73482. }
  73483. if (obj.widthHeight.x !== data.scale.x || obj.widthHeight.y !== data.scale.y) {
  73484. console.log(obj.sid + '=> scale udpate');
  73485. _this.setScale(obj, data.scale);
  73486. }
  73487. if (obj.enabled !== data.visible) {
  73488. console.log(obj, obj.enabled, data.visible);
  73489. console.log(obj.sid + '=> visible udpate');
  73490. obj.enabled = data.visible; // obj.visible = data.visible
  73491. }
  73492. }
  73493. });
  73494. }, _this.updateList.bind(_assertThisInitialized(_this), list));
  73495. };
  73496. _this.setText = function (sid, text) {
  73497. var obj = _this.getObjBySid(sid);
  73498. if (!obj) {
  73499. console.error('cssObject no found sid=' + sid);
  73500. return;
  73501. }
  73502. obj.element.children[0].innerText = text;
  73503. obj.text = text;
  73504. };
  73505. _this.setPosition = function (sid, position) {
  73506. var obj = _this.getObjBySid(sid);
  73507. if (!obj) {
  73508. console.error('cssObject no found sid=' + sid);
  73509. return;
  73510. }
  73511. var p = new THREE.Vector3(position.x, position.y, position.z);
  73512. obj.position.copy(p);
  73513. obj.updatePlane();
  73514. };
  73515. _this.setRotation = function (sid, rotation) {
  73516. var obj = _this.getObjBySid(sid);
  73517. if (!obj) {
  73518. console.error('cssObject no found sid=' + sid);
  73519. return;
  73520. }
  73521. var r = new THREE.Euler(degToRad(rotation.x), degToRad(rotation.y), degToRad(rotation.z));
  73522. obj.rotation.copy(r);
  73523. obj.updatePlane();
  73524. };
  73525. _this.setScale = function (sid, scale) {
  73526. var obj = _this.getObjBySid(sid);
  73527. if (!obj) {
  73528. console.error('cssObject no found sid=' + sid);
  73529. return;
  73530. }
  73531. var elem = obj.element.children[0];
  73532. elem.style.width = scale.x + 'px';
  73533. elem.style.height = scale.y + 'px';
  73534. obj.widthHeight = {
  73535. x: scale.x,
  73536. y: scale.y
  73537. };
  73538. if (scale.x > settings.maxWidth) {
  73539. elem.style.maxWidth = 'none';
  73540. } else {
  73541. elem.style.maxWidth = settings.maxWidth + 'px';
  73542. }
  73543. if (scale.y > settings.maxHeight) {
  73544. elem.style.maxHeight = 'none';
  73545. } else {
  73546. elem.style.maxHeight = settings.maxHeight + 'px';
  73547. }
  73548. obj.updatePlane();
  73549. };
  73550. _this.getObjBySid = function (sid) {
  73551. var obj = null;
  73552. if (sid.isCSS3DObject) {
  73553. obj = sid;
  73554. } else {
  73555. for (var i = 0; i < _this.list.length; i++) {
  73556. if (_this.list[i].sid === sid) {
  73557. obj = _this.list[i];
  73558. break;
  73559. }
  73560. }
  73561. }
  73562. return obj;
  73563. };
  73564. _this.flyAndLookAt = function (sid, enterEdit) {
  73565. var obj = _this.getObjBySid(sid);
  73566. if (!obj) {
  73567. console.error('cssObject no found sid=' + sid);
  73568. return;
  73569. }
  73570. if (obj.panoId === undefined) {
  73571. console.error('cssObject.panoId no found sid=' + sid);
  73572. return;
  73573. }
  73574. var currentPanoId = _this.player.currentPano.id;
  73575. _this.player.flyToPano({
  73576. pano: _this.app.Scene.panos.index[obj.panoId],
  73577. lookAtPoint: obj.position,
  73578. checkAlone: true
  73579. });
  73580. if (enterEdit && currentPanoId === obj.panoId) {
  73581. _this.player.locked = true;
  73582. }
  73583. }; // //删除
  73584. // this.delete = () => {}
  73585. // //清空
  73586. // this.clear = () => {}
  73587. //保存编辑
  73588. _this.saveEdit = function () {
  73589. if (!_this.isEdit) return;
  73590. _this.leaveEdit(_this.recoverStack.obj);
  73591. _this.recoverStack = null;
  73592. _this.isEdit = false;
  73593. _this.player.locked = false;
  73594. _this.update();
  73595. }; //退出编辑
  73596. _this.cancelEdit = function () {
  73597. if (!_this.isEdit) return;
  73598. console.log(_this.recoverStack);
  73599. _this.leaveEdit(_this.recoverStack.obj);
  73600. if (_this.recoverStack.isNew) {
  73601. _this.removeRenderer();
  73602. return;
  73603. }
  73604. _this.setPosition(_this.recoverStack.obj, _this.recoverStack.position);
  73605. _this.setRotation(_this.recoverStack.obj, _this.recoverStack.rotation);
  73606. _this.setScale(_this.recoverStack.obj, _this.recoverStack.scale);
  73607. _this.recoverStack.obj.enabled = _this.recoverStack.enabled;
  73608. _this.recoverStack.obj.panoId = _this.recoverStack.panoId; // this.recoverStack.obj.visible = this.recoverStack.visible
  73609. _this.recoverStack = null;
  73610. _this.isEdit = false;
  73611. _this.player.locked = false;
  73612. _this.update();
  73613. };
  73614. return _this;
  73615. } //事件绑定
  73616. _createClass(CSS3DManager, [{
  73617. key: "waitInit",
  73618. value: //等待初始化
  73619. function waitInit(func, waitFunc) {
  73620. if (this.inited) {
  73621. func && func();
  73622. } else {
  73623. this.deferred.then(function () {
  73624. return waitFunc();
  73625. });
  73626. }
  73627. }
  73628. }, {
  73629. key: "waitCSS3DObjInit",
  73630. value: function waitCSS3DObjInit(obj) {
  73631. var _this2 = this;
  73632. if (obj.widthHeight.x !== 0 && obj.widthHeight.y !== 0) {
  73633. this.enterEdit(obj, true);
  73634. } else {
  73635. setTimeout(function () {
  73636. obj.update();
  73637. _this2.waitCSS3DObjInit(obj);
  73638. }, 50);
  73639. }
  73640. }
  73641. }]);
  73642. return CSS3DManager;
  73643. }(tinyEmitter);
  73644. 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); }; }
  73645. 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; } }
  73646. var ScaleZoom$1 = 1;
  73647. var size$1 = 0.012;
  73648. var Point = /*#__PURE__*/function (_THREE$Sprite) {
  73649. _inherits(Point, _THREE$Sprite);
  73650. var _super = _createSuper$j(Point);
  73651. function Point(color, adding) {
  73652. var _this;
  73653. _classCallCheck(this, Point);
  73654. var data = new Uint8Array([255, 255, 255, 255]);
  73655. var map = new THREE.DataTexture(data, 1, 1);
  73656. map.needsUpdate = true;
  73657. var material = new THREE.SpriteMaterial({
  73658. transparent: true,
  73659. sizeAttenuation: false,
  73660. color: color,
  73661. map: map
  73662. });
  73663. var customUniforms = {
  73664. state: {
  73665. value: adding ? 2 : 0
  73666. }
  73667. };
  73668. material.onBeforeCompile = function (shader) {
  73669. shader.uniforms.state = customUniforms.state;
  73670. shader.fragmentShader = shader.fragmentShader.replace('#include <uv_pars_fragment>', "\n #include <uv_pars_fragment>\n \n uniform int state;\n ");
  73671. 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 \n if (state > 0) {\n vec3 base = state == 1 ? diffuseColor.rgb : vec3(0.0, 0.48235294117647, 1.0); \n float outline = 1.0 - smoothstep(0.15, 0.3, distance(vUv, vec2(0.5))); \n col = mix(base, vec3(1.0, 1.0, 1.0), outline);\n }\n \n gl_FragColor = vec4(col, diffuseColor.a);\n ");
  73672. };
  73673. material.depthFunc = THREE.AlwaysDepth;
  73674. _this = _super.call(this, material);
  73675. _this.uniforms = customUniforms;
  73676. _this.color = color;
  73677. _this.scale.set(size$1, size$1, 1);
  73678. _this.renderOrder = RenderOrder.monitorPlane;
  73679. _this.setScale(null, false);
  73680. _this.isPolygonMarkElement = true;
  73681. _this.isPolygonMarkPoint = true;
  73682. return _this;
  73683. }
  73684. _createClass(Point, [{
  73685. key: "setPosition",
  73686. value: function setPosition(pos) {
  73687. this.position.copy(pos);
  73688. }
  73689. }, {
  73690. key: "setScale",
  73691. value: function setScale(zoom) {
  73692. var fromZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  73693. var t;
  73694. if (zoom) {
  73695. t = 0.012 * (1 / zoom);
  73696. if (fromZoom) ScaleZoom$1 = zoom;
  73697. } else {
  73698. t = 0.012 * (1 / ScaleZoom$1);
  73699. }
  73700. this.scale.set(t, t, t);
  73701. }
  73702. }, {
  73703. key: "setColor",
  73704. value: function setColor(color) {
  73705. var cover = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  73706. this.material.color.set(color);
  73707. cover && (this.color = color);
  73708. }
  73709. }, {
  73710. key: "highLight",
  73711. value: function highLight() {
  73712. this.uniforms.state.value = 1;
  73713. this.visible = true;
  73714. }
  73715. }, {
  73716. key: "midLight",
  73717. value: function midLight() {
  73718. this.uniforms.state.value = 0;
  73719. this.visible = true;
  73720. }
  73721. }, {
  73722. key: "lowLight",
  73723. value: function lowLight() {
  73724. this.uniforms.state.value = 0;
  73725. this.visible = false;
  73726. }
  73727. }]);
  73728. return Point;
  73729. }(THREE.Sprite);
  73730. 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); }; }
  73731. 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; } }
  73732. var activeColor = Colors.mainColor; //0x007BFF //0x00c8af
  73733. var dashedMat = LineDraw.createFatLineMat({
  73734. lineWidth: 2,
  73735. color: activeColor,
  73736. dashSize: 0.03,
  73737. gapSize: 0.03,
  73738. dashed: true
  73739. /*, alwaysShow: true*/
  73740. });
  73741. var activeMat = LineDraw.createFatLineMat({
  73742. lineWidth: 2,
  73743. color: activeColor
  73744. /*, alwaysShow: true*/
  73745. });
  73746. var Line = /*#__PURE__*/function (_THREE$Group) {
  73747. _inherits(Line, _THREE$Group);
  73748. var _super = _createSuper$i(Line);
  73749. function Line(points, lineMat) {
  73750. var _this;
  73751. _classCallCheck(this, Line);
  73752. // let normalMaterial = new THREE.LineBasicMaterial({ //默认 normal
  73753. // color: color,
  73754. // depthFunc: THREE.AlwaysDepth
  73755. // })
  73756. // let activeMaterial = new THREE.LineBasicMaterial({ //激活 active
  73757. // color: 0x00C8AF,
  73758. // depthFunc: THREE.AlwaysDepth
  73759. // })
  73760. // let dashedMaterial = new THREE.LineDashedMaterial({ //虚线 dashed
  73761. // color: 0x00C8AF,
  73762. // dashSize: 0.01,
  73763. // gapSize: 0.01,
  73764. // scale: 1,
  73765. // depthFunc: THREE.AlwaysDepth
  73766. // })
  73767. // const geometry = new THREE.BufferGeometry().setFromPoints(points)
  73768. // super(geometry, dashedMaterial)
  73769. // this.normalMaterial = normalMaterial
  73770. // this.activeMaterial = activeMaterial
  73771. // this.dashedMaterial = dashedMaterial
  73772. // this.frustumCulled = false
  73773. // this.renderOrder = RenderOrder.entryArrow
  73774. // this.isPolygonMarkElement = true
  73775. // this.startPoint = points[0]
  73776. // this.line = LineDraw.createFatLine(points, { material: lineMat })
  73777. // this.line.renderOrder = RenderOrder.entryArrow
  73778. // console.log(this.line)
  73779. // this.add(this.line)
  73780. _this = _super.call(this);
  73781. _this.line = LineDraw.createFatLine(points, {
  73782. material: lineMat
  73783. });
  73784. _this.line.renderOrder = RenderOrder.entryArrow;
  73785. _this.normalMaterial = lineMat;
  73786. _this.startPoint = points[0];
  73787. _this.add(_this.line);
  73788. return _this;
  73789. }
  73790. _createClass(Line, [{
  73791. key: "setMaterial",
  73792. value: function setMaterial(type) {
  73793. switch (type) {
  73794. case 'normal':
  73795. this.line.material = this.normalMaterial;
  73796. break;
  73797. case 'active':
  73798. this.line.material = activeMat;
  73799. break;
  73800. case 'dashed':
  73801. this.line.material = dashedMat;
  73802. break;
  73803. }
  73804. }
  73805. }, {
  73806. key: "update",
  73807. value: function update(pos) {
  73808. LineDraw.moveFatLine(this.line, [this.startPoint, pos]);
  73809. }
  73810. }]);
  73811. return Line;
  73812. }(THREE.Group);
  73813. 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); }; }
  73814. 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; } }
  73815. /* var activeColor = 0x00c8af
  73816. var activeMat = LineDraw.createFatLineMat({ lineWidth: 2, color: activeColor })
  73817. */
  73818. var LineLoop = /*#__PURE__*/function (_THREE$Group) {
  73819. _inherits(LineLoop, _THREE$Group);
  73820. var _super = _createSuper$h(LineLoop);
  73821. function LineLoop(points, lineMat, activeLineMat) {
  73822. var _this;
  73823. _classCallCheck(this, LineLoop);
  73824. _this = _super.call(this);
  73825. var p = points[0].clone();
  73826. p = points.concat([p]);
  73827. var material = new THREE.LineBasicMaterial({
  73828. color: 0xffffff // opacity: 0,
  73829. // transparent: true
  73830. });
  73831. for (var i = 0; i < p.length - 1; i++) {
  73832. var temp = [p[i], p[i + 1]];
  73833. var geometry = new THREE.BufferGeometry().setFromPoints(temp);
  73834. var line = new THREE.Line(geometry, material);
  73835. line.isPolygonMarkElement = true;
  73836. line.isPolygonMarkLine = true;
  73837. line.startPoint = i; // line.endPoint = i+1
  73838. _this.add(line);
  73839. }
  73840. _this.fatLine = LineDraw.createFatLine(p, {
  73841. material: lineMat
  73842. });
  73843. _this.fatLine.renderOrder = RenderOrder.entryArrow;
  73844. _this.normalMaterial = lineMat;
  73845. _this.activeMatarial = activeLineMat;
  73846. _this.isPolygonMarkElement = true;
  73847. _this.isPolygonMarkLineLoop = true;
  73848. _this.add(_this.fatLine);
  73849. return _this;
  73850. }
  73851. _createClass(LineLoop, [{
  73852. key: "setColor",
  73853. value: function setColor(color) {
  73854. this.normalMaterial.color.set(color);
  73855. }
  73856. }, {
  73857. key: "highLight",
  73858. value: function highLight() {
  73859. this.fatLine.material = this.activeMatarial;
  73860. }
  73861. }, {
  73862. key: "midLight",
  73863. value: function midLight() {
  73864. this.fatLine.material = this.normalMaterial;
  73865. }
  73866. }, {
  73867. key: "lowLight",
  73868. value: function lowLight() {
  73869. this.fatLine.material = this.normalMaterial;
  73870. }
  73871. }]);
  73872. return LineLoop;
  73873. }(THREE.Group);
  73874. 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); }; }
  73875. 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; } }
  73876. var opa = 0.3;
  73877. var Shape = /*#__PURE__*/function (_THREE$Mesh) {
  73878. _inherits(Shape, _THREE$Mesh);
  73879. var _super = _createSuper$g(Shape);
  73880. //多边形面
  73881. function Shape(v) {
  73882. var _this;
  73883. var i = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [0, 1, 2];
  73884. var color = arguments.length > 2 ? arguments[2] : undefined;
  73885. _classCallCheck(this, Shape);
  73886. var material = new THREE.MeshBasicMaterial({
  73887. color: color,
  73888. transparent: true,
  73889. // wireframe: true,
  73890. opacity: opa,
  73891. side: THREE.DoubleSide
  73892. });
  73893. material.depthFunc = THREE.AlwaysDepth;
  73894. var geometry = new THREE.BufferGeometry();
  73895. var vertices = new Float32Array(v);
  73896. var indexes = i;
  73897. geometry.setIndex(indexes);
  73898. geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
  73899. _this = _super.call(this, geometry, material);
  73900. _this.frustumCulled = false;
  73901. _this.renderOrder = RenderOrder.entryArrow;
  73902. _this.visible = false;
  73903. _this.isPolygonMarkElement = true;
  73904. _this.active = 0;
  73905. return _this;
  73906. }
  73907. _createClass(Shape, [{
  73908. key: "highLight",
  73909. value: function highLight() {
  73910. this.selected = true;
  73911. common$1.updateVisible(this, 'highlight', true); //if(!this.flashing) this.material.opacity = this.opacity2 == void 0 ? opa || opa //THREE.MathUtils.clamp((this.opacity2 || opa) + 0.3, 0.4, 0.95)
  73912. }
  73913. }, {
  73914. key: "midLight",
  73915. value: function midLight() {
  73916. common$1.updateVisible(this, 'highlight', false);
  73917. }
  73918. }, {
  73919. key: "lowLight",
  73920. value: function lowLight() {
  73921. this.selected = false;
  73922. common$1.updateVisible(this, 'highlight', false); //if(!this.flashing) this.material.opacity = this.opacity2 == void 0 ? opa : this.opacity2
  73923. }
  73924. }, {
  73925. key: "setColor",
  73926. value: function setColor(color) {
  73927. //xzw add
  73928. this.material.color.set(color);
  73929. }
  73930. }, {
  73931. key: "setDisplay",
  73932. value: function setDisplay(color, opacity, flashing) {
  73933. //新功能 闪烁 xzw
  73934. common$1.updateVisible(this, 'display', flashing, 1, flashing ? 'add' : 'cancel');
  73935. this.flashing = flashing;
  73936. if (!flashing) {
  73937. this.selected ? this.highLight() : this.lowLight();
  73938. }
  73939. color != void 0 && this.setColor(color);
  73940. opacity != void 0 && (this.opacity2 = this.material.opacity = opacity);
  73941. }
  73942. }]);
  73943. return Shape;
  73944. }(THREE.Mesh);
  73945. /**
  73946. * Port from https://github.com/mapbox/earcut (v2.2.4)
  73947. */
  73948. var Earcut = {
  73949. triangulate: function triangulate(data, holeIndices) {
  73950. var dim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
  73951. var hasHoles = holeIndices && holeIndices.length;
  73952. var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
  73953. var outerNode = linkedList(data, 0, outerLen, dim, true);
  73954. var triangles = [];
  73955. if (!outerNode || outerNode.next === outerNode.prev) return triangles;
  73956. var minX, minY, maxX, maxY, x, y, invSize;
  73957. 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
  73958. if (data.length > 80 * dim) {
  73959. minX = maxX = data[0];
  73960. minY = maxY = data[1];
  73961. for (var i = dim; i < outerLen; i += dim) {
  73962. x = data[i];
  73963. y = data[i + 1];
  73964. if (x < minX) minX = x;
  73965. if (y < minY) minY = y;
  73966. if (x > maxX) maxX = x;
  73967. if (y > maxY) maxY = y;
  73968. } // minX, minY and invSize are later used to transform coords into integers for z-order calculation
  73969. invSize = Math.max(maxX - minX, maxY - minY);
  73970. invSize = invSize !== 0 ? 32767 / invSize : 0;
  73971. }
  73972. earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);
  73973. return triangles;
  73974. }
  73975. }; // create a circular doubly linked list from polygon points in the specified winding order
  73976. function linkedList(data, start, end, dim, clockwise) {
  73977. var i, last;
  73978. if (clockwise === signedArea(data, start, end, dim) > 0) {
  73979. for (i = start; i < end; i += dim) {
  73980. last = insertNode(i, data[i], data[i + 1], last);
  73981. }
  73982. } else {
  73983. for (i = end - dim; i >= start; i -= dim) {
  73984. last = insertNode(i, data[i], data[i + 1], last);
  73985. }
  73986. }
  73987. if (last && equals(last, last.next)) {
  73988. removeNode(last);
  73989. last = last.next;
  73990. }
  73991. return last;
  73992. } // eliminate colinear or duplicate points
  73993. function filterPoints(start, end) {
  73994. if (!start) return start;
  73995. if (!end) end = start;
  73996. var p = start,
  73997. again;
  73998. do {
  73999. again = false;
  74000. if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
  74001. removeNode(p);
  74002. p = end = p.prev;
  74003. if (p === p.next) break;
  74004. again = true;
  74005. } else {
  74006. p = p.next;
  74007. }
  74008. } while (again || p !== end);
  74009. return end;
  74010. } // main ear slicing loop which triangulates a polygon (given as a linked list)
  74011. function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
  74012. if (!ear) return; // interlink polygon nodes in z-order
  74013. if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
  74014. var stop = ear,
  74015. prev,
  74016. next; // iterate through ears, slicing them one by one
  74017. while (ear.prev !== ear.next) {
  74018. prev = ear.prev;
  74019. next = ear.next;
  74020. if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
  74021. // cut off the triangle
  74022. triangles.push(prev.i / dim | 0);
  74023. triangles.push(ear.i / dim | 0);
  74024. triangles.push(next.i / dim | 0);
  74025. removeNode(ear); // skipping the next vertex leads to less sliver triangles
  74026. ear = next.next;
  74027. stop = next.next;
  74028. continue;
  74029. }
  74030. ear = next; // if we looped through the whole remaining polygon and can't find any more ears
  74031. if (ear === stop) {
  74032. // try filtering points and slicing again
  74033. if (!pass) {
  74034. earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1); // if this didn't work, try curing all small self-intersections locally
  74035. } else if (pass === 1) {
  74036. ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
  74037. earcutLinked(ear, triangles, dim, minX, minY, invSize, 2); // as a last resort, try splitting the remaining polygon into two
  74038. } else if (pass === 2) {
  74039. splitEarcut(ear, triangles, dim, minX, minY, invSize);
  74040. }
  74041. break;
  74042. }
  74043. }
  74044. } // check whether a polygon node forms a valid ear with adjacent nodes
  74045. function isEar(ear) {
  74046. var a = ear.prev,
  74047. b = ear,
  74048. c = ear.next;
  74049. if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
  74050. // now make sure we don't have other points inside the potential ear
  74051. var ax = a.x,
  74052. bx = b.x,
  74053. cx = c.x,
  74054. ay = a.y,
  74055. by = b.y,
  74056. cy = c.y; // triangle bbox; min & max are calculated like this for speed
  74057. var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx,
  74058. y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy,
  74059. x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx,
  74060. y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy;
  74061. var p = c.next;
  74062. while (p !== a) {
  74063. 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;
  74064. p = p.next;
  74065. }
  74066. return true;
  74067. }
  74068. function isEarHashed(ear, minX, minY, invSize) {
  74069. var a = ear.prev,
  74070. b = ear,
  74071. c = ear.next;
  74072. if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
  74073. var ax = a.x,
  74074. bx = b.x,
  74075. cx = c.x,
  74076. ay = a.y,
  74077. by = b.y,
  74078. cy = c.y; // triangle bbox; min & max are calculated like this for speed
  74079. var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx,
  74080. y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy,
  74081. x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx,
  74082. y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy; // z-order range for the current triangle bbox;
  74083. var minZ = zOrder(x0, y0, minX, minY, invSize),
  74084. maxZ = zOrder(x1, y1, minX, minY, invSize);
  74085. var p = ear.prevZ,
  74086. n = ear.nextZ; // look for points inside the triangle in both directions
  74087. while (p && p.z >= minZ && n && n.z <= maxZ) {
  74088. 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;
  74089. p = p.prevZ;
  74090. 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;
  74091. n = n.nextZ;
  74092. } // look for remaining points in decreasing z-order
  74093. while (p && p.z >= minZ) {
  74094. 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;
  74095. p = p.prevZ;
  74096. } // look for remaining points in increasing z-order
  74097. while (n && n.z <= maxZ) {
  74098. 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;
  74099. n = n.nextZ;
  74100. }
  74101. return true;
  74102. } // go through all polygon nodes and cure small local self-intersections
  74103. function cureLocalIntersections(start, triangles, dim) {
  74104. var p = start;
  74105. do {
  74106. var a = p.prev,
  74107. b = p.next.next;
  74108. if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
  74109. triangles.push(a.i / dim | 0);
  74110. triangles.push(p.i / dim | 0);
  74111. triangles.push(b.i / dim | 0); // remove two nodes involved
  74112. removeNode(p);
  74113. removeNode(p.next);
  74114. p = start = b;
  74115. }
  74116. p = p.next;
  74117. } while (p !== start);
  74118. return filterPoints(p);
  74119. } // try splitting polygon into two and triangulate them independently
  74120. function splitEarcut(start, triangles, dim, minX, minY, invSize) {
  74121. // look for a valid diagonal that divides the polygon into two
  74122. var a = start;
  74123. do {
  74124. var b = a.next.next;
  74125. while (b !== a.prev) {
  74126. if (a.i !== b.i && isValidDiagonal(a, b)) {
  74127. // split the polygon in two by the diagonal
  74128. var c = splitPolygon(a, b); // filter colinear points around the cuts
  74129. a = filterPoints(a, a.next);
  74130. c = filterPoints(c, c.next); // run earcut on each half
  74131. earcutLinked(a, triangles, dim, minX, minY, invSize, 0);
  74132. earcutLinked(c, triangles, dim, minX, minY, invSize, 0);
  74133. return;
  74134. }
  74135. b = b.next;
  74136. }
  74137. a = a.next;
  74138. } while (a !== start);
  74139. } // link every hole into the outer loop, producing a single-ring polygon without holes
  74140. function eliminateHoles(data, holeIndices, outerNode, dim) {
  74141. var queue = [];
  74142. var i, len, start, end, list;
  74143. for (i = 0, len = holeIndices.length; i < len; i++) {
  74144. start = holeIndices[i] * dim;
  74145. end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
  74146. list = linkedList(data, start, end, dim, false);
  74147. if (list === list.next) list.steiner = true;
  74148. queue.push(getLeftmost(list));
  74149. }
  74150. queue.sort(compareX); // process holes from left to right
  74151. for (i = 0; i < queue.length; i++) {
  74152. outerNode = eliminateHole(queue[i], outerNode);
  74153. }
  74154. return outerNode;
  74155. }
  74156. function compareX(a, b) {
  74157. return a.x - b.x;
  74158. } // find a bridge between vertices that connects hole with an outer ring and link it
  74159. function eliminateHole(hole, outerNode) {
  74160. var bridge = findHoleBridge(hole, outerNode);
  74161. if (!bridge) {
  74162. return outerNode;
  74163. }
  74164. var bridgeReverse = splitPolygon(bridge, hole); // filter collinear points around the cuts
  74165. filterPoints(bridgeReverse, bridgeReverse.next);
  74166. return filterPoints(bridge, bridge.next);
  74167. } // David Eberly's algorithm for finding a bridge between hole and outer polygon
  74168. function findHoleBridge(hole, outerNode) {
  74169. var p = outerNode,
  74170. qx = -Infinity,
  74171. m;
  74172. var hx = hole.x,
  74173. hy = hole.y; // find a segment intersected by a ray from the hole's leftmost point to the left;
  74174. // segment's endpoint with lesser x will be potential connection point
  74175. do {
  74176. if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
  74177. var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
  74178. if (x <= hx && x > qx) {
  74179. qx = x;
  74180. m = p.x < p.next.x ? p : p.next;
  74181. if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint
  74182. }
  74183. }
  74184. p = p.next;
  74185. } while (p !== outerNode);
  74186. if (!m) return null; // look for points inside the triangle of hole point, segment intersection and endpoint;
  74187. // if there are no points found, we have a valid connection;
  74188. // otherwise choose the point of the minimum angle with the ray as connection point
  74189. var stop = m,
  74190. mx = m.x,
  74191. my = m.y;
  74192. var tanMin = Infinity,
  74193. tan;
  74194. p = m;
  74195. do {
  74196. 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)) {
  74197. tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
  74198. if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {
  74199. m = p;
  74200. tanMin = tan;
  74201. }
  74202. }
  74203. p = p.next;
  74204. } while (p !== stop);
  74205. return m;
  74206. } // whether sector in vertex m contains sector in vertex p in the same coordinates
  74207. function sectorContainsSector(m, p) {
  74208. return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
  74209. } // interlink polygon nodes in z-order
  74210. function indexCurve(start, minX, minY, invSize) {
  74211. var p = start;
  74212. do {
  74213. if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);
  74214. p.prevZ = p.prev;
  74215. p.nextZ = p.next;
  74216. p = p.next;
  74217. } while (p !== start);
  74218. p.prevZ.nextZ = null;
  74219. p.prevZ = null;
  74220. sortLinked(p);
  74221. } // Simon Tatham's linked list merge sort algorithm
  74222. // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
  74223. function sortLinked(list) {
  74224. var i,
  74225. p,
  74226. q,
  74227. e,
  74228. tail,
  74229. numMerges,
  74230. pSize,
  74231. qSize,
  74232. inSize = 1;
  74233. do {
  74234. p = list;
  74235. list = null;
  74236. tail = null;
  74237. numMerges = 0;
  74238. while (p) {
  74239. numMerges++;
  74240. q = p;
  74241. pSize = 0;
  74242. for (i = 0; i < inSize; i++) {
  74243. pSize++;
  74244. q = q.nextZ;
  74245. if (!q) break;
  74246. }
  74247. qSize = inSize;
  74248. while (pSize > 0 || qSize > 0 && q) {
  74249. if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
  74250. e = p;
  74251. p = p.nextZ;
  74252. pSize--;
  74253. } else {
  74254. e = q;
  74255. q = q.nextZ;
  74256. qSize--;
  74257. }
  74258. if (tail) tail.nextZ = e;else list = e;
  74259. e.prevZ = tail;
  74260. tail = e;
  74261. }
  74262. p = q;
  74263. }
  74264. tail.nextZ = null;
  74265. inSize *= 2;
  74266. } while (numMerges > 1);
  74267. return list;
  74268. } // z-order of a point given coords and inverse of the longer side of data bbox
  74269. function zOrder(x, y, minX, minY, invSize) {
  74270. // coords are transformed into non-negative 15-bit integer range
  74271. x = (x - minX) * invSize | 0;
  74272. y = (y - minY) * invSize | 0;
  74273. x = (x | x << 8) & 0x00ff00ff;
  74274. x = (x | x << 4) & 0x0f0f0f0f;
  74275. x = (x | x << 2) & 0x33333333;
  74276. x = (x | x << 1) & 0x55555555;
  74277. y = (y | y << 8) & 0x00ff00ff;
  74278. y = (y | y << 4) & 0x0f0f0f0f;
  74279. y = (y | y << 2) & 0x33333333;
  74280. y = (y | y << 1) & 0x55555555;
  74281. return x | y << 1;
  74282. } // find the leftmost node of a polygon ring
  74283. function getLeftmost(start) {
  74284. var p = start,
  74285. leftmost = start;
  74286. do {
  74287. if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p;
  74288. p = p.next;
  74289. } while (p !== start);
  74290. return leftmost;
  74291. } // check if a point lies within a convex triangle
  74292. function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
  74293. 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);
  74294. } // check if a diagonal between two polygon nodes is valid (lies in polygon interior)
  74295. function isValidDiagonal(a, b) {
  74296. 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
  74297. } // signed area of a triangle
  74298. function area(p, q, r) {
  74299. return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
  74300. } // check if two points are equal
  74301. function equals(p1, p2) {
  74302. return p1.x === p2.x && p1.y === p2.y;
  74303. } // check if two segments intersect
  74304. function intersects(p1, q1, p2, q2) {
  74305. var o1 = sign(area(p1, q1, p2));
  74306. var o2 = sign(area(p1, q1, q2));
  74307. var o3 = sign(area(p2, q2, p1));
  74308. var o4 = sign(area(p2, q2, q1));
  74309. if (o1 !== o2 && o3 !== o4) return true; // general case
  74310. if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
  74311. if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
  74312. if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
  74313. if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
  74314. return false;
  74315. } // for collinear points p, q, r, check if point q lies on segment pr
  74316. function onSegment(p, q, r) {
  74317. 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);
  74318. }
  74319. function sign(num) {
  74320. return num > 0 ? 1 : num < 0 ? -1 : 0;
  74321. } // check if a polygon diagonal intersects any polygon segments
  74322. function intersectsPolygon(a, b) {
  74323. var p = a;
  74324. do {
  74325. 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;
  74326. p = p.next;
  74327. } while (p !== a);
  74328. return false;
  74329. } // check if a polygon diagonal is locally inside the polygon
  74330. function locallyInside(a, b) {
  74331. 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;
  74332. } // check if the middle point of a polygon diagonal is inside the polygon
  74333. function middleInside(a, b) {
  74334. var p = a,
  74335. inside = false;
  74336. var px = (a.x + b.x) / 2,
  74337. py = (a.y + b.y) / 2;
  74338. do {
  74339. 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;
  74340. p = p.next;
  74341. } while (p !== a);
  74342. return inside;
  74343. } // link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
  74344. // if one belongs to the outer ring and another to a hole, it merges it into a single ring
  74345. function splitPolygon(a, b) {
  74346. var a2 = new Node(a.i, a.x, a.y),
  74347. b2 = new Node(b.i, b.x, b.y),
  74348. an = a.next,
  74349. bp = b.prev;
  74350. a.next = b;
  74351. b.prev = a;
  74352. a2.next = an;
  74353. an.prev = a2;
  74354. b2.next = a2;
  74355. a2.prev = b2;
  74356. bp.next = b2;
  74357. b2.prev = bp;
  74358. return b2;
  74359. } // create a node and optionally link it with previous one (in a circular doubly linked list)
  74360. function insertNode(i, x, y, last) {
  74361. var p = new Node(i, x, y);
  74362. if (!last) {
  74363. p.prev = p;
  74364. p.next = p;
  74365. } else {
  74366. p.next = last.next;
  74367. p.prev = last;
  74368. last.next.prev = p;
  74369. last.next = p;
  74370. }
  74371. return p;
  74372. }
  74373. function removeNode(p) {
  74374. p.next.prev = p.prev;
  74375. p.prev.next = p.next;
  74376. if (p.prevZ) p.prevZ.nextZ = p.nextZ;
  74377. if (p.nextZ) p.nextZ.prevZ = p.prevZ;
  74378. }
  74379. function Node(i, x, y) {
  74380. // vertex index in coordinates array
  74381. this.i = i; // vertex coordinates
  74382. this.x = x;
  74383. this.y = y; // previous and next vertex nodes in a polygon ring
  74384. this.prev = null;
  74385. this.next = null; // z-order curve value
  74386. this.z = 0; // previous and next nodes in z-order
  74387. this.prevZ = null;
  74388. this.nextZ = null; // indicates whether this is a steiner point
  74389. this.steiner = false;
  74390. }
  74391. function signedArea(data, start, end, dim) {
  74392. var sum = 0;
  74393. for (var i = start, j = end - dim; i < end; i += dim) {
  74394. sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
  74395. j = i;
  74396. }
  74397. return sum;
  74398. }
  74399. var PolyGonMark = /*#__PURE__*/function () {
  74400. function PolyGonMark(manager, parent, option) {
  74401. var _this = this;
  74402. _classCallCheck(this, PolyGonMark);
  74403. this.manager = manager;
  74404. this.parent = parent; // this.sid = common.getRandomSid()
  74405. // this.name = 'Mark_' + this.sid
  74406. this.group = new THREE.Group();
  74407. this.group.parentObj = this;
  74408. this.pointGroup = new THREE.Group();
  74409. this.lineGroup = new THREE.Group();
  74410. this.shapeGroup = new THREE.Group();
  74411. this.group.add(this.pointGroup);
  74412. this.group.add(this.lineGroup);
  74413. this.group.add(this.shapeGroup);
  74414. this.points = [];
  74415. this.lines = [];
  74416. this.shape = null;
  74417. this.shapeIndexes = [];
  74418. this.color = option.color; //this.activeColor = 0x00c8af
  74419. this.lineMat = option.lineMat;
  74420. this.activeLineMat = option.activeLineMat;
  74421. this.tempPoint;
  74422. this.tempLine;
  74423. this.active = false;
  74424. this.draw = {};
  74425. this.edit = {};
  74426. this.draw.add = function (pos) {
  74427. //绘制中加点
  74428. if (_this.points.length > 3 && _this.tempPoint && _this.tempPoint.position.distanceTo(_this.points[0].position) < 0.025) {
  74429. //触发闭合事件
  74430. _this.draw.finish();
  74431. return;
  74432. } //add
  74433. var p = new Point(_this.color, true);
  74434. _this.tempPoint = p;
  74435. p.setPosition(pos); //p.highLight()
  74436. _this.pointGroup.add(p);
  74437. _this.points.push(p); //第一个点
  74438. // if(this.points.length === 4) {
  74439. // this.manager.showFinishManager(this.points[0].position)
  74440. // }
  74441. if (_this.points.length === 1) {
  74442. _this.draw.add(pos);
  74443. } else {
  74444. var p1 = _this.points[_this.points.length - 2].position.clone();
  74445. var p2 = _this.points[_this.points.length - 1].position.clone();
  74446. var pArr = [p1, p2];
  74447. var l = new Line(pArr, _this.lineMat);
  74448. _this.tempLine && _this.tempLine.setMaterial('active');
  74449. _this.tempLine = l;
  74450. _this.tempLine.setMaterial('dashed');
  74451. _this.lineGroup.add(l);
  74452. _this.lines.push(l);
  74453. }
  74454. };
  74455. this.draw.delete = function () {
  74456. if (_this.tempPoint) {
  74457. var pos = _this.tempPoint.position.clone();
  74458. _this.points.pop();
  74459. _this.lines.pop();
  74460. _this.pointGroup.remove(_this.tempPoint);
  74461. _this.lineGroup.remove(_this.tempLine);
  74462. var p = _this.points[_this.points.length - 1].position.clone();
  74463. if (_this.points.length > 1) {
  74464. _this.tempPoint = _this.points[_this.points.length - 1];
  74465. _this.tempLine = _this.lines[_this.lines.length - 1];
  74466. _this.tempLine.setMaterial('dashed');
  74467. _this.draw.update(pos);
  74468. } else {
  74469. _this.deleteAll();
  74470. }
  74471. return p;
  74472. }
  74473. };
  74474. this.draw.recover = function (pos) {
  74475. var p = new Point(_this.color);
  74476. p.setPosition(pos);
  74477. p.highLight();
  74478. _this.pointGroup.add(p);
  74479. _this.points.splice(_this.points.length - 1, 0, p);
  74480. _this.lines.pop();
  74481. _this.lineGroup.remove(_this.tempLine);
  74482. var p1 = _this.points[_this.points.length - 3].position.clone();
  74483. var p2 = _this.points[_this.points.length - 2].position.clone();
  74484. var pArr = [p1, p2];
  74485. var l = new Line(pArr, _this.lineMat);
  74486. l.setMaterial('active');
  74487. _this.lineGroup.add(l);
  74488. _this.lines.push(l);
  74489. var p3 = _this.points[_this.points.length - 2].position.clone();
  74490. var p4 = _this.points[_this.points.length - 1].position.clone();
  74491. var pArr2 = [p3, p4];
  74492. var l2 = new Line(pArr2, _this.lineMat);
  74493. _this.tempLine = l2;
  74494. _this.tempLine.setMaterial('dashed');
  74495. _this.lineGroup.add(l2);
  74496. _this.lines.push(l2);
  74497. _this.draw.update(_this.tempPoint.position);
  74498. };
  74499. this.draw.finish = function (immediate) {
  74500. // if (immediate) {
  74501. // if (this.points.length >= 4) {
  74502. // this.draw.delete()
  74503. // this.draw.finish()
  74504. // console.log('immediate finish')
  74505. // }
  74506. // return
  74507. // }
  74508. if (_this.points.length < 4) return;
  74509. console.log('finish');
  74510. var index = _this.points.indexOf(_this.tempPoint);
  74511. index !== -1 && _this.points.splice(index, 1);
  74512. _this.pointGroup.remove(_this.tempPoint);
  74513. _this.createLoopLine();
  74514. _this.createShape();
  74515. _this.midLight(); //emit
  74516. _this.manager.emit('polygonmarkManager.finish');
  74517. _this.manager.emit('polygonmarkManager.update');
  74518. if (!_this.parent.label) {
  74519. _this.parent.createLabel(_this.computePointsCenter());
  74520. } else {
  74521. _this.parent.updateIntersectArr();
  74522. }
  74523. };
  74524. this.draw.update = function (pos) {
  74525. _this.tempPoint && _this.tempPoint.setPosition(pos);
  74526. _this.tempLine && _this.tempLine.update(pos);
  74527. };
  74528. this.draw.increase = function (pos, pointIndex) {
  74529. var p = new Point(_this.color);
  74530. p.midLight();
  74531. p.setPosition(pos);
  74532. _this.points.splice(pointIndex + 1, 0, p);
  74533. _this.pointGroup.add(p);
  74534. _this.createLoopLine();
  74535. _this.createShape();
  74536. _this.parent.updateIntersectArr();
  74537. _this.manager.emit('polygonmarkManager.update');
  74538. setTimeout(function () {
  74539. _this.manager.onMouseMove();
  74540. }, 100);
  74541. };
  74542. this.draw.subtract = function (elem) {
  74543. var index = _this.points.indexOf(elem); // console.log(index)
  74544. index > -1 && _this.points.splice(index, 1);
  74545. _this.pointGroup.remove(elem);
  74546. _this.createLoopLine();
  74547. _this.createShape();
  74548. _this.parent.updateIntersectArr();
  74549. if (_this.points.length <= 2) _this.deleteAll();
  74550. _this.manager.emit('polygonmarkManager.update');
  74551. };
  74552. this.edit.update = function (elem, pos) {
  74553. elem.setPosition(pos);
  74554. _this.createLoopLine();
  74555. _this.createShape();
  74556. _this.parent.updateIntersectArr();
  74557. if (_this.active) _this.highLight();
  74558. };
  74559. }
  74560. _createClass(PolyGonMark, [{
  74561. key: "build",
  74562. value: function build(points, shapeIndexes) {
  74563. var _this2 = this;
  74564. points.forEach(function (i) {
  74565. var p = new Point(_this2.color);
  74566. p.setPosition(i);
  74567. _this2.points.push(p);
  74568. _this2.pointGroup.add(p);
  74569. });
  74570. this.createLoopLine();
  74571. this.createShape(shapeIndexes);
  74572. this.lowLight();
  74573. }
  74574. }, {
  74575. key: "createShape",
  74576. value: function createShape(shapeIndexes) {
  74577. if (shapeIndexes) {
  74578. var vertices_xyz = [];
  74579. this.points.forEach(function (p) {
  74580. vertices_xyz.push(p.position.x);
  74581. vertices_xyz.push(p.position.y);
  74582. vertices_xyz.push(p.position.z);
  74583. });
  74584. this.shapeIndexes = shapeIndexes; //完成记录indexes
  74585. var shape = new Shape(vertices_xyz, shapeIndexes, this.color
  74586. /* activeColor */
  74587. );
  74588. this.shapeGroup.clear();
  74589. this.shapeGroup.add(shape);
  74590. this.shape = shape;
  74591. return;
  74592. }
  74593. var vertices = [];
  74594. if (this.points.length < 3) {
  74595. return;
  74596. } else if (this.points.length === 3) {
  74597. this.points.forEach(function (p) {
  74598. vertices.push(p.position.x);
  74599. vertices.push(p.position.y);
  74600. vertices.push(p.position.z);
  74601. });
  74602. this.shapeIndexes = [0, 1, 2]; //完成记录indexes
  74603. var _shape = new Shape(vertices, null, this.color
  74604. /* this.activeColor */
  74605. );
  74606. this.shapeGroup.clear();
  74607. this.shapeGroup.add(_shape);
  74608. this.shape = _shape;
  74609. } else {
  74610. var dir = new THREE.Vector3();
  74611. var camera = this.manager.player.cameraControls.cameras['panorama'];
  74612. camera.getWorldDirection(dir); // console.log(dir)
  74613. var plane = new THREE.Plane(dir, 0);
  74614. var targets = [];
  74615. this.points.forEach(function (p) {
  74616. var target = new THREE.Vector3();
  74617. plane.projectPoint(p.position, target);
  74618. target.applyMatrix4(camera.matrixWorldInverse);
  74619. targets.push(target.x);
  74620. targets.push(target.y);
  74621. vertices.push(p.position.x);
  74622. vertices.push(p.position.y);
  74623. vertices.push(p.position.z);
  74624. });
  74625. var res = Earcut.triangulate(targets);
  74626. this.shapeIndexes = res; //完成记录indexes
  74627. var _shape2 = new Shape(vertices, res, this.color
  74628. /* this.activeColor */
  74629. );
  74630. this.shapeGroup.clear();
  74631. this.shapeGroup.add(_shape2);
  74632. this.shape = _shape2;
  74633. }
  74634. }
  74635. }, {
  74636. key: "createLoopLine",
  74637. value: function createLoopLine() {
  74638. var p = [];
  74639. this.points.forEach(function (i) {
  74640. p.push(i.position);
  74641. });
  74642. var lineloop = new LineLoop(p, this.lineMat, this.activeLineMat);
  74643. this.lines.length = [];
  74644. this.lines.push(lineloop); //!!! 结构不能变
  74645. this.group.remove(this.lineGroup);
  74646. this.lineGroup.clear();
  74647. this.lineGroup = lineloop;
  74648. this.group.add(this.lineGroup);
  74649. } //隐藏
  74650. }, {
  74651. key: "hide",
  74652. value: function hide() {
  74653. this.group.visible = false;
  74654. } //显示
  74655. }, {
  74656. key: "show",
  74657. value: function show() {
  74658. this.group.visible = true;
  74659. } //删除全部
  74660. }, {
  74661. key: "deleteAll",
  74662. value: function deleteAll() {
  74663. // this.dispose()
  74664. this.parent.deleteMark(this);
  74665. this.manager.updateActivePoint(null, null, false);
  74666. this.manager.emit('polygonmarkManager.finish');
  74667. this.parent.updateIntersectArr();
  74668. }
  74669. }, {
  74670. key: "setColor",
  74671. value: function setColor(color) {
  74672. var _this$shape;
  74673. // this.lines[0].setColor(color)
  74674. this.points.forEach(function (i) {
  74675. i.setColor(color);
  74676. });
  74677. (_this$shape = this.shape) === null || _this$shape === void 0 ? void 0 : _this$shape.setColor(color); //add
  74678. this.color = color;
  74679. }
  74680. }, {
  74681. key: "setLight",
  74682. value: function setLight(bool) {
  74683. var line = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  74684. var shape = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  74685. if (bool) {
  74686. line && this.lines[0].highLight();
  74687. shape && this.shape.highLight();
  74688. } else {
  74689. line && this.lines[0].lowLight();
  74690. shape && this.shape.lowLight();
  74691. }
  74692. }
  74693. }, {
  74694. key: "highLight",
  74695. value: function highLight() {
  74696. this.points.forEach(function (i) {
  74697. i.highLight && i.highLight();
  74698. });
  74699. this.lines.forEach(function (i) {
  74700. i.highLight && i.highLight();
  74701. });
  74702. this.shape && this.shape.highLight && this.shape.highLight();
  74703. }
  74704. }, {
  74705. key: "midLight",
  74706. value: function midLight() {
  74707. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  74708. if (this.active && !force) return;
  74709. this.points.forEach(function (i) {
  74710. i.midLight && i.midLight();
  74711. });
  74712. this.lines.forEach(function (i) {
  74713. i.midLight && i.midLight();
  74714. });
  74715. this.shape && this.shape.midLight && this.shape.midLight();
  74716. }
  74717. }, {
  74718. key: "lowLight",
  74719. value: function lowLight() {
  74720. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  74721. if (this.active && !force) return;
  74722. this.points.forEach(function (i) {
  74723. i.lowLight && i.lowLight();
  74724. });
  74725. this.lines.forEach(function (i) {
  74726. i.lowLight && i.lowLight();
  74727. });
  74728. this.shape && this.shape.lowLight && this.shape.lowLight();
  74729. }
  74730. }, {
  74731. key: "computePointsCenter",
  74732. value: function computePointsCenter() {
  74733. var _x = 0,
  74734. _y = 0,
  74735. _z = 0,
  74736. n = this.points.length;
  74737. this.points.forEach(function (p) {
  74738. _x += p.position.x;
  74739. _y += p.position.y;
  74740. _z += p.position.z;
  74741. });
  74742. _x /= n;
  74743. _y /= n;
  74744. _z /= n;
  74745. return new THREE.Vector3(_x, _y, _z);
  74746. }
  74747. }, {
  74748. key: "dispose",
  74749. value: function dispose() {
  74750. this.group.clear();
  74751. this.pointGroup.clear();
  74752. this.lineGroup.clear();
  74753. this.shapeGroup.clear();
  74754. this.points.length = 0;
  74755. this.lines.length = 0;
  74756. this.shape = null;
  74757. this.shapeIndexes.length = 0;
  74758. this.tempPoint = null;
  74759. this.tempLine = null;
  74760. }
  74761. }, {
  74762. key: "toJSON",
  74763. value: function toJSON() {
  74764. var points = [];
  74765. this.points.forEach(function (i) {
  74766. var p = {
  74767. x: i.position.x,
  74768. y: i.position.y,
  74769. z: i.position.z
  74770. };
  74771. points.push(p);
  74772. });
  74773. return {
  74774. points: points,
  74775. shapeIndexes: this.shapeIndexes
  74776. };
  74777. }
  74778. }]);
  74779. return PolyGonMark;
  74780. }();
  74781. 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); }; }
  74782. 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; } }
  74783. //var activeColor = '#00c8af'
  74784. new THREE.Vector2();
  74785. var PolygonMarkLabel = /*#__PURE__*/function (_THREE$EventDispatche) {
  74786. _inherits(PolygonMarkLabel, _THREE$EventDispatche);
  74787. var _super = _createSuper$f(PolygonMarkLabel);
  74788. function PolygonMarkLabel(player, manager, parentObj, o) {
  74789. var _this;
  74790. _classCallCheck(this, PolygonMarkLabel);
  74791. _this = _super.call(this);
  74792. _this.player = player;
  74793. _this.manager = manager;
  74794. _this.parentObj = parentObj; // this.position = o.pos
  74795. _this.sid = o.sid;
  74796. _this.name = o.name || '';
  74797. _this.type = o.type || '';
  74798. _this.panoId = o.panoId;
  74799. _this.color = o.color;
  74800. _this.labelPoint = o.labelPoint; // this.toPano = o.toPano
  74801. _this.clickFun = o.clickFun; // this.noLine = o.noLine
  74802. // this.driftDir = o.driftDir
  74803. // this.floorIndex = o.floorIndex
  74804. //create--------------------------------------
  74805. _this.elem = document.createElement('div');
  74806. _this.elem.className = 'polygonMark-label';
  74807. _this.elem.style.display = 'block';
  74808. _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>");
  74809. _this.labelPointDomElement = _this.elem.querySelector('.point');
  74810. _this.setColor(_this.color);
  74811. _this.mousedownPos = [Infinity, Infinity]; //xzw add
  74812. _this.elem.style.width = 'auto';
  74813. _this.elem.style.height = 'auto';
  74814. setTimeout(function () {
  74815. var w = _this.elem.offsetWidth;
  74816. var h = _this.elem.offsetHeight;
  74817. _this.elem.style.width = w + 5 + 'px';
  74818. _this.elem.style.height = h + 'px';
  74819. }, 0);
  74820. _this.elem.addEventListener('pointerdown', _this.onPointerDown.bind(_assertThisInitialized(_this)));
  74821. _this.player.domElement.addEventListener('pointermove', _this.onPointerMove.bind(_assertThisInitialized(_this)));
  74822. _this.elem.addEventListener('pointerup', _this.onPointerUp.bind(_assertThisInitialized(_this)));
  74823. _this.elem.addEventListener('mouseenter', _this.onMouseEnter.bind(_assertThisInitialized(_this)));
  74824. _this.elem.addEventListener('mouseleave', _this.onMouseLeave.bind(_assertThisInitialized(_this)));
  74825. _this.elem.addEventListener('mousedown', _this.onMouseDown.bind(_assertThisInitialized(_this)));
  74826. _this.elem.addEventListener('mouseup', _this.onMouseUp.bind(_assertThisInitialized(_this))); // o.container ? o.container.append(this.elem) : document.querySelector('.widgets-doll-labels').append(this.elem)
  74827. _this.player.domElement.querySelector('.polygonmark-labels').append(_this.elem);
  74828. _this.player.polygonmarkLabels.push(_assertThisInitialized(_this)); //create--------------------------------------
  74829. _this.enable = true;
  74830. _this.pos2d = new THREE.Vector2();
  74831. _this.pointer = new THREE.Vector4();
  74832. _this.dragging = false;
  74833. _this.visible = true; //2023.6新增 用于控制多原因隐藏
  74834. _this.isPolygonMarkLabel = true;
  74835. return _this;
  74836. }
  74837. _createClass(PolygonMarkLabel, [{
  74838. key: "setElementWidthAndHeight",
  74839. value: function setElementWidthAndHeight() {
  74840. var _this2 = this;
  74841. this.elem.style.width = 'auto';
  74842. this.elem.style.height = 'auto';
  74843. setTimeout(function () {
  74844. var w = _this2.elem.offsetWidth;
  74845. var h = _this2.elem.offsetHeight;
  74846. _this2.elem.style.width = w + 5 + 'px';
  74847. _this2.elem.style.height = h + 'px';
  74848. }, 0);
  74849. }
  74850. }, {
  74851. key: "setNameType",
  74852. value: function setNameType(name, type) {
  74853. this.elem.getElementsByClassName('name')[0].innerHTML = this.name = name;
  74854. this.elem.getElementsByClassName('type')[0].innerHTML = this.type = type;
  74855. this.setElementWidthAndHeight();
  74856. this.update();
  74857. }
  74858. }, {
  74859. key: "setColor",
  74860. value: function setColor(color, activeColor) {
  74861. this.labelPointDomElement.style.backgroundColor = color;
  74862. if (activeColor) {
  74863. this.activeColor = activeColor;
  74864. this.color = color;
  74865. }
  74866. }
  74867. }, {
  74868. key: "highLight",
  74869. value: function highLight() {
  74870. this.setColor(this.activeColor);
  74871. }
  74872. }, {
  74873. key: "midLight",
  74874. value: function midLight() {
  74875. this.setColor(this.color);
  74876. }
  74877. }, {
  74878. key: "update",
  74879. value: function update() {
  74880. //enable只和是否有cad图相关
  74881. if (this.player.mode !== 'panorama' || !this.manager.labelVisible || !this.manager.labelEnabled || !this.enable || !this.visible || !this.name // ||
  74882. // (this.player.model.currentFloor.floorIndex != this.floorIndex && !this.player.model.allFloorsVisible) ||
  74883. // (config.isEdit && (
  74884. // (objects.mainDesign && objects.mainDesign.editing) ||
  74885. // (this.player.EditOverlay && this.player.EditOverlay.editing) ||
  74886. // (this.player.linkEditor && (this.player.linkEditor.setPanoVisible || this.player.linkEditor.setTagVisible))
  74887. // ))
  74888. ) {
  74889. this.elem.style.display = 'none';
  74890. return;
  74891. }
  74892. var p = convertTool.getPos2d(this.labelPoint, this.player);
  74893. if (!p.trueSide) {
  74894. // this.elem.style.display = 'none'
  74895. return;
  74896. } //判断label是否被模型遮挡,遮挡则消失
  74897. // if (convertTool.ifShelter(this.position, this.player, { x: p.vector.x, y: p.vector.y }, null, this.player.model.allFloorsVisible ? null : this.floorIndex)) {
  74898. // this.elem.style.display = 'none'
  74899. // return
  74900. // }
  74901. this.elem.style.display = ''; //先显示,driftDir才能计算位置
  74902. var w = this.elem.offsetWidth;
  74903. var h = this.elem.offsetHeight;
  74904. var h1 = this.elem.querySelector('.name').offsetHeight;
  74905. var h2 = this.elem.querySelector('.type').offsetHeight;
  74906. if (h1 > 30 && w < 340 || h2 > 30 && w < 340 || w === 0 || h === 0) {
  74907. this.setElementWidthAndHeight();
  74908. }
  74909. if (!this.dragging) {
  74910. var height = this.elem.children[0].offsetHeight + 0.5;
  74911. this.pos2d.x = p.pos.x + 2.5;
  74912. this.pos2d.y = p.pos.y - height;
  74913. this.elem.style.left = this.pos2d.x + 'px';
  74914. this.elem.style.top = this.pos2d.y + 'px';
  74915. }
  74916. if (this.manager.isEdit) {
  74917. this.elem.style.cursor = 'move';
  74918. } else {
  74919. this.elem.style.cursor = 'pointer';
  74920. } // }
  74921. }
  74922. }, {
  74923. key: "remove",
  74924. value: function remove() {
  74925. var parentElem = this.elem.parentElement; // document.querySelector('.widgets-doll-labels')
  74926. parentElem && parentElem.removeChild(this.elem);
  74927. var a = this.player.polygonmarkLabels.indexOf(this);
  74928. if (a > -1) this.player.polygonmarkLabels.splice(a, 1);
  74929. this.labelPoint = null;
  74930. this.parentObj = null;
  74931. }
  74932. }, {
  74933. key: "show",
  74934. value: function show() {
  74935. this.elem.style.display = 'block';
  74936. this.visible = true;
  74937. }
  74938. }, {
  74939. key: "hide",
  74940. value: function hide() {
  74941. this.elem.style.display = 'none';
  74942. this.visible = false;
  74943. }
  74944. }, {
  74945. key: "onPointerDown",
  74946. value: function onPointerDown(e) {
  74947. e.stopPropagation();
  74948. this.mousedownPos = [e.clientX, e.clientY];
  74949. if (this.manager.isEdit) {
  74950. this.dragging = true;
  74951. this.pointer.x = e.clientX;
  74952. this.pointer.y = e.clientY;
  74953. this.pointer.z = this.pos2d.x;
  74954. this.pointer.w = this.pos2d.y;
  74955. }
  74956. }
  74957. }, {
  74958. key: "onPointerMove",
  74959. value: function onPointerMove(e) {
  74960. if (this.manager.isEdit && this.dragging) {
  74961. var offsetX = e.clientX - this.pointer.x;
  74962. var offsetY = e.clientY - this.pointer.y;
  74963. this.pos2d.x = this.pointer.z + offsetX;
  74964. this.pos2d.y = this.pointer.w + offsetY;
  74965. this.elem.style.left = this.pos2d.x + 'px';
  74966. this.elem.style.top = this.pos2d.y + 'px';
  74967. }
  74968. }
  74969. }, {
  74970. key: "onPointerUp",
  74971. value: function onPointerUp(e) {
  74972. e.stopPropagation();
  74973. var isClick = Math.abs(e.clientX - this.mousedownPos[0]) <= 1 && Math.abs(e.clientY - this.mousedownPos[1]) <= 1;
  74974. if (this.manager.isEdit) {
  74975. var labelPos2d = new THREE.Vector2();
  74976. var height = this.elem.children[0].offsetHeight + 0.5;
  74977. labelPos2d.x = this.pos2d.x - 2.5;
  74978. labelPos2d.y = this.pos2d.y + height;
  74979. labelPos2d.x = labelPos2d.x / this.player.domElement.clientWidth * 2 - 1;
  74980. labelPos2d.y = -(labelPos2d.y / this.player.domElement.clientHeight) * 2 + 1;
  74981. var intersect = this.player.getMouseIntersect(labelPos2d, [this.manager.intersectBox], {
  74982. recursive: false
  74983. });
  74984. intersect && this.labelPoint.copy(intersect.point);
  74985. this.dragging = false;
  74986. } else if (isClick) {
  74987. this.manager.emit('polygonmarkManager.clickLabel', this.sid); //取消选中的话需要再发送个leaveLabel,见下句
  74988. this.manager.setFocusGroup(this.sid, e);
  74989. }
  74990. }
  74991. }, {
  74992. key: "onMouseDown",
  74993. value: function onMouseDown(e) {
  74994. e.stopPropagation();
  74995. }
  74996. }, {
  74997. key: "onMouseUp",
  74998. value: function onMouseUp(e) {
  74999. e.stopPropagation();
  75000. }
  75001. }, {
  75002. key: "onMouseEnter",
  75003. value: function onMouseEnter() {
  75004. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  75005. if (this.manager.isEdit) return;
  75006. if (!this.parentObj.focus) this.parentObj.midLight();
  75007. if (this.manager.focusGroup) return;
  75008. this.manager.emit('polygonmarkManager.enterLabel', this.sid);
  75009. e.data = {
  75010. sid: this.sid,
  75011. title: this.name,
  75012. panoId: this.panoId
  75013. };
  75014. this.manager.app.Scene.emit("hotspot.enter", {
  75015. type: 'draw',
  75016. event: e
  75017. });
  75018. }
  75019. }, {
  75020. key: "onMouseLeave",
  75021. value: function onMouseLeave() {
  75022. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  75023. if (this.manager.isEdit) {
  75024. return;
  75025. }
  75026. if (!this.parentObj.focus) this.parentObj.lowLight();
  75027. if (this.manager.focusGroup) return; //选中的话
  75028. this.manager.emit('polygonmarkManager.leaveLabel', this.sid);
  75029. e.data = {
  75030. sid: this.sid,
  75031. title: this.name,
  75032. panoId: this.panoId
  75033. };
  75034. this.manager.app.Scene.emit("hotspot.leave", {
  75035. type: 'draw',
  75036. event: e
  75037. });
  75038. }
  75039. }]);
  75040. return PolygonMarkLabel;
  75041. }(THREE.EventDispatcher);
  75042. var PolygonMarkGroup = /*#__PURE__*/function () {
  75043. // option = {name, type, color}
  75044. function PolygonMarkGroup(player, manager, option) {
  75045. _classCallCheck(this, PolygonMarkGroup);
  75046. this.player = player;
  75047. this.manager = manager;
  75048. this.sid = option.sid !== undefined ? option.sid : common$1.getRandomSid();
  75049. this.name = option.name !== undefined ? option.name : '标题';
  75050. this.type = option.type !== undefined ? option.type : '类型';
  75051. this.color = option.color !== undefined ? option.color : 0xffffff;
  75052. this.panoId = option.panoId;
  75053. this.list = [];
  75054. this.label = null;
  75055. this.labelPoint = null;
  75056. this.group = new THREE.Group();
  75057. this.intersectArr = [];
  75058. this.active = false;
  75059. this.focus = false;
  75060. this.lineMat = LineDraw.createFatLineMat({
  75061. lineWidth: 2,
  75062. color: this.color
  75063. /*, alwaysShow: true*/
  75064. });
  75065. this.activeLineMat = LineDraw.createFatLineMat({
  75066. lineWidth: 2,
  75067. color: this.color
  75068. /*, alwaysShow: true*/
  75069. });
  75070. this.lineMat.resolution = this.activeLineMat.resolution = new THREE.Vector2(this.manager.app.core.get('SceneRenderer').renderWidth, this.manager.app.core.get('SceneRenderer').renderHeight);
  75071. this.activeMark = null;
  75072. this.setColor(this.color);
  75073. }
  75074. _createClass(PolygonMarkGroup, [{
  75075. key: "build",
  75076. value: function build(data, labelPos) {
  75077. var _this = this;
  75078. var reload = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  75079. if (reload) {
  75080. this.list.length = [];
  75081. this.group.clear();
  75082. this.removeLabel();
  75083. }
  75084. data.forEach(function (i) {
  75085. var pm = new PolyGonMark(_this.manager, _this, {
  75086. color: _this.color,
  75087. lineMat: _this.lineMat,
  75088. activeLineMat: _this.activeLineMat
  75089. });
  75090. var p = [];
  75091. i.points.forEach(function (j) {
  75092. var pos = new THREE.Vector3(j.x, j.y, j.z);
  75093. p.push(pos);
  75094. });
  75095. pm.build(p, i.shapeIndexes);
  75096. _this.list.push(pm);
  75097. _this.group.add(pm.group);
  75098. });
  75099. labelPos && this.createLabel(new THREE.Vector3(labelPos.x, labelPos.y, labelPos.z));
  75100. this.updateIntersectArr();
  75101. }
  75102. }, {
  75103. key: "addChild",
  75104. value: function addChild() {
  75105. var pm = new PolyGonMark(this.manager, this, {
  75106. color: this.color,
  75107. lineMat: this.lineMat,
  75108. activeLineMat: this.activeLineMat
  75109. });
  75110. this.list.push(pm);
  75111. this.group.add(pm.group);
  75112. this.activeMark = pm;
  75113. }
  75114. }, {
  75115. key: "updateIntersectArr",
  75116. value: function updateIntersectArr() {
  75117. var _this2 = this;
  75118. this.intersectArr.length = 0;
  75119. this.list.forEach(function (mark) {
  75120. var markIntersectArr = mark.points.concat(mark.lines);
  75121. _this2.intersectArr = _this2.intersectArr.concat(markIntersectArr);
  75122. });
  75123. }
  75124. }, {
  75125. key: "createLabel",
  75126. value: function createLabel(pos) {
  75127. if (!pos) return;
  75128. this.labelPoint = new THREE.Vector3();
  75129. this.labelPoint.copy(pos);
  75130. this.label = new PolygonMarkLabel(this.player, this.manager, this, {
  75131. sid: this.sid,
  75132. // pos: pos,
  75133. labelPoint: this.labelPoint,
  75134. name: this.name,
  75135. type: this.type,
  75136. panoId: this.panoId,
  75137. color: this.color,
  75138. floorIndex: 0
  75139. });
  75140. this.label.update();
  75141. this.updateIntersectArr();
  75142. }
  75143. }, {
  75144. key: "removeLabel",
  75145. value: function removeLabel() {
  75146. if (this.label) {
  75147. this.label.remove();
  75148. this.label = null;
  75149. }
  75150. if (this.labelPoint) {
  75151. this.labelPoint = null;
  75152. }
  75153. }
  75154. }, {
  75155. key: "setColor",
  75156. value: function setColor(color) {
  75157. var _this$list;
  75158. this.color = color;
  75159. var c = new THREE.Color().set(color).getHSL({
  75160. h: 0,
  75161. s: 0,
  75162. l: 0
  75163. });
  75164. this.activeColor = new THREE.Color().setHSL(c.h, c.s, c.l >= 0.7 ? c.l - 0.15 : c.l + 0.15); //let expandSelectedColor = new THREE.Color().setHSL(c.h, c.s > 0.5 ? c.s - 0.2 : c.s + 0.2, c.l >= 0.6 ? c.l - 0.1 : c.l + 0.1 )
  75165. this.activeLineMat.color.set(this.activeColor);
  75166. this.lineMat.color.set(color);
  75167. this.label && this.label.setColor(color, '#' + this.activeColor.getHexString());
  75168. (_this$list = this.list) === null || _this$list === void 0 ? void 0 : _this$list.forEach(function (i) {
  75169. i.setColor(color);
  75170. });
  75171. }
  75172. }, {
  75173. key: "setShapeStyle",
  75174. value: function setShapeStyle(_ref) {
  75175. var bgColor = _ref.bgColor,
  75176. bgOpacity = _ref.bgOpacity,
  75177. flashInterval = _ref.flashInterval;
  75178. //2025新增属性 填充色闪烁
  75179. this.list.forEach(function (polygon) {
  75180. polygon.shape.setDisplay(bgColor, bgOpacity, flashInterval != void 0);
  75181. });
  75182. if (this.flashInterval != flashInterval) {
  75183. var id = 'polygon_shine_' + this.sid;
  75184. transitions$1.cancelById(id);
  75185. if (flashInterval > 0) {
  75186. var min = 0.3,
  75187. max = 0.8;
  75188. transitions$1.trigger({
  75189. func: function (e) {
  75190. //if (this.focus) return //选中了
  75191. var progress = e < 0.5 ? 2 * e : 2 - 2 * e;
  75192. var opacity = easing.easeOutQuad(progress, 0, 1, 1);
  75193. opacity = math$2.linearClamp(opacity, [0, 1], [min, max]);
  75194. this.list.forEach(function (polygon) {
  75195. polygon.shape.material.opacity = opacity;
  75196. });
  75197. }.bind(this),
  75198. cycling: !0,
  75199. duration: flashInterval * 2,
  75200. id
  75201. });
  75202. }
  75203. this.flashInterval = flashInterval;
  75204. }
  75205. }
  75206. }, {
  75207. key: "setNameType",
  75208. value: function setNameType(name, type) {
  75209. this.name = name;
  75210. this.type = type;
  75211. this.label && this.label.setNameType(name, type);
  75212. }
  75213. }, {
  75214. key: "hide",
  75215. value: function hide() {
  75216. this.group.visible = false;
  75217. if (this.label) {
  75218. this.label.visible = false;
  75219. this.label.update();
  75220. }
  75221. }
  75222. }, {
  75223. key: "show",
  75224. value: function show() {
  75225. this.group.visible = true;
  75226. if (this.label) {
  75227. this.label.visible = true;
  75228. this.label.update();
  75229. }
  75230. }
  75231. }, {
  75232. key: "deleteMark",
  75233. value: function deleteMark(mark) {
  75234. if (!mark) {
  75235. mark = this.activeMark;
  75236. }
  75237. if (!mark) return;
  75238. var index = this.list.indexOf(mark);
  75239. index > -1 && this.list.splice(index, 1);
  75240. this.group.remove(mark.group);
  75241. mark.active = false;
  75242. this.activeMark = null;
  75243. mark.dispose();
  75244. if (this.list.length <= 0) this.removeLabel();
  75245. }
  75246. }, {
  75247. key: "setActive",
  75248. value: function setActive(bool) {
  75249. if (bool) {
  75250. this.list.forEach(function (i) {
  75251. i.setLight(bool);
  75252. });
  75253. this.label && this.label.highLight();
  75254. } else {
  75255. this.list.forEach(function (i) {
  75256. i.setLight(bool);
  75257. });
  75258. this.label && this.label.midLight();
  75259. }
  75260. this.focus = bool;
  75261. }
  75262. }, {
  75263. key: "highLight",
  75264. value: function highLight() {
  75265. this.list.forEach(function (i) {
  75266. i.setLight(true);
  75267. });
  75268. this.label && this.label.highLight();
  75269. }
  75270. }, {
  75271. key: "midLight",
  75272. value: function midLight() {
  75273. this.list.forEach(function (i) {
  75274. i.setLight(true, true, false);
  75275. });
  75276. this.label && this.label.highLight();
  75277. }
  75278. }, {
  75279. key: "lowLight",
  75280. value: function lowLight() {
  75281. this.list.forEach(function (i) {
  75282. i.lowLight(true);
  75283. });
  75284. this.label && this.label.midLight();
  75285. }
  75286. }, {
  75287. key: "reload",
  75288. value: function reload(data) {
  75289. if (!data) {
  75290. this.manager.deleteMarkGroup(this.sid);
  75291. return;
  75292. }
  75293. this.build(data.list, data.labelPoint, true);
  75294. this.setNameType(data.name, data.type);
  75295. this.setColor(data.color);
  75296. }
  75297. }, {
  75298. key: "dispose",
  75299. value: function dispose() {
  75300. this.list.forEach(function (i) {
  75301. i.dispose();
  75302. });
  75303. this.sid = null;
  75304. this.panoId = null;
  75305. this.list.length = 0;
  75306. this.removeLabel();
  75307. this.group.clear();
  75308. this.intersectArr.length = 0;
  75309. this.lineMat.dispose();
  75310. this.activeMark = null;
  75311. }
  75312. }, {
  75313. key: "toJSON",
  75314. value: function toJSON() {
  75315. var list = [];
  75316. this.list.forEach(function (i) {
  75317. list.push(i.toJSON());
  75318. });
  75319. var labelPos = null;
  75320. if (this.labelPoint) {
  75321. labelPos = {
  75322. x: this.labelPoint.x,
  75323. y: this.labelPoint.y,
  75324. z: this.labelPoint.z
  75325. };
  75326. }
  75327. return {
  75328. sid: this.sid,
  75329. name: this.name,
  75330. type: this.type,
  75331. labelPoint: labelPos,
  75332. color: this.color,
  75333. panoId: this.panoId,
  75334. list: list
  75335. };
  75336. }
  75337. }]);
  75338. return PolygonMarkGroup;
  75339. }();
  75340. 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); }; }
  75341. 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; } }
  75342. var ScaleZoom = 1;
  75343. var size = 4;
  75344. var defaultColor = 0x00c8af;
  75345. var FinishReticule = /*#__PURE__*/function (_THREE$Sprite) {
  75346. _inherits(FinishReticule, _THREE$Sprite);
  75347. var _super = _createSuper$e(FinishReticule);
  75348. function FinishReticule() {
  75349. var _this;
  75350. _classCallCheck(this, FinishReticule);
  75351. // const data = new Uint8Array([255, 255, 255, 255])
  75352. // const map = new THREE.DataTexture(data, 1, 1)
  75353. // map.needsUpdate = true
  75354. var map = new THREE.Texture();
  75355. var material = new THREE.SpriteMaterial({
  75356. sizeAttenuation: false,
  75357. color: defaultColor,
  75358. map: map
  75359. });
  75360. material.onBeforeCompile = function (shader) {
  75361. 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 ");
  75362. };
  75363. material.depthFunc = THREE.AlwaysDepth;
  75364. _this = _super.call(this, material);
  75365. _this.renderOrder = RenderOrder.monitorPlane;
  75366. _this.setScale(null, false);
  75367. return _this;
  75368. }
  75369. _createClass(FinishReticule, [{
  75370. key: "setPosition",
  75371. value: function setPosition(pos) {
  75372. this.position.copy(pos);
  75373. }
  75374. }, {
  75375. key: "setScale",
  75376. value: function setScale(zoom) {
  75377. var fromZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  75378. var t;
  75379. if (zoom) {
  75380. t = 0.012 * (1 / zoom);
  75381. if (fromZoom) ScaleZoom = zoom;
  75382. } else {
  75383. t = 0.012 * (1 / ScaleZoom);
  75384. }
  75385. this.scale.set(t * size, t * size, t);
  75386. }
  75387. }]);
  75388. return FinishReticule;
  75389. }(THREE.Sprite);
  75390. 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); }; }
  75391. 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; } }
  75392. /*
  75393. 默认状态 钢笔未选中状态(state => 0)
  75394. 鼠标悬浮多边形 => 中亮 √
  75395. 鼠标点击多边形 => 高亮 √
  75396. 可删除选中多边形 √
  75397. 可拖拽label √
  75398. 可拖拽锚点 √
  75399. 绘制状态 钢笔选中状态(state => 1)
  75400. 点击空白处:
  75401. 新建多边形 √
  75402. 单击左键画点 √
  75403. 点击右键减点 √
  75404. 双击左键闭合 √
  75405. 点击边加点 √
  75406. 点击点减点 √
  75407. */
  75408. var PolygonMarkManager = /*#__PURE__*/function (_Emiter) {
  75409. _inherits(PolygonMarkManager, _Emiter);
  75410. var _super = _createSuper$d(PolygonMarkManager);
  75411. function PolygonMarkManager(app) {
  75412. var _this;
  75413. _classCallCheck(this, PolygonMarkManager);
  75414. _this = _super.call(this);
  75415. _this.saveEdit = function () {
  75416. var g = _this.activeGroup;
  75417. var data = g.toJSON();
  75418. if (!data.name) {
  75419. return {
  75420. code: 401
  75421. };
  75422. } else if (data.list.length <= 0) {
  75423. return {
  75424. code: 402
  75425. };
  75426. } else if (data.list[data.list.length - 1].shapeIndexes.length <= 0) {
  75427. return {
  75428. code: 403
  75429. };
  75430. } //succeed
  75431. g.lowLight();
  75432. _this.activeGroup = null;
  75433. _this.leaveEdit();
  75434. _this.setState(0);
  75435. return {
  75436. code: 400,
  75437. data
  75438. };
  75439. };
  75440. _this.cancelEdit = function () {
  75441. _this.leaveEdit();
  75442. _this.setState(0);
  75443. _this.activeGroup.reload(_this.activeGroupHistoryData);
  75444. };
  75445. _this.Listener = {
  75446. onKeydownFun: _this.onKeydown.bind(_assertThisInitialized(_this)),
  75447. cancelEdit: _this.cancelEdit.bind(_assertThisInitialized(_this))
  75448. };
  75449. _this.bindEvents = function () {
  75450. var domElement = _this.app.dom.querySelector('.player');
  75451. domElement.addEventListener('pointerdown', _this.onMouseDown);
  75452. domElement.addEventListener('pointerup', _this.onMouseUp);
  75453. domElement.addEventListener('keydown', _this.Listener.onKeydownFun);
  75454. window.addEventListener('hashchange', _this.Listener.cancelEdit);
  75455. _this.on('polygonmarkManager.finish', _this.onFinishDraw.bind(_assertThisInitialized(_this)));
  75456. _this.player.on('pointerMove', _this.onMouseMove);
  75457. };
  75458. _this.unBindEvents = function () {
  75459. var domElement = _this.app.dom.querySelector('.player');
  75460. domElement.removeEventListener('pointerdown', _this.onMouseDown);
  75461. domElement.removeEventListener('pointerup', _this.onMouseUp);
  75462. domElement.removeEventListener('keydown', _this.Listener.onKeydownFun);
  75463. window.removeEventListener('hashchange', _this.Listener.cancelEdit);
  75464. _this.player.off('pointerMove', _this.onMouseMove);
  75465. };
  75466. _this.updateTouchElement = function () {
  75467. var touch = _this.player.getMouseIntersect(null, _this.activeGroup.intersectArr, {
  75468. recursive: true,
  75469. type: 'getAll'
  75470. });
  75471. if (touch) {
  75472. touch = touch.filter(function (i) {
  75473. return i.object.visible && (i.object.isPolygonMarkElement || i.object.isPolygonLabelElement) && i.object.parent;
  75474. });
  75475. if (touch.length <= 0) touch = null;
  75476. }
  75477. if (touch) {
  75478. //get到
  75479. var temp = touch.filter(function (i) {
  75480. return i.object.isSprite === true;
  75481. });
  75482. touch = temp.length >= 1 ? temp[0] : touch[0];
  75483. if (_this.touchElement && _this.touchElement.isPolygonMarkElement && _this.touchElement.parent) {
  75484. var touchMark = _this.touchElement.parent.parent.parentObj;
  75485. touchMark.lowLight();
  75486. _this.updateActivePoint(null, null, false);
  75487. }
  75488. _this.touchElement = touch.object;
  75489. _this.touchElement.isPolygonMarkElement && _this.touchElement.parent.parent.parentObj.midLight();
  75490. } else {
  75491. if (_this.touchElement && _this.touchElement.isPolygonMarkElement && _this.touchElement.parent) {
  75492. var _touchMark = _this.touchElement.parent.parent.parentObj;
  75493. _touchMark.lowLight();
  75494. _this.updateActivePoint(null, null, false);
  75495. }
  75496. _this.touchElement = null;
  75497. }
  75498. return touch;
  75499. };
  75500. _this.setGroupLight = function (sid) {
  75501. if (!sid) {
  75502. _this.touchGroup && _this.touchGroup.label && _this.touchGroup.label.onMouseLeave();
  75503. _this.touchGroup = null;
  75504. } else {
  75505. for (var i = 0; i < _this.list.length; i++) {
  75506. if (sid === _this.list[i].sid) {
  75507. _this.touchGroup = _this.list[i];
  75508. _this.touchGroup.label.onMouseEnter();
  75509. break;
  75510. }
  75511. }
  75512. }
  75513. };
  75514. _this.onMouseDown = function () {
  75515. _this.mousedown.copy(_this.player.mouse);
  75516. switch (_this.state) {
  75517. case 0:
  75518. //默认
  75519. if (_this.touchElement && _this.touchElement.isSprite) {
  75520. _this.onDragStart(_this.touchElement);
  75521. }
  75522. break;
  75523. }
  75524. };
  75525. _this.onMouseMove = function () {
  75526. //hover操作---------------------------------------------------------------------
  75527. var intersect = _this.player.getMouseIntersect(null, [_this.intersectBox], {
  75528. recursive: false
  75529. });
  75530. intersect && _this.mouse.copy(intersect.point);
  75531. if (_this.dragging) {
  75532. //拖拽label中
  75533. _this.onDragging(_this.mouse);
  75534. return;
  75535. }
  75536. var touch = null;
  75537. if (_this.activeGroup) {
  75538. touch = _this.updateTouchElement();
  75539. } // this.touchElement && console.log(this.touchElement)
  75540. // handle----------------------------------------------------------------------
  75541. switch (_this.state) {
  75542. //默认---------------------------------------------------------------------
  75543. case 0:
  75544. if (_this.touchElement) {
  75545. if (_this.touchElement.isSprite) {
  75546. CursorDeal.add('polygonMark_move');
  75547. } else if (_this.touchElement.isPolygonMarkLine) {
  75548. CursorDeal.remove('polygonMark_move');
  75549. CursorDeal.add('polygonMark_hover');
  75550. }
  75551. } else {
  75552. CursorDeal.remove('polygonMark_move');
  75553. CursorDeal.remove('polygonMark_hover');
  75554. }
  75555. break;
  75556. //绘制---------------------------------------------------------------------
  75557. case 1:
  75558. if (_this.drawing) {
  75559. _this.activeGroup.activeMark.draw.update(_this.mouse);
  75560. } else {
  75561. if (_this.touchElement) {
  75562. var touchMark = _this.touchElement.parent.parent.parentObj;
  75563. if (_this.touchElement.isPolygonMarkPoint) {
  75564. //光标切换为减点
  75565. CursorDeal.remove('polygonMark_addPen');
  75566. CursorDeal.add('polygonMark_subPen');
  75567. _this.updateActivePoint(_this.touchElement.position, touchMark, true);
  75568. } else if (_this.touchElement.isPolygonMarkLine) {
  75569. //光标切换为加点
  75570. CursorDeal.remove('polygonMark_subPen');
  75571. CursorDeal.add('polygonMark_addPen');
  75572. _this.updateActivePoint(touch.point, touchMark, true);
  75573. }
  75574. } else {
  75575. CursorDeal.remove('polygonMark_addPen');
  75576. CursorDeal.remove('polygonMark_subPen');
  75577. }
  75578. }
  75579. break;
  75580. }
  75581. };
  75582. _this.onMouseUp = function (event) {
  75583. _this.mouseup.copy(_this.player.mouse);
  75584. switch (_this.state) {
  75585. case 0:
  75586. //默认
  75587. if (_this.dragging) {
  75588. _this.onDragEnd();
  75589. } else {
  75590. if (Math.abs(_this.mousedown.x - _this.mouseup.x) > 0 || Math.abs(_this.mousedown.y - _this.mouseup.y) > 0) return;
  75591. if (_this.touchElement && _this.touchElement.isPolygonMarkLine) {
  75592. //选中多边形
  75593. if (_this.activeGroup.activeMark !== null) {
  75594. _this.activeGroup.activeMark.active = false;
  75595. _this.activeGroup.activeMark.lowLight(true);
  75596. }
  75597. _this.activeGroup.activeMark = _this.touchElement.parent.parent.parentObj;
  75598. _this.activeGroup.activeMark.active = true;
  75599. _this.activeGroup.activeMark.highLight(); //emit 选中
  75600. _this.emit('polygonmarkManager.activeMark');
  75601. } else if (!_this.touchElement) {
  75602. if (_this.activeGroup.activeMark !== null) {
  75603. _this.activeGroup.activeMark.active = false;
  75604. _this.activeGroup.activeMark.lowLight(true);
  75605. }
  75606. _this.activeGroup.activeMark = null;
  75607. _this.emit('polygonmarkManager.unactiveMark');
  75608. }
  75609. }
  75610. break;
  75611. case 1:
  75612. //绘制
  75613. if (_this.drawing) {
  75614. if (event.button === 2) {
  75615. // 右键
  75616. // console.log('右键')
  75617. _this.activeGroup.activeMark.draw.add(_this.mouse);
  75618. _this.activeGroup.activeMark.draw.finish(true);
  75619. } else {
  75620. //add 加点
  75621. if (Math.abs(_this.mousedown.x - _this.mouseup.x) > 0 || Math.abs(_this.mousedown.y - _this.mouseup.y) > 0) return;
  75622. _this.activeGroup.activeMark.draw.add(_this.mouse);
  75623. _this.recoverStack.length = 0;
  75624. }
  75625. } else {
  75626. if (event.button === 2) return;
  75627. if (!_this.touchElement) {
  75628. if (Math.abs(_this.mousedown.x - _this.mouseup.x) > 0 || Math.abs(_this.mousedown.y - _this.mouseup.y) > 0) return;
  75629. _this.activeGroup.addChild();
  75630. _this.activeGroup.activeMark.draw.add(_this.mouse);
  75631. _this.drawing = true;
  75632. } else if (_this.touchElement.isPolygonMarkPoint) {
  75633. //减点
  75634. // console.log('减点')
  75635. var touchMark = _this.touchElement.parent.parent.parentObj;
  75636. touchMark.draw.subtract(_this.touchElement);
  75637. _this.updateActivePoint(null, null, false);
  75638. touchMark && touchMark.lowLight();
  75639. } else if (_this.touchElement.isPolygonMarkLine) {
  75640. //加点
  75641. // console.log('加点')
  75642. var _touchMark2 = _this.touchElement.parent.parent.parentObj;
  75643. _touchMark2.draw.increase(_this.activePoint.position, _this.touchElement.startPoint);
  75644. }
  75645. }
  75646. break;
  75647. }
  75648. _this.onMouseMove();
  75649. };
  75650. _this.onDblClick = function () {
  75651. if (_this.drawing) {
  75652. console.log('onDblClick');
  75653. _this.activeGroup.activeMark.draw.finish(true);
  75654. }
  75655. };
  75656. _this.onDragStart = function (elem) {
  75657. // console.log('dragstart')
  75658. _this.player.cameraControls.activeControl.enabled = false;
  75659. _this.dragging = true;
  75660. _this.dragElement = elem;
  75661. _this.emit('polygonmarkManager.update');
  75662. };
  75663. _this.onDragging = function (pos) {
  75664. if (_this.dragging && _this.dragElement) {
  75665. var touchMark = _this.dragElement.parent.parent.parentObj;
  75666. touchMark.edit.update(_this.dragElement, pos);
  75667. }
  75668. };
  75669. _this.onDragEnd = function () {
  75670. // console.log('ondragend')
  75671. _this.player.cameraControls.activeControl.pointerDragOn = false;
  75672. _this.player.cameraControls.activeControl.enabled = true;
  75673. _this.dragging = false;
  75674. _this.dragElement = null;
  75675. };
  75676. _this.onZoom = function (e, fromZoom) {
  75677. if (!_this.isEdit) return;
  75678. _this.mainGroup.traverse(function (j) {
  75679. j.isSprite && j.setScale(e.zoomLevel, fromZoom);
  75680. });
  75681. };
  75682. _this.setActiveGroupNameType = function (name, type) {
  75683. if (!_this.activeGroup) return;
  75684. _this.activeGroup.setNameType(name, type);
  75685. };
  75686. _this.setActiveGroupColor = function (color) {
  75687. if (!_this.activeGroup) return;
  75688. _this.activeGroup.setColor(color);
  75689. };
  75690. _this.setLabelVisible = function (bool) {
  75691. _this.labelVisible = bool;
  75692. };
  75693. _this.setLabelEnabled = function (bool) {
  75694. _this.labelEnabled = bool;
  75695. _this.list.forEach(function (i) {
  75696. i.label && i.label.update();
  75697. });
  75698. };
  75699. _this.app = app;
  75700. _this.player = null;
  75701. _this.deferred = Deferred$1();
  75702. _this.list = [];
  75703. _this.mainGroup = new THREE.Group();
  75704. _this.reloadData = null;
  75705. _this.labelVisible = true; //标签显隐
  75706. _this.labelEnabled = true; //标签可视
  75707. _this.intersectBox = null;
  75708. _this.mouse = new THREE.Vector3();
  75709. _this.mousedown = new THREE.Vector3();
  75710. _this.mouseup = new THREE.Vector3();
  75711. _this.state = 0; //0 => 默认 1 => 绘制
  75712. _this.drawing = false; //是否绘制中
  75713. _this.dragging = false; //点是否拖拽中
  75714. _this.inited = false;
  75715. _this.isEdit = false;
  75716. _this.readyToEdit = false; //进入编辑前跳转点位中
  75717. _this.touchElement = null;
  75718. _this.dragElement = null;
  75719. _this.activeGroup = null; //在编辑的
  75720. _this.touchGroup = null;
  75721. _this.activeGroupHistoryData = null;
  75722. _this.focusGroup = null; //点击的
  75723. _this.activePoint = new Point(0xffffff);
  75724. _this.activePoint.midLight();
  75725. _this.activePoint.visible = false;
  75726. _this.mainGroup.add(_this.activePoint);
  75727. _this.finishReticule = new FinishReticule();
  75728. _this.finishReticule.visible = false;
  75729. _this.mainGroup.add(_this.finishReticule);
  75730. _this.activeMarkStartPoint = new THREE.Vector3();
  75731. _this.recoverStack = []; // 初始化
  75732. _this.init = function (metadata) {
  75733. // const geometry = new THREE.CapsuleGeometry( 10, 10, 3, 20 );
  75734. // const geometry = new THREE.SphereGeometry(5, 32, 16)
  75735. var geometry = new THREE.CylinderGeometry(5, 5, 25, 3, 1); // const geometry = new THREE.BoxGeometry(10,10,10)
  75736. var material = new THREE.MeshBasicMaterial({
  75737. side: 1,
  75738. wireframe: true
  75739. });
  75740. material.depthFunc = THREE.AlwaysDepth;
  75741. _this.intersectBox = new THREE.Mesh(geometry, material);
  75742. _this.intersectBox.renderOrder = 20;
  75743. _this.intersectBox.name = 'polygonmark_intersect';
  75744. _this.intersectBox.visible = false;
  75745. _this.mainGroup.add(_this.intersectBox);
  75746. _this.mainGroup.layers.set(17);
  75747. var currentPano = _this.player.currentPano;
  75748. _this.intersectBox.position.copy(currentPano.position);
  75749. var LabelElem = document.createElement('div');
  75750. LabelElem.className = 'polygonmark-labels';
  75751. _this.player.domElement.append(LabelElem);
  75752. if (metadata) {
  75753. // this.reloadData = JSON.parse(JSON.stringify(metadata))
  75754. metadata.data.forEach(function (i) {
  75755. if (_this.player.model.panos.index[i.panoId]) {
  75756. var polygonMarkGroup = new PolygonMarkGroup(_this.player, _assertThisInitialized(_this), {
  75757. sid: i.sid,
  75758. name: i.name,
  75759. type: i.type,
  75760. color: i.color,
  75761. panoId: i.panoId
  75762. });
  75763. polygonMarkGroup.build(i.list, i.labelPoint);
  75764. _this.list.push(polygonMarkGroup);
  75765. _this.mainGroup.add(polygonMarkGroup.group);
  75766. if (i.panoId !== currentPano.id) polygonMarkGroup.hide();
  75767. }
  75768. });
  75769. _this.setLabelEnabled(metadata.labelEnabled);
  75770. }
  75771. _this.player.model.add(_this.mainGroup);
  75772. _this.player.on('flying.ended', _this.onFlyEnd.bind(_assertThisInitialized(_this)));
  75773. _this.player.on('flying.started', _this.onFlyStart.bind(_assertThisInitialized(_this)));
  75774. _this.player.on('zoom', _this.onZoom.bind(_assertThisInitialized(_this)));
  75775. _this.inited = true;
  75776. if (_this.player.mode !== Viewmode$1.PANORAMA) {
  75777. _this.hideAll();
  75778. }
  75779. _this.bindEventsNotEdit();
  75780. _this.deferred.resolve();
  75781. };
  75782. _this.app.Scene.on('loadeddata', function () {
  75783. setTimeout( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  75784. var data, metadata, AIDraws, panoId;
  75785. return regenerator.wrap(function _callee$(_context) {
  75786. while (1) {
  75787. switch (_context.prev = _context.next) {
  75788. case 0:
  75789. _this.player = _this.app.core.get('Player'); //获取metadata
  75790. // let metadata = this.app.store.getValue('metadata').sceneDraw
  75791. data = _this.app.store.getValue('sceneDraw');
  75792. data = data && data.filter(function (item) {
  75793. return item.sourceType === 'draw';
  75794. });
  75795. metadata = {
  75796. data: data || [],
  75797. labelEnabled: _this.app.store.getValue('metadata').controls.showDrawTitle
  75798. }; //增加AI的框
  75799. _context.next = 6;
  75800. return _this.app.Scene.aiBox.loadAll();
  75801. case 6:
  75802. AIDraws = _context.sent;
  75803. for (panoId in AIDraws) {
  75804. AIDraws[panoId].shapes.forEach(function (shape) {
  75805. metadata.data.push(shape.drawData);
  75806. });
  75807. } // console.log(metadata)
  75808. _this.init(metadata);
  75809. console.log('polygonmanager init finish');
  75810. case 10:
  75811. case "end":
  75812. return _context.stop();
  75813. }
  75814. }
  75815. }, _callee);
  75816. })), 50);
  75817. });
  75818. /* this.app.Scene.on('AIDrawGot', (datas) => {//xzw add
  75819. for(let panoId in datas){
  75820. datas[panoId].shapes.forEach(shape=>{
  75821. let polygonMarkGroup = new PolygonMarkGroup(this.player, this, {
  75822. sid: shape.drawData.sid,
  75823. name: shape.drawData.name,
  75824. type: shape.drawData.type,
  75825. color: shape.drawData.color,
  75826. panoId: shape.drawData.panoId
  75827. })
  75828. polygonMarkGroup.build(shape.drawData.list, shape.drawData.labelPoint)
  75829. this.list.push(polygonMarkGroup)
  75830. this.mainGroup.add(polygonMarkGroup.group)
  75831. if (shape.drawData.panoId !== currentPano.id) polygonMarkGroup.hide()
  75832. })
  75833. }
  75834. }) */
  75835. // 进入模块
  75836. _this.enterEdit = function () {
  75837. _this.waitInit(function () {
  75838. if (_this.isEdit) return; //进入全景模式
  75839. if (_this.player.mode !== Viewmode$1.PANORAMA) _this.player.insideMode(); //绑定事件
  75840. _this.bindEvents();
  75841. _this.player.locked = true;
  75842. _this.isEdit = true;
  75843. _this.app.TagManager.switchAllDisplay(false, 'editPolygon', {
  75844. sceneDraws: true
  75845. });
  75846. }, _this.enterEdit.bind(_assertThisInitialized(_this)));
  75847. }; //离开模块
  75848. _this.leaveEdit = function () {
  75849. //解绑事件
  75850. if (!_this.isEdit) return;
  75851. _this.unBindEvents();
  75852. _this.player.locked = false;
  75853. _this.emit('polygonmarkManager.unactiveMark'); //恢复显示
  75854. _this.showAll(true, true);
  75855. _this.app.TagManager.switchAllDisplay(true, 'editPolygon', {
  75856. sceneDraws: true
  75857. });
  75858. _this.isEdit = false;
  75859. };
  75860. _this.setState = function (state) {
  75861. _this.state = state;
  75862. switch (_this.state) {
  75863. case 0:
  75864. _this.drawing && _this.activeGroup.activeMark.deleteAll();
  75865. CursorDeal.remove('polygonMark_pen');
  75866. break;
  75867. case 1:
  75868. CursorDeal.add('polygonMark_pen');
  75869. break;
  75870. }
  75871. }; //添加一个新的多边形组
  75872. _this.addMarkGroup = function (name, type, color) {
  75873. _this.waitInit(function () {
  75874. var polygonMarkGroup = new PolygonMarkGroup(_this.player, _assertThisInitialized(_this), {
  75875. name,
  75876. type,
  75877. color,
  75878. panoId: _this.player.currentPano.id
  75879. });
  75880. _this.list.push(polygonMarkGroup);
  75881. _this.mainGroup.add(polygonMarkGroup.group);
  75882. _this.setActiveGroup(polygonMarkGroup.sid, true);
  75883. _this.setState(1);
  75884. }, _this.addMarkGroup.bind(_assertThisInitialized(_this), name, type, color));
  75885. }; //删除多边形组
  75886. _this.deleteMarkGroup = function (sid) {
  75887. for (var i = 0; i < _this.list.length; i++) {
  75888. if (_this.list[i].sid === sid) {
  75889. var g = _this.list.splice(i, 1)[0];
  75890. g.dispose();
  75891. _this.mainGroup.remove(g);
  75892. break;
  75893. }
  75894. }
  75895. };
  75896. _this.deleteMark = function () {
  75897. _this.activeGroup && _this.activeGroup.deleteMark();
  75898. _this.emit('polygonmarkManager.unactiveMark');
  75899. };
  75900. _this.setFocusGroup = function (sid) {
  75901. var e = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  75902. var g;
  75903. var cancel = function cancel() {
  75904. _this.focusGroup.setActive(false);
  75905. _this.emit('polygonmarkManager.leaveLabel', _this.focusGroup.sid);
  75906. _this.focusGroup = null;
  75907. };
  75908. if (sid == void 0) {
  75909. return cancel();
  75910. }
  75911. for (var i = 0; i < _this.list.length; i++) {
  75912. if (_this.list[i].sid === sid) {
  75913. g = _this.list[i];
  75914. if (_this.focusGroup && _this.focusGroup === g) {
  75915. _this.setFocusGroup(null);
  75916. } else {
  75917. g.setActive(true);
  75918. _this.focusGroup = g;
  75919. _this.emit('polygonmarkManager.clickLabel', g.sid);
  75920. }
  75921. if (!e) {
  75922. e = {};
  75923. }
  75924. e.data = {
  75925. sid: g.sid,
  75926. title: g.name,
  75927. panoId: g.panoId
  75928. };
  75929. _this.app.Scene.emit("hotspot.click", {
  75930. type: 'draw',
  75931. event: e
  75932. });
  75933. } else {
  75934. _this.list[i].setActive(false);
  75935. }
  75936. }
  75937. if (_this.focusGroup) {
  75938. _this.focusGroup.labelPoint && _this.flyAndLookAt(_this.focusGroup.panoId, _this.focusGroup.labelPoint, true);
  75939. } else {
  75940. console.error('group not found, sid = ' + sid);
  75941. }
  75942. };
  75943. _this.flyAndLookAt = function (panoId, pos, checkAlone) {
  75944. _this.player.flyToPano({
  75945. pano: _this.app.Scene.panos.index[panoId],
  75946. lookAtPoint: pos,
  75947. checkAlone: checkAlone,
  75948. zoomLevel: _this.player.zoomLevel
  75949. });
  75950. };
  75951. _this.setActiveGroup = function (sid) {
  75952. var isNew = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  75953. _this.list.forEach(function (i) {
  75954. if (i.sid === sid) {
  75955. _this.activeGroup = i;
  75956. console.log('getActiveGroup', sid);
  75957. i.setActive(false);
  75958. if (isNew) {
  75959. _this.activeGroupHistoryData = null; //不保存退出时直接删除该组
  75960. _this.enterEdit();
  75961. } else {
  75962. _this.activeGroupHistoryData = i.toJSON(); //用于不保存退出时数据恢复
  75963. var currentPanoId = _this.player.currentPano.id;
  75964. _this.flyAndLookAt(i.panoId, i.labelPoint, true);
  75965. if (currentPanoId !== i.panoId) {
  75966. _this.readyToEdit = true;
  75967. _this.player.once('flying.ended', function () {
  75968. i.show();
  75969. _this.enterEdit();
  75970. _this.readyToEdit = false;
  75971. });
  75972. } else {
  75973. i.show();
  75974. _this.enterEdit();
  75975. }
  75976. }
  75977. } else {
  75978. i.hide();
  75979. }
  75980. });
  75981. }; //清空
  75982. _this.clear = function () {
  75983. _this.list.forEach(function (i) {
  75984. i.dispose();
  75985. });
  75986. _this.list.length = 0;
  75987. _this.activeGroup = null;
  75988. _this.mainGroup.clear();
  75989. };
  75990. /* //隐藏
  75991. this.hideAll = recursive => {
  75992. this.mainGroup.visible = false
  75993. this.setLabelVisible(false)
  75994. if (recursive) {
  75995. this.list.forEach(i => {
  75996. i.hide()
  75997. })
  75998. }
  75999. this.updateLabels()
  76000. }
  76001. //显示
  76002. this.showAll = (recursive, onlyCurrent) => {
  76003. if (this.player && this.player.mode !== Viewmode.PANORAMA) return //目前除全景模式外均不显示
  76004. this.mainGroup.visible = true
  76005. this.setLabelVisible(true)
  76006. if (recursive) {
  76007. this.list.forEach(i => {
  76008. if (onlyCurrent) {
  76009. let currentPanoId = this.player.currentPano.id
  76010. if (i.panoId === currentPanoId) {
  76011. i.show()
  76012. } else {
  76013. i.hide()
  76014. }
  76015. } else {
  76016. i.show()
  76017. }
  76018. })
  76019. }
  76020. this.updateLabels()
  76021. }
  76022. */
  76023. _this.hideAll = function (recursive, reason, level) {
  76024. common$1.updateVisible(_this.mainGroup, reason || 'hideAll', false, level);
  76025. if (!_this.mainGroup.visible) {
  76026. _this.setLabelVisible(false);
  76027. if (recursive) {
  76028. _this.list.forEach(function (i) {
  76029. i.hide();
  76030. });
  76031. }
  76032. _this.updateLabels();
  76033. }
  76034. }; //显示
  76035. _this.showAll = function (recursive, onlyCurrent, reason) {
  76036. //xzw add reason and level
  76037. common$1.updateVisible(_this.mainGroup, reason || 'hideAll', true);
  76038. if (_this.player && _this.player.mode !== Viewmode$1.PANORAMA) return; //目前除全景模式外均不显示
  76039. if (_this.mainGroup.visible) {
  76040. _this.setLabelVisible(true);
  76041. if (recursive) {
  76042. _this.list.forEach(function (i) {
  76043. if (onlyCurrent) {
  76044. var currentPanoId = _this.player.currentPano.id;
  76045. if (i.panoId === currentPanoId) {
  76046. i.show();
  76047. } else {
  76048. i.hide();
  76049. }
  76050. } else {
  76051. i.show();
  76052. }
  76053. });
  76054. }
  76055. _this.updateLabels();
  76056. }
  76057. };
  76058. return _this;
  76059. } //保存编辑
  76060. _createClass(PolygonMarkManager, [{
  76061. key: "bindEventsNotEdit",
  76062. value: function bindEventsNotEdit() {
  76063. var _this2 = this;
  76064. //非编辑状态 xzw add 多边形内可点击
  76065. var lastHover;
  76066. var onMove = function onMove() {
  76067. var intersect;
  76068. if (!_this2.isEdit) {
  76069. var allMeshes = [];
  76070. _this2.list.forEach(function (group) {
  76071. group.list.forEach(function (polygon) {
  76072. if (!polygon.group.realVisible()) return;
  76073. allMeshes.push(polygon.shape);
  76074. });
  76075. });
  76076. intersect = _this2.player.getMouseIntersect(null, allMeshes);
  76077. }
  76078. var mark;
  76079. if (intersect) {
  76080. mark = _this2.list.find(function (group) {
  76081. return group.list.some(function (e) {
  76082. return e.shape == intersect.object;
  76083. });
  76084. });
  76085. mark != lastHover && mark.label.onMouseEnter(); //highlight & emit
  76086. } else {
  76087. lastHover && lastHover.label.onMouseLeave();
  76088. }
  76089. lastHover = mark;
  76090. CursorDeal[intersect ? 'add' : 'remove']('polygonMark_hover');
  76091. };
  76092. this.player.on('pointerMove', onMove);
  76093. this.player.on('click', function (_ref2) {
  76094. var consume = _ref2.consume,
  76095. getConsumed = _ref2.getConsumed;
  76096. if (_this2.isEdit || getConsumed()) return;
  76097. onMove(); //for mobile
  76098. if (lastHover) {
  76099. var sid = lastHover.sid;
  76100. _this2.setFocusGroup(sid);
  76101. consume();
  76102. } else if (_this2.focusGroup) {
  76103. _this2.setFocusGroup(null);
  76104. consume();
  76105. }
  76106. });
  76107. }
  76108. }, {
  76109. key: "onFlyStart",
  76110. value: function onFlyStart() {
  76111. this.hideAll();
  76112. }
  76113. }, {
  76114. key: "onFlyEnd",
  76115. value: function onFlyEnd() {
  76116. if (this.player.mode !== Viewmode$1.PANORAMA) {
  76117. this.onZoom({
  76118. zoomLevel: 1
  76119. }, false);
  76120. } else {
  76121. var currentPano = this.player.currentPano;
  76122. this.intersectBox.position.copy(currentPano.position);
  76123. this.onZoom({
  76124. zoomLevel: null
  76125. }, false);
  76126. if (this.isEdit || this.readyToEdit) {
  76127. this.showAll();
  76128. } else {
  76129. this.showAll(true, true);
  76130. }
  76131. }
  76132. }
  76133. }, {
  76134. key: "onExit",
  76135. value: function onExit() {
  76136. this.cancelEdit();
  76137. }
  76138. }, {
  76139. key: "onKeydown",
  76140. value: function onKeydown(e) {
  76141. if (!this.drawing) return;
  76142. if (e.ctrlKey && !e.shiftKey && e.code == 'KeyZ') {
  76143. // console.log('ctrl+z')
  76144. // this.activeGroup.activeMark.draw.delete()
  76145. var p = this.activeGroup.activeMark.draw.delete();
  76146. this.drawing && this.recoverStack.push(p); // console.log(this.recoverStack)
  76147. } else if (e.ctrlKey && e.code == 'KeyY' || e.ctrlKey && e.shiftKey && e.code == 'KeyZ') {
  76148. // console.log('ctrl+y')
  76149. if (this.recoverStack.length <= 0) return;
  76150. var pos = this.recoverStack.pop();
  76151. this.activeGroup.activeMark.draw.recover(pos);
  76152. } else if (e.code == 'Escape') {
  76153. // console.log('Esc')
  76154. this.activeGroup.activeMark.deleteAll();
  76155. this.setState(0);
  76156. this.emit('polygonmarkManager.setState', 0);
  76157. }
  76158. }
  76159. }, {
  76160. key: "updateActivePoint",
  76161. value: function updateActivePoint(pos, mark, isVisible) {
  76162. pos && this.activePoint.setPosition(pos);
  76163. mark && this.activePoint.setColor(mark.color);
  76164. this.activePoint.visible = isVisible;
  76165. }
  76166. }, {
  76167. key: "updateLabels",
  76168. value: function updateLabels() {
  76169. if (this.player && this.player.polygonmarkLabels) {
  76170. this.player.polygonmarkLabels.forEach(function (i) {
  76171. i.update();
  76172. });
  76173. }
  76174. }
  76175. }, {
  76176. key: "showFinishManager",
  76177. value: function showFinishManager(pos) {
  76178. this.activeMarkStartPoint.copy(pos);
  76179. this.finishReticule.setPosition(pos);
  76180. this.finishReticule.visible = true;
  76181. }
  76182. }, {
  76183. key: "onFinishDraw",
  76184. value: function onFinishDraw() {
  76185. this.drawing = false;
  76186. this.recoverStack.length = 0;
  76187. }
  76188. }, {
  76189. key: "toJSON",
  76190. value: function toJSON() {
  76191. return this.activeGroup.toJSON();
  76192. } //等待初始化
  76193. }, {
  76194. key: "waitInit",
  76195. value: function waitInit(func, waitFunc) {
  76196. if (this.inited) {
  76197. func && func();
  76198. } else {
  76199. this.deferred.then(function () {
  76200. return waitFunc();
  76201. });
  76202. }
  76203. }
  76204. /* //新增属性: 填充色、闪烁
  76205. setAttributes(sid, { bgColor, bgOpacity, flashInterval }) {
  76206. let group = this.list.find(e => e.sid == sid)
  76207. if (group) {
  76208. group.setShapeStyle({ bgColor, bgOpacity, flashInterval })
  76209. }
  76210. }
  76211. flyToDraw(sid) {
  76212. this.focusGroup = null
  76213. this.setFocusGroup(sid)
  76214. } */
  76215. }]);
  76216. return PolygonMarkManager;
  76217. }(tinyEmitter);
  76218. 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); }; }
  76219. 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; } }
  76220. var PanoVideoSkySphere = /*#__PURE__*/function (_THREE$Mesh) {
  76221. _inherits(PanoVideoSkySphere, _THREE$Mesh);
  76222. var _super = _createSuper$c(PanoVideoSkySphere);
  76223. function PanoVideoSkySphere(url) {
  76224. var _this;
  76225. _classCallCheck(this, PanoVideoSkySphere);
  76226. var geometry = new THREE.SphereGeometry(5, 60, 40);
  76227. geometry.scale(-1, 1, 1);
  76228. _this = _super.call(this, geometry);
  76229. _this.videoElement = _this.creatVides(url);
  76230. var material = _this.getMaterial(_this.videoElement);
  76231. _this.material = material;
  76232. _this.renderOrder = RenderOrder.entryArrow;
  76233. return _this;
  76234. }
  76235. _createClass(PanoVideoSkySphere, [{
  76236. key: "getMaterial",
  76237. value: function getMaterial(video) {
  76238. var texture = new THREE.VideoTexture(video);
  76239. texture.minFilter = THREE.LinearFilter; // texture.uploaded = false
  76240. var material = new THREE.MeshBasicMaterial({
  76241. map: texture,
  76242. // depthWrite: false
  76243. opacity: 0,
  76244. transparent: true
  76245. });
  76246. material.depthFunc = THREE.AlwaysDepth;
  76247. return material;
  76248. }
  76249. }, {
  76250. key: "creatVides",
  76251. value: function creatVides(url) {
  76252. var _VersionControl$getEn = VersionControl.getEnvironment(),
  76253. os = _VersionControl$getEn.os,
  76254. environment = _VersionControl$getEn.environment;
  76255. var videoPlayer = null;
  76256. var video = null;
  76257. if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  76258. // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
  76259. videoPlayer = new FlvVideoPlayer$2();
  76260. video = videoPlayer._createVideo(url).videoElement; //console.log('use FlvVideoPlayer')
  76261. } else {
  76262. //console.log('use H5VideoPlayer')
  76263. videoPlayer = new H5VideoPlayer$2();
  76264. video = videoPlayer._createVideoElement(url);
  76265. } // console.log(videoPlayer)
  76266. // video.play()
  76267. return video;
  76268. }
  76269. }]);
  76270. return PanoVideoSkySphere;
  76271. }(THREE.Mesh);
  76272. 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); }; }
  76273. 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; } }
  76274. var PanoVideoManager = /*#__PURE__*/function (_Emiter) {
  76275. _inherits(PanoVideoManager, _Emiter);
  76276. var _super = _createSuper$b(PanoVideoManager);
  76277. function PanoVideoManager(app) {
  76278. var _this;
  76279. _classCallCheck(this, PanoVideoManager);
  76280. _this = _super.call(this);
  76281. _this.bindEvents = function () {
  76282. // this.player.on('pointerStart', this.onMouseDown)
  76283. // this.player.on('pointerMove', this.onMouseMove)
  76284. // this.player.on('pointerUp', this.onMouseUp)
  76285. _this.player.on(PlayerEvents.PanoChosen, _this.getPano);
  76286. _this.player.on('updataProgress', _this.updateOpacity);
  76287. _this.player.on(PlayerEvents.ModeChanging, _this.switchMode);
  76288. if (_this.player.model._3dTilesRuntime) ;
  76289. };
  76290. _this.getPano = function (currentPano, nextPano) {
  76291. // console.log('PlayerEvents.PanoChosen --------------------------------') //点位跳转
  76292. _this.currentPano = currentPano;
  76293. _this.nextPano = nextPano; // console.log(this.currentPano, this.nextPano)
  76294. };
  76295. _this.updateOpacity = function (val) {
  76296. // console.log(val)
  76297. if (_this.currentPano && _this.currentPano._360videos) {
  76298. _this.currentPano._360videos.material.opacity = 1.0 - val;
  76299. }
  76300. if (_this.nextPano && _this.nextPano._360videos) {
  76301. _this.nextPano._360videos.material.opacity = val;
  76302. }
  76303. if (val === 1) {
  76304. //into next done
  76305. if (_this.nextPano && _this.nextPano._360videos) {
  76306. _this.videoReInit(_this.nextPano._360videos.videoElement, true);
  76307. }
  76308. if (_this.currentPano && _this.currentPano._360videos) {
  76309. _this.videoReInit(_this.currentPano._360videos.videoElement, false);
  76310. }
  76311. }
  76312. if (val === 0) {
  76313. //into next begin
  76314. if (_this.nextPano && _this.nextPano._360videos) {
  76315. _this.videoReInit(_this.nextPano._360videos.videoElement, false);
  76316. }
  76317. if (_this.currentPano && _this.currentPano._360videos) {
  76318. _this.videoReInit(_this.currentPano._360videos.videoElement, true);
  76319. }
  76320. }
  76321. };
  76322. _this.switchMode = function (currentMode, mode, pano, transitionTime) {
  76323. // console.log('PlayerEvents.ModeChanging --------------------------------')
  76324. // console.log(currentMode, mode, pano, transitionTime)
  76325. if (mode === Viewmode$1.PANORAMA) {
  76326. _this.panoVideoGroup.visible = true;
  76327. _this.player.once('flying.ended', function () {
  76328. if (pano && pano._360videos) {
  76329. pano._360videos.material.opacity = 1;
  76330. _this.videoReInit(pano._360videos.videoElement, true);
  76331. }
  76332. });
  76333. } else {
  76334. _this.panoVideoGroup.visible = false;
  76335. _this.panoVideoGroup.children.forEach(function (child) {
  76336. child.material.opacity = 0;
  76337. _this.videoReInit(child.videoElement, false);
  76338. });
  76339. }
  76340. };
  76341. _this.videoReInit = function (videoElement, isplay) {
  76342. //videoElement.currentTime = 0
  76343. videoElement.muted = false;
  76344. if (isplay) {
  76345. // videoElement.muted = false
  76346. // console.log(videoElement.muted)
  76347. videoElement.play();
  76348. } else {
  76349. // videoElement.muted = true
  76350. // console.log(videoElement.muted)
  76351. videoElement.pause();
  76352. }
  76353. };
  76354. _this.app = app;
  76355. _this.player = null;
  76356. _this.deferred = Deferred$1();
  76357. _this.panoVideoGroup = new THREE.Group();
  76358. _this.panoVideos = [];
  76359. _this.opacity = 0;
  76360. _this.currentPano = null;
  76361. _this.nextPano = null;
  76362. _this.mouse = new THREE.Vector3();
  76363. _this.mousedown = new THREE.Vector3();
  76364. _this.mouseup = new THREE.Vector3(); // 初始化
  76365. _this.init = function (metadata) {
  76366. var reload = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  76367. if (metadata) {
  76368. console.log('PanoVideoManager init');
  76369. console.log(_this.app.Scene.panos);
  76370. _this.bindEvents();
  76371. _this.currentPano = _this.player.currentPano;
  76372. metadata.forEach(function (i) {
  76373. var pano = _this.app.Scene.panos.index[i.id];
  76374. if (!pano) {
  76375. console.error('pano360VideoManager: pano' + i.id + ' not find');
  76376. return;
  76377. }
  76378. var panoSphere = new PanoVideoSkySphere(i.url);
  76379. panoSphere.position.copy(pano.position); // panoSphere.position.y += 1
  76380. _this.panoVideoGroup.add(panoSphere);
  76381. pano._360videos = panoSphere; // console.log(pano)
  76382. });
  76383. _this.player.model.add(_this.panoVideoGroup);
  76384. _this.updateOpacity(0);
  76385. }
  76386. if (!reload) {
  76387. _this.deferred.resolve();
  76388. }
  76389. };
  76390. _this.load = function (metadata, baseURL) {
  76391. _this.app.Scene.whenLoaded(function () {
  76392. var _VersionControl$getEn = VersionControl.getEnvironment(),
  76393. os = _VersionControl$getEn.os,
  76394. environment = _VersionControl$getEn.environment;
  76395. var str = null;
  76396. _this.player = _this.app.core.get('Player');
  76397. if (window.MediaSource && (os == 'Android' || environment == 'WeChat')) {
  76398. // 小米自带浏览器、安卓微信只能用FlvVideoPlayer
  76399. str = '.flv'; //console.log('use FlvVideoPlayer')
  76400. } else {
  76401. //console.log('use H5VideoPlayer')
  76402. str = '.mp4';
  76403. } // let path = window.__sdk_video || 'https://4dkk.4dage.com/v4/example/360'
  76404. // let url = texture.getImageURL(path + str)
  76405. // let metadata = [
  76406. // // { id: 0, url: url },
  76407. // { id: 4, url: url },
  76408. // ]
  76409. if (metadata) {
  76410. metadata.forEach(function (item) {
  76411. item.url = baseURL + item.file + str;
  76412. delete item.file;
  76413. });
  76414. _this.init(metadata, true);
  76415. console.log('init finish');
  76416. }
  76417. });
  76418. }; //// 进入模块
  76419. // this.enterModule = () => {
  76420. // this.waitInit(() => {
  76421. // if (this.player.mode !== Viewmode.DOLLHOUSE) {
  76422. // //进入迷你模式
  76423. // this.player.flyToNewMode({ mode: Viewmode.DOLLHOUSE })
  76424. // //隐藏
  76425. // this.player.model.panos.forEach(pano => pano.hasVideo && common.updateVisible(pano.marker, 'force', false, 10))
  76426. // this.player.once('flying.ended', () => {
  76427. // this.player.OverlayManager.hide('all')
  76428. // this.app.Scene.Decoration.hideAll()
  76429. // this.app.Camera.monitor.control.hideAll(undefined, 'force', 10, undefined)
  76430. // this.player.labelManager.hide()
  76431. // this.player.linkEditor.hideFootIcons()
  76432. // this.player.linkEditor.delVisibleLines()
  76433. // // this.player.model.floors.show()
  76434. // })
  76435. // } else {
  76436. // this.player.model.panos.forEach(pano => pano.hasVideo && common.updateVisible(pano.marker, 'force', false, 10))
  76437. // this.player.OverlayManager.hide('all')
  76438. // this.app.Scene.Decoration.hideAll()
  76439. // this.app.Camera.monitor.control.hideAll()
  76440. // this.player.labelManager.hide()
  76441. // this.player.linkEditor.hideFootIcons()
  76442. // this.player.linkEditor.delVisibleLines()
  76443. // // this.player.model.floors.show()
  76444. // }
  76445. // //绑定事件
  76446. // this.bindEvents()
  76447. // this.player.locked = true
  76448. // }, this.enterModule.bind(this))
  76449. // }
  76450. // //离开模块
  76451. // this.leaveModule = () => {
  76452. // //解绑事件
  76453. // this.unBindEvents()
  76454. // this.player.locked = false
  76455. // //恢复显示
  76456. // this.player.model.panos.forEach(pano => pano.hasVideo && common.updateVisible(pano.marker, 'clipBox', true, 10))
  76457. // this.player.OverlayManager.show('all')
  76458. // this.app.Scene.Decoration.showAll()
  76459. // this.app.Camera.monitor.control.showAll(undefined, 'clipBox', 10, undefined)
  76460. // this.player.labelManager.show()
  76461. // }
  76462. // //添加
  76463. // this.add = () => {
  76464. // this.waitInit(() => {
  76465. // console.log('add')
  76466. // }, this.add.bind(this))
  76467. // }
  76468. // //删除
  76469. // this.delete = () => {
  76470. // }
  76471. // //清空
  76472. // this.clear = () => {
  76473. // }
  76474. // //保存编辑
  76475. // this.saveEdit = () => {
  76476. // }
  76477. // //退出编辑
  76478. // this.cancelEdit = () => {
  76479. // }
  76480. return _this;
  76481. } //事件绑定
  76482. _createClass(PanoVideoManager, [{
  76483. key: "waitInit",
  76484. value: //等待初始化
  76485. function waitInit(func, waitFunc) {
  76486. if (this.player) {
  76487. func && func();
  76488. } else {
  76489. this.deferred.then(function () {
  76490. return waitFunc();
  76491. });
  76492. }
  76493. }
  76494. }]);
  76495. return PanoVideoManager;
  76496. }(tinyEmitter);
  76497. /**
  76498. * 上传人体抠图
  76499. * @param {object} data 传入的对象参数
  76500. * @param {file} data.file 原始图片
  76501. * @returns {Promise}
  76502. **/
  76503. var uploadBodySegment = function uploadBodySegment(data) {
  76504. return http.postFile('/service/scene/uploadBodySegment', data);
  76505. };
  76506. /**
  76507. * 动态面板/查询是否有动态面板数据
  76508. * @param {object} data 传入的对象参数
  76509. * @returns {Promise}
  76510. **/
  76511. var checkDynamicPanel = function checkDynamicPanel(data) {
  76512. return http.get('/service/scene/checkDynamicPanel', data);
  76513. };
  76514. /**
  76515. * 场景同步数据包下载
  76516. * @param {object} data 传入的对象参数
  76517. * @param {text} data.num 场景码
  76518. * @returns {Promise}
  76519. **/
  76520. var downLoadZSData = function downLoadZSData(data) {
  76521. return http.postFile('/service/scene/downLoadZSData', data);
  76522. };
  76523. /**
  76524. * 查询人体抠图结果
  76525. * @param {object} data 传入的对象参数
  76526. * @param {text} data.serialNum 操作序列号
  76527. * @returns {Promise}
  76528. **/
  76529. var getBodySegmentStatus = function getBodySegmentStatus(data) {
  76530. return http.postFile('/service/scene/getBodySegmentStatus', data);
  76531. };
  76532. /**
  76533. * 校验场景密码
  76534. * @param {object} data 传入的对象参数
  76535. * @param {string} data.num 场景码
  76536. * @param {string} data.password 场景密码
  76537. * @returns {Promise}
  76538. **/
  76539. var check_key = function check_key(data) {
  76540. return http.post('/service/scene/check/key', data);
  76541. };
  76542. /**
  76543. * 获取场景详情-查看页面
  76544. * @param {object} data 传入的对象参数
  76545. * @param {string} data.num 场景码
  76546. * @param {number} data.reqType 请求来源(1-编辑页面 2-查看页面)
  76547. * @returns {Promise}
  76548. **/
  76549. var getInfo$1 = function getInfo(data) {
  76550. return http.get('/service/scene/getInfo', data);
  76551. };
  76552. var viewApis = /*#__PURE__*/Object.freeze({
  76553. __proto__: null,
  76554. uploadBodySegment: uploadBodySegment,
  76555. checkDynamicPanel: checkDynamicPanel,
  76556. downLoadZSData: downLoadZSData,
  76557. getBodySegmentStatus: getBodySegmentStatus,
  76558. check_key: check_key,
  76559. getInfo: getInfo$1
  76560. });
  76561. /**
  76562. * 根据sid修改标注
  76563. * @param {object} data 传入的对象参数
  76564. * @param {string} data.num 场景码
  76565. * @param {object} data.shape
  76566. * @returns {Promise}
  76567. **/
  76568. var sceneMarkShape_updateBySid = function sceneMarkShape_updateBySid(data) {
  76569. return http.post('/shapes/sceneMarkShape/updateBySid', data);
  76570. };
  76571. /**
  76572. * 批量删除标注
  76573. * @param {object} data 传入的对象参数
  76574. * @param {string} data.num 场景码
  76575. * @param {array} data.sids [sid,sid]
  76576. * @returns {Promise}
  76577. **/
  76578. var sceneMarkShape_delete = function sceneMarkShape_delete(data) {
  76579. return http.post('/service/shapes/sceneMarkShape/delete', data);
  76580. }; // /**
  76581. // * 获取标注列表
  76582. // * @param {object} data 传入的对象参数
  76583. // * @param {string} data.num 场景码
  76584. // * @returns {Promise}
  76585. // **/
  76586. // export const sceneMarkShape_getInfo = data => {
  76587. // return http.post('/service/shapes/sceneMarkShape/getInfo', data)
  76588. // }
  76589. /**
  76590. * AI识别
  76591. * @param {object} data 传入的对象参数
  76592. * @param {string} data.num 场景码
  76593. * @returns {Promise}
  76594. **/
  76595. var ai_box4_getInfos = function ai_box4_getInfos(data) {
  76596. return http.post('/service/scene/edit/ai/box4/getInfos', data);
  76597. };
  76598. /**
  76599. * TOUR/上传导览视频
  76600. * @param {object} data 传入的对象参数
  76601. * @param {text} data.num 场景码
  76602. * @param {file} data.file 导览视频MP4
  76603. * @returns {Promise}
  76604. **/
  76605. var tour_video_upload = function tour_video_upload(data) {
  76606. return http.postFile('/service/scene/edit/tour/video/upload', data);
  76607. };
  76608. /**
  76609. * TOUR/下载导览视频
  76610. * @param {object} data 传入的对象参数
  76611. * @param {text} data.num 场景码
  76612. * @returns {Promise}
  76613. **/
  76614. var tour_video_download = function tour_video_download(data) {
  76615. return http.postFile('/service/scene/edit/tour/video/download', data);
  76616. };
  76617. /**
  76618. * TOUR/保存导览
  76619. * @param {object} data 传入的对象参数
  76620. * @param {string} data.num 场景码
  76621. * @param {string} data.data 导览数据
  76622. * @returns {Promise}
  76623. **/
  76624. var tour_save = function tour_save(data) {
  76625. return http.post('/service/scene/edit/tour/save', data);
  76626. };
  76627. /**
  76628. * TOUR/删除导览
  76629. * @param {object} data 传入的对象参数
  76630. * @param {string} data.num 场景码
  76631. * @returns {Promise}
  76632. **/
  76633. var tour_delete = function tour_delete(data) {
  76634. return http.post('/service/scene/edit/tour/delete', data);
  76635. };
  76636. /**
  76637. * 上传下载/获取点位经纬度
  76638. * @param {object} data 传入的对象参数
  76639. * @returns {Promise}
  76640. **/
  76641. var point_getLatAndLon = function point_getLatAndLon(data) {
  76642. return http.get('/service/scene/edit/point/getLatAndLon', data);
  76643. };
  76644. /**
  76645. * 公共/上传国际化文件
  76646. * @param {object} data 传入的对象参数
  76647. * @param {string} data.file 文件名称
  76648. * @param {object} data.data json格式对象
  76649. * @returns {Promise}
  76650. **/
  76651. var locales = function locales(data) {
  76652. return http.post('/service/scene/edit/locales', data);
  76653. };
  76654. /**
  76655. * 公共/自定义文件上传
  76656. * @param {object} data 传入的对象参数
  76657. * @param {string} data.content 文件内容
  76658. * @param {string} data.ossPath oss文件地址
  76659. * @returns {Promise}
  76660. **/
  76661. var upload_content = function upload_content(data) {
  76662. return http.post('/service/scene/edit/upload/content', data);
  76663. };
  76664. /**
  76665. * 公共/获取场景编辑权限
  76666. * @param {object} data 传入的对象参数
  76667. * @param {text} data.num 场景码
  76668. * @returns {Promise}
  76669. **/
  76670. var getAuth = function getAuth(data) {
  76671. return http.postFile('/service/scene/edit/getAuth', data);
  76672. };
  76673. /**
  76674. * 公共/获取异步操作记录
  76675. * @param {object} data 传入的对象参数
  76676. * @param {string} data.num 场景码
  76677. * @param {string} data.operType 操作(upload-上传,download-下载)
  76678. * @param {string} data.module 模块(upload_download-上传下载)
  76679. * @param {string} data.function 功能(panorama-全景图,model-模型)
  76680. * @returns {Promise}
  76681. **/
  76682. var getAsynOperLog = function getAsynOperLog(data) {
  76683. return http.post('/service/scene/edit/getAsynOperLog', data);
  76684. };
  76685. /**
  76686. * 公共/获取编辑器版本信息
  76687. * @param {object} data 传入的对象参数
  76688. * @returns {Promise}
  76689. **/
  76690. var getServiceUpTip = function getServiceUpTip(data) {
  76691. return http.get('/service/scene/edit/getServiceUpTip', data);
  76692. };
  76693. /**
  76694. * 初始画面/保存初始画面
  76695. * @param {object} data 传入的对象参数
  76696. * @param {string} data.num 场景码
  76697. * @param {string} data.fileName 文件名
  76698. * @param {string} data.data 初始点信息
  76699. * @returns {Promise}
  76700. **/
  76701. var saveInitialPage = function saveInitialPage(data) {
  76702. return http.post('/service/scene/edit/saveInitialPage', data);
  76703. };
  76704. /**
  76705. * 动态面板/修改
  76706. * @param {object} data 传入的对象参数
  76707. * @param {string} data.num
  76708. * @param {object} data.data
  76709. * @param {string} data.data.text undefined
  76710. * @param {string} data.data.sid undefined
  76711. * @returns {Promise}
  76712. **/
  76713. var dynamicPanel_update = function dynamicPanel_update(data) {
  76714. return http.post('/service/scene/edit/dynamicPanel/update', data);
  76715. };
  76716. /**
  76717. * 动态面板/列表
  76718. * @param {object} data 传入的对象参数
  76719. * @returns {Promise}
  76720. **/
  76721. var dynamicPanel_list = function dynamicPanel_list(data) {
  76722. return http.get('/service/scene/edit/dynamicPanel/list', data);
  76723. };
  76724. /**
  76725. * 场景信息/上传logo
  76726. * @param {object} data 传入的对象参数
  76727. * @param {string} data.num 场景码
  76728. * @param {string} data.floorLogo 地面logo名称
  76729. * @param {number} data.floorLogoSize 地面logo大小
  76730. * @param {string} data.music 背景音乐名称
  76731. * @param {string} data.scenePassword 加密浏览密码
  76732. * @param {string} data.title 场景标题
  76733. * @param {string} data.description 场景描述
  76734. * @param {number} data.floorPlanUpload 用户是否上传自定义平面图(0-否,1-是)
  76735. * @param {object} data.controls
  76736. * @param {number} data.controls.showMap 是否展示小地图(0-否,1-是)
  76737. * @param {number} data.controls.showLock 是否需要密码访问(0-否,1-是)
  76738. * @param {number} data.controls.showTitle 是否展示标题(0-否,1-是)
  76739. * @param {number} data.controls.showPanorama 是否展示漫游按钮(0-否,1-是)
  76740. * @param {number} data.controls.showDollhouse 是否展示3D按钮(0-否,1-是)
  76741. * @param {number} data.controls.showFloorplan 是否展示2D按钮(0-否,1-是)
  76742. * @returns {Promise}
  76743. **/
  76744. var uploadShareLogo = function uploadShareLogo(data) {
  76745. return http.postFile('/service/scene/edit/uploadShareLogo', data);
  76746. };
  76747. /**
  76748. * 场景修复/保存水印
  76749. * @param {object} data 传入的对象参数
  76750. * @param {string} data.num 场景码
  76751. * @param {string} data.fileName 文件名
  76752. * @returns {Promise}
  76753. **/
  76754. var waterMark_add = function waterMark_add(data) {
  76755. return http.post('/service/scene/edit/waterMark/add', data);
  76756. };
  76757. /**
  76758. * 场景修复/删除水印
  76759. * @param {object} data 传入的对象参数
  76760. * @param {string} data.num 场景码
  76761. * @param {string} data.fileName 文件名
  76762. * @returns {Promise}
  76763. **/
  76764. var waterMark_delete = function waterMark_delete(data) {
  76765. return http.post('/service/scene/edit/waterMark/delete', data);
  76766. };
  76767. /**
  76768. * 场景关联/上传场景关联全景图
  76769. * @param {object} data 传入的对象参数
  76770. * @param {string} data.num 场景码
  76771. * @param {array} data.styles 图标json数组
  76772. * @param {array} data.linkPans 场景关联json数组
  76773. * @returns {Promise}
  76774. **/
  76775. var linkPan_upload = function linkPan_upload(data) {
  76776. return http.postFile('/service/scene/edit/linkPan/upload', data);
  76777. };
  76778. /**
  76779. * 场景关联/保存场景关联
  76780. * @param {object} data 传入的对象参数
  76781. * @param {string} data.num 场景码
  76782. * @param {array} data.styles 图标json数组
  76783. * @param {array} data.linkPans 场景关联json数组
  76784. * @returns {Promise}
  76785. **/
  76786. var linkPan_save = function linkPan_save(data) {
  76787. return http.post('/service/scene/edit/linkPan/save', data);
  76788. };
  76789. /**
  76790. * 场景关联/删除关联场景
  76791. * @param {object} data 传入的对象参数
  76792. * @param {string} data.num 场景码
  76793. * @param {array} data.sidList sid数组
  76794. * @returns {Promise}
  76795. **/
  76796. var linkPan_delete = function linkPan_delete(data) {
  76797. return http.post('/service/scene/edit/linkPan/delete', data);
  76798. };
  76799. /**
  76800. * 场景关联/删除场景关联图标
  76801. * @param {object} data 传入的对象参数
  76802. * @param {string} data.num 场景码
  76803. * @param {array} data.sidList id数组
  76804. * @returns {Promise}
  76805. **/
  76806. var styles_delete = function styles_delete(data) {
  76807. return http.post('/service/scene/edit/styles/delete', data);
  76808. };
  76809. /**
  76810. * 场景关联/获取场景关联列表
  76811. * @param {object} data 传入的对象参数
  76812. * @param {string} data.num 场景码
  76813. * @param {array} data.styles 图标json数组
  76814. * @param {array} data.linkPans 场景关联json数组
  76815. * @returns {Promise}
  76816. **/
  76817. var linkPan_list = function linkPan_list(data) {
  76818. return http.postFile('/service/scene/edit/linkPan/list', data);
  76819. };
  76820. /**
  76821. * 基础设置/保存场景信息
  76822. * @param {object} data 传入的对象参数
  76823. * @param {string} data.num 场景码
  76824. * @param {string} data.floorLogo 地面logo名称
  76825. * @param {number} data.floorLogoSize 地面logo大小
  76826. * @param {string} data.music 背景音乐名称
  76827. * @param {string} data.scenePassword 加密浏览密码
  76828. * @param {string} data.title 场景标题
  76829. * @param {string} data.description 场景描述
  76830. * @param {number} data.floorPlanUpload 用户是否上传自定义平面图(0-否,1-是)
  76831. * @param {object} data.controls
  76832. * @param {number} data.controls.showMap 是否展示小地图(0-否,1-是)
  76833. * @param {number} data.controls.showLock 是否需要密码访问(0-否,1-是)
  76834. * @param {number} data.controls.showTitle 是否展示标题(0-否,1-是)
  76835. * @param {number} data.controls.showPanorama 是否展示漫游按钮(0-否,1-是)
  76836. * @param {number} data.controls.showDollhouse 是否展示3D按钮(0-否,1-是)
  76837. * @param {number} data.controls.showFloorplan 是否展示2D按钮(0-否,1-是)
  76838. * @param {object} data.sns 分享配置信息(json格式)
  76839. * @returns {Promise}
  76840. **/
  76841. var base_save = function base_save(data) {
  76842. return http.post('/service/scene/edit/base/save', data);
  76843. };
  76844. /**
  76845. * 平面图/上传dxf
  76846. * @param {object} data 传入的对象参数
  76847. * @param {file} data.file
  76848. * @param {text} data.num
  76849. * @param {text} data.subgroup
  76850. * @returns {Promise}
  76851. **/
  76852. var cad_dxf_upload = function cad_dxf_upload(data) {
  76853. return http.postFile('/service/scene/edit/cad/dxf/upload', data);
  76854. };
  76855. /**
  76856. * 平面图/下载dxf
  76857. * @param {object} data 传入的对象参数
  76858. * @returns {Promise}
  76859. **/
  76860. var cad_dxf_download = function cad_dxf_download(data) {
  76861. return http.get('/service/scene/edit/cad/dxf/download', data);
  76862. };
  76863. /**
  76864. * 平面图/户型图重命名
  76865. * @param {object} data 传入的对象参数
  76866. * @param {string} data.num 场景码
  76867. * @param {array} data.floors 楼层数组
  76868. * @returns {Promise}
  76869. **/
  76870. var cad_rename = function cad_rename(data) {
  76871. return http.post('/service/scene/edit/cad/rename', data);
  76872. };
  76873. /**
  76874. * 模型裁剪/保存
  76875. * @param {object} data 传入的对象参数
  76876. * @param {string} data.num 场景码
  76877. * @param {array} data.data 指示牌数据
  76878. * @returns {Promise}
  76879. **/
  76880. var cutModel_save = function cutModel_save(data) {
  76881. return http.post('/service/scene/edit/cutModel/save', data);
  76882. };
  76883. /**
  76884. * 模型裁剪/列表
  76885. * @param {object} data 传入的对象参数
  76886. * @param {string} data.num 场景码
  76887. * @returns {Promise}
  76888. **/
  76889. var cutModel_list = function cutModel_list(data) {
  76890. return http.post('/service/scene/edit/cutModel/list', data);
  76891. };
  76892. /**
  76893. * 模型裁剪/删除
  76894. * @param {object} data 传入的对象参数
  76895. * @param {string} data.num 场景码
  76896. * @param {array} data.sidList sid集合
  76897. * @returns {Promise}
  76898. **/
  76899. var cutModel_delete = function cutModel_delete(data) {
  76900. return http.post('/service/scene/edit/cutModel/delete', data);
  76901. };
  76902. /**
  76903. * 添加热点/删除icons
  76904. * @param {object} data 传入的对象参数
  76905. * @param {string} data.num 场景码
  76906. * @param {array} data.fileNameList 文件名集合
  76907. * @returns {Promise}
  76908. **/
  76909. var icons_delete = function icons_delete(data) {
  76910. return http.post('/service/scene/edit/icons/delete', data);
  76911. };
  76912. /**
  76913. * 添加热点/单独删除热点图片v4.14.0
  76914. * @param {object} data 传入的对象参数
  76915. * @param {string} data.num 场景吗
  76916. * @param {array} data.sidList sid素族
  76917. * @returns {Promise}
  76918. **/
  76919. var tag_img_delete = function tag_img_delete(data) {
  76920. return http.post('/service/scene/edit/tag/img/delete', data);
  76921. };
  76922. /**
  76923. * 添加热点/图片上传
  76924. * @param {object} data 传入的对象参数
  76925. * @param {file} data.file
  76926. * @param {text} data.num
  76927. * @param {text} data.sid
  76928. * @param {text} data.size 大小 ,默认320
  76929. * @returns {Promise}
  76930. **/
  76931. var tag_img_upload = function tag_img_upload(data) {
  76932. return http.postFile('/service/scene/edit/tag/img/upload', data);
  76933. };
  76934. /**
  76935. * 滤镜/保存滤镜
  76936. * @param {object} data 传入的对象参数
  76937. * @param {string} data.num 场景码
  76938. * @param {string} data.data 滤镜数据
  76939. * @param {number} data.reset 是否恢复默认(0-否,1-是,null-否)
  76940. * @returns {Promise}
  76941. **/
  76942. var filter_save = function filter_save(data) {
  76943. return http.post('/service/scene/edit/filter/save', data);
  76944. };
  76945. /**
  76946. * 滤镜/保存风格滤镜
  76947. * @param {object} data 传入的对象参数
  76948. * @param {string} data.num
  76949. * @param {string} data.data
  76950. * @returns {Promise}
  76951. **/
  76952. var uploadROIFilter = function uploadROIFilter(data) {
  76953. return http.post('/service/scene/edit/uploadROIFilter', data);
  76954. };
  76955. /**
  76956. * 滤镜/滤镜列表
  76957. * @param {object} data 传入的对象参数
  76958. * @param {string} data.num 场景码
  76959. * @returns {Promise}
  76960. **/
  76961. var filter_list = function filter_list(data) {
  76962. return http.post('/service/scene/edit/filter/list', data);
  76963. };
  76964. /**
  76965. * 热点/指示牌/保存
  76966. * @param {object} data 传入的对象参数
  76967. * @param {string} data.num 场景码
  76968. * @param {array} data.data 指示牌数据
  76969. * @param {array} data.styles 自定义图标数据
  76970. * @returns {Promise}
  76971. **/
  76972. var billboards_save = function billboards_save(data) {
  76973. return http.post('/service/scene/edit/billboards/save', data);
  76974. };
  76975. /**
  76976. * 热点/指示牌/列表
  76977. * @param {object} data 传入的对象参数
  76978. * @param {string} data.num 场景码
  76979. * @returns {Promise}
  76980. **/
  76981. var billboards_list = function billboards_list(data) {
  76982. return http.post('/service/scene/edit/billboards/list', data);
  76983. };
  76984. /**
  76985. * 热点/指示牌/删除
  76986. * @param {object} data 传入的对象参数
  76987. * @param {string} data.num 场景码
  76988. * @param {array} data.sidList sid集合
  76989. * @returns {Promise}
  76990. **/
  76991. var billboards_delete = function billboards_delete(data) {
  76992. return http.post('/service/scene/edit/billboards/delete', data);
  76993. };
  76994. /**
  76995. * 热点/指示牌/删除自定义图标
  76996. * @param {object} data 传入的对象参数
  76997. * @param {string} data.num 场景码
  76998. * @param {array} data.sidList sid集合
  76999. * @returns {Promise}
  77000. **/
  77001. var billboards_styles_delete = function billboards_styles_delete(data) {
  77002. return http.post('/service/scene/edit/billboards/styles/delete', data);
  77003. };
  77004. /**
  77005. * 监控/保存监控
  77006. * @param {object} data 传入的对象参数
  77007. * @param {string} data.num 场景码
  77008. * @param {object} data.data 监控设置,json对象
  77009. * @param {string} data.name 监控名称
  77010. * @param {string} data.playUrl 监控地址
  77011. * @param {string} data.sid 监控sid
  77012. * @param {string} data.panoId panoId
  77013. * @returns {Promise}
  77014. **/
  77015. var surveillance_save = function surveillance_save(data) {
  77016. return http.post('/service/scene/edit/surveillance/save', data);
  77017. };
  77018. /**
  77019. * 监控/删除监控
  77020. * @param {object} data 传入的对象参数
  77021. * @param {number} data.sid 监控sid
  77022. * @param {string} data.num 场景码
  77023. * @returns {Promise}
  77024. **/
  77025. var surveillance_delete = function surveillance_delete(data) {
  77026. return http.post('/service/scene/edit/surveillance/delete', data);
  77027. };
  77028. /**
  77029. * 监控/监控列表
  77030. * @param {object} data 传入的对象参数
  77031. * @param {string} data.num 场景码
  77032. * @returns {Promise}
  77033. **/
  77034. var surveillance_list = function surveillance_list(data) {
  77035. return http.post('/service/scene/edit/surveillance/list', data);
  77036. };
  77037. /**
  77038. * 空间绘制/保存
  77039. * @param {object} data 传入的对象参数
  77040. * @param {string} data.num
  77041. * @param {array} data.data
  77042. * @returns {Promise}
  77043. **/
  77044. var sceneDraw_save = function sceneDraw_save(data) {
  77045. return http.post('/service/scene/edit/sceneDraw/save', data);
  77046. };
  77047. /**
  77048. * 空间绘制/删除
  77049. * @param {object} data 传入的对象参数
  77050. * @param {string} data.num
  77051. * @param {array} data.sidList
  77052. * @returns {Promise}
  77053. **/
  77054. var sceneDraw_delete = function sceneDraw_delete(data) {
  77055. return http.post('/service/scene/edit/sceneDraw/delete', data);
  77056. };
  77057. /**
  77058. * 空间绘制/查询空间绘制列表
  77059. * @param {object} data 传入的对象参数
  77060. * @returns {Promise}
  77061. **/
  77062. var sceneDraw_list = function sceneDraw_list(data) {
  77063. return http.get('/service/scene/edit/sceneDraw/list', data);
  77064. };
  77065. /**
  77066. * 空间装饰/上传空间模型
  77067. * @param {object} data 传入的对象参数
  77068. * @param {text} data.num 场景码
  77069. * @param {text} data.sid sid
  77070. * @param {file} data.file 模型压缩包,仅支持zip
  77071. * @returns {Promise}
  77072. **/
  77073. var model_box_upload = function model_box_upload(data) {
  77074. return http.postFile('/service/scene/edit/model/box/upload', data);
  77075. };
  77076. /**
  77077. * 空间装饰/保存空间模型
  77078. * @param {object} data 传入的对象参数
  77079. * @param {string} data.num 场景码
  77080. * @param {object} data.data json数据
  77081. * @param {string} data.data.sid undefined
  77082. * @returns {Promise}
  77083. **/
  77084. var model_box_save = function model_box_save(data) {
  77085. return http.post('/service/scene/edit/model/box/save', data);
  77086. };
  77087. /**
  77088. * 空间装饰/保存空间贴图
  77089. * @param {object} data 传入的对象参数
  77090. * @param {string} data.num 场景码
  77091. * @param {string} data.data 空间贴图数据
  77092. * @returns {Promise}
  77093. **/
  77094. var photo_box_save = function photo_box_save(data) {
  77095. return http.post('/service/scene/edit/photo/box/save', data);
  77096. };
  77097. /**
  77098. * 空间装饰/删除空间模型
  77099. * @param {object} data 传入的对象参数
  77100. * @param {string} data.num 场景码
  77101. * @param {string} data.sid sid
  77102. * @returns {Promise}
  77103. **/
  77104. var model_box_delete = function model_box_delete(data) {
  77105. return http.post('/service/scene/edit/model/box/delete', data);
  77106. };
  77107. /**
  77108. * 空间装饰/删除空间贴图
  77109. * @param {object} data 传入的对象参数
  77110. * @param {string} data.num 场景码
  77111. * @param {string} data.sid sid
  77112. * @returns {Promise}
  77113. **/
  77114. var photo_box_delete = function photo_box_delete(data) {
  77115. return http.post('/service/scene/edit/photo/box/delete', data);
  77116. };
  77117. /**
  77118. * 马赛克/删除马赛克
  77119. * @param {object} data 传入的对象参数
  77120. * @param {string} data.num 场景码
  77121. * @param {array} data.panoIdList 集合
  77122. * @returns {Promise}
  77123. **/
  77124. var mosaics_delete = function mosaics_delete(data) {
  77125. return http.post('/service/scene/edit/mosaics/delete', data);
  77126. };
  77127. /**
  77128. * 马赛克/添加马赛克
  77129. * @param {object} data 传入的对象参数
  77130. * @param {string} data.num 场景码
  77131. * @param {string} data.data 马赛克数据
  77132. * @returns {Promise}
  77133. **/
  77134. var mosaics_add = function mosaics_add(data) {
  77135. return http.post('/service/scene/edit/mosaics/add', data);
  77136. };
  77137. /**
  77138. * 马赛克/马赛克列表
  77139. * @param {object} data 传入的对象参数
  77140. * @param {string} data.num 场景码
  77141. * @returns {Promise}
  77142. **/
  77143. var mosaics_list = function mosaics_list(data) {
  77144. return http.post('/service/scene/edit/mosaics/list', data);
  77145. };
  77146. /**
  77147. * 公共/场景发布
  77148. * @param {object} data 传入的对象参数
  77149. * @param {string} data.num 场景码
  77150. * @returns {Promise}
  77151. **/
  77152. var publicScene = function publicScene(data) {
  77153. return http.post('/service/scene/edit/publicScene', data);
  77154. };
  77155. /**
  77156. * 公共/文件上传
  77157. * @param {object} data 传入的对象参数
  77158. * @param {text} data.base64 图片base64
  77159. * @param {text} data.num 场景码
  77160. * @param {text} data.type 0添加,1替换,默认为1
  77161. * @param {file} data.files 文件数组
  77162. * @param {text} data.fileName 文件名称
  77163. * @param {text} data.bizType 业务类型
  77164. * @param {text} data.uploadPath 上传oss路径
  77165. * @returns {Promise}
  77166. **/
  77167. var upload_files = function upload_files(data) {
  77168. return http.postFile('/service/scene/edit/upload/files', data);
  77169. };
  77170. /**
  77171. * 公共/删除文件
  77172. * @param {object} data 传入的对象参数
  77173. * @param {string} data.num
  77174. * @param {string} data.bizType 业务类型
  77175. * @param {array} data.fileNames 文件名称集合
  77176. * @returns {Promise}
  77177. **/
  77178. var delete_file = function delete_file(data) {
  77179. return http.post('/service/scene/edit/delete/file', data);
  77180. };
  77181. /**
  77182. * 公共/文件上传后保存
  77183. * @param {object} data 传入的对象参数
  77184. * @param {string} data.num 场景码
  77185. * @param {string} data.bizType 文件业务类型
  77186. * @param {string} data.fileInfo 文件信息,json格式字符串
  77187. * @returns {Promise}
  77188. **/
  77189. var saveUpload = function saveUpload(data) {
  77190. return http.post('/service/scene/edit/saveUpload', data);
  77191. };
  77192. /**
  77193. * 公共/获取场景详情-编辑页面
  77194. * @param {object} data 传入的对象参数
  77195. * @param {string} data.num 场景码
  77196. * @param {number} data.reqType 请求来源(1-编辑页面 2-查看页面)
  77197. * @returns {Promise}
  77198. **/
  77199. var getInfo = function getInfo(data) {
  77200. return http.get('/service/scene/edit/getInfo', data);
  77201. };
  77202. /**
  77203. * 漫游可行/保存漫游可行
  77204. * @param {object} data 传入的对象参数
  77205. * @param {string} data.num 场景码
  77206. * @param {string} data.data 漫游详情数据
  77207. * @returns {Promise}
  77208. **/
  77209. var saveRoam = function saveRoam(data) {
  77210. return http.post('/service/scene/edit/saveRoam', data);
  77211. };
  77212. /**
  77213. * 添加热点/保存热点可视
  77214. * @param {object} data 传入的对象参数
  77215. * @param {string} data.num 场景码
  77216. * @param {string} data.data 热点可视详情
  77217. * @returns {Promise}
  77218. **/
  77219. var saveTagsVisible = function saveTagsVisible(data) {
  77220. return http.post('/service/scene/edit/saveTagsVisible', data);
  77221. };
  77222. /**
  77223. * 平面图/保存户型图
  77224. * @param {object} data 传入的对象参数
  77225. * @returns {Promise}
  77226. **/
  77227. var cad_save = function cad_save(data) {
  77228. return http.post('/service/scene/edit/cad/save', data);
  77229. };
  77230. /**
  77231. * 添加热点/添加或修改热点
  77232. * @param {object} data 传入的对象参数
  77233. * @param {string} data.num 场景码
  77234. * @param {array} data.hotDataList 热点数据集合
  77235. * @param {array} data.icons icons集合
  77236. * @returns {Promise}
  77237. **/
  77238. var tag_save = function tag_save(data) {
  77239. return http.post('/service/scene/edit/tag/save', data);
  77240. };
  77241. /**
  77242. * 添加热点/删除热点
  77243. * @param {object} data 传入的对象参数
  77244. * @param {string} data.num
  77245. * @param {array} data.sidList 删除热点sid集合
  77246. * @returns {Promise}
  77247. **/
  77248. var tag_delete = function tag_delete(data) {
  77249. return http.post('/service/scene/edit/tag/delete', data);
  77250. };
  77251. /**
  77252. * 场景修复/全景照片上传
  77253. * @param {object} data 传入的对象参数
  77254. * @param {string} data.num
  77255. * @param {array} data.sidList 删除热点sid集合
  77256. * @returns {Promise}
  77257. **/
  77258. var uploadPanorama = function uploadPanorama(data) {
  77259. return http.postFile('/service/scene/edit/uploadPanorama', data);
  77260. };
  77261. /**
  77262. * 场景修复/模型上传
  77263. * @param {object} data 传入的对象参数
  77264. * @param {text} data.num 场景码
  77265. * @param {file} data.file 模型压缩包
  77266. * @returns {Promise}
  77267. **/
  77268. var uploadModel = function uploadModel(data) {
  77269. return http.postFile('/service/scene/edit/uploadModel', data);
  77270. };
  77271. /**
  77272. * 场景修复/模型下载
  77273. * @param {object} data 传入的对象参数
  77274. * @param {text} data.num 场景码
  77275. * @returns {Promise}
  77276. **/
  77277. var downloadModel = function downloadModel(data) {
  77278. return http.postFile('/service/scene/edit/downloadModel', data);
  77279. };
  77280. /**
  77281. * 添加热点/获取热点详情
  77282. * @param {object} data 传入的对象参数
  77283. * @param {string} data.num
  77284. * @param {array} data.sidList 删除热点sid集合
  77285. * @returns {Promise}
  77286. **/
  77287. var tag_list = function tag_list(data) {
  77288. return http.postFile('/service/scene/edit/tag/list', data);
  77289. };
  77290. /**
  77291. * 平面图/户型图重置
  77292. * @param {object} data 传入的对象参数
  77293. * @param {string} data.num
  77294. * @param {array} data.sidList 删除热点sid集合
  77295. * @returns {Promise}
  77296. **/
  77297. var cad_reset = function cad_reset(data) {
  77298. return http.postFile('/service/scene/edit/cad/reset', data);
  77299. };
  77300. /**
  77301. * 场景修复/全景照片下载
  77302. * @param {object} data 传入的对象参数
  77303. * @param {string} data.num 场景码
  77304. * @param {string} data.fileName 文件名,不为空时,单个文件下载
  77305. * @returns {Promise}
  77306. **/
  77307. var downloadPanorama = function downloadPanorama(data) {
  77308. return http.post('/service/scene/edit/downloadPanorama', data);
  77309. };
  77310. /**
  77311. * 空间装饰/保存空间视频
  77312. * @param {object} data 传入的对象参数
  77313. * @param {string} data.num 场景码
  77314. * @param {string} data.fileName 文件名
  77315. * @param {string} data.data 数据
  77316. * @returns {Promise}
  77317. **/
  77318. var video_box_save = function video_box_save(data) {
  77319. return http.post('/service/scene/edit/video/box/save', data);
  77320. };
  77321. /**
  77322. * 空间装饰/删除空间视频
  77323. * @param {object} data 传入的对象参数
  77324. * @param {string} data.num 场景码
  77325. * @param {string} data.sid sid
  77326. * @returns {Promise}
  77327. **/
  77328. var video_box_delete = function video_box_delete(data) {
  77329. return http.post('/service/scene/edit/video/box/delete', data);
  77330. };
  77331. /**
  77332. * 场景修复/上传球幕视频
  77333. * @param {object} data 传入的对象参数
  77334. * @param {text} data.num 场景码
  77335. * @param {text} data.fileName 文件名称
  77336. * @param {file} data.file 文件
  77337. * @returns {Promise}
  77338. **/
  77339. var uploadBallScreenVideo = function uploadBallScreenVideo(data) {
  77340. return http.postFile('/service/scene/edit/uploadBallScreenVideo', data);
  77341. };
  77342. /**
  77343. * 场景修复/下载球幕视频
  77344. * @param {object} data 传入的对象参数
  77345. * @param {string} data.num 场景码
  77346. * @param {string} data.fileName 文件名
  77347. * @returns {Promise}
  77348. **/
  77349. var downloadBallScreenVideo = function downloadBallScreenVideo(data) {
  77350. return http.post('/service/scene/edit/downloadBallScreenVideo', data);
  77351. };
  77352. /**
  77353. * 数据对接/场景同步
  77354. * @param {object} data 传入的对象参数
  77355. * @param {text} data.num 场景码
  77356. * @param {text} data.type 同步目标类型,默认安居客(ajk)
  77357. * @param {text} data.floorPlanJson
  77358. * @param {text} data.ajkJson
  77359. * @param {text} data.cameraJson
  77360. * @param {file} data.files 文件
  77361. * @returns {Promise}
  77362. **/
  77363. var sceneSync = function sceneSync(data) {
  77364. return http.postFile('/service/scene/edit/sceneSync', data);
  77365. };
  77366. /**
  77367. * 痕迹物证/保存
  77368. * @param {object} data 传入的对象参数
  77369. * @param {text} data.num 场景码
  77370. * @param {text} data.dataList
  77371. * @param {text} data.icons
  77372. * @returns {Promise}
  77373. **/
  77374. var evidence_save = function evidence_save(data) {
  77375. return http.post('/service/scene/edit/evidence/save', data);
  77376. };
  77377. /**
  77378. * 痕迹物证/删除
  77379. * @param {object} data 传入的对象参数
  77380. * @param {text} data.num 场景码
  77381. * @param {array} data.sidList 痕迹物证sid列表
  77382. * @returns {Promise}
  77383. **/
  77384. var evidence_delete = function evidence_delete(data) {
  77385. return http.post('/service/scene/edit/evidence/delete', data);
  77386. };
  77387. /**
  77388. * 痕迹物证/删除图标
  77389. * @param {object} data 传入的对象参数
  77390. * @param {text} data.num 场景码
  77391. * @param {array} data.fileNameList 痕迹物证Iconsid列表
  77392. * @returns {Promise}
  77393. **/
  77394. var evidence_icon_delete = function evidence_icon_delete(data) {
  77395. return http.post('/service/scene/edit/evidence/icons/delete', data);
  77396. };
  77397. /**
  77398. * 痕迹物证/列表
  77399. * @param {object} data 传入的对象参数
  77400. * @param {text} data.num 场景码
  77401. * @returns {Promise}
  77402. **/
  77403. var evidence_list = function evidence_list(data) {
  77404. return http.postFile('/service/scene/edit/evidence/list', data);
  77405. };
  77406. /**
  77407. * 痕迹物证/列表
  77408. * @param {object} data 传入的对象参数
  77409. * @param {text} data.num 场景码
  77410. * @returns {Promise}
  77411. **/
  77412. var evidence_traceEvidenceInfoList = function evidence_traceEvidenceInfoList(data) {
  77413. return http.post('/service/scene/edit/evidence/traceEvidenceInfoList', data);
  77414. };
  77415. /**
  77416. * 痕迹物证/刷新
  77417. * @param {object} data 传入的对象参数
  77418. * @param {text} data.num 场景码
  77419. * @returns {Promise}
  77420. **/
  77421. var evidence_refreshTraceEvidenceInfoList = function evidence_refreshTraceEvidenceInfoList(data) {
  77422. return http.post('/service/scene/edit/evidence/refreshTraceEvidenceInfoList', data);
  77423. };
  77424. /**
  77425. * 痕迹物证/同步
  77426. * @param {object} data 传入的对象参数
  77427. * @param {text} data.num 场景码
  77428. * @returns {Promise}
  77429. **/
  77430. var evidence_syncTraceEvidence = function evidence_syncTraceEvidence(data) {
  77431. return http.post('/service/scene/edit/evidence/syncTraceEvidence', data);
  77432. };
  77433. /**
  77434. * 痕迹物证/媒体库分组列表
  77435. * @param {object} data 传入的对象参数
  77436. * @param {text} data.num 场景码
  77437. * @param {text} data.name 类型名称
  77438. * @returns {Promise}
  77439. **/
  77440. var evidence_traceEvidenceList = function evidence_traceEvidenceList(data) {
  77441. return http.post('/service/scene/edit/evidence/traceEvidenceList', data);
  77442. };
  77443. /**
  77444. * 截图/推送
  77445. * @param {object} data 传入的对象参数
  77446. * @param {text} data.num 场景码
  77447. * @returns {Promise}
  77448. **/
  77449. var evidence_addMediaLibrarys = function evidence_addMediaLibrarys(data, json) {
  77450. return http.postFile('/service/scene/edit/evidence/addMediaLibrarys', data, json);
  77451. };
  77452. /**
  77453. * 获取场景所属案件信息
  77454. * @param {text} data.num 场景码
  77455. * @returns {Promise}
  77456. **/
  77457. var evidence_getCaseByNum = function evidence_getCaseByNum(num) {
  77458. return http.get('/service/scene/edit/evidence/getCaseByNum', num);
  77459. };
  77460. var editApis = /*#__PURE__*/Object.freeze({
  77461. __proto__: null,
  77462. sceneMarkShape_updateBySid: sceneMarkShape_updateBySid,
  77463. sceneMarkShape_delete: sceneMarkShape_delete,
  77464. ai_box4_getInfos: ai_box4_getInfos,
  77465. tour_video_upload: tour_video_upload,
  77466. tour_video_download: tour_video_download,
  77467. tour_save: tour_save,
  77468. tour_delete: tour_delete,
  77469. point_getLatAndLon: point_getLatAndLon,
  77470. locales: locales,
  77471. upload_content: upload_content,
  77472. getAuth: getAuth,
  77473. getAsynOperLog: getAsynOperLog,
  77474. getServiceUpTip: getServiceUpTip,
  77475. saveInitialPage: saveInitialPage,
  77476. dynamicPanel_update: dynamicPanel_update,
  77477. dynamicPanel_list: dynamicPanel_list,
  77478. uploadShareLogo: uploadShareLogo,
  77479. waterMark_add: waterMark_add,
  77480. waterMark_delete: waterMark_delete,
  77481. linkPan_upload: linkPan_upload,
  77482. linkPan_save: linkPan_save,
  77483. linkPan_delete: linkPan_delete,
  77484. styles_delete: styles_delete,
  77485. linkPan_list: linkPan_list,
  77486. base_save: base_save,
  77487. cad_dxf_upload: cad_dxf_upload,
  77488. cad_dxf_download: cad_dxf_download,
  77489. cad_rename: cad_rename,
  77490. cutModel_save: cutModel_save,
  77491. cutModel_list: cutModel_list,
  77492. cutModel_delete: cutModel_delete,
  77493. icons_delete: icons_delete,
  77494. tag_img_delete: tag_img_delete,
  77495. tag_img_upload: tag_img_upload,
  77496. filter_save: filter_save,
  77497. uploadROIFilter: uploadROIFilter,
  77498. filter_list: filter_list,
  77499. billboards_save: billboards_save,
  77500. billboards_list: billboards_list,
  77501. billboards_delete: billboards_delete,
  77502. billboards_styles_delete: billboards_styles_delete,
  77503. surveillance_save: surveillance_save,
  77504. surveillance_delete: surveillance_delete,
  77505. surveillance_list: surveillance_list,
  77506. sceneDraw_save: sceneDraw_save,
  77507. sceneDraw_delete: sceneDraw_delete,
  77508. sceneDraw_list: sceneDraw_list,
  77509. model_box_upload: model_box_upload,
  77510. model_box_save: model_box_save,
  77511. photo_box_save: photo_box_save,
  77512. model_box_delete: model_box_delete,
  77513. photo_box_delete: photo_box_delete,
  77514. mosaics_delete: mosaics_delete,
  77515. mosaics_add: mosaics_add,
  77516. mosaics_list: mosaics_list,
  77517. publicScene: publicScene,
  77518. upload_files: upload_files,
  77519. delete_file: delete_file,
  77520. saveUpload: saveUpload,
  77521. getInfo: getInfo,
  77522. saveRoam: saveRoam,
  77523. saveTagsVisible: saveTagsVisible,
  77524. cad_save: cad_save,
  77525. tag_save: tag_save,
  77526. tag_delete: tag_delete,
  77527. uploadPanorama: uploadPanorama,
  77528. uploadModel: uploadModel,
  77529. downloadModel: downloadModel,
  77530. tag_list: tag_list,
  77531. cad_reset: cad_reset,
  77532. downloadPanorama: downloadPanorama,
  77533. video_box_save: video_box_save,
  77534. video_box_delete: video_box_delete,
  77535. uploadBallScreenVideo: uploadBallScreenVideo,
  77536. downloadBallScreenVideo: downloadBallScreenVideo,
  77537. sceneSync: sceneSync,
  77538. evidence_save: evidence_save,
  77539. evidence_delete: evidence_delete,
  77540. evidence_icon_delete: evidence_icon_delete,
  77541. evidence_list: evidence_list,
  77542. evidence_traceEvidenceInfoList: evidence_traceEvidenceInfoList,
  77543. evidence_refreshTraceEvidenceInfoList: evidence_refreshTraceEvidenceInfoList,
  77544. evidence_syncTraceEvidence: evidence_syncTraceEvidence,
  77545. evidence_traceEvidenceList: evidence_traceEvidenceList,
  77546. evidence_addMediaLibrarys: evidence_addMediaLibrarys,
  77547. evidence_getCaseByNum: evidence_getCaseByNum
  77548. });
  77549. 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; }
  77550. 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; }
  77551. var viewer$1 = function viewer(data) {
  77552. return {
  77553. info: function info() {
  77554. return getInfo$1(data);
  77555. }
  77556. };
  77557. };
  77558. var editor = function editor(data) {
  77559. return {
  77560. uploads: function uploads(params) {
  77561. return upload_files(_objectSpread$1(_objectSpread$1({}, data), params));
  77562. },
  77563. publish: function publish() {
  77564. return publicScene(data);
  77565. },
  77566. info: function info() {
  77567. return getInfo(data);
  77568. },
  77569. save: function save() {
  77570. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  77571. return base_save(_objectSpread$1(_objectSpread$1({}, data), params));
  77572. },
  77573. get_pano_video: function get_pano_video() {
  77574. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  77575. return downloadBallScreenVideo(_objectSpread$1(_objectSpread$1({}, data), params));
  77576. },
  77577. upload_pano_video: function upload_pano_video() {
  77578. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  77579. return uploadBallScreenVideo(_objectSpread$1(_objectSpread$1({}, data), params));
  77580. },
  77581. cad_save: function cad_save$1() {
  77582. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  77583. return cad_save(_objectSpread$1(_objectSpread$1({}, data), params));
  77584. },
  77585. cad_reset: function cad_reset$1() {
  77586. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  77587. return cad_reset(_objectSpread$1(_objectSpread$1({}, data), params));
  77588. },
  77589. cad_rename: function cad_rename$1() {
  77590. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  77591. return cad_rename(_objectSpread$1(_objectSpread$1({}, data), params));
  77592. },
  77593. walk_save: function walk_save() {
  77594. var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  77595. return saveRoam(_objectSpread$1(_objectSpread$1({}, data), params));
  77596. },
  77597. /**
  77598. * 保存初始画面
  77599. * @param {object} params 参数对象
  77600. * @param {Array<File>} params.files 初始画面图片文件数组
  77601. * @param {object} params.entry 初始画面三维数据
  77602. */
  77603. setting_save_initial: function () {
  77604. var _setting_save_initial = _asyncToGenerator( /*#__PURE__*/regenerator.mark(function _callee() {
  77605. var params,
  77606. response,
  77607. _args = arguments;
  77608. return regenerator.wrap(function _callee$(_context) {
  77609. while (1) {
  77610. switch (_context.prev = _context.next) {
  77611. case 0:
  77612. params = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
  77613. response = null;
  77614. if (!(!params.files || !params.files.length || !params.entry)) {
  77615. _context.next = 4;
  77616. break;
  77617. }
  77618. return _context.abrupt("return", Promise.resolve({
  77619. code: 0,
  77620. success: true
  77621. }));
  77622. case 4:
  77623. if (!(params.files && params.files.length)) {
  77624. _context.next = 10;
  77625. break;
  77626. }
  77627. _context.next = 7;
  77628. return this.uploads({
  77629. bizType: 'settings-thumb',
  77630. files: params.files
  77631. });
  77632. case 7:
  77633. response = _context.sent;
  77634. if (response.success) {
  77635. _context.next = 10;
  77636. break;
  77637. }
  77638. return _context.abrupt("return", Promise.reject(response));
  77639. case 10:
  77640. _context.next = 12;
  77641. return saveInitialPage(_objectSpread$1(_objectSpread$1({}, data), {}, {
  77642. data: JSON.stringify(params.entry),
  77643. fileName: 'thumb-1k.jpg'
  77644. }));
  77645. case 12:
  77646. response = _context.sent;
  77647. if (response.success) {
  77648. _context.next = 15;
  77649. break;
  77650. }
  77651. return _context.abrupt("return", Promise.reject(response));
  77652. case 15:
  77653. return _context.abrupt("return", Promise.resolve(response));
  77654. case 16:
  77655. case "end":
  77656. return _context.stop();
  77657. }
  77658. }
  77659. }, _callee, this);
  77660. }));
  77661. function setting_save_initial() {
  77662. return _setting_save_initial.apply(this, arguments);
  77663. }
  77664. return setting_save_initial;
  77665. }()
  77666. };
  77667. };
  77668. var APIs = (function (app) {
  77669. var data = {
  77670. num: app.config.num,
  77671. get rnd() {
  77672. return Date.now();
  77673. }
  77674. };
  77675. return {
  77676. viewer: viewer$1(data),
  77677. editor: editor(data)
  77678. };
  77679. });
  77680. var css = "@-webkit-keyframes ruler-point {\r\n 0% {\r\n height: 0\r\n }\r\n\r\n to {\r\n height: 11.375px\r\n }\r\n}\r\n\r\n@keyframes ruler-point {\r\n 0% {\r\n height: 0\r\n }\r\n\r\n to {\r\n height: 11.375px\r\n }\r\n}\r\n\r\n@-webkit-keyframes ruler-label {\r\n 0% {\r\n max-width: 0\r\n }\r\n\r\n to {\r\n max-width: 131.25px\r\n }\r\n}\r\n\r\n@keyframes ruler-label {\r\n 0% {\r\n max-width: 0\r\n }\r\n\r\n to {\r\n max-width: 131.25px\r\n }\r\n}\r\n\r\n@-webkit-keyframes door-label {\r\n 0% {\r\n opacity: 0;\r\n margin-top: 8.75px\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n margin-top: 0\r\n }\r\n}\r\n\r\n@keyframes door-label {\r\n 0% {\r\n opacity: 0;\r\n margin-top: 8.75px\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n margin-top: 0\r\n }\r\n}\r\n\r\n@-webkit-keyframes room-label {\r\n 0% {\r\n opacity: 0;\r\n margin-top: 8.75px\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n margin-top: 0\r\n }\r\n}\r\n\r\n@keyframes room-label {\r\n 0% {\r\n opacity: 0;\r\n margin-top: 8.75px\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n margin-top: 0\r\n }\r\n}\r\n\r\n@-webkit-keyframes ruler-line {\r\n 0% {\r\n width: 0\r\n }\r\n\r\n to {\r\n width: 100%\r\n }\r\n}\r\n\r\n@keyframes ruler-line {\r\n 0% {\r\n width: 0\r\n }\r\n\r\n to {\r\n width: 100%\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n.widgets-design-option {\r\n width: 100%;\r\n height: 100%;\r\n z-index: 4;\r\n position: absolute;\r\n user-select: none;\r\n overflow: hidden;\r\n pointer-events: none;\r\n left: 0;\r\n top: 0;\r\n }\r\n .widgets-design-option i {\r\n margin: 0 5px;\r\n }\r\n .widgets-design-option i:before {\r\n font-family: \"iconfont\" !important;\r\n font-size: 32px;\r\n line-height: 36px;\r\n font-style: normal;\r\n }\r\n .widgets-design-option li {\r\n cursor: pointer;\r\n }\r\n .widgets-design-option > div {\r\n height: 36px;\r\n background: #262729;\r\n position: absolute;\r\n transform: translate(-100%, -50%) translateX(-15px);\r\n border-top-left-radius: 18px;\r\n border-bottom-left-radius: 18px;\r\n padding-left: 10px;\r\n pointer-events: auto;\r\n box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.4);\r\n }\r\n .widgets-design-option > div:after {\r\n position: absolute;\r\n right: -15px;\r\n top: 0;\r\n content: \"\";\r\n width: 0;\r\n height: 0;\r\n border-style: solid;\r\n border-width: 18px 0 18px 15px;\r\n border-color: transparent transparent transparent #262729;\r\n }\r\n .widgets-design-option.right > div {\r\n transform: translate(15px, -50%);\r\n border-top-left-radius: 0;\r\n border-bottom-left-radius: 0;\r\n border-top-right-radius: 18px;\r\n border-bottom-right-radius: 18px;\r\n padding: 0 10px 0 0;\r\n }\r\n .widgets-design-option.right > div:after {\r\n right: auto;\r\n left: -15px;\r\n border-width: 18px 15px 18px 0;\r\n border-color: transparent #262729 transparent transparent;\r\n }\r\n .widgets-design-option .delete-ruler li {\r\n line-height: 36px;\r\n padding: 0 10px;\r\n word-break: keep-all;\r\n list-style: none;\r\n }\r\n \r\n .widgets-rulers {\r\n position: absolute;\r\n pointer-events: none;\r\n top: 0;\r\n left: 0;\r\n bottom: 0;\r\n right: 0;\r\n}\r\n\r\n.widgets-rulers .ruler-line {\r\n position: absolute;\r\n -webkit-transform-origin: left 0.875px;\r\n transform-origin: left 0.875px;\r\n width: 0;\r\n height: 1.75px;\r\n}\r\n\r\n.widgets-rulers .ruler-line em {\r\n background: linear-gradient(90deg, hsla(0, 0%, 100%, 0.5), hsla(0, 0%, 100%, 0.3));\r\n display: block;\r\n height: 100%;\r\n -webkit-animation: ruler-line 0.5s ease 1s;\r\n animation: ruler-line 0.5s ease 1s;\r\n -webkit-animation-fill-mode: both;\r\n animation-fill-mode: both;\r\n -webkit-box-shadow: 0 0 3.5px rgba(0, 0, 0, 0.6);\r\n box-shadow: 0 0 3.5px rgba(0, 0, 0, 0.6);\r\n}\r\n\r\n.widgets-rulers .ruler-label {\r\n position: absolute;\r\n /* width: 0; */\r\n height: 0;\r\n top: 0.875px;\r\n left: 38%;\r\n color: #fff;\r\n}\r\n\r\n.widgets-rulers .ruler-label .ruler-label-point {\r\n position: absolute;\r\n width: 28px;\r\n height: 11.375px;\r\n right: 0;\r\n bottom: 0;\r\n background-position: bottom;\r\n background-repeat: no-repeat;\r\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMTUiIHZpZXdCb3g9IjAgMCAzNCAxNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMzLjUgMTQuNUwyMy41IDMuNSIgc3Ryb2tlPSIjMzI3NUZGIiBzdHJva2Utd2lkdGg9IjAuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0yMy41IDMuNUg0LjUiIHN0cm9rZT0iIzMyNzVGRiIgc3Ryb2tlLXdpZHRoPSIwLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMy41IDVDNC4zMjg0MyA1IDUgNC4zMjg0MyA1IDMuNUM1IDIuNjcxNTcgNC4zMjg0MyAyIDMuNSAyQzIuNjcxNTcgMiAyIDIuNjcxNTcgMiAzLjVDMiA0LjMyODQzIDIuNjcxNTcgNSAzLjUgNVoiIGZpbGw9IiMzMjc1RkYiLz4KPC9zdmc+Cg==\");\r\n background-size: 28px 11.375px;\r\n -webkit-transform: translateZ(0);\r\n transform: translateZ(0);\r\n transform-origin: right center;\r\n -webkit-animation: ruler-point 0.3s ease 1.3s;\r\n animation: ruler-point 0.3s ease 1.3s;\r\n -webkit-animation-fill-mode: both;\r\n animation-fill-mode: both;\r\n}\r\n\r\n.widgets-rulers .ruler-label .ruler-label-name {\r\n position: absolute;\r\n height: 15.75px;\r\n font-size: 12px;\r\n line-height: 15.75px;\r\n right: 28px;\r\n bottom: 0.875px;\r\n white-space: nowrap;\r\n /* max-width: 0; */\r\n overflow: hidden;\r\n -webkit-animation: ruler-label 1s ease 1.6s;\r\n animation: ruler-label 1s ease 1.6s;\r\n -webkit-animation-fill-mode: both;\r\n animation-fill-mode: both;\r\n text-shadow: 0 0 3.5px rgba(0, 0, 0, 0.6);\r\n}\r\n\r\n.widgets-rulers .ruler-label.reverse .ruler-label-point {\r\n -webkit-transform: rotateY(180deg);\r\n transform: rotateY(180deg);\r\n}\r\n\r\n.widgets-rulers .ruler-label.reverse .ruler-label-name {\r\n /* -webkit-transform: rotateY(-180deg); */\r\n /* transform: rotateY(-180deg); */\r\n right: auto;\r\n left: 28px;\r\n}\r\n\r\n.widgets-rulers .measure .ruler-label .ruler-label-name {\r\n color: #fff;\r\n}\r\n\r\n.widgets-rulers .ruler-intersection {\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n}\r\n\r\n.widgets-rulers .ruler-intersection .ruler-intersection-point {\r\n position: absolute;\r\n left: 0;\r\n bottom: 0;\r\n width: 18.375px;\r\n height: 7px;\r\n background-repeat: no-repeat;\r\n background-size: 18.375px 7px;\r\n background-position: 50%;\r\n}\r\n\r\n.widgets-rulers .ruler-intersection .ruler-intersection-text {\r\n position: absolute;\r\n left: 18.375px;\r\n bottom: 0;\r\n font-size: 12px;\r\n line-height: 12px;\r\n white-space: nowrap;\r\n color: #12fffb;\r\n text-shadow: 0 0 3.5px rgba(0, 0, 0, 0.3);\r\n -webkit-transform-origin: left center;\r\n transform-origin: left center;\r\n -webkit-transform: scale(0.85);\r\n transform: scale(0.85);\r\n}\r\n\r\n.measure .ruler-label .ruler-label-name {\r\n font-size: 14px;\r\n line-height: 14px;\r\n}\r\n\r\n.measure .ruler-label {\r\n position: absolute;\r\n}\r\n\r\n.measure .ruler-label .ruler-label-point {\r\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzQiIGhlaWdodD0iMTUiIHZpZXdCb3g9IjAgMCAzNCAxNSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTMzLjUgMTQuNUwyMy41IDMuNSIgc3Ryb2tlPSIjMzI3NUZGIiBzdHJva2Utd2lkdGg9IjAuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+CjxwYXRoIGQ9Ik0yMy41IDMuNUg0LjUiIHN0cm9rZT0iIzMyNzVGRiIgc3Ryb2tlLXdpZHRoPSIwLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgo8cGF0aCBkPSJNMy41IDVDNC4zMjg0MyA1IDUgNC4zMjg0MyA1IDMuNUM1IDIuNjcxNTcgNC4zMjg0MyAyIDMuNSAyQzIuNjcxNTcgMiAyIDIuNjcxNTcgMiAzLjVDMiA0LjMyODQzIDIuNjcxNTcgNSAzLjUgNVoiIGZpbGw9IiMzMjc1RkYiLz4KPC9zdmc+Cg==\");\r\n animation-delay: 0.3s;\r\n}\r\n\r\n.measure .ruler-label .ruler-label-name {\r\n animation-delay: 0.6s;\r\n}\r\n";
  77681. n$4(css,{});
  77682. 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; } } }; }
  77683. 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); }
  77684. 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; }
  77685. 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); }; }
  77686. 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; } }
  77687. var player$7;
  77688. var verticalLine = new THREE.Line3();
  77689. /*let getIntersect = (e, when) => {
  77690. if (e.intersect && e.intersect.object.name == 'collider') return e.intersect
  77691. if (when == 'drag') {
  77692. //拖拽时player没getIntersect这里获取下
  77693. let chunkPick = player.getMouseIntersect(null, player.getColliders({ noSkybox: true, checkChunk: true }))
  77694. return chunkPick
  77695. }
  77696. let chunkPick = player.allIntersects.find(e => e.object.name == 'collider') //在chunk上的intersect
  77697. return chunkPick
  77698. }*/
  77699. //控制点和边的合集。具有可以拖拽修改的功能,拖拽时能防止线相交。
  77700. var ctrlPolygon = /*#__PURE__*/function (_THREE$Object3D) {
  77701. _inherits(ctrlPolygon, _THREE$Object3D);
  77702. var _super = _createSuper$a(ctrlPolygon);
  77703. function ctrlPolygon(type, prop, player_) {
  77704. var _this;
  77705. _classCallCheck(this, ctrlPolygon);
  77706. _this = _super.call(this);
  77707. _this.Type = type;
  77708. player$7 = player_;
  77709. _this.maxMarkers = Number.MAX_SAFE_INTEGER;
  77710. _this.transformData(prop);
  77711. for (var i in prop) {
  77712. _this[i] = prop[i];
  77713. }
  77714. _this.color = _this.color || '#fff';
  77715. if ((_this.atPlane || _this.showArea) && _this.closed) {
  77716. _this.areaPlane = _this.createAreaPlane();
  77717. _this.add(_this.areaPlane);
  77718. } //数据--刚开始一定是空的
  77719. _this.points = []; //mesh 不一定有
  77720. _this.markers = [];
  77721. _this.edges = [];
  77722. _this.center;
  77723. _this.setEditEnable(true);
  77724. return _this;
  77725. }
  77726. _createClass(ctrlPolygon, [{
  77727. key: "initData",
  77728. value: function initData(prop) {
  77729. //开始加数据
  77730. //prop.points && (this.points = prop.points)
  77731. if (prop.points) {
  77732. var _iterator = _createForOfIteratorHelper$2(prop.points),
  77733. _step;
  77734. try {
  77735. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  77736. var p = _step.value;
  77737. var pos = new THREE.Vector3().copy(p);
  77738. this.addMarker({
  77739. point: pos
  77740. });
  77741. }
  77742. } catch (err) {
  77743. _iterator.e(err);
  77744. } finally {
  77745. _iterator.f();
  77746. }
  77747. this.facePlane = this.getFacePlane();
  77748. this.getPoint2dInfo(this.points);
  77749. this.update({
  77750. ifUpdateMarkers: true
  77751. });
  77752. this.setSelected(false);
  77753. this.markers.forEach(function (marker) {
  77754. marker.dispatchEvent({
  77755. type: 'addHoverEvent'
  77756. });
  77757. });
  77758. return true;
  77759. }
  77760. }
  77761. }, {
  77762. key: "setEditEnable",
  77763. value: function setEditEnable(state) {
  77764. this.editEnable = state;
  77765. if (state) {
  77766. this.markers.forEach(function (m) {
  77767. return m.dispatchEvent({
  77768. type: 'addHoverEvent'
  77769. });
  77770. });
  77771. }
  77772. }
  77773. }, {
  77774. key: "addMarker",
  77775. value: function addMarker() {
  77776. var _this2 = this;
  77777. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  77778. var index = o.index == void 0 ? this.points.length : o.index; //要当第几个
  77779. this.points = [].concat(_toConsumableArray(this.points.slice(0, index)), [o.point.clone()], _toConsumableArray(this.points.slice(index, this.points.length)));
  77780. if (o.marker) {
  77781. this.add(o.marker);
  77782. this.markers = [].concat(_toConsumableArray(this.markers.slice(0, index)), [o.marker], _toConsumableArray(this.markers.slice(index, this.markers.length)));
  77783. this.updateMarker(o.marker, o.point);
  77784. o.marker.addEventListener('drag', this.dragMarker.bind(this), {
  77785. importance: 2
  77786. });
  77787. o.marker.addEventListener('drop', this.dropMarker.bind(this), {
  77788. importance: 2
  77789. });
  77790. o.marker.createTime = Date.now();
  77791. var addHoverEvent = function addHoverEvent(e) {
  77792. var _o$marker$_listeners;
  77793. if ((_o$marker$_listeners = o.marker._listeners) !== null && _o$marker$_listeners !== void 0 && _o$marker$_listeners.startDragging || !_this2.editEnable) return; //already has
  77794. var mouseover = function mouseover(e) {
  77795. if (!_this2.editEnable) return;
  77796. _this2.setMarkerSelected(o.marker, 'hover', 'single');
  77797. CursorDeal.add('markerMove');
  77798. };
  77799. var mouseleave = function mouseleave(e) {
  77800. _this2.setMarkerSelected(o.marker, 'unhover', 'single');
  77801. CursorDeal.remove('markerMove');
  77802. };
  77803. o.marker.addEventListener('mouseover', mouseover);
  77804. o.marker.addEventListener('mouseleave', mouseleave);
  77805. o.marker.addEventListener('startDragging', function (e) {
  77806. //for mobile
  77807. _this2.setMarkerSelected(o.marker, 'hover', 'single');
  77808. _this2.dispatchEvent({
  77809. type: 'startDragging'
  77810. });
  77811. });
  77812. o.marker.addEventListener('drop', function (e) {
  77813. //for mobile
  77814. _this2.setMarkerSelected(o.marker, 'unhover', 'single');
  77815. });
  77816. o.marker.removeEventListener('addHoverEvent', addHoverEvent);
  77817. };
  77818. o.marker.addEventListener('addHoverEvent', addHoverEvent); //当非isNew时才添加事件
  77819. if (!this.isNew) {
  77820. o.marker.dispatchEvent({
  77821. type: 'addHoverEvent'
  77822. });
  77823. }
  77824. }
  77825. if (o.edge) {
  77826. this.add(o.edge);
  77827. this.edges = [].concat(_toConsumableArray(this.edges.slice(0, index)), [o.edge], _toConsumableArray(this.edges.slice(index, this.edges.length)));
  77828. }
  77829. }
  77830. }, {
  77831. key: "dragMarker",
  77832. value: function dragMarker(e) {
  77833. var _player$getIntersectA;
  77834. if (!this.editEnable) return;
  77835. var I,
  77836. marker = e.target;
  77837. /* if(e.hoverViewport != e.drag.dragViewport){//不能使用e.dragViewport,要使用drag中的,因为drag中存储的要一直继承下来,不因mouseup了而改变。
  77838. CursorDeal.add('polygon_AtWrongPlace')
  77839. return
  77840. } */
  77841. /* if(e.drag.pointerDelta.length() == 0 && !this.isNew){ //部分设备(华为matePad11)在touchstart后立即执行了touchmove,导致marker立即移动,需要屏蔽..(刚创建时也会是0)
  77842. return
  77843. } */
  77844. CursorDeal.remove('polygon_AtWrongPlace');
  77845. marker.isDragging = true; //e.drag.object.isDragging = true
  77846. I = (_player$getIntersectA = player$7.getIntersectAtChunk(e.intersect, 'drag')) === null || _player$getIntersectA === void 0 ? void 0 : _player$getIntersectA.point; //getIntersect(e, 'drag')?.point // && (e.intersect.adsorption ? e.intersect.location : (e.intersect.orthoIntersect || e.intersect.location))
  77847. if (!I) {
  77848. if (this.zPlaneWhenNoIntersect != void 0) {
  77849. var _Potree$Utils$getPoin = Potree.Utils.getPointerPosAtHeight(this.zPlaneWhenNoIntersect, e.pointer),
  77850. x = _Potree$Utils$getPoin.x,
  77851. y = _Potree$Utils$getPoin.y;
  77852. I = new THREE.Vector3(x, y, this.zPlaneWhenNoIntersect);
  77853. }
  77854. }
  77855. if (I) {
  77856. var i = this.markers.indexOf(marker);
  77857. if (i !== -1) {
  77858. this.dragChange(I.clone(), i
  77859. /* , atMap */
  77860. );
  77861. }
  77862. this.editStateChange(true);
  77863. return true;
  77864. }
  77865. }
  77866. }, {
  77867. key: "dragChange",
  77868. value: function dragChange(intersectPos, i, atMap) {
  77869. var _this3 = this;
  77870. var len = this.markers.length;
  77871. var oldPoint = this.points[i];
  77872. if (atMap) {
  77873. intersectPos.setY(oldPoint.y); //在地图上拖拽,不改变其高度。
  77874. }
  77875. var location = intersectPos.clone();
  77876. if (this.faceDirection && this.maxMarkers == 2 && len == 2) {
  77877. //add 固定方向的点不直接拖拽
  77878. var p1 = this.markers[0].position;
  77879. if (this.faceDirection == 'horizontal') {
  77880. var projectPos = location.clone().setY(p1.y);
  77881. } else {
  77882. var projectPos = p1.clone().setY(location.y);
  77883. }
  77884. LineDraw.updateLine(this.guideLine, [location, projectPos]);
  77885. location = projectPos;
  77886. this.guideLine.visible = true;
  77887. } else if (len > 1) {
  77888. var points = this.points.map(function (e) {
  77889. return e.clone();
  77890. });
  77891. points[i].copy(location); //算normal需要提前确认point
  77892. //若为定义了面朝向的矩形
  77893. if (this.faceDirection == 'horizontal') {
  77894. if (len == 2) {
  77895. location.setY(points[0].y);
  77896. }
  77897. if (!this.facePlane) {
  77898. //一个点就能确定面
  77899. this.facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint(new THREE.Vector3(0, 1, 0), this.points[0]);
  77900. }
  77901. } else if (this.faceDirection == 'vertical') {
  77902. //当有两个点时, 有两个方向的可能
  77903. if (len == 2) {
  77904. if (this.isRect) {
  77905. var _vec = points[0].clone().sub(location);
  77906. if (Math.sqrt(_vec.x * _vec.x + _vec.z * _vec.z) > Math.abs(_vec.y)) {
  77907. //水平(高度差小于水平距离时)
  77908. location.setY(points[0].z);
  77909. } else {
  77910. //垂直 (当两点一样时也属于这种)
  77911. location.setX(points[0].x);
  77912. location.setZ(points[0].z);
  77913. }
  77914. }
  77915. } else {
  77916. {
  77917. //判断cannotConfirmNormal. 如果前几段都在竖直线上,就不能固定出面方向。
  77918. this.cannotConfirmNormal = true;
  77919. var max = this.isRect ? 1 : len - 2;
  77920. for (var _i = 0; _i < max; _i++) {
  77921. var _p = points[_i].clone();
  77922. var _p2 = points[_i + 1].clone();
  77923. var _vec2 = _p.sub(_p2);
  77924. if (_vec2.x != 0 || _vec2.y != 0) {
  77925. this.cannotConfirmNormal = false;
  77926. break;
  77927. }
  77928. }
  77929. }
  77930. if (!this.facePlane || this.cannotConfirmNormal) {
  77931. //三个点且为垂直方向时,计算面
  77932. var points_ = points.map(function (e) {
  77933. return new THREE.Vector2(e.x, e.z);
  77934. });
  77935. var points2 = this.getDifferentPoint(points_, 2);
  77936. if (points2) {
  77937. var normal = math$2.getNormal({
  77938. points: points2
  77939. });
  77940. normal = new THREE.Vector3(normal.x, 0, normal.y);
  77941. this.facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, this.points[0]);
  77942. }
  77943. }
  77944. }
  77945. }
  77946. if (len > 2) {
  77947. if (!this.faceDirection && this.atPlane) {
  77948. if (len == 3 || this.isRect) this.cannotConfirmNormal = true; //当第三个点固定后(有四个点时)才能固定面
  77949. if (!this.facePlane || this.cannotConfirmNormal) {
  77950. var points3 = this.getDifferentPoint(points, 3); //只有找到三个不同的点算拥有面和area
  77951. if (points3) {
  77952. var _THREE$Plane;
  77953. this.facePlane = (_THREE$Plane = new THREE.Plane()).setFromCoplanarPoints.apply(_THREE$Plane, _toConsumableArray(points3));
  77954. }
  77955. }
  77956. }
  77957. if (this.atPlane && this.facePlane && !this.cannotConfirmNormal) {
  77958. //之后加的点一定要在面上
  77959. if (atMap) {
  77960. //地图上用垂直线,得到和面的交点。
  77961. verticalLine.set(location.clone().setY(100000), location.clone().setY(-100000)); //确保长度范围覆盖所有测量面
  77962. location = this.facePlane.intersectLine(verticalLine, new THREE.Vector3());
  77963. if (!location) return;
  77964. } else {
  77965. location = this.facePlane.projectPoint(intersectPos, new THREE.Vector3());
  77966. }
  77967. }
  77968. points[i].copy(location); //再copy确认一次
  77969. if (len == 3 && this.faceDirection == 'horizontal' && this.closed) {
  77970. var _THREE$Plane2;
  77971. //normal方向还不确定 会影响label在里侧还是外侧
  77972. var facePlane = (_THREE$Plane2 = new THREE.Plane()).setFromCoplanarPoints.apply(_THREE$Plane2, _toConsumableArray(points));
  77973. if (facePlane.normal.y && facePlane.normal.y * this.facePlane.normal.y < 0) {
  77974. this.facePlane.normal.y *= -1, this.facePlane.constant *= -1; //console.log(this.facePlane.normal, this.facePlane.constant)
  77975. }
  77976. }
  77977. if (this.isRect) {
  77978. //是矩形 (即使没有faceDirection也能执行)
  77979. //根据前两个点计算当前和下一个点
  77980. var p1 = points[(i - 2 + len) % len];
  77981. var p2 = points[(i - 1 + len) % len];
  77982. if (p1.equals(p2)) {
  77983. //意外情况:重复点两次 ( bug点,改了好多遍)
  77984. if (this.faceDirection == 'vertical') {
  77985. p2.add(new THREE.Vector3(0, 0.0001, 0));
  77986. } else {
  77987. p2.add(new THREE.Vector3(0, 0, 0.0001));
  77988. }
  77989. } //p3 : location
  77990. var foot = math$2.getFootPoint(location, p1, p2); //p2 修改p2到垂足的位置
  77991. var vec = foot.clone().sub(location);
  77992. var p4 = p1.clone().sub(vec);
  77993. points[(i - 1 + len) % len].copy(foot);
  77994. points[(i + 1) % len].copy(p4);
  77995. this.setPosition((i - 1 + len) % len, foot); //p2
  77996. this.setPosition((i + 1) % len, p4);
  77997. }
  77998. this.getPoint2dInfo(points);
  77999. var isIntersectSelf = this.atPlane
  78000. /* && this.closed */
  78001. && !this.isRect && this.point2dInfo && this.intersectSelf(this.point2dInfo.points2d); //检测相交
  78002. this.isIntersectSelf = isIntersectSelf;
  78003. if (isIntersectSelf) {
  78004. //not-allowed
  78005. if (!this.isNew && isIntersectSelf == 'lastLine') this.isIntersectSelf = 'all'; //已经画好了就不用特别对待最后一条线
  78006. if (this.isIntersectSelf == 'lastLine') {
  78007. this.areaPlane && common$1.updateVisible(this.areaPlane, 'intersectLastLine', false);
  78008. this.areaLabel && common$1.updateVisible(this.areaLabel, 'intersectLastLine', false);
  78009. } else {
  78010. CursorDeal.add('polygon_isIntersectSelf');
  78011. return;
  78012. }
  78013. }
  78014. if (!this.isIntersectSelf) {
  78015. this.areaPlane && common$1.updateVisible(this.areaPlane, 'intersectLastLine', true);
  78016. this.areaLabel && common$1.updateVisible(this.areaLabel, 'intersectLastLine', true);
  78017. }
  78018. if (!this.isIntersectSelf || this.isIntersectSelf == 'lastLine') {
  78019. CursorDeal.remove('polygon_isIntersectSelf');
  78020. }
  78021. }
  78022. var showGuideLine = len > 1 && (this.faceDirection || len > 3);
  78023. if (showGuideLine && this.guideLine) {
  78024. LineDraw.updateLine(this.guideLine, [intersectPos, location]);
  78025. this.guideLine.visible = true;
  78026. } //console.log(this.points.map(e=>e.toArray()))
  78027. }
  78028. if (this.restrictArea) {
  78029. var holes = this.restrictArea.holes.concat(this.restrictArea.parentHoles);
  78030. var holesPoints = holes.filter(function (e) {
  78031. return e != _this3 && e.points.length > 2;
  78032. }).map(function (e) {
  78033. return e.points;
  78034. });
  78035. if (!math$2.isPointInArea(this.restrictArea.points, holesPoints, location)) {
  78036. CursorDeal.add('polygon_AtWrongPlace');
  78037. this.isAtWrongPlace = true;
  78038. return;
  78039. } //就不处理相交线了。 有个缺点:floor上的hole可以限制room,但hole不受room限制,会导致room的marker被框在hole里而动不了。只能去调整hole了
  78040. }
  78041. CursorDeal.remove('polygon_AtWrongPlace');
  78042. this.isAtWrongPlace = false;
  78043. this.setPosition(i, location);
  78044. this.update({
  78045. index: this.isRect ? null : i
  78046. });
  78047. this.dispatchEvent({
  78048. type: 'dragChange',
  78049. index: i
  78050. });
  78051. }
  78052. }, {
  78053. key: "dropMarker",
  78054. value: function dropMarker(e) {
  78055. var _e$drag;
  78056. //console.log('dropMarker')
  78057. /* if (this.isNew && e.pressDistance>Potree.config.clickMaxDragDis){//拖拽的话返回
  78058. return this.continueDrag(null,e)
  78059. } */
  78060. /* if(e.hoverViewport != e.drag.dragViewport){//copy from dragMarker, for sitemodel, only mapViewport can be dropped
  78061. return this.continueDrag(null,e)
  78062. } */
  78063. var marker = e.target;
  78064. if (e.touches) {
  78065. /* if(e.hoverViewport != viewer.mainViewport && this.unableDragAtMap){
  78066. viewer.dispatchEvent({type:'reticule_forbit', v:true})
  78067. return this.continueDrag(null,e)
  78068. }else{
  78069. viewer.dispatchEvent({type:'reticule_forbit', v:false})
  78070. } */
  78071. this.isNew && this.dragMarker(e); //isNew触屏点击时必须先更新下点,因为指尖不在屏幕上时没更新。但对已经创建的marker点击时不应该更新
  78072. }
  78073. if (e.button != THREE.MOUSE.RIGHT && (this.isIntersectSelf == 'all' && this.isNew || this.isAtWrongPlace && this.isNew || (this.isNew || this.forbitRepeatPoint) && !this.getDifferentPoint(this.points, this.points.length)) //不允许和之前的点相同, 但这句在点云稀疏时会导致难结束
  78074. ) {
  78075. return this.continueDrag(marker, e); //(null, e)
  78076. }
  78077. var i = this.markers.indexOf(marker);
  78078. if (i !== -1) {
  78079. this.dispatchEvent({
  78080. type: 'marker_dropped',
  78081. index: i
  78082. });
  78083. if (this.markers.length > 2 && this.facePlane) this.cannotConfirmNormal = false;
  78084. this.guideLine && (this.guideLine.visible = false);
  78085. }
  78086. this.setMarkerSelected(marker, 'unhover', 'single');
  78087. this.editStateChange(false);
  78088. (_e$drag = e.drag) === null || _e$drag === void 0 ? void 0 : _e$drag.endDragFun(e); // && e.endDragFun(e) // addmarker
  78089. return true;
  78090. }
  78091. }, {
  78092. key: "getFacePlane",
  78093. value: function getFacePlane(force) {
  78094. //最普通一种get方法,根据顶点。且假设所有点已经共面,且不重合
  78095. if (this.points.length < 3) return;
  78096. var facePlane = this.facePlane;
  78097. if (force || !this.atPlane || !facePlane) {
  78098. //多折线 没有实时更新facePlane所以重新算
  78099. var normal = new THREE.Vector3(),
  78100. len = this.points.length - 2;
  78101. for (var i = 0; i < len; i++) {
  78102. //获取normal的顺序方法必须和setFromCoplanarPoints一致
  78103. var vec0 = new THREE.Vector3().subVectors(this.points[i + 2], this.points[i + 1]);
  78104. var vec1 = new THREE.Vector3().subVectors(this.points[i], this.points[i + 1]);
  78105. var nor = vec0.cross(vec1).normalize();
  78106. normal.add(nor);
  78107. }
  78108. normal.normalize();
  78109. facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, this.points[0]);
  78110. }
  78111. return facePlane;
  78112. }
  78113. }, {
  78114. key: "getPoint2dInfo",
  78115. value: function getPoint2dInfo() {
  78116. var points = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.points;
  78117. //在更新areaplane之前必须更新过point2dInfo (针对所有点在同一平面上的)
  78118. if (this.facePlane && (this.atPlane || Potree.settings.areaAtNotPlane)) {
  78119. var facePlane = this.getFacePlane();
  78120. if (!facePlane) return this.point2dInfo = null;
  78121. var originPoint0 = points[0].clone();
  78122. var qua = math$2.getQuaBetween2Vector(facePlane.normal, new THREE.Vector3(0, 0, 1), new THREE.Vector3(0, 0, 1));
  78123. var points2d = points.map(function (e) {
  78124. return e.clone().applyQuaternion(qua);
  78125. });
  78126. this.point2dInfo = {
  78127. originPoint0,
  78128. points2d,
  78129. quaInverse: qua.clone().invert()
  78130. };
  78131. }
  78132. }
  78133. }, {
  78134. key: "setPosition",
  78135. value: function setPosition(index, position) {
  78136. //拖拽后设置位置
  78137. var point = this.points[index];
  78138. point.copy(position);
  78139. var marker = this.markers[index];
  78140. this.updateMarker(marker, point);
  78141. }
  78142. }, {
  78143. key: "updateMarker",
  78144. value: function updateMarker(marker, pos) {
  78145. marker.position.copy(pos);
  78146. marker.waitUpdate();
  78147. }
  78148. }, {
  78149. key: "intersectSelf",
  78150. value: function intersectSelf(points2d) {
  78151. //add
  78152. var len = points2d.length;
  78153. for (var i = 0; i < len; i++) {
  78154. for (var j = i + 2; j < len; j++) {
  78155. if (Math.abs(j - len - i) < 2) continue; //不和邻边比
  78156. var p1 = points2d[i];
  78157. var p2 = points2d[i + 1];
  78158. var p3 = points2d[j];
  78159. var p4 = points2d[(j + 1) % len];
  78160. if (p1.equals(p2) || p3.equals(p4) || p1.equals(p3) || p2.equals(p3) || p1.equals(p4) || p2.equals(p4)) continue;
  78161. var line1 = [p1, p2];
  78162. var line2 = [p3, p4];
  78163. var intersect = math$2.isLineIntersect(line1, line2, false, 0.001);
  78164. if (intersect) {
  78165. if (i == len - 1 || j == len - 1) {
  78166. //最后一条线。如果还没绘制完,最后的线还没定下,可被允许继续绘制,但无法显示面积。
  78167. return 'lastLine';
  78168. } else {
  78169. return 'all';
  78170. }
  78171. }
  78172. }
  78173. }
  78174. }
  78175. }, {
  78176. key: "removeMarker",
  78177. value: function removeMarker(index) {
  78178. var _this$point2dInfo;
  78179. this.points.splice(index, 1);
  78180. var marker = this.markers[index];
  78181. this.markers.splice(index, 1);
  78182. marker.dispose ? marker.dispose() : marker.parent.remove(marker);
  78183. var edgeIndex = index;
  78184. var edge = this.edges[edgeIndex];
  78185. if (edge) {
  78186. this.remove(edge);
  78187. this.edges.splice(edgeIndex, 1);
  78188. edge.geometry.dispose();
  78189. }
  78190. index == 0 ? this.getPoint2dInfo() : (_this$point2dInfo = this.point2dInfo) === null || _this$point2dInfo === void 0 ? void 0 : _this$point2dInfo.points2d.splice(index, 1); //add
  78191. this.dispatchEvent({
  78192. type: 'removeMarker',
  78193. index,
  78194. marker
  78195. });
  78196. }
  78197. }, {
  78198. key: "createAreaPlane",
  78199. value: function createAreaPlane(mat) {
  78200. var geometry = new THREE.BufferGeometry();
  78201. var mesh = new THREE.Mesh(geometry, mat);
  78202. return mesh;
  78203. }
  78204. }, {
  78205. key: "updateAreaPlane",
  78206. value: function updateAreaPlane() {
  78207. this.areaPlane.geometry.dispose();
  78208. if (this.points.length > 2) {
  78209. if (this.isPrism) {
  78210. var z = this.horizonZ || 0;
  78211. var points2d = this.points.map(function (e) {
  78212. return e.clone().setZ(z);
  78213. });
  78214. this.areaPlane.geometry = MeshDraw.getShapeGeo(points2d); //z=0
  78215. var center = math$2.getCenterOfGravityPoint(points2d); //重心
  78216. this.areaPlaneCenter = new THREE.Vector3(center.x, center.y, z);
  78217. this.areaPlane.position.z = z;
  78218. } else if (this.point2dInfo) {
  78219. this.areaPlane.geometry = MeshDraw.getShapeGeo(this.point2dInfo.points2d);
  78220. var _center = math$2.getCenterOfGravityPoint(this.point2dInfo.points2d); //重心
  78221. var firstPos = this.point2dInfo.points2d[0].clone();
  78222. firstPos.z = 0; //因为shape只读取了xy,所以位移下, 再算出最终位置,得到差距
  78223. firstPos.applyQuaternion(this.point2dInfo.quaInverse);
  78224. var vec = this.point2dInfo.originPoint0.clone().sub(firstPos);
  78225. _center = new THREE.Vector3(_center.x, _center.y, 0);
  78226. _center.applyQuaternion(this.point2dInfo.quaInverse);
  78227. this.areaPlane.quaternion.copy(this.point2dInfo.quaInverse);
  78228. this.areaPlane.position.copy(vec);
  78229. _center.add(vec);
  78230. this.center = _center;
  78231. }
  78232. } else {
  78233. this.areaPlane.geometry = new THREE.BufferGeometry();
  78234. }
  78235. }
  78236. }, {
  78237. key: "getCenter",
  78238. value: function getCenter(type) {
  78239. if (this.center) {
  78240. return this.center.clone();
  78241. } else {
  78242. var center = this.points.reduce(function (total, currentValue) {
  78243. return total.add(currentValue);
  78244. }, new THREE.Vector3());
  78245. this.points.length && center.multiplyScalar(1 / this.points.length);
  78246. return center; //求不出重心呜呜
  78247. }
  78248. }
  78249. }, {
  78250. key: "getIndex",
  78251. value: function getIndex(index, add) {
  78252. var lastIndex = this.points.length - 1;
  78253. if (add == -1) return index === 0 ? this.closed ? lastIndex : null : index - 1;else if (add == 1) return index + 1 > lastIndex ? this.closed ? 0 : null : index + 1;
  78254. }
  78255. }, {
  78256. key: "getPoint",
  78257. value: function getPoint(index, add) {
  78258. var index_ = this.getIndex(index, add);
  78259. return index_ == null ? null : this.points[index_];
  78260. }
  78261. }, {
  78262. key: "updateEdge",
  78263. value: function updateEdge(index, p1, p2) {
  78264. this.edges[index] && LineDraw.updateLine(this.edges[index], p1, p2);
  78265. }
  78266. }, {
  78267. key: "update",
  78268. value: function update() {
  78269. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  78270. if (this.points.length === 0) {
  78271. return;
  78272. }
  78273. var lastIndex = this.points.length - 1;
  78274. if (options.index != void 0) {
  78275. //更新第几个点
  78276. this.updateMarker(this.markers[options.index], this.points[options.index]);
  78277. var previousIndex = this.getIndex(options.index, -1);
  78278. var nextIndex = this.getIndex(options.index, +1);
  78279. if (nextIndex != null) this.updateEdge(options.index, [this.points[options.index], this.points[nextIndex]]);
  78280. if (previousIndex != null) this.updateEdge(previousIndex, [this.points[options.index], this.points[previousIndex]]); //LineDraw.updateLine( this.edges[previousIndex], [this.points[options.index], this.points[previousIndex]])
  78281. } else {
  78282. for (var index = 0; index <= lastIndex; index++) {
  78283. var _nextIndex = this.getIndex(index, +1);
  78284. var _previousIndex = this.getIndex(index, -1);
  78285. var point = this.points[index];
  78286. var nextPoint = this.points[_nextIndex];
  78287. this.points[_previousIndex];
  78288. if (options.ifUpdateMarkers) {
  78289. this.updateMarker(this.markers[index], point);
  78290. }
  78291. if (!nextPoint) break; //add
  78292. {
  78293. this.updateEdge(index, [point, nextPoint]);
  78294. }
  78295. }
  78296. }
  78297. if (this.areaPlane) {
  78298. this.updateAreaPlane();
  78299. }
  78300. }
  78301. }, {
  78302. key: "createPrismLines",
  78303. value: function createPrismLines(color) {
  78304. this.lineMesh = LineDraw.createLine([], {
  78305. color
  78306. });
  78307. this.lineMesh.name = 'PrismLines';
  78308. this.add(this.lineMesh);
  78309. }
  78310. }, {
  78311. key: "updatePrismLines",
  78312. value: function updatePrismLines() {
  78313. var _this4 = this;
  78314. if (!this.lineMesh) return;
  78315. var positions = [];
  78316. var length = this.points.length;
  78317. this.points.forEach(function (point, index) {
  78318. //竖线:
  78319. positions.push(point.clone().setZ(_this4.zMin), point.clone().setZ(_this4.zMax)); //横线
  78320. var nextPoint = _this4.points[(index + 1) % length];
  78321. if (!nextPoint) return; //when length==1
  78322. positions.push(point.clone().setZ(_this4.zMax), nextPoint.clone().setZ(_this4.zMax)); //上横线
  78323. positions.push(point.clone().setZ(_this4.zMin), nextPoint.clone().setZ(_this4.zMin)); //下横线
  78324. });
  78325. LineDraw.moveLine(this.lineMesh, positions);
  78326. }
  78327. }, {
  78328. key: "dispose",
  78329. value: function dispose() {
  78330. //add
  78331. this.parent.remove(this);
  78332. this.markers.forEach(function (e) {
  78333. return e.dispose && e.dispose();
  78334. });
  78335. this.edges.forEach(function (e) {
  78336. return e.geometry.dispose();
  78337. });
  78338. }
  78339. }, {
  78340. key: "reDraw",
  78341. value: function reDraw() {
  78342. var restMarkerCount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  78343. //重新开始画
  78344. var pointCount = this.points.length - restMarkerCount; // restMarkerCount为需要留下的marker数量
  78345. while (pointCount > 0) {
  78346. this.removeMarker(--pointCount);
  78347. }
  78348. this.point2dInfo = null;
  78349. this.facePlane = null;
  78350. }
  78351. }, {
  78352. key: "setSelected",
  78353. value: function setSelected() {}
  78354. }, {
  78355. key: "setMarkerSelected",
  78356. value: function setMarkerSelected() {}
  78357. }, {
  78358. key: "editStateChange",
  78359. value: function editStateChange(state) {
  78360. if (!state) {
  78361. CursorDeal.remove('polygon_isIntersectSelf');
  78362. CursorDeal.remove('polygon_AtWrongPlace'); //viewer.dispatchEvent({type:'reticule_forbit', v:false})
  78363. this.markers.forEach(function (e) {
  78364. return e.isDragging = false;
  78365. });
  78366. }
  78367. }
  78368. }, {
  78369. key: "transformData",
  78370. value: function transformData(prop) {
  78371. var pick = function pick(defaul, alternative) {
  78372. if (defaul != null) {
  78373. return defaul;
  78374. } else {
  78375. return alternative;
  78376. }
  78377. };
  78378. prop.showDistances = prop.showDistances === null ? true : prop.showDistances;
  78379. prop.showArea = pick(prop.showArea, false);
  78380. prop.showAngles = pick(prop.showAngles, false);
  78381. prop.showCoordinates = pick(prop.showCoordinates, false);
  78382. prop.showHeight = pick(prop.showHeight, false);
  78383. prop.showCircle = pick(prop.showCircle, false);
  78384. prop.showAzimuth = pick(prop.showAzimuth, false);
  78385. prop.showEdges = pick(prop.showEdges, true);
  78386. prop.closed = pick(prop.closed, false);
  78387. prop.maxMarkers = pick(prop.maxMarkers, Infinity);
  78388. prop.direction = prop.direction; //add
  78389. prop.type = prop.type;
  78390. prop.showGuideLine = pick(prop.showGuideLine, false);
  78391. prop.isRect = pick(prop.isRect, false);
  78392. }
  78393. }, {
  78394. key: "continueDrag",
  78395. value: function continueDrag(marker, e) {
  78396. var _this5 = this;
  78397. var object = marker || e.drag.object;
  78398. object.isDragging = true;
  78399. this.editStateChange(true);
  78400. var timer = setTimeout(function () {
  78401. //等 drag=null之后 //右键拖拽结束后需要重新得到drag
  78402. if (_this5.parent && object.parent && object.isDragging) {
  78403. //console.log('continueDrag')
  78404. e.drag.object = object;
  78405. player$7.emit('forceToDrag', {
  78406. drag: e.drag
  78407. });
  78408. }
  78409. }, 1);
  78410. return timer;
  78411. }
  78412. }, {
  78413. key: "getDifferentPoint",
  78414. value: function getDifferentPoint(points, count) {
  78415. //for facePlane
  78416. var result = [];
  78417. for (var i = 0; i < points.length; i++) {
  78418. var p = points[i];
  78419. if (result.find(function (e) {
  78420. return e.equals(p);
  78421. })) continue;else result.push(p);
  78422. if (result.length == count) break;
  78423. }
  78424. if (result.length == count || count == void 0) return result;
  78425. }
  78426. }, {
  78427. key: "getTotalDistance",
  78428. value: function getTotalDistance() {
  78429. if (this.points.length === 0) {
  78430. return 0;
  78431. }
  78432. var distance = 0;
  78433. for (var i = 1; i < this.points.length; i++) {
  78434. var prev = this.points[i - 1];
  78435. var curr = this.points[i];
  78436. var d = prev.distanceTo(curr);
  78437. distance += d;
  78438. }
  78439. if (this.closed && this.points.length > 1) {
  78440. var first = this.points[0];
  78441. var last = this.points[this.points.length - 1];
  78442. var _d = last.distanceTo(first);
  78443. distance += _d;
  78444. }
  78445. this.totalLength = distance;
  78446. return distance;
  78447. }
  78448. }]);
  78449. return ctrlPolygon;
  78450. }(THREE.Object3D);
  78451. 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); }; }
  78452. 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; } }
  78453. var config$1 = {
  78454. precision: 2,
  78455. color: Colors.mainColor,
  78456. default: {
  78457. color: Colors.mainColor,
  78458. //"#00c7b2",
  78459. opacity: 0.7
  78460. },
  78461. highlight: {
  78462. color: Colors.mainColor,
  78463. //'#00C8AF',
  78464. opacity: 1,
  78465. labelOpacity: 0.7 //1会挡住线和端点
  78466. },
  78467. guide: {
  78468. color: '#FFFFFF',
  78469. opacity: 0.8
  78470. },
  78471. backColor: '#333333',
  78472. lineWidth: 3,
  78473. textColor: '#000000',
  78474. adsorptMinDis: 30,
  78475. //最小吸附距离(像素)
  78476. showName: true
  78477. };
  78478. var texLoader = new THREE.TextureLoader();
  78479. new THREE.Color(config$1.default.color);
  78480. new THREE.Color(config$1.highlight.color);
  78481. new THREE.Color(config$1.color);
  78482. var textColor = new THREE.Color(config$1.textColor); //遮挡规则参考如视 https://www.realsee.com/cn/history-museum-of-peking-university
  78483. //漫游模式存储visiblePanos, 只要有一个点可见就可见。飞出后穿透可见
  78484. var markerMaps;
  78485. var textSizeRatio = math$2.linearClamp(window.outerWidth * window.outerHeight, [360 * 720, 1920 * 1080], [0.7, 1]); //pc字显示大一些 用
  78486. var markerMapShrink = browser$1.isMobile() ? 0.4 : 0.8; //触屏需要更大的热区
  78487. var markerSizeInfo = {
  78488. width2d: 18 / markerMapShrink // nearBound : 1.5, farBound : 15,
  78489. };
  78490. var labelSizeInfo = {
  78491. width2d: 200
  78492. };
  78493. var angle = THREE.MathUtils.degToRad(5); //显示水平垂直辅助线的最小角度
  78494. var guideShowMinAngle = {
  78495. min: angle,
  78496. max: Math.PI / 2 - angle
  78497. };
  78498. var mainLabelProp = {
  78499. //backgroundColor: {r: defaultColor.r*255, g: defaultColor.g*255, b: defaultColor.b*255, a:config.measure.default.opacity},
  78500. backgroundColor: {
  78501. r: 0,
  78502. g: 0,
  78503. b: 0,
  78504. a: 0
  78505. },
  78506. textColor: {
  78507. r: textColor.r * 255,
  78508. g: textColor.g * 255,
  78509. b: textColor.b * 255,
  78510. a: 1.0
  78511. },
  78512. textBorderColor: {
  78513. r: 255,
  78514. g: 255,
  78515. b: 255,
  78516. a: 1.0
  78517. },
  78518. textBorderThick: 3,
  78519. fontsize: 15 * textSizeRatio,
  78520. borderRadius: 12,
  78521. margin: {
  78522. x: 20,
  78523. y: 4
  78524. },
  78525. renderOrder: RenderOrder.measure.label,
  78526. pickOrder: RenderOrder.measure.label,
  78527. transform2D: {
  78528. x: 0,
  78529. y: -0.15
  78530. },
  78531. useDepth: true,
  78532. // 2023.10 尽量不让数字被挡住
  78533. clipDistance: 10,
  78534. //消失距离
  78535. occlusionDistance: 10,
  78536. //变为backColor距离
  78537. maxOcclusionFactor: 0.3,
  78538. maxClipFactor: 0.8
  78539. };
  78540. var subLabelProp = {
  78541. backgroundColor: {
  78542. r: 255,
  78543. g: 255,
  78544. b: 255,
  78545. a: 0
  78546. },
  78547. textColor: {
  78548. r: textColor.r * 255,
  78549. g: textColor.g * 255,
  78550. b: textColor.b * 255,
  78551. a: 1.0
  78552. },
  78553. textBorderColor: {
  78554. r: 255,
  78555. g: 255,
  78556. b: 255,
  78557. a: 1.0
  78558. },
  78559. textBorderThick: 3,
  78560. fontsize: 14 * textSizeRatio,
  78561. renderOrder: RenderOrder.measure.subLabel,
  78562. pickOrder: RenderOrder.measure.subLabel,
  78563. transform2D: {
  78564. x: 0,
  78565. y: -0.13
  78566. }
  78567. };
  78568. var player$6,
  78569. measuringTool$1,
  78570. count = 0;
  78571. var Measure = /*#__PURE__*/function (_CtrlPolygon) {
  78572. _inherits(Measure, _CtrlPolygon);
  78573. var _super = _createSuper$9(Measure);
  78574. function Measure(prop, player_, measuringTool_) {
  78575. var _this;
  78576. _classCallCheck(this, Measure);
  78577. _this = _super.call(this, 'measure', prop, player_);
  78578. player$6 = player_, measuringTool$1 = measuringTool_;
  78579. _this.name = _this.name || _this.measureType + count++;
  78580. _this.selectStates = {};
  78581. _this.edgeLabels = [];
  78582. _this.coordinateLabels = [];
  78583. _this.area = {
  78584. value: 0,
  78585. string: ''
  78586. };
  78587. if (_this.showArea) {
  78588. _this.areaLabel = _this.createAreaLabel();
  78589. _this.add(_this.areaLabel);
  78590. } //add:
  78591. if (_this.atPlane || _this.faceDirection) {
  78592. //是一个平面上的话
  78593. _this.createGuideLine();
  78594. }
  78595. if (_this.measureType == 'Distance') {
  78596. _this.createHorVerGuideLine();
  78597. }
  78598. _this.setUnitSystem(prop.unit || player$6.unitConvert.UnitService.defaultSystem);
  78599. if (_this.measureType == 'MulDistance' || _this.measureType == 'Hor MulDistance' || _this.measureType == 'Ver MulDistance') {
  78600. //this.showTotalDis = true
  78601. _this.totalDisLabel = _this.createTotalDisLabel();
  78602. _this.add(_this.totalDisLabel);
  78603. } //addMarkers:
  78604. _this.boundInfo = {};
  78605. _this.initData(prop); //this.pointsPos2d = new Map //屏幕上的二维坐标
  78606. _this.lastDropTime = 0;
  78607. return _this;
  78608. }
  78609. _createClass(Measure, [{
  78610. key: "initData",
  78611. value: function initData(prop) {
  78612. var makeIt = _get(_getPrototypeOf(Measure.prototype), "initData", this).call(this, prop);
  78613. if (makeIt) {
  78614. this.edges.forEach(function (edge) {
  78615. edge.dispatchEvent('addHoverEvent');
  78616. });
  78617. this.measureType.includes('MulDistance') && this.edgeLabels.forEach(function (label) {
  78618. label.dispatchEvent('addHoverEvent');
  78619. });
  78620. } else {
  78621. this.failBuilded = true;
  78622. }
  78623. }
  78624. }, {
  78625. key: "update",
  78626. value: function update() {
  78627. var _this2 = this;
  78628. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  78629. if (options.index == -1) return;
  78630. _get(_getPrototypeOf(Measure.prototype), "update", this).call(this, options);
  78631. var setEdgeLabel = function setEdgeLabel(label, p1, p2, distance, type) {
  78632. //设置label位置和字
  78633. _this2.setEdgeLabelPos(label, p1, p2);
  78634. distance = distance == void 0 ? p1.distanceTo(p2) : distance;
  78635. var text = _this2.getConvertString(distance, 'distance');
  78636. _this2.showArea || type == 'addTitle' && (text = _this2.labelAddName(text));
  78637. label.setText(text);
  78638. return distance;
  78639. };
  78640. var lastIndex = this.points.length - 1;
  78641. var setLabel = function setLabel(index) {
  78642. if (index == null) return;
  78643. var previousIndex = _this2.getIndex(index, -1);
  78644. var nextIndex = _this2.getIndex(index, +1);
  78645. _this2.points[previousIndex];
  78646. var point = _this2.points[index];
  78647. var nextPoint = _this2.points[nextIndex];
  78648. if (_this2.showDistances) {
  78649. // edge labels
  78650. var edgeLabel = _this2.edgeLabels[index];
  78651. var distance = nextPoint && point.distanceTo(nextPoint);
  78652. _this2.edges[index].distance_ = distance;
  78653. edgeLabel.shouldVisi = nextPoint && (index < lastIndex || _this2.isRect || _this2.closed && !_this2.isNew) && distance > 0; //this.closed || edgeLabel.setVisible(edgeLabel.shouldVisi) //closed的在setEdgesDisplay中设置
  78654. common$1.updateVisible(edgeLabel, 'shouldVisi', edgeLabel.shouldVisi, 2);
  78655. if (edgeLabel.shouldVisi) {
  78656. edgeLabel.lineDir = new THREE.Vector3().subVectors(point, nextPoint).normalize(); //[point,nextPoint]
  78657. setEdgeLabel(edgeLabel, point, nextPoint, distance, _this2.measureType != 'MulDistance' && 'addTitle');
  78658. }
  78659. }
  78660. };
  78661. if (options.index != void 0) {
  78662. //更新第几个点
  78663. setLabel(options.index);
  78664. var previousIndex = this.getIndex(options.index, -1);
  78665. setLabel(previousIndex);
  78666. } else {
  78667. for (var index = 0; index <= lastIndex; index++) {
  78668. setLabel(index);
  78669. }
  78670. }
  78671. if (this.measureType == 'Distance' && this.points.length > 1) {
  78672. //设置水平垂直辅助线
  78673. var pTop, pBtm;
  78674. if (this.points[0].z > this.points[1].z) {
  78675. pTop = this.points[0];
  78676. pBtm = this.points[1];
  78677. } else {
  78678. pTop = this.points[1];
  78679. pBtm = this.points[0];
  78680. }
  78681. var projectPos = new THREE.Vector3(pTop.x, pTop.y, pBtm.z); //两条guideline的交点
  78682. {
  78683. //倾斜角度太小的时候不显示
  78684. var tan = pTop.distanceTo(projectPos) / pBtm.distanceTo(projectPos);
  78685. var _angle = Math.atan(tan);
  78686. this.shouldShowHorVerGuide = _angle > guideShowMinAngle.min && _angle < guideShowMinAngle.max;
  78687. }
  78688. LineDraw.updateLine(this.verGuideEdge, [pTop, projectPos]);
  78689. LineDraw.updateLine(this.horGuideEdge, [pBtm, projectPos]);
  78690. setEdgeLabel(this.verEdgeLabel, pTop, projectPos);
  78691. setEdgeLabel(this.horEdgeLabel, pBtm, projectPos);
  78692. this.verGuideEdge.visible = this.horGuideEdge.visible = this.shouldShowHorVerGuide;
  78693. this.verEdgeLabel.visible = this.horEdgeLabel.visible = this.shouldShowHorVerGuide;
  78694. }
  78695. if (this.showArea && this.points.length > 2) {
  78696. // update area
  78697. var msg = this.getArea().string;
  78698. msg = this.labelAddName(msg);
  78699. this.areaLabel.setPos(this.getCenter('areaPlaneCenter'));
  78700. this.areaLabel.setText(msg);
  78701. common$1.updateVisible(this.areaLabel, 'setVisible', true); //this.areaLabel.setVisible(true)
  78702. }
  78703. if (this.totalDisLabel) {
  78704. this.ifShowTotalDis();
  78705. common$1.updateVisible(this.totalDisLabel, 'setVisible', this.showTotalDis);
  78706. this.edgeLabels.forEach(function (e) {
  78707. return common$1.updateVisible(e, 'showTotalDis', !_this2.showTotalDis);
  78708. });
  78709. if (this.showTotalDis) {
  78710. var dis = this.getTotalDistance();
  78711. var _msg = this.getConvertString(dis, 'distance');
  78712. _msg = this.labelAddName(_msg);
  78713. this.center = null;
  78714. this.center = this.getCenter();
  78715. this.totalDisLabel.setPos(this.center);
  78716. this.totalDisLabel.setText(_msg);
  78717. }
  78718. }
  78719. {
  78720. var bound = new THREE.Box3();
  78721. this.points.forEach(function (e) {
  78722. return bound.expandByPoint(e);
  78723. });
  78724. var boundSize = new THREE.Vector3();
  78725. bound.getSize(boundSize);
  78726. var boundCenter = new THREE.Vector3();
  78727. bound.getCenter(boundCenter);
  78728. /* let disMap = new Map
  78729. this.points.forEach(e=>disMap.set(e, e.distanceToSquared(boundCenter)))
  78730. let centerPoint = this.points.slice().sort((a,b)=>{return disMap.get(a) - disMap.get(b)})[0] */
  78731. this.boundInfo = {
  78732. bound,
  78733. boundCenter,
  78734. boundSize //centerPoint
  78735. };
  78736. } //如果需要飞向measure的话,就飞到centerPoint的点,并且单独记录一下该点的visiblePanos?
  78737. }
  78738. }, {
  78739. key: "labelAddName",
  78740. value: function labelAddName(msg) {
  78741. var _this$title;
  78742. if ((_this$title = this.title) !== null && _this$title !== void 0 && _this$title.trim()) {
  78743. msg = [this.title, msg];
  78744. }
  78745. return msg;
  78746. }
  78747. }, {
  78748. key: "getArea",
  78749. value: function getArea() {
  78750. var area;
  78751. if (this._area != void 0) {
  78752. area = this._area;
  78753. } else if (this.point2dInfo) {
  78754. area = Math.abs(math$2.getArea(this.point2dInfo.points2d)); //this.getArea();
  78755. } else {
  78756. //mulDistance Ring 2d面
  78757. area = Math.abs(math$2.getArea(this.points));
  78758. }
  78759. var msg = this.getConvertString(area, 'area');
  78760. this.area = {
  78761. value: area,
  78762. string: msg
  78763. };
  78764. return this.area;
  78765. }
  78766. }, {
  78767. key: "getConvertString",
  78768. value: function getConvertString(num, type) {
  78769. var player_ = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : player$6;
  78770. return player_.unitConvert.convert(num, type, config$1.precision, this.unitSystem, true, {
  78771. imperial: {
  78772. minFactor: 0.01
  78773. },
  78774. metric: {
  78775. minFactor: 0.01
  78776. }
  78777. });
  78778. }
  78779. }, {
  78780. key: "ifShowTotalDis",
  78781. value: function ifShowTotalDis() {
  78782. var show = this.points.length > 2;
  78783. if (show) {
  78784. var maxDis = 0.15;
  78785. var lastIndex = this.points.length - 1;
  78786. for (var i = 0; i < lastIndex; i++) {
  78787. var len = this.edges[i].distance_;
  78788. if (len > maxDis) {
  78789. show = false;
  78790. break;
  78791. }
  78792. }
  78793. }
  78794. this.showTotalDis = show;
  78795. /* 连续测量:
  78796. 1. ≥2次测量,单个距离<15cm时,居中显示总长, hover、选中时显示每段长度
  78797. 2. 若连续测量的线段中,大于等于1段超出15cm,所有线段均显示长度
  78798. -------------------
  78799. */
  78800. }
  78801. }, {
  78802. key: "setEdgeLabelPos",
  78803. value: function setEdgeLabelPos(label, p1, p2) {
  78804. var center = new THREE.Vector3().addVectors(p1, p2).multiplyScalar(0.5);
  78805. return label.setPos(center);
  78806. }
  78807. }, {
  78808. key: "cloneMarker",
  78809. value: function cloneMarker(cloneIndex, index) {
  78810. return this.addMarker({
  78811. index,
  78812. point: this.points[cloneIndex]
  78813. });
  78814. }
  78815. }, {
  78816. key: "addMarker",
  78817. value: function addMarker() {
  78818. var _this3 = this;
  78819. var o = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  78820. var index = o.index == void 0 ? this.points.length : o.index; //要当第几个
  78821. var marker = o.marker || new Sprite({
  78822. material: this.getMat('markerDefault'),
  78823. sizeInfo: markerSizeInfo,
  78824. name: 'measure_point',
  78825. player: player$6
  78826. }); //common.setObjectLayers(marker, 'measure' )
  78827. marker.pickOrder = marker.renderOrder = RenderOrder.measure.marker;
  78828. marker.markerSelectStates = {};
  78829. marker.addEventListener('drop', function (e) {
  78830. if (e.button != THREE.MOUSE.LEFT) return;
  78831. _this3.lastDropTime = Date.now();
  78832. }); //marker.measure = this
  78833. var edge;
  78834. {
  78835. // edges
  78836. edge = o.edge || LineDraw.createFatLine([], {
  78837. material: this.getMat('edgeDefault')
  78838. });
  78839. edge.pickOrder = RenderOrder.measure.ruler; //能穿墙
  78840. //common.setObjectLayers(edge, 'measure' )
  78841. var addHoverEvent = function addHoverEvent() {
  78842. //当非isNew时才添加事件
  78843. var mouseover = function mouseover(e) {
  78844. _this3.setSelected(true, 'edge');
  78845. };
  78846. var mouseleave = function mouseleave(e) {
  78847. _this3.setSelected(false, 'edge');
  78848. };
  78849. edge.addEventListener('mouseover', mouseover);
  78850. edge.addEventListener('mouseleave', mouseleave);
  78851. edge.removeEventListener('addHoverEvent', addHoverEvent);
  78852. edge.addEventListener('click', function (e) {
  78853. var now = Date.now();
  78854. if (now - _this3.lastDropTime < 100) return; //防止拖拽marker时误触导致focus, 以及点到marker不focus
  78855. _this3.showOptionLabel(true, e.point); //viewer.focusOnObject(this, 'measure') //正在添加测量线时不要focus其他线(容易误触)
  78856. });
  78857. };
  78858. edge.addEventListener('addHoverEvent', addHoverEvent);
  78859. if (!this.isNew) {
  78860. edge.dispatchEvent('addHoverEvent');
  78861. }
  78862. }
  78863. _get(_getPrototypeOf(Measure.prototype), "addMarker", this).call(this, Object.assign(o, {
  78864. index,
  78865. marker,
  78866. edge
  78867. }));
  78868. if (this.showEdges) {
  78869. // edge labels
  78870. var edgeLabel = this.createEdgeLabel('edgeLabel'
  78871. /* , !this.closed */
  78872. );
  78873. this.edgeLabels = [].concat(_toConsumableArray(this.edgeLabels.slice(0, index)), [edgeLabel], _toConsumableArray(this.edgeLabels.slice(index, this.edgeLabels.length)));
  78874. }
  78875. var event = {
  78876. type: 'marker_added',
  78877. measurement: this,
  78878. marker: marker
  78879. };
  78880. this.dispatchEvent(event); //this.setMarker(this.points.length - 1, point);
  78881. this.update({
  78882. index
  78883. }); //更新一下倒数第二条线
  78884. return marker; //add
  78885. }
  78886. }, {
  78887. key: "editStateChange",
  78888. value: function editStateChange(state) {
  78889. var _this4 = this;
  78890. //主要针对edgeLabels显示切换,编辑时显示
  78891. _get(_getPrototypeOf(Measure.prototype), "editStateChange", this).call(this, state);
  78892. if (!state) {
  78893. this.editStateTimer = setTimeout(function () {
  78894. if (!_this4.isEditing) {
  78895. _this4.dispatchEvent({
  78896. type: 'editStateChange',
  78897. state: false
  78898. });
  78899. _this4.setEdgesDisplay(false);
  78900. _this4.areaPlane && common$1.updateVisible(_this4.areaPlane, 'intersectLastLine', true);
  78901. _this4.areaLabel && common$1.updateVisible(_this4.areaLabel, 'intersectLastLine', true);
  78902. }
  78903. }, 100);
  78904. } else {
  78905. if (!this.isEditing) {
  78906. this.dispatchEvent({
  78907. type: 'editStateChange',
  78908. state: true
  78909. });
  78910. this.setEdgesDisplay(true);
  78911. clearTimeout(this.editStateTimer);
  78912. }
  78913. }
  78914. this.isEditing = state;
  78915. }
  78916. }, {
  78917. key: "setMarkerSelected",
  78918. value: function setMarkerSelected(marker, state, hoverObject) {
  78919. //console.warn(marker.id , state, hoverObject)
  78920. marker.markerSelectStates[hoverObject] = state;
  78921. var absoluteState = false;
  78922. for (var i in marker.markerSelectStates) {
  78923. if (marker.markerSelectStates[i] == 'hover') {
  78924. absoluteState = true;
  78925. break;
  78926. }
  78927. }
  78928. if (absoluteState) {
  78929. marker.material = this.getMat('markerSelect');
  78930. marker.renderOrder = marker.pickOrder = RenderOrder.measure.marker + 1;
  78931. } else {
  78932. marker.material = this.getMat('markerDefault');
  78933. marker.renderOrder = marker.pickOrder = RenderOrder.measure.marker;
  78934. }
  78935. marker.selected = absoluteState;
  78936. }
  78937. }, {
  78938. key: "setEdgesDisplay",
  78939. value: function setEdgesDisplay(state, ignoreGuideLine) {
  78940. this.closed && this.edgeLabels.forEach(function (e) {
  78941. return common$1.updateVisible(e, 'hover', state);
  78942. });
  78943. if (this.measureType.includes('MulDistance')
  78944. /* this.totalDisLabel && !viewer.screenshoting */
  78945. ) {
  78946. this.edgeLabels.forEach(function (e) {
  78947. return common$1.updateVisible(e, 'hover', state, 1, state ? 'add' : 'cancel');
  78948. });
  78949. common$1.updateVisible(this.totalDisLabel, 'hover', !state);
  78950. }
  78951. if (!this.horVerShowAlways && !ignoreGuideLine && this.measureType == 'Distance') {
  78952. this.horEdgeLabel.visible = this.verEdgeLabel.visible = this.horGuideEdge.visible = this.verGuideEdge.visible = !!(state && this.shouldShowHorVerGuide);
  78953. }
  78954. }
  78955. }, {
  78956. key: "setSelected",
  78957. value: function setSelected(state, hoverObject) {
  78958. var _this5 = this;
  78959. //add
  78960. //console.log('setSelected',state, hoverObject)
  78961. var absoluteState = !!state;
  78962. if (hoverObject) {
  78963. //如果没有hoverObject且state为false 就强制取消选中态
  78964. this.selectStates[hoverObject] = state;
  78965. for (var i in this.selectStates) {
  78966. if (this.selectStates[i]) {
  78967. absoluteState = true;
  78968. break;
  78969. }
  78970. }
  78971. }
  78972. if (absoluteState) {
  78973. this.markers.forEach(function (e) {
  78974. return _this5.setMarkerSelected(e, 'hover', 'selectAll');
  78975. });
  78976. this.edges.forEach(function (e) {
  78977. e.renderOrder = RenderOrder.measure.marker - 1;
  78978. e.material = _this5.getMat('edgeSelect');
  78979. });
  78980. this.areaPlane && (this.areaPlane.material = this.getMat('planeSelected')); //this.areaLabel && this.areaLabel.elem.addClass('highLight')
  78981. //this.closed || this.edgeLabels.forEach(e=>e.elem.addClass('highLight') )
  78982. this.setEdgesDisplay(true, hoverObject == 'screenshot');
  78983. this.areaLabel && setLabelHightState(this.areaLabel, true);
  78984. this.closed || this.edgeLabels.forEach(function (e) {
  78985. return setLabelHightState(e, true);
  78986. });
  78987. } else {
  78988. this.markers.forEach(function (e) {
  78989. return _this5.setMarkerSelected(e, 'unhover', 'selectAll');
  78990. });
  78991. this.edges.forEach(function (e) {
  78992. return e.material = _this5.getMat('edgeDefault');
  78993. });
  78994. this.areaPlane && (this.areaPlane.material = this.getMat('planeDefault'));
  78995. this.setEdgesDisplay(false, hoverObject == 'screenshot'); //this.areaLabel && this.areaLabel.elem.removeClass('highLight')
  78996. //this.closed || this.edgeLabels.forEach(e=>e.elem.removeClass('highLight') )
  78997. this.areaLabel && setLabelHightState(this.areaLabel, false);
  78998. this.closed || this.edgeLabels.forEach(function (e) {
  78999. return setLabelHightState(e, false);
  79000. });
  79001. }
  79002. this.selected = absoluteState;
  79003. if (hoverObject != 'byList') {
  79004. this.dispatchEvent({
  79005. type: 'highlight',
  79006. state: this.selected
  79007. }); //列表高亮
  79008. }
  79009. }
  79010. }, {
  79011. key: "removeMarker",
  79012. value: function removeMarker(index) {
  79013. _get(_getPrototypeOf(Measure.prototype), "removeMarker", this).call(this, index);
  79014. var edgeIndex = index; //(index === 0) ? 0 : (index - 1);
  79015. if (this.edgeLabels[edgeIndex]) {
  79016. this.edgeLabels[edgeIndex].dispose();
  79017. this.edgeLabels.splice(edgeIndex, 1);
  79018. }
  79019. this.closed || this.points.length && (this.edges[this.points.length - 1].visible = false);
  79020. this.update({
  79021. index: this.getIndex(index, -1)
  79022. });
  79023. this.dispatchEvent({
  79024. type: 'marker_removed',
  79025. measurement: this
  79026. });
  79027. }
  79028. }, {
  79029. key: "setPosition",
  79030. value: function setPosition(index, position) {
  79031. _get(_getPrototypeOf(Measure.prototype), "setPosition", this).call(this, index, position);
  79032. var event = {
  79033. type: 'marker_moved',
  79034. measure: this,
  79035. index: index,
  79036. position: position.clone()
  79037. };
  79038. this.dispatchEvent(event);
  79039. }
  79040. }, {
  79041. key: "dispose",
  79042. value: function dispose() {
  79043. //add
  79044. var labels = this.edgeLabels.concat(this.coordinateLabels);
  79045. this.areaLabel && labels.push(this.areaLabel);
  79046. labels.forEach(function (e) {
  79047. return e.dispose();
  79048. });
  79049. _get(_getPrototypeOf(Measure.prototype), "dispose", this).call(this);
  79050. this.dispatchEvent('disposed');
  79051. }
  79052. }, {
  79053. key: "getAngleBetweenLines",
  79054. value: function getAngleBetweenLines(cornerPoint, point1, point2) {
  79055. var v1 = new THREE.Vector3().subVectors(point1, cornerPoint);
  79056. var v2 = new THREE.Vector3().subVectors(point2, cornerPoint); // avoid the error printed by threejs if denominator is 0
  79057. var denominator = Math.sqrt(v1.lengthSq() * v2.lengthSq());
  79058. if (denominator === 0) {
  79059. return 0;
  79060. } else {
  79061. return v1.angleTo(v2);
  79062. }
  79063. }
  79064. }, {
  79065. key: "getAngle",
  79066. value: function getAngle(index) {
  79067. if (this.points.length < 3 || index >= this.points.length) {
  79068. return 0;
  79069. }
  79070. var previous = index === 0 ? this.points[this.points.length - 1] : this.points[index - 1];
  79071. var point = this.points[index];
  79072. var next = this.points[(index + 1) % this.points.length];
  79073. return this.getAngleBetweenLines(point, previous, next);
  79074. }
  79075. }, {
  79076. key: "createGuideLine",
  79077. value: function createGuideLine() {
  79078. //add 辅助线
  79079. var guideLine = LineDraw.createFatLine([], {
  79080. material: this.getMat('edgeGuide')
  79081. });
  79082. guideLine.visible = false;
  79083. this.guideLine = guideLine;
  79084. this.add(guideLine);
  79085. }
  79086. }, {
  79087. key: "createHorVerGuideLine",
  79088. value: function createHorVerGuideLine() {
  79089. //创建水平与垂直辅助线,仅距离测量有。
  79090. var verGuideEdge = LineDraw.createFatLine([], {
  79091. material: this.getMat('edgeGuide')
  79092. });
  79093. verGuideEdge.visible = false;
  79094. this.verGuideEdge = verGuideEdge;
  79095. verGuideEdge.name = 'verGuideEdge';
  79096. var horGuideEdge = LineDraw.createFatLine([], {
  79097. material: this.getMat('edgeGuide')
  79098. });
  79099. horGuideEdge.visible = false;
  79100. horGuideEdge.name = 'horGuideEdge';
  79101. this.horGuideEdge = horGuideEdge;
  79102. this.add(this.verGuideEdge);
  79103. this.add(this.horGuideEdge); //label:
  79104. this.verEdgeLabel = this.createEdgeLabel('verGuideEdge');
  79105. this.horEdgeLabel = this.createEdgeLabel('horGuideEdge');
  79106. }
  79107. }, {
  79108. key: "createEdgeLabel",
  79109. value: function createEdgeLabel(name
  79110. /* , hasHoverEvent */
  79111. ) {
  79112. var _this6 = this;
  79113. var inf = {
  79114. sizeInfo: labelSizeInfo,
  79115. name: name || 'edgeLabel',
  79116. player: player$6
  79117. };
  79118. if (name && name.includes('Guide')) {
  79119. inf.fontsize = 12;
  79120. }
  79121. var edgeLabel = new TextSprite(Object.assign({}, subLabelProp,
  79122. /* hasHoverEvent ? mainLabelProp : subLabelProp, */
  79123. inf));
  79124. var addHoverEvent = function addHoverEvent() {
  79125. edgeLabel.addEventListener('mouseover', function () {
  79126. _this6.setSelected(true, 'edgeLabel');
  79127. });
  79128. edgeLabel.addEventListener('mouseleave', function () {
  79129. _this6.setSelected(false, 'edgeLabel');
  79130. });
  79131. edgeLabel.addEventListener('click', function (e) {
  79132. /* e.button == THREE.MOUSE.LEFT && */
  79133. _this6.showOptionLabel(true, e.point);
  79134. });
  79135. };
  79136. edgeLabel.addEventListener('addHoverEvent', addHoverEvent);
  79137. edgeLabel.visible = false;
  79138. edgeLabel.measure = this; //common.setObjectLayers(edgeLabel, 'measure' )
  79139. this.add(edgeLabel);
  79140. return edgeLabel;
  79141. }
  79142. }, {
  79143. key: "createAreaLabel",
  79144. value: function createAreaLabel() {
  79145. var areaLabel = this.createCenterLabel('areaLabel');
  79146. return areaLabel;
  79147. }
  79148. }, {
  79149. key: "createTotalDisLabel",
  79150. value: function createTotalDisLabel() {
  79151. var totalDisLabel = this.createCenterLabel('totalDisLabel');
  79152. return totalDisLabel;
  79153. }
  79154. }, {
  79155. key: "createCenterLabel",
  79156. value: function createCenterLabel(name) {
  79157. var _this7 = this;
  79158. var centerLabel = new TextSprite(Object.assign({}, mainLabelProp, {
  79159. sizeInfo: labelSizeInfo,
  79160. name,
  79161. transform2D: null,
  79162. fontsize: 16 * textSizeRatio
  79163. }));
  79164. centerLabel.addEventListener('mouseover', function () {
  79165. _this7.isNew || _this7.setSelected(true, 'centerLabel');
  79166. });
  79167. centerLabel.addEventListener('mouseleave', function () {
  79168. _this7.isNew || _this7.setSelected(false, 'centerLabel');
  79169. });
  79170. centerLabel.addEventListener('click', function () {
  79171. _this7.isNew || viewer.measuringTool.isAdding || viewer.focusOnObject(_this7, 'measure');
  79172. }); //common.setObjectLayers(centerLabel, 'measure' )
  79173. common$1.updateVisible(centerLabel, 'setVisible', false);
  79174. return centerLabel;
  79175. }
  79176. }, {
  79177. key: "getMat",
  79178. value: function getMat(name) {
  79179. if (!Measure.Mats) {
  79180. //不变色的部分
  79181. {
  79182. markerMaps = [texLoader.load(texture.getImageURL('images/whiteCircle.png')), //pic_point_s32
  79183. texLoader.load(texture.getImageURL('images/pic_point32.png'))];
  79184. markerMaps.forEach(function (map) {
  79185. map.repeat.set(1 / markerMapShrink, 1 / markerMapShrink);
  79186. map.offset.set((markerMapShrink - 1) / 2 / markerMapShrink, (markerMapShrink - 1) / 2 / markerMapShrink);
  79187. });
  79188. markerMaps[0].minFilter = 1006; //禁黑边
  79189. markerMaps[1].minFilter = 1006;
  79190. }
  79191. Measure.Mats = {
  79192. edgeGuide: LineDraw.createFatLineMat({
  79193. color: config$1.guide.color,
  79194. dashSize: 0.1,
  79195. gapSize: 0.02,
  79196. dashed: true,
  79197. lineWidth: config$1.lineWidth / 2
  79198. }),
  79199. edgeDefault: LineDraw.createFatLineMat({
  79200. color: config$1.default.color,
  79201. lineWidth: config$1.lineWidth,
  79202. /* dashed :true,
  79203. dashSize : 0.04,
  79204. gapSize: 0.04, */
  79205. transparent: true,
  79206. opacity: config$1.default.opacity
  79207. }),
  79208. edgeSelect: LineDraw.createFatLineMat({
  79209. color: config$1.highlight.color,
  79210. //'#f0ff00',
  79211. dashSize: 0.5,
  79212. gapSize: 0.2,
  79213. lineWidth: config$1.lineWidth,
  79214. transparent: true,
  79215. opacity: config$1.highlight.opacity
  79216. }),
  79217. guide: LineDraw.createFatLineMat({
  79218. color: config$1.guide.color,
  79219. dashSize: 0.1,
  79220. gapSize: 0.02,
  79221. dashed: true,
  79222. lineWidth: config$1.lineWidth / 2
  79223. }),
  79224. markerDefault: new THREE.MeshBasicMaterial({
  79225. transparent: !0,
  79226. opacity: 1,
  79227. map: markerMaps[0],
  79228. color: config$1.default.color,
  79229. depthTest: false //mapScale: markerMapShrink
  79230. }),
  79231. markerSelect: new THREE.MeshBasicMaterial({
  79232. //BasicMaterial
  79233. transparent: !0,
  79234. opacity: 1,
  79235. depthTest: false,
  79236. map: markerMaps[1],
  79237. depthTest: false
  79238. }),
  79239. planeDefault: new THREE.MeshBasicMaterial({
  79240. color: config$1.default.color,
  79241. side: THREE.DoubleSide,
  79242. opacity: 0.2,
  79243. transparent: true,
  79244. depthTest: false
  79245. }),
  79246. planeSelected: new THREE.MeshBasicMaterial({
  79247. color: config$1.default.color,
  79248. side: THREE.DoubleSide,
  79249. opacity: 0.3,
  79250. transparent: true,
  79251. depthTest: false
  79252. })
  79253. };
  79254. }
  79255. var mat = Measure.Mats[name];
  79256. return mat;
  79257. }
  79258. }, {
  79259. key: "createAreaPlane",
  79260. value: function createAreaPlane() {
  79261. return _get(_getPrototypeOf(Measure.prototype), "createAreaPlane", this).call(this, this.getMat('planeDefault'));
  79262. }
  79263. }, {
  79264. key: "raycast",
  79265. value: function raycast(raycaster, intersects) {
  79266. for (var i = 0; i < this.points.length; i++) {
  79267. var marker = this.markers[i];
  79268. marker.raycast(raycaster, intersects);
  79269. } // recalculate distances because they are not necessarely correct
  79270. // for scaled objects.
  79271. // see https://github.com/mrdoob/three.js/issues/5827
  79272. // TODO: remove this once the bug has been fixed
  79273. for (var _i = 0; _i < intersects.length; _i++) {
  79274. var I = intersects[_i];
  79275. I.distance = raycaster.ray.origin.distanceTo(I.point);
  79276. }
  79277. intersects.sort(function (a, b) {
  79278. return a.distance - b.distance;
  79279. });
  79280. }
  79281. }, {
  79282. key: "transformData",
  79283. value: function transformData(prop) {
  79284. if (prop.measureType == 'Point') {
  79285. prop.showCoordinates = true, prop.closed = true, prop.maxMarkers = 1, prop.minMarkers = 1;
  79286. } else if (prop.measureType == 'Distance') {
  79287. prop.showDistances = true, prop.showEdges = true, prop.maxMarkers = 2, prop.minMarkers = 2;
  79288. } else if (prop.measureType == 'MulDistance') {
  79289. prop.showDistances = true, prop.showEdges = true, prop.minMarkers = 2, prop.atPlane = true; //因为在点击最后一个点后要变成闭合面积,所以必须在同一平面
  79290. } else if (prop.measureType == 'MulDistance Ring') {
  79291. prop.showDistances = true, prop.showEdges = true, prop.showArea = true, prop.closed = true, prop.minMarkers = 3;
  79292. } else if (prop.measureType == 'Ver MulDistance') {
  79293. prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.minMarkers = 2;
  79294. prop.faceDirection = 'vertical';
  79295. prop.unableDragAtMap = true;
  79296. } else if (prop.measureType == 'Hor MulDistance') {
  79297. prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.minMarkers = 2;
  79298. prop.faceDirection = 'horizontal';
  79299. } else if (prop.measureType == 'Ver Distance') {
  79300. prop.showDistances = true, prop.showEdges = true, prop.maxMarkers = 2, prop.minMarkers = 2, prop.faceDirection = 'vertical';
  79301. prop.unableDragAtMap = true;
  79302. } else if (prop.measureType == 'Hor Distance') {
  79303. prop.showDistances = true, prop.showEdges = true, prop.maxMarkers = 2, prop.minMarkers = 2, prop.faceDirection = 'horizontal';
  79304. } else if (prop.measureType == 'Area') {
  79305. prop.showDistances = true, prop.atPlane = true;
  79306. prop.showEdges = true, prop.closed = true, prop.minMarkers = 3;
  79307. } else if (prop.measureType == 'Hor Area') {
  79308. prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 3;
  79309. prop.faceDirection = 'horizontal';
  79310. } else if (prop.measureType == 'Ver Area') {
  79311. prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 3;
  79312. prop.faceDirection = 'vertical';
  79313. prop.unableDragAtMap = true;
  79314. } else if (prop.measureType == 'Rect Area') {
  79315. prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 4;
  79316. prop.maxMarkers = 4;
  79317. } else if (prop.measureType == 'Hor Rect Area') {
  79318. prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 4;
  79319. prop.maxMarkers = 4;
  79320. prop.isRect = true;
  79321. prop.faceDirection = 'horizontal';
  79322. } else if (prop.measureType == 'Ver Rect Area') {
  79323. prop.showDistances = true, prop.atPlane = true, prop.showEdges = true, prop.closed = true, prop.minMarkers = 4;
  79324. prop.maxMarkers = 4;
  79325. prop.isRect = true;
  79326. prop.faceDirection = 'vertical';
  79327. prop.unableDragAtMap = true;
  79328. }
  79329. if (prop.atPlane && prop.closed) {
  79330. //atPlane在同一平面上
  79331. prop.showArea = true;
  79332. }
  79333. _get(_getPrototypeOf(Measure.prototype), "transformData", this).call(this, prop);
  79334. }
  79335. }, {
  79336. key: "setUnitSystem",
  79337. value: function setUnitSystem(unitSystem) {
  79338. //console.log(this.name +':' +this.unitSystem)
  79339. if (unitSystem != this.unitSystem) {
  79340. this.unitSystem = unitSystem;
  79341. this.update();
  79342. }
  79343. }
  79344. }, {
  79345. key: "reDraw",
  79346. value: function reDraw() {
  79347. var restMarkerCount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  79348. //重新开始画
  79349. _get(_getPrototypeOf(Measure.prototype), "reDraw", this).call(this, restMarkerCount);
  79350. if (this.measureType == 'Distance') {
  79351. this.shouldShowHorVerGuide = false;
  79352. this.setEdgesDisplay(false);
  79353. }
  79354. if (this.showArea) {
  79355. this.area = {
  79356. value: 0
  79357. };
  79358. this.areaLabel && common$1.updateVisible(this.areaLabel, 'setVisible', false);
  79359. }
  79360. if (this.totalDisLabel && this.showTotalDis) {
  79361. common$1.updateVisible(this.totalDisLabel, 'setVisible', false);
  79362. }
  79363. }
  79364. }, {
  79365. key: "changeToArea",
  79366. value: function changeToArea() {
  79367. this.setEdgesDisplay(false); //hide label
  79368. this.closed = true;
  79369. this.measureType = 'Area';
  79370. this.showArea = true;
  79371. this.areaLabel = this.createAreaLabel();
  79372. this.add(this.areaLabel);
  79373. this.areaPlane = this.createAreaPlane();
  79374. this.add(this.areaPlane);
  79375. }
  79376. }]);
  79377. return Measure;
  79378. }(ctrlPolygon);
  79379. Measure.prototype.showOptionLabel = function () {
  79380. var _MeasureRuler$prototy;
  79381. this.player = player$6;
  79382. if (this.isNew || measuringTool$1.isAdding) return;
  79383. (_MeasureRuler$prototy = MeasureRuler.prototype.showOptionLabel).call.apply(_MeasureRuler$prototy, [this].concat(Array.prototype.slice.call(arguments), [false]));
  79384. };
  79385. Measure.prototype.updateOptionPos = function () {
  79386. MeasureRuler.prototype.updateOptionPos.call(this);
  79387. };
  79388. function setLabelHightState(label, state) {
  79389. if (state) {
  79390. new THREE.Color(config$1.highlight.color);
  79391. label.sprite.material.useDepth = false;
  79392. } else {
  79393. label.sprite.material.useDepth = true;
  79394. }
  79395. label.updateTexture();
  79396. }
  79397. 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); }; }
  79398. 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; } }
  79399. /*
  79400. 测量线。
  79401. 线段是三维的、但长度文字是二维的。由于文字label显示在线段可见部分的中心,所以仍需要找到线段的二维端点。
  79402. */
  79403. var _color = Colors.mainColor;
  79404. var ball = new THREE.Mesh(new THREE.SphereBufferGeometry(0.01, 10, 10), new THREE.MeshBasicMaterial({
  79405. color: _color,
  79406. depthTest: false,
  79407. transparent: true
  79408. }));
  79409. var lineMat = LineDraw.createFatLineMat({
  79410. linewidth: 3,
  79411. color: _color
  79412. /*, alwaysShow: true*/
  79413. });
  79414. var MeasureRuler = /*#__PURE__*/function (_THREE$Mesh) {
  79415. _inherits(MeasureRuler, _THREE$Mesh);
  79416. var _super = _createSuper$8(MeasureRuler);
  79417. function MeasureRuler(o, player) {
  79418. var _this;
  79419. _classCallCheck(this, MeasureRuler);
  79420. _this = _super.call(this);
  79421. _this.setPoints = function (p) {
  79422. this.points = p;
  79423. };
  79424. _this.player = player; //this.sid = o.sid;
  79425. _this.setPoints(o.points);
  79426. _this.visiblePanos = o.visiblePanos;
  79427. _this.initVisiblePanos();
  79428. _this.elem = document.createElement('div');
  79429. _this.elem.className = 'ruler measure';
  79430. _this.elem.setAttribute('data-name', '');
  79431. _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>')
  79432. document.querySelector('.widgets-rulers').append(_this.elem);
  79433. _this.setUnitSystem(o.unit || player.unitConvert.UnitService.defaultSystem); //this.text = o.text || ''
  79434. _this.length = Math.round(_this.points[0].distanceTo(_this.points[1]) * 100) / 100; //this.text = /* config.i18n('common.about') + */ this.length + config.i18n('common.meter')
  79435. _this.text = _this.getConvertString(_this.length, 'distance', player);
  79436. _this.elem.innerHTML = "\n <div class=\"ruler-label\" style='color: #007BFF'>\n <div class=\"ruler-label-point\"></div>\n <span class=\"ruler-label-name\">".concat(_this.text, "</span>\n </div>\n ");
  79437. _this.name = 'measureRuler';
  79438. _this.balls = [ball.clone(), ball.clone()];
  79439. _this.balls[0].position.copy(_this.points[0]);
  79440. _this.balls[1].position.copy(_this.points[1]);
  79441. _this.balls[0].renderOrder = _this.balls[1].renderOrder = RenderOrder.measure.ruler; //在videoSkybox、videoOverlay之上
  79442. _this.add(_this.balls[0]);
  79443. _this.add(_this.balls[1]);
  79444. _this.line = LineDraw.createFatLine([_this.points[0], _this.points[1]], {
  79445. material: lineMat
  79446. });
  79447. _this.line.renderOrder = RenderOrder.measure.ruler;
  79448. _this.add(_this.line);
  79449. _this.boldLine = LineDraw.createBoldLine(_this.points, {
  79450. mat: new THREE.MeshBasicMaterial({
  79451. wireframe: true,
  79452. opacity: 0,
  79453. transparent: true,
  79454. depthTest: false,
  79455. color: _color
  79456. }),
  79457. type: 'init'
  79458. }, _this.player);
  79459. _this.boldLine.parentRuler = _assertThisInitialized(_this);
  79460. _this.add(_this.boldLine);
  79461. _this.player.model.measureRulers.add(_assertThisInitialized(_this));
  79462. _this.player.$app.config.vrFishTemp && (_this.getPosAtSphere(_this.player.currentPano.position), _this.updateBoldLine());
  79463. {
  79464. var vrSplitScreen;
  79465. _this.events = {
  79466. updatePano: function updatePano() {
  79467. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  79468. _this.updateVisible(e.targetPano);
  79469. if (_this.state == 'active') {
  79470. _this.updateBoldLine();
  79471. }
  79472. },
  79473. updateVR: function updateVR(e) {
  79474. var vrSplitScreen0 = settings$3.vrEnabled && settings$3.vrSplitScreen;
  79475. if (vrSplitScreen0 != vrSplitScreen) {
  79476. //vr 横屏要隐藏
  79477. if (vrSplitScreen0) {
  79478. _this.state = 'vrSplitScreen'; //console.log('横屏要隐藏')
  79479. _this.update();
  79480. } else {
  79481. //console.log('恢复')
  79482. _this.events.updatePano();
  79483. }
  79484. vrSplitScreen = vrSplitScreen0;
  79485. }
  79486. }
  79487. };
  79488. _this.player.on('flying.ended', _this.events.updatePano);
  79489. _this.player.on('vrStateChanged', _this.events.updateVR);
  79490. }
  79491. return _this;
  79492. }
  79493. return MeasureRuler;
  79494. }(THREE.Mesh);
  79495. MeasureRuler.prototype.initVisiblePanos = function () {
  79496. var _this2 = this;
  79497. //设置一下可见的panos。 规则:1线所穿越的所有房间都可见。2如果可以的话,其他能透过门看到线的地方最好也可见。
  79498. var roomInfo = this.player.model.wallManager.roomInfo;
  79499. if (!roomInfo) return;
  79500. if (this.player.model.wallManager.version == 2) {
  79501. var A = this.points[0].clone().setY(0),
  79502. B = this.points[1].clone().setY(0); //为了防止点在地板以下或者屋顶以上,所以高度置0
  79503. var ray = new THREE.Raycaster(A.clone(), B.clone().sub(A).normalize(), 0, A.distanceTo(B));
  79504. var o = ray.intersectObjects(this.player.model.chunks); //因为新版没有房间(虽然有新的hole或柱子,但是太复杂了。所以就直接求这条线和模型的交点,所有看得到交点的位置都可见。
  79505. for (var i = 0; i < o.length; i++) {
  79506. var pos = o[i].point.clone();
  79507. var panos = convertTool.getVisiblePano(pos, this.player.model);
  79508. this.visiblePanos = this.visiblePanos.concat(panos.filter(function (pano) {
  79509. return _this2.visiblePanos.indexOf(pano) == -1;
  79510. }));
  79511. }
  79512. } else {
  79513. var p1 = new THREE.Vector2(this.points[0].x, this.points[0].z);
  79514. var p2 = new THREE.Vector2(this.points[1].x, this.points[1].z);
  79515. var p1p2 = [p1, p2];
  79516. /* for(let i=0;i<roomInfo.length;i++){
  79517. if(!point1Room && math.isPointInArea(roomInfo[i].points, p1)){
  79518. point1Room = i; console.log("端点房间 "+i)
  79519. }
  79520. if(!point2Room && math.isPointInArea(roomInfo[i].points, p2)){
  79521. point2Room = i; console.log("端点房间 "+i)
  79522. }
  79523. } */
  79524. for (var _i = 0; _i < roomInfo.length; _i++) {
  79525. //if(i == point1Room || i == point2Room)continue; //由于两个端点的可见panos是通过tag有无遮挡mesh求出来的, 所以会少一些该房间的点,但同时也会多一些其他房间透过门看到的点。所以需要tag求出的也需要将其所在房间点加入。
  79526. for (var j = 0, len = roomInfo[_i].points.length; j < len; j++) {
  79527. var p3p4 = [{
  79528. x: roomInfo[_i].points[j].x,
  79529. y: roomInfo[_i].points[j].y
  79530. }, {
  79531. x: roomInfo[_i].points[(j + 1) % len].x,
  79532. y: roomInfo[_i].points[(j + 1) % len].y
  79533. }];
  79534. if (math$2.isLineIntersect(p1p2, p3p4)) {
  79535. roomInfo[_i].panos.forEach(function (p) {
  79536. if (_this2.visiblePanos.indexOf(p) == -1) _this2.visiblePanos.push(p);
  79537. });
  79538. console.log('加入房间 ' + _i);
  79539. break;
  79540. }
  79541. }
  79542. }
  79543. }
  79544. };
  79545. MeasureRuler.prototype.dispose = function () {
  79546. this.parent.remove(this);
  79547. this.elem.remove();
  79548. this.player.off('flying.ended', this.events.updatePano);
  79549. this.player.off('vrStateChanged', this.events.updateVR);
  79550. };
  79551. MeasureRuler.prototype.updateBoldLine = function () {
  79552. if (this.player.$app.config.vrFishTemp) {
  79553. LineDraw.updateBoldLine(this.boldLine, this.fishPoints, 'moveAndRotate');
  79554. } else {
  79555. LineDraw.updateBoldLine(this.boldLine, this.points, 'update');
  79556. }
  79557. };
  79558. MeasureRuler.prototype.showOptionLabel = function (show, pos) {
  79559. var atLine = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  79560. if (show) {
  79561. this.player.chosenMeasureRuler = this;
  79562. atLine && (pos = math$2.getFootPoint(pos, this.points[0], this.points[1])); //将点做垂线映射到线
  79563. this.optionLabelPos = pos; //三维位置
  79564. document.querySelector('.widgets-design-option').style.display = '';
  79565. this.updateOptionPos();
  79566. } else {
  79567. this.player.chosenMeasureRuler = null;
  79568. document.querySelector('.widgets-design-option').style.display = 'none';
  79569. this.optionLabelPos = null;
  79570. }
  79571. };
  79572. MeasureRuler.prototype.updateOptionPos = function () {
  79573. //更新optionLabel的位置
  79574. if (!this.optionLabelPos) return;
  79575. var pos2d = convertTool.getPos2d(this.optionLabelPos, this.player, this.player.camera);
  79576. var widgetsDesignOption = document.querySelector('.widgets-design-option');
  79577. var delRulerBtn = document.querySelector('.widgets-design-option div');
  79578. if (pos2d.trueSide) {
  79579. delRulerBtn.className.replace('hide', '');
  79580. delRulerBtn.style.left = pos2d.pos.x + 'px';
  79581. delRulerBtn.style.top = pos2d.pos.y + 'px';
  79582. if (pos2d.vector.x > 0) {
  79583. widgetsDesignOption.className.replace('right', '');
  79584. } else {
  79585. widgetsDesignOption.className.indexOf('right') < 0 && (widgetsDesignOption.className += ' right');
  79586. }
  79587. } else {
  79588. delRulerBtn.className.indexOf('hide') < 0 && (delRulerBtn.className += ' hide');
  79589. }
  79590. };
  79591. MeasureRuler.prototype.getCrossPoint = function (posIn, posOut) {
  79592. //求posOut在屏幕的可见端点,也就是从posOut到posIn的射线和屏幕边界的交点。 其中posIn只是另一个端点,并不是一定在屏幕内;而posOut是一定要在屏幕外,否则..没试过。
  79593. var W = this.player.domElement.clientWidth;
  79594. var H = this.player.domElement.clientHeight;
  79595. var x, y, border;
  79596. var r = (posOut.x - posIn.x) / (posOut.y - posIn.y); //根据相似三角形原理先求出这个比值
  79597. var getX = function getX(y) {
  79598. return r * (y - posIn.y) + posIn.x;
  79599. };
  79600. var getY = function getY(x) {
  79601. return 1 / r * (x - posIn.x) + posIn.y;
  79602. };
  79603. if (posOut.x > W || posOut.x < 0) {
  79604. //x超出的情况
  79605. if (posOut.x > W) border = W;else border = 0;
  79606. if (posOut.y < 0 || posOut.y > H) {
  79607. //y也超出
  79608. if (posOut.y < 0) y = 0;else y = H;
  79609. x = getX(y);
  79610. if (x > W || x < 0) {
  79611. x = border;
  79612. y = getY(x);
  79613. }
  79614. } else {
  79615. x = border;
  79616. y = getY(x);
  79617. }
  79618. } else {
  79619. //只有y超出,x没有超出
  79620. if (posOut.y < 0) y = 0;else y = H;
  79621. x = getX(y);
  79622. }
  79623. return new THREE.Vector2(x, y);
  79624. };
  79625. MeasureRuler.prototype.getPosInCrossPoint = function (p1, aim) {
  79626. //求aim在边界上的交点,其中aim在屏幕范围内,p1则不一定
  79627. var W = this.player.domElement.clientWidth;
  79628. var H = this.player.domElement.clientHeight;
  79629. return math$2.getCrossPointAtRect(p1, aim, W, H, 0, 0);
  79630. };
  79631. MeasureRuler.prototype.getPosAtSphere = function (toPos, useDistance) {
  79632. //fish
  79633. this.fishPoints = [];
  79634. var points = [];
  79635. this.points.forEach(function (p, index) {
  79636. var pos = convertTool.getPosAtSphere(p.clone(), toPos);
  79637. this.fishPoints.push(pos);
  79638. points.push(pos.x, pos.y, pos.z);
  79639. this.balls[index].position.copy(pos);
  79640. var s = Constants.skyRadius / toPos.distanceTo(p);
  79641. this.balls[index].scale.set(s, s, s);
  79642. }.bind(this));
  79643. LineDraw.moveFatLine(this.line, points);
  79644. };
  79645. var reTryCount = 1;
  79646. MeasureRuler.prototype.getPosInScreen = function (p1, p2, count) {
  79647. // p1 p2中一个是trueSide一个不是, 目的是得到两个trueSide
  79648. var center = p1.point.clone().add(p2.point).multiplyScalar(0.5); //二分法
  79649. var pos2d = convertTool.getPos2d(center, this.player);
  79650. if (pos2d.trueSide) {
  79651. var visi = p1.pos2d.trueSide ? p1.pos2d : p2.pos2d;
  79652. if (pos2d.inSight) {
  79653. pos2d.pos = this.getPosInCrossPoint(visi.pos, pos2d.pos);
  79654. pos2d.vector = null;
  79655. /* console.log("pos2d.inSight") */
  79656. } //要求它在边界上的点才行,否则范围被缩小
  79657. return {
  79658. result: 'p1p2',
  79659. p1: visi,
  79660. p2: pos2d
  79661. };
  79662. } else {
  79663. if (count + 1 > reTryCount) return; //最多重复次数
  79664. var trueSide = p1.pos2d.trueSide ? p1 : p2;
  79665. return this.getPosInScreen(trueSide, {
  79666. point: center,
  79667. pos2d: pos2d
  79668. }, ++count);
  79669. }
  79670. };
  79671. MeasureRuler.prototype.updateVisible = function () {
  79672. var currentPano = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.player.currentPano;
  79673. if (this.player.mode == 'panorama' ? this.visiblePanos.indexOf(currentPano) > -1 : this.player.mode != 'floorplan') {
  79674. common$1.updateVisible(this, 'atVisiPano', true); //this.state = 'active'
  79675. } else {
  79676. common$1.updateVisible(this, 'atVisiPano', false); //this.state = 'unable'
  79677. }
  79678. };
  79679. MeasureRuler.prototype.update = function () {
  79680. /* if (this.player.mode != 'panorama' || this.state != 'active') {
  79681. this.elem.style.display = 'none'
  79682. this.group.visible = false
  79683. return
  79684. } */
  79685. if (!this.realVisible()) {
  79686. this.elem.style.display = 'none';
  79687. return;
  79688. } //似乎不能根据遮挡来取消显示,因为家具就是会遮住靠墙的尺子。所以只能根据编辑的可视点?
  79689. var p1 = convertTool.getPos2d(this.points[0], this.player);
  79690. var p2 = convertTool.getPos2d(this.points[1], this.player);
  79691. var centerX, centerY;
  79692. var W = this.player.domElement.clientWidth,
  79693. H = this.player.domElement.clientHeight;
  79694. if (!p1.trueSide || !p2.trueSide) {
  79695. //只要有一个是背面点,就不让线段可见。
  79696. if (!p1.trueSide && !p2.trueSide) {
  79697. //这种情况一般都是线段背离相机了,基本不用考虑
  79698. this.elem.style.display = 'none';
  79699. return;
  79700. }
  79701. var retry = this.getPosInScreen( //如果线太长了,在很多倾斜点的角度只有一个端点trueSide,那么去到线段中点找trueSide的点,化作新的端点。
  79702. {
  79703. point: this.points[0],
  79704. pos2d: p1
  79705. }, {
  79706. point: this.points[1],
  79707. pos2d: p2
  79708. }, 0);
  79709. if (!retry) {
  79710. this.elem.style.display = 'none';
  79711. return;
  79712. }
  79713. p1 = retry.p1;
  79714. p2 = retry.p2;
  79715. }
  79716. var pos1 = p1.pos,
  79717. pos2 = p2.pos;
  79718. var len = pos1.distanceTo(pos2);
  79719. if (len == 0) {
  79720. console.warn('ruler间距为0!');
  79721. return;
  79722. } //更新label箭头的中心位置
  79723. if (!p1.inSight || !p2.inSight) {
  79724. var pos1inSight, pos2inSight; //屏幕可见线段端点。
  79725. if (!p1.inSight) {
  79726. //在屏幕外的端点要求出在和屏幕边界的交点作为可见线段端点
  79727. pos1inSight = this.getCrossPoint(pos2, pos1);
  79728. } else {
  79729. pos1inSight = pos1.clone();
  79730. }
  79731. if (!p2.inSight) {
  79732. pos2inSight = this.getCrossPoint(pos1, pos2);
  79733. } else {
  79734. pos2inSight = pos2.clone();
  79735. }
  79736. var center = pos1inSight.clone().add(pos2inSight).multiplyScalar(0.5); //在屏幕上的可见中心点
  79737. centerX = center.x;
  79738. centerY = center.y;
  79739. if (center.x > W || center.x < 0 || center.y > H || center.y < 0) {
  79740. //可见中心不在屏幕范围内,那么这条线也一定不在范围内。(似乎是,想象的..因为是可见中心)
  79741. this.elem.style.display = 'none'; //this.group.visible = false
  79742. return;
  79743. } //ratio是center到div旋转中心(原始B点)的距离 和 线段长度 的比例
  79744. var ratio;
  79745. if (pos2.x == pos1.x) {
  79746. if (pos2.y == pos1.y) {
  79747. console.warn('pos1和2一样???');
  79748. return;
  79749. } else {
  79750. if (pos2.y < pos1.y) ratio = (centerY - pos2.y) / (pos1.y - pos2.y);else ratio = (pos2.y - centerY) / (pos2.y - pos1.y);
  79751. }
  79752. } else {
  79753. if (pos2.x < pos1.x) ratio = (centerX - pos2.x) / (pos1.x - pos2.x); //if B在右
  79754. else ratio = (pos2.x - centerX) / (pos2.x - pos1.x); //if B在左
  79755. }
  79756. if (ratio < 0 || ratio > 1) {
  79757. this.elem.style.display = 'none';
  79758. return;
  79759. } //如果ratio超出范围,说明可见中心脱离线段
  79760. } else {
  79761. centerX = (pos1.x + pos2.x) / 2;
  79762. centerY = (pos1.y + pos2.y) / 2;
  79763. } //更新label的方向是左侧还是右侧
  79764. this.elem.style.display = '';
  79765. var ruler = this.elem.querySelector('.ruler-label');
  79766. if (this.dir != 'left' && centerX < W / 2 || this.dir == 'right') {
  79767. if (ruler.className.indexOf('reverse') < 0) ruler.className += ' reverse';
  79768. } else {
  79769. if (ruler.className.indexOf('reverse') >= 0) ruler.className = ruler.className.replace('reverse', '');
  79770. }
  79771. ruler.style.left = centerX + 'px';
  79772. ruler.style.top = centerY + 'px';
  79773. };
  79774. MeasureRuler.prototype.getConvertString = Measure.prototype.getConvertString;
  79775. MeasureRuler.prototype.setUnitSystem = Measure.prototype.setUnitSystem;
  79776. 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); }; }
  79777. 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; } }
  79778. new THREE.TextureLoader();
  79779. var circleGeo = new THREE.CircleGeometry(1, 100);
  79780. var sphereGeo = new THREE.SphereBufferGeometry(0.01, 6, 6);
  79781. /* const radius_ = 0.2; //当相机离目标位置的距离>magDistance_时,希望看到的视野的半径
  79782. const maxFov = THREE.Math.radToDeg(Math.atan(radius_ / magDisMin )) * 2//提前计算出当相机离目标位置的距离<magDisMin时的fov,均使用=magDisMin时的fov。只要保证该fov大于主相机的fov就会有放大效果
  79783. */
  79784. var w = 230 / 1.43;
  79785. var maxPX = 1366 * 1024; //ipad pro. 大于这个分辨率的就直接用devicePixelRatio, 如macbook也是
  79786. var width2dPX = Math.round(window.devicePixelRatio >= 2 ? (window.screen.width * window.screen.height >= maxPX ? window.devicePixelRatio / 1.2 : window.devicePixelRatio / 1.5) * w : w); //触屏或高分辨率的可能要放大些。但在手机上不能太大
  79787. //console.log('width2dPX', width2dPX)
  79788. var player$5, sceneRenderer;
  79789. var Magnifier = /*#__PURE__*/function (_THREE$Object3D) {
  79790. _inherits(Magnifier, _THREE$Object3D);
  79791. var _super = _createSuper$7(Magnifier);
  79792. //放大镜or望远镜
  79793. function Magnifier(player_, sceneRenderer_) {
  79794. var _this;
  79795. _classCallCheck(this, Magnifier);
  79796. player$5 = player_, sceneRenderer = sceneRenderer_;
  79797. _this = _super.call(this);
  79798. _this.width = _this.height = width2dPX;
  79799. /* * window.devicePixelRatio */
  79800. _this.camera = new THREE.PerspectiveCamera(50, 1, 0.01, 10000); //fov aspect near far
  79801. _this.lastZ = 0;
  79802. common$1.setCameraLayers(_this.camera, [
  79803. /* 'DEFAULT', 'PANOMARKERS' , */
  79804. 'SKYBOX', 'MODEL', 'magnifierContent']); //暂时加上DEFAULT //this.raycaster.layers.enable(RenderLayers.PANOMARKERS)
  79805. _this.renderTarget = new THREE.WebGLRenderTarget(_this.width, _this.height, {
  79806. minFilter: THREE.LinearFilter,
  79807. magFilter: THREE.LinearFilter,
  79808. format: THREE.RGBAFormat
  79809. });
  79810. _this.mesh = new THREE.Mesh(circleGeo, new THREE.MeshBasicMaterial({
  79811. side: THREE.DoubleSide,
  79812. map: _this.renderTarget.texture,
  79813. transparent: true,
  79814. depthTest: !1,
  79815. depthWrite: !1
  79816. }));
  79817. _this.overlayMesh = new THREE.Mesh(circleGeo, new THREE.MeshBasicMaterial({
  79818. side: THREE.DoubleSide,
  79819. map: common$1.loadTextureFromCache(texture.getImageURL('images/crosshair.png')),
  79820. transparent: true,
  79821. depthTest: !1,
  79822. depthWrite: !1
  79823. }));
  79824. _this.targetPoint = new THREE.Object3D();
  79825. _this.targetPoint.add(new THREE.Mesh(sphereGeo, new THREE.MeshBasicMaterial({
  79826. color: '#ff0000',
  79827. transparent: true,
  79828. opacity: 0.6
  79829. })));
  79830. _this.targetPoint.add(new THREE.Mesh(sphereGeo, new THREE.MeshBasicMaterial({
  79831. color: '#ff0000',
  79832. transparent: true,
  79833. opacity: 0.2,
  79834. depthTest: false //被遮挡层
  79835. })));
  79836. _this.targetPoint.name = 'magnifierPointTarget';
  79837. sceneRenderer.scene.add(_this.targetPoint);
  79838. common$1.setObjectLayers(_this.targetPoint, 'magnifierContent');
  79839. _this.add(_this.mesh);
  79840. _this.add(_this.overlayMesh);
  79841. _this.position.set(-1000, -1000, -100000); //令它看不见
  79842. _this.mesh.renderOrder = RenderOrder.magnifier;
  79843. _this.overlayMesh.renderOrder = RenderOrder.magnifier + 1;
  79844. /* this.mesh.layers.set(Potree.config.renderLayers.magnifier);
  79845. this.overlayMesh.layers.set(Potree.config.renderLayers.magnifier); */
  79846. /* player.on('update', e => {
  79847. if (e.lastFrameChanged) this.update()
  79848. }) */
  79849. sceneRenderer.scene.add(_assertThisInitialized(_this));
  79850. return _this;
  79851. }
  79852. _createClass(Magnifier, [{
  79853. key: "setDisplay",
  79854. value: function setDisplay(show) {
  79855. common$1.updateVisible(this, 'display', show); //界面开关
  79856. /* if(show){
  79857. sceneRenderer.addComponent(this)
  79858. }else{
  79859. sceneRenderer.removeComponent(this)
  79860. } */
  79861. } //注意:在鼠标没有移动的时候,无法获取到最新的intersect, 放大镜内的内容可能是错误的。全景模式下更奇怪,原因未知
  79862. }, {
  79863. key: "update",
  79864. value: function update(aimPos, mouse) {
  79865. var _player$cameraControl;
  79866. //相机靠近 navvis的做法
  79867. /* var dontRender = this.dontRender || (!(aimPos instanceof THREE.Vector3) && player.flying)
  79868. aimPos = aimPos instanceof THREE.Vector3 ? aimPos : this.aimPos */
  79869. var dontRender = this.dontRender || player$5.flying || !mouse && !(aimPos instanceof THREE.Vector3);
  79870. var playerCamera = (_player$cameraControl = player$5.cameraControls.activeControl) === null || _player$cameraControl === void 0 ? void 0 : _player$cameraControl.camera;
  79871. if (!playerCamera) return;
  79872. if (mouse && !(aimPos instanceof THREE.Vector3)) {
  79873. aimPos = new THREE.Vector3(mouse.x, mouse.y, this.lastZ).unproject(playerCamera);
  79874. }
  79875. if (!aimPos || !this.visible) return;
  79876. var playerPos = playerCamera.position; //viewer.scene.view.getPivot()
  79877. playerPos.distanceTo(aimPos);
  79878. var dirToCamera = new THREE.Vector3().subVectors(playerPos, aimPos).normalize();
  79879. var finalDisToAim = 0.4; //dis>magDisMin ? dis > fareast ? magDisMax : (dis-magDisMin) / (fareast-magDisMin) * (magDisMax-magDisMin) + magDisMin : dis / 2; //dis>magDistance_ ? magDistance_ : dis / 2;
  79880. this.camera.fov = Math.max(25, playerCamera.fov * 0.5);
  79881. this.camera.updateProjectionMatrix();
  79882. this.camera.position.copy(aimPos).add(dirToCamera.multiplyScalar(finalDisToAim));
  79883. this.camera.lookAt(aimPos); //自身位置
  79884. var pos2d_ = convertTool.getPos2d(aimPos, player$5); //更新目标点的实时二维位置
  79885. var pos2d = pos2d_.vector;
  79886. var margin = width2dPX * 1.1 / (player$5.domElement.clientHeight * window.devicePixelRatio) * 2; //确保到鼠标的间距占放大镜的比例不变(检查mobile、上下分屏后的变化)
  79887. var screenPos = pos2d.clone().setY(pos2d.y + (pos2d.y > 0 ? -margin : margin));
  79888. var newPos = new THREE.Vector3(screenPos.x, screenPos.y, 0.8).unproject(playerCamera); //z:-1朝外
  79889. var dir = newPos.clone().sub(playerPos).normalize().multiplyScalar(10); //这个数值要大于playerCamera.near
  79890. this.position.copy(playerPos.clone().add(dir));
  79891. this.quaternion.copy(playerCamera.quaternion);
  79892. var s = finalDisToAim * this.camera.fov / 30;
  79893. this.targetPoint.position.copy(aimPos);
  79894. this.targetPoint.scale.set(s, s, s);
  79895. this.aimPos = aimPos;
  79896. var scale = math$2.getScaleForConstantSize({
  79897. width2d: width2dPX,
  79898. position: this.getWorldPosition(new THREE.Vector3()),
  79899. player: player$5
  79900. }) / window.devicePixelRatio;
  79901. this.scale.set(scale, scale, scale);
  79902. if (!dontRender) {
  79903. //this.waitRender = true
  79904. this.render();
  79905. }
  79906. this.lastZ = pos2d.z;
  79907. }
  79908. }, {
  79909. key: "render",
  79910. value: function render() {
  79911. if (!this.visible
  79912. /*|| !this.waitRender && !viewer.needRender */
  79913. ) return;
  79914. this.beforeRender && this.beforeRender();
  79915. var oldTarget = sceneRenderer.renderer.getRenderTarget();
  79916. sceneRenderer.renderer.setRenderTarget(this.renderTarget);
  79917. common$1.updateVisible(this, 'renderScene', false); //render content, hide self
  79918. sceneRenderer.renderer.clear();
  79919. sceneRenderer.renderer.render(sceneRenderer.scene, this.camera);
  79920. common$1.updateVisible(this, 'renderScene', true);
  79921. sceneRenderer.renderer.setRenderTarget(oldTarget);
  79922. this.afterRender && this.afterRender(); //this.waitRender = false
  79923. }
  79924. }]);
  79925. return Magnifier;
  79926. }(THREE.Object3D);
  79927. 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); }; }
  79928. 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; } }
  79929. var planeGeo = new THREE.PlaneBufferGeometry(1, 1);
  79930. var dragPointMat;
  79931. var defaultLineLength = 1;
  79932. var defaultSpotScale = 0.35;
  79933. var titleHeight = {
  79934. uponSpot: 0.1
  79935. }; //title底部和spot顶端间隔
  79936. var minLineHeight = 0.5,
  79937. maxLineHeight = 5;
  79938. /* const Vectors = {
  79939. UP : new THREE.Vector3(0,1,0),
  79940. ZERO: new THREE.Vector3()
  79941. }
  79942. */
  79943. var player$4;
  79944. var sizeInfo = {
  79945. width2d: 220
  79946. };
  79947. var Tag = /*#__PURE__*/function (_THREE$Object3D) {
  79948. _inherits(Tag, _THREE$Object3D);
  79949. var _super = _createSuper$6(Tag);
  79950. function Tag(o, player_) {
  79951. var _this;
  79952. _classCallCheck(this, Tag);
  79953. _this = _super.call(this); //this.root = root //目前假设只能加在chunk上,不能加载导入的模型
  79954. player$4 = player_;
  79955. console.log('create', o);
  79956. _this.sid = o.sid;
  79957. _this.title = o.title;
  79958. _this.fontsize = o.fontsize;
  79959. _this.position.copy(o.position);
  79960. _this.normal = o.normal ? new THREE.Vector3().copy(o.normal) : new THREE.Vector3(0, 1, 0);
  79961. _this.noLine = o.noLine;
  79962. _this.lineLength = o.noLine ? 0 : o.lineLength != void 0 ? o.lineLength : defaultLineLength;
  79963. _this.build(o);
  79964. _this.bindEvent();
  79965. _this.dragEnable = false;
  79966. return _this;
  79967. }
  79968. _createClass(Tag, [{
  79969. key: "dragEnable",
  79970. get: function get() {
  79971. return this.dragEnable_;
  79972. },
  79973. set: function set(state) {
  79974. this.noLine || (this.lineDragPoint.visible = state);
  79975. this.dragEnable_ = state;
  79976. }
  79977. }, {
  79978. key: "build",
  79979. value: function build(o) {
  79980. var group = new THREE.Object3D();
  79981. this.spot = new THREE.Mesh(planeGeo, new THREE.MeshBasicMaterial({
  79982. transparent: true
  79983. }));
  79984. this.spot.name = 'spot';
  79985. this.spot.scale.set(defaultSpotScale, defaultSpotScale, defaultSpotScale);
  79986. this.spot.renderOrder = this.spot.pickOrder = RenderOrder.tag.spot; //this.changeMap(texture.getImageURL('images/pic_location128_blue.png')) //tag_icon_default
  79987. if (!this.noLine) {
  79988. this.line = LineDraw.createLine([], {
  79989. color: '#fff',
  79990. transparent: true,
  79991. depthWrite: false
  79992. }); //为了不遮挡spot设置透明和不写深度
  79993. this.line.name = 'tagLine';
  79994. this.line.renderOrder = this.line.pickOrder = RenderOrder.tag.line;
  79995. this.add(this.line);
  79996. if (!dragPointMat) {
  79997. var map = common$1.loadTextureFromCache(texture.getImageURL('images/whiteCircle.png'));
  79998. dragPointMat = {
  79999. default: new THREE.MeshBasicMaterial({
  80000. map,
  80001. transparent: true,
  80002. color: Colors.mainColor,
  80003. //'#0af',
  80004. opacity: 0,
  80005. depthTest: false
  80006. }),
  80007. hover: new THREE.MeshBasicMaterial({
  80008. map,
  80009. transparent: true,
  80010. color: Colors.mainColor,
  80011. //'#0af',
  80012. opacity: 0.4,
  80013. depthTest: false
  80014. })
  80015. };
  80016. }
  80017. this.lineDragPoint = new THREE.Mesh(planeGeo, dragPointMat.default); //修改线高度时出现的小圆点
  80018. this.lineDragPoint.scale.set(0.12, 0.12, 0.12);
  80019. this.lineDragPoint.name = 'lineDragPoint';
  80020. this.lineDragPoint.renderOrder = this.lineDragPoint.pickOrder = RenderOrder.tag.spot + 3;
  80021. group.add(this.lineDragPoint);
  80022. this.line.tag = this.lineDragPoint.tag = this;
  80023. }
  80024. this.titleLabel = new TextSprite({
  80025. root: group,
  80026. text: '',
  80027. sizeInfo,
  80028. textColor: {
  80029. r: 255,
  80030. g: 255,
  80031. b: 255,
  80032. a: 1.0
  80033. },
  80034. backgroundColor: {
  80035. r: 0,
  80036. g: 0,
  80037. b: 0,
  80038. a: 0.7
  80039. },
  80040. borderRadius: 6,
  80041. fontsize: this.fontsize || 14,
  80042. fontWeight: '',
  80043. //thick
  80044. renderOrder: RenderOrder.tag.label,
  80045. pickOrder: RenderOrder.tag.label,
  80046. maxLineWidth: 300,
  80047. transform2Dpercent: {
  80048. x: 0,
  80049. y: 0.5
  80050. },
  80051. //向上移动一半
  80052. textAlign: 'left',
  80053. player: player$4
  80054. }); //更新sprite时,实际更新的是root: spot的矩阵
  80055. this.titleLabel.sprite.material.depthTest = true;
  80056. this.setTitle(this.title);
  80057. this.updateTitlePos();
  80058. group.add(this.titleLabel);
  80059. group.add(this.spot);
  80060. this.add(group);
  80061. player$4.model.tags.add(this);
  80062. this.spot.tag = this.titleLabel.tag = this;
  80063. this.updatePose();
  80064. common$1.setObjectLayers(this, 'Tag3d');
  80065. }
  80066. }, {
  80067. key: "bindEvent",
  80068. value: function bindEvent() {
  80069. var _this2 = this,
  80070. _this$lineDragPoint,
  80071. _this$lineDragPoint2;
  80072. var hoverState = {},
  80073. grabbingObject;
  80074. var setDragPointState = function setDragPointState(state) {
  80075. if (_this2.noLine) return;
  80076. _this2.lineDragPoint.material = state ? dragPointMat.hover : dragPointMat.default;
  80077. _this2.spot.material.opacity = state ? 0.5 : 1;
  80078. _this2.titleLabel.sprite.material.opacity = state ? 0.3 : 1;
  80079. };
  80080. {
  80081. //因为只有有intersect时才能拖拽,所以写得比较麻烦
  80082. var cursor = {
  80083. hoverGrab: 0,
  80084. grabbing: 0,
  80085. hoverTag3d: 0
  80086. };
  80087. var setCursor = function setCursor(name, action) {
  80088. var state = action == 'add' ? 1 : 0;
  80089. if (state != cursor[name]) {
  80090. cursor[name] = state;
  80091. CursorDeal[action](name);
  80092. }
  80093. }
  80094. /* let getIntersect = when => {
  80095. if (when == 'drag') {
  80096. //拖拽时player没getIntersect这里获取下
  80097. let chunkPick = player.getMouseIntersect(null, player.getColliders({ noSkybox: true, checkChunk: true }))
  80098. return chunkPick
  80099. }
  80100. let chunkPick = player.allIntersects.find(e => e.object.name == 'collider' )// && e.normal //在chunk上的intersect
  80101. return chunkPick
  80102. }
  80103. */
  80104. ;
  80105. [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
  80106. return e === null || e === void 0 ? void 0 : e.addEventListener('mousemove', function (e) {
  80107. if (_this2.pointerUnable) return;
  80108. hoverState[e.target.name] = 1;
  80109. if (_this2.dragEnable && (player$4.getIntersectAtChunk() || hoverState['lineDragPoint'])) {
  80110. //能拖拽时
  80111. setCursor('hoverGrab', 'add');
  80112. } else {
  80113. setCursor('hoverGrab', 'remove');
  80114. }
  80115. });
  80116. });
  80117. [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
  80118. return e === null || e === void 0 ? void 0 : e.addEventListener('mouseleave', function (e) {
  80119. hoverState[e.target.name] = 0;
  80120. if (!Object.values(hoverState).some(function (e) {
  80121. return e;
  80122. })) {
  80123. //都没hover才取消
  80124. setCursor('hoverGrab', 'remove');
  80125. }
  80126. });
  80127. });
  80128. [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
  80129. return e === null || e === void 0 ? void 0 : e.addEventListener('drag', function (e) {
  80130. //hover dragPoint不准所以把spot去掉
  80131. if (_this2.dragEnable && cursor.grabbing) {
  80132. if (e.target.name == 'lineDragPoint') {
  80133. _this2.dragLineLen(e);
  80134. } else {
  80135. var info = player$4.getIntersectAtChunk(null, 'drag', true);
  80136. info && _this2.changePos(info);
  80137. }
  80138. }
  80139. });
  80140. });
  80141. [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
  80142. return e === null || e === void 0 ? void 0 : e.addEventListener('startDragging', function (e) {
  80143. //this.dragEnable && (getIntersect() || e.target.name == 'lineDragPoint') && setCursor('grabbing', 'add')
  80144. _this2.dragEnable && (player$4.getIntersectAtChunk() || e.target.name == 'lineDragPoint') && setCursor('grabbing', 'add');
  80145. grabbingObject = e.target.name;
  80146. grabbingObject == 'lineDragPoint' && setDragPointState(true);
  80147. });
  80148. });
  80149. [this.line, this.spot, this.lineDragPoint].forEach(function (e) {
  80150. return e === null || e === void 0 ? void 0 : e.addEventListener('drop', function (e) {
  80151. _this2.dragEnable && setCursor('grabbing', 'remove');
  80152. grabbingObject = null;
  80153. hoverState['lineDragPoint'] || setDragPointState(false);
  80154. });
  80155. }); //拖拽线来移动。虽然理想方式是拟真,拖拽时不改变在线上的位置,使之平移,但仔细想想似乎办不到。因为墙面normal是不固定的,尤其在交界处难以确定。不知鼠标在空中的位置,即使是平行镜头移动也无法满足所有情况。matterport是加了底座,移动也是改变底座中心。
  80156. }
  80157. {
  80158. /* let mouseover = (e)=>{
  80159. this.dispatchEvent({type:'mouseover'})
  80160. }
  80161. let mouseleave = (e)=>{
  80162. //if(!hoverState.line && !hoverState.spot && !hoverState.label){
  80163. this.dispatchEvent({type:'mouseleave'})
  80164. //}
  80165. } */
  80166. var click = function click(e) {
  80167. if (_this2.pointerUnable) return;
  80168. _this2.dispatchEvent('clicked');
  80169. };
  80170. /* this.spot.addEventListener('mouseover',mouseover)
  80171. this.spot.addEventListener('mouseleave',mouseleave)
  80172. this.titleLabel.addEventListener('mouseover',mouseover)
  80173. this.titleLabel.addEventListener('mouseleave',mouseleave) */
  80174. this.spot.addEventListener('click', click);
  80175. this.titleLabel.addEventListener('click', click);
  80176. } //-----------set line length
  80177. // CursorDeal
  80178. (_this$lineDragPoint = this.lineDragPoint) === null || _this$lineDragPoint === void 0 ? void 0 : _this$lineDragPoint.addEventListener('mouseover', function (e) {
  80179. grabbingObject || setDragPointState(true);
  80180. });
  80181. (_this$lineDragPoint2 = this.lineDragPoint) === null || _this$lineDragPoint2 === void 0 ? void 0 : _this$lineDragPoint2.addEventListener('mouseleave', function (e) {
  80182. grabbingObject != 'lineDragPoint' && setDragPointState(false);
  80183. });
  80184. [this.titleLabel, this.spot].forEach(function (e) {
  80185. return e === null || e === void 0 ? void 0 : e.addEventListener('mouseover', function (e) {
  80186. if (_this2.pointerUnable) return;
  80187. if (!_this2.dragEnable) {
  80188. CursorDeal.add('hoverTag3d'); //setCursor('hoverTag3d', 'add')
  80189. }
  80190. _this2.dispatchEvent({
  80191. type: 'hover'
  80192. });
  80193. });
  80194. });
  80195. [this.titleLabel, this.spot].forEach(function (e) {
  80196. return e === null || e === void 0 ? void 0 : e.addEventListener('mouseleave', function (e) {
  80197. if (!_this2.dragEnable) {
  80198. CursorDeal.remove('hoverTag3d'); //setCursor('hoverTag3d', 'remove')
  80199. }
  80200. _this2.dispatchEvent({
  80201. type: 'unhover'
  80202. });
  80203. });
  80204. });
  80205. player$4.on('mode.beforeChange', function () {
  80206. _this2.autoSizeIfOn2d();
  80207. });
  80208. player$4.on('mode.changed', function () {
  80209. _this2.autoSizeIfOn2d();
  80210. });
  80211. }
  80212. }, {
  80213. key: "autoSizeIfOn2d",
  80214. value: function autoSizeIfOn2d() {
  80215. var _player$modeTran,
  80216. _this3 = this;
  80217. //产品要求在floorplan模式时悬浮的要像贴地一样用真实大小,否则太大。注:floorplan时标签不显示的
  80218. this.sizeTransition = !this.onMesh && player$4.mode == 'transitioning' && ((_player$modeTran = player$4.modeTran) === null || _player$modeTran === void 0 ? void 0 : _player$modeTran.split('-').includes('floorplan'));
  80219. if (!this.onMesh && player$4.mode == 'floorplan') {
  80220. this.titleLabel.sprite.sizeInfo = null;
  80221. this.titleLabel.sprite.root.scale.set(1, 1, 1);
  80222. } else {
  80223. this.titleLabel.sprite.sizeInfo = sizeInfo;
  80224. }
  80225. this.titleLabel.sprite.afterUpdate = this.sizeTransition ? function () {
  80226. //大小过渡
  80227. var o = transitions$1.getById(settings$3.freeze.FlyToNewMode);
  80228. if (o && o[0]) {
  80229. var _player$modeTran2;
  80230. var percent = o[0].current / o[0].duration;
  80231. var s = _this3.titleLabel.sprite.root.scale.x;
  80232. var s_ = ((_player$modeTran2 = player$4.modeTran) === null || _player$modeTran2 === void 0 ? void 0 : _player$modeTran2.split('-')[1]) == 'floorplan' ? percent + (1 - percent) * s : percent * s + (1 - percent);
  80233. _this3.titleLabel.sprite.root.scale.set(s_, s_, s_); //console.log('percent ', percent, 's_', s_)
  80234. }
  80235. } : null; //console.log('autoSizeIfOn2d ','sizeTransition', this.sizeTransition, 'sizeInfo', this.titleLabel.sprite.sizeInfo)
  80236. }
  80237. }, {
  80238. key: "updatePose",
  80239. value: function updatePose() {
  80240. var endPos = this.normal.clone().multiplyScalar(this.lineLength);
  80241. this.line && LineDraw.moveLine(this.line, [new THREE.Vector3(0, 0, 0), endPos]);
  80242. this.titleLabel.parent.position.copy(endPos);
  80243. this.titleLabel.updatePose();
  80244. }
  80245. }, {
  80246. key: "changeLineLen",
  80247. value: function changeLineLen(len) {
  80248. if (len == this.lineLength) return;
  80249. this.lineLength = parseFloat(len);
  80250. this.updatePose();
  80251. }
  80252. }, {
  80253. key: "dragLineLen",
  80254. value: function dragLineLen(e) {
  80255. //拖拽线的顶端修改线长度
  80256. var camera = player$4.cameraControls.activeControl.camera;
  80257. var endPos = this.normal.clone().multiplyScalar(this.lineLength).applyMatrix4(this.matrixWorld);
  80258. var normal = this.normal.clone().applyQuaternion(this.getWorldQuaternion(new THREE.Quaternion()));
  80259. var projected = endPos.clone().project(camera);
  80260. projected.x = player$4.mouse.x;
  80261. projected.y = player$4.mouse.y;
  80262. var unprojected = projected.clone().unproject(camera);
  80263. var moveVec = new THREE.Vector3().subVectors(unprojected, endPos);
  80264. moveVec = moveVec.projectOnVector(normal);
  80265. var newLength = Math.max(0, this.lineLength + moveVec.dot(normal));
  80266. newLength = THREE.MathUtils.clamp(newLength, minLineHeight, maxLineHeight); //console.log(moveVec,newLength)
  80267. this.changeLineLen(newLength);
  80268. this.dispatchEvent({
  80269. type: 'dragLineLen'
  80270. });
  80271. }
  80272. }, {
  80273. key: "changePos",
  80274. value: function changePos(info) {
  80275. //注:onMesh时在非平地上拖拽,热点旋转会一直变
  80276. this.position.copy(info.point);
  80277. this.normal.copy(info.normal);
  80278. if (info.object) {
  80279. this.floorIndex = info.object.parent.floor.floorIndex; // console.log('floorUpdate')
  80280. this.dispatchEvent('floorUpdate', info.object.parent.floor);
  80281. }
  80282. this.setNorQua();
  80283. this.updatePose();
  80284. this.dispatchEvent({
  80285. type: 'posChanged'
  80286. });
  80287. }
  80288. }, {
  80289. key: "changeOnMesh",
  80290. value: function changeOnMesh(onMesh) {
  80291. //是否贴在mesh上
  80292. if (onMesh == this.onMesh) return;
  80293. this.onMesh = onMesh;
  80294. if (onMesh) {
  80295. //贴mesh上时不是sprite,且可设置旋转值
  80296. this.add(this.spot);
  80297. this.titleLabel.position.y = 0;
  80298. this.setNorQua();
  80299. this.spot.renderOrder = RenderOrder.tag.onMesh.spot; // 防止遮住线
  80300. this.line && (this.line.renderOrder = RenderOrder.tag.onMesh.line);
  80301. } else {
  80302. this.titleLabel.parent.add(this.spot);
  80303. this.updateTitlePos();
  80304. this.spot.position.set(0, 0, 0);
  80305. this.spot.quaternion.set(0, 0, 0, 1); //this.titleLabel.waitUpdate()
  80306. this.realFaceAngle = 0;
  80307. this.spot.renderOrder = RenderOrder.tag.spot; //还原
  80308. this.line && (this.line.renderOrder = RenderOrder.tag.line);
  80309. }
  80310. this.line && common$1.updateVisible(this.line, 'hideTitle', !this.titleLabel.visible && onMesh ? false : true);
  80311. this.autoSizeIfOn2d();
  80312. }
  80313. }, {
  80314. key: "setFaceAngle",
  80315. value: function setFaceAngle() {
  80316. var faceAngle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
  80317. //if(this.title == 'single2') debugger
  80318. this.faceAngle = faceAngle; //先记录,但非onMesh时不会用
  80319. if (!this.onMesh) return;
  80320. var delta = faceAngle - (this.realFaceAngle || 0);
  80321. this.spot.rotateOnAxis(new THREE.Vector3(0, 0, 1), THREE.MathUtils.degToRad(delta));
  80322. this.realFaceAngle = faceAngle;
  80323. }
  80324. }, {
  80325. key: "setNorQua",
  80326. value: function setNorQua() {
  80327. if (!this.onMesh) return;
  80328. this.spot.quaternion.setFromRotationMatrix(new THREE.Matrix4().lookAt(this.normal, Vectors$1.ZERO, Vectors$1.UP)); //重算quaternion
  80329. this.realFaceAngle = 0; //quaternion被重置了,所以再设置一下faceAngle
  80330. this.setFaceAngle(this.faceAngle);
  80331. this.spot.position.copy(this.normal).multiplyScalar(0.022); //在mesh之上偏移一点
  80332. }
  80333. /*
  80334. 如果要像四维看看那样,在地面上时保持初始转向镜头的话,需要矫正且保存quaternion。且要根据世界normal判断是否在地面, 会随着模型改变, 所以也没法仅保存normal去矫正。
  80335. 要不然就要直接改变faceAngle
  80336. */
  80337. }, {
  80338. key: "setTitle",
  80339. value: function setTitle() {
  80340. var title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
  80341. if (title == '') title = '无标题';
  80342. this.titleLabel.setText(title); //this.setTitleVisi(title instanceof Array || title.trim() != '', 'noText')//一定有标题
  80343. }
  80344. }, {
  80345. key: "setTitleVisi",
  80346. value: function setTitleVisi(v) {
  80347. var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
  80348. common$1.updateVisible(this.titleLabel, 'hideTitle-' + reason, v); //tag.onMesh && common.updateVisible(tag.line, 'hideTitle-'+reason, v)
  80349. //line的可见性比较复杂,所以干脆跟随title的,reason不记录那么多
  80350. this.line && this.onMesh && common$1.updateVisible(this.line, 'hideTitle', this.titleLabel.visible);
  80351. }
  80352. }, {
  80353. key: "setFontSize",
  80354. value: function setFontSize(fontsize) {
  80355. this.titleLabel.fontsize = this.fontsize = fontsize;
  80356. this.titleLabel.updateTexture();
  80357. }
  80358. }, {
  80359. key: "changeSpotScale",
  80360. value: function changeSpotScale(s) {
  80361. s *= defaultSpotScale;
  80362. this.spot.scale.set(s, s, s);
  80363. this.updateTitlePos();
  80364. }
  80365. }, {
  80366. key: "updateTitlePos",
  80367. value: function updateTitlePos() {
  80368. this.onMesh || (this.titleLabel.position.y = titleHeight.uponSpot + this.spot.scale.x / 2);
  80369. }
  80370. }, {
  80371. key: "changeMap",
  80372. value: function changeMap(url) {
  80373. var _this4 = this;
  80374. url = common$1.getDealedUrl(url, player$4.$app);
  80375. if (url.slice(-4) == '.svg') {
  80376. url = url.slice(0, -4) + '.png'; //也可能传过来一个文件名,到时候再看看
  80377. } //console.log('urlurl', url, old)
  80378. var map = common$1.loadTextureFromCache(url, function () {
  80379. _this4.spot.material.needsUpdate = true; //不知为何material也要更新,否则可能变白
  80380. });
  80381. this.spot.material.map = map;
  80382. }
  80383. }, {
  80384. key: "getLabel2dPos",
  80385. value: function getLabel2dPos() {
  80386. var dir = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'center';
  80387. //因为标签实际位置往上偏移了点,scale也在变,所以不同角度得到的不一样
  80388. this.updateMatrixWorld();
  80389. if (dir == 'left') {
  80390. var leftPoint = new THREE.Vector3(-0.5, 0, 0); //title左边缘中点
  80391. return leftPoint.applyMatrix4(this.titleLabel.sprite.matrixWorld);
  80392. } else {
  80393. return this.titleLabel.sprite.getWorldPosition(new THREE.Vector3());
  80394. }
  80395. }
  80396. /* updateMatrixWorld(force) {
  80397. //重写,只为了将root当做parent
  80398. this.scale.set(1 / this.root.scale.x, 1 / this.root.scale.y, 1 / this.root.scale.z)
  80399. //中和模型缩放。无论模型缩放如何都不能改tag大小
  80400. this.updateMatrix()
  80401. this.matrixWorld.multiplyMatrices(this.root.matrixWorld, this.matrix);
  80402. const children = this.children;
  80403. for (let i = 0, l = children.length; i < l; i++) {
  80404. children[i].updateMatrixWorld(force);
  80405. }
  80406. }
  80407. updateWorldMatrix(updateParents, updateChildren) {
  80408. //重写,只为了将root当做parent
  80409. if (updateParents === true && this.root !== null) {
  80410. this.root.updateWorldMatrix(true, false);
  80411. }
  80412. if (this.matrixAutoUpdate)
  80413. this.updateMatrix();
  80414. this.matrixWorld.multiplyMatrices(this.root.matrixWorld, this.matrix);
  80415. if (updateChildren === true) {
  80416. const children = this.children;
  80417. for (let i = 0, l = children.length; i < l; i++) {
  80418. children[i].updateWorldMatrix(false, true);
  80419. }
  80420. }
  80421. }*/
  80422. }, {
  80423. key: "setDepthTest",
  80424. value: function setDepthTest(state) {
  80425. this.traverse(function (e) {
  80426. if (e.material) e.material.depthTest = state;
  80427. });
  80428. }
  80429. }, {
  80430. key: "dispose",
  80431. value: function dispose() {
  80432. var _this$titleLabel;
  80433. this.parent.remove(this);
  80434. (_this$titleLabel = this.titleLabel) === null || _this$titleLabel === void 0 ? void 0 : _this$titleLabel.dispose();
  80435. }
  80436. }]);
  80437. return Tag;
  80438. }(THREE.Object3D);
  80439. 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); }; }
  80440. 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; } }
  80441. var player$3;
  80442. /*let getIntersect = (e, when) => {
  80443. if (e.intersect && e.intersect.object.name == 'collider') return e.intersect
  80444. if (when == 'drag') {
  80445. //拖拽时player没getIntersect这里获取下
  80446. let chunkPick = player.getMouseIntersect(null, player.getColliders({ noSkybox: true, checkChunk: true }))
  80447. return chunkPick
  80448. }
  80449. let chunkPick = player.allIntersects.find(e => e.object.name == 'collider') //在chunk上的intersect
  80450. return chunkPick
  80451. }*/
  80452. var MeasuringTool = /*#__PURE__*/function (_THREE$EventDispatche) {
  80453. _inherits(MeasuringTool, _THREE$EventDispatche);
  80454. var _super = _createSuper$5(MeasuringTool);
  80455. function MeasuringTool(player_) {
  80456. var _this;
  80457. _classCallCheck(this, MeasuringTool);
  80458. _this = _super.call(this);
  80459. player$3 = player_;
  80460. /* this.viewer.addEventListener('start_inserting_measurement', e => {
  80461. this.viewer.dispatchEvent({
  80462. type: 'cancel_insertions'
  80463. });
  80464. });
  80465. */
  80466. /* this.history = new History({
  80467. applyData: (data)=>{
  80468. if(data.measure.parent && data.measure.visible){
  80469. if(viewer.scene.measurements.indexOf(data.measure) != viewer.scene.measurements.length-1){//非最新加的
  80470. if( data.isNew) return //不允许减少点数至minMarkers以下, 也不允许
  80471. }
  80472. data = Potree.Common.CloneObject(data) //避免使用后更改数据又被使用
  80473. data.measure.reDraw()
  80474. data.measure.initData(data)
  80475. data.measure.isNew = data.isNew
  80476. data.measure.dispatchEvent('changeByHistory')
  80477. data.measure.facePlane = data.facePlane && data.facePlane.clone()
  80478. data.measure.cannotConfirmNormal = data.cannotConfirmNormal
  80479. return true
  80480. }
  80481. },
  80482. getData:(measure)=>{
  80483. if(measure.points.length == 0)return//没有点的话changeByHistory报错, 得有点可以移动
  80484. let data = {
  80485. measure,
  80486. points: measure.points.map(e=>e.clone()),
  80487. dataset_points: measure.dataset_points ? measure.dataset_points.map(e=>e&&e.clone()) : null,
  80488. points_datasets: measure.points_datasets.slice(),
  80489. datasetId: measure.datasetId,
  80490. isNew: measure.isNew,
  80491. facePlane: measure.facePlane && measure.facePlane.clone(),
  80492. cannotConfirmNormal: measure.cannotConfirmNormal
  80493. }
  80494. return data
  80495. }
  80496. }) */
  80497. return _this;
  80498. }
  80499. _createClass(MeasuringTool, [{
  80500. key: "createMeasureFromData",
  80501. value: function createMeasureFromData(data) {
  80502. //add
  80503. var measure = new Measure(data, player$3, this);
  80504. if (measure.failBuilded) {
  80505. return;
  80506. }
  80507. player$3.model.measurements.add(measure);
  80508. if (measure.guideLine) measure.guideLine.visible = false;
  80509. return measure;
  80510. }
  80511. }, {
  80512. key: "editStateChange",
  80513. value: function editStateChange(e) {
  80514. //console.log("editStateChange" , e.state)
  80515. var state = e.state;
  80516. if (!state) {
  80517. state = player$3.model.measurements.children.some(function (e) {
  80518. return e.isEditing;
  80519. });
  80520. }
  80521. }
  80522. }, {
  80523. key: "startInsertion",
  80524. value: function startInsertion() {
  80525. var _this2 = this;
  80526. var args = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  80527. var cancelFun = arguments.length > 2 ? arguments[2] : undefined;
  80528. var measure;
  80529. if (args.resume) {
  80530. measure = args.measure;
  80531. args.minMarkers = measure.minMarkers;
  80532. } else {
  80533. measure = new Measure(args, player$3, this);
  80534. }
  80535. measure.isNew = true;
  80536. this.dispatchEvent({
  80537. type: 'cancel_insertions'
  80538. });
  80539. measure.addEventListener('editStateChange', this.editStateChange.bind(this));
  80540. measure.editStateChange(true);
  80541. var timer;
  80542. this.isAdding = true;
  80543. var endDragFun = function endDragFun(e) {
  80544. var length = measure.points.length;
  80545. if (e.button == THREE.MOUSE.LEFT || e.isTouch) {
  80546. if (length >= measure.maxMarkers) {
  80547. end({
  80548. finish: true
  80549. });
  80550. } else {
  80551. //this.history.beforeChange(measure)
  80552. var marker = measure.cloneMarker(length - 1, length);
  80553. if (args.isRect && measure.markers.length == 3) {
  80554. //marker全可见
  80555. measure.cloneMarker(0, 3);
  80556. } else {
  80557. common$1.updateVisible(measure.markers[length], 'adding', false);
  80558. measure.edges[length].visible = false;
  80559. }
  80560. measure.edges[length - 1].visible = true;
  80561. common$1.updateVisible(measure.markers[length - 1], 'adding', true);
  80562. marker.isDragging = true; //this.history.afterChange(measure)
  80563. measure.continueDrag(marker, e);
  80564. if (measure.markers.length == 4) {
  80565. measure.markers[0].addEventListener('mouseover', mouseover);
  80566. measure.markers[0].addEventListener('mouseleave', mouseleave);
  80567. } else if (measure.markers.length == 5) {
  80568. //在点击的那一刻增加监听然后直接触发
  80569. //如果点击了第一个点就要变成closed, 并结束
  80570. measure.markers[0].addEventListener('click', Exit);
  80571. }
  80572. }
  80573. } else if (e.button === THREE.MOUSE.RIGHT) {
  80574. //触屏怎么取消?
  80575. if (player$3.mouseCouldBeClickToMove
  80576. /* e.pressDistance < Potree.config.clickMaxDragDis */
  80577. ) {
  80578. //非拖拽的话
  80579. var isIntersectSelf = measure.atPlane && measure.closed && !measure.isRect && measure.point2dInfo && measure.intersectSelf(measure.point2dInfo.points2d.slice(0, measure.point2dInfo.points2d.length - 1)); //检测除了最后一个点的相交情况
  80580. if (!isIntersectSelf) end(e);else measure.continueDrag(null, e);
  80581. } else {
  80582. console.log('222');
  80583. measure.continueDrag(null, e);
  80584. }
  80585. }
  80586. };
  80587. var end = function end() {
  80588. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  80589. //确定、结束
  80590. if (!measure.isNew) return;
  80591. if (args.minMarkers != void 0) {
  80592. if (!e.finish && measure.markers.length <= args.minMarkers) {
  80593. //右键 当个数不够时取消
  80594. //重新开始画
  80595. if (measure.markers.length > 0) {
  80596. measure.markers[0].removeEventListener('click', Exit);
  80597. measure.reDraw();
  80598. player$3.on('click', click, {
  80599. importance: 10
  80600. });
  80601. player$3.on('pointerMove', pointerMove);
  80602. measure.editStateChange(true);
  80603. }
  80604. return;
  80605. }
  80606. }
  80607. var lastMarker = measure.markers[measure.markers.length - 1];
  80608. if (
  80609. /* !e.finish&& */
  80610. measure.markers.length > args.minMarkers) {
  80611. measure.removeMarker(measure.points.length - 1);
  80612. measure.markers[0].removeEventListener('mouseover', mouseover);
  80613. measure.markers[0].removeEventListener('mouseleave', mouseleave);
  80614. measure.markers[0].removeEventListener('click', Exit);
  80615. if (e.byClickMarker && measure.markers.length > args.minMarkers) {
  80616. //通过点击第一个marker而结束的话,会多一个marker。但点击marker后可能会因为和它坐标一致而没有添加成功,就不删,根据添加的时间来判断。
  80617. var delta = Date.now() - lastMarker.createTime; //console.log('delta',delta)
  80618. if (delta < 10) {
  80619. //刚生成的,说明点击后新增了一个marker
  80620. measure.removeMarker(measure.points.length - 1);
  80621. }
  80622. measure.changeToArea();
  80623. }
  80624. }
  80625. measure.isNew = false;
  80626. measure.editStateChange(false);
  80627. var length = measure.points.length;
  80628. if (length) {
  80629. common$1.updateVisible(measure.markers[length - 1], 'adding', true);
  80630. measure.edges[length - 1].visible = !!measure.closed;
  80631. measure.edges.forEach(function (edge) {
  80632. edge.dispatchEvent({
  80633. type: 'addHoverEvent'
  80634. });
  80635. });
  80636. measure.markers.forEach(function (marker) {
  80637. marker.dispatchEvent({
  80638. type: 'addHoverEvent'
  80639. });
  80640. });
  80641. measure.measureType.includes('MulDistance') && measure.edgeLabels.forEach(function (label) {
  80642. label.dispatchEvent({
  80643. type: 'addHoverEvent'
  80644. });
  80645. });
  80646. measure.update(); //update last edgeLabel
  80647. }
  80648. clearTimeout(timer);
  80649. _this2.removeEventListener('cancel_insertions', Exit); //pressExit && this.viewer.inputHandler.removeEventListener('keydown', pressExit);
  80650. player$3.off('click', click);
  80651. player$3.off('pointerMove', pointerMove); //player.off('pointerMove', ifAtWrongPlace )
  80652. CursorDeal.remove('polygon_AtWrongPlace'); //viewer.inputHandler.dispatchEvent({type:'measuring', v:false, cause:'stopInsertion', situation:'adding', object:measure} )
  80653. var isIntersectSelf = measure.atPlane && measure.closed && !measure.isRect && measure.point2dInfo && measure.intersectSelf(measure.point2dInfo.points2d);
  80654. if (isIntersectSelf) return cancelFun && cancelFun(); //请求删除,不重建
  80655. //e.remove || (callback && callback())
  80656. _this2.isAdding = false;
  80657. if (e.type_ == 'cancel_insertions') measure.dispose(); //add
  80658. CursorDeal.remove('hoverFirstMarker');
  80659. measure.dispatchEvent({
  80660. type: 'createDone',
  80661. type_: e.type_
  80662. });
  80663. };
  80664. measure.addEventListener('finish', end); //完成
  80665. var Exit = function Exit(e) {
  80666. //强制退出
  80667. if (e.measure && e.measure != measure || !player$3.model.measurements.children.includes(measure) || !measure.isNew) {
  80668. return; //若指定了退出的measure但和该measure不一致,就返回
  80669. }
  80670. measure.cannotConfirmNormal = false; //一些dropMarker中的句子
  80671. measure.guideLine && (measure.guideLine.visible = false);
  80672. end({
  80673. finish: true,
  80674. remove: e.remove,
  80675. byClickMarker: e.type == 'click',
  80676. type_: e.type
  80677. });
  80678. player$3.emit('forceToDrag', {}); //this.viewer.inputHandler.drag && (this.viewer.inputHandler.drag.object = null)
  80679. };
  80680. this.addEventListener('cancel_insertions', Exit);
  80681. var mouseover = function mouseover(e) {
  80682. measure.setMarkerSelected(e.target, 'hover', 'single');
  80683. CursorDeal.add('hoverFirstMarker');
  80684. };
  80685. var mouseleave = function mouseleave(e) {
  80686. measure.setMarkerSelected(e.target, 'unhover', 'single');
  80687. CursorDeal.remove('hoverFirstMarker');
  80688. };
  80689. var pointerMove = function pointerMove(e) {
  80690. var _player$getIntersectA;
  80691. var I = (_player$getIntersectA = player$3.getIntersectAtChunk(e.intersect, 'drag')) === null || _player$getIntersectA === void 0 ? void 0 : _player$getIntersectA.point; //getIntersect(e, 'drag')?.point
  80692. if (I) {
  80693. CursorDeal.remove('polygon_AtWrongPlace');
  80694. } else {
  80695. CursorDeal.add('polygon_AtWrongPlace');
  80696. }
  80697. };
  80698. var click = function click(e) {
  80699. var _player$getIntersectA2;
  80700. //一旦点击就立刻增加两marker
  80701. //if(ifAtWrongPlace(e))return
  80702. if (e.getConsumed()) return; //如点击label时focusOnObject
  80703. if (e.button === THREE.MOUSE.RIGHT) return; //console.log('measure clicked33', !!e.intersectPoint)
  80704. var I = (_player$getIntersectA2 = player$3.getIntersectAtChunk(e.intersect, 'drag')) === null || _player$getIntersectA2 === void 0 ? void 0 : _player$getIntersectA2.point; //getIntersect(e, 'drag')?.point //e.intersect?.point
  80705. if (!I) {
  80706. if (measure.zPlaneWhenNoIntersect != void 0) {
  80707. //on ground
  80708. var _Potree$Utils$getPoin = Potree.Utils.getPointerPosAtHeight(measure.zPlaneWhenNoIntersect, e.pointer),
  80709. x = _Potree$Utils$getPoin.x,
  80710. y = _Potree$Utils$getPoin.y;
  80711. I = new THREE.Vector3(x, y, measure.zPlaneWhenNoIntersect);
  80712. } else {
  80713. return measure.dispatchEvent({
  80714. type: 'intersectNoPointcloud'
  80715. });
  80716. }
  80717. }
  80718. var marker = measure.addMarker({
  80719. point: I
  80720. });
  80721. marker.isDragging = true;
  80722. /* this.viewer.inputHandler.startDragging(marker , {endDragFun, notPressMouse:true} ); //notPressMouse代表不是通过按下鼠标来拖拽
  80723. e.drag = this.viewer.inputHandler.drag
  80724. */
  80725. /* player.emit('forceToDrag', { object: marker , drag:{ endDragFun, notPressMouse: true }})
  80726. let evt = Object.assign({}, e, {target: marker, drag:{ endDragFun, notPressMouse: true } } ) //{ intersect: e.intersect, target: marker, endDragFun, notPressMouse: true }
  80727. measure.dragMarker(evt)
  80728. measure.dropMarker(evt) */
  80729. player$3.emit('forceToDrag', Object.assign({}, e, {
  80730. drag: {
  80731. object: marker,
  80732. endDragFun,
  80733. notPressMouse: true
  80734. }
  80735. }));
  80736. player$3.emit('forceToDrag', e); //drop
  80737. if (measure.maxMarkers > 1) {
  80738. common$1.updateVisible(measure.markers[1], 'adding', false);
  80739. measure.edges[1].visible = false;
  80740. }
  80741. player$3.off('click', click);
  80742. player$3.off('pointerMove', pointerMove); //console.log('measure clicked')
  80743. e.consume && e.consume();
  80744. return {
  80745. stopContinue: true
  80746. }; //防止继续执行别的侦听,如flytopano
  80747. }; //点击第n下拥有n+1个marker, n>0
  80748. player$3.on('click', click, {
  80749. importance: 10
  80750. }); //this.viewer.addEventListener('global_click', click, {importance:10})//add importance
  80751. player$3.on('pointerMove', pointerMove);
  80752. args.resume || player$3.model.measurements.add(measure);
  80753. return measure;
  80754. }
  80755. }]);
  80756. return MeasuringTool;
  80757. }(THREE.EventDispatcher);
  80758. //照片制卷 已知热点位置和
  80759. var player$2;
  80760. var sideBoundPoints = [[-1, 1], [-0.9, 1], [-0.8, 1], [-0.7, 1], [-0.6, 1], [-0.5, 1], [-0.4, 1], [-0.3, 1], [-0.2, 1], [-0.1, 1], [-0, 1], [0.1, 1], [0.2, 1], [0.3, 1], [0.4, 1], [0.5, 1], [0.6, 1], [0.7, 1], [0.8, 1], [0.9, 1], [1, 1], [1, 0.9], [1, 0.8], [1, 0.7], [1, 0.6], [1, 0.5], [1, 0.4], [1, 0.3], [1, 0.2], [1, 0.1], [1, 0], [1, 0], [1, -0.1], [1, -0.2], [1, -0.3], [1, -0.4], [1, -0.5], [1, -0.6], [1, -0.7], [1, -0.8], [1, -0.9]
  80761. /* [1,-1],
  80762. [0.9,-1],[0.8,-1],[0.7,-1],[0.6,-1],[0.5,-1],[0.4,-1],[0.3,-1],[0.2,-1],[0.1,-1],[0,-1],
  80763. [-0.1,-1] */
  80764. ];
  80765. for (var i = 0, len = sideBoundPoints.length; i < len; i++) {
  80766. sideBoundPoints.push([-sideBoundPoints[i][0], -sideBoundPoints[i][1]]);
  80767. }
  80768. var canvasRes = new THREE.Vector2(1024, 512); //const snapResolution = new THREE.Vector2(1.78*500, 500) //5671*3186
  80769. var snapAspect = 1.78; //和截图页面实际会有一点偏差
  80770. var imgResolution = new THREE.Vector2(4096, 2048); // (8192,4096)
  80771. var TestRouteSnap = {
  80772. init(tagManager, app) {
  80773. if (this.inited) return;
  80774. this.tagManager = tagManager;
  80775. this.app = app;
  80776. player$2 = app.core.get('Player');
  80777. console.log(tagManager.tag3ds);
  80778. this.inited = true;
  80779. this.camera = player$2.camera.clone();
  80780. this.camera.aspect = snapAspect;
  80781. this.camera.updateProjectionMatrix();
  80782. this.generate(tagManager.tag3ds[0], new THREE.Vector3(-6.341202318462933, -0.24444786181942013, -0.388378329219438));
  80783. window.testSnap = this;
  80784. this.showPanoRenderArea();
  80785. },
  80786. generate(tag, doorPos) {
  80787. var panoStart = this.tagManager.findBestPanoForWatching(tag);
  80788. var panoEnd = player$2.model.panos.closestPanoTowardPoint({
  80789. point: doorPos
  80790. });
  80791. var route = this.findRoute(panoStart, panoEnd);
  80792. var list = this.findTurnPanos(route);
  80793. console.log('拐点', list); //let tagSnap = this.getSnapCorners(panoStart, tag.position)
  80794. //let cornerList = [tagSnap]
  80795. var cornerList = [];
  80796. for (var _i = 0, _len = list.length; _i < _len; _i++) {
  80797. cornerList.push(this.getSnapCorners(list[_i], _i == 0 ? tag.position : list[_i - 1].position));
  80798. cornerList.push(this.getSnapCorners(list[_i], _i == _len - 1 ? doorPos : list[_i + 1].position));
  80799. }
  80800. console.error('cornerList', cornerList);
  80801. return cornerList;
  80802. },
  80803. findRoute(panoStart, panoEnd) {
  80804. var panos = aStart.searchRoad(player$2.model.panos.index, panoStart.id, panoEnd.id) || [];
  80805. return [panoStart.id].concat(panos);
  80806. },
  80807. findTurnPanos(panos) {
  80808. var turnPanos = [panos[0]];
  80809. for (var _i2 = 0, _len2 = panos.length; _i2 < _len2; _i2++) {
  80810. var last = player$2.model.panos.index[turnPanos[turnPanos.length - 1]]; //上次的拐点
  80811. if (!last.neighbourPanos[panos[_i2]]) {
  80812. turnPanos.push(panos[_i2 - 1]); //前一个是拐点
  80813. }
  80814. }
  80815. if (turnPanos[turnPanos.length - 1] != panos[panos.length - 1]) {
  80816. //加入最后一个点
  80817. turnPanos.push(panos[panos.length - 1]);
  80818. }
  80819. return turnPanos.map(function (e) {
  80820. return player$2.model.panos.get(e);
  80821. });
  80822. /* let list = [], vec1 = new THREE.Vector3, vec2 = new THREE.Vector3
  80823. for(let i=0,len=turnPanos.length; i<len;i++){
  80824. let last = turnPanos[i-1]
  80825. let next = turnPanos[i+1]
  80826. vec1.quaternion
  80827. }
  80828. return list */
  80829. },
  80830. getSnapCorners(pano, target) {
  80831. var _this = this;
  80832. //得到四个角在全景图的像素坐标
  80833. //假定相机的aspect刚好等于snapAspect
  80834. //该方法需要先让相机在对应位置,然后得到屏幕所显示的完整截图
  80835. player$2.cameraControls.activeControl.camera;
  80836. this.camera.position.copy(pano.position);
  80837. this.camera.lookAt(target);
  80838. this.camera.updateMatrixWorld();
  80839. var corners_ = [[-1, 1], [1, 1], [1, -1], [-1, -1]]; //从左上开始顺时针的四个角
  80840. var corners = corners_.map(function (mouse) {
  80841. var point = new THREE.Vector3(mouse[0], mouse[1], -1).unproject(_this.camera);
  80842. var dir = new THREE.Vector3().subVectors(point, pano.position);
  80843. var dirInPano = math$1.getNormalDir(dir, pano);
  80844. return math$1.getUVfromDir(dirInPano).multiply(imgResolution);
  80845. });
  80846. return {
  80847. id: pano.id,
  80848. corners
  80849. };
  80850. },
  80851. initPanoVisible() {},
  80852. getImgUrl(id) {
  80853. return "http://192.168.0.125:1804/oss/scene_view_data/SG-hx-fR7Wnyo2lI8/images/pan/high/0.jpg?_=3";
  80854. },
  80855. showPanoRenderArea() {
  80856. var _this2 = this;
  80857. var pano = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : player$2.currentPano;
  80858. //勾勒出当前视口在全景图上的范围
  80859. if (!this.imgReview) {
  80860. var panoImgReview = document.createElement('div');
  80861. panoImgReview.id = 'panoImgReview';
  80862. document.querySelector('body').appendChild(panoImgReview);
  80863. panoImgReview.innerHTML = "\n <img id=\"img\" ></img>\n <button> \u70B9\u51FB\u5237\u65B0 </button>\n <div id=\"upper\" class='full'>\n <canvas class='full'></canvas>\n /* <div id='cursor' style='display:none'></div> */\n </div> \n "; //&lt; &gt;
  80864. var style = document.createElement('style');
  80865. style.type = 'text/css';
  80866. style.textContent = "\n #panoImgReview{\n position: fixed;\n z-index: 30000;\n width: 40%;\n min-width: 500px;\n top: 0;\n border: 2px solid white; \n }\n button{ \n width: 41px;\n height: 41px;\n position: absolute;\n background: #ffffff; \n }\n img{\n width: 100%;\n }\n .full{\n position: absolute;\n height: 100%;\n width: 100%;\n top: 0;\n }\n /* div#cursor{\n position: absolute;\n width: 5px;\n height: 5px;\n background: #f00;\n left: 10%;\n top: 100%;\n transform: translate(-50%, -50%);\n } */\n ";
  80867. document.head.appendChild(style);
  80868. this.imgReview = panoImgReview;
  80869. var btn = this.imgReview.querySelector('button');
  80870. btn.addEventListener('click', function () {
  80871. _this2.showPanoRenderArea();
  80872. });
  80873. var canvas = this.imgReview.querySelector('canvas');
  80874. canvas.width = canvasRes.x;
  80875. canvas.height = canvasRes.y;
  80876. this.ctx = canvas.getContext('2d');
  80877. this.ctx.strokeStyle = 'rgb(255,50,200)';
  80878. this.ctx.fillStyle = 'rgb(255,255,200)';
  80879. var r = imgResolution.x / canvasRes.x;
  80880. this.showCoordPoint = function (coord) {
  80881. //输入给算法的坐标
  80882. ctx.fillRect(coord.x / r, y / r, 1, 1); // 画一个点(1x1 的矩形)
  80883. };
  80884. }
  80885. this.imgReview.querySelector('img').src = pano.getCubemapUrls('high');
  80886. var cameraReal = player$2.cameraControls.activeControl.camera; //创建屏幕四边若干序列点
  80887. var coords = sideBoundPoints.map(function (mouse) {
  80888. var point = new THREE.Vector3(mouse[0], mouse[1], -1).unproject(cameraReal);
  80889. var dir = new THREE.Vector3().subVectors(point, pano.position);
  80890. var dirInPano = math$1.getNormalDir(dir, pano);
  80891. return math$1.getUVfromDir(dirInPano).multiply(canvasRes);
  80892. });
  80893. var ctx = this.ctx;
  80894. ctx.clearRect(0, 0, canvasRes.x, canvasRes.y);
  80895. ctx.lineWidth = 5;
  80896. ctx.beginPath();
  80897. ctx.moveTo(coords[0].x, coords[0].y);
  80898. for (var _i3 = 1, _len3 = coords.length; _i3 < _len3; _i3++) {
  80899. ctx.lineTo(coords[_i3].x, coords[_i3].y);
  80900. }
  80901. ctx.closePath(); // 闭合路径,回到起点
  80902. //ctx.fill();
  80903. ctx.stroke();
  80904. }
  80905. };
  80906. var math$1 = {
  80907. getUVfromDir(dir) {
  80908. //获取UV 同shader里的计算
  80909. var dir = dir.clone();
  80910. dir.x *= -1; //计算前这里不能漏掉 *= -1 见shader
  80911. var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5; //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
  80912. var ty = Math.acos(dir.y) / Math.PI;
  80913. return new THREE.Vector2(tx, ty); //理想状态下tx相同
  80914. },
  80915. crossRight(vec3, matrix) {
  80916. //似乎是只取旋转。当年不知道怎么想到这函数的- -
  80917. var e = matrix.elements;
  80918. var v = new THREE.Vector3();
  80919. v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3];
  80920. v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7];
  80921. v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11];
  80922. return v;
  80923. },
  80924. getNormalDir(dir, currentPano) {
  80925. if (currentPano.tiled) {
  80926. var matrixWorld = currentPano.rot90Matrix.clone();
  80927. } else {
  80928. var matrixWorld = currentPano.matrixWorld.clone();
  80929. }
  80930. dir = this.crossRight(dir, matrixWorld); //右乘matrixWorld 得matrix转化的向量
  80931. dir.normalize();
  80932. return dir;
  80933. },
  80934. getQuaByAim(aim) {
  80935. var center = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new THREE.Vector3();
  80936. //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
  80937. var _ = new THREE.Matrix4().lookAt(center, aim, new THREE.Vector3(0, 1, 0));
  80938. var aimQua = new THREE.Quaternion().setFromRotationMatrix(_);
  80939. return aimQua;
  80940. }
  80941. }; //还要对tag截一张图 所以需要我这加载tag,初始化tag, 然后focus
  80942. //入户门可能还要算点位
  80943. /*
  80944. 视图的mouse 左下角是(-1,-1)
  80945. */
  80946. /* 全景图 http://192.168.0.125:1804/oss/scene_view_data/SG-hx-fR7Wnyo2lI8/images/pan/high/0.jpg?_=3
  80947. see getCubemapUrls
  80948. */
  80949. /*
  80950. 在console界面输出当前点位屏幕四个角在全景图上的像素坐标
  80951. let getUVfromDir = function(dir) {
  80952. //获取UV 同shader里的计算
  80953. var dir = dir.clone()
  80954. dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
  80955. var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
  80956. var ty = Math.acos(dir.y) / Math.PI
  80957. return new THREE.Vector2( tx, ty )
  80958. //理想状态下tx相同
  80959. }
  80960. let crossRight = function(vec3, matrix) {
  80961. var e = matrix.elements
  80962. var v = new THREE.Vector3()
  80963. v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
  80964. v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
  80965. v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
  80966. return v
  80967. }
  80968. let getNormalDir = function(point, currentPano) {
  80969. var dir = point.clone().sub(currentPano.position) //OA
  80970. if (supportsTiles) {
  80971. var matrixWorld = currentPano.rot90Matrix.clone() //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
  80972. } else {
  80973. var matrixWorld = currentPano.matrixWorld.clone()
  80974. }
  80975. dir = crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
  80976. dir.normalize()
  80977. return dir
  80978. }
  80979. let player = __sdk.core.get('Player')
  80980. // let dir = player.getDirection()
  80981. //let quaInv = new THREE.Quaternion().copy(player.currentPano.quaternion).invert()
  80982. // dir.applyQuaternion(quaInv)
  80983. //console.log(getUVfromDir(dir))
  80984. let camera = player.camera
  80985. let imgResolution = new THREE.Vector2(8192,4096)
  80986. let corners = [[-1,1],[1,1],[1,-1],[-1,-1]]
  80987. console.log(corners.map(mouse=>{
  80988. var point = new THREE.Vector3(mouse[0],mouse[1],-1).unproject( camera)
  80989. let dir = getNormalDir(point, player.currentPano)
  80990. return getUVfromDir(dir).multiply(imgResolution)
  80991. }))
  80992. //当全景图不旋转时,得到的框 y一样,x不一样
  80993. =====ver2=====
  80994. 根据给定的fov:
  80995. 得到的结果不对! 舍弃
  80996. let getQuaByAim = function(aim, center = new THREE.Vector3() ) {
  80997. //z朝上的坐标系是 forward = new THREE.Vector3(0, 1, 0)
  80998. var _ = (new THREE.Matrix4).lookAt(center, aim, new THREE.Vector3(0,1,0));
  80999. aimQua = (new THREE.Quaternion).setFromRotationMatrix(_);
  81000. return aimQua
  81001. }
  81002. let getUVfromDir = function(dir) {
  81003. //获取UV 同shader里的计算
  81004. var dir = dir.clone()
  81005. dir.x *= -1 //计算前这里不能漏掉 *= -1 见shader
  81006. var tx = Math.atan2(dir.x, dir.z) / (Math.PI * 2.0) + 0.5 //atan2(y,x) 返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。区间是-PI 到 PI 之间的值
  81007. var ty = Math.acos(dir.y) / Math.PI
  81008. return new THREE.Vector2( tx, ty )
  81009. //理想状态下tx相同
  81010. }
  81011. let crossRight = function(vec3, matrix) {
  81012. var e = matrix.elements
  81013. var v = new THREE.Vector3()
  81014. v.x = e[0] * vec3.x + e[1] * vec3.y + e[2] * vec3.z + e[3]
  81015. v.y = e[4] * vec3.x + e[5] * vec3.y + e[6] * vec3.z + e[7]
  81016. v.z = e[8] * vec3.x + e[9] * vec3.y + e[10] * vec3.z + e[11]
  81017. return v
  81018. }
  81019. let getNormalDir = function(dir, currentPano) {
  81020. if (currentPano.tiled) {
  81021. var matrixWorld = currentPano.rot90Matrix.clone() //因为热点求点时所右乘的matrix必须是单张全景照片时用的转90度的matrix才行
  81022. } else {
  81023. var matrixWorld = currentPano.matrixWorld.clone()
  81024. }
  81025. dir = crossRight(dir, matrixWorld) //右乘matrixWorld 得matrix转化的向量
  81026. dir.normalize()
  81027. return dir
  81028. }
  81029. let player = __sdk.core.get('Player')
  81030. let camera = player.camera
  81031. let cameraReal = player.cameraControls.activeControl.camera
  81032. let imgResolution = new THREE.Vector2(8192,4096)
  81033. let vfov = THREE.MathUtils.degToRad(cameraReal.fov)
  81034. const vFovHalf = vfov / 2
  81035. const hFovHalf = Math.atan(Math.tan(vFovHalf) * cameraReal.aspect)
  81036. let viewQua = getQuaByAim(player.getDirection() )
  81037. console.log('viewQua', viewQua, camera.quaternion)
  81038. let corners = [[-1,1],[1,1],[1,-1],[-1,-1]]
  81039. console.log(corners.map(c=>{
  81040. let dir = new THREE.Vector3(0, 0, -1);
  81041. dir.applyAxisAngle(new THREE.Vector3(1, 0, 0), vFovHalf * c[1]);
  81042. dir.applyAxisAngle(new THREE.Vector3(0, 1, 0), hFovHalf * -c[0]);//得到相机不旋转时该偏移角度的方向
  81043. dir.applyQuaternion(viewQua)
  81044. let dirInPano = getNormalDir(dir, player.currentPano )
  81045. return getUVfromDir(dirInPano).multiply(imgResolution)
  81046. }))
  81047. ========
  81048. 问题:入户门如何指定? 算法是否能给出完全遮挡的漫游点信息,甚至给出了后续还是可能要模型
  81049. 现在加载不了那些包
  81050. */
  81051. 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; } } }; }
  81052. 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); }
  81053. 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; }
  81054. 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); }; }
  81055. 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; } }
  81056. var measuringTool, measuring, isEditing3Dtag, isRePos, player$1, intersectSpot3d, tagEditing_;
  81057. var tag3dsLabelVisi = {
  81058. visible: true
  81059. };
  81060. var getStyle = function getStyle(e, styleName) {
  81061. if (!e) {
  81062. return 0;
  81063. }
  81064. var styleValue = '';
  81065. if (document.defaultView && document.defaultView.getComputedStyle) {
  81066. styleValue = document.defaultView.getComputedStyle(e, '').getPropertyValue(styleName);
  81067. } else if (e.currentStyle) {
  81068. styleName = styleName.replace(/\-(\w)/g, function (strMatch, p1) {
  81069. return p1.toUpperCase();
  81070. });
  81071. styleValue = e.currentStyle[styleName];
  81072. }
  81073. return styleValue || 0;
  81074. };
  81075. var updateTag3dVisi = function updateTag3dVisi(tag) {
  81076. var pano = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : player$1.currentPano;
  81077. var tag3d = getTag3d(tag);
  81078. if (tag3d) {
  81079. tag3d.setDepthTest(player$1.mode != 'panorama'); //common.updateVisible(tag3d, 'atVisiPano', player.mode != 'panorama' || !tag.visiblePanos || tag.visiblePanos.some(e => e.id == pano.id))
  81080. var v;
  81081. if (player$1.mode == 'panorama') {
  81082. v = !tag.visiblePanos || tag.visiblePanos.some(function (e) {
  81083. return e.id == pano.id;
  81084. });
  81085. } else {
  81086. v = player$1.model.allFloorsVisible || tag.floorIndex == void 0 || tag.floorIndex == player$1.model.currentFloor.floorIndex;
  81087. }
  81088. common$1.updateVisible(tag3d, 'atVisiPanoOrFloor', v);
  81089. }
  81090. };
  81091. var updateMeasureVisi = function updateMeasureVisi(measure) {
  81092. var pano = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : player$1.currentPano;
  81093. //2d不显示
  81094. common$1.updateVisible(measure, 'atVisiPano', player$1.mode == 'floorplan' ? false : player$1.mode != 'panorama' || !measure.visiblePanos || measure.visiblePanos.some(function (e) {
  81095. return e.id == pano.id;
  81096. }));
  81097. };
  81098. var getTag3d = function getTag3d(tag) {
  81099. var sid = typeof tag == 'string' ? tag : tag === null || tag === void 0 ? void 0 : tag.sid;
  81100. return player$1.model.tags.children.find(function (e) {
  81101. return e.sid == sid;
  81102. });
  81103. };
  81104. var descMap = new Map();
  81105. var getDesc = function getDesc(tag) {
  81106. //记录一些字段,不写到tag里
  81107. var sid = typeof tag == 'string' ? tag : tag === null || tag === void 0 ? void 0 : tag.sid;
  81108. var desc = descMap.get(sid);
  81109. if (!desc) {
  81110. desc = {};
  81111. descMap.set(sid, desc);
  81112. }
  81113. return desc;
  81114. };
  81115. var updateTag3dStyle = function updateTag3dStyle(tag) {
  81116. //新建没图标,隐藏spot,而spot不显示就一定onMesh, 自身也可以选择onMesh,很乱
  81117. //iconType 0不显示图标 1悬浮 2贴地
  81118. console.log('updateTag3dStyle', tag.icon, tag.iconType);
  81119. var tag3d = getTag3d(tag);
  81120. tag3d.spot.visible = tag.icon != void 0 && tag.iconType != 0;
  81121. tag3d.changeOnMesh(!tag3d.spot.visible || tag.iconType == 2);
  81122. };
  81123. var tag3dPanelPointerEnable = function tag3dPanelPointerEnable(state) {
  81124. var panel = document.querySelector('.trace-info');
  81125. panel && (panel.style['pointer-events'] = state ? '' : 'none');
  81126. };
  81127. var TagManager$1 = /*#__PURE__*/function (_Emiter) {
  81128. _inherits(TagManager, _Emiter);
  81129. var _super = _createSuper$4(TagManager);
  81130. function TagManager(app) {
  81131. var _this;
  81132. _classCallCheck(this, TagManager);
  81133. _this = _super.call(this);
  81134. _this.focusBeforeModify = function (sid) {
  81135. var player = _this.app.core.get('Player');
  81136. _this.tagEditing = _this.tags.find(function (t) {
  81137. return t.sid == sid;
  81138. });
  81139. _this.tempTag = {
  81140. position: new THREE.Vector3(_this.tagEditing.position.x, _this.tagEditing.position.y, _this.tagEditing.position.z)
  81141. };
  81142. var pano = _this.findBestPanoForWatching(_this.tagEditing, true);
  81143. player.flyToPano({
  81144. pano: pano,
  81145. lookAtPoint: _this.tagEditing.position,
  81146. aimDuration: 0,
  81147. duration: 1,
  81148. checkAlone: true
  81149. }, function () {
  81150. _this.edit.enter(_this.tagEditing, function () {
  81151. _this.editHandle.markTagPos = _this.tagEditing.position;
  81152. _this.editHandle.markSpotA.elem.style.display = 'block';
  81153. _this.editHandle.markSpotB.elem.style.display = 'block';
  81154. });
  81155. }); // this.app.Camera.flyToPoint(pano.position, {
  81156. // aimDur: 0, // 同点位镜头旋转时间
  81157. // dur: 1, // 点位跳转时间(不能为0)
  81158. // done: () => {
  81159. // this.edit.enter(() => {
  81160. // this.editHandle.markTagPos = this.tagEditing.position
  81161. // this.editHandle.markSpotA.elem.style.display = 'block'
  81162. // this.editHandle.markSpotB.elem.style.display = 'block'
  81163. // })
  81164. // },
  81165. // })
  81166. };
  81167. _this.focus = function (data, target, boardDirc, isHover) {
  81168. console.log('focus', data, target, boardDirc);
  81169. try {
  81170. var _player = _this.app.core.get('Player');
  81171. var tag3ds = _this.tag3ds; //player.model.tags.children.map(e => e.tag)
  81172. var tag = _this.tags.concat(tag3ds).find(function (t) {
  81173. return t.sid == data.sid;
  81174. }) || data.tag;
  81175. var tag3d = getTag3d(data.sid);
  81176. if (!tag.position) return; //导入的未有坐标
  81177. var pano = _this.findBestPanoForWatching(tag, true);
  81178. var center = new THREE.Vector3();
  81179. var tagPos = _this.getFocusPos(tag); //tag3d的会变,重校准要重新获取
  81180. tag3d && (tag3d.boardDirc_ = boardDirc);
  81181. if (isHover) return; //hover时执行的,只为了获取boardDirc,不用focus
  81182. var sendMove = function sendMove() {
  81183. if (_player.mode === Viewmode$1.PANORAMA) {
  81184. _this.app.Camera.emit(PlayerEvents.Rotate, {
  81185. panoId: _player.currentPano ? _player.currentPano.id : null,
  81186. quaternion: _player.cameraControls.activeControl.camera.quaternion,
  81187. mode: Viewmode$1.PANORAMA,
  81188. type: 'flyToPano'
  81189. });
  81190. }
  81191. };
  81192. var centerX = tag.x,
  81193. centerY = tag.y;
  81194. var unprojectCenter = function unprojectCenter() {
  81195. // 因为tag里的xy在相机飞出飞入后数值会有问题,所以这边再计算一次
  81196. tag.x = _this.convertPositionTo2D(tagPos).pos.x;
  81197. tag.y = _this.convertPositionTo2D(tagPos).pos.y;
  81198. center.set(0, 0, 0); // 根据boardDirc向左或向上偏移
  81199. centerX = tag.x - (boardDirc == 'left' ? data.arrowBox.width + data.tagBox.width / 2 : 0);
  81200. centerY = tag.y - (boardDirc == 'top' ? data.arrowBox.height + data.tagBox.height / 2 : 0); // 2d坐标映射到3d
  81201. math$2.convertScreenPositionToNDC(centerX, centerY, center, _this.app.dom);
  81202. center.unproject(_player.camera);
  81203. };
  81204. if (target == 'board') {
  81205. if (!_this.app.config.mobile) {
  81206. var $tag = document.querySelector("[tag-sid=\"".concat(tag.sid, "\"]"));
  81207. if ($tag) {
  81208. var $layer = $tag.querySelector('.move-layer');
  81209. if ($layer) {
  81210. $layer.style.transform = "translateY(0)";
  81211. setTimeout(function () {
  81212. var rect = $layer.getBoundingClientRect();
  81213. var calc = rect.top + rect.height;
  81214. if (calc > window.innerHeight) {
  81215. $layer.style.transform = "translateY(".concat(window.innerHeight - calc, "px)");
  81216. } else if (rect.height / 2 > tag.y) {
  81217. $layer.style.transform = "translateY(175px)";
  81218. }
  81219. }, 1500);
  81220. }
  81221. }
  81222. } // 面板中心
  81223. if (pano.id == _player.currentPano.id && _player.mode == 'panorama') {
  81224. if (boardDirc != 'center') {
  81225. unprojectCenter();
  81226. var cameraDirec = new THREE.Vector3(0, 0, 1).applyQuaternion(_player.camera.quaternion).normalize();
  81227. var targetDirec = _player.camera.position.clone().sub(tagPos).normalize();
  81228. var reverse = cameraDirec.dot(targetDirec);
  81229. if (reverse < 0) {
  81230. var distanceVec = _player.camera.position.clone().sub(center).multiplyScalar(-1);
  81231. center = _player.camera.position.clone().sub(distanceVec);
  81232. } // this.app.Camera.flyToPoint(center, {
  81233. // done: () => {
  81234. // if (tagX > window.innerWidth / 4 && tagX < (window.innerWidth / 4) * 3) return
  81235. // unprojectCenter()
  81236. // this.app.Camera.flyToPoint(center, {
  81237. // aimDur: 400,
  81238. // })
  81239. // },
  81240. // })
  81241. } else {
  81242. center = tagPos;
  81243. }
  81244. _player.flyToPano({
  81245. pano: pano,
  81246. lookAtPoint: center,
  81247. checkAlone: true,
  81248. isTagFlying: true
  81249. }, function () {
  81250. if (centerX > window.innerWidth / 4 && centerX < window.innerWidth / 4 * 3) {
  81251. //本就比较中间,不需要重校准
  81252. sendMove();
  81253. } else {
  81254. //重校准
  81255. tagPos = _this.getFocusPos(tag);
  81256. unprojectCenter();
  81257. _player.flyToPano({
  81258. pano: pano,
  81259. aimDuration: 600,
  81260. lookAtPoint: center
  81261. }, function () {
  81262. sendMove();
  81263. });
  81264. }
  81265. });
  81266. } else {
  81267. // this.app.Camera.flyToPoint(tag.position, {
  81268. // done: () =>
  81269. // setTimeout(() => {
  81270. // unprojectCenter()
  81271. // this.app.Camera.flyToPoint(center)
  81272. // }, 10),
  81273. // })
  81274. _player.flyToPano({
  81275. pano: pano,
  81276. lookAtPoint: tagPos,
  81277. duration: 1000,
  81278. checkAlone: true,
  81279. isTagFlying: true
  81280. }, function () {
  81281. return setTimeout(function () {
  81282. tagPos = _this.getFocusPos(tag);
  81283. unprojectCenter();
  81284. _player.flyToPano({
  81285. pano: pano,
  81286. aimDuration: 600,
  81287. lookAtPoint: center
  81288. });
  81289. }, 10);
  81290. });
  81291. }
  81292. } else {
  81293. // 热点
  81294. _player.flyToPano({
  81295. pano: pano,
  81296. lookAtPoint: _this.getFocusPos(tag),
  81297. // duration: 700,
  81298. checkAlone: true,
  81299. isTagFlying: true
  81300. });
  81301. }
  81302. } catch (e) {
  81303. console.error(e);
  81304. }
  81305. };
  81306. _this.startMeasure = function (type) {
  81307. var prop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  81308. console.log('startMeasure', type);
  81309. var player = _this.app.core.get('Player');
  81310. if (player.mode != 'panorama') {
  81311. _this.app.Camera.panorama().then(function () {
  81312. return _this.startMeasure(type, prop);
  81313. });
  81314. return;
  81315. }
  81316. measuring = true;
  81317. document.querySelector('.widgets-design-option').style.display = 'none';
  81318. _this.switchAllDisplay(false, 'addMeasure', {
  81319. measures: _this.isSingleView
  81320. });
  81321. if (_this.isSingleView) {
  81322. var types = {
  81323. horizon: 'Hor MulDistance',
  81324. vertical: 'Ver MulDistance',
  81325. 'vertical-oneLine': 'Ver Distance',
  81326. free: 'MulDistance'
  81327. };
  81328. var args = {
  81329. showDistances: true,
  81330. minMarkers: 2,
  81331. measureType: types[type],
  81332. sid: common$1.getRandomSid(),
  81333. visiblePanos: []
  81334. };
  81335. var measure = _this.measureAdding = measuringTool.startInsertion(args);
  81336. _this.magnifier.setDisplay(true); //prop.continueDraw || this.openMagnifier(true) //每次进入测量界面都默认打开
  81337. prop.magifier != void 0 && _this.openMagnifier(prop.magifier);
  81338. CursorDeal.add('crosshair');
  81339. measure.addEventListener('dragChange', function (e) {
  81340. var measure = e.target;
  81341. common$1.intervalTool.isWaiting('getMeasureVisi_' + measure.sid, function () {
  81342. /* let boundSize = measure.boundInfo.boundSize
  81343. let maxDis = Math.max(6, boundSize.length()) */
  81344. var maxDis = Infinity; //因为添加时必须显示,所以还是不设置距离了
  81345. var visiblePanos = [];
  81346. measure.points.forEach(function (point) {
  81347. visiblePanos = common$1.getUnionSet(visiblePanos, _this.getVisiblePano(point, maxDis));
  81348. });
  81349. visiblePanos.length == 0 && visiblePanos.push(player.currentPano);
  81350. measure.visiblePanos = visiblePanos;
  81351. updateMeasureVisi(measure);
  81352. }, 510);
  81353. });
  81354. var pointAddCb = function pointAddCb() {
  81355. if (_this.measureAdding.markers.length == 3) _this.emit('showMeasureDoneBtn'); //添加两个点后显示确定按钮
  81356. };
  81357. measure.addEventListener('createDone', function (e) {
  81358. //完成或取消
  81359. CursorDeal.remove('crosshair'); //this.emit('measureCreateDone')
  81360. measure.removeEventListener('marker_added', pointAddCb);
  81361. setTimeout(function () {
  81362. /* e.type_ != 'cancel_insertions' */
  81363. measuring && (!_this.measureAdding || _this.measureAdding == measure) && _this.startMeasure(type, {
  81364. continueDraw: 1
  81365. }); //继续新测量
  81366. }, 1);
  81367. if (measure.points.length == 2 && measure.maxMarkers == 2) _this.emit('showMeasureDoneBtn');
  81368. });
  81369. measure.addEventListener('marker_added', pointAddCb);
  81370. player.model.measurements.children.forEach(function (e) {
  81371. return e.setEditEnable(true);
  81372. });
  81373. } else {
  81374. _this.edit.enter();
  81375. }
  81376. player.chosenMeasureRuler && player.chosenMeasureRuler.showOptionLabel(false);
  81377. };
  81378. _this.confirmMeasure = function (step) {
  81379. console.log('confirmMeasure', step);
  81380. var player = _this.app.core.get('Player');
  81381. if (_this.isSingleView) {
  81382. //新版 同potree的测量
  81383. _this.measureAdding.dispatchEvent({
  81384. type: 'finish'
  81385. });
  81386. _this.measureAdding = null;
  81387. }
  81388. var pano1;
  81389. if (step == 1) {
  81390. var position;
  81391. if (_this.isSingleView) {
  81392. //旧版
  81393. position = _this.spot3d.position.clone();
  81394. _this.draggingSpot3d = true;
  81395. _this.spot3d.visible = false; // 移动端 没有mousemove的话就隐藏spot3d
  81396. _this.shouldCheckSpot3d = false;
  81397. } else {
  81398. position = _this.editHandle.confirmPos().position;
  81399. _this.editHandle.enter(); //清除点击状态,取消看向第一个tag
  81400. player.locked = false; //可以移动
  81401. // this.editHandle.splitView.enter()
  81402. }
  81403. _this.lastPosition = position;
  81404. _this.measureStep = 1;
  81405. var groundPoint = position.clone().setY(player.model.currentFloor.boundingBox.min.y); //垂线和地面交点
  81406. /* let intersect = convertTool.ifIntersectChunks(position, groundPoint, player.model, {InfinityLen:true})
  81407. if(intersect){//修正
  81408. groundPoint.copy(intersect[0].point)//不一定在地面上
  81409. } */
  81410. //修正
  81411. var sorts = common$1.sortByScore(player.model.panos.list, [Panorama.filters.isPanoAligned()], [Panorama.scoreFunctions.distanceSquared(_this.currentPano, -0.6)]);
  81412. if (sorts[0]) {
  81413. groundPoint.setY(sorts[0].item.floorPosition.y);
  81414. }
  81415. var stemLine = LineDraw.createLine([position, groundPoint], {
  81416. width: 2,
  81417. color: Colors.mainColor,
  81418. depthTest: false,
  81419. transparent: true
  81420. });
  81421. player.model.add(stemLine);
  81422. var shadow = new THREE.Mesh(new THREE.CircleGeometry(0.08, 32), new THREE.MeshBasicMaterial({
  81423. color: 0xffffff,
  81424. transparent: true,
  81425. opacity: 0.6,
  81426. depthTest: false
  81427. }));
  81428. shadow.position.copy(groundPoint);
  81429. shadow.position.y += 0.002; // 防止和地面重叠
  81430. shadow.lookAt(groundPoint.clone().add(new THREE.Vector3(0, 1, 0)));
  81431. player.model.add(shadow);
  81432. pano1 = player.currentPano;
  81433. var measureTag = document.createElement('div');
  81434. measureTag.className = 'visible';
  81435. measureTag.id = 'measureTag';
  81436. measureTag.innerHTML = "<span class=\"point zoom\" style=\"background-image: url(".concat(texture.getImageURL('images/tag_icon_default.png'), ");\"></span>");
  81437. var pos2d = _this.convertPositionTo2D(position).pos;
  81438. measureTag.style.left = pos2d.x + 'px';
  81439. measureTag.style.top = pos2d.y + 'px';
  81440. measureTag.style.setProperty('display', 'block', 'important');
  81441. document.querySelector('div[xui_tags]').appendChild(measureTag);
  81442. _this.measurePointTemp = {
  81443. measureTag,
  81444. stemLine,
  81445. shadow
  81446. };
  81447. } else if (step == 2) {
  81448. //完成测距 得到尺子 退出编辑
  81449. var _position;
  81450. if (_this.isSingleView) {
  81451. _position = _this.spot3d.position.clone();
  81452. } else {
  81453. _position = _this.editHandle.confirmPos().position;
  81454. } //visiblePanos为两个端点的visiblePanos的并集
  81455. var length = _position.distanceTo(_this.lastPosition);
  81456. var maxDis = Math.max(5, length * 6); //可见距离
  81457. var tolerance = 0.3;
  81458. var visiblePanos1 = _this.getVisiblePano(_this.lastPosition, maxDis, tolerance);
  81459. var visiblePanos2 = _this.getVisiblePano(_position, maxDis, tolerance);
  81460. var visiblePanos = common$1.getUnionSet(visiblePanos1, visiblePanos2);
  81461. if (visiblePanos.length == 0) {
  81462. //add on 2023.11.7
  81463. tolerance = 1;
  81464. visiblePanos1 = _this.getVisiblePano(_this.lastPosition, maxDis, tolerance);
  81465. visiblePanos2 = _this.getVisiblePano(_position, maxDis, tolerance);
  81466. visiblePanos = common$1.getUnionSet(visiblePanos1, visiblePanos2);
  81467. }
  81468. var ruler = new MeasureRuler({
  81469. points: [_this.lastPosition, _position],
  81470. visiblePanos
  81471. }, player);
  81472. player.chosenMeasureRuler = ruler; //将当前点加入visiblePanos
  81473. if (!ruler.visiblePanos.includes(player.currentPano)) {
  81474. ruler.visiblePanos.push(player.currentPano);
  81475. }
  81476. if (!ruler.visiblePanos.includes(pano1)) {
  81477. ruler.visiblePanos.push(pano1);
  81478. }
  81479. /* player.model.measureRulers.children.forEach(r => {
  81480. common.updateVisible(r, 'measuring', true)
  81481. }) */
  81482. }
  81483. };
  81484. _this.cancelMeasure = function () {
  81485. //结束测量。完成后也会调用这个
  81486. var player = _this.app.core.get('Player');
  81487. console.log('cancelMeasure');
  81488. measuring = false;
  81489. if (_this.isSingleView) {
  81490. //新版 同potree的测量
  81491. measuringTool.dispatchEvent('cancel_insertions');
  81492. _this.measureAdding = null;
  81493. _this.magnifier.setDisplay(false);
  81494. player.model.measurements.children.forEach(function (e) {
  81495. return e.setEditEnable(false);
  81496. });
  81497. } else {
  81498. if (_this.measurePointTemp) {
  81499. var _this$measurePointTem = _this.measurePointTemp,
  81500. measureTag = _this$measurePointTem.measureTag,
  81501. stemLine = _this$measurePointTem.stemLine,
  81502. shadow = _this$measurePointTem.shadow;
  81503. document.querySelector('div[xui_tags]').removeChild(measureTag);
  81504. stemLine.geometry.dispose();
  81505. stemLine.material.dispose();
  81506. player.model.remove(stemLine);
  81507. shadow.geometry.dispose();
  81508. shadow.material.dispose();
  81509. player.model.remove(shadow);
  81510. _this.measurePointTemp = null;
  81511. }
  81512. /* player.measureRulers.forEach(r => {
  81513. r.updateVisible()
  81514. if (r.state == 'active') {
  81515. r.updateBoldLine()
  81516. }
  81517. }) */
  81518. _this.edit.exit();
  81519. }
  81520. _this.switchAllDisplay(true, 'addMeasure', {
  81521. measures: _this.isSingleView
  81522. });
  81523. };
  81524. _this.app = app;
  81525. _this.root = '[xui_tags_view]';
  81526. _this.view = Deferred$1();
  81527. _this.editor = Deferred$1();
  81528. _this.plugin = Deferred$1();
  81529. _this.loaded = false;
  81530. _this.tagEditing = null;
  81531. _this.tags = []; //可见二维热点
  81532. _this.tag3ds = []; //所有三维点
  81533. _this.labels = [];
  81534. _this.showTags = true;
  81535. _this.showTagsVisible = false;
  81536. _this.openedTag3d_ = null;
  81537. _this.app.Scene.on('loaded', function () {
  81538. player$1 = app.core.get('Player');
  81539. measuringTool = _this.measuringTool = new MeasuringTool(player$1);
  81540. _this.bindEvents();
  81541. try {
  81542. _this.app.store.on('traces', function (tags) {
  81543. //console.log('gettag3d', tags)
  81544. _this.tag3ds = tags === null || tags === void 0 ? void 0 : tags.traces.filter(function (e) {
  81545. return e.position;
  81546. }); //临时的,不是监听的实例
  81547. _this.tag3ds.forEach(function (e) {
  81548. _this.buildTag3dFromData(e, 'fake');
  81549. });
  81550. browser$1.urlHasValue('routeSnap') && TestRouteSnap.init(_assertThisInitialized(_this), _this.app); //RouteSnap.init(this, this.app)
  81551. _this.tag3dInited = true;
  81552. _this.emit('tag3dInited');
  81553. }); //tag3d在漫游时容易被墙挡住,所以这时改为不遮挡且根据visiblePanos设置可见性。飞出后就按正常的显示。
  81554. player$1.on(PlayerEvents.FlyingEnded, function () {
  81555. _this.tag3ds.forEach(function (e) {
  81556. return updateTag3dVisi(e);
  81557. });
  81558. player$1.model.measurements.children.forEach(function (m) {
  81559. return updateMeasureVisi(m);
  81560. });
  81561. });
  81562. player$1.model.on('floor.changed', function () {
  81563. console.log('floor.changed');
  81564. _this.tag3ds.forEach(function (e) {
  81565. return updateTag3dVisi(e);
  81566. });
  81567. });
  81568. } catch (e) {
  81569. console.error(e);
  81570. }
  81571. });
  81572. _this.app.store.on('tags', function (tags) {
  81573. _this.tags = _this.tagsInitial = tags.tags || []; // 由于热点新增了floorIndex属性,需要兼容旧数据
  81574. var rayDir = new THREE.Vector3(0, -1, 0);
  81575. var ray = new THREE.Raycaster(new THREE.Vector3(0, 0, 0), rayDir, 0.001, 9999);
  81576. _this.tags.forEach(function (tag) {
  81577. if (tag.floorIndex == void 0) {
  81578. // 旧数据没有floorIndex
  81579. // 从热点位置向下投一条射线,检测到的第一个模型即为所在楼层
  81580. ray.set(tag.position, rayDir);
  81581. var rayInfo = ray.intersectObjects(player$1.model.chunks);
  81582. if (!rayInfo.length) {
  81583. // 如果射线检测不到模型,则根据floor的boundingBox判断
  81584. var tagFloor = player$1.model.floors.list.find(function (floor) {
  81585. return tag.position.y >= floor.boundingBox.min.y && tag.position.y <= floor.boundingBox.max.y;
  81586. });
  81587. tag.floorIndex = tagFloor && tagFloor.floorIndex;
  81588. } else {
  81589. tag.floorIndex = rayInfo[0].object.parent.floorIndex;
  81590. }
  81591. }
  81592. });
  81593. _this.view.then(function (view) {
  81594. return view.render();
  81595. });
  81596. _this.loaded = true;
  81597. _this.emit('loaded', _this.tags);
  81598. });
  81599. var this_ = _assertThisInitialized(_this);
  81600. _this.edit = {};
  81601. _this.edit.enter = function (tagEditing, callback, is3DTag) {
  81602. console.log('enter', tagEditing, is3DTag);
  81603. _this.tagPosChosing = true;
  81604. isEditing3Dtag = is3DTag;
  81605. _this.tagEditing = tagEditing; //add
  81606. isRePos = !!(tagEditing !== null && tagEditing !== void 0 && tagEditing.position);
  81607. _this.useSingleView = _this.isSingleView;
  81608. {
  81609. var tag3ds = _this.tag3ds.slice();
  81610. if (tagEditing && !tag3ds.some(function (e) {
  81611. return e.sid == tagEditing.sid;
  81612. })) {
  81613. //导入的新建时可能不在tag3ds里
  81614. tag3ds.push(tagEditing);
  81615. }
  81616. _this.copyTag3dProp = tag3ds.map(function (e) {
  81617. return common$1.CloneObject(e, false, [Tag, Panorama]);
  81618. }); //因为可以应用到全部,所以每个都要备份副本来回退
  81619. }
  81620. if (!is3DTag) {
  81621. app.TagManager.switchLabels({
  81622. type: 'traces',
  81623. visible: false
  81624. }, null, 'editOther');
  81625. }
  81626. if (isRePos && is3DTag) {
  81627. getTag3d(tagEditing).dragEnable = true;
  81628. _this.useSingleView = true; //分屏的在编辑位置时直接拖拽,不分屏
  81629. }
  81630. if (is3DTag) {
  81631. var _this$tag3ds;
  81632. (_this$tag3ds = _this.tag3ds) === null || _this$tag3ds === void 0 ? void 0 : _this$tag3ds.forEach(function (tag) {
  81633. if (tag != tagEditing) {
  81634. var tag3d = getTag3d(tag);
  81635. tag3d && (tag3d.pointerUnable = true); //前端点击其他的痕迹图标会错乱,故不让点击
  81636. }
  81637. });
  81638. }
  81639. if (_this.useSingleView) {
  81640. _this.hideAll();
  81641. var _player2 = app.core.get('Player');
  81642. if (!(is3DTag && isRePos)) {
  81643. _player2.locked = true;
  81644. _player2.reticule.visible = false;
  81645. _this.spot3d.visible = true;
  81646. measuring && _this.magnifier.setDisplay(true);
  81647. _this.shouldCheckSpot3d = true;
  81648. }
  81649. if (isRePos) {
  81650. // 修改
  81651. _this.draggingSpot3d = false;
  81652. if (!is3DTag) {
  81653. _this.spot3d.position.set(tagEditing.position.x, tagEditing.position.y, tagEditing.position.z);
  81654. setTimeout(function () {
  81655. var tagScreenPos = new THREE.Vector3(0, 0, 0);
  81656. var tagNDCPos = new THREE.Vector3(0, 0, 0.5);
  81657. math$2.projectPositionToCanvas(tagEditing.position, _player2.camera, tagScreenPos, _player2.domElement);
  81658. math$2.convertScreenPositionToNDC(tagScreenPos.x, tagScreenPos.y, tagNDCPos, _player2.domElement);
  81659. var intersect = _player2.getMouseIntersect(tagNDCPos, _player2.OverlayManager.list.concat(_player2.model.colliders));
  81660. intersect && (_this.spot3d.lookAt(intersect.normal.add(_this.spot3d.position)), _this.spot3d.topMesh.lookAt(_player2.camera.position));
  81661. }, 10);
  81662. }
  81663. } else {
  81664. // 新增
  81665. _this.shouldCheckSpot3d = true;
  81666. _this.draggingSpot3d = true;
  81667. _this.spot3d.position.set(0, 1000, 0);
  81668. }
  81669. } else {
  81670. app.core.get('Scene').getSplit('TAG').then(function (view) {
  81671. if (_this.editHandle == void 0) {
  81672. _this.editHandle = app.withNewComponent('TagEditManager', view, {
  81673. spotA: app.dom.querySelector('.player[name="main"] .player-mark'),
  81674. spotB: app.dom.querySelector('.player[name="copy"] .player-mark')
  81675. });
  81676. }
  81677. if (tagEditing !== null && tagEditing !== void 0 && tagEditing.position) {
  81678. // 修改
  81679. _this.editHandle.reSetPos(tagEditing.position);
  81680. } else {
  81681. // 新增
  81682. _this.editHandle.enter();
  81683. }
  81684. _this.switchLabels({
  81685. type: 'traces',
  81686. visible: false
  81687. }, null, 'splitView');
  81688. callback && callback();
  81689. });
  81690. }
  81691. };
  81692. _this.edit.exit = function (save) {
  81693. //退出定位
  81694. var player = _this.app.core.get('Player');
  81695. player.cameraControls.activeControl.enabled = true; //在没有触发mousedown方法时触发了exit方法可能会导致视角锁死,所以在这里补上
  81696. if (_this.tempTag && !save) {
  81697. _this.tagEditing.position = _this.tempTag.position;
  81698. }
  81699. if (!save) {
  81700. app.TagManager.switchLabels({
  81701. type: 'traces',
  81702. visible: true
  81703. }, null, 'editOther');
  81704. }
  81705. if (_this.isSingleView) {
  81706. _this.showAll();
  81707. CursorDeal.remove('moving');
  81708. player.locked = false;
  81709. player.reticule.visible = true;
  81710. _this.spot3d.visible = false;
  81711. _this.draggingSpot3d = false;
  81712. _this.shouldCheckSpot3d = false;
  81713. measuring && _this.magnifier.setDisplay(false);
  81714. } else {
  81715. if (!_this.editHandle) {
  81716. return;
  81717. }
  81718. app.core.get('Scene').restore('TAG');
  81719. _this.editHandle.exit({
  81720. cancel: true
  81721. });
  81722. _this.switchLabels({
  81723. type: 'traces',
  81724. visible: true
  81725. }, null, 'splitView');
  81726. }
  81727. /* if (isEditing3Dtag && this.copyTag3dProp && !save) {
  81728. //在定位时取消的tag3d一定是导入的,要还原, 因为之后不会执行exitTag3DEdit
  81729. this.recoverTag3dsData()
  81730. } */
  81731. if (!isEditing3Dtag || !getTag3d(_this.tagEditing)) {
  81732. //如果只是tag3d初步定位结束,不null, 此时已create tag3d
  81733. _this.tagEditing = null;
  81734. }
  81735. _this.tempTag = null;
  81736. _this.tagPosChosing = false;
  81737. setTimeout(function () {
  81738. player.cameraControls.activeControl.camera.fov = 70;
  81739. player.camera.fov = player.baseFov * (1 / player.zoomLevel);
  81740. }, 50);
  81741. };
  81742. var findTagFloorRay = new THREE.Raycaster(new THREE.Vector3(), new THREE.Vector3(), 0.001, 9999);
  81743. var addFloor = function addFloor(tag) {
  81744. // 在确认坐标后,计算热点所在楼层
  81745. var camera = player$1.cameraControls.activeControl.camera; // 从相机向热点发出一条射线
  81746. var rayDirec = new THREE.Vector3().subVectors(tag.position, camera.position).normalize();
  81747. findTagFloorRay.set(camera.position, rayDirec);
  81748. var rayInfo = findTagFloorRay.intersectObjects(player$1.model.chunks);
  81749. if (rayInfo.length) {
  81750. tag.floorIndex = rayInfo[0].object.parent.floorIndex;
  81751. } else {
  81752. // 如果没有检测到chunk,大概率是在skybox上,这时直接取currentPano所在楼层就行
  81753. tag.floorIndex = player$1.currentPano.floorIndex;
  81754. }
  81755. };
  81756. _this.edit.confirm = function (onlyExitWithPosition) {
  81757. var player = _this.app.core.get('Player');
  81758. var tag = _this.tagEditing;
  81759. if (_this.useSingleView) _this.showAll();
  81760. var labelPos;
  81761. if (isEditing3Dtag) {
  81762. if (!_this.useSingleView) {
  81763. var o = _this.editHandle.confirmPos();
  81764. if (o) {
  81765. if (tag) {
  81766. tag.position = o.position;
  81767. } else {
  81768. tag = _this.tagEditing = o; //二维的标签tag没办法这样赋值tagEditing,会有bug就不改了
  81769. }
  81770. }
  81771. }
  81772. var tag3d = getTag3d(tag);
  81773. if (!tag3d) {
  81774. var _tag3d$normal, _tag3d$position;
  81775. //新增
  81776. tag3d = new Tag({
  81777. sid: tag.sid,
  81778. normal: _this.isSingleView && _this.spot3d.normal_.clone(),
  81779. position: _this.isSingleView ? _this.spot3d.position.clone() : tag.position.clone(),
  81780. noLine: !_this.isSingleView //分屏的tag3d没有线
  81781. }, player);
  81782. tag.normal = (_tag3d$normal = tag3d.normal) === null || _tag3d$normal === void 0 ? void 0 : _tag3d$normal.clone();
  81783. tag.position = (_tag3d$position = tag3d.position) === null || _tag3d$position === void 0 ? void 0 : _tag3d$position.clone();
  81784. _this.isSingleView && (tag.floorIndex = _this.spot3d.floorIndex);
  81785. _this.initTag3d(tag3d, tag);
  81786. if (!_this.isSingleView) {
  81787. setTimeout(function () {
  81788. _this.emit('tag3dLineLen', 0); //修改为0
  81789. }, 1);
  81790. }
  81791. if (tag.icon != void 0) {
  81792. //导入的
  81793. tag3d.changeMap(tag.icon);
  81794. }
  81795. updateTag3dStyle(tag);
  81796. } else {
  81797. //修改
  81798. if (_this.useSingleView) {
  81799. tag.position = tag3d.position.clone();
  81800. tag.normal = tag3d.normal.clone();
  81801. }
  81802. }
  81803. tag3d.dragEnable = true;
  81804. if (_this.useSingleView) ; else {
  81805. addFloor(tag);
  81806. }
  81807. labelPos = tag3d.getLabel2dPos();
  81808. } else {
  81809. if (_this.useSingleView) {
  81810. if (!tag) return; // if (!this.spot3d.visible) {
  81811. // this.edit.exit()
  81812. // return null
  81813. // }
  81814. _this.spot3d.visible = true; //当鼠标将spot3d移动到不可见位置时触发confirm方法将spot3d恢复可见(position貌似是最后的有效position所以暂时不做修改)
  81815. _this.shouldCheckSpot3d = true;
  81816. tag.position = labelPos = _this.spot3d.topMesh.getWorldPosition(new THREE.Vector3()); // this.spot3d.position.clone()
  81817. tag.floorIndex = _this.spot3d.floorIndex;
  81818. } else {
  81819. if (!_this.editHandle) {
  81820. return;
  81821. }
  81822. var _this$editHandle$conf = _this.editHandle.confirmPos(),
  81823. position = _this$editHandle$conf.position,
  81824. sid = _this$editHandle$conf.sid,
  81825. panoId = _this$editHandle$conf.panoId;
  81826. if (!position) {
  81827. onlyExitWithPosition || _this.edit.exit(); // 未选定位置时不用退出
  81828. return null;
  81829. }
  81830. if (tag == null) {
  81831. tag = {
  81832. position,
  81833. sid,
  81834. panoId,
  81835. icon: app.resource.base('images/tag_icon_default.png')
  81836. };
  81837. } else {
  81838. tag.position = position;
  81839. }
  81840. labelPos = position;
  81841. addFloor(tag);
  81842. }
  81843. } //if (!tag.visiblePanos) {
  81844. tag.visiblePanos = _this.getVisiblePano(labelPos);
  81845. if (tag.visiblePanos.length == 0) {
  81846. var _panoId = player.currentPano.id;
  81847. tag.visiblePanos.push(player.model.panos.index[_panoId]);
  81848. } //}
  81849. _this.edit.exit(true);
  81850. return tag;
  81851. };
  81852. _this.edit.editTag = function () {
  81853. //编辑2d的tag的信息
  81854. _this.tagInfoEditing = true;
  81855. console.log('editTag');
  81856. app.TagManager.switchLabels({
  81857. type: 'traces',
  81858. visible: false
  81859. }, null, 'editOther');
  81860. };
  81861. _this.edit.cancelTagEdit = function () {
  81862. //2d的tag结束编辑
  81863. console.log('cancelTagEdit');
  81864. _this.tagInfoEditing = false;
  81865. app.TagManager.switchLabels({
  81866. type: 'traces',
  81867. visible: true
  81868. }, null, 'editOther');
  81869. };
  81870. _this.edit.changeTag3DProp = function (options, sid) {
  81871. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  81872. dontGetVisiPanos = _ref.dontGetVisiPanos;
  81873. //除了当前编辑的,其他也可能通过“应用到全部”而改变
  81874. //console.log('changeTag3DProp', options)
  81875. var tag3d = sid ? getTag3d(sid) : getTag3d(_this.tagEditing); //this.tag3dEditing
  81876. if (!tag3d) return;
  81877. var tag = this_.tag3ds.find(function (e) {
  81878. return e.sid == tag3d.sid;
  81879. }) || _this.tagEditing; //找到前端监听的那个实例
  81880. var texSrc = options.texSrc,
  81881. lineLen = options.lineLen,
  81882. scale = options.scale,
  81883. angle = options.angle,
  81884. fontSize = options.fontSize,
  81885. iconType = options.iconType,
  81886. title = options.title,
  81887. position = options.position,
  81888. normal = options.normal;
  81889. lineLen != void 0 && tag3d.changeLineLen(lineLen);
  81890. scale != void 0 && tag3d.changeSpotScale(scale);
  81891. angle != void 0 && tag3d.setFaceAngle(angle);
  81892. fontSize != void 0 && tag3d.setFontSize(fontSize);
  81893. title != void 0 && tag3d.setTitle(title);
  81894. if (iconType != void 0 || texSrc != void 0) {
  81895. texSrc != void 0 && tag3d.changeMap(texSrc);
  81896. setTimeout(function () {
  81897. updateTag3dStyle(tag);
  81898. }, 1); //延迟是因为tag本身的那些属性还没变
  81899. }
  81900. if (position) {
  81901. normal = normal || tag.normal;
  81902. tag3d.changePos({
  81903. position,
  81904. normal
  81905. });
  81906. }
  81907. if (!dontGetVisiPanos) {
  81908. getDesc(tag).needGetVisiPanos = true;
  81909. }
  81910. setTimeout(function () {
  81911. getDesc(tag).needUpdate2d = true; //tag
  81912. }, 1);
  81913. };
  81914. _this.edit.saveTag3D = function () {
  81915. try {
  81916. var _tag3d$normal2;
  81917. _this.edit.confirm();
  81918. if (_this.openedTag3d) {
  81919. _this.openedTag3d.visible = false;
  81920. _this.openedTag3d = null;
  81921. }
  81922. var tag3d = getTag3d(_this.tagEditing);
  81923. var data = {
  81924. pos: tag3d.position.clone(),
  81925. normal: (_tag3d$normal2 = tag3d.normal) === null || _tag3d$normal2 === void 0 ? void 0 : _tag3d$normal2.clone(),
  81926. visiblePanos: _this.tagEditing.visiblePanos
  81927. };
  81928. return data; //这些是我直接改却保存不了的值(很奇怪),只好在这返回下
  81929. } catch (e) {
  81930. console.error(e);
  81931. }
  81932. };
  81933. _this.edit.cancelAddTag3D = function () {
  81934. //取消添加痕迹
  81935. _this.edit.exitTag3DEdit('cancelAdd');
  81936. };
  81937. _this.edit.exitTag3DEdit = function (type) {
  81938. //三种状态: 保存后,添加取消,修改取消
  81939. if (!_this.tagEditing) return;
  81940. var tag3d = getTag3d(_this.tagEditing);
  81941. tag3d.dragEnable = false;
  81942. if (type != 'save') {
  81943. tag3d.dispose();
  81944. if (!isRePos) {
  81945. type = 'cancelAdd';
  81946. } //导入的,编辑就是新建
  81947. _this.recoverTag3dsData();
  81948. if (type != 'cancelAdd') {
  81949. //重建
  81950. _this.buildTag3dFromData(_this.tagEditing); //重建
  81951. }
  81952. _this.useSingleView || _this.edit.exit(); //退出双屏
  81953. }
  81954. console.log('exitTag3DEdit', _this.tagEditing);
  81955. _this.tagEditing && updateTag3dVisi(_this.tagEditing);
  81956. _this.tagEditing = null;
  81957. _this.tag3ds.forEach(function (tag) {
  81958. var tag3d = getTag3d(tag);
  81959. tag3d && (tag3d.pointerUnable = false);
  81960. });
  81961. _this.showAll();
  81962. };
  81963. _this.recoverTag3dsData = function () {
  81964. /* Object.assign(this.tagEditing, this.copyTag3dProp)
  81965. if (!this.copyTag3dProp.position) delete this.tagEditing.position //导入的 */
  81966. console.error('recoverTag3dsData', _this.copyTag3dProp.map(function (e) {
  81967. return e.sid;
  81968. }), _this.tag3ds.map(function (e) {
  81969. return e.sid;
  81970. }));
  81971. _this.copyTag3dProp.forEach(function (data) {
  81972. var tag = _this.tag3ds.concat([_this.tagEditing]).find(function (e) {
  81973. return e.sid == data.sid;
  81974. });
  81975. if (!tag) {
  81976. return;
  81977. }
  81978. Object.assign(tag, data);
  81979. if (!data.position) delete tag.position; //导入的 */
  81980. else if (tag != _this.tagEditing) {
  81981. //其他痕迹中可以‘应用到全部’的属性
  81982. _this.edit.changeTag3DProp(data.visiSetting, data.sid, {
  81983. dontGetVisiPanos: true
  81984. });
  81985. }
  81986. });
  81987. };
  81988. _this.edit.deleteTag3d = function (sid) {
  81989. var _getTag3d;
  81990. (_getTag3d = getTag3d(sid)) === null || _getTag3d === void 0 ? void 0 : _getTag3d.dispose();
  81991. _this.tag3ds = _this.tag3ds.filter(function (e) {
  81992. return e.sid != sid;
  81993. });
  81994. }; // -------------------------------------------------
  81995. // 设置热点可视相关方法
  81996. // -------------------------------------------------
  81997. _this.edit.beginTagVisiSetting = function () {
  81998. _this.showTagsVisible = true;
  81999. var player = _this.app.core.get('Player');
  82000. if (player && player.linkEditor) {
  82001. player.linkEditor.enterSet('tagVisible');
  82002. player.linkEditor.beginSetTagVisible();
  82003. }
  82004. player.model.floorplanCadImg.hideCadPlane();
  82005. player.emit('beginTagVisiSetting');
  82006. };
  82007. _this.edit.setTagVisi = function (sid) {
  82008. var tag = _this.tags.find(function (t) {
  82009. return t.sid == sid;
  82010. });
  82011. _this.app.core.get('Player').linkEditor.SetOneTagVisible(tag);
  82012. };
  82013. _this.edit.resetTagVisi = function () {
  82014. var linkEditor = _this.app.core.get('Player').linkEditor;
  82015. var tag = linkEditor.tagVsetting;
  82016. linkEditor.tagVsetting = null;
  82017. linkEditor.SetOneTagVisible(tag);
  82018. };
  82019. _this.edit.checkNeedSaveTagVisi = function () {
  82020. var linkEditor = _this.app.core.get('Player').linkEditor;
  82021. return linkEditor.checkTagVisiChange();
  82022. };
  82023. _this.edit.saveTagVisi = function () {
  82024. var player = _this.app.core.get('Player');
  82025. var data = player.linkEditor.saveTagVisibles();
  82026. var storeTags = _this.app.store.getValue('tags');
  82027. data.forEach(function (tagData) {
  82028. var tag = _this.tags.find(function (tag) {
  82029. return tag.sid == tagData.sid;
  82030. });
  82031. tag.visiblePanos = tagData.value.map(function (id) {
  82032. return player.model.panos.index[id];
  82033. });
  82034. });
  82035. storeTags.tags = _this.tags;
  82036. _this.app.store.set('tags', storeTags);
  82037. return {
  82038. data,
  82039. func: player.linkEditor.afterSaveTagVisibles.bind(player.linkEditor)
  82040. };
  82041. };
  82042. _this.edit.cancelTagVisiSetting = function () {
  82043. var player = _this.app.core.get('Player');
  82044. _this.showTagsVisible = false;
  82045. _this.app.core.get('Player').linkEditor.finishSetTagVisible();
  82046. _this.app.core.get('Player').model.floorplanCadImg.showCadPlane();
  82047. player.emit('exitTagVisiSetting');
  82048. };
  82049. _this.edit.hideAllTagVisi = function () {
  82050. var linkEditor = _this.app.core.get('Player').linkEditor;
  82051. var currentTag = linkEditor.tagVsetting;
  82052. linkEditor.setTagHideAll(currentTag);
  82053. };
  82054. _this.edit.showAllTagVisi = function () {
  82055. var linkEditor = _this.app.core.get('Player').linkEditor;
  82056. var currentTag = linkEditor.tagVsetting;
  82057. linkEditor.setTagShowAll(currentTag);
  82058. }; // -------------------------------------------------
  82059. var setVisi = function setVisi(item, v) {
  82060. common$1.updateVisible(item, 'update2d', v, 0);
  82061. };
  82062. _this.setTagLabel2dPos = function (item, emit) {
  82063. //弹窗位置
  82064. //isLose表示失效,重算的时候需要
  82065. //showTags表示是否全部可见
  82066. if (!getTag3d(item)) {
  82067. var showIn = _this.app.config.tag.showIn;
  82068. if (item.isLose || _this.showTags === false) {
  82069. return setVisi(item, false);
  82070. } //没有进入热点可视设置(大部分情况)
  82071. if (_this.showTagsVisible == false) {
  82072. if (showIn) {
  82073. if (showIn === 'all') {
  82074. if (_this.tagEditing || player$1.paintEditor && player$1.paintEditor.painting || player$1.mode == Viewmode$1.PANORAMA && !item.visiblePanos.includes(player$1.currentPano)) {
  82075. return setVisi(item, false);
  82076. }
  82077. } else if (showIn.indexOf(player$1.mode) == -1) {
  82078. return setVisi(item, false);
  82079. }
  82080. }
  82081. if (settings$3.vrEnabled && settings$3.vrSplitScreen) {
  82082. return setVisi(item, false);
  82083. } // 默认情况
  82084. if (!showIn || showIn != 'all' && showIn.indexOf(Viewmode$1.PANORAMA) != -1 && player$1.mode == Viewmode$1.PANORAMA) {
  82085. if (_this.tagEditing || player$1.mode != Viewmode$1.PANORAMA || item.visiblePanos && !item.visiblePanos.includes(player$1.currentPano) || player$1.paintEditor && player$1.paintEditor.painting) {
  82086. return setVisi(item, false);
  82087. }
  82088. }
  82089. } //热点可视设置
  82090. if (player$1.linkEditor.setTagVisible) {
  82091. // 只所在楼层可视热点
  82092. if (item.floorIndex != player$1.model.currentFloor.floorIndex) {
  82093. if (player$1.linkEditor.tagVsetting != item) {
  82094. //tagVsetting的要一直显示
  82095. return setVisi(item, false);
  82096. }
  82097. }
  82098. /* if (!item.visiblePanos.some(p => p.floorIndex == player.model.currentFloor.floorIndex)) {
  82099. return (item.visible = false)
  82100. } */
  82101. }
  82102. }
  82103. var labelPos = _this.getFocusPos(item, 1);
  82104. var pos = app.TagManager.convertPositionTo2D(labelPos);
  82105. if (!pos.trueSide || !pos.inSight) {
  82106. //trueSide是否在背面
  82107. //inSight是否在当前屏幕可视区域
  82108. //console.log(item.sid, false)
  82109. return setVisi(item, false);
  82110. }
  82111. /* if (item.visible && this.app.config.mobile) {
  82112. //若原本是非visible,必须重算一下位置,即使lastFrameChanged为false,所以直接更新
  82113. item.__x = pos.pos.x
  82114. item.__y = pos.pos.y
  82115. waitForUpdate2d.push(item)
  82116. } else { */
  82117. item.x = pos.pos.x;
  82118. item.y = pos.pos.y;
  82119. setVisi(item, true);
  82120. emit && _this.emit('update'); //}
  82121. };
  82122. _this.app.Scene.on('loaded', function () {
  82123. var rulersDiv = document.createElement('div');
  82124. rulersDiv.className = 'widgets-rulers';
  82125. player$1.domElement.append(rulersDiv); // 用于测量
  82126. var delRulerBtn = document.querySelector('.widgets-design-option div');
  82127. delRulerBtn && delRulerBtn.addEventListener('pointerup', function (e) {
  82128. //删除测量线
  82129. e.stopPropagation();
  82130. player$1.chosenMeasureRuler.dispose();
  82131. player$1.chosenMeasureRuler.showOptionLabel(false);
  82132. }); // 判断,激光场景在单屏内添加热点
  82133. var isSingleView_ = function isSingleView_(metadata) {
  82134. _this.isSingleView = metadata.sceneFrom == 'laser' || metadata.threeCamType == 'yzl';
  82135. };
  82136. var metadata = _this.app.store.getValue('metadata');
  82137. if (metadata) isSingleView_(metadata);else _this.app.store.on('metadata', function (data) {
  82138. return isSingleView_(data);
  82139. });
  82140. if (_this.isSingleView) {
  82141. // spot3d,用于单屏
  82142. _this.spot3d = new TagSpot(player$1);
  82143. if (_this.app.config.view) {
  82144. _this.magnifier = new Magnifier(player$1, app.core.get('SceneRenderer'));
  82145. var oldS;
  82146. _this.magnifier.beforeRender = function () {
  82147. var s = 0.5;
  82148. _this.spot3d.scale.set(s, s, s);
  82149. oldS = _this.spot3d.topMesh.scale.x;
  82150. _this.spot3d.topMesh.scale.set(0.6, 0.6, 0.6);
  82151. };
  82152. _this.magnifier.afterRender = function () {
  82153. _this.spot3d.scale.set(1, 1, 1);
  82154. _this.spot3d.topMesh.scale.set(oldS, oldS, oldS);
  82155. };
  82156. }
  82157. } // 热点在哪些模式下显示
  82158. var lastTags = '';
  82159. app.core.get('Player').on('update', function (e) {
  82160. var _tags;
  82161. //app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, (e) => {
  82162. if (!_this.app.config.view) {
  82163. var _this$tag3ds2;
  82164. (_this$tag3ds2 = _this.tag3ds) === null || _this$tag3ds2 === void 0 ? void 0 : _this$tag3ds2.forEach(function (tag) {
  82165. var desc = getDesc(tag);
  82166. if (desc.needGetVisiPanos) {
  82167. setTimeout(function () {
  82168. var tag3d = getTag3d(tag);
  82169. if (!tag3d) return;
  82170. tag.visiblePanos = _this.getVisiblePano(tag3d.getLabel2dPos());
  82171. if (tag.visiblePanos.length == 0) {
  82172. tag.visiblePanos.push(player$1.currentPano);
  82173. }
  82174. desc.needGetVisiPanos = false;
  82175. updateTag3dVisi(tag);
  82176. }, 2);
  82177. }
  82178. });
  82179. } // 更新测量tag
  82180. if (_this.measurePointTemp) {
  82181. var pos = _this.convertPositionTo2D(_this.lastPosition);
  82182. var measureTag = _this.measurePointTemp.measureTag;
  82183. measureTag.style.left = pos.pos.x + 'px';
  82184. measureTag.style.top = pos.pos.y + 'px';
  82185. measureTag.className = !pos.trueSide || !pos.inSight ? '' : 'visible';
  82186. }
  82187. if (_this.labels.length) {
  82188. // 显示标签
  82189. _this.labels.forEach(function (item) {
  82190. if (player$1.mode != Viewmode$1.PANORAMA || item.visiblePanos && !item.visiblePanos.includes(player$1.currentPano)) {
  82191. return item.visible = false;
  82192. } // 只所在楼层可视热点
  82193. if (item.floorIndex != player$1.model.currentFloor.floorIndex) {
  82194. return item.visible = false;
  82195. }
  82196. var pos = app.TagManager.convertPositionTo2D(item.position);
  82197. if (!pos.trueSide || !pos.inSight) {
  82198. //trueSide是否在背面
  82199. //inSight是否在当前屏幕可视区域
  82200. return item.visible = false;
  82201. }
  82202. item.x = pos.pos.x;
  82203. item.y = pos.pos.y;
  82204. item.visible = true;
  82205. });
  82206. }
  82207. var tags = (_this.tags || []).slice();
  82208. if (_this.openedTag3d) tags.push(_this.openedTag3d);
  82209. var tagStr = tags.map(function (e) {
  82210. return e.sid;
  82211. }).join('|');
  82212. if (!((_tags = tags) !== null && _tags !== void 0 && _tags.length) || !e.hasChanged.cameraChanged && lastTags == tagStr) {
  82213. tags = tags.filter(function (e) {
  82214. return getDesc(e).needUpdate2d;
  82215. });
  82216. tags.forEach(function (item) {
  82217. _this.setTagLabel2dPos(item);
  82218. });
  82219. return;
  82220. }
  82221. lastTags = tagStr;
  82222. tags.forEach(function (item) {
  82223. getDesc(e).needUpdate2d = false, _this.setTagLabel2dPos(item);
  82224. });
  82225. e.lastFrameChanged = player$1.lastFrameChanged;
  82226. _this.emit('update', e);
  82227. });
  82228. if (_this.isSingleView) {
  82229. /**
  82230. * 单屏下spot3d的一些事件
  82231. */
  82232. player$1.on('pointerStart', function (e) {
  82233. if (!_this.tagEditing) return;
  82234. if (isEditing3Dtag && getTag3d(_this.tagEditing)) return; // 移动端 pointerStart时先计算一次intersectSpot3d
  82235. intersectSpot3d = player$1.getMouseIntersect(null, [_this.spot3d.topMesh, _this.spot3d.bottomMesh]);
  82236. if (intersectSpot3d) {
  82237. _this.draggingSpot3d = true;
  82238. player$1.cameraControls.activeControl.enabled = false;
  82239. }
  82240. });
  82241. player$1.on('pointerMove', function (e) {
  82242. //console.log('pointerMove', this.tagEditing, this.draggingSpot3d)
  82243. //if (!this.tagEditing && !this.draggingSpot3d ) return
  82244. if (!_this.shouldCheckSpot3d && !measuring) return; //不intersectSpot3d
  82245. var intersect = player$1.getIntersectAtChunk(null, e.buttons == 1 && 'drag'); //this.getIntersectAtChunk(e.buttons == 1 && 'drag')
  82246. if (measuring) {
  82247. //this.magnifier.setDisplay(!!intersect)
  82248. _this.magnifier.update(intersect === null || intersect === void 0 ? void 0 : intersect.point, player$1.mouse);
  82249. } // 检测鼠标是否在spot3d上
  82250. intersectSpot3d = player$1.getMouseIntersect(null, [_this.spot3d.topMesh, _this.spot3d.bottomMesh]);
  82251. if (intersectSpot3d) {
  82252. CursorDeal.add('moving');
  82253. } else if (_this.tagEditing && !_this.draggingSpot3d) {
  82254. CursorDeal.remove('moving');
  82255. }
  82256. if (_this.draggingSpot3d) {
  82257. // 拖动spot3d
  82258. _this.updateSpot3d(intersect);
  82259. }
  82260. });
  82261. player$1.on('pointerUp', function (e) {
  82262. if (_this.spot3d && _this.draggingSpot3d) {
  82263. var _this$tagEditing;
  82264. // 移动端 pointerUp时最后再计算一次spot3d坐标
  82265. if (!_this.updateSpot3d(null, 'drag')) return;
  82266. player$1.cameraControls.activeControl.enabled = true;
  82267. player$1.cameraControls.activeControl.pointerDragOn = false;
  82268. _this.draggingSpot3d = false;
  82269. if ((_this$tagEditing = _this.tagEditing) !== null && _this$tagEditing !== void 0 && _this$tagEditing.position) {
  82270. // 修改位置
  82271. _this.tagEditing.position = _this.spot3d.position;
  82272. } else {
  82273. // 新增
  82274. if (!_this.tagEditing) {
  82275. _this.tagEditing = {
  82276. position: _this.spot3d.position,
  82277. sid: common$1.getRandomSid(),
  82278. icon: isEditing3Dtag ? null : _this.app.resource.base('images/tag_icon_default.png')
  82279. };
  82280. }
  82281. }
  82282. _this.emit('tagManager.markTagPos', e);
  82283. }
  82284. });
  82285. }
  82286. });
  82287. return _this;
  82288. }
  82289. _createClass(TagManager, [{
  82290. key: "updateSpot3d",
  82291. value: function updateSpot3d(intersect, when) {
  82292. //intersect = intersect || this.getIntersectAtChunk(when) //player.getMouseIntersect(null, player.OverlayManager.group.children.concat(player.model.colliders))
  82293. intersect = player$1.getIntersectAtChunk(intersect, when, true);
  82294. if (intersect) {
  82295. this.spot3d.visible = true;
  82296. this.spot3d.position.copy(intersect.point);
  82297. this.spot3d.lookAt(new THREE.Vector3().addVectors(intersect.point, intersect.normal));
  82298. this.spot3d.topMesh.lookAt(player$1.camera.position);
  82299. this.spot3d.normal_ = intersect.normal;
  82300. this.spot3d.floorIndex = intersect.object.parent.floor.floorIndex;
  82301. }
  82302. return intersect;
  82303. }
  82304. }, {
  82305. key: "tag",
  82306. value: function tag() {
  82307. if (this.ready) {
  82308. return Promise.resolve(this);
  82309. }
  82310. return this.plugin.promise();
  82311. }
  82312. }, {
  82313. key: "load",
  82314. value: function load(tags) {
  82315. var _this2 = this;
  82316. if (!this.app.Scene.loaded) {
  82317. return setTimeout(function () {
  82318. _this2.load(tags);
  82319. }, 100);
  82320. }
  82321. if (!tags) {
  82322. return;
  82323. }
  82324. tags.forEach(function (tag) {
  82325. if (tag.position && tag.position instanceof THREE.Vector3 == false) {
  82326. tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z);
  82327. if (tag.visiblePanos && tag.visiblePanos.length) {
  82328. tag.visiblePanos = tag.visiblePanos.map(function (id) {
  82329. return _this2.app.core.get('Player').model.panos.index[id];
  82330. });
  82331. } else {
  82332. tag.visiblePanos = _this2.getVisiblePano(tag.position);
  82333. }
  82334. }
  82335. });
  82336. this.tags = tags;
  82337. }
  82338. }, {
  82339. key: "install",
  82340. value: function install(name, plugin) {
  82341. this.ready = true;
  82342. this.plugin.resolve(this);
  82343. if (this[name]) {
  82344. this[name].resolve(plugin);
  82345. if (this.loaded && typeof plugin.render === 'function') {
  82346. plugin.render();
  82347. }
  82348. }
  82349. }
  82350. /**
  82351. * 3d坐标转2d屏幕坐标
  82352. * @param {Object} position3d {x,y,z}
  82353. * @returns {Object} {x,y}
  82354. */
  82355. }, {
  82356. key: "convertPositionTo2D",
  82357. value: function convertPositionTo2D(position3d) {
  82358. return convertTool.getPos2d(position3d, this.app.core.get('Player'));
  82359. }
  82360. }, {
  82361. key: "ifShelter",
  82362. value: function ifShelter(position3d, pos2d) {
  82363. var player = this.app.core.get('Player');
  82364. var floorIndex = player.model.allFloorsVisible ? null : player.model.currentFloor.floorIndex;
  82365. return convertTool.ifShelter(position3d, player, pos2d, null, floorIndex);
  82366. }
  82367. }, {
  82368. key: "getVisiblePano",
  82369. value: function getVisiblePano(position) {
  82370. var maxDis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;
  82371. var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15;
  82372. var visiblePanos = convertTool.getVisiblePano(position, this.app.core.get('Player').model, {
  82373. maxDis,
  82374. tolerance
  82375. }); //maxDis如果能自适应场景更好,有的大马路pano间距较远
  82376. return visiblePanos;
  82377. }
  82378. }, {
  82379. key: "draggingSpot3d",
  82380. get: function get() {
  82381. return this.d__;
  82382. },
  82383. set: function set(state) {
  82384. this.d__ = state;
  82385. }
  82386. }, {
  82387. key: "add",
  82388. value: function add(tags) {
  82389. var _this3 = this;
  82390. if (!tags || !tags.length) {
  82391. return Promise.resolve();
  82392. }
  82393. tags.forEach(function (tag) {
  82394. if (tag.position && tag.position instanceof THREE.Vector3 == false) {
  82395. tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z);
  82396. if (tag.visiblePanos && tag.visiblePanos.length) {
  82397. tag.visiblePanos = tag.visiblePanos.map(function (id) {
  82398. return _this3.app.core.get('Player').model.panos.index[id];
  82399. });
  82400. } else {
  82401. tag.visiblePanos = _this3.getVisiblePano(tag.position);
  82402. } //tag.visiblePanos ? (tag.visiblePanos = tag.visiblePanos.map(id => this.app.core.get('Player').model.panos.index[id])) : (tag.visiblePanos = this.getVisiblePano(tag.position))
  82403. }
  82404. _this3.tags.push(tag);
  82405. }); //this.tags = [].concat(this.tags, tags)
  82406. return this.view.then(function (view) {
  82407. return view.refresh();
  82408. });
  82409. }
  82410. }, {
  82411. key: "remove",
  82412. value: function remove(sid) {
  82413. var index = this.tags.findIndex(function (t) {
  82414. return t.sid == sid;
  82415. });
  82416. if (index != -1) {
  82417. this.tags.splice(index, 1);
  82418. return this.view.then(function (view) {
  82419. return view.remove(sid);
  82420. });
  82421. }
  82422. return Promise.resolve();
  82423. }
  82424. }, {
  82425. key: "removeAll",
  82426. value: function removeAll() {
  82427. this.tags = [];
  82428. return this.view.then(function (view) {
  82429. return view.removeAll();
  82430. });
  82431. }
  82432. }, {
  82433. key: "removeTag3D",
  82434. value: function removeTag3D(sid) {
  82435. var player = this.app.core.get('Player');
  82436. var tag = getTag3d(sid);
  82437. tag && player.model.tags.remove(tag);
  82438. }
  82439. }, {
  82440. key: "update",
  82441. value: function update(tags) {
  82442. if (!tags || !tags.length) {
  82443. return;
  82444. }
  82445. this.tags = tags;
  82446. }
  82447. }, {
  82448. key: "openedTag3d",
  82449. get: function get() {
  82450. return this.openedTag3d_;
  82451. },
  82452. set: function set(tag) {
  82453. if (this.openedTag3d_) {
  82454. var tag3d_ = getTag3d(this.openedTag3d_);
  82455. tag3d_ && common$1.updateVisible(tag3d_, 'opened', false, 1, 'cancel');
  82456. }
  82457. this.openedTag3d_ = tag;
  82458. if (tag) {
  82459. //面板展开就强制显示
  82460. var tag3d = getTag3d(tag);
  82461. common$1.updateVisible(tag3d, 'opened', true, 1, 'add');
  82462. }
  82463. }
  82464. }, {
  82465. key: "setTag3dOpen",
  82466. value: function setTag3dOpen(openedTag3d) {
  82467. var _this4 = this;
  82468. console.warn('setTag3dOpen', openedTag3d === null || openedTag3d === void 0 ? void 0 : openedTag3d.sid);
  82469. setTimeout(function () {
  82470. _this4.openedTag3d = openedTag3d; //tag3d只有展开的要更新xy
  82471. }, 1); //等focus先执行
  82472. }
  82473. }, {
  82474. key: "updatePosition",
  82475. value: function updatePosition(tags, tag3ds) {
  82476. var _this5 = this;
  82477. //openedTag3d待删除!!!!!!!
  82478. //设置当前要更新2d位置的列表
  82479. //console.warn('updatePosition', tags, tag3ds)
  82480. tags && (this.tags = tags === null || tags === void 0 ? void 0 : tags.slice()); //this.openedTag3d = openedTag3d
  82481. if (tag3ds) {
  82482. //proxy版tag3ds
  82483. //只有新建和编辑时才能拿到orz,所以要自己加载数据时创建一个临时的
  82484. this.tag3ds = tag3ds;
  82485. tag3ds.forEach(function (e) {
  82486. _this5.buildTag3dFromData(e);
  82487. });
  82488. }
  82489. }
  82490. }, {
  82491. key: "buildTag3dFromData",
  82492. value: function buildTag3dFromData(tag, type) {
  82493. var _this6 = this;
  82494. if (!tag.position) return; //导入的
  82495. var tag3d = getTag3d(tag);
  82496. if (!tag3d) {
  82497. tag3d = new Tag({
  82498. title: tag.title,
  82499. sid: tag.sid,
  82500. position: tag.position,
  82501. normal: tag.normal,
  82502. lineLength: tag.visiSetting.lineLen,
  82503. fontsize: tag.visiSetting.fontSize,
  82504. noLine: !this.isSingleView //分屏的tag3d没有线
  82505. }, player$1);
  82506. tag3d.titleLabel.visible = tag3dsLabelVisi.visible;
  82507. tag3d.titleLabel.visibleReasons = tag3dsLabelVisi.visibleReasons;
  82508. tag3d.titleLabel.unvisibleReasons = tag3dsLabelVisi.unvisibleReasons;
  82509. setTimeout(function () {
  82510. _this6.edit.changeTag3DProp({
  82511. iconType: tag.iconType,
  82512. angle: tag.visiSetting.angle,
  82513. scale: tag.visiSetting.scale,
  82514. texSrc: tag.icon
  82515. }, tag.sid, {
  82516. dontGetVisiPanos: true
  82517. });
  82518. }, 1);
  82519. this.initTag3d(tag3d, tag);
  82520. }
  82521. /* tag3d.tag = tag
  82522. tag.tag3d = tag3d */
  82523. }
  82524. /**
  82525. * 点击修改后瞬间跳到最佳点位
  82526. * @param {*} sid
  82527. */
  82528. }, {
  82529. key: "initTag3d",
  82530. value: function initTag3d(tag3d, item) {
  82531. var _this7 = this;
  82532. tag3d.addEventListener('clicked', function () {
  82533. //注意:连续触发两次将不能focus
  82534. _this7.emit('tag3dClicked', item); //这可以是数据里的不必是proxy
  82535. }); //item不是真正在用的,莫名会变. 得从tag3ds里找,或者openedTag3d
  82536. var update2d = function update2d() {
  82537. var desc = getDesc(_this7.openedTag3d);
  82538. desc.needUpdate2d = true;
  82539. desc.needGetVisiPanos = true;
  82540. };
  82541. tag3d.addEventListener('dragLineLen', function () {
  82542. _this7.emit('tag3dLineLen', math$2.toPrecision(tag3d.lineLength, 2)); //to slider
  82543. update2d();
  82544. });
  82545. tag3d.addEventListener('posChanged', update2d);
  82546. tag3d.addEventListener('floorUpdate', function (e) {
  82547. var tag = _this7.tag3ds.find(function (e) {
  82548. return e.sid == item.sid;
  82549. });
  82550. console.log('floorUpdate', tag.floorIndex, e.target.floorIndex);
  82551. tag.floorIndex = e.target.floorIndex;
  82552. });
  82553. tag3d.addEventListener('hover', function () {
  82554. _this7.emit('hoverTag3d', item);
  82555. });
  82556. tag3d.addEventListener('unhover', function () {
  82557. _this7.emit('unhoverTag3d', item);
  82558. });
  82559. updateTag3dVisi(item);
  82560. }
  82561. }, {
  82562. key: "focusTag",
  82563. value: function focusTag(sid) {
  82564. var _this8 = this;
  82565. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
  82566. direction: '',
  82567. checkSameTag: false,
  82568. attrs: null
  82569. };
  82570. return new Promise(function (resolve) {
  82571. if (typeof options !== 'object') {
  82572. options = {};
  82573. }
  82574. var tag = _this8.tags.find(function (t) {
  82575. return t.sid == sid;
  82576. });
  82577. if (!tag) {
  82578. return resolve();
  82579. } // let $tag = document.querySelector(this.root).querySelector(`[data-tag-id="${sid}"]`)
  82580. // if (!$tag) {
  82581. // return resolve()
  82582. // }
  82583. _this8.emit('focus', sid, _this8.focusId);
  82584. if (sid == _this8.focusId && options.checkSameTag) {
  82585. _this8.focusId = '';
  82586. return resolve();
  82587. }
  82588. _this8.focusId = sid;
  82589. var player = _this8.player || _this8.app.core.get('Player'); // 根据热点可视和距离限制查询最近pano
  82590. var minDistance = 1.5;
  82591. var visiPanos = player.model.panos.closestPanoTowardPoint({
  82592. point: tag.position,
  82593. getAll: true
  82594. }).map(function (p) {
  82595. return p.item;
  82596. }).filter(function (p) {
  82597. return tag.visiblePanos.indexOf(p) > -1 && p.position.clone().setY(tag.position.y).sub(tag.position).length() > minDistance;
  82598. });
  82599. var pano = visiPanos[0]; // 优先查找当前floor
  82600. var currentFloorVisiPanos = visiPanos.filter(function (p) {
  82601. return p.floorIndex == player.model.currentFloor.floorIndex;
  82602. });
  82603. if (currentFloorVisiPanos.length > 0) {
  82604. pano = currentFloorVisiPanos[0];
  82605. }
  82606. if (!pano) {
  82607. console.warn('该热点无可视点位');
  82608. pano = player.currentPano;
  82609. } // 标识开始对准
  82610. _this8.__is_aimat = true;
  82611. if (options.direction) {
  82612. var attrs;
  82613. if (options.attrs) {
  82614. attrs = options.attrs;
  82615. } else {
  82616. var $tag = document.querySelector(_this8.root).querySelector("[data-tag-id=\"".concat(sid, "\"]"));
  82617. var $body = $tag.querySelector('.tag-body');
  82618. if (!$body) {
  82619. return resolve();
  82620. }
  82621. attrs = {
  82622. width: ($body.clientWidth || 0) + parseInt(getStyle($body, 'margin-left')) + parseInt(getStyle($body, 'margin-right')),
  82623. height: ($body.clientHeight || 0) + parseInt(getStyle($body, 'margin-top')) + parseInt(getStyle($body, 'margin-bottom'))
  82624. };
  82625. }
  82626. var center = new THREE.Vector3();
  82627. var unprojectCenter = function unprojectCenter() {
  82628. // 因为tag里的xy在相机飞出飞入后数值会有问题,所以这边再计算一次
  82629. tag.x = _this8.app.TagManager.convertPositionTo2D(tag.position).pos.x;
  82630. tag.y = _this8.app.TagManager.convertPositionTo2D(tag.position).pos.y;
  82631. center.set(0, 0, 0); // 根据boardDirc向左或向上偏移
  82632. var centerX = tag.x - (options.direction == 'left' ? attrs.width / 2 : 0);
  82633. var centerY = tag.y - (options.direction == 'top' ? attrs.height / 2 : 0); // 2d坐标映射到3d
  82634. _this8.app.TagManager.convertScreenPositionToNDC(centerX, centerY, center, _this8.app.dom);
  82635. center.unproject(player.camera);
  82636. }; // 面板中心
  82637. if (pano.id == player.currentPano.id && player.mode == 'panorama') {
  82638. unprojectCenter();
  82639. var cameraDirec = new THREE.Vector3(0, 0, 1).applyQuaternion(player.camera.quaternion).normalize();
  82640. var targetDirec = player.camera.position.clone().sub(tag.position).normalize();
  82641. var reverse = cameraDirec.dot(targetDirec);
  82642. if (reverse < 0) {
  82643. var distanceVec = player.camera.position.clone().sub(center).multiplyScalar(-1);
  82644. center = player.camera.position.clone().sub(distanceVec);
  82645. }
  82646. tag.x;
  82647. player.flyToPano({
  82648. pano: pano,
  82649. lookAtPoint: center,
  82650. duration: 1000,
  82651. isTagFlying: true
  82652. }, function () {
  82653. // if (tagX > window.innerWidth / 4 && tagX < (window.innerWidth / 4) * 3) {
  82654. // resolve()
  82655. // this.__is_aimat = false
  82656. // } else {
  82657. // unprojectCenter()
  82658. // this.app.Camera.flyToPoint(center, {
  82659. // aimDur: 400,
  82660. // })
  82661. // resolve()
  82662. // this.__is_aimat = false
  82663. // }
  82664. setTimeout(function () {
  82665. unprojectCenter();
  82666. player.flyToPano({
  82667. pano: pano,
  82668. aimDuration: 500,
  82669. lookAtPoint: center
  82670. });
  82671. resolve();
  82672. _this8.__is_aimat = false;
  82673. }, 10);
  82674. });
  82675. } else {
  82676. player.flyToPano({
  82677. pano: pano,
  82678. lookAtPoint: tag.position,
  82679. duration: 1000,
  82680. isTagFlying: true
  82681. }, function () {
  82682. return setTimeout(function () {
  82683. unprojectCenter();
  82684. player.flyToPano({
  82685. pano: pano,
  82686. aimDuration: 400,
  82687. lookAtPoint: center
  82688. });
  82689. resolve();
  82690. _this8.__is_aimat = false;
  82691. }, 10);
  82692. });
  82693. }
  82694. } else {
  82695. player.flyToPano({
  82696. pano: pano,
  82697. lookAtPoint: tag.position,
  82698. isTagFlying: true // duration: 700,
  82699. }, function () {
  82700. resolve();
  82701. _this8.__is_aimat = false;
  82702. });
  82703. }
  82704. });
  82705. }
  82706. }, {
  82707. key: "unfocusTag",
  82708. value: function unfocusTag() {
  82709. this.focusId = '';
  82710. }
  82711. }, {
  82712. key: "closeTag",
  82713. value: function closeTag(sid) {
  82714. this.unfocusTag();
  82715. this.emit('close');
  82716. }
  82717. }, {
  82718. key: "openTag",
  82719. value: function openTag(sid) {
  82720. this.emit('open', sid);
  82721. }
  82722. /**
  82723. * 使相机转至热点或面板中心
  82724. * @param {*} data 包含有tag或sid,以及board相关数据
  82725. * @param {"board" | "tag"} target 聚焦于热点还是面板中心
  82726. * @param {"top" | "left"} boardDirc 面板位于热点上面还是左面
  82727. */
  82728. }, {
  82729. key: "getFocusPos",
  82730. value: function getFocusPos(tag, useDir) {
  82731. var tag3d = getTag3d(tag);
  82732. return (tag3d === null || tag3d === void 0 ? void 0 : tag3d.getLabel2dPos(useDir && (tag3d.boardDirc_ || 'left'))) || tag.position;
  82733. }
  82734. }, {
  82735. key: "open",
  82736. value: function open(sid, retry) {
  82737. var _this9 = this;
  82738. var tag = this.tags.find(function (t) {
  82739. return t.sid == sid;
  82740. });
  82741. if (!tag.visible) {
  82742. if (retry) {
  82743. return;
  82744. }
  82745. return setTimeout(function () {
  82746. _this9.open(sid, true);
  82747. }, 500);
  82748. }
  82749. var $tag = document.querySelector("[tag-sid=\"".concat(sid, "\"]"));
  82750. if ($tag) {
  82751. var $point = $tag.querySelector(".point");
  82752. var evt = document.createEvent('HTMLEvents');
  82753. if (this.app.config.mobile) {
  82754. evt.initEvent('click', true, true);
  82755. } else {
  82756. evt.initEvent('mouseenter', true, true);
  82757. }
  82758. evt.fixed = true;
  82759. $point.dispatchEvent(evt);
  82760. } // this.emit('openTag', sid)
  82761. }
  82762. }, {
  82763. key: "close",
  82764. value: function close(sid) {
  82765. var tag = this.tags.find(function (t) {
  82766. return t.sid == sid;
  82767. });
  82768. if (!tag.visible) {
  82769. return;
  82770. }
  82771. var $tag = document.querySelector("[tag-sid=\"".concat(sid, "\"]"));
  82772. if ($tag) {
  82773. var evt = document.createEvent('HTMLEvents');
  82774. if (this.app.config.mobile) {
  82775. $tag = $tag.querySelector('.arrow i');
  82776. evt.initEvent('click', true, true);
  82777. } else {
  82778. evt.initEvent('mouseleave', true, true);
  82779. }
  82780. evt.relatedTarget = true;
  82781. evt.unfixed = true;
  82782. if ($tag) {
  82783. $tag.dispatchEvent(evt);
  82784. }
  82785. }
  82786. }
  82787. /**
  82788. * 查看热点的最佳点位
  82789. * @param {*} tag
  82790. * @returns
  82791. */
  82792. }, {
  82793. key: "findBestPanoForWatching",
  82794. value: function findBestPanoForWatching(tag, a) {
  82795. var player = this.app.core.get('Player'); // 根据热点可视查询最近pano
  82796. var visiPanos = player.model.panos.closestPanoTowardPoint({
  82797. point: this.getFocusPos(tag),
  82798. getAll: true,
  82799. require: [function (p) {
  82800. return tag.visiblePanos.indexOf(p) > -1;
  82801. }]
  82802. }).map(function (p) {
  82803. return p.item;
  82804. }); // 查找非孤立点位
  82805. var notAloneVisiPanos = visiPanos.filter(function (p) {
  82806. return p.neighbourUUIDs.filter(function (id) {
  82807. return id != p.id;
  82808. }).length > 0;
  82809. });
  82810. if (notAloneVisiPanos.length > 0) {
  82811. visiPanos = notAloneVisiPanos;
  82812. } // // 查找符合距离限制的(要能完全展示UI)
  82813. // let minDistance = 1.5
  82814. // let minDistanceVisiPanos = visiPanos.filter(p => p.position.clone().setY(tag.position.y).sub(tag.position).length() > minDistance)
  82815. // if (minDistanceVisiPanos.length > 0) {
  82816. // visiPanos = minDistanceVisiPanos
  82817. // }
  82818. // 查找当前floor
  82819. var currentFloorVisiPanos = visiPanos.filter(function (p) {
  82820. return p.floorIndex == player.model.currentFloor.floorIndex;
  82821. });
  82822. if (currentFloorVisiPanos.length > 0) {
  82823. visiPanos = currentFloorVisiPanos;
  82824. }
  82825. var pano = visiPanos[0];
  82826. if (a && player.mode === Viewmode$1.PANORAMA) {
  82827. visiPanos = visiPanos.filter(function (pano) {
  82828. var p1 = new THREE.Vector3(tag.position.x - pano.position.x, tag.position.y - pano.position.y, tag.position.z - pano.position.z);
  82829. 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);
  82830. var angle = p1.angleTo(p2);
  82831. return angle < Math.PI / 4;
  82832. });
  82833. }
  82834. if (visiPanos.length > 0) {
  82835. pano = visiPanos[0];
  82836. }
  82837. if (!pano) {
  82838. console.warn('该热点无可视点位');
  82839. pano = player.currentPano;
  82840. }
  82841. return pano;
  82842. }
  82843. /**
  82844. * 显示所有热点
  82845. * @param {boolean} force 是否强制显示(包括在平面图、三维模型)
  82846. */
  82847. }, {
  82848. key: "showAll",
  82849. value: function showAll() {
  82850. var _this$tags;
  82851. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  82852. this.showTags = true;
  82853. if (force) {
  82854. this.showTagsVisible = true;
  82855. }
  82856. (_this$tags = this.tags) === null || _this$tags === void 0 ? void 0 : _this$tags.forEach(function (e) {
  82857. getDesc(e).needUpdate2d = true;
  82858. });
  82859. }
  82860. /**'
  82861. * 隐藏所有热点
  82862. * @param {boolean} force 是否强制隐藏(包括在平面图、三维模型)
  82863. */
  82864. }, {
  82865. key: "hideAll",
  82866. value: function hideAll() {
  82867. var _this$tags2;
  82868. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  82869. this.showTags = false;
  82870. if (force) {
  82871. this.showTagsVisible = false;
  82872. }
  82873. (_this$tags2 = this.tags) === null || _this$tags2 === void 0 ? void 0 : _this$tags2.forEach(function (e) {
  82874. getDesc(e).needUpdate2d = true;
  82875. });
  82876. }
  82877. /**
  82878. * type 类型|| tags (热点);traces(痕迹物证);links(场景关联);cameras(监控)sceneDraws(空间绘制);aiList(ai列表),billboards(指示牌)
  82879. * sid 可选 || 当type是痕迹物证的时候,如果传了dictId ,则需要控制该dictId所在的分类。
  82880. */
  82881. }, {
  82882. key: "switchAllDisplay",
  82883. value: function switchAllDisplay(visible) {
  82884. var reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'clearAll';
  82885. var ignore = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  82886. //多次调用要追加reason避免混乱
  82887. //清屏
  82888. console.log('switchAllDisplay', visible, reason, ignore);
  82889. ignore.traces || this.switchLabels({
  82890. type: 'traces',
  82891. visible
  82892. }, null, reason);
  82893. ignore.links || this.switchLabels({
  82894. type: 'links',
  82895. visible
  82896. }, null, reason);
  82897. ignore.cameras || this.switchLabels({
  82898. type: 'cameras',
  82899. visible
  82900. }, null, reason);
  82901. ignore.sceneDraws || this.switchLabels({
  82902. type: 'sceneDraws',
  82903. visible
  82904. }, null, reason);
  82905. ignore.aiList || this.switchLabels({
  82906. type: 'aiList',
  82907. visible
  82908. }, null, reason);
  82909. ignore.overlays || this.switchLabels({
  82910. type: 'overlays',
  82911. visible
  82912. }, null, reason);
  82913. ignore.billboards || this.switchLabels({
  82914. type: 'billboards',
  82915. visible
  82916. }, null, reason);
  82917. ignore.models || this.switchLabels({
  82918. type: 'models',
  82919. visible
  82920. }, null, reason); //this.hideAll //热点
  82921. ignore.tag2ds || this.switchLabels({
  82922. type: 'tag2ds',
  82923. visible
  82924. }, null, reason);
  82925. ignore.measures || this.switchLabels({
  82926. type: 'measures',
  82927. visible
  82928. }, null, reason);
  82929. ignore.paths || this.switchLabels({
  82930. type: 'paths',
  82931. visible
  82932. }, null, reason);
  82933. ignore.miniView || player$1.setMiniViewVisi(visible, reason, 5);
  82934. }
  82935. }, {
  82936. key: "switchLabels",
  82937. value: function switchLabels(_ref2, dictId) {
  82938. var type = _ref2.type,
  82939. visible = _ref2.visible;
  82940. var reason = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'switchDisplayType';
  82941. //展示页筛选可见的类型
  82942. //console.log('switchLabels', type, visible, dictId)
  82943. var level = 5;
  82944. if (type == 'traces') {
  82945. if (!dictId) {
  82946. //能整体就整体咯, 这样后续添加的子集不会显示
  82947. common$1.updateVisible(player$1.model.tags, reason, visible, level);
  82948. } else {
  82949. this.tag3ds.forEach(function (tag) {
  82950. if (dictId != void 0 && tag.dictId != dictId) return;
  82951. common$1.updateVisible(getTag3d(tag), reason, visible, level);
  82952. });
  82953. }
  82954. if (!visible) {
  82955. var tag3d = getTag3d(this.openedTag3d);
  82956. tag3d && !tag3d.realVisible() && this.emit('closeTag3d');
  82957. }
  82958. } else if (type == 'links') {
  82959. visible ? player$1.viewLinkManager.showAllViews(reason) : player$1.viewLinkManager.hideAllViews(reason, level);
  82960. } else if (type == 'cameras') {
  82961. visible ? player$1.$app.Camera.monitor.control.showAll(null, reason, level) : player$1.$app.Camera.monitor.control.hideAll(null, reason);
  82962. } else if (type == 'sceneDraws') {
  82963. visible ? player$1.$app.PolygonMarkManager.showAll(true, true, reason) : player$1.$app.PolygonMarkManager.hideAll(true, reason, level);
  82964. } else if (type == 'aiList') {
  82965. this.app.Scene.setAiBoxShow(visible, reason, level);
  82966. } else if (type == 'billboards') {
  82967. /* player.billboardManager.ctx.list.forEach(bill => {
  82968. common.updateVisible(bill, reason, visible, level)
  82969. }) */
  82970. common$1.updateVisible(player$1.OverlayManager.billGroup, reason, visible, level);
  82971. } else if (type == 'overlays') {
  82972. // 包括 视频、图片
  82973. common$1.updateVisible(player$1.OverlayManager.decorateGroup, reason, visible, level);
  82974. /* player.OverlayManager.group.children.forEach(e => {
  82975. if (!e.info.isBillboard) {
  82976. common.updateVisible(e, reason, visible, level)
  82977. }
  82978. })
  82979. common.updateVisible(player.OverlayManager.frameGroup, reason, visible, level) */
  82980. //common.updateVisible(player.OverlayManager.groupRoot, reason, visible, level)
  82981. } else if (type == 'models') {
  82982. common$1.updateVisible(player$1.GLTFEditor.group, reason, visible, level);
  82983. } else if (type == 'tag2ds') {
  82984. this.tags.forEach(function (e) {
  82985. common$1.updateVisible(e, reason, visible, level);
  82986. });
  82987. } else if (type == 'measures') {
  82988. common$1.updateVisible(player$1.model.measurements, reason, visible, level);
  82989. common$1.updateVisible(player$1.model.measureRulers, reason, visible, level);
  82990. } else if (type == 'paths') {
  82991. common$1.updateVisible(player$1.model.paths, reason, visible, level);
  82992. } else if (type == 'traces-label') {
  82993. //测试说到cad编辑时隐藏label
  82994. common$1.updateVisible(tag3dsLabelVisi, reason, visible); //可能没创建好所以先记录值
  82995. this.tag3ds.forEach(function (tag) {
  82996. var _getTag3d2;
  82997. common$1.updateVisible((_getTag3d2 = getTag3d(tag)) === null || _getTag3d2 === void 0 ? void 0 : _getTag3d2.titleLabel, reason, visible);
  82998. });
  82999. }
  83000. /* if (visible) {
  83001. this.lastMiniViewType == void 0 || player.setMiniViewType(this.lastMiniViewType, 'notFrom2d')
  83002. this.lastMiniViewType = null
  83003. setTimeout(() => {
  83004. //fix: 前端那边恢复时会显示,这里延时隐藏下
  83005. if (player.mode != 'panorama') {
  83006. document.querySelector('div[xui_min_map]').style.display = 'none'
  83007. }
  83008. },1)
  83009. } else if(!this.lastMiniViewType && player.miniViewType){//已经关了就不要再关
  83010. this.lastMiniViewType = player.miniViewType
  83011. player.setMiniViewType(0 )
  83012. } */
  83013. }
  83014. }, {
  83015. key: "convertScreenPositionToNDC",
  83016. value: function convertScreenPositionToNDC(centerX, centerY, center) {
  83017. return math$2.convertScreenPositionToNDC(centerX, centerY, center, this.app.dom);
  83018. }
  83019. }, {
  83020. key: "removeAllMeasure",
  83021. value: function removeAllMeasure() {
  83022. measuringTool.dispatchEvent('cancel_insertions'); //如果在测量中,取消当前,重新测量
  83023. player$1.model.measurements.children.slice().forEach(function (e) {
  83024. return e.dispose();
  83025. });
  83026. }
  83027. }, {
  83028. key: "openMagnifier",
  83029. value: function openMagnifier(state) {
  83030. common$1.updateVisible(this.magnifier, 'enable', state, 1);
  83031. }
  83032. }, {
  83033. key: "tagEditing",
  83034. get: function get() {
  83035. return tagEditing_;
  83036. },
  83037. set: function set(tag) {
  83038. tagEditing_ = tag;
  83039. }
  83040. }, {
  83041. key: "toJSON",
  83042. value: function toJSON(tags) {
  83043. var data = JSON.stringify(tags || this.tags, function (key, value) {
  83044. if (key === 'visiblePanos' && value) {
  83045. return value.map(function (v) {
  83046. return v.id;
  83047. });
  83048. }
  83049. return value;
  83050. });
  83051. return JSON.parse(data);
  83052. }
  83053. }, {
  83054. key: "bindEvents",
  83055. value: function bindEvents() {
  83056. var _this10 = this;
  83057. THREE.shim = {};
  83058. var player = this.app.core.get('Player');
  83059. var interactables = [],
  83060. intersectMesh,
  83061. dragMesh,
  83062. dragInfo,
  83063. lastHoverMesh;
  83064. var interactableListeners = ['mouseup', 'mousemove', 'mouseover', 'mouseleave', 'drag', 'drop', 'click', 'select', 'deselect'];
  83065. var checkObjects = [player.model.tags, player.model.measurements];
  83066. player.on('collectIntersectMesh', function (meshes, e) {
  83067. interactables = [];
  83068. var _iterator = _createForOfIteratorHelper$1(checkObjects),
  83069. _step;
  83070. try {
  83071. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  83072. var objects = _step.value;
  83073. objects.traverseVisible(function (node) {
  83074. //检测加了侦听的object
  83075. if (node._listeners && node.visible) {
  83076. var hasInteractableListener = interactableListeners.filter(function (e) {
  83077. return node._listeners[e] !== undefined;
  83078. }).length > 0;
  83079. if (hasInteractableListener) {
  83080. interactables.push(node);
  83081. }
  83082. }
  83083. });
  83084. }
  83085. } catch (err) {
  83086. _iterator.e(err);
  83087. } finally {
  83088. _iterator.f();
  83089. }
  83090. meshes.push.apply(meshes, _toConsumableArray(interactables));
  83091. });
  83092. player.on('judgeIntersect', function (intersect, e) {
  83093. //判断是否intersect了overlay
  83094. /* let a = player.getMouseIntersect(null, interactables, { recursive: true, type: 'getAll' })
  83095. a && console.log(a) */
  83096. if (e.getConsumed()) return intersectMesh = null; //console.log('intersect.object', intersect?.object.name, intersect?.object.type)
  83097. if (intersect && (intersectMesh = interactables.find(function (e) {
  83098. return intersect.object.isChildOf(e);
  83099. }))) {
  83100. e.consume();
  83101. } else {
  83102. intersectMesh = null; //this.updateByIntersect(intersect)
  83103. }
  83104. });
  83105. player.on('pointerStart', function (_ref3) {
  83106. var consume = _ref3.consume,
  83107. getConsumed = _ref3.getConsumed;
  83108. if (getConsumed() || !intersectMesh || dragMesh) return; //(dragMesh = null) //因potree在pointerStart时没改变dragMesh这也不改,否则forceDrag的会null,希望没问题
  83109. intersectMesh.dispatchEvent({
  83110. type: 'startDragging'
  83111. }); //intersectMesh?.object && console.log('pointerStart', intersectMesh?.object.name)
  83112. dragMesh = intersectMesh;
  83113. player.cameraControls.activeControl.enabled = false;
  83114. consume();
  83115. tag3dPanelPointerEnable(false);
  83116. });
  83117. player.on('pointerMove', function (_ref4) {
  83118. var _dragInfo, _dragInfo2;
  83119. var consume = _ref4.consume,
  83120. getConsumed = _ref4.getConsumed,
  83121. buttons = _ref4.buttons;
  83122. //console.log('pointerMove', intersectMesh?.name)
  83123. if (getConsumed()) return;
  83124. if (dragMesh && (buttons == 0 || !((_dragInfo = dragInfo) !== null && _dragInfo !== void 0 && _dragInfo.notPressMouse))) {
  83125. dragMesh.dispatchEvent({
  83126. type: 'drag',
  83127. drag: dragInfo
  83128. });
  83129. }
  83130. if (!dragMesh || (_dragInfo2 = dragInfo) !== null && _dragInfo2 !== void 0 && _dragInfo2.notPressMouse) {
  83131. try {
  83132. var _intersectMesh;
  83133. (_intersectMesh = intersectMesh) === null || _intersectMesh === void 0 ? void 0 : _intersectMesh.dispatchEvent({
  83134. type: 'mousemove'
  83135. });
  83136. if (intersectMesh != lastHoverMesh) {
  83137. var _intersectMesh2, _lastHoverMesh;
  83138. //console.log('intersectMesh',intersectMesh?.name)
  83139. (_intersectMesh2 = intersectMesh) === null || _intersectMesh2 === void 0 ? void 0 : _intersectMesh2.dispatchEvent({
  83140. type: 'mouseover'
  83141. });
  83142. (_lastHoverMesh = lastHoverMesh) === null || _lastHoverMesh === void 0 ? void 0 : _lastHoverMesh.dispatchEvent({
  83143. type: 'mouseleave'
  83144. });
  83145. }
  83146. lastHoverMesh = intersectMesh;
  83147. } catch (e) {
  83148. console.error(e);
  83149. }
  83150. }
  83151. (dragMesh || intersectMesh) && consume();
  83152. });
  83153. player.on('pointerUp', function () {
  83154. var _dragInfo3;
  83155. var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  83156. if (e.getConsumed()) return;
  83157. if (!player.mouseCouldBeClickToMove && (_dragInfo3 = dragInfo) !== null && _dragInfo3 !== void 0 && _dragInfo3.notPressMouse) return; //drag了
  83158. //intersectMesh?.dispatchEvent({ type: 'startDragging' }) //???
  83159. //console.log('pointerUp')
  83160. if (dragMesh) {
  83161. dragMesh.dispatchEvent(Object.assign({}, e, {
  83162. type: 'drop',
  83163. drag: dragInfo
  83164. }));
  83165. dragInfo = null;
  83166. dragMesh = null;
  83167. e.consume(); //还要触发后续的click不能consume
  83168. player.cameraControls.activeControl.enabled = true;
  83169. player.cameraControls.activeControl.reset();
  83170. }
  83171. tag3dPanelPointerEnable(true);
  83172. });
  83173. player.on('forceToDrag', function (e) {
  83174. var _e$drag;
  83175. if (dragMesh != ((_e$drag = e.drag) === null || _e$drag === void 0 ? void 0 : _e$drag.object)) {
  83176. var _e$drag2, _dragMesh;
  83177. if (dragMesh) {
  83178. dragMesh.dispatchEvent(Object.assign({}, e, {
  83179. type: 'drop',
  83180. drag: dragInfo
  83181. }));
  83182. }
  83183. dragMesh = (_e$drag2 = e.drag) === null || _e$drag2 === void 0 ? void 0 : _e$drag2.object;
  83184. (_dragMesh = dragMesh) === null || _dragMesh === void 0 ? void 0 : _dragMesh.dispatchEvent(Object.assign({}, e, {
  83185. type: 'startDragging'
  83186. }));
  83187. dragInfo = e.drag;
  83188. /* if(dragMesh){
  83189. player.mouseAtMouseDown.copy(player.mouse) //for set mouseCouldBeClickToMove false
  83190. } */
  83191. }
  83192. });
  83193. player.on('click', function (e) {
  83194. var _intersectMesh$_liste, _intersectMesh$_liste2;
  83195. if (e.getConsumed() || !e.isAtDomElement) return; //console.log('player.on( click ', intersectMesh?.name)
  83196. if (intersectMesh && (_intersectMesh$_liste = intersectMesh._listeners) !== null && _intersectMesh$_liste !== void 0 && (_intersectMesh$_liste2 = _intersectMesh$_liste.click) !== null && _intersectMesh$_liste2 !== void 0 && _intersectMesh$_liste2.length
  83197. /* && !intersectMesh.tag.dragEnable */
  83198. ) {
  83199. intersectMesh.dispatchEvent({
  83200. type: 'click',
  83201. point: player.intersect.point
  83202. });
  83203. e.consume();
  83204. } else if (_this10.openedTag3d) {
  83205. delete _this10.openedTag3d.x;
  83206. delete _this10.openedTag3d.y;
  83207. _this10.openedTag3d.visible = false;
  83208. _this10.openedTag3d = null;
  83209. _this10.emit('closeTag3d');
  83210. e.consume();
  83211. }
  83212. });
  83213. }
  83214. }]);
  83215. return TagManager;
  83216. }(tinyEmitter);
  83217. 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); }; }
  83218. 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; } }
  83219. var _visibleEnter = /*#__PURE__*/_classPrivateFieldKey("visibleEnter");
  83220. var _visibleLeave = /*#__PURE__*/_classPrivateFieldKey("visibleLeave");
  83221. var Manager = /*#__PURE__*/function () {
  83222. function Manager(app) {
  83223. _classCallCheck(this, Manager);
  83224. Object.defineProperty(this, _visibleLeave, {
  83225. value: _visibleLeave2
  83226. });
  83227. Object.defineProperty(this, _visibleEnter, {
  83228. value: _visibleEnter2
  83229. });
  83230. this.app = app;
  83231. this.player = null;
  83232. this.symbol = null;
  83233. this.visible = false;
  83234. }
  83235. _createClass(Manager, [{
  83236. key: "enter",
  83237. value: function enter(symbol) {
  83238. var _this = this;
  83239. if (this.symbol) {
  83240. return;
  83241. }
  83242. this.player = this.app.core.get('Player');
  83243. if (this.player == void 0) {
  83244. setTimeout(function () {
  83245. return _this.enter(symbol);
  83246. }, 500);
  83247. return;
  83248. }
  83249. this.symbol = symbol;
  83250. if (symbol == 'visible') {
  83251. _classPrivateFieldBase(this, _visibleEnter)[_visibleEnter]();
  83252. }
  83253. }
  83254. }, {
  83255. key: "leave",
  83256. value: function leave() {
  83257. if (this.symbol == 'visible') {
  83258. _classPrivateFieldBase(this, _visibleLeave)[_visibleLeave]();
  83259. }
  83260. this.symbol = null;
  83261. }
  83262. }, {
  83263. key: "setVisibleState",
  83264. value: function setVisibleState(sid) {
  83265. var tag = this.app.TagManager.tags.find(function (t) {
  83266. return t.sid == sid;
  83267. });
  83268. if (tag) {
  83269. this.player.linkEditor.SetOneTagVisible(tag);
  83270. }
  83271. }
  83272. }]);
  83273. return Manager;
  83274. }();
  83275. function _visibleEnter2() {
  83276. this.visible = true;
  83277. if (this.player.linkEditor) {
  83278. this.player.linkEditor.enterSet('tagVisible');
  83279. this.player.linkEditor.beginSetTagVisible();
  83280. }
  83281. this.player.model.floorplanCadImg.hideCadPlane();
  83282. }
  83283. function _visibleLeave2() {
  83284. this.visible = false;
  83285. this.player.linkEditor.finishSetTagVisible();
  83286. this.player.model.floorplanCadImg.showCadPlane();
  83287. }
  83288. var TagManager = /*#__PURE__*/function (_Emiter) {
  83289. _inherits(TagManager, _Emiter);
  83290. var _super = _createSuper$3(TagManager);
  83291. function TagManager(app) {
  83292. var _this2;
  83293. _classCallCheck(this, TagManager);
  83294. _this2 = _super.call(this);
  83295. _this2.focusBeforeModify = function (sid) {
  83296. var player = _this2.app.core.get('Player');
  83297. _this2.editTag = _this2.tags.find(function (t) {
  83298. return t.sid == sid;
  83299. });
  83300. var pano = _this2.findBestPanoForWatching(_this2.editTag);
  83301. player.flyToPano({
  83302. pano: pano,
  83303. lookAtPoint: _this2.editTag.position,
  83304. aimDuration: 0,
  83305. duration: 1,
  83306. checkAlone: true
  83307. }, function () {
  83308. _this2.edit.enter(_this2.editTag, function () {
  83309. _this2.editHandle.markTagPos = _this2.editTag.position;
  83310. _this2.editHandle.markSpotA.elem.style.display = 'block';
  83311. _this2.editHandle.markSpotB.elem.style.display = 'block';
  83312. });
  83313. }); // this.app.Camera.flyToPoint(pano.position, {
  83314. // aimDur: 0, // 同点位镜头旋转时间
  83315. // dur: 1, // 点位跳转时间(不能为0)
  83316. // done: () => {
  83317. // this.edit.enter(() => {
  83318. // this.editHandle.markTagPos = this.editTag.position
  83319. // this.editHandle.markSpotA.elem.style.display = 'block'
  83320. // this.editHandle.markSpotB.elem.style.display = 'block'
  83321. // })
  83322. // },
  83323. // })
  83324. };
  83325. _this2.focusing = function (data) {
  83326. var player = _this2.app.core.get('Player');
  83327. var center = new THREE.Vector3();
  83328. var tag = _this2.tags.find(function (t) {
  83329. return t.sid == data.sid;
  83330. }) || data.tag;
  83331. var pano = _this2.findBestPanoForWatching(tag);
  83332. /**
  83333. * 同步带看热点方向
  83334. */
  83335. var syncTagRotate = function syncTagRotate() {
  83336. if (player.mode === Viewmode$1.PANORAMA) {
  83337. _this2.app.Camera.emit(PlayerEvents.Rotate, {
  83338. panoId: player.currentPano ? player.currentPano.id : null,
  83339. quaternion: player.cameraControls.activeControl.camera.quaternion,
  83340. mode: Viewmode$1.PANORAMA,
  83341. type: 'flyToPano'
  83342. });
  83343. }
  83344. };
  83345. var unprojectCenter = function unprojectCenter() {
  83346. // 因为tag里的xy在相机飞出飞入后数值会有问题,所以这边再计算一次
  83347. tag.x = _this2.convertPositionTo2D(tag.position).pos.x;
  83348. tag.y = _this2.convertPositionTo2D(tag.position).pos.y;
  83349. center.set(0, 0, 0);
  83350. var centerX = tag.x;
  83351. var centerY = tag.y; // 根据boardDirc向左或向上偏移
  83352. if (data.board) {
  83353. if (data.board.width) {
  83354. centerX = tag.x - data.board.width / 2;
  83355. }
  83356. if (data.board.height) {
  83357. centerY = tag.y - data.board.height / 2;
  83358. }
  83359. } else {
  83360. centerX = tag.x;
  83361. centerY = tag.y;
  83362. } // 2d坐标映射到3d
  83363. math$2.convertScreenPositionToNDC(centerX, centerY, center, _this2.app.dom);
  83364. center.unproject(player.camera);
  83365. }; // 默认中心点目标
  83366. data.target = data.target || 'board';
  83367. if (data.target == 'board') {
  83368. // 面板中心
  83369. if (pano.id == player.currentPano.id && player.mode == 'panorama') {
  83370. _this2.emit('focus.rotating');
  83371. unprojectCenter();
  83372. var cameraDirec = new THREE.Vector3(0, 0, 1).applyQuaternion(player.camera.quaternion).normalize();
  83373. var targetDirec = player.camera.position.clone().sub(tag.position).normalize();
  83374. var reverse = cameraDirec.dot(targetDirec);
  83375. if (reverse < 0) {
  83376. var distanceVec = player.camera.position.clone().sub(center).multiplyScalar(-1);
  83377. center = player.camera.position.clone().sub(distanceVec);
  83378. }
  83379. player.flyToPano({
  83380. pano: pano,
  83381. lookAtPoint: center,
  83382. checkAlone: true,
  83383. isTagFlying: true
  83384. }, function () {
  83385. if (tag.x > window.innerWidth / 4 && tag.x < window.innerWidth / 4 * 3) {
  83386. syncTagRotate();
  83387. _this2.emit('focus.rotated', tag);
  83388. } else {
  83389. unprojectCenter();
  83390. player.flyToPano({
  83391. pano: pano,
  83392. aimDuration: 600,
  83393. lookAtPoint: center
  83394. }, function () {
  83395. syncTagRotate();
  83396. _this2.emit('focus.rotated', tag);
  83397. });
  83398. }
  83399. });
  83400. } else {
  83401. player.flyToPano({
  83402. pano: pano,
  83403. lookAtPoint: tag.position,
  83404. duration: 1000,
  83405. checkAlone: true,
  83406. isTagFlying: true
  83407. }, function () {
  83408. return setTimeout(function () {
  83409. unprojectCenter();
  83410. player.flyToPano({
  83411. pano: pano,
  83412. aimDuration: 600,
  83413. lookAtPoint: center
  83414. }, function () {
  83415. _this2.emit('focus.rotated', tag);
  83416. });
  83417. }, 10);
  83418. });
  83419. }
  83420. } else if (data.target == 'tag') {
  83421. // 热点
  83422. player.flyToPano({
  83423. pano: pano,
  83424. lookAtPoint: tag.position,
  83425. // duration: 700,
  83426. checkAlone: true,
  83427. isTagFlying: true
  83428. }, function () {
  83429. _this2.emit('focus.rotated', tag);
  83430. });
  83431. }
  83432. };
  83433. console.info('TagManagerV2');
  83434. _this2.app = app;
  83435. _this2.tags = [];
  83436. _this2.icons = [];
  83437. _this2.manager = new Manager(_this2.app);
  83438. _this2.app.store.on('tags', function (data) {
  83439. if (data.icons) {
  83440. _this2.icons = data.icons;
  83441. }
  83442. if (data.tags) {
  83443. data.tags.forEach(function (tag) {
  83444. _this2.tags.push(tag);
  83445. });
  83446. } // 由于热点新增了floorIndex属性,需要兼容旧数据
  83447. var player = app.core.get('Player');
  83448. var dir = new THREE.Vector3(0, -1, 0);
  83449. var ray = new THREE.Raycaster(new THREE.Vector3(0, 0, 0), dir, 0.001, 9999);
  83450. _this2.tags.forEach(function (tag) {
  83451. if (tag.floorIndex == void 0) {
  83452. // 旧数据没有floorIndex
  83453. // 从热点位置向下投一条射线,检测到的第一个模型即为所在楼层
  83454. ray.set(tag.position, dir);
  83455. var intersection = ray.intersectObjects(player.model.chunks);
  83456. if (!intersection.length) {
  83457. // 如果射线检测不到模型,则根据floor的boundingBox判断
  83458. var tagFloor = player.model.floors.list.find(function (floor) {
  83459. return tag.position.y >= floor.boundingBox.min.y && tag.position.y <= floor.boundingBox.max.y;
  83460. });
  83461. tag.floorIndex = tagFloor && tagFloor.floorIndex;
  83462. } else {
  83463. tag.floorIndex = intersection[0].object.parent.floorIndex;
  83464. }
  83465. }
  83466. });
  83467. _this2.loaded = true;
  83468. _this2.emit('loaded', _this2.tags);
  83469. });
  83470. _this2.app.Camera.on('flying.started', function (pano) {
  83471. if (!pano.isTagFlying) {
  83472. _this2.emit('close');
  83473. }
  83474. });
  83475. _this2.app.Scene.on('loaded', function () {
  83476. var player = app.core.get('Player'); // 热点在哪些模式下显示
  83477. var showIn = _this2.app.config.tag.showIn;
  83478. var event = {
  83479. tags: _this2.tags
  83480. };
  83481. app.core.get('SceneRenderer').on(SceneRendererEvents.AfterRender, function () {
  83482. if (!_this2.tags || !_this2.tags.length) return;
  83483. var setTagVisible = function setTagVisible(tag, visible) {
  83484. if (tag.visible == visible) {
  83485. return;
  83486. }
  83487. tag.visible = visible;
  83488. };
  83489. _this2.tags.forEach(function (item) {
  83490. // isLose表示失效,重算的时候需要
  83491. //s howTags表示是否全部可见
  83492. if (item.isLose || _this2.showTags === false) {
  83493. return setTagVisible(item, false);
  83494. }
  83495. if (_this2.manager.visible) {
  83496. // 热点可视
  83497. if (player.linkEditor.setTagVisible) {
  83498. // 只所在楼层可视热点
  83499. if (item.floorIndex != player.model.currentFloor.floorIndex) {
  83500. if (player.linkEditor.tagVsetting != item) {
  83501. //tagVsetting的要一直显示
  83502. return setTagVisible(item, false);
  83503. }
  83504. }
  83505. }
  83506. } else {
  83507. if (showIn) {
  83508. if (showIn === 'all') {
  83509. if (player.mode == Viewmode$1.PANORAMA && !item.visiblePanos.includes(player.currentPano)) {
  83510. return setTagVisible(item, false);
  83511. }
  83512. } else if (showIn.indexOf(player.mode) == -1) {
  83513. return setTagVisible(item, false);
  83514. }
  83515. }
  83516. if (settings$3.vrEnabled && settings$3.vrSplitScreen) {
  83517. return setTagVisible(item, false);
  83518. } // 默认情况
  83519. if (!showIn || showIn != 'all' && showIn == Viewmode$1.PANORAMA) {
  83520. if (player.mode != Viewmode$1.PANORAMA || item.visiblePanos && !item.visiblePanos.includes(player.currentPano)) {
  83521. return setTagVisible(item, false);
  83522. }
  83523. }
  83524. }
  83525. var pos = _this2.convertPositionTo2D(item.position);
  83526. if (!pos.trueSide || !pos.inSight) {
  83527. //trueSide是否在背面
  83528. //inSight是否在当前屏幕可视区域
  83529. //console.log(item.sid, false)
  83530. return setTagVisible(item, false);
  83531. }
  83532. item.x = pos.pos.x;
  83533. item.y = pos.pos.y;
  83534. setTagVisible(item, true);
  83535. });
  83536. event.lastFrameChanged = player.lastFrameChanged;
  83537. _this2.emit('update', event);
  83538. });
  83539. });
  83540. return _this2;
  83541. }
  83542. _createClass(TagManager, [{
  83543. key: "load",
  83544. value: function load(tags) {
  83545. var _this3 = this;
  83546. if (!tags || !tags instanceof Array) {
  83547. return;
  83548. }
  83549. var player = this.app.core.get('Player');
  83550. tags.forEach(function (tag) {
  83551. if (tag.position && tag.position instanceof THREE.Vector3 == false) {
  83552. tag.position = new THREE.Vector3(tag.position.x, tag.position.y, tag.position.z);
  83553. if (tag.visiblePanos && tag.visiblePanos.length) {
  83554. tag.visiblePanos = tag.visiblePanos.map(function (id) {
  83555. return player.model.panos.index[id];
  83556. });
  83557. } else {
  83558. tag.visiblePanos = _this3.getVisiblePano(tag.position);
  83559. }
  83560. }
  83561. });
  83562. this.tags = tags;
  83563. }
  83564. /**
  83565. * 3d坐标转2d屏幕坐标
  83566. * @param {Object} position3d {x,y,z}
  83567. * @returns {Object} {x,y}
  83568. */
  83569. }, {
  83570. key: "convertPositionTo2D",
  83571. value: function convertPositionTo2D(position3d) {
  83572. return convertTool.getPos2d(position3d, this.app.core.get('Player'));
  83573. }
  83574. }, {
  83575. key: "ifShelter",
  83576. value: function ifShelter(position3d, pos2d) {
  83577. var player = this.app.core.get('Player');
  83578. var floorIndex = player.model.allFloorsVisible ? null : player.model.currentFloor.floorIndex;
  83579. return convertTool.ifShelter(position3d, player, pos2d, null, floorIndex);
  83580. }
  83581. }, {
  83582. key: "getVisiblePano",
  83583. value: function getVisiblePano(position) {
  83584. var maxDis = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 6;
  83585. var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.15;
  83586. var visiblePanos = convertTool.getVisiblePano(position, this.app.core.get('Player').model, {
  83587. maxDis,
  83588. tolerance
  83589. }); //maxDis如果能自适应场景更好,有的大马路pano间距较远
  83590. return visiblePanos;
  83591. }
  83592. /**
  83593. * 点击修改后瞬间跳到最佳点位
  83594. * @param {*} sid
  83595. */
  83596. }, {
  83597. key: "open",
  83598. value: function open(sid) {
  83599. var _this4 = this;
  83600. var retry = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  83601. var tag = this.tags.find(function (t) {
  83602. return t.sid == sid;
  83603. });
  83604. if (tag) {
  83605. if (!tag.visible) {
  83606. console.log(retry);
  83607. if (retry > 5) {
  83608. return;
  83609. }
  83610. return setTimeout(function () {
  83611. return _this4.open(sid, ++retry);
  83612. }, 300);
  83613. }
  83614. this.emit('open', tag);
  83615. }
  83616. }
  83617. }, {
  83618. key: "focus",
  83619. value: function focus(sid) {
  83620. var tag = this.tags.find(function (t) {
  83621. return t.sid == sid;
  83622. });
  83623. if (tag) {
  83624. this.emit('focus', tag);
  83625. }
  83626. }
  83627. }, {
  83628. key: "close",
  83629. value: function close() {
  83630. this.emit('close');
  83631. }
  83632. /**
  83633. * 查看热点的最佳点位
  83634. * @param {*} tag
  83635. * @returns
  83636. */
  83637. }, {
  83638. key: "findBestPanoForWatching",
  83639. value: function findBestPanoForWatching(tag) {
  83640. var player = this.app.core.get('Player'); // 根据热点可视查询最近pano
  83641. var visiPanos = player.model.panos.closestPanoTowardPoint({
  83642. point: tag.position,
  83643. getAll: true,
  83644. require: [function (p) {
  83645. return tag.visiblePanos.indexOf(p) > -1;
  83646. }]
  83647. }).map(function (p) {
  83648. return p.item;
  83649. }); // 查找非孤立点位
  83650. var notAloneVisiPanos = visiPanos.filter(function (p) {
  83651. return p.neighbourUUIDs.filter(function (id) {
  83652. return id != p.id;
  83653. }).length > 0;
  83654. });
  83655. if (notAloneVisiPanos.length > 0) {
  83656. visiPanos = notAloneVisiPanos;
  83657. } // // 查找符合距离限制的(要能完全展示UI)
  83658. // let minDistance = 1.5
  83659. // let minDistanceVisiPanos = visiPanos.filter(p => p.position.clone().setY(tag.position.y).sub(tag.position).length() > minDistance)
  83660. // if (minDistanceVisiPanos.length > 0) {
  83661. // visiPanos = minDistanceVisiPanos
  83662. // }
  83663. // 查找当前floor
  83664. var currentFloorVisiPanos = visiPanos.filter(function (p) {
  83665. return p.floorIndex == player.model.currentFloor.floorIndex;
  83666. });
  83667. if (currentFloorVisiPanos.length > 0) {
  83668. visiPanos = currentFloorVisiPanos;
  83669. }
  83670. var pano = visiPanos[0];
  83671. if (player.mode === Viewmode$1.PANORAMA) {
  83672. visiPanos = visiPanos.filter(function (pano) {
  83673. var p1 = new THREE.Vector3(tag.position.x - pano.position.x, tag.position.y - pano.position.y, tag.position.z - pano.position.z);
  83674. 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);
  83675. var angle = p1.angleTo(p2);
  83676. return angle < Math.PI / 4;
  83677. });
  83678. }
  83679. if (visiPanos.length > 0) {
  83680. pano = visiPanos[0];
  83681. }
  83682. if (!pano) {
  83683. console.warn('该热点无可视点位');
  83684. pano = player.currentPano;
  83685. }
  83686. return pano;
  83687. }
  83688. /**
  83689. * 显示所有热点
  83690. * @param {boolean} force 是否强制显示(包括在平面图、三维模型)
  83691. */
  83692. }, {
  83693. key: "showAll",
  83694. value: function showAll() {
  83695. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  83696. this.showTags = true;
  83697. if (force) {
  83698. this.showTagsVisible = true;
  83699. }
  83700. }
  83701. /**'
  83702. * 隐藏所有热点
  83703. * @param {boolean} force 是否强制隐藏(包括在平面图、三维模型)
  83704. */
  83705. }, {
  83706. key: "hideAll",
  83707. value: function hideAll() {
  83708. var force = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
  83709. this.showTags = false;
  83710. if (force) {
  83711. this.showTagsVisible = false;
  83712. }
  83713. }
  83714. }, {
  83715. key: "convertScreenPositionToNDC",
  83716. value: function convertScreenPositionToNDC(centerX, centerY, center) {
  83717. return math$2.convertScreenPositionToNDC(centerX, centerY, center, this.app.dom);
  83718. }
  83719. }, {
  83720. key: "toJSON",
  83721. value: function toJSON(tags) {
  83722. var data = JSON.stringify(tags || this.tags, function (key, value) {
  83723. if (key === 'visiblePanos' && value) {
  83724. return value.map(function (v) {
  83725. return v.id;
  83726. });
  83727. }
  83728. return value;
  83729. });
  83730. return JSON.parse(data);
  83731. }
  83732. }]);
  83733. return TagManager;
  83734. }(tinyEmitter);
  83735. 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); }; }
  83736. 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; } }
  83737. var WalkManager$1 = /*#__PURE__*/function (_Emiter) {
  83738. _inherits(WalkManager, _Emiter);
  83739. var _super = _createSuper$2(WalkManager);
  83740. function WalkManager(app) {
  83741. var _this;
  83742. _classCallCheck(this, WalkManager);
  83743. _this = _super.call(this);
  83744. _this.app = app;
  83745. _this.edit = {};
  83746. var player;
  83747. var deferred = Deferred$1();
  83748. _this.app.Scene.on('loaded', function () {
  83749. player = _this.app.core.get('Player');
  83750. player.linkEditor = new Link(player);
  83751. deferred.resolve();
  83752. });
  83753. _this.edit.enter = function () {
  83754. // 等到linkEditor初始化才能enter
  83755. if (player && player.linkEditor) {
  83756. setTimeout(function () {
  83757. player.linkEditor.enterSet('panoVisible');
  83758. player.labelManager.updateEntryVisi(false);
  83759. }, 0);
  83760. } else {
  83761. deferred.then(function () {
  83762. return _this.edit.enter();
  83763. });
  83764. }
  83765. };
  83766. _this.edit.exit = function () {
  83767. player && player.linkEditor.finishSetPanoVisible();
  83768. };
  83769. _this.edit.undoEdit = function () {
  83770. var pano = player.linkEditor.startEditPano;
  83771. player.linkEditor.pauseSetPanoVisible(false, player.model.currentFloor);
  83772. if (pano && pano.floorIndex == player.model.currentFloor.floorIndex) {
  83773. player.linkEditor.SetOnePanoVisible(pano);
  83774. _this.emit('walkManager.active', player.linkEditor.checkLinkStatus());
  83775. }
  83776. };
  83777. _this.edit.checkNeedSave = function () {
  83778. return player.linkEditor.checkPanoVisiChange();
  83779. };
  83780. _this.edit.save = function (promise) {
  83781. promise(player.linkEditor.savePanoVisibles(), player.linkEditor.afterSavePanoVisibles.bind(player.linkEditor));
  83782. };
  83783. _this.edit.toggle = function (show) {
  83784. // isSuccess 处理初始点位无法隐藏的交互
  83785. var isSuccess = player.linkEditor.toggle(show);
  83786. return isSuccess;
  83787. };
  83788. /**
  83789. * 多楼层连接 相关函数
  83790. */
  83791. _this.edit.linkToUpperFloor = function () {
  83792. var linkEditor = player.linkEditor;
  83793. if (!linkEditor.startEditPano) linkEditor.startEditPano = linkEditor.activePano; // 用于撤销时激活修改之前的pano
  83794. // let upperFloorIndex = linkEditor.activePano.floorIndex + 1
  83795. var upperFloorIndex = linkEditor.getFloor(linkEditor.activePano.floorIndex, 'upper');
  83796. if (window.jumpFloor != void 0) lowerFloorIndex = jumpFloor;
  83797. player.model.once('floor.changed', function (toFloor, mode) {
  83798. setTimeout(function () {
  83799. linkEditor.actionIcons.forEach(function (icon) {
  83800. return icon.visible = false;
  83801. });
  83802. var activePano = linkEditor.lastFloorActivePano;
  83803. activePano.footIcon.visible = true;
  83804. linkEditor.changeIconLinkState(activePano.footIcon, 'floorLinked');
  83805. }, 10);
  83806. });
  83807. _this.edit.unlinkToOtherFloor(null, {
  83808. checkMainFirstView: false
  83809. });
  83810. _this.app.Scene.gotoFloor(upperFloorIndex);
  83811. linkEditor.setMultiFloorPanoVisible = 'upper';
  83812. };
  83813. _this.edit.linkToLowerFloor = function () {
  83814. var linkEditor = player.linkEditor;
  83815. if (!linkEditor.startEditPano) linkEditor.startEditPano = linkEditor.activePano; // 用于撤销时激活修改之前的pano
  83816. // 楼层跳转,多楼层模式
  83817. // let lowerFloorIndex = linkEditor.activePano.floorIndex - 1
  83818. var lowerFloorIndex = linkEditor.getFloor(linkEditor.activePano.floorIndex, 'lower');
  83819. if (window.jumpFloor != void 0) lowerFloorIndex = jumpFloor;
  83820. player.model.once('floor.changed', function (toFloor, mode) {
  83821. setTimeout(function () {
  83822. linkEditor.actionIcons.forEach(function (icon) {
  83823. return icon.visible = false;
  83824. });
  83825. var activePano = linkEditor.lastFloorActivePano;
  83826. activePano.footIcon.visible = true;
  83827. linkEditor.changeIconLinkState(activePano.footIcon, 'floorLinked');
  83828. }, 10);
  83829. });
  83830. _this.edit.unlinkToOtherFloor(null, {
  83831. checkMainFirstView: false
  83832. }); //先取消旧连接
  83833. _this.app.Scene.gotoFloor(lowerFloorIndex);
  83834. linkEditor.setMultiFloorPanoVisible = 'lower';
  83835. };
  83836. _this.edit.floorLinkConfirm = function () {
  83837. //确定楼层连接点
  83838. var linkEditor = player.linkEditor;
  83839. var activePano = linkEditor.lastFloorActivePano; // let upperFloorPano = linkEditor.getClosestOtherFloorPano(activePano, 'up')
  83840. var linkToFloorPano = linkEditor.linkToFloorPano;
  83841. if (!linkToFloorPano) return console.log('没有选择漫游点');
  83842. _this.edit.unlinkToOtherFloor(linkToFloorPano); // 暂时单对单. 取消要连接的点的旧的楼连接
  83843. if (linkToFloorPano) {
  83844. linkEditor.savePanoVisiChange(activePano.id, [{
  83845. type: 'add',
  83846. id: linkToFloorPano.id
  83847. }]);
  83848. linkEditor.changeIconVisiState(activePano.footIcon, linkEditor.checkHasNeighbor(activePano));
  83849. }
  83850. };
  83851. _this.edit.unlinkToOtherFloor = function (pano) {
  83852. var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
  83853. _ref$checkMainFirstVi = _ref.checkMainFirstView,
  83854. checkMainFirstView = _ref$checkMainFirstVi === void 0 ? true : _ref$checkMainFirstVi;
  83855. //先取消和别的楼层的所有连接 / 点击‘不设置’
  83856. var linkEditor = player.linkEditor;
  83857. var firstViewPano = player.$app.core.get('Scene').firstView.pano;
  83858. var shouldWarn;
  83859. if (!linkEditor.startEditPano) linkEditor.startEditPano = linkEditor.activePano; // 用于撤销时激活修改之前的pano
  83860. var activePano = pano || linkEditor.activePano;
  83861. linkEditor.saveLastPanoVi(); //清除线前先保存设置
  83862. var neighbours = linkEditor.panoVTemp[activePano.id] && linkEditor.panoVTemp[activePano.id].neighbourPanos || player.model.panos.index[activePano.id].neighbourPanos;
  83863. var neighbourPanos = Object.keys(neighbours).map(function (pId) {
  83864. return player.model.panos.index[pId];
  83865. });
  83866. var change = [];
  83867. neighbourPanos.forEach(function (pano) {
  83868. if (pano.floorIndex != activePano.floorIndex) {
  83869. /* if (this.edit.checkFirstView(pano, activePano)) { //-----被驳回,所以先注释
  83870. //被连接的是初始点且断开后会变孤立点
  83871. return (shouldWarn = true)
  83872. } */
  83873. change.push({
  83874. type: 'sub',
  83875. id: pano.id
  83876. });
  83877. }
  83878. });
  83879. if (change.length) {
  83880. linkEditor.savePanoVisiChange(activePano.id, change); //check activePano if it is firstViewPano . 如果不用检查代表过后还要连接别的
  83881. if (checkMainFirstView && activePano == firstViewPano && !linkEditor.checkHasNeighbor(firstViewPano)) {
  83882. shouldWarn = true; //恢复一个,使之不是孤立点
  83883. change = [{
  83884. type: 'add',
  83885. id: change[0].id
  83886. }];
  83887. linkEditor.savePanoVisiChange(activePano.id, change);
  83888. }
  83889. linkEditor.changeIconVisiState(activePano.footIcon, linkEditor.checkHasNeighbor(activePano)); // 更新连接状态
  83890. linkEditor.delVisibleLines(); //删除线
  83891. linkEditor.showFootIcons(activePano, true);
  83892. linkEditor.createPanoVisiLines(activePano); //创线
  83893. }
  83894. if (shouldWarn) {
  83895. player.$app.gui.toast({
  83896. event: 'DialogList3D.WalkManger.firstPointLimit',
  83897. content: DialogList3D.WalkManger.firstPointLimit
  83898. });
  83899. setTimeout(function () {
  83900. linkEditor.checkFloorLinkStatus(); //上下楼选项恢复
  83901. }, 1);
  83902. }
  83903. };
  83904. _this.edit.cancelFloorLink = function () {
  83905. //取消设置楼层连接
  83906. var linkEditor = player.linkEditor;
  83907. _this.app.Scene.gotoFloor(linkEditor.lastFloorActivePano.floorIndex);
  83908. linkEditor.actionIcons.forEach(function (icon) {
  83909. return icon.visible = true;
  83910. });
  83911. linkEditor.linkToFloorPano = null;
  83912. linkEditor.setMultiFloorPanoVisible = false;
  83913. player.$app.WalkManager.emit('walkManager.multiFloorLinking', false); //置灰确定按钮
  83914. }; //主点是初始点的话,主点可能连接多个其他点。
  83915. _this.edit.checkFirstView = function (panoA, panoB) {
  83916. var firstViewPano = player.$app.core.get('Scene').firstView.pano;
  83917. var another;
  83918. if (firstViewPano == panoA) {
  83919. another = panoB;
  83920. } else if (firstViewPano == panoB) {
  83921. another = panoA;
  83922. } else return false;
  83923. var neighbours = player.linkEditor.getCurNeighbors(firstViewPano);
  83924. var firstViewWillHide = neighbours.length == 1 && neighbours.includes(another.id);
  83925. return firstViewWillHide;
  83926. };
  83927. return _this;
  83928. }
  83929. return WalkManager;
  83930. }(tinyEmitter);
  83931. 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); }; }
  83932. 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; } }
  83933. var WalkManager = /*#__PURE__*/function (_Emiter) {
  83934. _inherits(WalkManager, _Emiter);
  83935. var _super = _createSuper$1(WalkManager);
  83936. function WalkManager(app) {
  83937. var _this;
  83938. _classCallCheck(this, WalkManager);
  83939. _this = _super.call(this);
  83940. _this.app = app;
  83941. _this.player = null; // 所选点位的连接状态
  83942. _this.on('walkManager.active', function (state) {
  83943. var status = null;
  83944. switch (state) {
  83945. case 'walkManager.linkAll':
  83946. status = 'all'; // 全部连接
  83947. break;
  83948. case 'walkManager.linkSome':
  83949. status = 'some'; // 部分连接
  83950. break;
  83951. case 'walkManager.linkNone':
  83952. status = 'none'; // 没有连接
  83953. break;
  83954. }
  83955. _this.emit('pano.status', status);
  83956. }); // 所选点位取消选择
  83957. _this.on('walkManager.deactive', function () {
  83958. _this.emit('pano.status');
  83959. });
  83960. return _this;
  83961. }
  83962. _createClass(WalkManager, [{
  83963. key: "save",
  83964. value: function save() {
  83965. var data = this.toJSON();
  83966. if (data.length == 0) {
  83967. return Promise.resolve();
  83968. }
  83969. return this.app.APIs.editor.walk_save({
  83970. data
  83971. });
  83972. }
  83973. /**
  83974. * 进入编辑状态
  83975. * @returns
  83976. */
  83977. }, {
  83978. key: "enter",
  83979. value: function enter() {
  83980. var _this2 = this;
  83981. if (this.player === null) {
  83982. this.app.Scene.whenLoaded(function () {
  83983. _this2.player = _this2.app.core.get('Player');
  83984. _this2.player.linkEditor = new Link(_this2.player);
  83985. setTimeout(function () {
  83986. return _this2.enter();
  83987. }, 200);
  83988. });
  83989. return;
  83990. }
  83991. this.app.Scene.hideFloorCadImage();
  83992. this.player.linkEditor.enterSet('panoVisible');
  83993. this.player.labelManager.updateEntryVisi(false);
  83994. }
  83995. /**
  83996. * 退出编辑状态
  83997. */
  83998. }, {
  83999. key: "leave",
  84000. value: function leave() {
  84001. if (this.player) {
  84002. this.app.Scene.showFloorCadImage();
  84003. this.player.linkEditor.finishSetPanoVisible();
  84004. }
  84005. }
  84006. /**
  84007. * 处理初始点位无法隐藏的交互
  84008. * @param {*} type
  84009. * @returns
  84010. */
  84011. }, {
  84012. key: "toggle",
  84013. value: function toggle(type) {
  84014. if (this.player) {
  84015. return this.player.linkEditor.toggle(type);
  84016. }
  84017. }
  84018. /**
  84019. * 取消操作
  84020. */
  84021. }, {
  84022. key: "cancel",
  84023. value: function cancel() {
  84024. if (this.player === null) {
  84025. return;
  84026. }
  84027. var pano = this.player.linkEditor.startEditPano;
  84028. this.player.linkEditor.pauseSetPanoVisible(false, this.player.model.currentFloor);
  84029. if (pano && pano.floorIndex == this.player.model.currentFloor.floorIndex) {
  84030. this.player.linkEditor.SetOnePanoVisible(pano);
  84031. this.emit('walkManager.active', this.player.linkEditor.checkLinkStatus());
  84032. }
  84033. }
  84034. /**
  84035. * 确认操作
  84036. */
  84037. }, {
  84038. key: "confirm",
  84039. value: function confirm() {}
  84040. /**
  84041. * 获取编辑数据
  84042. * @returns {Array<Object>}
  84043. */
  84044. }, {
  84045. key: "toJSON",
  84046. value: function toJSON() {
  84047. if (this.player === null) {
  84048. return [];
  84049. }
  84050. return this.player.linkEditor.savePanoVisibles() || [];
  84051. }
  84052. }]);
  84053. return WalkManager;
  84054. }(tinyEmitter);
  84055. var CadManager$1 = /*#__PURE__*/function () {
  84056. function CadManager(app) {
  84057. var _this = this;
  84058. _classCallCheck(this, CadManager);
  84059. this.app = app;
  84060. this.edit = {};
  84061. this.labels = [{
  84062. key: 'porch',
  84063. text: '玄关',
  84064. type: 'hall'
  84065. }, {
  84066. key: 'masterGuard',
  84067. text: '主卫',
  84068. type: 'hall'
  84069. }, {
  84070. key: 'aisle',
  84071. text: '过道',
  84072. type: 'hall'
  84073. }, {
  84074. key: 'guestGuard',
  84075. text: '客卫',
  84076. type: 'hall'
  84077. }, {
  84078. key: 'kitchen',
  84079. text: '厨房',
  84080. type: 'hall'
  84081. }, {
  84082. key: 'garage',
  84083. text: '车库',
  84084. type: 'hall'
  84085. }, {
  84086. key: 'garden',
  84087. text: '花园',
  84088. type: 'hall'
  84089. }, {
  84090. key: 'balcony',
  84091. text: '阳台',
  84092. type: 'hall'
  84093. }, {
  84094. key: 'masterBedroom',
  84095. text: '主卧',
  84096. type: 'room'
  84097. }, {
  84098. key: 'guestBedroom',
  84099. text: '次卧',
  84100. type: 'room'
  84101. }, {
  84102. key: 'study',
  84103. text: '书房',
  84104. type: 'room'
  84105. }, {
  84106. key: 'lockerRoom',
  84107. text: '储物间',
  84108. type: 'room'
  84109. }, {
  84110. key: 'cloakroom',
  84111. text: '衣帽间',
  84112. type: 'room'
  84113. }, {
  84114. key: 'elderlyRoom',
  84115. text: '老人房',
  84116. type: 'room'
  84117. }, {
  84118. key: 'childrenRoom',
  84119. text: '儿童房',
  84120. type: 'room'
  84121. }, {
  84122. key: 'petRoom',
  84123. text: '宠物房',
  84124. type: 'room'
  84125. }, {
  84126. key: 'livingRoom',
  84127. text: '客厅',
  84128. type: 'other'
  84129. }, {
  84130. key: 'restaurant',
  84131. text: '餐厅',
  84132. type: 'other'
  84133. }];
  84134. this.plugin = Deferred$1();
  84135. this.deferred = Deferred$1();
  84136. this.app.Scene.on('loaded', function () {
  84137. _this.deferred.resolve();
  84138. });
  84139. this.edit.enter = function () {
  84140. _this.app.VideoManager.BoxVideo.hideAll();
  84141. _this.app.Scene.Decoration.hideAll();
  84142. _this.waitLoaded(function () {
  84143. _this.app.core.get('Player').model.floorplanCadImg.isEdit = true;
  84144. });
  84145. };
  84146. this.edit.exit = function () {
  84147. _this.app.VideoManager.BoxVideo.showAll();
  84148. _this.app.Scene.Decoration.showAll();
  84149. var player = _this.app.core.get('Player');
  84150. player && (player.model.floorplanCadImg.isEdit = false);
  84151. };
  84152. }
  84153. _createClass(CadManager, [{
  84154. key: "install",
  84155. value: function install(target) {
  84156. this.target = target;
  84157. this.plugin.resolve(target);
  84158. }
  84159. }, {
  84160. key: "use",
  84161. value: function use() {
  84162. if (this.target) {
  84163. return Promise.resolve(this.target);
  84164. }
  84165. return this.plugin.promise();
  84166. }
  84167. }, {
  84168. key: "cad",
  84169. value: function cad() {
  84170. return this.target;
  84171. }
  84172. }, {
  84173. key: "waitLoaded",
  84174. value: function waitLoaded(func) {
  84175. if (!func) return;
  84176. if (this.app.core.get('Player')) {
  84177. func();
  84178. } else {
  84179. this.deferred.then(func);
  84180. }
  84181. }
  84182. }]);
  84183. return CadManager;
  84184. }();
  84185. var CadManager = /*#__PURE__*/function () {
  84186. function CadManager(app) {
  84187. _classCallCheck(this, CadManager);
  84188. this.app = app;
  84189. this.ready = Deferred$1();
  84190. this.option = {};
  84191. this.player = null;
  84192. this.instance = null;
  84193. }
  84194. _createClass(CadManager, [{
  84195. key: "install",
  84196. value: function install(instance) {
  84197. for (var key in instance) {
  84198. this[key] = instance[key];
  84199. }
  84200. this.instance = instance;
  84201. this.ready.resolve();
  84202. }
  84203. }, {
  84204. key: "config",
  84205. value: function config(option) {
  84206. var _this = this;
  84207. Object.assign(this.option, option || {});
  84208. this.ready.then(function () {
  84209. if (_this.option.padding) {
  84210. _this.instance.padding(_this.option.padding);
  84211. }
  84212. });
  84213. }
  84214. }, {
  84215. key: "enter",
  84216. value: function enter() {
  84217. var _this2 = this;
  84218. return this.app.Scene.whenLoaded(function () {
  84219. _this2.app.VideoManager.BoxVideo.hideAll();
  84220. _this2.app.Scene.Decoration.hideAll();
  84221. _this2.player = _this2.app.core.get('Player');
  84222. _this2.player.model.floorplanCadImg.isEdit = true;
  84223. _this2.ready.then(function () {
  84224. if (_this2.instance.$xui == void 0) {
  84225. _this2.instance.$xui = _this2.$xui;
  84226. }
  84227. _this2.show();
  84228. });
  84229. });
  84230. }
  84231. }, {
  84232. key: "leave",
  84233. value: function leave() {
  84234. var _this3 = this;
  84235. return this.app.Scene.whenLoaded(function () {
  84236. _this3.app.Scene.Decoration.showAll();
  84237. _this3.player.model.floorplanCadImg.isEdit = false;
  84238. _this3.ready.then(function () {
  84239. return _this3.hide();
  84240. });
  84241. });
  84242. }
  84243. }]);
  84244. return CadManager;
  84245. }();
  84246. 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; }
  84247. 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; }
  84248. var ModelManager = /*#__PURE__*/function () {
  84249. function ModelManager(app) {
  84250. _classCallCheck(this, ModelManager);
  84251. this.app = app;
  84252. this.player = null;
  84253. }
  84254. _createClass(ModelManager, [{
  84255. key: "length",
  84256. get: function get() {
  84257. return this.player.GLTFEditor.group.children.length;
  84258. }
  84259. /**
  84260. *
  84261. * @param {string} url
  84262. * @param {Object} options
  84263. * @param {string} options.panoId 0
  84264. * @param {Object} options.scale {x:0,y:0,z:0}
  84265. * @param {Object} options.position {x:0,y:0,z:0}
  84266. * @param {Object} options.quaternion {x:0,y:0,z:0,w:1}
  84267. * @returns
  84268. */
  84269. }, {
  84270. key: "add",
  84271. value: function add(url, options) {
  84272. var _this = this;
  84273. if (!url) {
  84274. return;
  84275. }
  84276. if (url.indexOf('?') === -1) {
  84277. url += '?';
  84278. }
  84279. if (options == void 0) {
  84280. options = {
  84281. scale: {
  84282. x: 0.1,
  84283. y: 0.1,
  84284. z: 0.1
  84285. },
  84286. position: {
  84287. x: 0,
  84288. y: 0,
  84289. z: 0
  84290. },
  84291. quaternion: {
  84292. x: 0,
  84293. y: 0,
  84294. z: 0,
  84295. w: 1
  84296. }
  84297. };
  84298. } else if (options.scale == void 0) {
  84299. options.scale = {
  84300. x: 0.1,
  84301. y: 0.1,
  84302. z: 0.1
  84303. };
  84304. } else if (options.position == void 0) {
  84305. options.position = {
  84306. x: 0,
  84307. y: 0,
  84308. z: 0
  84309. };
  84310. } else if (options.quaternion == void 0) {
  84311. options.quaternion = {
  84312. x: 0,
  84313. y: 0,
  84314. z: 0,
  84315. w: 1
  84316. };
  84317. }
  84318. this.app.Scene.whenLoaded(function () {
  84319. if (_this.player == null) {
  84320. _this.player = _this.app.core.get('Player');
  84321. }
  84322. if (_this.player.GLTFEditor == void 0) {
  84323. _this.player.GLTFEditor = new GLTFAddManager(_this.player);
  84324. }
  84325. _this.player.GLTFEditor.add(_objectSpread({
  84326. url,
  84327. sid: options.sid || String(_this.player.GLTFEditor.group.children.length),
  84328. panoId: options.panoId || _this.app.Scene.panos.list[0].id,
  84329. visible: true
  84330. }, options));
  84331. });
  84332. }
  84333. }, {
  84334. key: "load",
  84335. value: function load(data) {
  84336. var _this2 = this;
  84337. if (Array.isArray(data)) {
  84338. data.forEach(function (item) {
  84339. return _this2.add(item.url, item.options);
  84340. });
  84341. }
  84342. }
  84343. }, {
  84344. key: "enter",
  84345. value: function enter() {
  84346. var _this3 = this;
  84347. this.app.Scene.whenLoaded(function () {
  84348. if (_this3.player == null) {
  84349. _this3.player = _this3.app.core.get('Player');
  84350. }
  84351. if (_this3.player.GLTFEditor == void 0) {
  84352. _this3.player.GLTFEditor = new GLTFAddManager(_this3.player);
  84353. }
  84354. _this3.player.GLTFEditor.editing = true;
  84355. });
  84356. }
  84357. }, {
  84358. key: "leave",
  84359. value: function leave() {
  84360. if (this.player) {
  84361. this.player.GLTFEditor.editing = false;
  84362. }
  84363. }
  84364. }, {
  84365. key: "select",
  84366. value: function select(sid) {
  84367. if (this.player === null) {
  84368. return;
  84369. }
  84370. sid = String(sid);
  84371. var gltf = this.player.GLTFEditor.group.children.find(function (gltf) {
  84372. return gltf.sid === sid;
  84373. });
  84374. if (gltf) {
  84375. this.player.GLTFEditor.select(gltf);
  84376. this.player.flyToPano({
  84377. pano: this.player.model.panos.get(gltf.panoId),
  84378. lookAtPoint: gltf.position,
  84379. checkAlone: true
  84380. });
  84381. }
  84382. }
  84383. }, {
  84384. key: "unselect",
  84385. value: function unselect() {
  84386. this.player.GLTFEditor.unselect();
  84387. }
  84388. }, {
  84389. key: "remove",
  84390. value: function remove(sid) {
  84391. var _this4 = this;
  84392. if (!this.player || !this.player.GLTFEditor) {
  84393. return;
  84394. }
  84395. if (sid == void 0) {
  84396. this.player.GLTFEditor.group.children.forEach(function (gltf) {
  84397. _this4.player.GLTFEditor.delete(gltf);
  84398. });
  84399. } else {
  84400. sid = String(sid);
  84401. var gltf = this.player.GLTFEditor.group.children.find(function (gltf) {
  84402. return gltf.sid === sid;
  84403. });
  84404. if (gltf) {
  84405. this.player.GLTFEditor.delete(gltf);
  84406. }
  84407. }
  84408. }
  84409. }, {
  84410. key: "transformMode",
  84411. value: function transformMode(mode) {
  84412. if (this.player === null) {
  84413. return;
  84414. }
  84415. if ('translate,rotate,scale'.indexOf(mode) === -1) {
  84416. return;
  84417. }
  84418. this.player.model.transformControls.mode = mode;
  84419. }
  84420. }, {
  84421. key: "toJSON",
  84422. value: function toJSON() {
  84423. if (!this.player || !this.player.GLTFEditor) {
  84424. return null;
  84425. }
  84426. if (this.player.GLTFEditor.selecting) {
  84427. var model = this.player.GLTFEditor.selecting;
  84428. var info = {
  84429. url: model.url,
  84430. options: {
  84431. sid: model.sid,
  84432. panoId: model.panoId,
  84433. position: {
  84434. x: parseFloat(model.position.x.toFixed(2)),
  84435. y: parseFloat(model.position.y.toFixed(2)),
  84436. z: parseFloat(model.position.z.toFixed(2))
  84437. },
  84438. scale: {
  84439. x: parseFloat(model.scale.x.toFixed(1)),
  84440. y: parseFloat(model.scale.y.toFixed(1)),
  84441. z: parseFloat(model.scale.z.toFixed(1))
  84442. },
  84443. quaternion: {
  84444. x: parseFloat(model.quaternion.x.toFixed(3)),
  84445. y: parseFloat(model.quaternion.y.toFixed(3)),
  84446. z: parseFloat(model.quaternion.z.toFixed(3)),
  84447. w: parseFloat(model.quaternion.w.toFixed(3))
  84448. },
  84449. visible: model.visible
  84450. }
  84451. };
  84452. return info;
  84453. } else {
  84454. return this.player.GLTFEditor.group.children.map(function (model) {
  84455. return {
  84456. url: model.url,
  84457. options: {
  84458. sid: model.sid,
  84459. panoId: model.panoId,
  84460. position: {
  84461. x: parseFloat(model.position.x.toFixed(2)),
  84462. y: parseFloat(model.position.y.toFixed(2)),
  84463. z: parseFloat(model.position.z.toFixed(2))
  84464. },
  84465. scale: {
  84466. x: parseFloat(model.scale.x.toFixed(1)),
  84467. y: parseFloat(model.scale.y.toFixed(1)),
  84468. z: parseFloat(model.scale.z.toFixed(1))
  84469. },
  84470. quaternion: {
  84471. x: parseFloat(model.quaternion.x.toFixed(3)),
  84472. y: parseFloat(model.quaternion.y.toFixed(3)),
  84473. z: parseFloat(model.quaternion.z.toFixed(3)),
  84474. w: parseFloat(model.quaternion.w.toFixed(3))
  84475. },
  84476. visible: model.visible
  84477. }
  84478. };
  84479. });
  84480. }
  84481. }
  84482. }]);
  84483. return ModelManager;
  84484. }();
  84485. function setup(app) {
  84486. app.APIs = APIs(app);
  84487. app.Scene = new Scene(app);
  84488. app.Camera = new Camera(app);
  84489. app.MinMap = new MinMap(app);
  84490. app.DataSYNC = new DataSYNC(app);
  84491. app.MarkManager = new ObjectManager(app);
  84492. app.VideoManager = new VideoManager(app);
  84493. app.RepairManager = new RepairManager(app);
  84494. app.ClipBoxManager = new ClipBoxManager(app);
  84495. app.CSS3DManager = new CSS3DManager(app);
  84496. app.PolygonMarkManager = new PolygonMarkManager(app);
  84497. app.PanoVideoManager = new PanoVideoManager(app);
  84498. app.TourManager = new TourManager(app);
  84499. app.Editor = new Editor(app);
  84500. app.Connect = new Broadcast(app);
  84501. app.Billboard = new Billboard(app);
  84502. app.Screenshot = new Screenshot(app);
  84503. app.ViewLinkEdit = new ViewLinkEdit(app);
  84504. app.FilterManager = new FilterManager(app);
  84505. app.ConvertViews = new ConvertViews();
  84506. if (app.config.edition) {
  84507. app.TagManager = new TagManager(app);
  84508. app.CadManager = new CadManager(app);
  84509. app.WalkManager = new WalkManager(app);
  84510. } else {
  84511. app.TagManager = new TagManager$1(app);
  84512. app.CadManager = new CadManager$1(app);
  84513. app.WalkManager = new WalkManager$1(app);
  84514. }
  84515. app.ModelManager = new ModelManager(app);
  84516. }
  84517. var convert$1 = {
  84518. /**
  84519. * 2d转3d1
  84520. * @param {*} x
  84521. * @param {*} y
  84522. * @param {*} player
  84523. * @returns
  84524. */
  84525. pointFrom2DTo3D(_ref, player, camera, element) {
  84526. var x = _ref.x,
  84527. y = _ref.y;
  84528. if (!camera) {
  84529. camera = player.camera;
  84530. }
  84531. if (!element) {
  84532. element = player.domElement;
  84533. }
  84534. var position = new THREE.Vector3(0, 0, 0);
  84535. math$2.convertScreenPositionToNDC(x, y, position, element);
  84536. position.unproject(camera);
  84537. position.y = 0;
  84538. return position;
  84539. },
  84540. /**
  84541. * 3d转2d
  84542. * @param {*} position
  84543. * @returns
  84544. */
  84545. pointFrom3DTo2D(position, player, camera, element) {
  84546. var vector = position;
  84547. if (!camera) {
  84548. camera = player.camera;
  84549. }
  84550. if (!element) {
  84551. element = player.domElement;
  84552. }
  84553. if (position instanceof THREE.Vector3 === false) {
  84554. vector = new THREE.Vector3(vector.x || 0, vector.y || 0, vector.z || 0);
  84555. }
  84556. return convertTool.getPos2d(vector, player, camera, element).pos;
  84557. }
  84558. };
  84559. 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; } } }; }
  84560. 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); }
  84561. 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; }
  84562. 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); }; }
  84563. 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; } }
  84564. var _default = /*#__PURE__*/function (_KanKan) {
  84565. _inherits(_default, _KanKan);
  84566. var _super = _createSuper(_default);
  84567. function _default(options) {
  84568. var _this;
  84569. _classCallCheck(this, _default);
  84570. _this = _super.call(this, options);
  84571. if (options.isRouteSnap) {
  84572. _this.config.isRouteSnap = true;
  84573. }
  84574. _this.withComponent('store');
  84575. _this.withComponent('resource');
  84576. _this.withComponent('Scene');
  84577. if (_this.config.dom) {
  84578. _this.withDom();
  84579. }
  84580. _this.remote_editor = editApis;
  84581. _this.remote_viewer = viewApis;
  84582. setup(_assertThisInitialized(_this));
  84583. setup$1(_assertThisInitialized(_this));
  84584. if (_this.config.useStatistics) {
  84585. window._hmt = window._hmt || [];
  84586. (function () {
  84587. var hm = document.createElement('script');
  84588. hm.src = 'https://hm.baidu.com/hm.js?aa59943d9a481ab824cf054f2d463ca2';
  84589. var s = document.getElementsByTagName('script')[0];
  84590. s.parentNode.insertBefore(hm, s);
  84591. })();
  84592. }
  84593. var plugins = browser$1.valueFromUrl('app_plugins');
  84594. if (plugins) {
  84595. plugins.split(',').forEach(function (plugin) {
  84596. if (plugin) {
  84597. _this.use(plugin);
  84598. }
  84599. });
  84600. } // const medici = Medici.init({
  84601. // platform: 'web',
  84602. // appId: '7b5958d5-1ae6-4ad5-8a87-5fc8a4b92999',
  84603. // // endPoint: 'https://v4-test.4dkankan.com', //服务器
  84604. // endPoint: '/track_api', //服务器
  84605. // config: {
  84606. // version: '1', //配置要track当前版本
  84607. // },
  84608. // })
  84609. // KanKan.medici = medici
  84610. return _this;
  84611. }
  84612. _createClass(_default, [{
  84613. key: "use",
  84614. value: function use(plugin, config) {
  84615. var _this2 = this;
  84616. if (typeof plugin === 'string') {
  84617. if (this.Plugins[plugin]) {
  84618. return Promise.resolve(this.Plugins[plugin]);
  84619. }
  84620. return usePlugin(plugin, this.config.version).then(function (name) {
  84621. return _this2.Plugins.add(window[name], config);
  84622. });
  84623. } else if (typeof plugin === 'function') {
  84624. return this.Plugins.add(plugin, config);
  84625. }
  84626. }
  84627. }, {
  84628. key: "mount",
  84629. value: function mount(el) {
  84630. if (!el) {
  84631. throw new Error('el must be require');
  84632. }
  84633. this.config.dom = el;
  84634. this.withDom();
  84635. return this;
  84636. }
  84637. }, {
  84638. key: "render",
  84639. value: function render() {
  84640. this.core.get('Scene').start();
  84641. return this;
  84642. }
  84643. }, {
  84644. key: "metadata",
  84645. value: function metadata(data) {
  84646. if (data === void 0) {
  84647. this.store.set('metadata');
  84648. return this;
  84649. }
  84650. return this.store.get('metadata');
  84651. }
  84652. }, {
  84653. key: "destroy",
  84654. value: function destroy() {
  84655. console.log('dispose renderer!');
  84656. var scene = this.core.get('SceneRenderer').scene;
  84657. this.core.get('SceneRenderer').renderer.dispose();
  84658. this.core.get('SceneRenderer').started = false;
  84659. var cleanMaterial = function cleanMaterial(material) {
  84660. console.log('dispose material!');
  84661. material.dispose(); // dispose textures
  84662. for (var _i = 0, _Object$keys = Object.keys(material); _i < _Object$keys.length; _i++) {
  84663. var key = _Object$keys[_i];
  84664. var value = material[key];
  84665. if (value && typeof value === 'object' && 'minFilter' in value) {
  84666. console.log('dispose texture!');
  84667. value.dispose();
  84668. }
  84669. }
  84670. };
  84671. scene.traverse(function (object) {
  84672. if (!object.isMesh) return;
  84673. console.log('dispose geometry!');
  84674. object.geometry.dispose();
  84675. if (object.material.isMaterial) {
  84676. cleanMaterial(object.material);
  84677. } else {
  84678. // an array of materials
  84679. var _iterator = _createForOfIteratorHelper(object.material),
  84680. _step;
  84681. try {
  84682. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  84683. var material = _step.value;
  84684. cleanMaterial(material);
  84685. }
  84686. } catch (err) {
  84687. _iterator.e(err);
  84688. } finally {
  84689. _iterator.f();
  84690. }
  84691. }
  84692. });
  84693. }
  84694. }]);
  84695. return _default;
  84696. }(KanKan);
  84697. _default.MITT = {
  84698. Emiter: tinyEmitter
  84699. };
  84700. _default.Utils = {
  84701. http,
  84702. file,
  84703. math: math$2,
  84704. convert: convert$1,
  84705. MathLight
  84706. };
  84707. _default.Animate = {
  84708. transitions: transitions$1,
  84709. easing,
  84710. lerp
  84711. };
  84712. _default.Viewmode = Viewmode$1;
  84713. _default.THREE = THREE;
  84714. _default.Deferred = Deferred$1;
  84715. window.PetiteVue = PetiteVue;
  84716. return _default;
  84717. })));
  84718. //# sourceMappingURL=kankan-sdk.js.map